Merge branch 'mainstream'
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Tue, 25 Feb 2014 15:42:09 +0000 (16:42 +0100)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Tue, 25 Feb 2014 15:42:09 +0000 (16:42 +0100)
1  2 
Makefile.am
lib/automake.mk
lib/dpif-netdev.c
lib/netdev.c

diff --combined Makefile.am
@@@ -73,8 -73,6 +73,6 @@@ EXTRA_DIST = 
        NOTICE \
        OPENFLOW-1.1+ \
        PORTING \
-       README-OFTest \
-       README-gcov \
        README-lisp \
        REPORTING-BUGS \
        SubmittingPatches \
@@@ -127,7 -125,6 +125,7 @@@ ro_shell = printf '\043 Generated autom
  
  SUFFIXES += .in
  .in:
 +      @mkdir -p $$(dirname $@)
        $(PERL) $(srcdir)/build-aux/soexpand.pl -I$(srcdir) < $< | \
            sed \
                -e 's,[@]PKIDIR[@],$(PKIDIR),g' \
@@@ -166,10 -163,10 +164,10 @@@ dist-hook-git: distfile
        @if test -e $(srcdir)/.git && (git --version) >/dev/null 2>&1; then \
          (cd datapath && $(MAKE) distfiles);                               \
          (cat distfiles; sed 's|^|datapath/|' datapath/distfiles) |        \
 -          LC_ALL=C sort -u > all-distfiles;                               \
 -        (cd $(srcdir) && git ls-files) | grep -v '\.gitignore$$' |        \
 -          LC_ALL=C sort -u > all-gitfiles;                                \
 -        LC_ALL=C comm -1 -3 all-distfiles all-gitfiles > missing-distfiles; \
 +          LC_ALL=C sort -u > all-distfiles;                                       \
 +        (cd $(srcdir) && git ls-files) | grep -vFf $(srcdir)/.non-distfiles |     \
 +          LC_ALL=C sort -u > all-gitfiles;                                        \
 +        LC_ALL=C comm -1 -3 all-distfiles all-gitfiles > missing-distfiles;       \
          if test -s missing-distfiles; then                                \
            echo "The distribution is missing the following files:";        \
            cat missing-distfiles;                                          \
@@@ -307,6 -304,5 +305,6 @@@ include rhel/automake.m
  include xenserver/automake.mk
  include python/automake.mk
  include python/compat/automake.mk
 +include planetlab/automake.mk
  include tutorial/automake.mk
  include vtep/automake.mk
diff --combined lib/automake.mk
@@@ -100,8 -100,6 +100,8 @@@ lib_libopenvswitch_la_SOURCES = 
        lib/multipath.c \
        lib/multipath.h \
        lib/netdev-dummy.c \
 +      lib/netdev-tunnel.c \
 +      lib/netdev-pltap.c \
        lib/netdev-provider.h \
        lib/netdev-vport.c \
        lib/netdev-vport.h \
        lib/stream-provider.h \
        lib/stream-ssl.h \
        lib/stream-tcp.c \
-       lib/stream-unix.c \
        lib/stream.c \
        lib/stream.h \
        lib/stdio.c \
        lib/timeval.h \
        lib/token-bucket.c \
        lib/token-bucket.h \
 +      lib/tunalloc.c \
 +      lib/tunalloc.h \
        lib/type-props.h \
        lib/unaligned.h \
        lib/unicode.c \
@@@ -248,7 -243,8 +247,8 @@@ lib_libopenvswitch_la_SOURCES += 
  else
  lib_libopenvswitch_la_SOURCES += \
        lib/daemon.c \
-       lib/latch.c
+       lib/latch.c \
+       lib/stream-unix.c
  endif
  
  EXTRA_DIST += \
diff --combined lib/dpif-netdev.c
@@@ -367,17 -367,10 +367,17 @@@ dpif_netdev_class_is_dummy(const struc
      return class != &dpif_netdev_class;
  }
  
 +static bool
 +dpif_netdev_class_is_planetlab(const struct dpif_class *class)
 +{
 +    return class == &dpif_planetlab_class;
 +}
 +
  static const char *
  dpif_netdev_port_open_type(const struct dpif_class *class, const char *type)
  {
      return strcmp(type, "internal") ? type
 +                  : dpif_netdev_class_is_planetlab(class) ? "pltap"
                    : dpif_netdev_class_is_dummy(class) ? "dummy"
                    : "tap";
  }
