From 1dc1a8c9374f1b0c7f89090330bda65caa782549 Mon Sep 17 00:00:00 2001 From: Or Gerlitz Date: Tue, 31 Jul 2018 13:40:36 +0300 Subject: [PATCH] lib/tc: Handle ttl for ipv6 too TTL can and should be used to match on IPv6's hop-limit, fix that. Fixes: ab7ecf266b0a ('netdev-tc-offloads: Add nw_ttl matching using flower') Fixes: 0b4b5203d12e ('tc: Add ip layer ttl matching') Signed-off-by: Or Gerlitz Reviewed-by: Roi Dayan Signed-off-by: Simon Horman --- lib/netdev-tc-offloads.c | 4 ++-- lib/tc.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c index bdf288c0622..5df8d34d347 100644 --- a/lib/netdev-tc-offloads.c +++ b/lib/netdev-tc-offloads.c @@ -987,8 +987,10 @@ 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; + mask->nw_proto = 0; flower.key.ip_ttl = key->nw_ttl; flower.mask.ip_ttl = mask->nw_ttl; + mask->nw_ttl = 0; if (mask->nw_frag & FLOW_NW_FRAG_ANY) { flower.mask.flags |= TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT; @@ -1035,8 +1037,6 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, } mask->nw_tos = 0; - mask->nw_proto = 0; - mask->nw_ttl = 0; if (key->dl_type == htons(ETH_P_IP)) { flower.key.ipv4.ipv4_src = key->nw_src; diff --git a/lib/tc.c b/lib/tc.c index 7a71036161c..1b7a43f085e 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -1589,6 +1589,8 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) FLOWER_PUT_MASKED_VALUE(src_mac, TCA_FLOWER_KEY_ETH_SRC); if (host_eth_type == ETH_P_IP || host_eth_type == ETH_P_IPV6) { + FLOWER_PUT_MASKED_VALUE(ip_ttl, TCA_FLOWER_KEY_IP_TTL); + if (flower->mask.ip_proto && flower->key.ip_proto) { nl_msg_put_u8(request, TCA_FLOWER_KEY_IP_PROTO, flower->key.ip_proto); @@ -1617,7 +1619,6 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) if (host_eth_type == ETH_P_IP) { FLOWER_PUT_MASKED_VALUE(ipv4.ipv4_src, TCA_FLOWER_KEY_IPV4_SRC); FLOWER_PUT_MASKED_VALUE(ipv4.ipv4_dst, TCA_FLOWER_KEY_IPV4_DST); - FLOWER_PUT_MASKED_VALUE(ip_ttl, TCA_FLOWER_KEY_IP_TTL); } else if (host_eth_type == ETH_P_IPV6) { FLOWER_PUT_MASKED_VALUE(ipv6.ipv6_src, TCA_FLOWER_KEY_IPV6_SRC); FLOWER_PUT_MASKED_VALUE(ipv6.ipv6_dst, TCA_FLOWER_KEY_IPV6_DST);