[ovs-dev] [tunnel 11/11] netdev-vport: Build on all platforms.

Ethan Jackson ethan at nicira.com
Tue Jan 29 02:12:08 UTC 2013


This is a version of the patch which I've tested in FreeBSD.  The main
difference is that it registers the patch port provider, and registers the
tunnel provider when dummy is enabled (to support the unit tests).  I've built
and tested this, but if you have time would you mind trying it out Ed?  

Also note, that you'll need to add the NULL for get_dpif_port() in
netdev-bsd.c.  I folded that change into an earlier patch in the series.

Thanks,
Ethan Jackson

---
 lib/automake.mk       |    4 +-
 lib/dpif-linux.c      |   24 ++++++++++-
 lib/dpif.h            |    1 -
 lib/netdev-dummy.c    |   11 +++++
 lib/netdev-linux.c    |   59 ++++++++++++++++++++++++--
 lib/netdev-provider.h |    1 -
 lib/netdev-vport.c    |  113 ++++++++++---------------------------------------
 lib/netdev-vport.h    |    6 +--
 lib/netdev.c          |    3 +-
 9 files changed, 118 insertions(+), 104 deletions(-)

diff --git a/lib/automake.mk b/lib/automake.mk
index 4547198..d333a4d 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -91,6 +91,8 @@ lib_libopenvswitch_a_SOURCES = \
 	lib/multipath.h \
 	lib/netdev-dummy.c \
 	lib/netdev-provider.h \
+	lib/netdev-vport.c \
+	lib/netdev-vport.h \
 	lib/netdev.c \
 	lib/netdev.h \
 	lib/netflow.h \
@@ -237,8 +239,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 --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 9bd8826..b4ec25c 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -455,6 +455,28 @@ get_vport_type(const struct dpif_linux_vport *vport)
     return "unknown";
 }
 
+static enum ovs_vport_type
+netdev_to_ovs_vport_type(const struct netdev *netdev)
+{
+    const char *type = netdev_get_type(netdev);
+
+    if (!strcmp(type, "tap") || !strcmp(type, "system")) {
+        return OVS_VPORT_TYPE_NETDEV;
+    } else if (!strcmp(type, "internal")) {
+        return OVS_VPORT_TYPE_INTERNAL;
+    } else if (strstr(type, "gre64")) {
+        return OVS_VPORT_TYPE_GRE64;
+    } else if (strstr(type, "gre")) {
+        return OVS_VPORT_TYPE_GRE;
+    } else if (!strcmp(type, "capwap")) {
+        return OVS_VPORT_TYPE_CAPWAP;
+    } else if (!strcmp(type, "vxlan")) {
+        return OVS_VPORT_TYPE_VXLAN;
+    } else {
+        return OVS_VPORT_TYPE_UNSPEC;
+    }
+}
+
 static int
 dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
                     uint32_t *port_nop)
@@ -478,7 +500,7 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev,
     dpif_linux_vport_init(&request);
     request.cmd = OVS_VPORT_CMD_NEW;
     request.dp_ifindex = dpif->dp_ifindex;
