From 2b1d9fa9090965f31c83966d513d6e486481decb Mon Sep 17 00:00:00 2001 From: Paul Blakey Date: Thu, 3 Aug 2017 16:38:24 +0300 Subject: [PATCH] tc: Split IPs and transport layer ports unions in flower struct Split dst/src_port and ipv4/ipv6 union so we can distingush them easily for later features. Signed-off-by: Paul Blakey Reviewed-by: Roi Dayan Signed-off-by: Ben Pfaff --- lib/netdev-tc-offloads.c | 37 ++++++++++++++++++++++++++++--------- lib/tc.c | 36 ++++++++++++++++++------------------ lib/tc.h | 28 ++++++++++++++++------------ 3 files changed, 62 insertions(+), 39 deletions(-) diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c index 318e030de94..a4901801e29 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); @@ -748,13 +755,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, 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 - || key->nw_proto == IPPROTO_SCTP) { - 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; + } else if (key->nw_proto == IPPROTO_SCTP) { + flower.key.sctp_dst = key->tp_dst; + flower.mask.sctp_dst = mask->tp_dst; + flower.key.sctp_src = key->tp_src; + flower.mask.sctp_src = mask->tp_src; mask->tp_src = 0; mask->tp_dst = 0; } diff --git a/lib/tc.c b/lib/tc.c index 64ad81406b5..01961e691c5 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -309,37 +309,37 @@ 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]); } } else if (ip_proto == IPPROTO_SCTP) { if (attrs[TCA_FLOWER_KEY_SCTP_SRC_MASK]) { - key->src_port = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_SCTP_SRC]); - mask->src_port = + key->sctp_src = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_SCTP_SRC]); + mask->sctp_src = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_SCTP_SRC_MASK]); } if (attrs[TCA_FLOWER_KEY_SCTP_DST_MASK]) { - key->dst_port = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_SCTP_DST]); - mask->dst_port = + key->sctp_dst = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_SCTP_DST]); + mask->sctp_dst = nl_attr_get_be16(attrs[TCA_FLOWER_KEY_SCTP_DST_MASK]); } } @@ -1009,14 +1009,14 @@ 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); } else if (flower->key.ip_proto == IPPROTO_SCTP) { - FLOWER_PUT_MASKED_VALUE(src_port, TCA_FLOWER_KEY_SCTP_SRC); - FLOWER_PUT_MASKED_VALUE(dst_port, TCA_FLOWER_KEY_SCTP_DST); + FLOWER_PUT_MASKED_VALUE(sctp_src, TCA_FLOWER_KEY_SCTP_SRC); + FLOWER_PUT_MASKED_VALUE(sctp_dst, TCA_FLOWER_KEY_SCTP_DST); } } diff --git a/lib/tc.h b/lib/tc.h index 1cc7362d59a..5f363d0a97a 100644 --- a/lib/tc.h +++ b/lib/tc.h @@ -76,24 +76,28 @@ 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; + + ovs_be16 sctp_src; + ovs_be16 sctp_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 {