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 <et...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev