Re: [PATCH net-next v2] ip_tunnel: allow to inherit from VLAN encapsulated IP frames

From: Matthias May
Date: Thu Jul 07 2022 - 03:44:53 EST


On 7/6/22 19:24, Eyal Birger wrote:

Hi,

On Wed, Jul 6, 2022 at 7:54 PM Matthias May <matthias.may@xxxxxxxxxxxx <mailto:matthias.may@xxxxxxxxxxxx>> wrote:

The current code allows to inherit the TOS, TTL, DF from the payload
when skb->protocol is ETH_P_IP or ETH_P_IPV6.
However when the payload is VLAN encapsulated (e.g because the tunnel
is of type GRETAP), then this inheriting does not work, because the
visible skb->protocol is of type ETH_P_8021Q.

Add a check on ETH_P_8021Q and subsequently check the payload protocol.

Signed-off-by: Matthias May <matthias.may@xxxxxxxxxxxx <mailto:matthias.may@xxxxxxxxxxxx>>
---
v1 -> v2:
 - Add support for ETH_P_8021AD as suggested by Jakub Kicinski.
---
 net/ipv4/ip_tunnel.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index 94017a8c3994..bdcc0f1e83c8 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -648,6 +648,13 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
        u8 tos, ttl;
        __be32 dst;
        __be16 df;
+       __be16 *payload_protocol;
+
+       if (skb->protocol == htons(ETH_P_8021Q) ||
+           skb->protocol == htons(ETH_P_8021AD))
+               payload_protocol = (__be16 *)(skb->head + skb->network_header - 2);
+       else
+               payload_protocol = &skb->protocol;


Maybe it's better to use skb_protocol(skb, true) here instead of open
coding the vlan parsing?

Eyal

Hi Eyal
I've looked into using skb_protocol(skb, true).
If skip_vlan is set to true, wouldn't it make sense to use vlan_get_protocol(skb) directly?

BR
Matthias

Attachment: OpenPGP_0xDF76B604533C0DBE.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature
Description: OpenPGP digital signature