-    request.type = netdev_vport_get_vport_type(netdev);
+    request.type = netdev_to_ovs_vport_type(netdev);
     if (request.type == OVS_VPORT_TYPE_UNSPEC) {
         VLOG_WARN_RL(&error_rl, "%s: cannot create port `%s' because it has "
                      "unsupported type `%s'",
diff --git a/lib/dpif.h b/lib/dpif.h
index a478db2..c5e3fc8 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -324,7 +324,6 @@
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
-#include <linux/openvswitch.h>
 #include "openflow/openflow.h"
 #include "netdev.h"
 #include "util.h"
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index a3c4f2e..a9b4389 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -23,6 +23,7 @@
 #include "flow.h"
 #include "list.h"
 #include "netdev-provider.h"
+#include "netdev-vport.h"
 #include "odp-util.h"
 #include "ofp-print.h"
 #include "ofpbuf.h"
@@ -35,6 +36,12 @@
 
 VLOG_DEFINE_THIS_MODULE(netdev_dummy);
 
+#ifdef __FreeBSD__
+#define FREE_BSD 1
+#else
+#define FREE_BSD 0
+#endif
+
 struct netdev_dev_dummy {
     struct netdev_dev netdev_dev;
     uint8_t hwaddr[ETH_ADDR_LEN];
@@ -531,4 +538,8 @@ netdev_dummy_register(bool override)
         sset_destroy(&types);
     }
     netdev_register_provider(&dummy_class);
+
+    if (FREE_BSD) {
+        netdev_vport_tunnel_register();
+    }
 }
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index a06aef3..8387a5f 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -55,18 +55,19 @@
 #include "hmap.h"
 #include "netdev-provider.h"
 #include "netdev-vport.h"
-#include "netlink.h"
 #include "netlink-notifier.h"
 #include "netlink-socket.h"
+#include "netlink.h"
 #include "ofpbuf.h"
 #include "openflow/openflow.h"
 #include "packets.h"
 #include "poll-loop.h"
 #include "rtnetlink-link.h"
-#include "socket-util.h"
 #include "shash.h"
+#include "socket-util.h"
 #include "sset.h"
 #include "timer.h"
+#include "unaligned.h"
 #include "vlog.h"
 
 VLOG_DEFINE_THIS_MODULE(netdev_linux);
@@ -1309,6 +1310,58 @@ swap_uint64(uint64_t *a, uint64_t *b)
     *b = tmp;
 }
 
+/* Copies 'src' into 'dst', performing format conversion in the process.
+ *
+ * 'src' is allowed to be misaligned. */
+static void
+netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
+                                  const struct ovs_vport_stats *src)
+{
+    dst->rx_packets = get_unaligned_u64(&src->rx_packets);
+    dst->tx_packets = get_unaligned_u64(&src->tx_packets);
+    dst->rx_bytes = get_unaligned_u64(&src->rx_bytes);
+    dst->tx_bytes = get_unaligned_u64(&src->tx_bytes);
+    dst->rx_errors = get_unaligned_u64(&src->rx_errors);
+    dst->tx_errors = get_unaligned_u64(&src->tx_errors);
+    dst->rx_dropped = get_unaligned_u64(&src->rx_dropped);
+    dst->tx_dropped = get_unaligned_u64(&src->tx_dropped);
+    dst->multicast = 0;
+    dst->collisions = 0;
+    dst->rx_length_errors = 0;
+    dst->rx_over_errors = 0;
+    dst->rx_crc_errors = 0;
+    dst->rx_frame_errors = 0;
+    dst->rx_fifo_errors = 0;
+    dst->rx_missed_errors = 0;
+    dst->tx_aborted_errors = 0;
+    dst->tx_carrier_errors = 0;
+    dst->tx_fifo_errors = 0;
+    dst->tx_heartbeat_errors = 0;
+    dst->tx_window_errors = 0;
+}
+
+static int
+get_stats_via_vport__(const struct netdev *netdev, struct netdev_stats *stats)
+{
+    struct dpif_linux_vport reply;
+    struct ofpbuf *buf;
+    int error;
+
+    error = dpif_linux_vport_get(netdev_get_name(netdev), &reply, &buf);
+    if (error) {
+        return error;
+    } else if (!reply.stats) {
+        ofpbuf_delete(buf);
+        return EOPNOTSUPP;
+    }
+
+    netdev_stats_from_ovs_vport_stats(stats, reply.stats);
+
+    ofpbuf_delete(buf);
+
+    return 0;
+}
+
 static void
 get_stats_via_vport(const struct netdev *netdev_,
                     struct netdev_stats *stats)
