[ovs-dev] [tunnel 11/11] netdev-vport: Build on all platforms.
Ethan Jackson
ethan at nicira.com
Mon Jan 28 00:58:12 UTC 2013
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 at nicira.com>
---
lib/automake.mk | 4 +-
lib/dpif-linux.c | 24 ++++++++++-
lib/dpif.h | 1 -
lib/netdev-linux.c | 59 +++++++++++++++++++++++++--
lib/netdev-provider.h | 1 -
lib/netdev-vport.c | 108 ++++++++-----------------------------------------
lib/netdev-vport.h | 3 --
7 files changed, 98 insertions(+), 102 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 7cb601e..1a84375 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -459,6 +459,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)
@@ -482,7 +504,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-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 3129c49..3417188 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;
};
@@ -110,25 +100,6 @@ 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)
-{
- return netdev_vport_get_vport_type(netdev) == OVS_VPORT_TYPE_PATCH;
-}
-
static int
netdev_vport_create(const struct netdev_class *netdev_class, const char *name,
struct netdev_dev **netdev_devp)
@@ -188,58 +159,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)
{
@@ -648,6 +567,13 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
memcpy(stats, &dev->stats, sizeof *stats);
return 0;
}
+
+bool
+netdev_vport_is_patch(const struct netdev *netdev)
+{
+ return netdev_dev_get_class(netdev_get_dev(netdev))->get_config
+ == get_patch_config;
+}
#define VPORT_FUNCTIONS(GET_CONFIG, SET_CONFIG, \
GET_TUNNEL_CONFIG, GET_STATUS) \
@@ -711,8 +637,8 @@ 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, \
@@ -722,14 +648,14 @@ void
netdev_vport_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_PATCH, 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"),
+
+ { NULL,
{ "patch", VPORT_FUNCTIONS(get_patch_config,
set_patch_config,
NULL,
diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h
index caf8687..905b6f9 100644
--- a/lib/netdev-vport.h
+++ b/lib/netdev-vport.h
@@ -26,11 +26,8 @@ struct netdev_stats;
void netdev_vport_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 *,
--
1.7.9.5
More information about the dev
mailing list