Merge branch 'mainstream'
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Thu, 31 Jan 2013 14:09:26 +0000 (15:09 +0100)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Thu, 31 Jan 2013 14:09:26 +0000 (15:09 +0100)
Conflicts:
lib/dpif-netdev.c

1  2 
lib/automake.mk
lib/dpif-netdev.c
lib/netdev.c

diff --combined lib/automake.mk
@@@ -90,9 -90,9 +90,11 @@@ lib_libopenvswitch_a_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/netdev.c \
        lib/netdev.h \
        lib/netflow.h \
        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 \
@@@ -241,8 -239,6 +243,6 @@@ lib_libopenvswitch_a_SOURCES += 
        lib/dpif-linux.h \
        lib/netdev-linux.c \
        lib/netdev-linux.h \
-       lib/netdev-vport.c \
-       lib/netdev-vport.h \
        lib/netlink-notifier.c \
        lib/netlink-notifier.h \
        lib/netlink-protocol.h \
diff --combined lib/dpif-netdev.c
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
+  * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
@@@ -40,6 -40,7 +40,7 @@@
  #include "hmap.h"
  #include "list.h"
  #include "netdev.h"
+ #include "netdev-vport.h"
  #include "netlink.h"
  #include "odp-util.h"
  #include "ofp-print.h"
@@@ -180,13 -181,18 +181,25 @@@ dpif_netdev_enumerate(struct sset *all_
      return 0;
  }
  
+ static bool
+ dpif_netdev_class_is_dummy(const struct dpif_class *class)
+ {
+     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
-                   : class == &dpif_netdev_class ? "tap"
-                   : class == &dpif_planetlab_class ? "pltap"
-                   : "dummy";
++                  : dpif_netdev_class_is_planetlab(class) ? "pltap"
+                   : dpif_netdev_class_is_dummy(class) ? "dummy"
+                   : "tap";
  }
  
  static struct dpif *
@@@ -210,8 -216,7 +223,8 @@@ choose_port(struct dp_netdev *dp, cons
  {
      int 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;
  
@@@ -387,7 -392,8 +400,8 @@@ do_add_port(struct dp_netdev *dp, cons
      /* XXX reject non-Ethernet devices */
  
      error = netdev_listen(netdev);
-     if (error) {
+     if (error
+         && !(error == EOPNOTSUPP && dpif_netdev_class_is_dummy(dp->class))) {
          VLOG_ERR("%s: cannot receive packets on this network device (%s)",
                   devname, strerror(errno));
          netdev_close(netdev);
@@@ -432,11 -438,11 +446,11 @@@ dpif_netdev_port_add(struct dpif *dpif
          }
          port_no = *port_nop;
      } else {
-         port_no = choose_port(dp, netdev_get_name(netdev));
+         port_no = choose_port(dp, netdev_vport_get_dpif_port(netdev));
      }
      if (port_no >= 0) {
          *port_nop = port_no;
-         return do_add_port(dp, netdev_get_name(netdev),
+         return do_add_port(dp, netdev_vport_get_dpif_port(netdev),
                             netdev_get_type(netdev), port_no);
      }
      return EFBIG;
@@@ -475,7 -481,7 +489,7 @@@ get_port_by_name(struct dp_netdev *dp
      struct dp_netdev_port *port;
  
      LIST_FOR_EACH (port, node, &dp->port_list) {
-         if (!strcmp(netdev_get_name(port->netdev), devname)) {
+         if (!strcmp(netdev_vport_get_dpif_port(port->netdev), devname)) {
              *portp = port;
              return 0;
          }
@@@ -499,7 -505,7 +513,7 @@@ do_del_port(struct dp_netdev *dp, uint3
      dp->ports[port->port_no] = NULL;
      dp->serial++;
  
-     name = xstrdup(netdev_get_name(port->netdev));
+     name = xstrdup(netdev_vport_get_dpif_port(port->netdev));
      netdev_close(port->netdev);
      free(port->type);
  
@@@ -513,7 -519,7 +527,7 @@@ static voi
  answer_port_query(const struct dp_netdev_port *port,
                    struct dpif_port *dpif_port)
  {
-     dpif_port->name = xstrdup(netdev_get_name(port->netdev));
+     dpif_port->name = xstrdup(netdev_vport_get_dpif_port(port->netdev));
      dpif_port->type = xstrdup(port->type);
      dpif_port->port_no = port->port_no;
  }
@@@ -604,7 -610,7 +618,7 @@@ dpif_netdev_port_dump_next(const struc
          struct dp_netdev_port *port = dp->ports[port_no];
          if (port) {
              free(state->name);
-             state->name = xstrdup(netdev_get_name(port->netdev));
+             state->name = xstrdup(netdev_vport_get_dpif_port(port->netdev));
              dpif_port->name = state->name;
              dpif_port->type = port->type;
              dpif_port->port_no = port->port_no;
@@@ -1063,7 -1069,8 +1077,8 @@@ dpif_netdev_run(struct dpif *dpif
          } else if (error != EAGAIN && error != EOPNOTSUPP) {
              static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
              VLOG_ERR_RL(&rl, "error receiving data from %s: %s",
-                         netdev_get_name(port->netdev), strerror(error));
+                         netdev_vport_get_dpif_port(port->netdev),
+                         strerror(error));
          }
      }
      ofpbuf_uninit(&packet);
@@@ -1287,49 -1294,41 +1302,49 @@@ dp_netdev_execute_actions(struct dp_net
      }
  }
  
 +#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
@@@ -1362,4 -1361,3 +1377,4 @@@ dpif_dummy_register(bool override
  
      dpif_dummy_register__("dummy");
  }
 +
diff --combined lib/netdev.c
@@@ -73,19 -73,18 +73,20 @@@ netdev_initialize(void
          inited = true;
  
          fatal_signal_add_hook(close_all_netdevs, NULL, NULL, true);
+         netdev_vport_patch_register();
  
  #ifdef LINUX_DATAPATH
          netdev_register_provider(&netdev_linux_class);
          netdev_register_provider(&netdev_internal_class);
          netdev_register_provider(&netdev_tap_class);
-         netdev_vport_register();
+         netdev_vport_tunnel_register();
  #endif
  #ifdef __FreeBSD__
          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);
      }
  }
  
@@@ -1443,6 -1442,14 +1444,14 @@@ netdev_get_type(const struct netdev *ne
      return netdev_get_dev(netdev)->netdev_class->type;
  }
  
+ const char *
+ netdev_get_type_from_name(const char *name)
+ {
+     const struct netdev_dev *dev = netdev_dev_from_name(name);
+     return dev ? netdev_dev_get_type(dev) : NULL;
+ }
  struct netdev_dev *
  netdev_get_dev(const struct netdev *netdev)
  {