From patchwork Mon Feb 3 17:01:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957844 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 35FF020B7FE; Mon, 3 Feb 2025 17:02:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602155; cv=none; b=nhmd8sn8QZkMBD+fNls484O3JvZlfudknQeb3fWoBo/Bk8mUNKj+X8jq49/tv9mBSxGuHJmwZ6GBp+FFbyyUjzam+xw3DT6rvr7qFWd72R/RkkaJsHj7U/f7FFdk1Pwww3ry582LyN41rFv1hMiN+RZb5I2kg3vepjwwkgSMeSU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602155; c=relaxed/simple; bh=32+59aZbJd8IOqTe+dLYeCFxvL3Tk0xzDu5MRFtgWYY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=blT8JGnLYpgW10yB4VQF2haWrW95dbSoERmgyBJfe9SjnQWNq5PcfS1ZmgQ05ngedCIqUeHwhLwodfxpEdUArOjiqgeZwKXZnCtW2dOCAIgeWnEG55e/Ew8AKm9oPmPf6w40B9dymcCy/GBsa0BP72FnXoX5FYBwBnNC+CkmK4A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=KiPdGMOr; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="KiPdGMOr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602148; x=1739206948; i=ps.report@gmx.net; bh=32+59aZbJd8IOqTe+dLYeCFxvL3Tk0xzDu5MRFtgWYY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=KiPdGMOr1ieu6sYifUvQPMlZ6hKWHAqK86+Yt5V5pRSkDNmOPAvkSBPSd6VQqhC8 FcM/lcBC7S1TlOzFuB3Z6fRaBuk41+9V817z2nUUyN+8pbh3wQB37nyCsgqVuJpdQ Dei4OuoGJAWVbCIK9TKjWVPI1WrR4Kcfy9sKhIXF9Ctn9eEFTrm/hX00AImz/FVh7 j2zrqgYxcWF7m7+7tt1hJ9ii9JAYJGrzkw7oitT8qMvjMK4Dj05DM3KROOnk2h+a8 2339XKhgikwUYPMP8BcT20BIx/5dashOIki2ZQzK1PHWsiuX85CK98ZNm7Ge0yrVG VUDRBtIDLRvMw1CoZg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MplXz-1t4n0b1Tor-00dNuv; Mon, 03 Feb 2025 18:02:28 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 01/10] net: pktgen: replace ENOTSUPP with EOPNOTSUPP Date: Mon, 3 Feb 2025 18:01:52 +0100 Message-ID: <20250203170201.1661703-2-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:efFOmg+dqNpe4u3UGla4MV9XFWUj0tJLNRqUedq6zolUiCbHteB iB3AtOh3zU3zAwiVbUKyujVbSiU4hD+nq9zz+yu/S1ytJRi1CDI6MGmkC3ia7eiHTlepvd8 pQV6Z4QDRsM7OIEX/iXXpc89Lqg/TkHP12b0qMPmFJrA2bMXB5afb0l9ePXtXXQ1yfdHOUH V0lblhzDXtbGPtzu1ncqg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:7Lzg3n0qlGg=;e6PrcDw6e2LHlhfuOtRnk0J8MqS xngPifAxwuKlt3QFf1APsAw03ZhCSA9wHVEniprFYw8jCsg6VOMz2lFYl8/UtWjw8VC7TvklD 2bDjehzoDB88bwG5awV6FrtMybbRCHzV2xrI/nrQJaFeRU5pnOjTLqabzrFMyoKQCmKj+bRYs /m69mU7Ot8UTyTZSHfPhFlc5m8goMWdjIrFdtiFc9JPJR6FCvtbOhQP1vAM7AuaegC2FdiQtV DoAGDW31up8R/lEusOeW3JDxuxFD3snaiY4mPcPlX0XlX7nOxrp1s6/m/pQMwjK6aBTK3nBku Yr82nvrOLHseoxZ1FNrR+MsMR52tmgzkNSmVHg2WhZEyxWRjDtBLlKbptqhn3ixSFCWHchbT5 Co6CCR228KwBk8O1oPuzy8YmvsZTSL/JNvG6AGRoobmnhRESlNjEWaXBEnl0Xaz+nbSQ6fJ+y 2DIZisLKLFKciGfPYu0Xrfv/g9RbWpK1UARX0pskwi0NhrWHulsvKXbrM0QWCn+ySM7td4g2M IgGUfdkQbyXYViIXIAj8frbal3CySgwj+Iw13BvZvxtbamuVSQahvNb7/rdI0gKNMPZt7lyOX 1Cw3vajX9dvOnpSz/fr/H0IQQeZp7WS3iDSO4WswPG4fba4Wmfj6YrfZxjaq2AcBXkiueI2Zb AfuyiEjGR50TobqqKiu06Jxdj9zcnIPKiSeZtT7egE5n1HqQKyvr0H85+Dkden1u7O6SxCVPO xHZV3oTHZrXlxyWYjPJNDSklG0KorlHmy0V5BANCs+2YGjxC9pzSP9o3ysjtUMFyHB7kIsHzM EwbJ5itcMRUzxUbztDb3Ku6pKSA11EJ6z9rrngPYZaJh+yP9bTts7tsw0/nrQqfOXBzbNO5Pz /WZjGjsJuDKoBBQHVux9ehJ7V7OaulPkopxiPWnlYcDj/Rqhro7BUIMgNCpvZokCyJBTcOBoh c1p8BTeZL9mAbb70uLuNzgLVLK8rlFNY/wIy6IuJTi/4FWMSyxScvsL36Pa7qkWLViz5ehhU9 nFtONff8hKv7s+zKQftZl8Y9kjMkbfCK+KLGbbJHu12dtjejyfrdW/CEObZy93BBiH0fhVYJS Bjz1E8Fx/RULdLM2FyBgvPLcA2HNFHOk9CQq09pvTWJP8WkLwXzagJsqeiJxPSi+QXd3j++Mm eHg7TEmOpqNRVMWUve3tBXoAuq7m/mewqDhk1QwkqcPF1kTktJQu/j/SY8Y+ntPwTTQu0u2J5 RTHmKBAsvELA4XqfTqXdAKRlal+nTmDaqL3TXAKoe9Y9y3Ifyf0R1GzdvNFwo8uZ3m0Ee0780 d4wXWnAtQjSXX8mdiByvzMJ80AIm8rm8XyaN9oTIyY8gwM= Replace ENOTSUPP with EOPNOTSUPP, fixes checkpatch hint WARNING: ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP and e.g. $ echo "clone_skb 1" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Unknown error 524 Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v2 -> v3 - no changes Changes v1 -> v2 - no changes --- net/core/pktgen.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 82b6a2c3c141..496aa16773e7 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1198,7 +1198,7 @@ static ssize_t pktgen_if_write(struct file *file, if ((value > 0) && ((pkt_dev->xmit_mode == M_NETIF_RECEIVE) || !(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) - return -ENOTSUPP; + return -EOPNOTSUPP; if (value > 0 && (pkt_dev->n_imix_entries > 0 || !(pkt_dev->flags & F_SHARED))) return -EINVAL; @@ -1258,7 +1258,7 @@ static ssize_t pktgen_if_write(struct file *file, ((pkt_dev->xmit_mode == M_QUEUE_XMIT) || ((pkt_dev->xmit_mode == M_START_XMIT) && (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))))) - return -ENOTSUPP; + return -EOPNOTSUPP; if (value > 1 && !(pkt_dev->flags & F_SHARED)) return -EINVAL; @@ -1303,7 +1303,7 @@ static ssize_t pktgen_if_write(struct file *file, } else if (strcmp(f, "netif_receive") == 0) { /* clone_skb set earlier, not supported in this mode */ if (pkt_dev->clone_skb > 0) - return -ENOTSUPP; + return -EOPNOTSUPP; pkt_dev->xmit_mode = M_NETIF_RECEIVE; From patchwork Mon Feb 3 17:01:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957843 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6ABA35956; Mon, 3 Feb 2025 17:02:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602152; cv=none; b=rWxsBpv0N4G58aeLGNjJdvEGOIcVuMDF3pJTLR42o60fZ7nG2tnhPGCB8lLVkUoEFPRhNZ/l8dMcBjdtOlR75msoiCFDZxIUPnwYzV6yydNOfsZa0LipNvRMva39h6H/mSpn/kdrcvuZDrBAPOVKWUvlF0wV/HyL+OPibyjGJ64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602152; c=relaxed/simple; bh=n9mHnyQBpGX2PaXbfmTEexmi6lJrevaHr9yjIEWDFnQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nRa6oCinwnYXmFlHdr2732syc+G9C+o+zvHH2F9pX2sJeNOgpuphDUeCFSb4raIphRSI54JcydK3R4iEbK1cl9neT8mj6EVatyLkOEPE5T75BYonLbJzfaB8qv2P8jJdWcdFT58YeD3egxJEGjusOSzAnJMF9j7UZo/2bXns2Ik= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=pgDvH1Tu; arc=none smtp.client-ip=212.227.15.18 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="pgDvH1Tu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602148; x=1739206948; i=ps.report@gmx.net; bh=n9mHnyQBpGX2PaXbfmTEexmi6lJrevaHr9yjIEWDFnQ=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=pgDvH1TuUxllvsKVdkXZTdaKPqZRFRa9XC5iiGld+0vJSN727IsNUX3bA9wzBm35 i+1Wj0bUJFOuv5KplpBxPPlanV/C46f//JbPtDtopmaDw97BexFB26H2+BaLI6o/j vWS8vGc6OuPQxfj4a30mlLLrtf3HzZCggzSE7H6SxuM5BUfQriWJeZLpCkX7ffYoz DgBzJgIu1OOb6sWf1Jkn/ijxSXTkCZoV67N+jx9ntYgp/378KmyZZ7fWOpT82dMCE 8DuZc7Kngen2n4tOjv3kzL9g69/6uOGKiredlUaJpG6ML9SZXMdGaVM3LbKAMmBwY 2LDkuogDs+PeKNVIJw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MUosN-1tny8T2yZ7-00N4O9; Mon, 03 Feb 2025 18:02:28 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 02/10] net: pktgen: enable 'param=value' parsing Date: Mon, 3 Feb 2025 18:01:53 +0100 Message-ID: <20250203170201.1661703-3-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:hnOIbvEvZwfC4iEQwmqOb+GBzBpX1aSLGc3bBjMTaPMVmqEC5EF Amr0j3WMkFWM4KcYo7b4aJ6FqDLW4kbL+oWrkYYP/wb0yncOhpzZHO/Kxft9bTsKi1qf3/f gK0PDaNe7k5+/ZWp/Q82iC4/FY+G9Ry33LsAmm1oZ2U+CYq8MPRkL+WGEsrceLIS60dfFW5 i1t3qzocxo1YiGODaFgFg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:ZDaTkaW5IDE=;mmWaM3WnQ+io3fxvUf9tt1Pb35e RosCDt9wDZ/RX36lrhYte9ZX7+Y1pPN/E1BM86BoQpo4AEEYG93bZPBV31E6gJ+kTzLnE9AYn symL5S6K2EtDLHuTKfQ5efVkS0fB7mI/kCDQjam+qOYef5PexTnBSyJg1OoAipYGUzqE+GsPa tLf5KBwNkfubwMCTT+yXDU2YXLEXC80f6RQtsT8zFkvQy3EfNfJdFKxj93InctVoVj9US1ZZc iAHpDsLH05kvKaETcgvpOUf2NH/n8VbU7f7S/zcy8kBYD454y4vMAcLphiVn6uz1kTNua+G3C HGwU6oqrzCVCTmDaYaAXDa+H623hqWgXi+GbOf60n9NAHwcxihbx9Nbeg6pWXDkYWEDYkOxJ1 qUIzvdrN9WlqB8VSYZNOYPJ2Wp+VpW1Krw9FnLwd+ht7CT6qx9Mtm0u28XYI4OU3/Q+Ur10ZF L7AqcM97KDUTuT5whK+lVwGKaxgr8r8evK2s4eFs7TOecOO4HOaqF1SRp6aUSCEnQOA8XPZlk SJeUg9x5EAqDwkK2weL3U2c+e+x7VJKRnh53Hd93BjJYdJ9bWYFHTkHoDouMie0iVan7sxheK YX+/FrMlUf48fGqXL9bPs1Q6FH4J7T+UD42warPl965pog3RrW7zotgsotQQvK79ulTUD1ORK cDOnQiy+mldub76ZTDBmbeUFUBhubWC1Ryg1ChvraO+AFUyJzlssvLdPjthUIfdvYvVDsrbvn 7uf2SsqFbs6C2Hr2v2DCNc0PyJe59dlmVOCuGfM98i/fi72e0lrhIk2mpVQT7QclWaj9wRhHR 9R+N1ddfW5Nfm+HHUUuFGeCzzJ3ntbGaUKOzgVPTnZ3TASeI+4tTszHcpqI5ZItULVFlbHHao hZAF25kvt4YQi4fI++F1Uo+p2AKWKsgQWopTfA8F3/HVr25NVlOz6r4r0LD19am5Fg0PATwdG G+ByfrQa+eiBXaurO4vePwX+KSXjRgJh1OCeXBhe65JHgeRlkWeqJcWAwgOUcE1+/kP20iEjP arFWXBh+bxWFBgtIPQFzfNOYZIH4LQ3LNZCoEWr58m3u6YH8lH+VdMtkZVSDFNsOG3+hSpcH9 k4tb/InStxWIFkH0m1bYsx33ojPHPX8Ik59EJEmFI+P0DowsIb9We1Axls/7OuC7vZjkZI8Kb bWlUzQ93NFFhGgVRP2t7icwKH4ypChcvTLSR6TGljeVNyQaOleRDm/ZmMmpS/e3mWTxOqyeey ++b7i/c0wQ9XJU4auotwsZHcVci1xLAtzZotuSBhu+9hp4G3AT7cMW4QtEY+jhibTtrNASxi6 Wy4Qzt7GwbQGiyy9rp5UJ2aN0oGpd8OeWmQkmcEzmVpC0Y= Enable additional to 'parm value' the 'param=value' parsing (otherwise skipping '=' in count_trail_chars() is useless). Tested with: $ echo "min_pkt_size 999" > /proc/net/pktgen/lo\@0 $ echo "min_pkt_size=999" > /proc/net/pktgen/lo\@0 $ echo "min_pkt_size =999" > /proc/net/pktgen/lo\@0 $ echo "min_pkt_size= 999" > /proc/net/pktgen/lo\@0 $ echo "min_pkt_size = 999" > /proc/net/pktgen/lo\@0 Signed-off-by: Peter Seiderer --- Changes v2 -> v3: - no changes Changes v1 -> v2: - no changes --- net/core/pktgen.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 496aa16773e7..4f8ec6c9bed4 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -823,6 +823,7 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) case '\r': case '\t': case ' ': + case '=': goto done_str; default: break; From patchwork Mon Feb 3 17:01:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957847 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 90F4A20E02E; Mon, 3 Feb 2025 17:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602159; cv=none; b=cN6ExfmHJYqbfXYY98TXab4SZnv8Xqf+Gv0a0JoNobT0cy1KhscW/r9cVGGjqUq30wJSYrrDoD2xQlVLi4h9nePKe7MJvk8cq/iDhwGXBdTSVLcw73sCHJmMrdILT492mCxmuETLOEXQmb6t/w6uoqJaHtDi4zToTuQQwyXMSqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602159; c=relaxed/simple; bh=UXbz6Ai0gDMSuOu08BJN+KssFkU7tBuUUXs9SFeOx/g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ueo5e6ho9yKjL2EjN78Z0DWs4yc23JRbYWIstu9uOV2tGqJYHETuydfMvjmKVXPGEpYPwJNqkAEkFmfrYnFWPUtDP+sA5IErwJim1bYXYJmH9TK2dYQV0nr083cvdlIgyqNu0zp0F901cecDKoR2czp0j5TmqDFqPkKBIj+iD54= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=K5GPxUqi; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="K5GPxUqi" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602149; x=1739206949; i=ps.report@gmx.net; bh=UXbz6Ai0gDMSuOu08BJN+KssFkU7tBuUUXs9SFeOx/g=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=K5GPxUqi1MZHV5WV8F+xjf3/ydeWnu4sCwfqV1Y9R2Bu4kxKRffQMqzHdZEshFmd U11USaAf6J4z/55WImEzYL7IPHwCZRacVFTeIx5f1K9Fs3RKeS0Ok92MyBu/NpXkj zOl98NRs+sW1RNGkfr0HkSVjYzX5oR7rad9m6kGATMjlyPIiT9BMxU3MhAjysEbfZ bDLy4KvGhtrmd3ZtTXkK6UafJ/ziNbI5IHu0bJvcGyrJg1EkKRto9erT7h2hxw18q KHL5P9yJlkbe1RbqGdbc/JiQTWOmB1BbjnA2J1GeYg70BUz1Jio3WVhZZcFjcTKTx dztPk9RRQDiG3Ljcig== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MRmjw-1tqRuZ0A5C-00OS6M; Mon, 03 Feb 2025 18:02:29 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 03/10] net: pktgen: fix hex32_arg parsing for short reads Date: Mon, 3 Feb 2025 18:01:54 +0100 Message-ID: <20250203170201.1661703-4-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:z3DwsX+U4a6YF7HWvEX391xetb8Q+nhUm6/DpO2Hi/CJKm5OWsA DXGuoc/tcEidJuDzwnrQf4mechqqAf/epR01tXgA6KfE/Ntp78UbqILf3TAG8JDPno5wqdW JTiCJcibPkUxiTpp+7kIU3U8NEXV2Sxn8zx8BBvcAgZCUa6fUsedTaRWnY4h1i/52Ry59ph qCWbd848XVr+a1GM6id9A== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:LSyhEPmOPY0=;mG6w55RJYHbkeE+FIaijcsK0mS6 6ED2g52keLTfxi8k6PF6vnu+pLxYv7X57mgKYT/kAw5dazIm8k9w2280E58fvubYV5R5bnZr/ 63oaBXRdQjlixUReEN2uYzMm+Hx51p31oZRX+n3XcHK0G4skGrNMiQRiOWGkejfHK1L5bmZvv 4yaYj829jxThraWJIiXgiYoEshJMdnY6+gm8i2lzjNZy2hX5kGNAFvA4K0yrKi9zkK4T954Rl 1ik2Vn1JqrnP3Ca3yXfWcwJI4airZPuctLyJSVqnzuIZZRVdaX67TDpYVXPiWF/amBvmow81b Ij+Lg1+Jz5se0vWmgcqvFw0XrU2opN8K30MBeT3KSQRjbfEReP35YQGjoWrGXwMKY7TckI46G PNqgWZqtnBB5EIPQRqWCitVWnw1m7q6xvPI2sGNifSzNcj3xiy+UqaJL8lCbnNb5QRPT5FlVy 5Ffc5ZmejaWsDS8Vma5Y+o0rvVo7m66l6BqG/kB3hUI+qfTZaLRKr3Pxe11xqpyhb1nvvhdOX spv0mRGlzqtfjeF+QIQTZNibtX0406YADPD4JrKNzVvp8JskHYdNPE0aeZ8f1We321ha/emLX 5jW/yaZQ4MgBu1hUUySdFSS8pscAhAklV+x4cfh4RgU+XH/eQM6ysPJeGq2g92fzwyipKyXas RcVFhHNobDYvSVjKAQSF4R+PAiARJufjyyyK3Eza1e/1FdJ/nsz+Smife+0xVa+EqUfp8bhbt HHaf1PFM6yiohXr4mNXXDQ/4OZDYUDia2qopvnOFYfS/O+h+f/G4PEE60mC/W1ceG4bLv6Uki +q4qpzZSwWs8BgB1F2wxFEtn71imYU48+4CBqkt49giq5RDYDzRMmFoGjPkK6+x/fzpLlQZFg C+ZkUt7nWK4EOg+IfJZItK7mH9oXiIlv1OEaKL1SZ6jD8CYxSacI3QNrdvdNU9V77l+bxz0V+ AUxAODylY51bylEM9vH2EAoq5iWz7RSkPJlyETSpuaM/FUygqxMOMaHs6a1obTBmEUEdq1yte F8CNjiWnCan53BiuzrRlHg4DBQe/ypH7n+f0nwjDztVeu21pHpWDhWS1W47yeNMOh+c7UdUr2 5MXr44Een+WtFTWiCz6DBNco8JPG6FlC63QV2VLL+/BlwgLUFLQbS6Oh762+CHRX7ASj2HPGw FY48hRYNZ275u9j0hD/OxHckbMGlCpXFHyWViUn1pzH9WPA7BS189/rqny8AZqo0iJ5QXd5ym RUBlGtOiGf+JHydP7D1sLFFgZJjnoNBTplyyAj12hhZwdgYjL0BtzWxozETHobOWaBbc1C/66 909dfpTN5Rt+NYBAY/mY3su4jcQ9r7XOI8uXkG/pC/RclU= Fix hex32_arg parsing for short reads (here 7 hex digits instead of the expected 8), shift result only on successful input parsing. - before the patch $ echo "mpls 0000123" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00001230 Result: OK: mpls=00001230 - with patch applied $ echo "mpls 0000123" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00000123 Result: OK: mpls=00000123 Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v1 -> v2: - no changes Changes v1 -> v2: - new patch --- net/core/pktgen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 4f8ec6c9bed4..28dbbf70e142 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -753,14 +753,15 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, for (; i < maxlen; i++) { int value; char c; - *num <<= 4; if (get_user(c, &user_buffer[i])) return -EFAULT; value = hex_to_bin(c); - if (value >= 0) + if (value >= 0) { + *num <<= 4; *num |= value; - else + } else { break; + } } return i; } From patchwork Mon Feb 3 17:01:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957852 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F98620F07A; Mon, 3 Feb 2025 17:02:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602167; cv=none; b=prWe/ZhHJMJLl7LpVZkDl+8FDUuh4hoLromkQ+xjyhFEf9Ly8VxgcY8v9AWjxaWry0SxMrNDXk580dHWNGsfMep+ZVamTbput+/15e5MJRvdujd3PxqQpk+PIaMz/LfJ9jLBMKyELicLrbJxGa5vFvztDxRbnRAm4Pew8NZdxCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602167; c=relaxed/simple; bh=XYAqqxfOd4K97F96CABMIElX44iLTKCo20ntWNluzPE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X6uPpevBiYlbXwhfkuIHSFSG4xN1Um9ZzrPC93Q9aHVhFKzacbqHS/RD4YM90c6Q+3FlRSwSeIRCcYy5G+dVrQS45PLuf9BJ+m4dNwYy8+7dwEd8urDHPmMwE9/FVl0axBwGHYRyIPSXMW8OMBxdE0mfWi5clTO76VhwQ3LJFHs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=s1ZPJ5h1; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="s1ZPJ5h1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602149; x=1739206949; i=ps.report@gmx.net; bh=XYAqqxfOd4K97F96CABMIElX44iLTKCo20ntWNluzPE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=s1ZPJ5h14084YKFsis9wl2u/reRbhgIMu+izkOeHw0FbvU5dXfctjdi/QbQhxESc Xt7bu89FKTG88pebzlbjUQv0w5ocL8QI4NNiXAeNuWi9mVCTW6EXFOI16+ufRUxpQ 9m1fySp8mS9du1akMe/Fg6axCFW774YvbcpLRF7tI72mB45NNGxPMO4IANUf5sCaI spG8gYgDZFzrQc5EPHPSCCYZ/aZDmkaRvJE2HEcakqxq8DbuYcKO4mYSpz8/wtuTe eh1/KvrNtv4tCdUGSfwWRHSjuWT6ICj64AKLkv3fgJ/Db/H5IblgNU5zK9j9C0frR kqpd4ttFYXNK52i1kQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MvK0R-1tNT1Q1aXx-014taD; Mon, 03 Feb 2025 18:02:29 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 04/10] net: pktgen: fix 'rate 0' error handling (return -EINVAL) Date: Mon, 3 Feb 2025 18:01:55 +0100 Message-ID: <20250203170201.1661703-5-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:ps5aTIrNCztv6KI7hrchAjf0FiOZxzlsJJmIWAvelJgKo4W6KaX 6thWWPM7+LZXGhNoEGa3EsgM6CrARQLQ6n9LROJQHRelThtkjg6yXvdA7TJxC1KlKIwa5k7 Lolip95Pm5iv99Y2qFbIjtjMKaFbI0PJjMDXUu6roLdiAb0ZI+uBdKcB/yRjqV16INJt+p6 DwsUF/RFGflviZfLM7utA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:BCJTPxYCcjw=;KT9wdtvHNdO99CXmHd3twLqvsx5 wgoJTTNhpZUFjcxh1yh681C6J8OrqeeJSqxuH897f6YOTWzxgN3p+lu94ozu7oVjdjzrUiqIm O9YWNPVYgGxDbWmxOKXJjFB2m8oID1RaXltleKsc2DQv+YlwCLIREy+G33WqEEUatFg/rSLjp m6cfUFHbOl5ab9PYqGwaO3w4Aq/Ni4Zl0XTvDdaCf319z0WEq/mW83+swxJ+xxnJYMVt1he4h 2DB2br3tLYbABhiJ7kV0O55muUvaF4MsaixTpIoF0yHDHiHv4+PpthnA6ZE0/zf8mPLAb4snj cpmeqR+GWoOC5kfYC5cVrbGvm5pSFpix5t84cxthgP77ymh8F/Je0NyAGW2q3wyxLKiZ0mHAj T0B7jbFMmoSxT4CoKbq3lY7YcNX1Z8DwptLFHAGT6ceSAWmD0DVq4MrhILzwwiIQJLY9hJREx bPykwsLUDJkQoefOWqtHpid/UuXatO+dwKhKnUErBGVrsPBTaXiSh+pu16vpDC76yMb1xfXvO X5ppAJuf5sCyDulNzrnPxpoK/xn03CHDZaqAuNE/fGo6JW0kFFb8OUKZptV2uNVo8rWjReBz/ E0m2RMQ4J1U2lKy2P72lOpbyGVDyQzN4P+VclgyObfYZZyo6PoEJAPe8qdvE0/oxqFg690JQS E2AsdktME5/YB5F2YQlvNpjeN6lFN1Ws50+96eQZlfCE53z9/EHy8/SZPUtvFJbA30Iqm8s/p VMblI/pb+W6lLFgvW60c91LupX7eVHEanhaiGk8ZC/5WvMq2JYqvhw054i8J3H+nuJxqmvZTM QY4Vw4obNVegjbCsPGZe0u9StFcBz9wQCSvo1SyzAWoy3VOJjJjhfvc8aN7dKmqnkAhBSjzst MxtTg2NcmztiTe+35bnX07ehgfgZuAPw9enQpoVmxltXP2Nl1ALO7lZLapOvZ/NDxU9uDSiai SfGxsYpPuGituklkQjoSXVqQwwF9sZs5ZyHjtp8FJSCfg7l3UuwSBW2JGiYFgb2i0oCy1ECDZ GpPhjY7uLlyzStEKXyiuTVZLLewyzN/0QKIYqBdd4WY0c2lm2/rqivEydfKDLJOpCDxV3x3ga RwVpHyQOyBKmiYXPh864sYsSac73GRtPkXNJRLd5hGAf9IMotxb8h/P5r5WkssSn/JM6jVB/O cDyyAHwonqbud1OPS+RdkPCJZ4QysvvEteYj5EzbrnlQ1MYB6QZ4xa/t0FB90qOmQkgS6B6EI m6bImxZa4YrCVZtAnT4LPJxwZHGipHSH2aSgZoJRYv45b0PnYPHr/DUvHd4CZWcIZTFDbXYuw P3Kt/2Wo0BFQj5alSWpA2NNWhwICOchMJ5bMO4z9lhu9xc= Given an invalid 'rate' command e.g. 'rate 0' the return value is '1', leading to the following misleading output: - the good case $ echo "rate 100" > /proc/net/pktgen/lo\@0 $ grep "Result:" /proc/net/pktgen/lo\@0 Result: OK: rate=100 - the bad case (before the patch) $ echo "rate 0" > /proc/net/pktgen/lo\@0" -bash: echo: write error: Invalid argument $ grep "Result:" /proc/net/pktgen/lo\@0 Result: No such parameter "ate" - with patch applied $ echo "rate 0" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Invalid argument $ grep "Result:" /proc/net/pktgen/lo\@0 Result: Idle Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v2 -> v3: - no changes Changes v1 -> v2: - new patch --- net/core/pktgen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 28dbbf70e142..75c7511bf492 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1115,7 +1115,7 @@ static ssize_t pktgen_if_write(struct file *file, i += len; if (!value) - return len; + return -EINVAL; pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value; if (debug) pr_info("Delay set at: %llu ns\n", pkt_dev->delay); From patchwork Mon Feb 3 17:01:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957845 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A29620B7EF; Mon, 3 Feb 2025 17:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602156; cv=none; b=Gpu2gc8Wjq68fkNWYIa5G+XkGlI4fkeKDpz8Sq8ljPT/ybQ1PaOi1+CBP+oQLrGzryXH4BxC0tSfd1LQjjJH9AAzFlDyNYjiRT0bLg/8Q17IO6XLRKB1B9lAmLxe1iP4Qk/EKFH/qI9I8FFkAO0cM8LdEuf2k0WxbYDdXoOrAFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602156; c=relaxed/simple; bh=+5jShTae/ZxTL8acCh1/3qYlsuDGOSQxtQIi9vyhqgA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jfvg1nlxS+PPuUEJpqD0xZ+Ep+7NFy7vuNajPxMXq0eZid15X5GOvo7aEU2fTfao7BBUXMEPxP1JZ30Uw/ghyBuiJPnZ7KBM7hZ9lynbg7LThC8QAbyYlKSP8gsjz3Wr8Qkd3T54lcPDOpPx8Nvj5KeHJx228loGD/rh7y/B0L8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=GAfAJdAj; arc=none smtp.client-ip=212.227.15.18 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="GAfAJdAj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602150; x=1739206950; i=ps.report@gmx.net; bh=+5jShTae/ZxTL8acCh1/3qYlsuDGOSQxtQIi9vyhqgA=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=GAfAJdAjgMAZnA4JDJp9jl1mMd/rLGEf77qtb2+rVq7CNSgPTaSA6pY7679PHXDP rZfQaCrOTE/5HpofOcSbU9SQMoReOvaOunpXwRqY1oYG0yMBbmkPKZ4lLdA1f/kHD 67OAXxJltpLVZez4iZczbTHTbZ1QKpRs7jyIKcXa1XGXXBFakLxGDAYrfj7YhmebQ 8a6zOPxDWvjfEhCWijADS7d2MqZBZAQmGEZDvt8jlzVAIGaZqcSCtJIlHXkLwTrRE Qwl2ovtu6OqfRy6gE0UdMx1ERnl8KNQ857MIg7IulqyaaLjF8C+7wsgrVs/xHS7Dm 95/IoAHOf65WhBGzMg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mnps0-1t3xvj3Dhq-00bSm2; Mon, 03 Feb 2025 18:02:29 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 05/10] net: pktgen: fix 'ratep 0' error handling (return -EINVAL) Date: Mon, 3 Feb 2025 18:01:56 +0100 Message-ID: <20250203170201.1661703-6-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:r+HtfDgkwVIrcyySDucUmq22DfL5nhLmejTokGW04e+Ja5dvMGr 9M7rpYOWCxBMawfZCC/S6xuA9MkIEaKCyhtUU+g/OALNwQvL2RXFl9k/eDBMM3YFvyukSPb hd25nyIJt8pSx3a8nuMLZykpUjbuKOn5EwUb+IDu/290u+DijNdmsHOyGKgd4QwXAcPaFY/ izbrxfIlDfBR5hePwHmAg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:bgEDliBuouU=;xWM7m9lmKJ5GwTkghKegH3n7nRU XALvkfMXQ7cWFLQoUPWvZnUbSvV1J/UYuyjaD+MFZbvt3/buzb+2HySnT42nsBA9Oer6WmfZu VQ94WBei2aeNqj2vod9K/QUOd84O0F7t2deT1F2JzrO2qZpF0Y1yuhI2aY99Bq7yY8BT69EuB ph1Lm4Ih1fa8nKhJ3C6q+mHV2szppptyaoi5XS91OwPJ7CoQPQZ5xq/eo0PenSqyTxl+e0EBz f+UXaSZz+2xw1ineENOoPk+XJpwtI37SKYaqT33HP2Hn5wG1HQIBw7EwS9Ljql8CTaxVnaoYN VHJNyO4T5PNZ7ceNQ4+TfkxsiWXViPgxjElWnIbLJhu3rMsrkTudLeyQCs0w9r74NQSTHfn8M Uc3L7s7347rbXzqISJNgQWEibf8F7jD900m1bCRS2HOTRur4nF/A3rOuCWzsviv9buxJDdoo3 HiFpL0mMgNCEABDOelbrsXWCVIMR+P0Thz886D7a0VJWqV7b2XCurJm1f4jK7YmU8zoVFD61r 8JnZkApHwmVTrk0OE7USGcs8j5OYLAMmnvEVNUc4wPZBxAovz6DcCLvaoADqeSi5mIdzD5ozl 0ArlbwfcJc+erxVXWbAy2NbKEAd+VgECY5YKkT580Ei9li4oeUq4gWzl7RN1w9xzpNI6OmVRW G90BBfwAxzZTHXOYbT3Tb22sxPGvqmO+nQr2nNjcxKcX0PLjy/+XSPVDz9ug+egEDki7TH7IS T6iyH24uyFu8m8TasLZzxiUQFpVKtUYA+KybIM4RFZqw7m9L33ueb7EqxVonKAHdjLvVPyfZW 2T9ZcrzPSOpBu8/fPDxmw29Liq20NFMn/Ao8SpOSbT8wkd2uVnAe2oaLf5i0YptFAkGs9mCq0 TM7fCmfYEUQSfvljXLQN5OzTfOGv9SY9MDwvb1hgGBAYcCOn6rt6P27aglztY3fGnrapQZLCH hGBeMwDtcONhgabThNpHf+Jw/RWXezlgHcrhM5WnY5sm7TLGS/SmkeY9D4rbZwJtaVVFcvERb XLRuqnECv5uTv+MQH5C4ps5M49iY+8HMP6+sNMPPDdkS8GXwtE+iBozS8hChGSHZR5qaWF7Ec oqg1lZNg+Gw4pjTm/0hClHM+j/vumUq92mTj/WRIq/b5dAiHYKM+SLjT2bWOgPlWvpWsZsrVW BcLn2VzhrV4k1QLtuYM9aKmSI2hQHKbPsP5F/kS4toXMi1NFsxPnNzVmCTZHc+eU/cDS0c3Tt Gmpiy7r+Y5193GWNRW7oJQ8ThcWkxPUqLF6e+4QDCA2QdOmY3GM2yYd6j1LADlizSke1qKU5K 7es8VoX90Ziohy5V2qpzyfLsK91rGE7xf7+J5Yjq2FLlIE= Given an invalid 'ratep' command e.g. 'ratep 0' the return value is '1', leading to the following misleading output: - the good case $ echo "ratep 100" > /proc/net/pktgen/lo\@0 $ grep "Result:" /proc/net/pktgen/lo\@0 Result: OK: ratep=100 - the bad case (before the patch) $ echo "ratep 0" > /proc/net/pktgen/lo\@0" -bash: echo: write error: Invalid argument $ grep "Result:" /proc/net/pktgen/lo\@0 Result: No such parameter "atep" - with patch applied $ echo "ratep 0" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Invalid argument $ grep "Result:" /proc/net/pktgen/lo\@0 Result: Idle Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v2 -> v3: - no changes Changes v1 -> v2: - new patch --- net/core/pktgen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 75c7511bf492..c8a5b4d17407 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1130,7 +1130,7 @@ static ssize_t pktgen_if_write(struct file *file, i += len; if (!value) - return len; + return -EINVAL; pkt_dev->delay = NSEC_PER_SEC/value; if (debug) pr_info("Delay set at: %llu ns\n", pkt_dev->delay); From patchwork Mon Feb 3 17:01:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957851 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E9D420F06C; Mon, 3 Feb 2025 17:02:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602166; cv=none; b=ococLst5eWZSR8k4nwryu1f1RhUdfTfsvS1oBOyWc0ZZMfjTO9IrvS+VnvUWyUHQzZli0EWbWVC1gHjPyDaVJprp0LcJ66svQZgxjGHAiJxJDk6He29wF10ikLV4ptE2MTI5QjWCkGNBeePqFS2UR71kSjms6MI2mPWY0J3PIZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602166; c=relaxed/simple; bh=XQcXY8W5zssQPj2vDW6XqskIpgYXaRZL4eRGC+4TkVU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KjvRPamQHEwB5/uYkiWIkiUeZkQWBdpHh4CRAb9vwe8KJ2qlPRtUVp4hafIl3lXxJqApu02IPkboQxaxr/prqy3nR0qSpAkWlX44OQutMFHwffa49nGWMnuAlAN+u2UQvr3u31ZCzHRyHlfVyNbbIzAsqldFfE3Pw5OjqB4vdRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=PsWZuBTq; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="PsWZuBTq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602150; x=1739206950; i=ps.report@gmx.net; bh=XQcXY8W5zssQPj2vDW6XqskIpgYXaRZL4eRGC+4TkVU=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=PsWZuBTqSOm4c4wiwI9XfNfp7M1TqbjYw0uGdTiBvFIDo2+YdYeccVbYhbkKW0QS fFlDVreNAxdRyDqgVtHDN4LkHdi2a1jfuG1dYx4yzrKShoN+7bFwV8fDO+A9DqtqE xzNjGGSJLmwe1PyOzzyoqA6ZEsZtgih+QEk45r+JfitvzUcF78XbBs1Ksi2TarY48 Jo9b+wlozNRouKlAqy7KQ7L2aRSCZYgE+PgIv5svuknRRF8kYOGvcI2z/t2Ed7v4y wXhtFnK5Vfbn2/MUdKIWQrbQsUFxc4SvM8maz+OnMc3ycs5L3E+uMUa+dEh/iRjV5 rEILd3XnQLRH/D6+Yw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N5VHM-1tLUoW0Rpq-00t89K; Mon, 03 Feb 2025 18:02:30 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 06/10] net: pktgen: fix ctrl interface command parsing Date: Mon, 3 Feb 2025 18:01:57 +0100 Message-ID: <20250203170201.1661703-7-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:wtL+52vE8hHckBdnXpaZb6Eriegov/kJm2yLUR6acMUq7GQ8Dil IBtMlrMWXi2nqMnM7thqErv8MEQMt2lhdHRbNmIMxROSaomLlz+azyHRfqkhh2Li3oz05WG znr+DdqZVav604WevHEPJS+W8hxJBnhcXUinaD9/q8NAjTzoUx8KyWClmwOwiOioNmvs3uD 3IhWGG/qS9Wpntc0HjP2A== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:IED8DqB2qqk=;bsP+S726eAr85DsxAcmpbhuYdMg CXG24Ah6QCs2/cqm89PSI2NuHKUV7Wf9DADkEZVe3QlJ8sSJsGsR8aT/R8SiT3Lbg7Hx6Y93J 2WxcMTErVBuhh+5btjNcUS7rjDkmQHBiugJn2ePjyOnZML2NlhqTavpOJwVBeNDOlrxlS1EN7 Iwtex4FaskhBXcOcm2tt/E5MWwFiCh9qNzLlowwa8IIs+sBItJEi40wvWP9Wji0Cm/C2OYfWs 9pM2+SgyhTVSfrGXgImo/bLWugjyAZomD7UU1K9G8yRWOeZvFM2f8+KmjP0kz/Xo4PTfzcVC9 tXTltYgoyeOnM2P5d8wrmwHUIC9t2CM2s2tvFeeDGEF4em0ylgxUIMFfcrdkc84Z1NSUEI355 VFDmvwrHR0prLZHT6M8WDzkhwPCDaZ4krrldRBjyZDuy4ttdCpHH45nJU1TOjhcmK+gCDAmLO pF97dzvjbkdJKsx8FnbWWJQCVfutE2MXETlOSJNDThTXhUmTxrC4mB9XhBKMBYvbNBHl55fla Cv7cGeJGly9Mqfo7EavcNzAYHV9YjQTVxfaY3k8JxcrbErPcEuCpMdzrdLuDZFzAMSd1e+FWt s8F2UEBC9CMoGz/2AY9Zs7GOD+ha3yKuLdLMsbfW5/mXneePLm/J1BuPObNk08d9vfz0zPAGU /Cd77Zy13g2F97pkPANQxKVg2+SNjdTGpth3jYmMlmYTIFcABlFwmfeLCnnXZqD6fGcJrfZno Z1RuH+tHxxWIJRN6lWRCU2aGTyaW9+vnEXzQH48ISPSCSdNpy0+obuW75lNQRbDAmKGhl357H +9bpJ3IvPTBIPW3OVlX3gWp5tjpdyPMigQAy5fsSwnS0Rk4UTUXAX5q2wxeyYnPqyEBJ2nz4k 0YIpF3ZiJJfY2ejussFA5PKAvuj0xeB+QckOrvhhj5C5spA3pIUmr/lJg1wvGrHKrcr/rMt5r WuyWZ+98u3MzFhipIkHaIEfOi6YFMiwQA+oa6i6OKTLKDCIg5iyithfWETj2AeoYznNqvhFv3 lO0jaVsa+alCNdH6G99ECAmky2ifJIspVpYF+khPsXpiJOP2mZKq6zi0P+e8NC/ox1AZUvSot G3RDid49afaNcJjUKCLRiuCyqZlqD/pMtojffq1zB6P7Kfz03Ze6bbxZsHVJHzcJhQbpRHUcB fKZoN1wvp+/vUa2mImUkB29H61MUAMpIhIf9rnJt+qs+4AZ1YBvnKO1SYiR/DlVH5MlemEwWJ eE7oapPUEBYNSKq/dU2ln2TOT1yXZmWBqHczRBF7yTl3XIjvYcvhYCuLaykM/NBVKrSuJ7HB4 GXenAwagGo9xhv8edp2o9qzybPGqlLmjAvImlNxW8TX0JA= Enable command writing without trailing '\n': - the good case $ echo "reset" > /proc/net/pktgen/pgctrl - the bad case (before the patch) $ echo -n "reset" > /proc/net/pktgen/pgctrl -bash: echo: write error: Invalid argument - with patch applied $ echo -n "reset" > /proc/net/pktgen/pgctrl Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v2 -> v3: - new patch --- net/core/pktgen.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index c8a5b4d17407..f6e35ba035c7 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -517,21 +517,23 @@ static ssize_t pgctrl_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { char data[128]; + size_t max; struct pktgen_net *pn = net_generic(current->nsproxy->net_ns, pg_net_id); if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (count == 0) + if (count < 1) return -EINVAL; - if (count > sizeof(data)) - count = sizeof(data); - - if (copy_from_user(data, buf, count)) + max = min(count, sizeof(data) - 1); + if (copy_from_user(data, buf, max)) return -EFAULT; - data[count - 1] = 0; /* Strip trailing '\n' and terminate string */ + if (data[max - 1] == '\n') + data[max - 1] = 0; /* strip trailing '\n', terminate string */ + else + data[max] = 0; /* terminate string */ if (!strcmp(data, "stop")) pktgen_stop_all_threads(pn); From patchwork Mon Feb 3 17:01:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957853 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A2EC20CCC5; Mon, 3 Feb 2025 17:02:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602172; cv=none; b=R0KCojyib1mZW1cNp1KukjwiYxI3dw8Gd2yYDOnb7Y8E27Ri8IdJ6ETF/ZTLrUGVKOFRXGL8US+Ame6JAQnFN7kO8pDgvtEHxJNwBNFLsQ9bLlc5dXGU8QXay7O5G/VOhKCYFdwXDwqXK8kIS85EYwl7g7mQvdwlD3+arMnGOlE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602172; c=relaxed/simple; bh=fH7kVesQm/RvIe2gp8YNloYPh2xmhW4qa1XSxX0eyWU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=swsvDwmV8oObY9CintamN4AFOynEqlQYDLs89un0anfN/x5mO8RnmM/gkSGypo2SX4YCq2l0OH4OKdGlv5Ad60AsjnAtO+UEysmyOnGEmoS6nwYWBRLkylXALyV5apSvCY5KUnMOMKs+gRXORTBJQTKKea9dxZTRhfaqgqLuY0s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=KNGxwasK; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="KNGxwasK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602150; x=1739206950; i=ps.report@gmx.net; bh=fH7kVesQm/RvIe2gp8YNloYPh2xmhW4qa1XSxX0eyWU=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=KNGxwasKsGNXAs1srbJhJW3jBw+8LzMQKE+fd+q/nk5C0dyVCVWBweMm0Y+w0DNH aPgg/WzIuPZ/C+ZtV6FncWh5bM8uOtv4kYZm6f3g9NiiIKCTqn03q6QMsLOKDhMBP /7cwsYOAkLB0h+lp4V4rd+U7ataCtsmJ2FPr3DWzaXIDcmwzny4yFZqBtkXpD3Umj 85H+EXVyYYH0ShLjWmcKJFLf13OhkfaNkBO4W4lS1nnqh+p40eIB13XjhUvIy7eSk /5uJH0MOx7UNAIDEml5wnWkqKuiBZwDfLuFu9WMIxHqUgrm6X+juc/8WKCEIyp/dr 0iGyIsvlaBsV7A3Eqg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M7sHo-1tjvWe22s6-008xVK; Mon, 03 Feb 2025 18:02:30 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 07/10] net: pktgen: fix access outside of user given buffer in pktgen_thread_write() Date: Mon, 3 Feb 2025 18:01:58 +0100 Message-ID: <20250203170201.1661703-8-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:38/oIZRTsFNbpJ/9sF5RfMdMc/V6FZRzbpAwRPEU6smRIMUWnRq jHZ0TckZH0eNGHPRM1mZE/U7oxSe/44owZSVqJacF44ZAXxa7N9aQR4yDvmce5MLF9/QZZe STsHumpoIO4rrqMivfQ+xtCEwxD6lG2UDCPyhKtVtTD66GesIx/Wr4lmidRbqVUdILpN5NX qrZRXjzUqEKoLVnZOgFIg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:chBZIKyyCj0=;G1yDz/PWnuEy4blsr6bziIwRqZG yrWOX3hkpY/qGbrB0JSREOnuLMMNJn2MeVimSoVg5I9jIS2WLZ/cOvU8z1+lT35U39UfKkqWZ Iba6pDKjlxX5vHnLyMb8yk3C2sBBnab0dyS+qbXj5/px0Cq29lIFfsnOVDA6F+SDrFt+vGNCG hn4d0/aN7IzzleS7zZyyHIW7jBVAmt23dvbAP7ZTFdRn0lvS3CV3yH3zcBFqht2Q2UVL9wiZ8 8v3M4UFg2fRuiGXinWeIFl3wmXR37uTlXAD58qdGggzq3O0etW1LW91CVPEFR6IOK2bDefu6c 9NqRS5vCm8x7Mulf2UIfqdn89+hXy8ASu8Up5pUCN4hkDcAJV0Cki45LlYT8DYvKnw2uDKcYJ 8i92VdJw8P17O1zaVf3OuRxTrj+7+oP7L3ig+IuHWE2CjX7ze/nfjNRSNZIczpRg3JmBPR5Mm KQVeLOH02Y84FkFJaiYN6ATCoCH295xhxlkndDQx8FsiYQYbArpjJ28S3gJHxQRp4yiHvhmXS g6E+41A/JED5J9JDfVWeqfuhH5su8mnsT89Ok6pu5p4QGbC38Ze3GG2TRVvYDW5hqT2xAOgAw MKBVrUIyVhK0F5aTCGKm4FyzRmOOiCb8r1lXm6zBBsxYrMzJ8LV9RVcl2bDCMxzvqz0qlSckt Aayez4ERivIRIArDerZxggc767CD1bLFwXrAsY1CzATf03dMLHlh/r+hdARaDWAavpshYFxSO +qAyf12dQy3NWEAnu1+AycuKTIaJQIgKURZLr2/iG2KE6MGitzVkhuZeeDYWC9ShKj2sWq3KZ Q++LONEYVZ4OGh8CILqoDvY2yldjW0dnOUuPMbLeEpMU/djGQQe/cBWT85X0PJ8dMQRZ3ZgOy MAfx+uPERO4XO1MTFxvmSBPVhZnxmQ7Bk5K0Ytb/HGX+HlXcKv+jyVFHebZh3U/FeygKVNqBh 3oxB2qeKQRxg70uTuYZFMHl6J7wy4C6jX3v5b+T9dg+tirKfYfEKQ5Y67D5kUTH2MUoBvs/qC g+Re6MuD/B8K8GR+AiBqn74oXby79ObUiuSrIvxAxWuHO471rcg2nzYMFdKg0T2e8a8xhJ91t v4b6/3JtJSkKURlShGKB13Kh9KmPA38xBvGL1rtcDskU8c+D1ZA/iu+2YR2SsHWfsMCE4l/Yq GMf6yCONeipX+8xyEpWWVdPDF/e3WX5CdwifK7TXHHubqgIeJO3vJqZYYs1p/HlIAGjr+TznT jSHmC7QMjgJxHDlp52INBDeTZnn7NQZZ5oVI2FWHRBwgXvYaSa54MO8qTU4UkPZRNCi8w1itD CyNjfMnCzr/397yoYqiEWLAFuH5KHL/LPrbGOIJZ2cI1GQ= Honour the user given buffer size for the strn_len() calls (otherwise strn_len() will access memory outside of the user given buffer). Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v2 -> v3: - no changes Changes v1 -> v2: - no changes --- net/core/pktgen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index f6e35ba035c7..55064713223e 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1900,8 +1900,8 @@ static ssize_t pktgen_thread_write(struct file *file, i = len; /* Read variable name */ - - len = strn_len(&user_buffer[i], sizeof(name) - 1); + max = min(sizeof(name) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1931,7 +1931,8 @@ static ssize_t pktgen_thread_write(struct file *file, if (!strcmp(name, "add_device")) { char f[32]; memset(f, 0, 32); - len = strn_len(&user_buffer[i], sizeof(f) - 1); + max = min(sizeof(f) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) { ret = len; goto out; From patchwork Mon Feb 3 17:01:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957850 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC56F20E6F9; Mon, 3 Feb 2025 17:02:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602164; cv=none; b=cakQdl8usZCm+L1kZkiABwgPYAqeplWBbUBHRYreTlhIoQbNm5bcivDXBuOZS+JBgrGIRRNoauazKJ3Qlj+WLXiUAlcYA4lKwliH/rafPE/AmLErm0GbkwH4h0eHIdpuwSsCKWcw/0lT952bckCpRH9IL+YC1gm7hB9OMkFh914= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602164; c=relaxed/simple; bh=gIsg7jK8C+197Jjkn3kn9vrIIwtpeLi9nhpytYpBq7A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GbKKzF3uIUE+SFwLNxuNZJIcOeq5KG5XasDsnIkok20otcwDT5gcI5w2pGlvMNse0dmrK+IXDQLDa1pir/Q6F9g7P4XPx1V4gf+35n+V1AJDAJt/HZpXhQF/K27m0Aktuu1A8iaXaNqJxlwk9wsjr55lvDr1VyG62x3uaGOuPvM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=dnaNJKJj; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="dnaNJKJj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602151; x=1739206951; i=ps.report@gmx.net; bh=gIsg7jK8C+197Jjkn3kn9vrIIwtpeLi9nhpytYpBq7A=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=dnaNJKJjPflgcIY6qPDywIX39PU7GOBkh6+wLs1qRXvto6Jw0hgonf8iSrJk79Lb FVIKr6P6AT1W06OAau0yj40EabFD/boZsqNPwJUH+lOF0XSqEtmzX5tVfiqKnHUHY JGj+nO30uW8GVY7mG93Dgcy8UN1k4KTuyoOxNWTcPYRhWNueChqFLXqGj5KC/EOhe XGSXICBwAKYWl9h8vGJpTUOEIMWlV+STSDMP4B2MawbDL+mhsy4pdvTInlGQVVPDk 0R19rIMgz6FL+5Vdh9okablmtL2VP0vyjDdrb8yvFbPhbAfqhnf6CJ+KlMoVBFJsj x5u2V8FBU8kHhkKGfw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MBm1e-1tZSzS3WFY-008Qt2; Mon, 03 Feb 2025 18:02:30 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 08/10] net: pktgen: fix access outside of user given buffer in pktgen_if_write() Date: Mon, 3 Feb 2025 18:01:59 +0100 Message-ID: <20250203170201.1661703-9-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:TZvGL8RuRkZXzSs4WSna35w8tmgyDd7Brzv6k66bZbJpUrr05n9 gqcUOTM3x1Lfza7+sojZKEjdFfCCBUY1vQsomDigU+261m38GircsHTmUczdI4xJHOIC7Y2 L5A7mKsD4VhuH93H2TzlbSHdDs8KTLQrMfhqz+lNUXcj8Ij+y2JZbsjYIcsclqGkca86luI ZvxuLJjptHiR2nYvl+zkA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:YputBL6VmZg=;qVYO8TSHMJ4+S0Rw/kVXCdnBu7c Nu1GhTA9dZ7tQfnfGy0Hl83LTd3t65vmMesO7jJr4E300R8Oi+KomouWLRUOKaAEY5VEm2qzz bPgrhL2kv3kPZJS+3+qazkLomBZyaK31dqQCIox4dV4YSsuIfs8Xx07eoIaRm8Xl7LcZuQSE8 QVDpquEM2ZVVC4EVsJDRCF0cxniy38m0CSqXwHATzhp9oSGTKimQBvbh+liKb+t9X03q3Uh0k s3wzfffFf0USYAGFvoPM6CZ36CsI2ZcWsKgauaDJRotg6CMu2tYVG5VLTfdrm/3Q+G1hLt63p 3s1Wxzt92UstlCXSBCYf96pD463VbLp9YUcEUYSyBy+Exop5qPxHwJ8Lvikoef2k6qhmhsI/W R2LEvtX3JcAsartFtpZ011J11I7uF++FjMyBKhqFBCgcWxC4GL018SX7ZJNkJ5LEmxDXQeP8Y FCAPmXFknQr6qYsc+G58rUI6muU0N6uHjZbkmx7knGIr+I7TF5Q46X5FNiG5hBFJieHswWvbt PYykoST5Fx3eLMwG7Y0rFWfsi4GvWi57QmHZT0ByE6C8sFvJK/XBwOj8CWAN5jO8+TUgTUOlh pf4keD4F/K0uBqqClToZEtoU4uqJyt8RnXa+bNBrI8twCQGfvbFwob6bZWq3ie2974dx3VpbS LdNJc7clObUfcyepKQGuJsHt5zQYwHv5GZcAexbrG8Z/G3S7J6Zo3dH2gG4ag879Lu1nt5wsp XVGg5VUyK5I/dhnSk1hnKSzZcW7X3FOxycZDTooYFcB+ssGiB5lwvzfJ2opOfbbrPlF5os/JV C3QoQa+829ZywQR9/Y1agx8xtR/kXFrUlTus1PZFpNgyM4CTrCVFA9+aLcSP9GYhIm9HaEDz0 E8WBqoZTdyh8PJ6F76lus5ubP6m4lDQcxUaj37xBPvbPjUKo0NgSw0CStFGBGzDr6JmdX01ue ci8a16YN41F6LsmCJisV2EF4Z/nI2JMAYyJd4A3WbS75zRxOEAx49++I8u1A7fwVixKMSMR+W GwEpyglgogCOPzFVIao1jWmcR1349bIEp+6ee98L67I2zcMTWKjv5Af2t6FbZAaBS70Ujba5p kELZCd3Xtqk6hWE4x9SpGpwFEqIhsUvlTZOxmqv80ugVvHKl7uHlheSouLmyq3ePXnDt+ACdB wZmTxZ2SnFuUuZPWCsltTP4O7iRbC+H0FJJn5xd/rnoCcpTIPZC83NArrNQPnEK3i4O7OaEOv vHWkPoGLejdYfoHktAdr9QYxbmCnDYSHi991dB8TM1MbQXT/lkyNAcVoMbUQMjsCjSmu4EuJJ aQ2Z818vRCqAmiyckfgjX5jKfIknabES+m6bMpo5TzPX80= Honour the user given buffer size for the hex32_arg(), num_arg(), strn_len(), get_imix_entries() and get_labels() calls (otherwise they will access memory outside of the user given buffer). In hex32_arg(), num_arg(), strn_len() error out in case no characters are available (maxlen = 0), in num_arg() additional error out in case no valid character is parsed. In get_labels() additional enable parsing labels up to MAX_IMIX_ENTRIES instead of (MAX_IMIX_ENTRIES - 1). Additional remove some superfluous variable initializing and align some variable declarations to the most common pattern. Signed-off-by: Peter Seiderer --- Changes v2 -> v3: - no changes Changes v1 -> v2: - additional fix get_imix_entries() and get_labels() --- net/core/pktgen.c | 211 ++++++++++++++++++++++++++++++---------------- 1 file changed, 139 insertions(+), 72 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 55064713223e..6675375c052c 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -752,6 +752,9 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, int i = 0; *num = 0; + if (!maxlen) + return -EINVAL; + for (; i < maxlen; i++) { int value; char c; @@ -799,6 +802,9 @@ static long num_arg(const char __user *user_buffer, unsigned long maxlen, int i; *num = 0; + if (!maxlen) + return -EINVAL; + for (i = 0; i < maxlen; i++) { char c; if (get_user(c, &user_buffer[i])) @@ -806,6 +812,9 @@ static long num_arg(const char __user *user_buffer, unsigned long maxlen, if ((c >= '0') && (c <= '9')) { *num *= 10; *num += c - '0'; + } else if (i == 0) { + // no valid character parsed, error out + return -EINVAL; } else break; } @@ -816,6 +825,9 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) { int i; + if (!maxlen) + return -EINVAL; + for (i = 0; i < maxlen; i++) { char c; if (get_user(c, &user_buffer[i])) @@ -842,11 +854,10 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) * "size1,weight_1 size2,weight_2 ... size_n,weight_n" for example. */ static ssize_t get_imix_entries(const char __user *buffer, + unsigned int maxlen, struct pktgen_dev *pkt_dev) { - const int max_digits = 10; - int i = 0; - long len; + int i = 0, max, len; char c; pkt_dev->n_imix_entries = 0; @@ -858,10 +869,13 @@ static ssize_t get_imix_entries(const char __user *buffer, if (pkt_dev->n_imix_entries >= MAX_IMIX_ENTRIES) return -E2BIG; - len = num_arg(&buffer[i], max_digits, &size); + max = min(10, maxlen - i); + len = num_arg(&buffer[i], max, &size); if (len < 0) return len; i += len; + if (i >= maxlen) + return -EINVAL; if (get_user(c, &buffer[i])) return -EFAULT; /* Check for comma between size_i and weight_i */ @@ -872,7 +886,8 @@ static ssize_t get_imix_entries(const char __user *buffer, if (size < 14 + 20 + 8) size = 14 + 20 + 8; - len = num_arg(&buffer[i], max_digits, &weight); + max = min(10, maxlen - i); + len = num_arg(&buffer[i], max, &weight); if (len < 0) return len; if (weight <= 0) @@ -882,39 +897,45 @@ static ssize_t get_imix_entries(const char __user *buffer, pkt_dev->imix_entries[pkt_dev->n_imix_entries].weight = weight; i += len; + pkt_dev->n_imix_entries++; + + if (i >= maxlen) + break; if (get_user(c, &buffer[i])) return -EFAULT; - i++; - pkt_dev->n_imix_entries++; } while (c == ' '); return i; } -static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) +static ssize_t get_labels(const char __user *buffer, int maxlen, struct pktgen_dev *pkt_dev) { unsigned int n = 0; char c; - ssize_t i = 0; - int len; + int i = 0, max, len; pkt_dev->nr_labels = 0; do { __u32 tmp; - len = hex32_arg(&buffer[i], 8, &tmp); + + if (n >= MAX_MPLS_LABELS) + return -E2BIG; + + max = min(8, maxlen - i); + len = hex32_arg(&buffer[i], max, &tmp); if (len <= 0) return len; pkt_dev->labels[n] = htonl(tmp); if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM) pkt_dev->flags |= F_MPLS_RND; i += len; + n++; + if (i >= maxlen) + break; if (get_user(c, &buffer[i])) return -EFAULT; i++; - n++; - if (n >= MAX_MPLS_LABELS) - return -E2BIG; } while (c == ','); pkt_dev->nr_labels = n; @@ -960,7 +981,6 @@ static ssize_t pktgen_if_write(struct file *file, char name[16], valstr[32]; unsigned long value = 0; char *pg_result = NULL; - int tmp = 0; char buf[128]; pg_result = &(pkt_dev->result[0]); @@ -970,17 +990,16 @@ static ssize_t pktgen_if_write(struct file *file, return -EINVAL; } - max = count; - tmp = count_trail_chars(user_buffer, max); - if (tmp < 0) { + len = count_trail_chars(user_buffer, count); + if (len < 0) { pr_warn("illegal format\n"); - return tmp; + return len; } - i = tmp; + i = len; /* Read variable name */ - - len = strn_len(&user_buffer[i], sizeof(name) - 1); + max = min(sizeof(name) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1008,7 +1027,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "min_pkt_size")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1025,7 +1045,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "max_pkt_size")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1044,7 +1065,8 @@ static ssize_t pktgen_if_write(struct file *file, /* Shortcut for min = max */ if (!strcmp(name, "pkt_size")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1064,7 +1086,8 @@ static ssize_t pktgen_if_write(struct file *file, if (pkt_dev->clone_skb > 0) return -EINVAL; - len = get_imix_entries(&user_buffer[i], pkt_dev); + max = count - i; + len = get_imix_entries(&user_buffer[i], max, pkt_dev); if (len < 0) return len; @@ -1075,7 +1098,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "debug")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1086,7 +1110,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "frags")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1096,7 +1121,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "delay")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1111,7 +1137,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "rate")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1126,7 +1153,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "ratep")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1141,7 +1169,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_src_min")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1154,7 +1183,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_dst_min")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1167,7 +1197,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_src_max")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1180,7 +1211,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_dst_max")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1193,7 +1225,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "clone_skb")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; /* clone_skb is not supported for netif_receive xmit_mode and @@ -1214,7 +1247,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "count")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1225,7 +1259,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_mac_count")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1239,7 +1274,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_mac_count")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1253,7 +1289,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "burst")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1272,7 +1309,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "node")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1293,11 +1331,12 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "xmit_mode")) { char f[32]; - memset(f, 0, 32); - len = strn_len(&user_buffer[i], sizeof(f) - 1); + max = min(sizeof(f) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; + memset(f, 0, sizeof(f)); if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; i += len; @@ -1333,11 +1372,12 @@ static ssize_t pktgen_if_write(struct file *file, char f[32]; char *end; - memset(f, 0, 32); - len = strn_len(&user_buffer[i], sizeof(f) - 1); + max = min(sizeof(f) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; + memset(f, 0, 32); if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; i += len; @@ -1382,7 +1422,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); + max = min(sizeof(pkt_dev->dst_min) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1402,7 +1443,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_max")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); + max = min(sizeof(pkt_dev->dst_max) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1422,7 +1464,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst6")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1445,7 +1488,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst6_min")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1467,7 +1511,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst6_max")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1488,7 +1533,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src6")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1511,7 +1557,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_min")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); + max = min(sizeof(pkt_dev->src_min) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1531,7 +1578,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_max")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); + max = min(sizeof(pkt_dev->src_max) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1551,7 +1599,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_mac")) { - len = strn_len(&user_buffer[i], sizeof(valstr) - 1); + max = min(sizeof(valstr) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1568,7 +1617,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_mac")) { - len = strn_len(&user_buffer[i], sizeof(valstr) - 1); + max = min(sizeof(valstr) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1592,7 +1642,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "flows")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1606,7 +1657,8 @@ static ssize_t pktgen_if_write(struct file *file, } #ifdef CONFIG_XFRM if (!strcmp(name, "spi")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1617,7 +1669,8 @@ static ssize_t pktgen_if_write(struct file *file, } #endif if (!strcmp(name, "flowlen")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1628,7 +1681,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "queue_map_min")) { - len = num_arg(&user_buffer[i], 5, &value); + max = min(5, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1639,7 +1693,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "queue_map_max")) { - len = num_arg(&user_buffer[i], 5, &value); + max = min(5, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1652,7 +1707,8 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "mpls")) { unsigned int n, cnt; - len = get_labels(&user_buffer[i], pkt_dev); + max = count - i; + len = get_labels(&user_buffer[i], max, pkt_dev); if (len < 0) return len; i += len; @@ -1673,7 +1729,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "vlan_id")) { - len = num_arg(&user_buffer[i], 4, &value); + max = min(4, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1700,7 +1757,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "vlan_p")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1715,7 +1773,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "vlan_cfi")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1730,7 +1789,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "svlan_id")) { - len = num_arg(&user_buffer[i], 4, &value); + max = min(4, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1757,7 +1817,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "svlan_p")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1772,7 +1833,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "svlan_cfi")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1787,8 +1849,10 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "tos")) { - __u32 tmp_value = 0; - len = hex32_arg(&user_buffer[i], 2, &tmp_value); + __u32 tmp_value; + + max = min(2, count - i); + len = hex32_arg(&user_buffer[i], max, &tmp_value); if (len < 0) return len; @@ -1803,8 +1867,10 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "traffic_class")) { - __u32 tmp_value = 0; - len = hex32_arg(&user_buffer[i], 2, &tmp_value); + __u32 tmp_value; + + max = min(2, count - i); + len = hex32_arg(&user_buffer[i], max, &tmp_value); if (len < 0) return len; @@ -1819,7 +1885,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "skb_priority")) { - len = num_arg(&user_buffer[i], 9, &value); + max = min(9, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; From patchwork Mon Feb 3 17:02:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957849 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10D3820E702; Mon, 3 Feb 2025 17:02:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602164; cv=none; b=UcwvMEyo6coM4KYqvhLxqdxV0fm1E2EowCNMkLJ7ECo1yoN2xfsN8l7sVXeVbvOpz/BMKniEi93G8PyTH9DvHQ4vVc4vCU1iajAk9mr8vglSF8O13DeNLvIcX6No4nxP2ck9dnYjv/cs1KogWJ9LzIZiqvSeW2o2KdTYJ6CWdN8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602164; c=relaxed/simple; bh=VKeJPykxZdE/Mr4hHDair/L6boyyhsX+C2ZqoZQ8AAA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XY3XhMfwdZTY5M0X6mcQkKtpMNBoFrmwnqL0F6GoAXS1bB1DTmMvQ/uEKPSgLjliTjSbn4OGZc6smEt3zk9dQ5ptuYKOT0jnj+YmCxnexW8AGdtUx8u3T6lPj3pdasad2qTpa0SucU+dl7dwsv4OJlvhuvXHtQBRcwYPsh2uotY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=mH8PohwQ; arc=none smtp.client-ip=212.227.15.18 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="mH8PohwQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602151; x=1739206951; i=ps.report@gmx.net; bh=VKeJPykxZdE/Mr4hHDair/L6boyyhsX+C2ZqoZQ8AAA=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=mH8PohwQjWtTFL9DXDkG6aZEwgcVV0HgV0ovZpn7+Y7a0Mw9RvEn/Y11tJDNvD+n Yxse7aFrxOxgLDKPbz1k4ZqQSCIvzaJ5POoU++MxtlPBDO/xWt4E2YUJ/3KVrd5GO FnXfGTUqh3EI4x6+yKNT0JU5wBRI7R8Np/hEOwaQK5bdaNLtFK6WLjqWIyiH2Gpwf KYnpmMLjF8d3Oaz3tprqY25RKrsTr9SyMpHECNIrsBZi9qw6tqUaqrpSJGow830pI smfVsOjBMLawLfzDo8LmYt7ltEXI6awXIsdOYks/sY5B38fVOK/yKvC81NmXhwBTM JNp2blXvRueSTPk1kA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1My32L-1tVhYu15WJ-013GUJ; Mon, 03 Feb 2025 18:02:31 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 09/10] net: pktgen: fix mpls reset parsing Date: Mon, 3 Feb 2025 18:02:00 +0100 Message-ID: <20250203170201.1661703-10-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:Kw7ZC8sWxfBb7UyA9bra3jH02e2hgYK2QIN/3ob1J4tRSoPKuf7 poFYMbvSgIbh8Bcge1qA9yr+g78OWJ0tgDRBkEH+IFVScHQmXzL0+t/qJgBrIwVsxY1VH/J +D336VJofatifWAjXDJqSGcdic5tsH4LQqeQpNcrYvPgqICD9zCtTxks6zG6fSmtfifeSvH rpoDSURVSb+aI0bvZi1ig== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:sLPmEis8ypU=;usPIvFg+ebfXKF8GTL4S/p6iEtx X9sD7H6043680naB1blsFhbWVY7VbwJlYOGYUUBjeERgtmWy4XIrxDsY2+AQOnG2GHZFiYUvd DugAyKKlfHi0mhN33qo52hakZacuyTO7vN9mI62sSwVboCkiMYhvhW98Lcfo0ZVOIEQaIUCuh YE/1gu73Gk5xw7lKPNo4Qd1phoxdKpxRg+vBv0e/LdlieJITJ3aJiZgNN0IH6JsYKds5k+1Ut AxbyVLOqZdGb2SY8f4HMsONQ+ooePitB36WqYfDf0NfHKvWHLgr8pDt4t8sNKnc0/wp405bA2 NdqVVW5VBC4Jdz34NHziqv69x8QSm69rguLftbhw81dl1wOiXTtGXmWm84N6DjIr/q4C1s20E rKu0BlTHSy3dAt7wp86SuQsZpnoWBOPKxM5WMEzmfsBqeGRRJAKzH4qBIN5xBcg27LuVBm6SC dQj7madiiiNfJ+spZ+iSII1kYYqqJCJrvirmj0QKZ72R0yeOYTMHQWdUmPZsN94jPasZtzWPw oiQjfdrDkSTFBBqy01uSOFkLJmEmPBej75WNQvIMB04r9JO4K3OSA9B0B4jHifn65PsWVn5XD jTSOssVx6IfRL+3cSD287HSiBoOpezbLOthHx/57YqzCfXBDktuy8on6kcZvJBaiDQZGmlpSF nKYsZizLsQQRz3NdNv6BkqHTe9K+GPqoZJzBVzgWr024LSEqwpQ4D6ak7QzVsJQ11m3WQ6eU5 WdPkmpUu7VgcWtsuJ5IKsz6SYYcdGTSFN+8ToSE/DUdbwzMtkfebiyCtbNO9DYnuJQkuIWXde lFn27/OE1+Tg3l0IgcQm20mvpp90pVhUtguKi2zx5hrljdU0tdgRHsY2V/Vo4O0qi/oPZorG4 IERLSjFfL8isLQ/llNigI8fZRF6enCHcqxI5J/a6lwXUVxEeuQP0nChT+gQhH9soJJs0oZZCM VmuOVDgT7+Bd4o1l7oghY3ppbTQXRRqy1Cr8HMncAc6EznNNMKkHwpxvb3p/OcNL3dBnF8y5A XtT4sH0xZrZMSwPRDsSAe8znPxaVn7HJ8wVZ/nCs7glsECe49JahgjmvxXUZyun1Swv4Sdlt4 hEbvrpwZJM4MGix3cdiBZmcVPthqhXvv/PDbpLaThbgxqs3gqJkQpL+dh/aGjpCk1mG3lQX5t hh6KzYMfGBnmJlj2gRTrAGym6sIHvmBISW0vUgFXg04aXjPZtWs6G4PedsHn6e8OSLddPbiNb 96N7nWO23ZblGViUOXVDg6fwficjyWvUcQ6e3wtGlzCvVhZ7jviFwGCD1JosnNEjb752I11c6 Jh8BRAY+Xgy6Wl/TCJmIneX7rlk4HQ3OUb2WDXPivCPQzQ= Fix mpls list reset parsing to work as describe in Documentation/networking/pktgen.rst: pgset "mpls 0" turn off mpls (or any invalid argument works too!) - before the patch $ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00000001, 00000002 Result: OK: mpls=00000001,00000002 $ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0 $ echo "mpls 0" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00000000 Result: OK: mpls=00000000 $ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0 $ echo "mpls invalid" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 Result: OK: mpls= - after the patch $ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00000001, 00000002 Result: OK: mpls=00000001,00000002 $ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0 $ echo "mpls 0" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 Result: OK: mpls= $ echo "mpls 00000001,00000002" > /proc/net/pktgen/lo\@0 $ echo "mpls invalid" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 Result: OK: mpls= Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v2 -> v3: - new patch --- net/core/pktgen.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 6675375c052c..7328681bafb2 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -924,8 +924,13 @@ static ssize_t get_labels(const char __user *buffer, int maxlen, struct pktgen_d max = min(8, maxlen - i); len = hex32_arg(&buffer[i], max, &tmp); - if (len <= 0) + if (len < 0) return len; + + // return empty list in case of invalid input and/or zero value + if (len == 0 || tmp == 0) + return maxlen; + pkt_dev->labels[n] = htonl(tmp); if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM) pkt_dev->flags |= F_MPLS_RND; From patchwork Mon Feb 3 17:02:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13957848 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8ED9820E314; Mon, 3 Feb 2025 17:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602161; cv=none; b=m7TQaMnMhD7PQzl/VhZWGNgY3kjqgfkHahFRa3qrheRfLF4Dr7992zLwmPGxi/Mwu/fc+UH2ST2Og/+Kkx1jIb6V3wHIWWbUW4VBCOW37K/qvFfuW9s3wjPUAZi1QNmR6+sipN4KIdWhhw4bceqNUO9XvlW8DQ1m0HhMrdTBhZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738602161; c=relaxed/simple; bh=6U49zlPruh6qztaOIOjl7sn2x067Ycd9DyQLhlnnpNI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=htgtmx1hD4MiYakEVpZSH46ZBnrMFIuVMcJ+KL3ceUwV32I4MW2k6c2YUkccKsJ748QN1UeLm+0oyEf/nYoc7+3GbbVQ0ha7Wuj1uTMzgY4G+2uAgZ1y5dfk9q82RWqd7faCmwJmO5eItl0dTJz7xKncU+B1G6iuPLtVf4MXY7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=n1cyZwQQ; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="n1cyZwQQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738602151; x=1739206951; i=ps.report@gmx.net; bh=6U49zlPruh6qztaOIOjl7sn2x067Ycd9DyQLhlnnpNI=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=n1cyZwQQbPDPXWhjYXljDHhT+SDIsPq50RBaGzWZtcOuP0sF4ibfML/bD11OPoVT 8cT0NVjwe6iEK4Mry+SPIHdVsXuhMuZ1wcKDwyR79c14CBkA1tajR1NswbZHRvkk/ 50fH9i+2dNrW3vWgoKCebnjBEMv4u7GXk0+7KmUDdb/ILZwSvk2Uf8uCwGGN0mBNS j6iFnJn34q0Djp806o234csASLIeVOE+ToEgt9peLUMTN9fgKDvKIRyruh5sEhoTT GR110k8qS6D6201eDVENKMHK3OEHEt8sl5cO9jDsrL2iZ3ddNkk98912rSeNRFXbW I/3yukeVx4yuuR67rw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.54]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MhU5R-1tArp62kKJ-00iIFv; Mon, 03 Feb 2025 18:02:31 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Nam Cao , Thomas Gleixner , Frederic Weisbecker , Artem Chernyshev , Peter Seiderer Subject: [PATCH net-next v3 10/10] selftest: net: add proc_net_pktgen Date: Mon, 3 Feb 2025 18:02:01 +0100 Message-ID: <20250203170201.1661703-11-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250203170201.1661703-1-ps.report@gmx.net> References: <20250203170201.1661703-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:elvmACI3X9Kc5I4XLl9wDIPno/K2MhEgiwIhSSYGki5KnKCO5yk uJ4pIOQ2jHVidWmUDSJ+0L2JL+dwqQxapHYawD257TxqqEZbL+V6Yr752VmCRMQXpGhSI91 0Z7yAZD3PkeJ1cm9/SvN40B0aKrkVTdBE8uhfd2RqbmIDaqu0t6wH40Di8GtIrDZfKpUu0H gqRxQycMtxFPTdrWJSZ5g== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:i6BNkh9Xkh8=;wp/Zru1mvFDtb5wYZqy+IAyLH1r S20zLYmtSQVclYGNVlGokE8Np9HEsRk13l5pB/+DqV3w2Fxsrpd7mb1sE5rNAq/wEbK9dDz+I 2eMlXti41OIv4HJ58t1143LnAYwqFBcaClMtOrHkZ3VnQXterLrhoLQndWoXFaVD8Y7WgZbab kQKi2UHB2/6Vl+cMrxrrlekO1aCr4+CEvGHJx3/l03QhaIp84OYW0C499XZ8eyPbNqyC/MFt2 wQhXqjM2a50j2jCnc+nYtOxvHXUDzZY7ZFHWiCEA9OXclxEwqwW8o9Eh3gUAPCbgarhlM7w3s far/rb0YkDarmtGzGOgUe0+s9Df1v1HQVkN86VaZ14NanOZ3evegAAzs0vMvVvq/QNCzlVOTP v+Y45peYq3xuhbsDPQo+ph0A+X+u4sBEyvuEYLB28s9IcD7GlQl3ZTt61WPmfs6t+8l3xY2aX hx/zhwD98L+IS8o7VGAOE5IeZ1YnI/+61uRHgxylusi1g/aiN+RkrzdgJ/Xj7y4if541l2ViR LHYAZ6ceE1fG30fiWlyKiy7WA2eHyxFH3HmfWvy4e3Gwxu5dHPM2gomiKzL69IlSNiYbfcf66 iyuA1ieu3HCEf4gL5JPnLsknvID/eLJcOG9F8VL2kTWrVLF+FKGNpkIJY4nDulcy3V65KcUWL /tmPr3jqB/OfyosACFnkWyyx2wuVVn/+WvsjogHrLCtHDiS0SDYFbId23Kwyb+nWQNlxtREIS eYshqwikxxj8dNkdDFdhfRNl266F5Nade2e3mZ6IPZQCG1ll0UMXtJa/8dD1zO/ycgz3+t8g3 4aZ9dQoQieujRVpJ9CxvOuCZRmMkRqAqPnq3JkSlO2MuLIQPQSUzQOwz8ccT3ILn6DdNlKaze 4KyWph8gh/eMfxhv0zB6T+boEj4L7O448h//UXR3bbF7MkNIZE2eDWi0aDXRdXgBXdfC3U3Jy NBj1wVGuwEzSCEVIh2xcZuKjUEX6pdUOt5RZTNBUTnla4Kdt9xLvk4H/bzbX1suvECihPjpsU CEQTJsc/b3nFQN96Ev66GRn21SuepjfuvS/vVZxptosMh60X+/No2ATZFYMcDUvwTR/GOorgE t2YVoooBVDp4ltqXuuKXmoJtYj9WSg3ZCpba7WCrCHDcHSaNKV8J9VwEY4btIGNUfvlTGc7Ay FhjFxmeTun2Jy6uJPa+Zhu6EA7acsIOJL19Qo/POuLVpGUppXScs30NF5AuMBpKA14NZknh6r TSfx4pcDC0zMZZeAJbL3SlHSjiAsUBxnTeIHzpGg+GDYIRV44aj/zqhzjbe9anjHWhSsYwcZt 4vHKQttKMn/QseyTbvu3vn5TmRmukXCteaChxlCYs45gHo= Add some test for /proc/net/pktgen/... interface. - enable 'CONFIG_NET_PKTGEN=m' in tools/testing/selftests/net/config Signed-off-by: Peter Seiderer --- Changes v2 -> v3: - fix typo in change description ('v1 -> v1' and tyop) - rename some vars to better match usage add_loopback_0 -> thr_cmd_add_loopback_0 rm_loopback_0 -> thr_cmd_rm_loopback_0 wrong_ctrl_cmd -> wrong_thr_cmd legacy_ctrl_cmd -> legacy_thr_cmd ctrl_fd -> thr_fd - add ctrl interface tests Changes v1 -> v2: - fix tyop not vs. nod (suggested by Jakub Kicinski) - fix misaligned line (suggested by Jakub Kicinski) - enable fomerly commented out CONFIG_XFRM dependent test (command spi), as CONFIG_XFRM is enabled via tools/testing/selftests/net/config CONFIG_XFRM_INTERFACE/CONFIG_XFRM_USER (suggestex by Jakub Kicinski) - add CONFIG_NET_PKTGEN=m to tools/testing/selftests/net/config (suggested by Jakub Kicinski) - add modprobe pktgen to FIXTURE_SETUP() (suggested by Jakub Kicinski) - fix some checkpatch warnings (Missing a blank line after declarations) - shrink line length by re-naming some variables (command -> cmd, device -> dev) - add 'rate 0' testcase - add 'ratep 0' testcase --- tools/testing/selftests/net/Makefile | 1 + tools/testing/selftests/net/config | 1 + tools/testing/selftests/net/proc_net_pktgen.c | 650 ++++++++++++++++++ 3 files changed, 652 insertions(+) create mode 100644 tools/testing/selftests/net/proc_net_pktgen.c diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index 73ee88d6b043..095708cd8345 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -100,6 +100,7 @@ TEST_PROGS += vlan_bridge_binding.sh TEST_PROGS += bpf_offload.py TEST_PROGS += ipv6_route_update_soft_lockup.sh TEST_PROGS += busy_poll_test.sh +TEST_GEN_PROGS += proc_net_pktgen # YNL files, must be before "include ..lib.mk" YNL_GEN_FILES := busy_poller netlink-dumps diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config index 5b9baf708950..9fe1b3464fbc 100644 --- a/tools/testing/selftests/net/config +++ b/tools/testing/selftests/net/config @@ -107,3 +107,4 @@ CONFIG_XFRM_INTERFACE=m CONFIG_XFRM_USER=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_NET_PKTGEN=m diff --git a/tools/testing/selftests/net/proc_net_pktgen.c b/tools/testing/selftests/net/proc_net_pktgen.c new file mode 100644 index 000000000000..81bc9e9e412f --- /dev/null +++ b/tools/testing/selftests/net/proc_net_pktgen.c @@ -0,0 +1,650 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * proc_net_pktgen: kselftest for /proc/net/pktgen interface + * + * Copyright (c) 2025 Peter Seiderer + * + */ +#include +#include +#include +#include + +#include "../kselftest_harness.h" + +static const char ctrl_cmd_stop[] = "stop"; +static const char ctrl_cmd_start[] = "start"; +static const char ctrl_cmd_reset[] = "reset"; + +static const char wrong_ctrl_cmd[] = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"; + +static const char thr_cmd_add_loopback_0[] = "add_device lo@0"; +static const char thr_cmd_rm_loopback_0[] = "rem_device_all"; + +static const char wrong_thr_cmd[] = "forsureawrongcommand"; +static const char legacy_thr_cmd[] = "max_before_softirq"; + +static const char wrong_dev_cmd[] = "forsurewrongcommand"; +static const char dev_cmd_min_pkt_size_0[] = "min_pkt_size"; +static const char dev_cmd_min_pkt_size_1[] = "min_pkt_size "; +static const char dev_cmd_min_pkt_size_2[] = "min_pkt_size 0"; +static const char dev_cmd_min_pkt_size_3[] = "min_pkt_size 1"; +static const char dev_cmd_min_pkt_size_4[] = "min_pkt_size 100"; +static const char dev_cmd_min_pkt_size_5[] = "min_pkt_size=1001"; +static const char dev_cmd_min_pkt_size_6[] = "min_pkt_size =2002"; +static const char dev_cmd_min_pkt_size_7[] = "min_pkt_size= 3003"; +static const char dev_cmd_min_pkt_size_8[] = "min_pkt_size = 4004"; +static const char dev_cmd_max_pkt_size_0[] = "max_pkt_size 200"; +static const char dev_cmd_pkt_size_0[] = "pkt_size 300"; +static const char dev_cmd_imix_weights_0[] = "imix_weights 0,7 576,4 1500,1"; +static const char dev_cmd_imix_weights_1[] = "imix_weights 101,1 102,2 103,3 104,4 105,5 106,6 107,7 108,8 109,9 110,10 111,11 112,12 113,13 114,14 115,15 116,16 117,17 118,18 119,19 120,20"; +static const char dev_cmd_imix_weights_2[] = "imix_weights 100,1 102,2 103,3 104,4 105,5 106,6 107,7 108,8 109,9 110,10 111,11 112,12 113,13 114,14 115,15 116,16 117,17 118,18 119,19 120,20 121,21"; +static const char dev_cmd_debug_0[] = "debug 1"; +static const char dev_cmd_debug_1[] = "debug 0"; +static const char dev_cmd_frags_0[] = "frags 100"; +static const char dev_cmd_delay_0[] = "delay 100"; +static const char dev_cmd_delay_1[] = "delay 2147483647"; +static const char dev_cmd_rate_0[] = "rate 0"; +static const char dev_cmd_rate_1[] = "rate 100"; +static const char dev_cmd_ratep_0[] = "ratep 0"; +static const char dev_cmd_ratep_1[] = "ratep 200"; +static const char dev_cmd_udp_src_min_0[] = "udp_src_min 1"; +static const char dev_cmd_udp_dst_min_0[] = "udp_dst_min 2"; +static const char dev_cmd_udp_src_max_0[] = "udp_src_max 3"; +static const char dev_cmd_udp_dst_max_0[] = "udp_dst_max 4"; +static const char dev_cmd_clone_skb_0[] = "clone_skb 1"; +static const char dev_cmd_clone_skb_1[] = "clone_skb 0"; +static const char dev_cmd_count_0[] = "count 100"; +static const char dev_cmd_src_mac_count_0[] = "src_mac_count 100"; +static const char dev_cmd_dst_mac_count_0[] = "dst_mac_count 100"; +static const char dev_cmd_burst_0[] = "burst 0"; +static const char dev_cmd_node_0[] = "node 100"; +static const char dev_cmd_xmit_mode_0[] = "xmit_mode start_xmit"; +static const char dev_cmd_xmit_mode_1[] = "xmit_mode netif_receive"; +static const char dev_cmd_xmit_mode_2[] = "xmit_mode queue_xmit"; +static const char dev_cmd_xmit_mode_3[] = "xmit_mode nonsense"; +static const char dev_cmd_flag_0[] = "flag UDPCSUM"; +static const char dev_cmd_flag_1[] = "flag !UDPCSUM"; +static const char dev_cmd_flag_2[] = "flag nonsense"; +static const char dev_cmd_dst_min_0[] = "dst_min 101.102.103.104"; +static const char dev_cmd_dst_0[] = "dst 101.102.103.104"; +static const char dev_cmd_dst_max_0[] = "dst_max 201.202.203.204"; +static const char dev_cmd_dst6_0[] = "dst6 2001:db38:1234:0000:0000:0000:0000:0000"; +static const char dev_cmd_dst6_min_0[] = "dst6_min 2001:db8:1234:0000:0000:0000:0000:0000"; +static const char dev_cmd_dst6_max_0[] = "dst6_max 2001:db8:1234:0000:0000:0000:0000:0000"; +static const char dev_cmd_src6_0[] = "src6 2001:db38:1234:0000:0000:0000:0000:0000"; +static const char dev_cmd_src_min_0[] = "src_min 101.102.103.104"; +static const char dev_cmd_src_max_0[] = "src_max 201.202.203.204"; +static const char dev_cmd_dst_mac_0[] = "dst_mac 01:02:03:04:05:06"; +static const char dev_cmd_src_mac_0[] = "src_mac 11:12:13:14:15:16"; +static const char dev_cmd_clear_counters_0[] = "clear_counters"; +static const char dev_cmd_flows_0[] = "flows 100"; +static const char dev_cmd_spi_0[] = "spi 100"; +static const char dev_cmd_flowlen_0[] = "flowlen 100"; +static const char dev_cmd_queue_map_min_0[] = "queue_map_min 1"; +static const char dev_cmd_queue_map_max_0[] = "queue_map_max 2"; +static const char dev_cmd_mpls_0[] = "mpls 00000001"; +static const char dev_cmd_mpls_1[] = "mpls 00000001,000000f2"; +static const char dev_cmd_mpls_2[] = "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f"; +static const char dev_cmd_mpls_3[] = "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f,00000f10"; +static const char dev_cmd_vlan_id_0[] = "vlan_id 1"; +static const char dev_cmd_vlan_p_0[] = "vlan_p 1"; +static const char dev_cmd_vlan_cfi_0[] = "vlan_cfi 1"; +static const char dev_cmd_vlan_id_1[] = "vlan_id 4096"; +static const char dev_cmd_svlan_id_0[] = "svlan_id 1"; +static const char dev_cmd_svlan_p_0[] = "svlan_p 1"; +static const char dev_cmd_svlan_cfi_0[] = "svlan_cfi 1"; +static const char dev_cmd_svlan_id_1[] = "svlan_id 4096"; +static const char dev_cmd_tos_0[] = "tos 0"; +static const char dev_cmd_tos_1[] = "tos 0f"; +static const char dev_cmd_tos_2[] = "tos 0ff"; +static const char dev_cmd_traffic_class_0[] = "traffic_class f0"; +static const char dev_cmd_skb_priority_0[] = "skb_priority 999"; + +FIXTURE(proc_net_pktgen) { + int ctrl_fd; + int thr_fd; + int dev_fd; +}; + +FIXTURE_SETUP(proc_net_pktgen) { + int r; + ssize_t len; + + r = system("modprobe pktgen"); + ASSERT_EQ(r, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not loaded?"); + + self->ctrl_fd = open("/proc/net/pktgen/pgctrl", O_RDWR); + ASSERT_GE(self->ctrl_fd, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not loaded?"); + + self->thr_fd = open("/proc/net/pktgen/kpktgend_0", O_RDWR); + ASSERT_GE(self->thr_fd, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not loaded?"); + + len = write(self->thr_fd, thr_cmd_add_loopback_0, sizeof(thr_cmd_add_loopback_0)); + ASSERT_EQ(len, sizeof(thr_cmd_add_loopback_0)) TH_LOG("device lo@0 already registered?"); + + self->dev_fd = open("/proc/net/pktgen/lo@0", O_RDWR); + ASSERT_GE(self->dev_fd, 0) TH_LOG("device entry for lo@0 missing?"); +} + +FIXTURE_TEARDOWN(proc_net_pktgen) { + int ret; + ssize_t len; + + ret = close(self->dev_fd); + EXPECT_EQ(ret, 0); + + len = write(self->thr_fd, thr_cmd_rm_loopback_0, sizeof(thr_cmd_rm_loopback_0)); + EXPECT_EQ(len, sizeof(thr_cmd_rm_loopback_0)); + + ret = close(self->thr_fd); + EXPECT_EQ(ret, 0); + + ret = close(self->ctrl_fd); + EXPECT_EQ(ret, 0); +} + +TEST_F(proc_net_pktgen, wrong_ctrl_cmd) { + for (int i = 0; i <= sizeof(wrong_ctrl_cmd); i++) { + ssize_t len; + + len = write(self->ctrl_fd, wrong_ctrl_cmd, i); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } +} + +TEST_F(proc_net_pktgen, ctrl_cmd) { + ssize_t len; + + len = write(self->ctrl_fd, ctrl_cmd_stop, sizeof(ctrl_cmd_stop)); + EXPECT_EQ(len, sizeof(ctrl_cmd_stop)); + + len = write(self->ctrl_fd, ctrl_cmd_stop, sizeof(ctrl_cmd_stop) - 1); + EXPECT_EQ(len, sizeof(ctrl_cmd_stop) - 1); + + len = write(self->ctrl_fd, ctrl_cmd_start, sizeof(ctrl_cmd_start)); + EXPECT_EQ(len, sizeof(ctrl_cmd_start)); + + len = write(self->ctrl_fd, ctrl_cmd_start, sizeof(ctrl_cmd_start) - 1); + EXPECT_EQ(len, sizeof(ctrl_cmd_start) - 1); + + len = write(self->ctrl_fd, ctrl_cmd_reset, sizeof(ctrl_cmd_reset)); + EXPECT_EQ(len, sizeof(ctrl_cmd_reset)); + + len = write(self->ctrl_fd, ctrl_cmd_reset, sizeof(ctrl_cmd_reset) - 1); + EXPECT_EQ(len, sizeof(ctrl_cmd_reset) - 1); +} + +TEST_F(proc_net_pktgen, wrong_thr_cmd) { + for (int i = 0; i <= sizeof(wrong_thr_cmd); i++) { + ssize_t len; + + len = write(self->thr_fd, wrong_thr_cmd, i); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } +} + +TEST_F(proc_net_pktgen, legacy_thr_cmd) { + for (int i = 0; i <= sizeof(legacy_thr_cmd); i++) { + ssize_t len; + + len = write(self->thr_fd, legacy_thr_cmd, i); + if (i < (sizeof(legacy_thr_cmd) - 1)) { + // incomplete command string + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } else { + // complete command string without/with trailing '\0' + EXPECT_EQ(len, i); + } + } +} + +TEST_F(proc_net_pktgen, wrong_dev_cmd) { + for (int i = 0; i <= sizeof(wrong_dev_cmd); i++) { + ssize_t len; + + len = write(self->dev_fd, wrong_dev_cmd, i); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } +} + +TEST_F(proc_net_pktgen, dev_cmd_min_pkt_size) { + ssize_t len; + + // with trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_0, sizeof(dev_cmd_min_pkt_size_0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + // without trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_0, sizeof(dev_cmd_min_pkt_size_0) - 1); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + // with trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pkt_size_1)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + // without trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pkt_size_1) - 1); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + // with trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_2, sizeof(dev_cmd_min_pkt_size_2)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_2)); + + // without trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_2, sizeof(dev_cmd_min_pkt_size_2) - 1); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_2) - 1); + + len = write(self->dev_fd, dev_cmd_min_pkt_size_3, sizeof(dev_cmd_min_pkt_size_3)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_3)); + + len = write(self->dev_fd, dev_cmd_min_pkt_size_4, sizeof(dev_cmd_min_pkt_size_4)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_4)); + + len = write(self->dev_fd, dev_cmd_min_pkt_size_5, sizeof(dev_cmd_min_pkt_size_5)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_5)); + + len = write(self->dev_fd, dev_cmd_min_pkt_size_6, sizeof(dev_cmd_min_pkt_size_6)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_6)); + + len = write(self->dev_fd, dev_cmd_min_pkt_size_7, sizeof(dev_cmd_min_pkt_size_7)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_7)); + + len = write(self->dev_fd, dev_cmd_min_pkt_size_8, sizeof(dev_cmd_min_pkt_size_8)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_8)); +} + +TEST_F(proc_net_pktgen, dev_cmd_max_pkt_size) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_max_pkt_size_0, sizeof(dev_cmd_max_pkt_size_0)); + EXPECT_EQ(len, sizeof(dev_cmd_max_pkt_size_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_pkt_size) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_pkt_size_0, sizeof(dev_cmd_pkt_size_0)); + EXPECT_EQ(len, sizeof(dev_cmd_pkt_size_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_imix_weights) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_imix_weights_0, sizeof(dev_cmd_imix_weights_0)); + EXPECT_EQ(len, sizeof(dev_cmd_imix_weights_0)); + + len = write(self->dev_fd, dev_cmd_imix_weights_1, sizeof(dev_cmd_imix_weights_1)); + EXPECT_EQ(len, sizeof(dev_cmd_imix_weights_1)); + + len = write(self->dev_fd, dev_cmd_imix_weights_2, sizeof(dev_cmd_imix_weights_2)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, E2BIG); +} + +TEST_F(proc_net_pktgen, dev_cmd_debug) { + ssize_t len; + + // debug on + len = write(self->dev_fd, dev_cmd_debug_0, sizeof(dev_cmd_debug_0)); + EXPECT_EQ(len, sizeof(dev_cmd_debug_0)); + + // debug off + len = write(self->dev_fd, dev_cmd_debug_1, sizeof(dev_cmd_debug_1)); + EXPECT_EQ(len, sizeof(dev_cmd_debug_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_frags) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_frags_0, sizeof(dev_cmd_frags_0)); + EXPECT_EQ(len, sizeof(dev_cmd_frags_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_delay) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_delay_0, sizeof(dev_cmd_delay_0)); + EXPECT_EQ(len, sizeof(dev_cmd_delay_0)); + + len = write(self->dev_fd, dev_cmd_delay_1, sizeof(dev_cmd_delay_1)); + EXPECT_EQ(len, sizeof(dev_cmd_delay_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_rate) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_rate_0, sizeof(dev_cmd_rate_0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + len = write(self->dev_fd, dev_cmd_rate_1, sizeof(dev_cmd_rate_1)); + EXPECT_EQ(len, sizeof(dev_cmd_rate_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_ratep) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_ratep_0, sizeof(dev_cmd_ratep_0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + len = write(self->dev_fd, dev_cmd_ratep_1, sizeof(dev_cmd_ratep_1)); + EXPECT_EQ(len, sizeof(dev_cmd_ratep_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_src_min) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_udp_src_min_0, sizeof(dev_cmd_udp_src_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_src_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_dst_min) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_udp_dst_min_0, sizeof(dev_cmd_udp_dst_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_dst_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_src_max) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_udp_src_max_0, sizeof(dev_cmd_udp_src_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_src_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_dst_max) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_udp_dst_max_0, sizeof(dev_cmd_udp_dst_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_dst_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_clone_skb) { + ssize_t len; + + // clone_skb on (gives EOPNOTSUPP on lo device) + len = write(self->dev_fd, dev_cmd_clone_skb_0, sizeof(dev_cmd_clone_skb_0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EOPNOTSUPP); + + // clone_skb off + len = write(self->dev_fd, dev_cmd_clone_skb_1, sizeof(dev_cmd_clone_skb_1)); + EXPECT_EQ(len, sizeof(dev_cmd_clone_skb_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_count) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_count_0, sizeof(dev_cmd_count_0)); + EXPECT_EQ(len, sizeof(dev_cmd_count_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_mac_count) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_src_mac_count_0, sizeof(dev_cmd_src_mac_count_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_mac_count_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_mac_count) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst_mac_count_0, sizeof(dev_cmd_dst_mac_count_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_mac_count_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_burst) { + ssize_t len; + + // burst off + len = write(self->dev_fd, dev_cmd_burst_0, sizeof(dev_cmd_burst_0)); + EXPECT_EQ(len, sizeof(dev_cmd_burst_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_node) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_node_0, sizeof(dev_cmd_node_0)); + EXPECT_EQ(len, sizeof(dev_cmd_node_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_xmit_mode) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_xmit_mode_0, sizeof(dev_cmd_xmit_mode_0)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_0)); + + len = write(self->dev_fd, dev_cmd_xmit_mode_1, sizeof(dev_cmd_xmit_mode_1)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_1)); + + len = write(self->dev_fd, dev_cmd_xmit_mode_2, sizeof(dev_cmd_xmit_mode_2)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_2)); + + len = write(self->dev_fd, dev_cmd_xmit_mode_3, sizeof(dev_cmd_xmit_mode_3)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_3)); +} + +TEST_F(proc_net_pktgen, dev_cmd_flag) { + ssize_t len; + + // flag UDPCSUM on + len = write(self->dev_fd, dev_cmd_flag_0, sizeof(dev_cmd_flag_0)); + EXPECT_EQ(len, sizeof(dev_cmd_flag_0)); + + // flag UDPCSUM off + len = write(self->dev_fd, dev_cmd_flag_1, sizeof(dev_cmd_flag_1)); + EXPECT_EQ(len, sizeof(dev_cmd_flag_1)); + + // flag invalid + len = write(self->dev_fd, dev_cmd_flag_2, sizeof(dev_cmd_flag_2)); + EXPECT_EQ(len, sizeof(dev_cmd_flag_2)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_min) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst_min_0, sizeof(dev_cmd_dst_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst_0, sizeof(dev_cmd_dst_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_max) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst_max_0, sizeof(dev_cmd_dst_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst6) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst6_0, sizeof(dev_cmd_dst6_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst6_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst6_min) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst6_min_0, sizeof(dev_cmd_dst6_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst6_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst6_max) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst6_max_0, sizeof(dev_cmd_dst6_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst6_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src6) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_src6_0, sizeof(dev_cmd_src6_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src6_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_min) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_src_min_0, sizeof(dev_cmd_src_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_max) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_src_max_0, sizeof(dev_cmd_src_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_mac) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_dst_mac_0, sizeof(dev_cmd_dst_mac_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_mac_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_mac) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_src_mac_0, sizeof(dev_cmd_src_mac_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_mac_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_clear_counters) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_clear_counters_0, sizeof(dev_cmd_clear_counters_0)); + EXPECT_EQ(len, sizeof(dev_cmd_clear_counters_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_flows) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_flows_0, sizeof(dev_cmd_flows_0)); + EXPECT_EQ(len, sizeof(dev_cmd_flows_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_spi) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_spi_0, sizeof(dev_cmd_spi_0)); + EXPECT_EQ(len, sizeof(dev_cmd_spi_0)) TH_LOG("CONFIG_XFRM not enabled?"); +} + +TEST_F(proc_net_pktgen, dev_cmd_flowlen) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_flowlen_0, sizeof(dev_cmd_flowlen_0)); + EXPECT_EQ(len, sizeof(dev_cmd_flowlen_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_queue_map_min) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_queue_map_min_0, sizeof(dev_cmd_queue_map_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_queue_map_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_queue_map_max) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_queue_map_max_0, sizeof(dev_cmd_queue_map_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_queue_map_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_mpls) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_mpls_0, sizeof(dev_cmd_mpls_0)); + EXPECT_EQ(len, sizeof(dev_cmd_mpls_0)); + + len = write(self->dev_fd, dev_cmd_mpls_1, sizeof(dev_cmd_mpls_1)); + EXPECT_EQ(len, sizeof(dev_cmd_mpls_1)); + + len = write(self->dev_fd, dev_cmd_mpls_2, sizeof(dev_cmd_mpls_2)); + EXPECT_EQ(len, sizeof(dev_cmd_mpls_2)); + + len = write(self->dev_fd, dev_cmd_mpls_3, sizeof(dev_cmd_mpls_3)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, E2BIG); +} + +TEST_F(proc_net_pktgen, dev_cmd_vlan_id) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_vlan_id_0, sizeof(dev_cmd_vlan_id_0)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_id_0)); + + len = write(self->dev_fd, dev_cmd_vlan_p_0, sizeof(dev_cmd_vlan_p_0)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_p_0)); + + len = write(self->dev_fd, dev_cmd_vlan_cfi_0, sizeof(dev_cmd_vlan_cfi_0)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_cfi_0)); + + len = write(self->dev_fd, dev_cmd_vlan_id_1, sizeof(dev_cmd_vlan_id_1)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_id_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_svlan_id) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_svlan_id_0, sizeof(dev_cmd_svlan_id_0)); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_id_0)); + + len = write(self->dev_fd, dev_cmd_svlan_p_0, sizeof(dev_cmd_svlan_p_0)); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_p_0)); + + len = write(self->dev_fd, dev_cmd_svlan_cfi_0, sizeof(dev_cmd_svlan_cfi_0)); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_cfi_0)); + + len = write(self->dev_fd, dev_cmd_svlan_id_1, sizeof(dev_cmd_svlan_id_1)); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_id_1)); +} + + +TEST_F(proc_net_pktgen, dev_cmd_tos) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_tos_0, sizeof(dev_cmd_tos_0)); + EXPECT_EQ(len, sizeof(dev_cmd_tos_0)); + + len = write(self->dev_fd, dev_cmd_tos_1, sizeof(dev_cmd_tos_1)); + EXPECT_EQ(len, sizeof(dev_cmd_tos_1)); + + len = write(self->dev_fd, dev_cmd_tos_2, sizeof(dev_cmd_tos_2)); + EXPECT_EQ(len, sizeof(dev_cmd_tos_2)); +} + + +TEST_F(proc_net_pktgen, dev_cmd_traffic_class) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_traffic_class_0, sizeof(dev_cmd_traffic_class_0)); + EXPECT_EQ(len, sizeof(dev_cmd_traffic_class_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_skb_priority) { + ssize_t len; + + len = write(self->dev_fd, dev_cmd_skb_priority_0, sizeof(dev_cmd_skb_priority_0)); + EXPECT_EQ(len, sizeof(dev_cmd_skb_priority_0)); +} + +TEST_HARNESS_MAIN