Skip to content

Commit

Permalink
tc: Split IPs and transport layer ports unions in flower struct
Browse files Browse the repository at this point in the history
Split dst/src_port and ipv4/ipv6 union so we can
distingush them easily for later features.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
  • Loading branch information
Paul Blakey authored and blp committed Aug 3, 2017
1 parent bb17064 commit 2b1d9fa
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 39 deletions.
37 changes: 28 additions & 9 deletions lib/netdev-tc-offloads.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
36 changes: 18 additions & 18 deletions lib/tc.c
Expand Up @@ -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]);
}
}
Expand Down Expand Up @@ -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);
}
}

Expand Down
28 changes: 16 additions & 12 deletions lib/tc.h
Expand Up @@ -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 {
Expand Down

0 comments on commit 2b1d9fa

Please sign in to comment.