diff options
author | Hangbin Liu <liuhangbin@gmail.com> | 2017-11-14 20:43:09 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-11-15 05:47:11 -0500 |
commit | fd7eafd02121d6ef501ef1a4a891e6061366c952 (patch) | |
tree | ac2067caaf6b41aaee8005c6bd04e3f8e56b37f2 | |
parent | 89ad2fa3f043a1e8daae193bcb5fe34d5f8caf28 (diff) |
geneve: fix fill_info when link down
geneve->sock4/6 were added with geneve_open and released with geneve_stop.
So when geneve link down, we will not able to show remote address and
checksum info after commit 11387fe4a98 ("geneve: fix fill_info when using
collect_metadata").
Fix this by avoid passing *_REMOTE{,6} for COLLECT_METADATA since they are
mutually exclusive, and always show UDP_ZERO_CSUM6_RX info.
Fixes: 11387fe4a98 ("geneve: fix fill_info when using collect_metadata")
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/geneve.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 688906aad19c..4e16d839c311 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -1490,6 +1490,7 @@ static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
1490 | { | 1490 | { |
1491 | struct geneve_dev *geneve = netdev_priv(dev); | 1491 | struct geneve_dev *geneve = netdev_priv(dev); |
1492 | struct ip_tunnel_info *info = &geneve->info; | 1492 | struct ip_tunnel_info *info = &geneve->info; |
1493 | bool metadata = geneve->collect_md; | ||
1493 | __u8 tmp_vni[3]; | 1494 | __u8 tmp_vni[3]; |
1494 | __u32 vni; | 1495 | __u32 vni; |
1495 | 1496 | ||
@@ -1498,32 +1499,24 @@ static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
1498 | if (nla_put_u32(skb, IFLA_GENEVE_ID, vni)) | 1499 | if (nla_put_u32(skb, IFLA_GENEVE_ID, vni)) |
1499 | goto nla_put_failure; | 1500 | goto nla_put_failure; |
1500 | 1501 | ||
1501 | if (rtnl_dereference(geneve->sock4)) { | 1502 | if (!metadata && ip_tunnel_info_af(info) == AF_INET) { |
1502 | if (nla_put_in_addr(skb, IFLA_GENEVE_REMOTE, | 1503 | if (nla_put_in_addr(skb, IFLA_GENEVE_REMOTE, |
1503 | info->key.u.ipv4.dst)) | 1504 | info->key.u.ipv4.dst)) |
1504 | goto nla_put_failure; | 1505 | goto nla_put_failure; |
1505 | |||
1506 | if (nla_put_u8(skb, IFLA_GENEVE_UDP_CSUM, | 1506 | if (nla_put_u8(skb, IFLA_GENEVE_UDP_CSUM, |
1507 | !!(info->key.tun_flags & TUNNEL_CSUM))) | 1507 | !!(info->key.tun_flags & TUNNEL_CSUM))) |
1508 | goto nla_put_failure; | 1508 | goto nla_put_failure; |
1509 | 1509 | ||
1510 | } | ||
1511 | |||
1512 | #if IS_ENABLED(CONFIG_IPV6) | 1510 | #if IS_ENABLED(CONFIG_IPV6) |
1513 | if (rtnl_dereference(geneve->sock6)) { | 1511 | } else if (!metadata) { |
1514 | if (nla_put_in6_addr(skb, IFLA_GENEVE_REMOTE6, | 1512 | if (nla_put_in6_addr(skb, IFLA_GENEVE_REMOTE6, |
1515 | &info->key.u.ipv6.dst)) | 1513 | &info->key.u.ipv6.dst)) |
1516 | goto nla_put_failure; | 1514 | goto nla_put_failure; |
1517 | |||
1518 | if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_TX, | 1515 | if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_TX, |
1519 | !(info->key.tun_flags & TUNNEL_CSUM))) | 1516 | !(info->key.tun_flags & TUNNEL_CSUM))) |
1520 | goto nla_put_failure; | 1517 | goto nla_put_failure; |
1521 | |||
1522 | if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, | ||
1523 | !geneve->use_udp6_rx_checksums)) | ||
1524 | goto nla_put_failure; | ||
1525 | } | ||
1526 | #endif | 1518 | #endif |
1519 | } | ||
1527 | 1520 | ||
1528 | if (nla_put_u8(skb, IFLA_GENEVE_TTL, info->key.ttl) || | 1521 | if (nla_put_u8(skb, IFLA_GENEVE_TTL, info->key.ttl) || |
1529 | nla_put_u8(skb, IFLA_GENEVE_TOS, info->key.tos) || | 1522 | nla_put_u8(skb, IFLA_GENEVE_TOS, info->key.tos) || |
@@ -1533,10 +1526,13 @@ static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
1533 | if (nla_put_be16(skb, IFLA_GENEVE_PORT, info->key.tp_dst)) | 1526 | if (nla_put_be16(skb, IFLA_GENEVE_PORT, info->key.tp_dst)) |
1534 | goto nla_put_failure; | 1527 | goto nla_put_failure; |
1535 | 1528 | ||
1536 | if (geneve->collect_md) { | 1529 | if (metadata && nla_put_flag(skb, IFLA_GENEVE_COLLECT_METADATA)) |
1537 | if (nla_put_flag(skb, IFLA_GENEVE_COLLECT_METADATA)) | ||
1538 | goto nla_put_failure; | 1530 | goto nla_put_failure; |
1539 | } | 1531 | |
1532 | if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, | ||
1533 | !geneve->use_udp6_rx_checksums)) | ||
1534 | goto nla_put_failure; | ||
1535 | |||
1540 | return 0; | 1536 | return 0; |
1541 | 1537 | ||
1542 | nla_put_failure: | 1538 | nla_put_failure: |