All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hangbin Liu <liuhangbin@gmail.com>
To: netdev@vger.kernel.org
Cc: "Michael S . Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	"David S . Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Maxim Mikityanskiy <maximmi@mellanox.com>,
	Willem de Bruijn <willemb@google.com>,
	virtualization@lists.linux-foundation.org,
	Balazs Nemeth <bnemeth@redhat.com>,
	Mike Pattrick <mailmpattric@redhat.com>,
	Eric Dumazet <edumazet@google.com>,
	Hangbin Liu <liuhangbin@gmail.com>,
	Flavio Leitner <fbl@redhat.com>
Subject: [PATCH net 1/2] net/af_packet: adjust network header position for VLAN tagged packets
Date: Mon, 18 Apr 2022 12:43:38 +0800	[thread overview]
Message-ID: <20220418044339.127545-2-liuhangbin@gmail.com> (raw)
In-Reply-To: <20220418044339.127545-1-liuhangbin@gmail.com>

Flavio reported that the kernel drops GSO VLAN tagged packet if it's
created with socket(AF_PACKET, SOCK_RAW, 0) plus virtio_net_hdr.

The reason is AF_PACKET doesn't adjust the skb network header if there is
a VLAN tag. Then after virtio_net_hdr_set_proto() called, the skb->protocol
will be set to ETH_P_IP/IPv6. And in later inet/ipv6_gso_segment() the skb
is dropped as network header position is invalid.

Fix it by adjusting network header position in packet_parse_headers()
and move the function before calling virtio_net_hdr_* functions.

I also moved skb->no_fcs setting upper to make all skb setting together
and keep consistence of function packet_sendmsg_spkt().

No need to update tpacket_snd() as it calls packet_parse_headers() in
tpacket_fill_skb() before calling virtio_net_hdr_* functions.

Fixes: 75c65772c3d1 ("net/packet: Ask driver for protocol if not provided by user")
Reported-by: Flavio Leitner <fbl@redhat.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
---
 net/packet/af_packet.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 002d2b9c69dd..cfdbda28ef82 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1924,12 +1924,20 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
 
 static void packet_parse_headers(struct sk_buff *skb, struct socket *sock)
 {
+	int depth;
+
 	if ((!skb->protocol || skb->protocol == htons(ETH_P_ALL)) &&
 	    sock->type == SOCK_RAW) {
 		skb_reset_mac_header(skb);
 		skb->protocol = dev_parse_header_protocol(skb);
 	}
 
+	/* Move network header to the right position for VLAN tagged packets */
+	if (likely(skb->dev->type == ARPHRD_ETHER) &&
+	    eth_type_vlan(skb->protocol) &&
+	    __vlan_get_protocol(skb, skb->protocol, &depth) != 0)
+		skb_set_network_header(skb, depth);
+
 	skb_probe_transport_header(skb);
 }
 
@@ -3047,6 +3055,11 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 	skb->mark = sockc.mark;
 	skb->tstamp = sockc.transmit_time;
 
+	if (unlikely(extra_len == 4))
+		skb->no_fcs = 1;
+
+	packet_parse_headers(skb, sock);
+
 	if (has_vnet_hdr) {
 		err = virtio_net_hdr_to_skb(skb, &vnet_hdr, vio_le());
 		if (err)
@@ -3055,11 +3068,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 		virtio_net_hdr_set_proto(skb, &vnet_hdr);
 	}
 
-	packet_parse_headers(skb, sock);
-
-	if (unlikely(extra_len == 4))
-		skb->no_fcs = 1;
-
 	err = po->xmit(skb);
 	if (unlikely(err != 0)) {
 		if (err > 0)
-- 
2.35.1


  reply	other threads:[~2022-04-18  4:44 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-18  4:43 [PATCH net 0/2] net: fix kernel dropping GSO tagged packets Hangbin Liu
2022-04-18  4:43 ` Hangbin Liu [this message]
2022-04-18 15:38   ` [PATCH net 1/2] net/af_packet: adjust network header position for VLAN " Willem de Bruijn
2022-04-18 15:38     ` Willem de Bruijn
2022-04-19  3:02     ` Hangbin Liu
2022-04-19 13:56       ` Willem de Bruijn
2022-04-19 13:56         ` Willem de Bruijn
2022-04-19 14:26         ` Michael S. Tsirkin
2022-04-19 14:26           ` Michael S. Tsirkin
2022-04-20  0:59           ` Hangbin Liu
2022-04-20  2:47             ` Jason Wang
2022-04-20  2:47               ` Jason Wang
2022-04-18  4:43 ` [PATCH net 2/2] virtio_net: check L3 protocol for VLAN packets Hangbin Liu
2022-04-18 15:40   ` Willem de Bruijn
2022-04-18 15:40     ` Willem de Bruijn
2022-04-19  3:14     ` Hangbin Liu
2022-04-19 13:52       ` Willem de Bruijn
2022-04-19 13:52         ` Willem de Bruijn
2022-04-20  1:11         ` Hangbin Liu
2022-04-20 13:12           ` Willem de Bruijn
2022-04-20 13:12             ` Willem de Bruijn
2022-04-18  5:48 ` [PATCH net 0/2] net: fix kernel dropping GSO tagged packets Hangbin Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220418044339.127545-2-liuhangbin@gmail.com \
    --to=liuhangbin@gmail.com \
    --cc=bnemeth@redhat.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=fbl@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=kuba@kernel.org \
    --cc=mailmpattric@redhat.com \
    --cc=maximmi@mellanox.com \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=willemb@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.