Merge branch 'mainstream'
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Wed, 16 Jan 2013 15:24:43 +0000 (16:24 +0100)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Wed, 16 Jan 2013 15:24:43 +0000 (16:24 +0100)
Conflicts:
lib/dpif-netdev.c

1  2 
Makefile.am
lib/automake.mk
lib/dpif-netdev.c
lib/dpif-provider.h
lib/dpif.c
lib/netdev-provider.h
lib/netdev.c

diff --cc Makefile.am
Simple merge
diff --cc lib/automake.mk
Simple merge
@@@ -181,6 -181,14 +181,22 @@@ dpif_netdev_enumerate(struct sset *all_
      return 0;
  }
  
+ static const char *
+ dpif_netdev_port_open_type(const struct dpif_class *class, const char *type)
+ {
+     return strcmp(type, "internal") ? type
+                   : class != &dpif_netdev_class ? "dummy"
+                   : "tap";
+ }
++static const char *
++dpif_planetlab_port_open_type(const struct dpif_class *class, const char *type)
++{
++    return strcmp(type, "internal") ? type
++                  : class != &dpif_planetlab_class ? "dummy"
++                  : "pltap";
++}
++
  static struct dpif *
  create_dpif_netdev(struct dp_netdev *dp)
  {
      return &dpif->dpif;
  }
  
 -    if (dp->class != &dpif_netdev_class) {
+ static int
+ choose_port(struct dp_netdev *dp, const char *name)
+ {
+     int port_no;
++    if (dp->class != &dpif_netdev_class && 
++        dp->class != &dpif_planetlab_class) {
+         const char *p;
+         int start_no = 0;
+         /* If the port name begins with "br", start the number search at
+          * 100 to make writing tests easier. */
+         if (!strncmp(name, "br", 2)) {
+             start_no = 100;
+         }
+         /* If the port name contains a number, try to assign that port number.
+          * This can make writing unit tests easier because port numbers are
+          * predictable. */
+         for (p = name; *p != '\0'; p++) {
+             if (isdigit((unsigned char) *p)) {
+                 port_no = start_no + strtol(p, NULL, 10);
+                 if (port_no > 0 && port_no < MAX_PORTS
+                     && !dp->ports[port_no]) {
+                     return port_no;
+                 }
+                 break;
+             }
+         }
+     }
+     for (port_no = 1; port_no < MAX_PORTS; port_no++) {
+         if (!dp->ports[port_no]) {
+             return port_no;
+         }
+     }
+     return -1;
+ }
  static int
  create_dp_netdev(const char *name, const struct dpif_class *class,
                   struct dp_netdev **dpp)
@@@ -1274,48 -1286,41 +1295,49 @@@ dp_netdev_execute_actions(struct dp_net
      }
  }
  
- #define DPIF_NETDEV_CLASS_FUNCTIONS                   \
++#define DPIF_NETDEV_CLASS_FUNCTIONS(PORT_OPEN_TYPE)   \
 +    dpif_netdev_enumerate,                            \
++    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_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,
++    DPIF_NETDEV_CLASS_FUNCTIONS(dpif_netdev_port_open_type)
 +};
 +
 +const struct dpif_class dpif_planetlab_class = {
 +    "planetlab",
-     DPIF_NETDEV_CLASS_FUNCTIONS
++    DPIF_NETDEV_CLASS_FUNCTIONS(dpif_planetlab_port_open_type)
  };
  
  static void
Simple merge
diff --cc lib/dpif.c
Simple merge
Simple merge
diff --cc lib/netdev.c
Simple merge