All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Hangbin Liu <liuhangbin@gmail.com>
Cc: netdev@vger.kernel.org, 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  <WillemdeBruijnwillemdebruijn.kernel@gmail.com>,
	Balazs Nemeth <bnemeth@redhat.com>,
	Mike Pattrick <mpattric@redhat.com>,
	Eric Dumazet <edumazet@google.com>
Subject: Re: [PATCHv2 net-next] net/af_packet: add VLAN support for AF_PACKET SOCK_RAW GSO
Date: Mon, 25 Apr 2022 09:52:55 -0400	[thread overview]
Message-ID: <20220425095235-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20220425014502.985464-1-liuhangbin@gmail.com>

On Mon, Apr 25, 2022 at 09:45:02AM +0800, Hangbin Liu wrote:
> Currently, 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.
> 
> Let's handle VLAN packets by adjusting network header position in
> packet_parse_headers(). The adjustment is safe and does not affect the
> later xmit as tap device also did that.
> 
> In packet_snd(), packet_parse_headers() need to be moved before calling
> virtio_net_hdr_set_proto(), so we can set correct skb->protocol and
> network header first.
> 
> There is no need to update tpacket_snd() as it calls packet_parse_headers()
> in tpacket_fill_skb(), which is already before calling virtio_net_hdr_*
> functions.
> 
> skb->no_fcs setting is also moved upper to make all skb settings together
> and keep consistency with function packet_sendmsg_spkt().
> 
> Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>

Acked-by: Michael S. Tsirkin <mst@redhat.com>

> ---
> 
> v2: Rewrite commit description, no code update.
> ---
>  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 243566129784..fd31334cf688 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


  parent reply	other threads:[~2022-04-25 13:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-25  1:45 [PATCHv2 net-next] net/af_packet: add VLAN support for AF_PACKET SOCK_RAW GSO Hangbin Liu
2022-04-25  6:21 ` Hangbin Liu
2022-04-25 13:49 ` Willem de Bruijn
2022-04-25 13:52 ` Michael S. Tsirkin [this message]
2022-04-26  9:30 ` patchwork-bot+netdevbpf

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=20220425095235-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=WillemdeBruijnwillemdebruijn.kernel@gmail.com \
    --cc=bnemeth@redhat.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=jasowang@redhat.com \
    --cc=kuba@kernel.org \
    --cc=liuhangbin@gmail.com \
    --cc=maximmi@mellanox.com \
    --cc=mpattric@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.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.