@@@ -406,8 -399,7 +406,8 @@@ choose_port(struct dp_netdev *dp, cons
  {
      uint32_t port_no;
  
 -    if (dp->class != &dpif_netdev_class) {
 +    if (dp->class != &dpif_netdev_class && 
 +        dp->class != &dpif_planetlab_class) {
          const char *p;
          int start_no = 0;
  
@@@ -879,6 -871,7 +879,7 @@@ dp_netdev_flow_unref(struct dp_netdev_f
          cls_rule_destroy(CONST_CAST(struct cls_rule *, &flow->cr));
          ovs_mutex_lock(&flow->mutex);
          dp_netdev_actions_unref(flow->actions);
+         ovs_refcount_destroy(&flow->ref_cnt);
          ovs_mutex_unlock(&flow->mutex);
          ovs_mutex_destroy(&flow->mutex);
          free(flow);
@@@ -1302,6 -1295,7 +1303,7 @@@ dpif_netdev_flow_del(struct dpif *dpif
              ovs_mutex_unlock(&netdev_flow->mutex);
          }
          dp_netdev_remove_flow(dp, netdev_flow);
+         dp_netdev_flow_unref(netdev_flow);
      } else {
          error = ENOENT;
      }
@@@ -1551,6 -1545,7 +1553,7 @@@ voi
  dp_netdev_actions_unref(struct dp_netdev_actions *actions)
  {
      if (actions && ovs_refcount_unref(&actions->ref_cnt) == 1) {
+         ovs_refcount_destroy(&actions->ref_cnt);
          free(actions->actions);
          free(actions);
      }
@@@ -1712,6 -1707,7 +1715,7 @@@ dp_netdev_port_input(struct dp_netdev *
          dp_netdev_execute_actions(dp, &key, packet, md,
                                    actions->actions, actions->size);
          dp_netdev_actions_unref(actions);
+         dp_netdev_flow_unref(netdev_flow);
          ovsthread_counter_inc(dp->n_hit, 1);
      } else {
          ovsthread_counter_inc(dp->n_missed, 1);
@@@ -1834,48 -1830,40 +1838,48 @@@ dp_netdev_execute_actions(struct dp_net
      odp_execute_actions(&aux, packet, md, actions, actions_len, dp_execute_cb);
  }
  
 +#define DPIF_NETDEV_CLASS_FUNCTIONS                   \
 +    dpif_netdev_enumerate,                            \
 +    dpif_netdev_port_open_type,                               \
 +    dpif_netdev_open,                                 \
 +    dpif_netdev_close,                                        \
 +    dpif_netdev_destroy,                              \
 +    NULL,                                     \
 +    NULL,                                     \
 +    dpif_netdev_get_stats,                            \
 +    dpif_netdev_port_add,                             \
 +    dpif_netdev_port_del,                             \
 +    dpif_netdev_port_query_by_number,                 \
 +    dpif_netdev_port_query_by_name,                   \
 +    NULL,                       /* port_get_pid */    \
 +    dpif_netdev_port_dump_start,                      \
 +    dpif_netdev_port_dump_next,                               \
 +    dpif_netdev_port_dump_done,                               \
 +    dpif_netdev_port_poll,                            \
 +    dpif_netdev_port_poll_wait,                               \
 +    dpif_netdev_flow_get,                             \
 +    dpif_netdev_flow_put,                             \
 +    dpif_netdev_flow_del,                             \
 +    dpif_netdev_flow_flush,                           \
 +    dpif_netdev_flow_dump_start,                      \
 +    dpif_netdev_flow_dump_next,                               \
 +    dpif_netdev_flow_dump_done,                               \
 +    dpif_netdev_execute,                              \
 +    NULL,                       /* operate */         \
 +    dpif_netdev_recv_set,                             \
 +    dpif_netdev_queue_to_priority,                    \
 +    dpif_netdev_recv,                                 \
 +    dpif_netdev_recv_wait,                            \
 +    dpif_netdev_recv_purge,                           \
 +
  const struct dpif_class dpif_netdev_class = {
      "netdev",
 -    dpif_netdev_enumerate,
 -    dpif_netdev_port_open_type,
 -    dpif_netdev_open,
 -    dpif_netdev_close,
 -    dpif_netdev_destroy,
 -    NULL,                       /* run */
 -    NULL,                       /* wait */
 -    dpif_netdev_get_stats,
 -    dpif_netdev_port_add,
 -    dpif_netdev_port_del,
 -    dpif_netdev_port_query_by_number,
 -    dpif_netdev_port_query_by_name,
 -    NULL,                       /* port_get_pid */
 -    dpif_netdev_port_dump_start,
 -    dpif_netdev_port_dump_next,
 -    dpif_netdev_port_dump_done,
 -    dpif_netdev_port_poll,
 -    dpif_netdev_port_poll_wait,
 -    dpif_netdev_flow_get,
 -    dpif_netdev_flow_put,
 -    dpif_netdev_flow_del,
 -    dpif_netdev_flow_flush,
 -    dpif_netdev_flow_dump_start,
 -    dpif_netdev_flow_dump_next,
 -    dpif_netdev_flow_dump_done,
 -    dpif_netdev_execute,
 -    NULL,                       /* operate */
 -    dpif_netdev_recv_set,
 -    dpif_netdev_queue_to_priority,
 -    dpif_netdev_recv,
 -    dpif_netdev_recv_wait,
 -    dpif_netdev_recv_purge,
 +    DPIF_NETDEV_CLASS_FUNCTIONS
 +};
 +
 +const struct dpif_class dpif_planetlab_class = {
 +    "planetlab",
 +    DPIF_NETDEV_CLASS_FUNCTIONS
  };
  
  static void
@@@ -1956,4 -1944,3 +1960,4 @@@ dpif_dummy_register(bool override
                               "DP PORT NEW-NUMBER",
                               3, 3, dpif_dummy_change_port_number, NULL);
  }
 +
diff --combined lib/netdev.c
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+  * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
@@@ -67,15 -67,14 +67,14 @@@ static struct shash netdev_shash OVS_GU
  
  /* Protects 'netdev_classes' against insertions or deletions.
   *
-  * This is not an rwlock for performance reasons but to allow recursive
-  * acquisition when calling into providers.  For example, netdev_run() calls
-  * into provider 'run' functions, which might reasonably want to call one of
-  * the netdev functions that takes netdev_class_rwlock read-only. */
- static struct ovs_rwlock netdev_class_rwlock OVS_ACQ_BEFORE(netdev_mutex)
-     = OVS_RWLOCK_INITIALIZER;
+  * This is a recursive mutex to allow recursive acquisition when calling into
+  * providers.  For example, netdev_run() calls into provider 'run' functions,
+  * which might reasonably want to call one of the netdev functions that takes
+  * netdev_class_mutex. */
+ static struct ovs_mutex netdev_class_mutex OVS_ACQ_BEFORE(netdev_mutex);
  
  /* Contains 'struct netdev_registered_class'es. */
- static struct hmap netdev_classes OVS_GUARDED_BY(netdev_class_rwlock)
+ static struct hmap netdev_classes OVS_GUARDED_BY(netdev_class_mutex)
      = HMAP_INITIALIZER(&netdev_classes);
  
  struct netdev_registered_class {
@@@ -93,11 -92,13 +92,13 @@@ void update_device_args(struct netdev *
  
  static void
  netdev_initialize(void)
-     OVS_EXCLUDED(netdev_class_rwlock, netdev_mutex)
+     OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
  {
      static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
  
      if (ovsthread_once_start(&once)) {
+         ovs_mutex_init_recursive(&netdev_class_mutex);
          fatal_signal_add_hook(restore_all_flags, NULL, NULL, true);
          netdev_vport_patch_register();
  
          netdev_register_provider(&netdev_tap_class);
          netdev_register_provider(&netdev_bsd_class);
  #endif
 +        netdev_register_provider(&netdev_tunnel_class);
 +        netdev_register_provider(&netdev_pltap_class);
  
          ovsthread_once_done(&once);
      }
   * main poll loop. */
  void
  netdev_run(void)
-     OVS_EXCLUDED(netdev_class_rwlock, netdev_mutex)
+     OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
  {
      struct netdev_registered_class *rc;
  
-     ovs_rwlock_rdlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      HMAP_FOR_EACH (rc, hmap_node, &netdev_classes) {
          if (rc->class->run) {
              rc->class->run();
          }
      }
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  }
  
  /* Arranges for poll_block() to wake up when netdev_run() needs to be called.
   * main poll loop. */
  void
  netdev_wait(void)
-     OVS_EXCLUDED(netdev_class_rwlock, netdev_mutex)
+     OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
  {
      struct netdev_registered_class *rc;
  
-     ovs_rwlock_rdlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      HMAP_FOR_EACH (rc, hmap_node, &netdev_classes) {
          if (rc->class->wait) {
              rc->class->wait();
          }
      }
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  }
  
  static struct netdev_registered_class *
  netdev_lookup_class(const char *type)
-     OVS_REQ_RDLOCK(netdev_class_rwlock)
+     OVS_REQ_RDLOCK(netdev_class_mutex)
  {
      struct netdev_registered_class *rc;
  
   * registration, new netdevs of that type can be opened using netdev_open(). */
  int
  netdev_register_provider(const struct netdev_class *new_class)
-     OVS_EXCLUDED(netdev_class_rwlock, netdev_mutex)
+     OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
  {
      int error;
  
-     ovs_rwlock_wrlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      if (netdev_lookup_class(new_class->type)) {
          VLOG_WARN("attempted to register duplicate netdev provider: %s",
                     new_class->type);
                       new_class->type, ovs_strerror(error));
          }
      }
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  
      return error;
  }
   * new netdevs of that type cannot be opened using netdev_open(). */
  int
  netdev_unregister_provider(const char *type)
-     OVS_EXCLUDED(netdev_class_rwlock, netdev_mutex)
+     OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
  {
      struct netdev_registered_class *rc;
      int error;
  
-     ovs_rwlock_wrlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      rc = netdev_lookup_class(type);
      if (!rc) {
          VLOG_WARN("attempted to unregister a netdev provider that is not "
              error = EBUSY;
          }
      }
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  
      return error;
  }
@@@ -251,11 -250,11 +252,11 @@@ netdev_enumerate_types(struct sset *typ
      netdev_initialize();
      sset_clear(types);
  
-     ovs_rwlock_rdlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      HMAP_FOR_EACH (rc, hmap_node, &netdev_classes) {
          sset_add(types, rc->class->type);
      }
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  }
  
  /* Check that the network device name is not the same as any of the registered
@@@ -271,15 -270,15 +272,15 @@@ netdev_is_reserved_name(const char *nam
  
      netdev_initialize();
  
-     ovs_rwlock_rdlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      HMAP_FOR_EACH (rc, hmap_node, &netdev_classes) {
          const char *dpif_port = netdev_vport_class_get_dpif_port(rc->class);
          if (dpif_port && !strcmp(dpif_port, name)) {
-             ovs_rwlock_unlock(&netdev_class_rwlock);
+             ovs_mutex_unlock(&netdev_class_mutex);
              return true;
          }
      }
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  
      if (!strncmp(name, "ovs-", 4)) {
          struct sset types;
@@@ -315,7 -314,7 +316,7 @@@ netdev_open(const char *name, const cha
  
      netdev_initialize();
  
-     ovs_rwlock_rdlock(&netdev_class_rwlock);
+     ovs_mutex_lock(&netdev_class_mutex);
      ovs_mutex_lock(&netdev_mutex);
      netdev = shash_find_data(&netdev_shash, name);
      if (!netdev) {
      }
  
      ovs_mutex_unlock(&netdev_mutex);
-     ovs_rwlock_unlock(&netdev_class_rwlock);
+     ovs_mutex_unlock(&netdev_class_mutex);
  
      if (!error) {
          netdev->ref_cnt++;
@@@ -462,11 -461,11 +463,11 @@@ netdev_unref(struct netdev *dev
          dev->netdev_class->dealloc(dev);
          ovs_mutex_unlock(&netdev_mutex);
  
-         ovs_rwlock_rdlock(&netdev_class_rwlock);
+         ovs_mutex_lock(&netdev_class_mutex);
          rc = netdev_lookup_class(class->type);
          atomic_sub(&rc->ref_cnt, 1, &old_ref_cnt);
          ovs_assert(old_ref_cnt > 0);
-         ovs_rwlock_unlock(&netdev_class_rwlock);
+         ovs_mutex_unlock(&netdev_class_mutex);
      } else {
          ovs_mutex_unlock(&netdev_mutex);
      }