Merge branch 'mainstream'
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Tue, 23 Jul 2013 08:56:22 +0000 (10:56 +0200)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Tue, 23 Jul 2013 08:56:22 +0000 (10:56 +0200)
1  2 
lib/dpif-netdev.c
lib/dpif.c

diff --combined lib/dpif-netdev.c
@@@ -87,6 -87,7 +87,7 @@@ struct dp_netdev 
      char *name;
      int open_cnt;
      bool destroyed;
+     int max_mtu;                /* Maximum MTU of any port added so far. */
  
      struct dp_netdev_queue queues[N_QUEUES];
      struct hmap flow_table;     /* Flow table. */
@@@ -138,9 -139,6 +139,6 @@@ struct dpif_netdev 
  /* All netdev-based datapaths. */
  static struct shash dp_netdevs = SHASH_INITIALIZER(&dp_netdevs);
  
- /* Maximum port MTU seen so far. */
- static int max_mtu = ETH_PAYLOAD_MAX;
  static int get_port_by_number(struct dp_netdev *, odp_port_t port_no,
                                struct dp_netdev_port **portp);
  static int get_port_by_name(struct dp_netdev *, const char *devname,
@@@ -194,17 -192,10 +192,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";
  }
@@@ -232,8 -223,7 +230,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;
  
@@@ -279,6 -269,7 +277,7 @@@ create_dp_netdev(const char *name, cons
      dp->class = class;
      dp->name = xstrdup(name);
      dp->open_cnt = 0;
+     dp->max_mtu = ETH_PAYLOAD_MAX;
      for (i = 0; i < N_QUEUES; i++) {
          dp->queues[i].head = dp->queues[i].tail = 0;
      }
@@@ -434,8 -425,8 +433,8 @@@ do_add_port(struct dp_netdev *dp, cons
      port->type = xstrdup(type);
  
      error = netdev_get_mtu(netdev, &mtu);
-     if (!error && mtu > max_mtu) {
-         max_mtu = mtu;
+     if (!error && mtu > dp->max_mtu) {
+         dp->max_mtu = mtu;
      }
  
      list_push_back(&dp->port_list, &port->node);
@@@ -1089,7 -1080,8 +1088,8 @@@ dpif_netdev_run(struct dpif *dpif
      struct dp_netdev_port *port;
      struct ofpbuf packet;
  
-     ofpbuf_init(&packet, DP_NETDEV_HEADROOM + VLAN_ETH_HEADER_LEN + max_mtu);
+     ofpbuf_init(&packet,
+                 DP_NETDEV_HEADROOM + VLAN_ETH_HEADER_LEN + dp->max_mtu);
  
      LIST_FOR_EACH (port, node, &dp->port_list) {
          int error;
@@@ -1201,49 -1193,41 +1201,49 @@@ dp_netdev_execute_actions(struct dp_net
                          dp_netdev_output_port, dp_netdev_action_userspace);
  }
  
 +#define DPIF_NETDEV_CLASS_FUNCTIONS                   \
 +    dpif_netdev_enumerate,                            \
 +    dpif_netdev_port_open_type,                               \
 +    dpif_netdev_open,                                 \
 +    dpif_netdev_close,                                        \
 +    dpif_netdev_destroy,                              \
 +    dpif_netdev_run,                                  \
 +    dpif_netdev_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,                   \
 +    dpif_netdev_get_max_ports,                                \
 +    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,
 -    dpif_netdev_run,
 -    dpif_netdev_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,
 -    dpif_netdev_get_max_ports,
 -    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
@@@ -1276,4 -1260,3 +1276,4 @@@ dpif_dummy_register(bool override
  
      dpif_dummy_register__("dummy");
  }
 +
diff --combined lib/dpif.c
@@@ -61,7 -61,6 +61,7 @@@ static const struct dpif_class *base_dp
      &dpif_linux_class,
  #endif
      &dpif_netdev_class,
 +    &dpif_planetlab_class,
  };
  
  struct registered_dpif_class {
@@@ -98,15 -97,15 +98,15 @@@ static void log_execute_message(struct 
  static void
  dp_initialize(void)
  {
-     static int status = -1;
+     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
  
-     if (status < 0) {
+     if (ovsthread_once_start(&once)) {
          int i;
  
-         status = 0;
          for (i = 0; i < ARRAY_SIZE(base_dpif_classes); i++) {
              dp_register_provider(base_dpif_classes[i]);
          }
+         ovsthread_once_done(&once);
      }
  }