Skip to contentSkip to conversation

geneve: always fill CSUM6_RX configuration

PATCH In review Eric Garver 2 participants 5 messages May 18, 2017 – May 22, 2017

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 geneve: always fill CSUM6_RX configuration

CSMU6_RX is relevant for collect_metadata as well. As such leave it outside of the dev's IPv4/IPv6 checks.

Fixes 9b4437a5b870 ("geneve: Unify LWT and netdev handling.")
---
 drivers/net/geneve.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/geneve.c +4 -4
index dec5d563ab19..f557d1dc3f9b 100644
@@ -1311,13 +1311,13 @@ static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev)
 		if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_TX,
 			       !(info->key.tun_flags & TUNNEL_CSUM)))
 			goto nla_put_failure;
-
-		if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
-			       !geneve->use_udp6_rx_checksums))
-			goto nla_put_failure;
 #endif
 	}
 
+	if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
+		       !geneve->use_udp6_rx_checksums))
+		goto nla_put_failure;
+
 	if (nla_put_u8(skb, IFLA_GENEVE_TTL, info->key.ttl) ||
 	    nla_put_u8(skb, IFLA_GENEVE_TOS, info->key.tos) ||
 	    nla_put_be32(skb, IFLA_GENEVE_LABEL, info->key.label))
Signature · 1 line
2.12.0
#1 lore raw
Quoted 3 lines · Eric Garver

CSMU6_RX is relevant for collect_metadata as well. As such leave it outside of the dev's IPv4/IPv6 checks.

Can you explain it bit? is this flag used with ipv4 tunnels?

Quoted 31 lines
Fixes 9b4437a5b870 ("geneve: Unify LWT and netdev handling.")
---
 drivers/net/geneve.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/geneve.c +4 -5
index dec5d563ab19..f557d1dc3f9b 100644
@@ -1311,13 +1311,13 @@ static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev)
                if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_TX,
                               !(info->key.tun_flags & TUNNEL_CSUM)))
                        goto nla_put_failure;
-
-               if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
-                              !geneve->use_udp6_rx_checksums))
-                       goto nla_put_failure;
 #endif
        }
 
+       if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
+                      !geneve->use_udp6_rx_checksums))
+               goto nla_put_failure;
+
        if (nla_put_u8(skb, IFLA_GENEVE_TTL, info->key.ttl) ||
            nla_put_u8(skb, IFLA_GENEVE_TOS, info->key.tos) ||
            nla_put_be32(skb, IFLA_GENEVE_LABEL, info->key.label))
--

2.12.0

#2 lore raw
Quoted 5 lines · Pravin Shelar
Quoted 3 lines · Eric Garver

CSMU6_RX is relevant for collect_metadata as well. As such leave it outside of the dev's IPv4/IPv6 checks.

Can you explain it bit? is this flag used with ipv4 tunnels?

It's used with collect_metadata as both ipv4 and ipv6 sockets will be created.

openvswitch recently gained support for creating tunnels with rtnetlink. It sets COLLECT_METADATA and CSUM6_RX. After create, it does a get to verify the device got created with all the requested configuration. The verify was failing due to CSUM6_RX not being returned.

Since ip_tunnel_info_af() defaults to returning AF_INET, we fall into the IPv4 case and CSUM6_RX is never returned. Other relevant areas that call ip_tunnel_info_af() do so using the info from the skb, not the geneve_dev.

I hope that made it clear. Thanks for taking a look.

Eric.

Quoted 31 lines
Quoted 31 lines
Fixes 9b4437a5b870 ("geneve: Unify LWT and netdev handling.")
---
 drivers/net/geneve.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/geneve.c +4 -5
index dec5d563ab19..f557d1dc3f9b 100644
@@ -1311,13 +1311,13 @@ static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev)
                if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_TX,
                               !(info->key.tun_flags & TUNNEL_CSUM)))
                        goto nla_put_failure;
-
-               if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
-                              !geneve->use_udp6_rx_checksums))
-                       goto nla_put_failure;
 #endif
        }
 
+       if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
+                      !geneve->use_udp6_rx_checksums))
+               goto nla_put_failure;
+
        if (nla_put_u8(skb, IFLA_GENEVE_TTL, info->key.ttl) ||
            nla_put_u8(skb, IFLA_GENEVE_TOS, info->key.tos) ||
            nla_put_be32(skb, IFLA_GENEVE_LABEL, info->key.label))
--

2.12.0

#3 lore raw
Quoted 15 lines · Eric Garver
Quoted 5 lines · Pravin Shelar
Quoted 3 lines · Eric Garver

CSMU6_RX is relevant for collect_metadata as well. As such leave it outside of the dev's IPv4/IPv6 checks.

Can you explain it bit? is this flag used with ipv4 tunnels?

It's used with collect_metadata as both ipv4 and ipv6 sockets will be created.

openvswitch recently gained support for creating tunnels with rtnetlink. It sets COLLECT_METADATA and CSUM6_RX. After create, it does a get to verify the device got created with all the requested configuration. The verify was failing due to CSUM6_RX not being returned.

Quoted 5 lines

Since ip_tunnel_info_af() defaults to returning AF_INET, we fall into the IPv4 case and CSUM6_RX is never returned. Other relevant areas that call ip_tunnel_info_af() do so using the info from the skb, not the geneve_dev.

ok.
I think ip_tunnel_info_af() check is not right. it does not work in case of collect_metadata.
Better fix would be check for genene->sock4 and genene->sock6 and build the netlink skb accordingly.

#4 lore raw
Quoted 21 lines · Pravin Shelar
Quoted 15 lines · Eric Garver
Quoted 5 lines · Pravin Shelar
Quoted 3 lines · Eric Garver

CSMU6_RX is relevant for collect_metadata as well. As such leave it outside of the dev's IPv4/IPv6 checks.

Can you explain it bit? is this flag used with ipv4 tunnels?

It's used with collect_metadata as both ipv4 and ipv6 sockets will be created.

openvswitch recently gained support for creating tunnels with rtnetlink. It sets COLLECT_METADATA and CSUM6_RX. After create, it does a get to verify the device got created with all the requested configuration. The verify was failing due to CSUM6_RX not being returned.

Quoted 5 lines

Since ip_tunnel_info_af() defaults to returning AF_INET, we fall into the IPv4 case and CSUM6_RX is never returned. Other relevant areas that call ip_tunnel_info_af() do so using the info from the skb, not the geneve_dev.

Quoted 5 lines

ok.
I think ip_tunnel_info_af() check is not right. it does not work in case of collect_metadata.
Better fix would be check for genene->sock4 and genene->sock6 and build the netlink skb accordingly.

Agreed. That's a better idea.

Lets drop this patch. I'll work on one to look at the actual sockets instead.

Thanks Pravin.