[ovs-dev] [PATCH 7/8] tnl-ports: Handle STT ports.

Pravin B Shelar pshelar at nicira.com
Mon Jan 11 07:18:13 UTC 2016


STT uses TCP port so we need to filter traffic on basis of TCP
port numbers.

Signed-off-by: Pravin B Shelar <pshelar at 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




More information about the dev mailing list