netdev-vport: Build on all platforms.
authorEthan Jackson <ethan@nicira.com>
Fri, 25 Jan 2013 21:30:40 +0000 (13:30 -0800)
committerEthan Jackson <ethan@nicira.com>
Tue, 29 Jan 2013 03:09:58 +0000 (19:09 -0800)
This patch removes the final bit of linux specific code which
prevents building netdev-vport everywhere.  With this, other
platforms automatically get access to patch ports, and (if their
datapath supports it), flow based tunneling.

Signed-off-by: Ethan Jackson <ethan@nicira.com>
lib/automake.mk
lib/dpif-linux.c
lib/dpif.h
lib/netdev-dummy.c
lib/netdev-linux.c
lib/netdev-provider.h
lib/netdev-vport.c
lib/netdev-vport.h
lib/netdev.c

index 4547198..d333a4d 100644 (file)
@@ -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 \
index c7a0746..b6eba39 100644 (file)
@@ -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'",
index a478db2..c5e3fc8 100644 (file)
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
-#include <linux/openvswitch.h>
 #include "openflow/openflow.h"
 #include "netdev.h"
 #include "util.h"
index ab43772..f81b68e 100644 (file)
@@ -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"
 
 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];
@@ -530,4 +537,8 @@ netdev_dummy_register(bool override)
         sset_destroy(&types);
     }
     netdev_register_provider(&dummy_class);
+
+    if (FREE_BSD) {
+        netdev_vport_tunnel_register();
+    }
 }
index f0f1dc2..5de4fa2 100644 (file)
 #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));
index c7de2c2..9db950c 100644 (file)
@@ -601,7 +601,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
index 72175b7..b892f8f 100644 (file)
@@ -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>
 
 #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;
 }
 
 const char *
@@ -205,58 +182,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)
 {
@@ -721,29 +646,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;
@@ -752,3 +671,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);
+}
index fd918df..c907b0c 100644 (file)
@@ -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 *,
index 3909ab2..e338d7c 100644 (file)
@@ -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);