From patchwork Wed Jan 3 14:40:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Gobert X-Patchwork-Id: 184771 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp5059117dyb; Wed, 3 Jan 2024 06:41:34 -0800 (PST) X-Google-Smtp-Source: AGHT+IEYwDW+wumuJOLK6XWT4f1g344qivsWD3cexMXqkIB37JkoGGqgxwPhYF05o3mRJ+6TUFSU X-Received: by 2002:a2e:bea0:0:b0:2cc:53da:6633 with SMTP id a32-20020a2ebea0000000b002cc53da6633mr11281236ljr.83.1704292893937; Wed, 03 Jan 2024 06:41:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704292893; cv=none; d=google.com; s=arc-20160816; b=eDl5f3W+r98+b11+Pe6vTC2RFt79L9rjWDfAWTuiYN4/lbNQjaqH4nvBArqsTHdrbC ZNfrdVOUUfK0JaqCbWxPbnD0/u0QuZYanAjaLBsBlV2RlE1TfdxLlmSGy6L+rJ8wV07z eEqcmrPhQa7vBqtBJMJv287RIyjHp4bdPckVYbf1H1oVqFULRJUPTlKzKhSKdruixVOD wUl7yl7LUJW95ppS4na6PZxcar1I3YqtMVJWr6fHwiRAzmBh2/8kp6fJFLarX+2nABpE nrzO9GUfmQ3mW2iujYmcmr668nILTZWY4i08474Wh/HGvPJQmdjbBi5s2yt/deuNhxeT K2dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :date:message-id:dkim-signature; bh=rhUIcAiEUXzPSJT3qxxOxQiU0WD1wXx0pKqJFtc5p9E=; fh=Y340ezozF7Wvm1cTQGi0slwbR/3t9Devzu6PpLAqLHM=; b=tXLHqOEVKnQO5Flw/h5vitVUn+1kNTgGt75ajYjYuLiHmWM1g+NsJJXU+kteo7vHZP gRSd6QfB/lfLVkCR/QKZIuZkSOQy4F5+jUgpQN9njTz0IVm7jN3rWuyqR3ur7tder/jq lC93HeirFlqPwiga4yhBqmpflSOB/LpE89SvO18jOIHXN/0XolznwiBGOgtpKzZ2k+8R ZeOuZkDw+lzbFJREC39tiXZIffAJHLvt4WElvY78qXB6mPNBrzY8r8t+jOprqNN1MPcq SBCTRjtnHGdmmUYJflGJ1ms2FFxPC8DiG4+p2hrHgcTUnUYbYEJO3gYharYT73f5yFlV Qbtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="iq/cWEnI"; spf=pass (google.com: domain of linux-kernel+bounces-15661-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15661-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id n22-20020a509356000000b00553bc1bfbb9si11819082eda.381.2024.01.03.06.41.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jan 2024 06:41:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-15661-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="iq/cWEnI"; spf=pass (google.com: domain of linux-kernel+bounces-15661-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15661-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 87E8A1F238DE for ; Wed, 3 Jan 2024 14:41:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 564C01A723; Wed, 3 Jan 2024 14:41:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iq/cWEnI" X-Original-To: linux-kernel@vger.kernel.org Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (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 4E8A51A703; Wed, 3 Jan 2024 14:41:10 +0000 (UTC) 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 Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-3368ac0f74dso8767499f8f.0; Wed, 03 Jan 2024 06:41:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1704292868; x=1704897668; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=rhUIcAiEUXzPSJT3qxxOxQiU0WD1wXx0pKqJFtc5p9E=; b=iq/cWEnI015RUcHibu3ssU7cgQ+eEBvDE8xaQYGNAfV44rJf0ftE6jT9zDxarH0X3s wJ0YFIVNdHHZehezVM8Sf/LmuqoBOQ+EOtlgptAgF7NcHsJPXsEdtsisjEMp+GEdy0n2 TNC4n2p8jj0FF4XAGn795RKhBeu85Dbj0YDWJ5vf9aRc3W621+rTb65pWu7JelTSnhEq R3x2SHWmvOHsEkrqJ77aECP7sFwUJVmTYJeZFTcvT5yOrFrWMyqRUAleRADu9mmkbFTr SLjVaInheifXygmZEVFuClnsyDR1VilcphRmyGdWnjuZtP+V1abA2PhacEXO4ypmErjh A+Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704292868; x=1704897668; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=rhUIcAiEUXzPSJT3qxxOxQiU0WD1wXx0pKqJFtc5p9E=; b=MWMiZwDrl2vE/0ZsWeNYQDCEZXM447+dL+IHCXb4n9B+4/JffYWLa1JmzivlHa8Opg 3LAXDu7umrevaItZFoQXK72zi8oDpFfSd5rjw21IE1AY5bLD7YPl6dF8e3UFQwwQJYBM 7CjOu8j5I8wnuUyBV7BznfsRHgr118wcX7fJ3yJfqLmS0xbWEObvwwZ6gIQXg2B5UrP2 EVH8a91PWzW9QojQILBwn63jB/mq2vr1lsgjrznKvmvcyLZ4at6re7yt8cqRRBUT3E/P AMrLYbD0VVAOjSfUE4BuQ/F8d6rkB9YPkZ+danXQqOmEWLzhA+sB6/rxOsVCBPIQ+sfv yqag== X-Gm-Message-State: AOJu0YxFyNJBD+lEL6QBRz4vfPhA4lN6Sx9F9j50sLSGM9OJmFCMfsF6 TigTYG3q0gaXpGRbjQKEBJQ= X-Received: by 2002:a05:600c:470b:b0:40d:7246:da51 with SMTP id v11-20020a05600c470b00b0040d7246da51mr5301807wmo.93.1704292868372; Wed, 03 Jan 2024 06:41:08 -0800 (PST) Received: from debian ([146.70.204.204]) by smtp.gmail.com with ESMTPSA id c1-20020a05600c0a4100b0040d81c3343bsm2509483wmq.42.2024.01.03.06.41.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 03 Jan 2024 06:41:08 -0800 (PST) Message-ID: Date: Wed, 3 Jan 2024 15:40:44 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: [PATCH net-next v3 1/3] net: gso: add HBH extension header offload support From: Richard Gobert To: davem@davemloft.net, dsahern@kernel.org, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, shuah@kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org References: In-Reply-To: X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1787080625397220648 X-GMAIL-MSGID: 1787080625397220648 This commit adds net_offload to IPv6 Hop-by-Hop extension headers (as it is done for routing and dstopts) since it is supported in GSO and GRO. This allows to remove specific HBH conditionals in GSO and GRO when pulling and parsing an incoming packet. Signed-off-by: Richard Gobert Reviewed-by: Willem de Bruijn Reviewed-by: David Ahern Reviewed-by: Eric Dumazet --- net/ipv6/exthdrs_offload.c | 11 +++++++++++ net/ipv6/ip6_offload.c | 25 +++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/net/ipv6/exthdrs_offload.c b/net/ipv6/exthdrs_offload.c index 06750d65d480..4c00398f4dca 100644 --- a/net/ipv6/exthdrs_offload.c +++ b/net/ipv6/exthdrs_offload.c @@ -16,6 +16,10 @@ static const struct net_offload dstopt_offload = { .flags = INET6_PROTO_GSO_EXTHDR, }; +static const struct net_offload hbh_offload = { + .flags = INET6_PROTO_GSO_EXTHDR, +}; + int __init ipv6_exthdrs_offload_init(void) { int ret; @@ -28,9 +32,16 @@ int __init ipv6_exthdrs_offload_init(void) if (ret) goto out_rt; + ret = inet6_add_offload(&hbh_offload, IPPROTO_HOPOPTS); + if (ret) + goto out_dstopts; + out: return ret; +out_dstopts: + inet6_del_offload(&dstopt_offload, IPPROTO_DSTOPTS); + out_rt: inet6_del_offload(&rthdr_offload, IPPROTO_ROUTING); goto out; diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index d6314287338d..0e0b5fed0995 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c @@ -45,15 +45,13 @@ static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto) struct ipv6_opt_hdr *opth; int len; - if (proto != NEXTHDR_HOP) { - ops = rcu_dereference(inet6_offloads[proto]); + ops = rcu_dereference(inet6_offloads[proto]); - if (unlikely(!ops)) - break; + if (unlikely(!ops)) + break; - if (!(ops->flags & INET6_PROTO_GSO_EXTHDR)) - break; - } + if (!(ops->flags & INET6_PROTO_GSO_EXTHDR)) + break; if (unlikely(!pskb_may_pull(skb, 8))) break; @@ -171,13 +169,12 @@ static int ipv6_exthdrs_len(struct ipv6hdr *iph, proto = iph->nexthdr; for (;;) { - if (proto != NEXTHDR_HOP) { - *opps = rcu_dereference(inet6_offloads[proto]); - if (unlikely(!(*opps))) - break; - if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR)) - break; - } + *opps = rcu_dereference(inet6_offloads[proto]); + if (unlikely(!(*opps))) + break; + if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR)) + break; + opth = (void *)opth + optlen; optlen = ipv6_optlen(opth); len += optlen; From patchwork Wed Jan 3 14:44:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Gobert X-Patchwork-Id: 184772 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp5060925dyb; Wed, 3 Jan 2024 06:45:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IGhBNx0iaXCxVXfxQhxCeAO95nwQr4q9qo3guMu8sEbYfLLnOheAEXxbYTujQstBxnYeEaa X-Received: by 2002:a05:6a20:549a:b0:198:e62f:6345 with SMTP id i26-20020a056a20549a00b00198e62f6345mr329959pzk.18.1704293115477; Wed, 03 Jan 2024 06:45:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704293115; cv=none; d=google.com; s=arc-20160816; b=ur7OWuRNjyR5M7uUUSVNwz0FldgDLJ2EEiO5g79rmWs8f0De//KUEu5pf/xV8JjVc5 Vb7RRqgudxuvSWM/6bZkHdcAuQR6jeJI6JRGLKs44UoGi2WhrPD7jz4WPEz1PuKvS6pp R76BdkqiHbtBe6fvShgBK0dN/nggSgkbzXgcusvvB/7REPpWcd4n3kGQovj7XeQQI7Hb Szcs/SnElctR7xgAwXTQ0GBwSYEAFJyCWK5Xt7G6+i609H52PhpzYXltIvExkiJbxhhi 7egZNz68FlSgqed20d8DmlKFeS84Gm9RlMVbzJR3aJyMFBe1r60sJ+/LyX6RXXsggJHP 0M+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :date:message-id:dkim-signature; bh=DF5Tpjc7/qBP5rRrTOGZj1iy9dxk0+S2n9vSpuIQY2Y=; fh=Y340ezozF7Wvm1cTQGi0slwbR/3t9Devzu6PpLAqLHM=; b=KI+wL6ebWNT9ddw7eNnsUX3zL/xi7/IEUWF33B7AbCOmIKT7tSNFirCQT25is/hABe h6GmE+26gdn4vo/RjW4lAycB+Lp7aVBleqw5mHObUFKAj6qb3BaYH4SBCXxkO8JdR24r xGrv57koUUYLtwkMcsKNqpM7pwajIyog5Z/hWUGEtCJrQjkkUDybdLsvPbZgAi/7suE3 XZjlqUdmNJ4Ae9nwTqBfa/xLH7Zg4jM5yBtorTevZvsKzWqNCI0/VcYVPeFGQIIBVicv R52QjISukFpdSPY/VEOP4x8HFrnB161N0QGncnHb/0xvPlxvlQmpGgVVKw5mkYDr7b1d cQxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=HnlM7mNW; spf=pass (google.com: domain of linux-kernel+bounces-15663-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15663-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id ce5-20020a17090aff0500b0028bbcbe5414si1350277pjb.45.2024.01.03.06.45.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jan 2024 06:45:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-15663-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=HnlM7mNW; spf=pass (google.com: domain of linux-kernel+bounces-15663-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15663-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 38BBC283E77 for ; Wed, 3 Jan 2024 14:45:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B9A7B1B26F; Wed, 3 Jan 2024 14:44:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HnlM7mNW" X-Original-To: linux-kernel@vger.kernel.org Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (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 96FDA1A708; Wed, 3 Jan 2024 14:44:48 +0000 (UTC) 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 Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-40d858c56cbso35339575e9.2; Wed, 03 Jan 2024 06:44:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1704293087; x=1704897887; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=DF5Tpjc7/qBP5rRrTOGZj1iy9dxk0+S2n9vSpuIQY2Y=; b=HnlM7mNW/jjZpunoLkbYJrH10sHqvSYaTc+JkrTAN+ARBJOofxtGsCGC82Oxxvhx2H o6ByQTutHY8wVBAu169CM0AqazWmsB//2HhUvEE/5hWPFOW4gnUxjaxa74aJk+gmsA2C s/DEW9ZYubFP/xGtZCHpUjFT3x35/fAh7v0dgn+lKVe0i/gfGY8e1UjFXlxc5j1zm3Bf JaMxkGCKItmanWsRSmi0pnkiM2s96UHXxyDY9fYoFE8qz1mgYC9mTFJWdWx4XKn4zcsY mWF7jB7tnANvLbS9dTYzYVHr1Dt14I51JDQi3CHxNWad1dbUW0sKNDHE3ZUDRHFO/1Nj Z+PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704293087; x=1704897887; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=DF5Tpjc7/qBP5rRrTOGZj1iy9dxk0+S2n9vSpuIQY2Y=; b=RVLF3D6fx/0pV+zXTbsFjqt8qShRZ2daNojD/Qw3jYExRkoICB8h8k3h30hMFseB4F 1R9CZwIEcj3NU73n6gTRy4z8mC/IoLC9rbAqtXyCiOmGlVbvf7S09wjhJN9C4bR2se3y 4Z4YG8RhwJtPwafygIkZ1rvgRPq3F+59DWiK4ro0c2d0d1UACBUlVn5dJHWJyoRyEjNt 3lLJCuHunck4RwkRajQ+4SDASnU/StwWe3WqI2UVs9aC9sVpbIUIRkIH5Phr0tz9Op4b A96uTCAi0BHoTciydmegvAOZ+JSDwQQtZTh2lGDPz/CkXWg4DQnAIzIuegriF3nFcIAM m2RA== X-Gm-Message-State: AOJu0YwAmoWD5+sp/0A6ZWcTTKzCh8ZLCc2d4l7sZ4GC1/lq8fhGu5BD u+LAZc4Jjf3PVdq/u5jnPYfGR5ZKtXG3Og== X-Received: by 2002:a1c:7214:0:b0:40d:7be6:8e59 with SMTP id n20-20020a1c7214000000b0040d7be68e59mr4250351wmc.40.1704293086646; Wed, 03 Jan 2024 06:44:46 -0800 (PST) Received: from debian ([146.70.204.204]) by smtp.gmail.com with ESMTPSA id q15-20020a05600c46cf00b0040d87b9eec7sm2530443wmo.32.2024.01.03.06.44.40 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 03 Jan 2024 06:44:46 -0800 (PST) Message-ID: <504130f6-b56c-4dcc-882c-97942c59f5b7@gmail.com> Date: Wed, 3 Jan 2024 15:44:21 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: [PATCH net-next v3 2/3] net: gro: parse ipv6 ext headers without frag0 invalidation From: Richard Gobert To: davem@davemloft.net, dsahern@kernel.org, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, shuah@kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org References: In-Reply-To: X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1787080858064715026 X-GMAIL-MSGID: 1787080858064715026 The existing code always pulls the IPv6 header and sets the transport offset initially. Then optionally again pulls any extension headers in ipv6_gso_pull_exthdrs and sets the transport offset again on return from that call. skb->data is set at the start of the first extension header before calling ipv6_gso_pull_exthdrs, and must disable the frag0 optimization because that function uses pskb_may_pull/pskb_pull instead of skb_gro_ helpers. It sets the GRO offset to the TCP header with skb_gro_pull and sets the transport header. Then returns skb->data to its position before this block. This commit introduces a new helper function - ipv6_gro_pull_exthdrs - which is used in ipv6_gro_receive to pull ipv6 ext headers instead of ipv6_gso_pull_exthdrs. Thus, there is no modification of skb->data, all operations use skb_gro_* helpers, and the frag0 fast path can be taken for IPv6 packets with ext headers. Signed-off-by: Richard Gobert Reviewed-by: Willem de Bruijn Reviewed-by: David Ahern Reviewed-by: Eric Dumazet --- net/ipv6/ip6_offload.c | 51 +++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index 0e0b5fed0995..cca64c7809be 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c @@ -37,6 +37,40 @@ INDIRECT_CALL_L4(cb, f2, f1, head, skb); \ }) +static int ipv6_gro_pull_exthdrs(struct sk_buff *skb, int off, int proto) +{ + const struct net_offload *ops = NULL; + struct ipv6_opt_hdr *opth; + + for (;;) { + int len; + + ops = rcu_dereference(inet6_offloads[proto]); + + if (unlikely(!ops)) + break; + + if (!(ops->flags & INET6_PROTO_GSO_EXTHDR)) + break; + + opth = skb_gro_header(skb, off + sizeof(*opth), off); + if (unlikely(!opth)) + break; + + len = ipv6_optlen(opth); + + opth = skb_gro_header(skb, off + len, off); + if (unlikely(!opth)) + break; + proto = opth->nexthdr; + + off += len; + } + + skb_gro_pull(skb, off - skb_network_offset(skb)); + return proto; +} + static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto) { const struct net_offload *ops = NULL; @@ -203,28 +237,25 @@ INDIRECT_CALLABLE_SCOPE struct sk_buff *ipv6_gro_receive(struct list_head *head, goto out; skb_set_network_header(skb, off); - skb_gro_pull(skb, sizeof(*iph)); - skb_set_transport_header(skb, skb_gro_offset(skb)); - flush += ntohs(iph->payload_len) != skb_gro_len(skb); + flush += ntohs(iph->payload_len) != skb->len - hlen; proto = iph->nexthdr; ops = rcu_dereference(inet6_offloads[proto]); if (!ops || !ops->callbacks.gro_receive) { - pskb_pull(skb, skb_gro_offset(skb)); - skb_gro_frag0_invalidate(skb); - proto = ipv6_gso_pull_exthdrs(skb, proto); - skb_gro_pull(skb, -skb_transport_offset(skb)); - skb_reset_transport_header(skb); - __skb_push(skb, skb_gro_offset(skb)); + proto = ipv6_gro_pull_exthdrs(skb, hlen, proto); ops = rcu_dereference(inet6_offloads[proto]); if (!ops || !ops->callbacks.gro_receive) goto out; - iph = ipv6_hdr(skb); + iph = skb_gro_network_header(skb); + } else { + skb_gro_pull(skb, sizeof(*iph)); } + skb_set_transport_header(skb, skb_gro_offset(skb)); + NAPI_GRO_CB(skb)->proto = proto; flush--; From patchwork Wed Jan 3 14:48:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Gobert X-Patchwork-Id: 184775 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp5063298dyb; Wed, 3 Jan 2024 06:49:29 -0800 (PST) X-Google-Smtp-Source: AGHT+IHI106d4YUnfFTZP/nGym6cZLMtW0W/n7DOA0aE14s0saxqRukxDJwELbj+aHCsFHhcdMbR X-Received: by 2002:a05:622a:1715:b0:425:a834:d073 with SMTP id h21-20020a05622a171500b00425a834d073mr31699227qtk.102.1704293369424; Wed, 03 Jan 2024 06:49:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704293369; cv=none; d=google.com; s=arc-20160816; b=Q3a6UQaoYo83sMKGZi2/iLSyteAB8psuXxFEKHm9LqpY3IDSzESrhNH+KL5sw9ThCD rGri4OomhPrQ0OlF8henE6AGGqKWr/JxiS5SFaDVTe0Nty6e4VKMdTZr24m6qSiyFxuv fZyMS6oAl+KzliGc9x+FzttYiRUwQG4I5sCIrdJYAcsiGeyEI/WQOy0T/+2hp+j+eBo3 CflsvjslKMyX3i4Ijw+1JweewYincfWAia61/PXLd0MgER3P2GRlZr1D+2rTJN4n+Ege 2A9QCsb4ShSBTvRWD98NzbSyeKAU1jMUR/T0F6ipvkz5By6NMLnRnmg/pA1v01WdrjPt WvxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :date:message-id:dkim-signature; bh=Eo5dRLFbCi8DdkGkFyA+UxEEzSuEB3v7ILPp4RSqkrU=; fh=Y340ezozF7Wvm1cTQGi0slwbR/3t9Devzu6PpLAqLHM=; b=layGWwTjiexwrQLNC1r78RoNVlHuUABb9YXzCEun+mqH15QWYpwoex76I7Xjpl2xVb c0RFxZbKcn/dlbNZ6enV1uCtAVSPi+U7XCgmdr40awyCR2CBwzFo4qXy/a/xT92zd8Np GBqVaeEAhjIEMIy48FkP9MZpKgKD8mk2eDaJz/pTfZ0WtmBEItO36CMS2Fkc48ZCi2Kl 6J+grj/sEZYymhou6h+dDUA9V3edR0FRghZwYMfx95a7ZJHo3b3uTz7NGpHeuchJ1U2N zwAAvJN0PR4pLzRBAZn785FhB6D3iCHoTdY2XgVfztpLJN3LfKdW6TbZSW9WbWdF8hSa 1DcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=lusyfWkO; spf=pass (google.com: domain of linux-kernel+bounces-15666-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15666-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id fb11-20020a05622a480b00b004283cc6a08esi364633qtb.466.2024.01.03.06.49.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jan 2024 06:49:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-15666-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=lusyfWkO; spf=pass (google.com: domain of linux-kernel+bounces-15666-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15666-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 2D88D1C2370F for ; Wed, 3 Jan 2024 14:49:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B4F4B1A733; Wed, 3 Jan 2024 14:49:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lusyfWkO" X-Original-To: linux-kernel@vger.kernel.org Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 813971A703; Wed, 3 Jan 2024 14:49:05 +0000 (UTC) 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 Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-555bd21f9fdso4800435a12.0; Wed, 03 Jan 2024 06:49:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1704293344; x=1704898144; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=Eo5dRLFbCi8DdkGkFyA+UxEEzSuEB3v7ILPp4RSqkrU=; b=lusyfWkOn89pXZg0+DFfqNapOg72FwYRTOF7WSXuF3SgkN6DdD6bvxzHw4RxNdfux4 5t+0dB9KU+axjWsJ5RYkys2Lp92z1t00HsbuE0jXkptLh4ec701nsjkiPVcWLhZSHdjE 6Duqek/07hZHc+KAijvGRbxyJHOCLZNlvRe1gsSHXEvFUcTjJx7cXnk9j5jLGWpZyyzE VXRg6EsJMttr5/EkKGDYRfcb0HIl7ikcr9FPIFWsMPHqNGls720k/UkCJxUhWgebFFO5 mcOUgT8eov8NrvU/A0R+5ZPQyhAuf5Z634tUthwFDTzmC1xwIXjtbjwl9etNKbU1gHVr E9Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704293344; x=1704898144; h=content-transfer-encoding:in-reply-to:references:to:from:subject :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=Eo5dRLFbCi8DdkGkFyA+UxEEzSuEB3v7ILPp4RSqkrU=; b=UBZqmyjk/k1AL0rsOP6f3fYBxCDVevkhuOfrSdlIi2KAeOnLqbpOVK+binOjgI9UXH 4W5a8s+zLqKJtCpXUfoeTJnuKm0mFCyt0PC+rVeT4vokxehKmQzfxu23dVfM+nMDK5F/ nAKjxfHvNC455D6doeUuUSpECOAqBAYPQ0J9wOkA16PIdbHxdPJaxAVL5WCga8zpm+EM bbnaVl2R9s7JlE1iA/sSWNtCJXLs4dSDiMXE7voDdZZyZb4n4FXH5AULqEwpuwZzQJdG Y8yWkoIxge5y2WJWpJn9gPYLAOd2QMrwxgtU3wm0/NE3kGJs0xr8Ca/mSiRsJDDgDFhJ W5Gg== X-Gm-Message-State: AOJu0Ywa0pXJxbVJCfj+5xgAdy+JvW2r3tv0Gk0WLBTdaJVwFVRN6dQ2 gkKRdT04RqYeFMw5uBIBzZU= X-Received: by 2002:a50:bb45:0:b0:553:2294:816f with SMTP id y63-20020a50bb45000000b005532294816fmr10415516ede.3.1704293343752; Wed, 03 Jan 2024 06:49:03 -0800 (PST) Received: from debian ([146.70.204.204]) by smtp.gmail.com with ESMTPSA id i7-20020aa7c9c7000000b0055678085e27sm2952266edt.20.2024.01.03.06.48.55 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 03 Jan 2024 06:49:03 -0800 (PST) Message-ID: <69282fed-2415-47e8-b3d3-34939ec3eb56@gmail.com> Date: Wed, 3 Jan 2024 15:48:35 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: [PATCH net-next v3 3/3] selftests/net: fix GRO coalesce test and add ext header coalesce tests From: Richard Gobert To: davem@davemloft.net, dsahern@kernel.org, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, shuah@kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org References: In-Reply-To: X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1787081124240103951 X-GMAIL-MSGID: 1787081124240103951 Currently there is no test which checks that IPv6 extension header packets successfully coalesce. This commit adds a test, which verifies two IPv6 packets with HBH extension headers do coalesce, and another test which checks that packets with different extension header data do not coalesce in GRO. I changed the receive socket filter to accept a packet with one extension header. This change exposed a bug in the fragment test -- the old BPF did not accept the fragment packet. I updated correct_num_packets in the fragment test accordingly. Signed-off-by: Richard Gobert Reviewed-by: Willem de Bruijn --- tools/testing/selftests/net/gro.c | 93 +++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/gro.c b/tools/testing/selftests/net/gro.c index 30024d0ed373..353e1e867fbb 100644 --- a/tools/testing/selftests/net/gro.c +++ b/tools/testing/selftests/net/gro.c @@ -71,6 +71,12 @@ #define MAX_PAYLOAD (IP_MAXPACKET - sizeof(struct tcphdr) - sizeof(struct ipv6hdr)) #define NUM_LARGE_PKT (MAX_PAYLOAD / MSS) #define MAX_HDR_LEN (ETH_HLEN + sizeof(struct ipv6hdr) + sizeof(struct tcphdr)) +#define MIN_EXTHDR_SIZE 8 +#define EXT_PAYLOAD_1 "\x00\x00\x00\x00\x00\x00" +#define EXT_PAYLOAD_2 "\x11\x11\x11\x11\x11\x11" + +#define ipv6_optlen(p) (((p)->hdrlen+1) << 3) /* calculate IPv6 extension header len */ +#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) static const char *addr6_src = "fdaa::2"; static const char *addr6_dst = "fdaa::1"; @@ -104,7 +110,7 @@ static void setup_sock_filter(int fd) const int dport_off = tcp_offset + offsetof(struct tcphdr, dest); const int ethproto_off = offsetof(struct ethhdr, h_proto); int optlen = 0; - int ipproto_off; + int ipproto_off, opt_ipproto_off; int next_off; if (proto == PF_INET) @@ -116,14 +122,30 @@ static void setup_sock_filter(int fd) if (strcmp(testname, "ip") == 0) { if (proto == PF_INET) optlen = sizeof(struct ip_timestamp); - else - optlen = sizeof(struct ip6_frag); + else { + BUILD_BUG_ON(sizeof(struct ip6_hbh) > MIN_EXTHDR_SIZE); + BUILD_BUG_ON(sizeof(struct ip6_dest) > MIN_EXTHDR_SIZE); + BUILD_BUG_ON(sizeof(struct ip6_frag) > MIN_EXTHDR_SIZE); + + /* same size for HBH and Fragment extension header types */ + optlen = MIN_EXTHDR_SIZE; + opt_ipproto_off = ETH_HLEN + sizeof(struct ipv6hdr) + + offsetof(struct ip6_ext, ip6e_nxt); + } } + /* this filter validates the following: + * - packet is IPv4/IPv6 according to the running test. + * - packet is TCP. Also handles the case of one extension header and then TCP. + * - checks the packet tcp dport equals to DPORT. Also handles the case of one + * extension header and then TCP. + */ struct sock_filter filter[] = { BPF_STMT(BPF_LD + BPF_H + BPF_ABS, ethproto_off), - BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ntohs(ethhdr_proto), 0, 7), + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ntohs(ethhdr_proto), 0, 9), BPF_STMT(BPF_LD + BPF_B + BPF_ABS, ipproto_off), + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_TCP, 2, 0), + BPF_STMT(BPF_LD + BPF_B + BPF_ABS, opt_ipproto_off), BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_TCP, 0, 5), BPF_STMT(BPF_LD + BPF_H + BPF_ABS, dport_off), BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, DPORT, 2, 0), @@ -576,6 +598,39 @@ static void add_ipv4_ts_option(void *buf, void *optpkt) iph->check = checksum_fold(iph, sizeof(struct iphdr) + optlen, 0); } +static void add_ipv6_exthdr(void *buf, void *optpkt, __u8 exthdr_type, char *ext_payload) +{ + struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr *)(optpkt + tcp_offset); + struct ipv6hdr *iph = (struct ipv6hdr *)(optpkt + ETH_HLEN); + char *exthdr_payload_start = (char *)(exthdr + 1); + + exthdr->hdrlen = 0; + exthdr->nexthdr = IPPROTO_TCP; + + memcpy(exthdr_payload_start, ext_payload, MIN_EXTHDR_SIZE - sizeof(*exthdr)); + + memcpy(optpkt, buf, tcp_offset); + memcpy(optpkt + tcp_offset + MIN_EXTHDR_SIZE, buf + tcp_offset, + sizeof(struct tcphdr) + PAYLOAD_LEN); + + iph->nexthdr = exthdr_type; + iph->payload_len = htons(ntohs(iph->payload_len) + MIN_EXTHDR_SIZE); +} + +static void send_ipv6_exthdr(int fd, struct sockaddr_ll *daddr, char *ext_data1, char *ext_data2) +{ + static char buf[MAX_HDR_LEN + PAYLOAD_LEN]; + static char exthdr_pck[sizeof(buf) + MIN_EXTHDR_SIZE]; + + create_packet(buf, 0, 0, PAYLOAD_LEN, 0); + add_ipv6_exthdr(buf, exthdr_pck, IPPROTO_HOPOPTS, ext_data1); + write_packet(fd, exthdr_pck, total_hdr_len + PAYLOAD_LEN + MIN_EXTHDR_SIZE, daddr); + + create_packet(buf, PAYLOAD_LEN * 1, 0, PAYLOAD_LEN, 0); + add_ipv6_exthdr(buf, exthdr_pck, IPPROTO_HOPOPTS, ext_data2); + write_packet(fd, exthdr_pck, total_hdr_len + PAYLOAD_LEN + MIN_EXTHDR_SIZE, daddr); +} + /* IPv4 options shouldn't coalesce */ static void send_ip_options(int fd, struct sockaddr_ll *daddr) { @@ -697,7 +752,7 @@ static void send_fragment6(int fd, struct sockaddr_ll *daddr) create_packet(buf, PAYLOAD_LEN * i, 0, PAYLOAD_LEN, 0); write_packet(fd, buf, bufpkt_len, daddr); } - + sleep(1); create_packet(buf, PAYLOAD_LEN * 2, 0, PAYLOAD_LEN, 0); memset(extpkt, 0, extpkt_len); @@ -760,6 +815,7 @@ static void check_recv_pkts(int fd, int *correct_payload, vlog("}, Total %d packets\nReceived {", correct_num_pkts); while (1) { + ip_ext_len = 0; pkt_size = recv(fd, buffer, IP_MAXPACKET + ETH_HLEN + 1, 0); if (pkt_size < 0) error(1, errno, "could not receive"); @@ -767,7 +823,7 @@ static void check_recv_pkts(int fd, int *correct_payload, if (iph->version == 4) ip_ext_len = (iph->ihl - 5) * 4; else if (ip6h->version == 6 && ip6h->nexthdr != IPPROTO_TCP) - ip_ext_len = sizeof(struct ip6_frag); + ip_ext_len = MIN_EXTHDR_SIZE; tcph = (struct tcphdr *)(buffer + tcp_offset + ip_ext_len); @@ -880,7 +936,21 @@ static void gro_sender(void) sleep(1); write_packet(txfd, fin_pkt, total_hdr_len, &daddr); } else if (proto == PF_INET6) { + sleep(1); send_fragment6(txfd, &daddr); + sleep(1); + write_packet(txfd, fin_pkt, total_hdr_len, &daddr); + + sleep(1); + /* send IPv6 packets with ext header with same payload */ + send_ipv6_exthdr(txfd, &daddr, EXT_PAYLOAD_1, EXT_PAYLOAD_1); + sleep(1); + write_packet(txfd, fin_pkt, total_hdr_len, &daddr); + + sleep(1); + /* send IPv6 packets with ext header with different payload */ + send_ipv6_exthdr(txfd, &daddr, EXT_PAYLOAD_1, EXT_PAYLOAD_2); + sleep(1); write_packet(txfd, fin_pkt, total_hdr_len, &daddr); } } else if (strcmp(testname, "large") == 0) { @@ -997,6 +1067,17 @@ static void gro_receiver(void) */ printf("fragmented ip6 doesn't coalesce: "); correct_payload[0] = PAYLOAD_LEN * 2; + correct_payload[1] = PAYLOAD_LEN; + correct_payload[2] = PAYLOAD_LEN; + check_recv_pkts(rxfd, correct_payload, 3); + + printf("ipv6 with ext header does coalesce: "); + correct_payload[0] = PAYLOAD_LEN * 2; + check_recv_pkts(rxfd, correct_payload, 1); + + printf("ipv6 with ext header with different payloads doesn't coalesce: "); + correct_payload[0] = PAYLOAD_LEN; + correct_payload[1] = PAYLOAD_LEN; check_recv_pkts(rxfd, correct_payload, 2); } } else if (strcmp(testname, "large") == 0) {