X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev-vport.c;h=3d4b31464d313a325dadf73834f40479a3a7fc75;hb=add037c6b692db9c66dd0c16dff2d4b1b46c7499;hp=cea44c8f6c26736f9fc7cd785ff4252b98e5d701;hpb=4f2abb7bf6d937caa013d7e431978e23be4da2aa;p=sliver-openvswitch.git diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index cea44c8f6..3d4b31464 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -41,15 +41,13 @@ VLOG_DEFINE_THIS_MODULE(netdev_vport); -/* Default to the OTV port, per the VXLAN IETF draft. */ #define VXLAN_DST_PORT 4789 - #define LISP_DST_PORT 4341 #define DEFAULT_TTL 64 struct netdev_dev_vport { - struct netdev_dev netdev_dev; + struct netdev_dev up; unsigned int change_seq; uint8_t etheraddr[ETH_ADDR_LEN]; struct netdev_stats stats; @@ -89,7 +87,7 @@ static struct netdev_dev_vport * netdev_dev_vport_cast(const struct netdev_dev *netdev_dev) { ovs_assert(is_vport_class(netdev_dev_get_class(netdev_dev))); - return CONTAINER_OF(netdev_dev, struct netdev_dev_vport, netdev_dev); + return CONTAINER_OF(netdev_dev, struct netdev_dev_vport, up); } static struct netdev_dev_vport * @@ -161,11 +159,11 @@ netdev_vport_create(const struct netdev_class *netdev_class, const char *name, struct netdev_dev_vport *dev; dev = xzalloc(sizeof *dev); - netdev_dev_init(&dev->netdev_dev, name, netdev_class); + netdev_dev_init(&dev->up, name, netdev_class); dev->change_seq = 1; eth_addr_random(dev->etheraddr); - *netdev_devp = &dev->netdev_dev; + *netdev_devp = &dev->up; route_table_register(); return 0; @@ -236,7 +234,7 @@ tunnel_get_status(const struct netdev *netdev, struct smap *smap) } static int -netdev_vport_update_flags(struct netdev *netdev OVS_UNUSED, +netdev_vport_update_flags(struct netdev_dev *netdev_dev OVS_UNUSED, enum netdev_flags off, enum netdev_flags on OVS_UNUSED, enum netdev_flags *old_flagsp) { @@ -327,7 +325,10 @@ set_tunnel_config(struct netdev_dev *dev_, const struct smap *args) SMAP_FOR_EACH (node, args) { if (!strcmp(node->key, "remote_ip")) { struct in_addr in_addr; - if (lookup_ip(node->value, &in_addr)) { + if (!strcmp(node->value, "flow")) { + tnl_cfg.ip_dst_flow = true; + tnl_cfg.ip_dst = htonl(0); + } else if (lookup_ip(node->value, &in_addr)) { VLOG_WARN("%s: bad %s 'remote_ip'", name, type); } else if (ip_is_multicast(in_addr.s_addr)) { VLOG_WARN("%s: multicast remote_ip="IP_FMT" not allowed", @@ -338,7 +339,10 @@ set_tunnel_config(struct netdev_dev *dev_, const struct smap *args) } } else if (!strcmp(node->key, "local_ip")) { struct in_addr in_addr; - if (lookup_ip(node->value, &in_addr)) { + if (!strcmp(node->value, "flow")) { + tnl_cfg.ip_src_flow = true; + tnl_cfg.ip_src = htonl(0); + } else if (lookup_ip(node->value, &in_addr)) { VLOG_WARN("%s: bad %s 'local_ip'", name, type); } else { tnl_cfg.ip_src = in_addr.s_addr; @@ -445,11 +449,16 @@ set_tunnel_config(struct netdev_dev *dev_, const struct smap *args) } } - if (!tnl_cfg.ip_dst) { + if (!tnl_cfg.ip_dst && !tnl_cfg.ip_dst_flow) { VLOG_ERR("%s: %s type requires valid 'remote_ip' argument", name, type); return EINVAL; } + if (tnl_cfg.ip_src_flow && !tnl_cfg.ip_dst_flow) { + VLOG_ERR("%s: %s type requires 'remote_ip=flow' with 'local_ip=flow'", + name, type); + return EINVAL; + } if (!tnl_cfg.ttl) { tnl_cfg.ttl = DEFAULT_TTL; } @@ -476,10 +485,14 @@ get_tunnel_config(struct netdev_dev *dev, struct smap *args) if (tnl_cfg->ip_dst) { smap_add_format(args, "remote_ip", IP_FMT, IP_ARGS(tnl_cfg->ip_dst)); + } else if (tnl_cfg->ip_dst_flow) { + smap_add(args, "remote_ip", "flow"); } if (tnl_cfg->ip_src) { smap_add_format(args, "local_ip", IP_FMT, IP_ARGS(tnl_cfg->ip_src)); + } else if (tnl_cfg->ip_src_flow) { + smap_add(args, "local_ip", "flow"); } if (tnl_cfg->in_key_flow && tnl_cfg->out_key_flow) { @@ -631,10 +644,7 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats) netdev_vport_open, \ netdev_vport_close, \ \ - NULL, /* listen */ \ - NULL, /* recv */ \ - NULL, /* recv_wait */ \ - NULL, /* drain */ \ + NULL, /* rx_open */ \ \ NULL, /* send */ \ NULL, /* send_wait */ \