From: Ethan Jackson Date: Fri, 25 Jan 2013 21:30:40 +0000 (-0800) Subject: netdev-vport: Build on all platforms. X-Git-Tag: sliver-openvswitch-1.9.90-3~3^2~1 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=c060c4cf83c03385f295680e34bc55f4a8024034 netdev-vport: Build on all platforms. 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 --- diff --git a/lib/automake.mk b/lib/automake.mk index 454719804..d333a4d21 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 c7a074628..b6eba3976 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 a478db2c4..c5e3fc810 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -324,7 +324,6 @@ #include #include #include -#include #include "openflow/openflow.h" #include "netdev.h" #include "util.h" diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index ab43772af..f81b68e67 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]; @@ -530,4 +537,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 f0f1dc279..5de4fa23c 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 c7de2c2e4..9db950cf7 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -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 diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 72175b77f..b892f8fdf 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -21,8 +21,6 @@ #include #include #include -#include -#include #include #include @@ -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; } 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); +} diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h index fd918df61..c907b0c8f 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 3909ab21d..e338d7c64 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);