@@ -1320,7 +1373,7 @@ get_stats_via_vport(const struct netdev *netdev_,
         !(netdev_dev->cache_valid & VALID_VPORT_STAT_ERROR)) {
         int error;
 
-        error = netdev_vport_get_stats(netdev_, stats);
+        error = get_stats_via_vport__(netdev_, stats);
         if (error && error != ENOENT) {
             VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed "
                          "(%s)", netdev_get_name(netdev_), strerror(error));
diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index ce89257..2b3c9b2 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -606,7 +606,6 @@ const struct netdev_class *netdev_lookup_provider(const char *type);
 extern const struct netdev_class netdev_linux_class;
 extern const struct netdev_class netdev_internal_class;
 extern const struct netdev_class netdev_tap_class;
-extern const struct netdev_class netdev_patch_class;
 #ifdef __FreeBSD__
 extern const struct netdev_class netdev_bsd_class;
 #endif
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 31ac2e7..3938764 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -21,8 +21,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/socket.h>
-#include <linux/openvswitch.h>
-#include <linux/rtnetlink.h>
 #include <net/if.h>
 #include <sys/ioctl.h>
 
@@ -30,22 +28,15 @@
 #include "daemon.h"
 #include "dirs.h"
 #include "dpif.h"
-#include "dpif-linux.h"
 #include "hash.h"
 #include "hmap.h"
 #include "list.h"
-#include "netdev-linux.h"
 #include "netdev-provider.h"
-#include "netlink.h"
-#include "netlink-notifier.h"
-#include "netlink-socket.h"
 #include "ofpbuf.h"
-#include "openvswitch/tunnel.h"
 #include "packets.h"
 #include "route-table.h"
 #include "shash.h"
 #include "socket-util.h"
-#include "unaligned.h"
 #include "vlog.h"
 
 VLOG_DEFINE_THIS_MODULE(netdev_vport);
@@ -69,7 +60,6 @@ struct netdev_dev_vport {
 };
 
 struct vport_class {
-    enum ovs_vport_type type;
     const char *dpif_port;
     struct netdev_class netdev_class;
 };
@@ -111,26 +101,13 @@ get_netdev_tunnel_config(const struct netdev_dev *netdev_dev)
     return &netdev_dev_vport_cast(netdev_dev)->tnl_cfg;
 }
 
-enum ovs_vport_type
-netdev_vport_get_vport_type(const struct netdev *netdev)
-{
-    const struct netdev_dev *dev = netdev_get_dev(netdev);
-    const struct netdev_class *class = netdev_dev_get_class(dev);
-
-    return (is_vport_class(class) ? vport_class_cast(class)->type
-            : class == &netdev_internal_class ? OVS_VPORT_TYPE_INTERNAL
-            : (class == &netdev_linux_class ||
-               class == &netdev_tap_class) ? OVS_VPORT_TYPE_NETDEV
-            : OVS_VPORT_TYPE_UNSPEC);
-}
-
 bool
 netdev_vport_is_patch(const struct netdev *netdev)
 {
     const struct netdev_dev *dev = netdev_get_dev(netdev);
     const struct netdev_class *class = netdev_dev_get_class(dev);
 
-    return class->get_config == get_patch_config; 
+    return class->get_config == get_patch_config;
 }
 
 static int
@@ -192,58 +169,6 @@ netdev_vport_get_etheraddr(const struct netdev *netdev,
     return 0;
 }
 
