Skip to content

Commit 9379213

Browse files
committed
Merge branch 'geneve-fixes'
Tariq Toukan says: ==================== geneve fixes This small patchset by Gal provides bug fixes to the geneve tunnels flows. Patch 1 fixes an incorrect value returned by the inner network header offset helper. Patch 2 fixes an issue inside the mlx5e tunneling flow. It 'happened' to be harmless so far, before applying patch 1. Series generated against: commit d30d0e4 ("Merge tag 'net-6.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net") ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents d029ede + 791b408 commit 9379213

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -4875,7 +4875,7 @@ static netdev_features_t mlx5e_tunnel_features_check(struct mlx5e_priv *priv,
48754875

48764876
/* Verify if UDP port is being offloaded by HW */
48774877
if (mlx5_vxlan_lookup_port(priv->mdev->vxlan, port))
4878-
return features;
4878+
return vxlan_features_check(skb, features);
48794879

48804880
#if IS_ENABLED(CONFIG_GENEVE)
48814881
/* Support Geneve offload for default UDP port */
@@ -4901,7 +4901,6 @@ netdev_features_t mlx5e_features_check(struct sk_buff *skb,
49014901
struct mlx5e_priv *priv = netdev_priv(netdev);
49024902

49034903
features = vlan_features_check(skb, features);
4904-
features = vxlan_features_check(skb, features);
49054904

49064905
/* Validate if the tunneled packet is being offloaded by HW */
49074906
if (skb->encapsulation &&

drivers/net/geneve.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
815815
struct geneve_dev *geneve,
816816
const struct ip_tunnel_info *info)
817817
{
818+
bool inner_proto_inherit = geneve->cfg.inner_proto_inherit;
818819
bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
819820
struct geneve_sock *gs4 = rcu_dereference(geneve->sock4);
820821
const struct ip_tunnel_key *key = &info->key;
@@ -826,7 +827,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
826827
__be16 sport;
827828
int err;
828829

829-
if (!skb_vlan_inet_prepare(skb))
830+
if (!skb_vlan_inet_prepare(skb, inner_proto_inherit))
830831
return -EINVAL;
831832

832833
if (!gs4)
@@ -908,7 +909,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
908909
}
909910

910911
err = geneve_build_skb(&rt->dst, skb, info, xnet, sizeof(struct iphdr),
911-
geneve->cfg.inner_proto_inherit);
912+
inner_proto_inherit);
912913
if (unlikely(err))
913914
return err;
914915

@@ -925,6 +926,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
925926
struct geneve_dev *geneve,
926927
const struct ip_tunnel_info *info)
927928
{
929+
bool inner_proto_inherit = geneve->cfg.inner_proto_inherit;
928930
bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
929931
struct geneve_sock *gs6 = rcu_dereference(geneve->sock6);
930932
const struct ip_tunnel_key *key = &info->key;
@@ -935,7 +937,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
935937
__be16 sport;
936938
int err;
937939

938-
if (!skb_vlan_inet_prepare(skb))
940+
if (!skb_vlan_inet_prepare(skb, inner_proto_inherit))
939941
return -EINVAL;
940942

941943
if (!gs6)
@@ -997,7 +999,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
997999
ttl = ttl ? : ip6_dst_hoplimit(dst);
9981000
}
9991001
err = geneve_build_skb(dst, skb, info, xnet, sizeof(struct ipv6hdr),
1000-
geneve->cfg.inner_proto_inherit);
1002+
inner_proto_inherit);
10011003
if (unlikely(err))
10021004
return err;
10031005

include/net/ip_tunnels.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,10 @@ static inline bool pskb_inet_may_pull(struct sk_buff *skb)
461461

462462
/* Variant of pskb_inet_may_pull().
463463
*/
464-
static inline bool skb_vlan_inet_prepare(struct sk_buff *skb)
464+
static inline bool skb_vlan_inet_prepare(struct sk_buff *skb,
465+
bool inner_proto_inherit)
465466
{
466-
int nhlen = 0, maclen = ETH_HLEN;
467+
int nhlen = 0, maclen = inner_proto_inherit ? 0 : ETH_HLEN;
467468
__be16 type = skb->protocol;
468469

469470
/* Essentially this is skb_protocol(skb, true)

0 commit comments

Comments
 (0)