From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f177.google.com (mail-yw1-f177.google.com [209.85.128.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 327C8351C06 for ; Sat, 22 Aug 2026 19:21:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787426504; cv=none; b=fx8MgjvksP96HvXoTxB7uhLtEPaVkL/XkhlO/rWz3+aLhK6bId0jXV9oPrk2ZH++XEFqmVai/NQEaLbgpjYeQ+PXugPVjwMSI4A5pE48iyp6uf+30VbClqRQxoN7B/jMcxDax+BQ4aunBZDnnlC+q9bTl+egBkgMZRy+PqmFhhE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787426504; c=relaxed/simple; bh=EQ/CiktIOdrT3DfT1y+Xu8OAQ7mbOHX71ojJtPNIRSA=; h=Date:From:To:Cc:Message-ID:In-Reply-To:References:Subject: Mime-Version:Content-Type; b=pnwUfeNIDWztP/1rSD4y2deQuKKC8jITnqcHljXuVu1dNv2qe04Lh1rzqHFqQ63+SsFte/ltFCfxNTICal26Wfk6EharNFWAQQL1tF2KKTo4TgVA23BxS2I5flywvPMFJviP00wgyp2Ke6edlQ/+jd5pwWYikD6U+YGAoKb8Els= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jFbw3UO2; arc=none smtp.client-ip=209.85.128.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jFbw3UO2" Received: by mail-yw1-f177.google.com with SMTP id 00721157ae682-836cde02992so26682027b3.2 for ; Sat, 22 Aug 2026 12:21:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787426501; x=1788031301; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:subject :references:in-reply-to:message-id:cc:to:from:date:from:to:cc :subject:date:message-id:reply-to:content-type; bh=J3xhjkaPiGXWVStIU8MUoTIjnF0+Oc+0nyvWG6A2JMo=; b=jFbw3UO2Ca7RgFX5bRxsOMsxsUmBZcSy31QJ+8/8uBhKtfZ6Nt4J4LKW/nvc+MsrEv gt3NI6EdrhMSo0rZIXkBJPI6nm2XXM0Dc3mQghriiqMCqgXcp7KwdfFcFEtR8j0p0hvF tISPgDv8dv+FgbGyMywNmXKxoAeN27MvUDWm/EklbktJOQz8db1ApNG/f3O/p/Ay98Th 50atqOkwRl1gOLT/cKWRM6kk6p14nM3dwVZ7xQKpDN3q/8Gv1m4Q2VttdWUaid63/f4R l6/LlxlMhcjjTeUlaWwsPLccPOAP7LXRfb5x9WhxhwfCNUvb7+bDfoy5vjVgj9PqInVC Cwgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787426501; x=1788031301; h=content-transfer-encoding:content-type:mime-version:subject :references:in-reply-to:message-id:cc:to:from:date:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=J3xhjkaPiGXWVStIU8MUoTIjnF0+Oc+0nyvWG6A2JMo=; b=UxNZ+TddjhQb486cMYsbdyq4fRIjGJsmYrq3B5fq3SiYp6lweWW7bwSoZs+pCEJDoR AnxMASkLBUzDWyAJ9UjW/puGhHgkYeXbDUvfxTn05LC3q9suLYRoidZ1RX4wAiVWCyY7 2DwfxUBaIJOTQ2M9lkdSJo8ARwewxtTrRsaX4wLdoHYUK2pMVnixSmQF9YWTZAnXp39b eCLgCE999K2lwW6TSrdAvgYj+ufYkdfGS/ajqFNNGDjYS/zad2fM7+3J0gZDk+dxOssc m1aa1mJCo9NHpf/vqfPhPxWjLDqDk5YnZbFuW1am+O/MT72EdmfpLBdbg5VhQWfLyh8s g+XA== X-Forwarded-Encrypted: i=1; AHgh+Ro0gK3IGydvmndQUME4/Jw/8Eh1WVmiZJX/QuMIXDIyaJDT3j4OFg/BfJafD9DOh0x6EdCtIbxG1hIr4R8=@vger.kernel.org X-Gm-Message-State: AFuF++nWEGnVizMTXUBH8ePAwXyzTii/dnOExPKZsxyjaCs1qlHiKFjJ l5+0ZMMRF/gvZzT2iUYZncEXlnKhd72HQ5QAJs+RObYnUNctjCXyGkGx X-Gm-Gg: AR+sD11D1eLOunztGfS9hMXgoMHMqQL0oezN4ujNgu/WGNO1u8aKwRy5GJXVNahA57e syQaks8DY6vaTBMk/e9uputXkKASLvVpDWXo2iatssRBOYumg1rsBLV54LCaE4DyrqxBCSqHX+d QzlSPL0XSShfaqP5ckXKZ4MSq+BEE9HWI7Vd2Nkr65NGSctWkwNShGDrUZrNy/P979vDh3/5n5R hOINRYA/g18u6oExD4tjzvQIzjEqhY8EU+PACTLSUApC/qmIXdvxDWKZaDJTHXLKZ0j/7qLQA9d C8RpHzS5kbr2Jcd7hRA46WcUTp/7RPldAja5XMyiWjRCQwdgAB6Qwd4UpOvxM8V2gNLEa66Zdbf VGpXpuqdkpVkwsFMuV8hQgI8FCMN00iuaXsCVSI1mnWZgnVPSCiXeqYLV5P+vN/tkG036OcU7kv Z8O7rRfTZOiylhAOd+JZROdyNfJVEvZfq1QLhh8PlSizhXSwC2TV+S7uGzXXWHsZrMsc0e7cpAi aaXz2c+KrZZHLQ+p6qhqlq/BGHmQODSiCKzXT7L28M= X-Received: by 2002:a05:690c:e287:20b0:81e:45a6:bd53 with SMTP id 00721157ae682-849f2a37ec1mr45088907b3.8.1787426501039; Sat, 22 Aug 2026 12:21:41 -0700 (PDT) Received: from gmail.com (234.207.85.34.bc.googleusercontent.com. [34.85.207.234]) by smtp.gmail.com with ESMTPSA id 00721157ae682-84cab851290sm13290407b3.35.2026.08.22.12.21.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 22 Aug 2026 12:21:40 -0700 (PDT) Date: Sat, 22 Aug 2026 15:21:39 -0400 From: Willem de Bruijn To: Junnan Zhang , Willem de Bruijn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Simon Horman , "Michael S . Tsirkin" , Hangbin Liu , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, zhangjn_dev@163.com, Junnan Zhang , Shouxin Sun Message-ID: In-Reply-To: <20260821085722.24036-1-zhangjn_dev@163.com> References: <20260821085722.24036-1-zhangjn_dev@163.com> Subject: Re: [PATCH] net/packet: fix network header offset for non-VLAN raw packets on VLAN subinterfaces Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Junnan Zhang wrote: > From: Junnan Zhang > > AF_PACKET SOCK_RAW reserves dev->hard_header_len bytes of headroom. For > VLAN subinterfaces, hard_header_len includes VLAN tag space (18 bytes) Does it? vlan_dev_init: dev->hard_header_len = real_dev->hard_header_len; > while min_header_len is the real Ethernet header length (14 bytes). When Which device did you observe this with? > userspace sends a standard untagged Ethernet frame through a VLAN > subinterface, packet_parse_headers() only corrects network_header for > VLAN-tagged frames. For non-VLAN frames it leaves network_header at > hard_header_len, so the IP header is found 4 bytes too late and > inet_gso_segment() fails with -EINVAL. Which path did you observe generating these untagged packets through a VLAN interface? > > Set network_header to min_header_len for non-VLAN SOCK_RAW frames on > Ethernet devices whose hard_header_len exceeds min_header_len, so the > L3/L4 header positions match the actual on-the-wire frame. > > This fix is placed before skb_probe_transport_header() so that both the > transport header probe (which uses skb_network_offset() as nhoff) and > subsequent GSO see the right L3/L4 offsets. It complements > commit 01fdecc0480d ("net: packet: fix wrong transport_header when sending VLAN-tagged frame") > which only covers VLAN-tagged frames. > > Fixes: dfed913e8b55 ("net/af_packet: add VLAN support for AF_PACKET SOCK_RAW GSO") > Signed-off-by: Junnan Zhang > Signed-off-by: Shouxin Sun > Signed-off-by: Junnan Zhang > --- > net/packet/af_packet.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c > index 1168bd6b09cd..4669320f551b 100644 > --- a/net/packet/af_packet.c > +++ b/net/packet/af_packet.c > @@ -1935,6 +1935,7 @@ 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; > + bool has_vlan; nit: confusing variable, combining test on packet and device. > > /* On TX skb->data is the L2 header; anchor it for all socket types. */ > skb_reset_mac_header(skb); > @@ -1943,11 +1944,23 @@ static void packet_parse_headers(struct sk_buff *skb, struct socket *sock) > sock->type == SOCK_RAW) > skb->protocol = dev_parse_header_protocol(skb); > > + has_vlan = likely(skb->dev->type == ARPHRD_ETHER) && > + eth_type_vlan(skb->protocol); > + > + /* For non-VLAN raw frames on devices whose hard_header_len includes > + * VLAN tag space (e.g. VLAN subinterfaces), the network header must be > + * at the actual L2/L3 boundary, not hard_header_len, so that both the > + * transport header probe below and subsequent GSO see the right L3. > + */ > + if (!has_vlan && sock->type == SOCK_RAW && > + likely(skb->dev->type == ARPHRD_ETHER) && nit: repeat test, also included in that has_vlan > + skb->dev->min_header_len < skb->dev->hard_header_len) > + skb_set_network_header(skb, skb->dev->min_header_len); > + > skb_probe_transport_header(skb); > > /* Move network header to the right position for VLAN tagged packets */ > - if (likely(skb->dev->type == ARPHRD_ETHER) && > - eth_type_vlan(skb->protocol) && > + if (has_vlan && > vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0) > skb_set_network_header(skb, depth); > } > -- > 2.43.0 >