[ovs-dev] [PATCH 2/3] tc: Split IPs and transport layer ports unions in flower struct

Roi Dayan roid at mellanox.com
Thu Jul 27 10:19:59 UTC 2017


From: Paul Blakey <paulb at mellanox.com>

Split dst/src_port and ipv4/ipv6 union so we can
distingush them easily for later features.

Signed-off-by: Paul Blakey <paulb at mellanox.com>
Reviewed-by: Roi Dayan <roid at mellanox.com>
---
 lib/netdev-tc-offloads.c | 29 +++++++++++++++++++++--------
 lib/tc.c                 | 24 ++++++++++++------------
 lib/tc.h                 | 25 +++++++++++++------------
 3 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c
index 6214023..e2aea60 100644
--- a/lib/netdev-tc-offloads.c
+++ b/lib/netdev-tc-offloads.c
@@ -319,8 +319,15 @@ parse_tc_flower_to_match(struct tc_flower *flower,
     match_set_ipv6_dst_masked(match,
                               &key->ipv6.ipv6_dst, &mask->ipv6.ipv6_dst);
 
-    match_set_tp_dst_masked(match, key->dst_port, mask->dst_port);
-    match_set_tp_src_masked(match, key->src_port, mask->src_port);
+    if (is_ip_any(&match->flow)) {
+        if (key->ip_proto == IPPROTO_TCP) {
+            match_set_tp_dst_masked(match, key->tcp_dst, mask->tcp_dst);
+            match_set_tp_src_masked(match, key->tcp_src, mask->tcp_src);
+        } else if (key->ip_proto == IPPROTO_UDP) {
+            match_set_tp_dst_masked(match, key->udp_dst, mask->udp_dst);
+            match_set_tp_src_masked(match, key->udp_src, mask->udp_src);
+        }
+    }
 
     if (flower->tunnel.tunnel) {
         match_set_tun_id(match, flower->tunnel.id);
@@ -747,12 +754,18 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
     if (is_ip_any(key)) {
         flower.key.ip_proto = key->nw_proto;
         flower.mask.ip_proto = mask->nw_proto;
-
-        if (key->nw_proto == IPPROTO_TCP || key->nw_proto == IPPROTO_UDP) {
-            flower.key.dst_port = key->tp_dst;
-            flower.mask.dst_port = mask->tp_dst;
-            flower.key.src_port = key->tp_src;
-            flower.mask.src_port = mask->tp_src;
+        if (key->nw_proto == IPPROTO_TCP) {
+            flower.key.tcp_dst = key->tp_dst;
+            flower.mask.tcp_dst = mask->tp_dst;
+            flower.key.tcp_src = key->tp_src;
+            flower.mask.tcp_src = mask->tp_src;
+            mask->tp_src = 0;
+            mask->tp_dst = 0;
+        } else if (key->nw_proto == IPPROTO_UDP) {
+            flower.key.udp_dst = key->tp_dst;
+            flower.mask.udp_dst = mask->tp_dst;
+            flower.key.udp_src = key->tp_src;
+            flower.mask.udp_src = mask->tp_src;
             mask->tp_src = 0;
             mask->tp_dst = 0;
         }
diff --git a/lib/tc.c b/lib/tc.c
index 563aba4..d724d8a 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -305,26 +305,26 @@ nl_parse_flower_ip(struct nlattr **attrs, struct tc_flower *flower) {
 
     if (ip_proto == IPPROTO_TCP) {
         if (attrs[TCA_FLOWER_KEY_TCP_SRC_MASK]) {
-            key->src_port =
+            key->tcp_src =
                 nl_attr_get_be16(attrs[TCA_FLOWER_KEY_TCP_SRC]);
-            mask->src_port =
+            mask->tcp_src =
                 nl_attr_get_be16(attrs[TCA_FLOWER_KEY_TCP_SRC_MASK]);
         }
         if (attrs[TCA_FLOWER_KEY_TCP_DST_MASK]) {
-            key->dst_port =
+            key->tcp_dst =
                 nl_attr_get_be16(attrs[TCA_FLOWER_KEY_TCP_DST]);
-            mask->dst_port =
+            mask->tcp_dst =
                 nl_attr_get_be16(attrs[TCA_FLOWER_KEY_TCP_DST_MASK]);
         }
     } else if (ip_proto == IPPROTO_UDP) {
         if (attrs[TCA_FLOWER_KEY_UDP_SRC_MASK]) {
-            key->src_port = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_UDP_SRC]);
-            mask->src_port =
+            key->udp_src = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_UDP_SRC]);
+            mask->udp_src =
                 nl_attr_get_be16(attrs[TCA_FLOWER_KEY_UDP_SRC_MASK]);
         }
         if (attrs[TCA_FLOWER_KEY_UDP_DST_MASK]) {
-            key->dst_port = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_UDP_DST]);
-            mask->dst_port =
+            key->udp_dst = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_UDP_DST]);
+            mask->udp_dst =
                 nl_attr_get_be16(attrs[TCA_FLOWER_KEY_UDP_DST_MASK]);
         }
     }
@@ -994,11 +994,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
         }
 
         if (flower->key.ip_proto == IPPROTO_UDP) {
-            FLOWER_PUT_MASKED_VALUE(src_port, TCA_FLOWER_KEY_UDP_SRC);
-            FLOWER_PUT_MASKED_VALUE(dst_port, TCA_FLOWER_KEY_UDP_DST);
+            FLOWER_PUT_MASKED_VALUE(udp_src, TCA_FLOWER_KEY_UDP_SRC);
+            FLOWER_PUT_MASKED_VALUE(udp_dst, TCA_FLOWER_KEY_UDP_DST);
         } else if (flower->key.ip_proto == IPPROTO_TCP) {
-            FLOWER_PUT_MASKED_VALUE(src_port, TCA_FLOWER_KEY_TCP_SRC);
-            FLOWER_PUT_MASKED_VALUE(dst_port, TCA_FLOWER_KEY_TCP_DST);
+            FLOWER_PUT_MASKED_VALUE(tcp_src, TCA_FLOWER_KEY_TCP_SRC);
+            FLOWER_PUT_MASKED_VALUE(tcp_dst, TCA_FLOWER_KEY_TCP_DST);
         }
     }
 
diff --git a/lib/tc.h b/lib/tc.h
index 1cc7362..571ec9f 100644
--- a/lib/tc.h
+++ b/lib/tc.h
@@ -76,24 +76,25 @@ struct tc_flower_key {
     struct eth_addr dst_mac;
     struct eth_addr src_mac;
 
-    ovs_be16 src_port;
-    ovs_be16 dst_port;
+    ovs_be16 tcp_src;
+    ovs_be16 tcp_dst;
+
+    ovs_be16 udp_src;
+    ovs_be16 udp_dst;
 
     uint16_t vlan_id;
     uint8_t vlan_prio;
 
     ovs_be16 encap_eth_type;
 
-    union {
-        struct {
-            ovs_be32 ipv4_src;
-            ovs_be32 ipv4_dst;
-        } ipv4;
-        struct {
-            struct in6_addr ipv6_src;
-            struct in6_addr ipv6_dst;
-        } ipv6;
-    };
+    struct {
+        ovs_be32 ipv4_src;
+        ovs_be32 ipv4_dst;
+    } ipv4;
+    struct {
+        struct in6_addr ipv6_src;
+        struct in6_addr ipv6_dst;
+    } ipv6;
 };
 
 struct tc_flower {
-- 
2.7.4



More information about the dev mailing list