STT uses TCP port so we need to filter traffic on basis of TCP port numbers.
Signed-off-by: Pravin B Shelar <pshe...@nicira.com> --- lib/tnl-ports.c | 55 +++++++++++++++++++++++++++++++------------------------ lib/tnl-ports.h | 4 ++-- ofproto/tunnel.c | 5 ++++- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c index e7f2066..13d114d 100644 --- a/lib/tnl-ports.c +++ b/lib/tnl-ports.c @@ -51,8 +51,9 @@ static struct ovs_list addr_list; struct tnl_port { odp_port_t port; - ovs_be16 udp_port; + ovs_be16 tp_port; char dev_name[IFNAMSIZ]; + char type[IFNAMSIZ]; struct ovs_list node; }; @@ -82,7 +83,7 @@ tnl_port_free(struct tnl_port_in *p) static void tnl_port_init_flow(struct flow *flow, struct eth_addr mac, - struct in6_addr *addr, ovs_be16 udp_port) + struct in6_addr *addr, ovs_be16 tp_port, const char type[]) { memset(flow, 0, sizeof *flow); @@ -95,24 +96,28 @@ tnl_port_init_flow(struct flow *flow, struct eth_addr mac, flow->ipv6_dst = *addr; } - if (udp_port) { - flow->nw_proto = IPPROTO_UDP; + if (tp_port) { + if (!strcmp(type, "stt")) { + flow->nw_proto = IPPROTO_TCP; + } else { + flow->nw_proto = IPPROTO_UDP; + } } else { flow->nw_proto = IPPROTO_GRE; } - flow->tp_dst = udp_port; + flow->tp_dst = tp_port; } static void map_insert(odp_port_t port, struct eth_addr mac, struct in6_addr *addr, - ovs_be16 udp_port, const char dev_name[]) + ovs_be16 tp_port, const char dev_name[], const char type[]) { const struct cls_rule *cr; struct tnl_port_in *p; struct match match; memset(&match, 0, sizeof match); - tnl_port_init_flow(&match.flow, mac, addr, udp_port); + tnl_port_init_flow(&match.flow, mac, addr, tp_port, type); do { cr = classifier_lookup(&cls, CLS_MAX_VERSION, &match.flow, NULL); @@ -129,9 +134,9 @@ map_insert(odp_port_t port, struct eth_addr mac, struct in6_addr *addr, /* XXX: No fragments support. */ match.wc.masks.nw_frag = FLOW_NW_FRAG_MASK; - /* 'udp_port' is zero for non-UDP tunnels (e.g. GRE). In this case it + /* 'tp_port' is zero for non-UDP tunnels (e.g. GRE). In this case it * doesn't make sense to match on UDP port numbers. */ - if (udp_port) { + if (tp_port) { match.wc.masks.tp_dst = OVS_BE16_MAX; } if (IN6_IS_ADDR_V4MAPPED(addr)) { @@ -152,33 +157,34 @@ map_insert(odp_port_t port, struct eth_addr mac, struct in6_addr *addr, void tnl_port_map_insert(odp_port_t port, - ovs_be16 udp_port, const char dev_name[]) + ovs_be16 tp_port, const char dev_name[], const char type[]) { struct tnl_port *p; struct ip_device *ip_dev; ovs_mutex_lock(&mutex); LIST_FOR_EACH(p, node, &port_list) { - if (udp_port == p->udp_port) { + if (tp_port == p->tp_port) { goto out; } } p = xzalloc(sizeof *p); p->port = port; - p->udp_port = udp_port; + p->tp_port = tp_port; ovs_strlcpy(p->dev_name, dev_name, sizeof p->dev_name); + ovs_strlcpy(p->type, type, sizeof p->dev_name); list_insert(&port_list, &p->node); LIST_FOR_EACH(ip_dev, node, &addr_list) { if (ip_dev->addr4 != INADDR_ANY) { struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4); map_insert(p->port, ip_dev->mac, &addr4, - p->udp_port, p->dev_name); + p->tp_port, p->dev_name, p->type); } if (ipv6_addr_is_set(&ip_dev->addr6)) { map_insert(p->port, ip_dev->mac, &ip_dev->addr6, - p->udp_port, p->dev_name); + p->tp_port, p->dev_name, p->type); } } @@ -199,19 +205,20 @@ tnl_port_unref(const struct cls_rule *cr) } static void -map_delete(struct eth_addr mac, struct in6_addr *addr, ovs_be16 udp_port) +map_delete(struct eth_addr mac, struct in6_addr *addr, + ovs_be16 tp_port, const char type[]) { const struct cls_rule *cr; struct flow flow; - tnl_port_init_flow(&flow, mac, addr, udp_port); + tnl_port_init_flow(&flow, mac, addr, tp_port, type); cr = classifier_lookup(&cls, CLS_MAX_VERSION, &flow, NULL); tnl_port_unref(cr); } void -tnl_port_map_delete(ovs_be16 udp_port) +tnl_port_map_delete(ovs_be16 tp_port) { struct tnl_port *p, *next; struct ip_device *ip_dev; @@ -219,7 +226,7 @@ tnl_port_map_delete(ovs_be16 udp_port) ovs_mutex_lock(&mutex); LIST_FOR_EACH_SAFE(p, next, node, &port_list) { - if (p->udp_port == udp_port) { + if (p->tp_port == tp_port) { list_remove(&p->node); found = true; break; @@ -232,10 +239,10 @@ tnl_port_map_delete(ovs_be16 udp_port) LIST_FOR_EACH(ip_dev, node, &addr_list) { if (ip_dev->addr4 != INADDR_ANY) { struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4); - map_delete(ip_dev->mac, &addr4, udp_port); + map_delete(ip_dev->mac, &addr4, tp_port, p->type); } if (ipv6_addr_is_set(&ip_dev->addr6)) { - map_delete(ip_dev->mac, &ip_dev->addr6, udp_port); + map_delete(ip_dev->mac, &ip_dev->addr6, tp_port, p->type); } } @@ -334,11 +341,11 @@ map_insert_ipdev(struct ip_device *ip_dev) if (ip_dev->addr4 != INADDR_ANY) { struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4); map_insert(p->port, ip_dev->mac, &addr4, - p->udp_port, p->dev_name); + p->tp_port, p->dev_name, p->type); } if (ipv6_addr_is_set(&ip_dev->addr6)) { map_insert(p->port, ip_dev->mac, &ip_dev->addr6, - p->udp_port, p->dev_name); + p->tp_port, p->dev_name, p->type); } } } @@ -391,10 +398,10 @@ delete_ipdev(struct ip_device *ip_dev) LIST_FOR_EACH(p, node, &port_list) { if (ip_dev->addr4 != INADDR_ANY) { struct in6_addr addr4 = in6_addr_mapped_ipv4(ip_dev->addr4); - map_delete(ip_dev->mac, &addr4, p->udp_port); + map_delete(ip_dev->mac, &addr4, p->tp_port, p->type); } if (ipv6_addr_is_set(&ip_dev->addr6)) { - map_delete(ip_dev->mac, &ip_dev->addr6, p->udp_port); + map_delete(ip_dev->mac, &ip_dev->addr6, p->tp_port, p->type); } } diff --git a/lib/tnl-ports.h b/lib/tnl-ports.h index 4195e6a..8dbee06 100644 --- a/lib/tnl-ports.h +++ b/lib/tnl-ports.h @@ -26,8 +26,8 @@ odp_port_t tnl_port_map_lookup(struct flow *flow, struct flow_wildcards *wc); -void tnl_port_map_insert(odp_port_t port, ovs_be16 udp_port, - const char dev_name[]); +void tnl_port_map_insert(odp_port_t port, ovs_be16 tp_port, + const char dev_name[], const char type[]); void tnl_port_map_delete(ovs_be16 udp_port); void tnl_port_map_insert_ipdev(const char dev[]); diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c index 7ac8841..7aa0a05 100644 --- a/ofproto/tunnel.c +++ b/ofproto/tunnel.c @@ -194,7 +194,10 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev, tnl_port_mod_log(tnl_port, "adding"); if (native_tnl) { - tnl_port_map_insert(odp_port, cfg->dst_port, name); + const char *type; + + type = netdev_get_type(netdev); + tnl_port_map_insert(odp_port, cfg->dst_port, name, type); } return true; } -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev