[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