X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev-vport.c;h=adcc3529fe16320d409aab3d37ff54003a9fbebe;hb=9eeb949bbaf75565ab2330ea26ae467d87ec194d;hp=b892f8fdfad733e89f3d98b6890a508d601085a2;hpb=c060c4cf83c03385f295680e34bc55f4a8024034;p=sliver-openvswitch.git diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index b892f8fdf..adcc3529f 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -44,6 +44,8 @@ VLOG_DEFINE_THIS_MODULE(netdev_vport); /* Default to the OTV port, per the VXLAN IETF draft. */ #define VXLAN_DST_PORT 8472 +#define LISP_DST_PORT 4341 + #define DEFAULT_TTL 64 struct netdev_dev_vport { @@ -67,6 +69,7 @@ struct vport_class { static int netdev_vport_create(const struct netdev_class *, const char *, struct netdev_dev **); static int get_patch_config(struct netdev_dev *, struct smap *args); +static int get_tunnel_config(struct netdev_dev *, struct smap *args); static void netdev_vport_poll_notify(struct netdev_dev_vport *); static bool @@ -110,6 +113,16 @@ netdev_vport_is_patch(const struct netdev *netdev) return class->get_config == get_patch_config; } +static bool +netdev_vport_needs_dst_port(const struct netdev_dev *dev) +{ + const struct netdev_class *class = netdev_dev_get_class(dev); + const char *type = netdev_dev_get_type(dev); + + return (class->get_config == get_tunnel_config && + (!strcmp("vxlan", type) || !strcmp("lisp", type))); +} + const char * netdev_vport_get_dpif_port(const struct netdev *netdev) { @@ -117,9 +130,27 @@ netdev_vport_get_dpif_port(const struct netdev *netdev) const struct netdev_class *class = netdev_dev_get_class(dev); const char *dpif_port; - dpif_port = (is_vport_class(class) - ? vport_class_cast(class)->dpif_port - : NULL); + if (netdev_vport_needs_dst_port(dev)) { + const struct netdev_dev_vport *vport = netdev_vport_get_dev(netdev); + const char *type = netdev_dev_get_type(dev); + static char dpif_port_combined[IFNAMSIZ]; + + /* + * Note: IFNAMSIZ is 16 bytes long. The maximum length of a VXLAN + * or LISP port name below is 15 or 14 bytes respectively. Still, + * assert here on the size of strlen(type) in case that changes + * in the future. + */ + ovs_assert(strlen(type) + 10 < IFNAMSIZ); + snprintf(dpif_port_combined, IFNAMSIZ, "%s_sys_%d", type, + ntohs(vport->tnl_cfg.dst_port)); + return dpif_port_combined; + } else { + dpif_port = (is_vport_class(class) + ? vport_class_cast(class)->dpif_port + : NULL); + } + return dpif_port ? dpif_port : netdev_get_name(netdev); } @@ -289,11 +320,7 @@ set_tunnel_config(struct netdev_dev *dev_, const struct smap *args) ipsec_mech_set = false; memset(&tnl_cfg, 0, sizeof tnl_cfg); - if (!strcmp(type, "capwap")) { - VLOG_WARN_ONCE("CAPWAP tunnel support is deprecated."); - } - - needs_dst_port = !strcmp(type, "vxlan"); + needs_dst_port = netdev_vport_needs_dst_port(dev_); tnl_cfg.ipsec = strstr(type, "ipsec"); tnl_cfg.dont_fragment = true; @@ -378,10 +405,15 @@ set_tunnel_config(struct netdev_dev *dev_, const struct smap *args) } /* Add a default destination port for VXLAN if none specified. */ - if (needs_dst_port && !tnl_cfg.dst_port) { + if (!strcmp(type, "vxlan") && !tnl_cfg.dst_port) { tnl_cfg.dst_port = htons(VXLAN_DST_PORT); } + /* Add a default destination port for LISP if none specified. */ + if (!strcmp(type, "lisp") && !tnl_cfg.dst_port) { + tnl_cfg.dst_port = htons(LISP_DST_PORT); + } + if (tnl_cfg.ipsec) { static pid_t pid = 0; if (pid <= 0) { @@ -489,7 +521,10 @@ get_tunnel_config(struct netdev_dev *dev, struct smap *args) if (tnl_cfg->dst_port) { uint16_t dst_port = ntohs(tnl_cfg->dst_port); - if (dst_port != VXLAN_DST_PORT) { + const char *type = netdev_dev_get_type(dev); + + if ((!strcmp("vxlan", type) && dst_port != VXLAN_DST_PORT) || + (!strcmp("lisp", type) && dst_port != LISP_DST_PORT)) { smap_add_format(args, "dst_port", "%d", dst_port); } } @@ -661,8 +696,8 @@ netdev_vport_tunnel_register(void) 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") + TUNNEL_CLASS("vxlan", "vxlan_system"), + TUNNEL_CLASS("lisp", "lisp_system") }; int i;