-/* Copies 'src' into 'dst', performing format conversion in the process.
- *
- * 'src' is allowed to be misaligned. */
-static void
-netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst,
-                                  const struct ovs_vport_stats *src)
-{
-    dst->rx_packets = get_unaligned_u64(&src->rx_packets);
-    dst->tx_packets = get_unaligned_u64(&src->tx_packets);
-    dst->rx_bytes = get_unaligned_u64(&src->rx_bytes);
-    dst->tx_bytes = get_unaligned_u64(&src->tx_bytes);
-    dst->rx_errors = get_unaligned_u64(&src->rx_errors);
-    dst->tx_errors = get_unaligned_u64(&src->tx_errors);
-    dst->rx_dropped = get_unaligned_u64(&src->rx_dropped);
-    dst->tx_dropped = get_unaligned_u64(&src->tx_dropped);
-    dst->multicast = 0;
-    dst->collisions = 0;
-    dst->rx_length_errors = 0;
-    dst->rx_over_errors = 0;
-    dst->rx_crc_errors = 0;
-    dst->rx_frame_errors = 0;
-    dst->rx_fifo_errors = 0;
-    dst->rx_missed_errors = 0;
-    dst->tx_aborted_errors = 0;
-    dst->tx_carrier_errors = 0;
-    dst->tx_fifo_errors = 0;
-    dst->tx_heartbeat_errors = 0;
-    dst->tx_window_errors = 0;
-}
-
-int
-netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
-{
-    struct dpif_linux_vport reply;
-    struct ofpbuf *buf;
-    int error;
-
-    error = dpif_linux_vport_get(netdev_get_name(netdev), &reply, &buf);
-    if (error) {
-        return error;
-    } else if (!reply.stats) {
-        ofpbuf_delete(buf);
-        return EOPNOTSUPP;
-    }
-
-    netdev_stats_from_ovs_vport_stats(stats, reply.stats);
-
-    ofpbuf_delete(buf);
-
-    return 0;
-}
-
 static int
 tunnel_get_status(const struct netdev *netdev, struct smap *smap)
 {
@@ -715,29 +640,23 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
                                                             \
     netdev_vport_change_seq
 
-#define TUNNEL_CLASS(NAME, VPORT_TYPE, DPIF_PORT)           \
-    { VPORT_TYPE, DPIF_PORT,                                \
+#define TUNNEL_CLASS(NAME, DPIF_PORT)                       \
+    { DPIF_PORT,                                            \
         { NAME, VPORT_FUNCTIONS(get_tunnel_config,          \
                                 set_tunnel_config,          \
                                 get_netdev_tunnel_config,   \
                                 tunnel_get_status) }}
 
 void
-netdev_vport_register(void)
+netdev_vport_tunnel_register(void)
 {
     static const struct vport_class vport_classes[] = {
-        TUNNEL_CLASS("gre", OVS_VPORT_TYPE_GRE, "gre_system"),
-        TUNNEL_CLASS("ipsec_gre", OVS_VPORT_TYPE_GRE, "gre_system"),
-        TUNNEL_CLASS("gre64", OVS_VPORT_TYPE_GRE64, "gre64_system"),
-        TUNNEL_CLASS("ipsec_gre64", OVS_VPORT_TYPE_GRE64, "gre64_system"),
-        TUNNEL_CLASS("capwap", OVS_VPORT_TYPE_CAPWAP, "capwap_system"),
-        TUNNEL_CLASS("vxlan", OVS_VPORT_TYPE_VXLAN, "vxlan_system"),
-
-        { OVS_VPORT_TYPE_UNSPEC, NULL,
-          { "patch", VPORT_FUNCTIONS(get_patch_config,
-                                     set_patch_config,
-                                     NULL,
-                                     NULL) }},
+        TUNNEL_CLASS("gre", "gre_system"),
+        TUNNEL_CLASS("ipsec_gre", "gre_system"),
+        TUNNEL_CLASS("gre64", "gre64_system"),
+        TUNNEL_CLASS("ipsec_gre64", "gre64_system"),
+        TUNNEL_CLASS("capwap", "capwap_system"),
+        TUNNEL_CLASS("vxlan", "vxlan_system")
     };
 
     int i;
@@ -746,3 +665,15 @@ netdev_vport_register(void)
         netdev_register_provider(&vport_classes[i].netdev_class);
     }
 }
+
+void
+netdev_vport_patch_register(void)
+{
+    static const struct vport_class patch_class =
+        { NULL,
+            { "patch", VPORT_FUNCTIONS(get_patch_config,
+                                       set_patch_config,
+                                       NULL,
+                                       NULL) }};
+    netdev_register_provider(&patch_class.netdev_class);
+}
diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h
index caf8687..b1013e5 100644
--- a/lib/netdev-vport.h
+++ b/lib/netdev-vport.h
@@ -24,13 +24,11 @@ struct dpif_flow_stats;
 struct netdev;
 struct netdev_stats;
 
-void netdev_vport_register(void);
+void netdev_vport_tunnel_register(void);
+void netdev_vport_patch_register(void);
 
-enum ovs_vport_type netdev_vport_get_vport_type(const struct netdev *);
 bool netdev_vport_is_patch(const struct netdev *);
 
-int netdev_vport_get_stats(const struct netdev *, struct netdev_stats *);
-
 const char *netdev_vport_patch_peer(const struct netdev *netdev);
 
 void netdev_vport_inc_rx(const struct netdev *,
diff --git a/lib/netdev.c b/lib/netdev.c
index a18fee5..fe661fe 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -73,12 +73,13 @@ 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);
-- 
1.7.9.5




More information about the dev mailing list