From patchwork Fri Feb 21 21:52:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986353 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 C6D0B2566CB; Fri, 21 Feb 2025 21:53:00 +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=1740174782; cv=none; b=M/7MkX1hZmqOv9Q3DWtUt5gEDEBl613B6yWwwW6aPtP4Bdw7wUTtj5QPPM8hLwqO2L9FrgQ+3WmGfJkOVtwKmghppyB2QTbWhRkBGREBAOqYOzepYZuNl/VlEiaXc80wKK2NffZ/n4Rfw0ZVH4fYJOc637nT5SUxqlsOxBUCb/E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174782; c=relaxed/simple; bh=hlmQngDh17Zs7kpd6oJl7Fm7cf+hFOFc8gYQDe1+8sA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rq4kfy05ioRYtcrj5ryakv7R6GPKS+7MaV0tTuk9/Gj3AJsoczfRWf7J9vSG3BwW0aEDnY4uP7HpjkLBd0wHFwlP5oab2KRN3MgpWxwbie2PiDkIIasup7NMeNn1pGwUXVVDtKzlSYhqrWQ9dxWhlno5xw74K02Rmcmq/icpwC0= 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=PVppWh9K; 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="PVppWh9K" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174770; x=1740779570; i=ps.report@gmx.net; bh=hlmQngDh17Zs7kpd6oJl7Fm7cf+hFOFc8gYQDe1+8sA=; 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=PVppWh9KgUds4MWwZUjqRGbHCKbhJbjzBYk4p6f3xN465868VmywbMEGLStvq/DN bhCS6z6vksnq10YZFHmqrWQWmlvH/thaPFute3rzCzSR1XWFOg0XGJgRjkKMmr/v2 zI3MSDK7f952PPthezoYNIA8qogXdRHG09joCGS4nW+w4ibRGcshOU7xWZwetRAWC M2n0HEsKkw1FM4M4B6luTjLg7tOvZCJTN9tZhEOuGop06zV5Sz7uqoBn3N/IDU1bH AB7hfnfiEgMfyA4+CvRHNmLv6pzT8h9ybNFpm75nO2+q59uiwdhJBoTmYIcWnmi64 NVZuCT5UTMQ7lDHWSQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MRmfo-1tseVM2k38-00YvF0; Fri, 21 Feb 2025 22:52:50 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 1/8] net: pktgen: fix mix of int/long Date: Fri, 21 Feb 2025 22:52:39 +0100 Message-ID: <20250221215246.383373-2-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:daCJkPgJNTMqFcwc3PFH9ccb2l1aGY5FtgKw9axcnokW+WdVe3w oR07Fcp2YNz4Al+zFX+e+I+bQ5jm7foDH4IkKIDRIYZj3NCqQ34NBXZxQootmL2ex/nP5Bv xPlxRLYqpDvd3Kjl5kaUOaRxkp8Oe2Nu7pmCzuBxXl76d5NCiLlWqojuaGK3SxlXtigy+Qn xxXHr9DP37+r0idkNq7Mg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:4/KJDuLXjM0=;YA44kLkkc51Xd37dPOk0u1jznNC pppTfAuRkFHRqCpYcK18JmT4urc3OCgpSx8C/IxAZ96OhNrrLPSe/yk8ZeAwllXxPzm7YozN6 tUrmdruuCk9EN4KgwQPTtv4sFBMowJQni+5LeG56RZYp6HQY57NYO6I4t+KDqpHjTmxlxa8M6 Cf4ue2eI2V9jk2+Cd1OWMZAEoThPuaUvnuLZ0Na2848rkr3ba2cqbRQ7IrsBK8NrwnLIPI73f oldx9M3S0brTFTWcIslfpwGbgx0P4/0rXG1Iv/5koD+BLtSTC4QJflOZoAJH7r2ZR41nxcmM3 FFqHxDY30bRf7JrZiqqFn230VvmSlCxEAqUyL2c0t+scR+pLlCmW9gehm870eYF1ltB32zSh3 Lpew5DpE517cdXffMuKFrBo5rh9VdzoWExeOkTgExpCG92ieAaxlC9qhzx9L2n93t+b5NHSjH 5uzw1ch5Iw/5bG0DbxqCPm3/LiXFmAppTuFoGJlEEClK5tn/j+X52RczGRLr4pilg6r8AZuJL RkuEjLzVm+8mRtjyJZdl3FUjh88PEri8BmwzaLe/Lq83P9cf281+9YaLcC2tF836fRAEWDIUK kKJq/A+C/q6tMKSw4FLlWWP1hLyXoXVpNXDkaWyjbZkxWsQERKFP+51pTrCk56rdOXaDnrSn5 5jtC+37b2O6pwu1QzwumzcI+o0JaOgwrR+9OnVp/HUdF+RNtAwHiip+mZhlUibgGP4bFA7yTT isdPrroaDoiCrhKQqdMcflHhUjYqqx1sFb2NEpjp6OjvNQuBINildc/s7VGMXHyFb982jsidb TOzWf7ebATD2PUyp68ghS3z9yyDHpQZSOA/YI7z2eA13DX/CYHiViOJ56oIWHoEUTOhwdZ+Bs +iCGEx6mWIRzxtTyL/xELF1w0W9r1mjcXCNWJC2uVdr8LV0LOWntxjUYqwwLAAhn80kOjA4Qm 6xs6lbFjTCg6ghy6vCnIhJDGSsMFKZkMwyC23Ptnvxx74T22tkH3wXB/oBOe+4sFy1MEAZDNU 27xZIku4IO+MfCFOWq9YOaWM3PetEo8YFjrwijT70HpI7LKIBCQFE3VQa2TcvhdV4kBnKqLR9 gi3aQRNkNfnDFTNS+iZS7IdjuyYRU2fkHNPHtXvbfgqoPU3+HEbtGMn1n+IvvqfmRollIJXp9 +V2yh3ZpWkMAUi/K+tRohEI6BWxZD5WxRG5nhR6lz68WztsVYvgGVboaIrsKam0a4/9PbAPv/ BGFz2pNrmQXtubjkdKgxPMJASzyIrjtrW3sGCD3mLAFEe7tldKLeCubC9RBEThNAz/GZ1Zhjn Gu3jLSQgjUDE3Gu2tkemmuHEIzMAoBYUPlG623JxUxigpXPjhZdGDMoMq1uHw+cUFnBa2mzT+ NpkOqAt7yFSTyhN2nG0Ia1YFwZzqNZbsqBGlqeQkBbIJujoBCwOI7hA7WA Fix mix of int/long (and multiple conversion from/to) by using consequently size_t for i and max and ssize_t for len and adjust function signatures of hex32_arg(), count_trail_chars(), num_arg() and strn_len() accordingly. Signed-off-by: Peter Seiderer --- Changes v5 -> v6 - adjust to dropped patch ''net: pktgen: use defines for the various dec/hex number parsing digits lengths' - add rev-by Simon Horman - fix line break (suggested by Simon Horman) Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - instead of align to most common pattern (int) adjust all usages to size_t for i and max and ssize_t for len and adjust function signatures of hex32_arg(), count_trail_chars(), num_arg() and strn_len() accordingly - respect reverse xmas tree order for local variable declarations (where possible without too much code churn) - update subject line and patch description - fix checkpatch warning '"foo * bar" should be "foo *bar"' for count_trail_chars() and strn_len() Changes v3 -> v4 - new patch (factored out of patch 'net: pktgen: fix access outside of user given buffer in pktgen_if_write()') --- net/core/pktgen.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 55064713223e..cd6b6c0dc0dc 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -746,10 +746,11 @@ static int pktgen_if_show(struct seq_file *seq, void *v) } -static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, - __u32 *num) +static ssize_t hex32_arg(const char __user *user_buffer, size_t maxlen, + __u32 *num) { - int i = 0; + size_t i = 0; + *num = 0; for (; i < maxlen; i++) { @@ -768,10 +769,9 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, return i; } -static int count_trail_chars(const char __user * user_buffer, - unsigned int maxlen) +static ssize_t count_trail_chars(const char __user *user_buffer, size_t maxlen) { - int i; + size_t i; for (i = 0; i < maxlen; i++) { char c; @@ -793,10 +793,10 @@ static int count_trail_chars(const char __user * user_buffer, return i; } -static long num_arg(const char __user *user_buffer, unsigned long maxlen, - unsigned long *num) +static ssize_t num_arg(const char __user *user_buffer, size_t maxlen, + unsigned long *num) { - int i; + size_t i; *num = 0; for (i = 0; i < maxlen; i++) { @@ -812,9 +812,9 @@ static long num_arg(const char __user *user_buffer, unsigned long maxlen, return i; } -static int strn_len(const char __user * user_buffer, unsigned int maxlen) +static ssize_t strn_len(const char __user *user_buffer, size_t maxlen) { - int i; + size_t i; for (i = 0; i < maxlen; i++) { char c; @@ -844,9 +844,9 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) static ssize_t get_imix_entries(const char __user *buffer, struct pktgen_dev *pkt_dev) { - const int max_digits = 10; - int i = 0; - long len; + const size_t max_digits = 10; + size_t i = 0; + ssize_t len; char c; pkt_dev->n_imix_entries = 0; @@ -895,9 +895,9 @@ static ssize_t get_imix_entries(const char __user *buffer, static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) { unsigned int n = 0; + size_t i = 0; + ssize_t len; char c; - ssize_t i = 0; - int len; pkt_dev->nr_labels = 0; do { @@ -956,7 +956,8 @@ static ssize_t pktgen_if_write(struct file *file, { struct seq_file *seq = file->private_data; struct pktgen_dev *pkt_dev = seq->private; - int i, max, len; + size_t i, max; + ssize_t len; char name[16], valstr[32]; unsigned long value = 0; char *pg_result = NULL; @@ -1883,7 +1884,8 @@ static ssize_t pktgen_thread_write(struct file *file, { struct seq_file *seq = file->private_data; struct pktgen_thread *t = seq->private; - int i, max, len, ret; + size_t i, max; + ssize_t len, ret; char name[40]; char *pg_result; From patchwork Fri Feb 21 21:52:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986350 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 EA7C8202F89; Fri, 21 Feb 2025 21:52:56 +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=1740174778; cv=none; b=WeKGOIRVKq6Zr5TkVBFqefIsrfg+TH/59o3LUyfYsfKTxajhozQI3Q0azNg83tmtSRguu8MLrGIA0Wa+D+FD2VzQsfZQCNBDlXEbAAfUe/rzlRupcm5XqsLNLQtp0QdiUzhyEQKFMT8fADBGrBwWIZ5/a9GBc2fxAQuYZoYTyCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174778; c=relaxed/simple; bh=tmTSEEzGyIhUtwofgL95uH8cGlP+iF/hT62XefsPlic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rR4A5o+h4b1k7eZ2mjvJV4EJO3dNZoWt5ysPJoLtBbpr/VvXBX9FBK+S8DFnOb1lK3ZKY6AruCK2yCki+LDffncdzUMO4Abix9NB6v1Noj0giabuGSEN8gxmGfgg3gXK1YtnRdthJwNXpF4g80/l3xqkN4ywusc6X13NTCIn1XY= 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=hlCOo1bA; 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="hlCOo1bA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174771; x=1740779571; i=ps.report@gmx.net; bh=tmTSEEzGyIhUtwofgL95uH8cGlP+iF/hT62XefsPlic=; 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=hlCOo1bApO66I0wOFLIo035lsJc0sy7+9vnNqqq/HQO5s7mNTUUoQEEAJqYhTKmp Q18Iwl18HFcEtepEaQm+N6RH8i44R51oIQJ1WorH3nI4EohCLVrOOfH+p+rdSxzUW qL0dYst8FjAt3/YT3P9AIqR2+LH0ARLs5QQQbyN5xnDbXwXWgfMSiUjq7shZGzQlM M+/fGsP3FJ9Y+r2BZbYgnhirASFCUIzUXEDE7vtNp+HVbkbTLhTvEowij7znB7vx7 xjxrup4WYywPEiIAxhkMOIU3PRQMUtAEjzOi54D21THiBJUZyQL+CQ9hxn6aEWUlJ Neds8xjV0R+5zNfIrA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M8QS2-1thB6A47s0-001VN6; Fri, 21 Feb 2025 22:52:51 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 2/8] net: pktgen: remove extra tmp variable (re-use len instead) Date: Fri, 21 Feb 2025 22:52:40 +0100 Message-ID: <20250221215246.383373-3-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:bI3p3HO/+Lc/GQn5qL6cfUiAkOd9iq/VzYXpW/39805rR3YYite fTPlTCU1T41hxNdao7syYaNX3DS+U2FxIs2ii0IYuG7HptnkGjCrAZrSNfLgsydX2rqmQO7 7oTX2x3XtZyfdD2D2F076K4a4ipU3gwmWf1wYRCG5o3KxWfvFqvkqzdebHP2K0W38no1QNH b/ZRTviJ+14t4J7HR3RyA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:G4maLxHccsU=;j44cNmIPra/xJeNmNUtrT7mY0m+ KpVV6uGRkiqErodz8uStjHW/zkfZTtxl3AVkiLFDr9bfflJ7yD1bUAG9K1ZWIAUR/a3wLVe5R NZD85Sy1lYv3oyOxvBrXYMdeBN3Ruy8rdV1DX600TkVgseiOchmhPrw9RCXoKs7WmsCH0mDJR QdSoQOQK2FKsi73OoJ3Rj9vTCSQti97Pg7ej5ABLZ6L0hDqWdSqlF5FDapgZ59tTO5GCoT+sJ Gem1WnhRqySNO4AFBGOSPXGJYMewJtNv4PZoiDzE8UhLzDTN/BZS+UIAwMgB+DZEuKJKYnxX5 sGswLKe5IFLPEpZoLyvp3rmLErz1KDxi//Orlwk3k3PKkgik+jWdWmoeZyFF/bUVB4XWAmJZl OWB7wg1mI37jJOS7QOTzcyjUkJIBdSuyLb+89qF84DkoRmUhY9N2RE2uGJjcLRyp+q1HYlFbq goAq86vJyBOfnMaAlV2VPgZIl7eRYmOQ+9VEJaDfV9LqW72TKY/rC5WDFhDqWxHl4NFAoJ3HK nSIFE2SMIJPljvdh2JH8HRv0m4artVMflzthToG7M36kU4y5co6ZiyKxyhnb3mRKAHCNEm/RV QFqB5Tn8+0lpJQUEZWMvnNmNsK1cdOqrsulMBAUiughL0g7rQvZQMhwrb5kGwAqvigsXSR1TH MLqFTADaaRz5g7/So8JL7WeZZRnFeLP0OUv6Ba9QwJ11ulxCxLYbUOkjBDlYohf7qprdJMrJb fsocpemBHxfq2hoK3uYTbG5XaKXh3Sx7RWQaJpQCdiTDiFGLRDqdb0nnqbsWRf6NWg1EMz0an Zn/eiSqIiz0YsfaCPn9gqnNQUnFcSr/YkStCkg0r3PFlkr6rUKHJDpVP2G1xo5wTedo3rmNK/ f5eb8lfXdccjjd1AYHpEd7aemIjDbIon13TUtLIRtW/peJGG4RKA1RT+fy53+V9JL2IAJ6Uog rRgjfv5di2ohtwEOQ+98nFUUUtOEucEvwZTD5M1raXzFqLk1tbKe7ldZRXpYjVqMHsoPV+z1H 8+XPauTdGfPmG1MCWOPxUov1AkRFk75YJdzCtcl85JPbOYZ+9O5UiV2d0nYBW5R1k3pXxKJg6 okQcdrqA1ooCWkclnDOxnLe6fQeC9xq3JLTCn7lX+sTDQGv6+SQy+9/OXtZcsAnxOgh5yD+YG alzXYgsWQQJMguX4EWMn4YVeGIuVCbPQqHPqnDyI0eRyV6HlbJa13OCOW5iNKFCaxGG1csxrg q80qbUbhqpJe8drDKhbGdGjyDV2COH+vNeWq7DwGUq3Yg+Qhzx7goVLJdkSDdBd3u5lq1fChk 0tUbIsGMuVp7YJ9QjJdlY6ewe7JI0zHF/r6MIcahO/R9y9qDEPkunfhwLsISeQIXoZRPcq01j qvpxhqnuC33X7906ZIy/5QXnaRaCAqsc4FCEP4sA5lJaxzlDi7ztYtECT8 Remove extra tmp variable in pktgen_if_write (re-use len instead). Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v5 -> v6 - no changes Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - add rev-by Simon Horman Changes v3 -> v4 - new patch (factored out of patch 'net: pktgen: fix access outside of user given buffer in pktgen_if_write()') --- net/core/pktgen.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index cd6b6c0dc0dc..b97a94cb85ac 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -961,7 +961,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]); @@ -972,12 +971,12 @@ static ssize_t pktgen_if_write(struct file *file, } max = count; - tmp = count_trail_chars(user_buffer, max); - if (tmp < 0) { + len = count_trail_chars(user_buffer, max); + if (len < 0) { pr_warn("illegal format\n"); - return tmp; + return len; } - i = tmp; + i = len; /* Read variable name */ From patchwork Fri Feb 21 21:52:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986348 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 287CC20127C; Fri, 21 Feb 2025 21:52:55 +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=1740174778; cv=none; b=YX62EmeFaj7CnHLe/AM50lpexdp9GdHAXZtcy0j9iTL67tEid3ofkSqTmd0Qrj4X/N9/1ud/wgRYcmRbp2S0mMGG2HtdDoRexrXIiqajcduMPermRnGNnQOY5SRndOIwyNdrFlY810b9zwovRF9hRrcM5UCE/QWQVZavemskFxU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174778; c=relaxed/simple; bh=VODrfIAOe07267joIm9z549kGH46LS57jdE0el030yM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qFluI0tdYgR7PekyIULPJawmfhoby0j+9kNqMiDgt5YdXqsmbBS91053hS7M5UUknCHHacj5w+x13Gt8ptB2rfYTyIfzNTcVw5MfQp3Tdh29VMQrHbyOr1rNlz7FdEKKyTuRSSbmfS+RuYmYUQuMQjnOzAOWfNjXL23/gPWp1Lc= 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=B2VqTNCG; 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="B2VqTNCG" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174771; x=1740779571; i=ps.report@gmx.net; bh=VODrfIAOe07267joIm9z549kGH46LS57jdE0el030yM=; 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=B2VqTNCGTQD4bGHV90qrAB7ChrPkCg938rp8I39+vNH8jhUK2AxKVWhBx1v3m216 Z5EU9Eh9QP5c6w7pD5VqPfQoFiXK/2eAlWa/LfTubDvGbUEhjM6FNLfklGxKtMRfF csxcDaqwHK870luciDqBhnRxrSnk1ydF70N5O7WNDfDjie/BUNULJB3fIXm79nTiZ SbUt4yNM3CfwWRfRBi/XlGQ+mTKP07wiJmGgljUIoGoqPkbWVH8BNvIPJvjapfttd j5jpVQuOAJvvSmz41pHg4Gi0bVRaRBG4CmVhL6IB6Xtwvde37Sq4bxvyRCcK8hmei ygvLSm67ZtFLiLlDqg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M72sP-1tguNw1Gj1-002sHT; Fri, 21 Feb 2025 22:52:51 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 3/8] net: pktgen: remove some superfluous variable initializing Date: Fri, 21 Feb 2025 22:52:41 +0100 Message-ID: <20250221215246.383373-4-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:cKdqq80VN0HruqbYuSuJuljjOjhZaO5bS1SIDecYB+H4dcr9zfY 7s7bVt4IyRFItM0kUGFyuAHx1BUbXmal5+/q/peJWi/Y7fworxfqT2f6/5ZMHyFoxme3xRw kq6pOp8+FInDChwnZcM/58kCiBN4/BQ7t6zdX03X/tSIzW53qMituBK9YBm44eWQQ3Hqu5S tdwpIZpUasjkl+8sF+gAQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:IKXuZLgkGEc=;oO6WgifjZQ1WDL55Gn6iVu+vTB0 3/IS3juyO1soXKD5v9oWJwkZb8kiCagLEoQNzepp2lvKAY32fTfiVhA5Ggo7BSYGPwOg2YUWC piAarp7eriUi8iq5pt9I3R2xrc4HfW5LEilGUXuI0LyldYfDaiqZxmMSXauvad6YOonJyO3dV GvuoAdOEZWDO4hpVeWK134ae7DpZfIfiSaU5WLuNwwW68YreozZTW7qplyPQUlvmRe+EwC4JV uynIv7PFPeTjDMSNY3N61DTKpN1h8RM/IBDDe6lv3LtH4kq++RqI3DtZqLe2RNv+CMqHKJDrt Sa+hh+dXrWFjsi7Pn2Uj/xtTckfXau7UBrVqAKLt21VoK0849rwfcHW1aiCBc5GQbMl4WzRer s8ex25avl4TbG+jgnWoF88+fGnawMd5mESMY9ysNj6gzd38U8oV+ZNaUATCiVY6GMxuupilVd 4YXlMd2O/SdYMhq9PQz+9LOpqleaqbzKfYeEhunnPrfPNNScpCzsiFGgvVwFgnnYsdE7IhkwT 3gtBP7L/rlKOPnL5+PlhbVKkGvmq3TQbfwBqC7rrNxtcWsV4ZSSxG24N0ZTnPzTvbF1wzVZGP hRySJxvYQxmi1ryOFxis264X7xR9dhkD+hIz2zxcYrov7e8ZJb9ribH3uPPGMvhuLDyQ7Vo3l aThpH4SOG/MrisRU8bshWWPQGxgCbCzJmGgJi4vEzjshs+NxUgT9BgRubW/41dpTQT+WnXCzH +FatsR4qX24XUbUtOdLqsh9SKSIyAWaAFh2MkqIrjoRGsA4ehs5kIXeuyKiW13fKocHtJ6EFu BXLNc6gQTU7k3/S+dIKZid4k9KgvPoZrPIAsB/ifiABU4/R3DmtSTXtSWPxAZ33/pi7Dj7J18 6kO5FIHQeJrIms95QX2p9FdHllN29GYNIlMAhcyqihYCp+myZXV35EaTwSoa/ivLeZVBS4Y9J cLrYaGW8qLuDzm958hIFtS1SekdjG0Ji7IpgNWrulfn5Vd1Gcgc64waFX9nG9X6l8d/iKvjR6 GE3E2baMRqv1wTE6AirLayLQZAJsc4u2tbIDaGkvuQGxQ16BE9UXdYr6TYEv17Ld9b2k2spcY h9JkTmjHLGfBaMBU+ezpuEP+sq4Cov5nlYpvK1dHJhoG8LwtWVD5T1H9qnR16A+i4HqAKCzdA 6BgsCIrY7nNy6KgA55AGSjjRmDa3p5UAcg81lvyM6GJ+GG/CAX8XaZz0nx5DDRfMmBmun9xj4 Lv6B3w8wySaB21zQ50z34jHWpyLPXOfsvn6tjvKbFhNX/zw6ai+4g1dPNwAkXRTlQMRiY2J7K 8rZO9aA0wQSz7EJjzcMXMrT0H/jMJJNeKJVcAFw8n5OvJn6vq98YLX0dqLlIC7pOjtTpZ9EUy S9PeFT12hUcTtMDig4En7Nk61xxuOSeAg5VbXwlk1n6J7FRCgvGGt7oDeH Remove some superfluous variable initializing before hex32_arg call (as the same init is done here already). Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v5 -> v6 - adjust to dropped patch ''net: pktgen: use defines for the various dec/hex number parsing digits lengths' Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - add rev-by Simon Horman Changes v3 -> v4 - new patch (factored out of patch 'net: pktgen: fix access outside of user given buffer in pktgen_if_write()') --- net/core/pktgen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index b97a94cb85ac..204f93de03aa 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1787,7 +1787,7 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "tos")) { - __u32 tmp_value = 0; + __u32 tmp_value; len = hex32_arg(&user_buffer[i], 2, &tmp_value); if (len < 0) return len; @@ -1803,7 +1803,7 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "traffic_class")) { - __u32 tmp_value = 0; + __u32 tmp_value; len = hex32_arg(&user_buffer[i], 2, &tmp_value); if (len < 0) return len; From patchwork Fri Feb 21 21:52:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986349 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 2630E17CA17; Fri, 21 Feb 2025 21:52:55 +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=1740174778; cv=none; b=EPDrtvJ/GhHEjSKwKPlIzIT6NNnGSBINJS664STQIu0GhnBuYrX4ObohAicLjaBKjgRhSXTfP5CFqfwjkrWbjBgUvKnUCq2TdgA7BmSEcHSqlVf3s4fpM4w1xnRAIY1F9Ca5cHxloNO4ekhz2WgeISE3LnKS1T+T0ZEOA6y9vKE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174778; c=relaxed/simple; bh=+v3owkXmWRQyHjyf2WyeFFI0j1d1tsQI4XKQ/SEq5qg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iMMniYyqia3to19/y1DubosDy5Wo+F0cZ6mMev9kjgtTrzedPjBlvkwpMimmsnKCJpJlU1z3AkDr+nBN3VL00sh+lltuN1CaCluNQp440rinGkkkVLLr6CbB9pmCAO52RYUeWNi5HAQr2KaWJX3IJ0lpx0fNEEXRd1bsV4Tgu6U= 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=hwjIY/jy; 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="hwjIY/jy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174771; x=1740779571; i=ps.report@gmx.net; bh=+v3owkXmWRQyHjyf2WyeFFI0j1d1tsQI4XKQ/SEq5qg=; 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=hwjIY/jyT30ZVM/0KDRhDkxH0XJuiLq+ZKpAeT/jU67sNFNyq2cBXcjN3Z+OkIyv rsiTZyrMgO8HlEndWdlRz98oH9mbOo16dFoMjARtihHTTyx41v8jGvclbdNXDvVC/ GA2+DDJBHkjHV8KX0NqbR9SxIoDfW8LluZ7asr/RLAjsGT/7m14FVJGTzGZLjvJpr fLYZYhLJQMOnfZyS3+Lenzcbr4Dy7qO8zNfQOgdPZKu7zwkNzG8pAZ73xiUL3GvZD 9TrwQv35+emvC7ex6rpLlLlsOwi1Eus5C8hBl2w7G4UHKydS9SvBY2DI1lP/uxdcC Gj6wzmMcsTfXjg7IuQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MQMyZ-1tyyxu2nZZ-00IlH3; Fri, 21 Feb 2025 22:52:51 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 4/8] net: pktgen: fix mpls maximum labels list parsing Date: Fri, 21 Feb 2025 22:52:42 +0100 Message-ID: <20250221215246.383373-5-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:ngtz56J2gKflZ3uR8gR2zcf7bmxMDUuDTOhend7Rllu4uv+8POZ zsbtqvp7juan4agOjEvvV2DfIjiGKbsPaWilgbO7SlujGdyZsyQSJBYYla4EaH+i/jljl14 2260VeWlWdjGjH6GdziQyolPtWNmoU9i/7jzYYAx1SdQrLH9qIxqm/6rgGBZv18gIoU4Z/Z oCj9XkqV1myQrYJ+XLdRg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:qTzHgP7fCyg=;CrYBsbp9IYvyWOSxhnKVlRoYYaK V9Dl7o1IRqcPy5/ijitsaDhfShp0stOZvvreewLDnD+BjJbR37jLBveHNRMVnktD7nV8aWGCO 0bsl5OOt9gknb3ypSIcg7/cbMsFiEIto4Dfa+h9MqLEy9OJA7ZCTqiHmJJQoyYWbLIRgMf4gn Z8IJlG5nClQcsP7S0H6+CkCAOaR65EVm+efUKi4ZVQe9lNIOav6fHsnB9qgi/Puq6Tt4AU214 WlvQe0V9vcr43UWsFWJzpdxW1eJ0RfCwnnvhSDrKouEZohxYLSfe+3N2o3MnPb/y6T3BCA0vW 5pJ/CphHnXz16kXosiGmfgOgFqbbJ2aM9lmwj9ekQXph04zdvknOhd+NLQAf+L9jh97h4uU/C 9MufH3DuXmO/KW4U29liigXF44wfHITc3RT2nGdSCPixJtRO05ERsx590Tu4tQ4wLFcoVpv7j ifZTCoERbsvON6y/Ba01sbtVMLx3EnBgAKqd51yDQ0W8iQJazLWFOLG1854E8yF3L1LlzPtRn nZljurIq22XJwyYCPvbn5VGEEFGU/4j+nsu/NMCn18ejwifqEPTpOyWlel3o9J5Onuzec+Qq6 uEyxZG2/fmbINqTVxRJipUHR6By7t7aD9wZXSgrRdekUdcthw941el9dE/mTOPm7Zl/8fczNE nTT86NEelY+VbLeNjPFlayee48ELWGaqqIx2etBNjcW9bBUaaH5TfiOG+kPUeB9XcN90aCO3J rQER3aQrC7lnxT6UqOHbUZBHdCQdeWa5jn5Ruu/oef0uGgAzFNZj5gnqaarNCCCyhSza8QtYN t10MBd3wUzFH2WP/eN7t11jhj4onUTFNgrGbFcm6nLQ/0pYc6TthUKlaMJCo4jNZ0CrZRf6ce CC8OpMHz65phognb/55WPdt9dsfjf14SCXeFtCakZ7WU4AjIai2KQD7HCULTTELcYEYhnJK/z W4FnUjajRwlsodSkFUD22srzzQFitNz03/NmbomuBqongrHk13ALtveaDHylgDkNvvEAA/7Ya mjwi/wbn+c1AaweAncV0fthOi/gtYoZj28Mva0iGglDWznuW7MJ2ugA23BYQQDmMSYaRw5edX yU/25PK/lbZdytN/Tu4BHa1VUE9wljMJWCVR+33pqcnw/iKdG+I0UudU1KNYQbSgtp5zHrpZe AZqFpeyW23X43pU2YfRpE1rvy+gDGnmCpEb0loOCx66I3j7CmKkVvBLag3fk0sG4wkKxju476 BNGBUiwsucfHmsvSoLfFrg2alWFYxboMrakT+fkgC02r1BjwiKHaq8sk5o4AMI/kL8mzMbjQ3 znvWgAdwWehBx4Bm8939Q4C6K1CyV1/Ve7dLbRXwJmDVTJHROQSi832FOZpFmuWmcRWA8+CE2 YjGsoIEnKo+FnPYM1Zo1Xhvd6JB+aXULjl36MAc+rG0LVfZcD9PPJLmMbL Fix mpls maximum labels list parsing up to MAX_MPLS_LABELS/16 entries (instead of up to MAX_MPLS_LABELS - 1). Addresses the following: $ echo "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Argument list too long Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v5 -> v6 - adjust to dropped patch ''net: pktgen: use defines for the various dec/hex number parsing digits lengths' - add rev-by Simon Horman Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - change patch description ('Fixes:' -> 'Addresses the following:', suggested by Simon Horman) Changes v3 -> v4 - new patch (factored out of patch 'net: pktgen: fix access outside of user given buffer in pktgen_if_write()') --- net/core/pktgen.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 204f93de03aa..03ea6b5db156 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -902,6 +902,10 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) pkt_dev->nr_labels = 0; do { __u32 tmp; + + if (n >= MAX_MPLS_LABELS) + return -E2BIG; + len = hex32_arg(&buffer[i], 8, &tmp); if (len <= 0) return len; @@ -913,8 +917,6 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) return -EFAULT; i++; n++; - if (n >= MAX_MPLS_LABELS) - return -E2BIG; } while (c == ','); pkt_dev->nr_labels = n; From patchwork Fri Feb 21 21:52:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986354 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 AEA1D2566EE; Fri, 21 Feb 2025 21:53:01 +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=1740174784; cv=none; b=P9pFL0q+OXYcp3dapXpOVXZ51ZLGwFcBvYUSiWejqTMx0twzVhwynN3pzIp0xrJ5HOE7O07ns+gzZTb5YtsZiWKVcZB53BJ9BxAy+tk2GNBG8fiOlgNHpz4q8T0p8FJP31oLFNpEKg2LBQoPOLp8J+9UyvSd5Nel5IP+K8hpQkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174784; c=relaxed/simple; bh=5iVhlH4arzy7YhPfcWfG0tDI/rW8H3JBQAWoK+fSWIk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fgYhQZbSVnzOOk5Ul2y3P7vzcZrUihpBWGd2No86q/2hpABPVKLz5I9QjzrNL2bxRr+/gQ/FX8j6ANxboH2Krur3ZU7NwtpFpWR1C2Y6xrx4R/sS7LY+cqysmb2od5HPS4kCIfQT8XEkVukq5B+t0SPPBB09CNsasclSdHV9LIs= 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=USJ6ACkp; 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="USJ6ACkp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174772; x=1740779572; i=ps.report@gmx.net; bh=5iVhlH4arzy7YhPfcWfG0tDI/rW8H3JBQAWoK+fSWIk=; 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=USJ6ACkpKwgV0Eck5XdbA8Mdp0Q4dKACSxZjJsVGmxiL5B1KrP2ke0hRewdZGuGP VdUqnTYD8uDckyyRF0Ts9xPKLDrdG2nMyO+7Va37ar5AbyPFvZfbDSL2vreuyHHdq PBPJaZBlnApok0Xc+Dpm6vXQpc8cwaC9L+eRUZzT2PhKhx+DMDvbdBDgdrIZrjMNP eS4RCtEe6GFAn+YLC6o4fPor2bhKbD1m9W/cQN/DNuumy4l7yD5WmwfPmpICJTrJq xBV4wLIfbOlW5J3tUT5wepNou7LYshNRyjA1d4a5YHg8nHBWISlVMYsYPLTdPa0Z8 aFrC2u3RtlMtEWYS6w== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MGhuK-1tYtcs02sM-00AomM; Fri, 21 Feb 2025 22:52:52 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 5/8] net: pktgen: fix access outside of user given buffer in pktgen_if_write() Date: Fri, 21 Feb 2025 22:52:43 +0100 Message-ID: <20250221215246.383373-6-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:OojHRiFZ7tEG2SFnHQS38t0stBnOBXcxYEz07x4i38gz0s4uGzU c1/e3vSCgU6RTLVrJNucRqSHMatsYNnh8iQsmbCqxXyJPbkyDsF19rA05zw6jE14UN5p5L3 WFhLYGbv2spLBPLXfml3QVhE2r0iCOWWV8evkYLBpjiU9aPqpSb8rUakIYNHX+aWkvSWbdt M0+76I4XtjahONLNK4Mpw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:OB1++pAq+oo=;v7SVWNRggjz3XjPBIWvG0DXcZ3L UCfwhV+NIW+htc2XtCRSHIGbQ/DzWdPDRRy2S4XuuMF8ZXH1wWKDoIZRDC0z4RmK+MgGE46ah 86t9IIn7CLAucAn1O3n0ssf23uUentJN49XnDHzpEzkU3l1FEFKZe9IhZt9h44uk8h8vu2omZ 1Rk7xDMNoF3O2Ta4d+Ra01qheA6Y6Ytp/AtMfNH2btVUYdHZmt3jmEo/NKPxVlwHB+8G45Kar xbdEy2SEYM2nt/b3rW1HlJDDe8qWD00QMiozRtLEt2sH1HwSwdU/p9xbCA05LQNRQWi73IMAk KLUflTfbTzYbZjb8oO/0h4l4nXHqcjbyOaqohQuzJesHIeE/Gl0RdL+vdpz6NRfcWnOjDJ6Ez K/koYvsPuYipV4aD+1PlLP9wKztbhmCN9fsRTQICi1Pa/SFtDmV+v8353yFuYZVyEwEQr5Yxo tTYOX9GVZJIpuw2UMi9fXGtf3bgnXYGsNwrRg2g1OfB2MiBq+EK2ZWqlrj7HxY+Z1OaBo3f8E jSA7+y0R1odhFg/Mk16km0Iki6rVwSUIz91Zg0NMkFbzFVa/M5ectTikuUDKOZi5T+Irez0D0 CK9OVgswh5w4ZWDB4oM439PtEqHtXHQw82QZeDKQr4oCk2MhZU3XRC3+O/sdRfnTc2oMRme8k gx8shBLx4V4Uwo18v39dqX9wCWfjrWn3CHDOi5U8JxtIECD05jpBiLdlSHB5bfPItWzTTzL6L pWBndyLylXnv5XlwUmIRDzdWBExK08enLFtbV0nl26mY57ij+sIQXCSdbzqD3gTMyhUNbMeva wPTWuvJhX7lncFVINHujyrIdh0a10PwBUTxOQxrPjnslYdUeNvxIpy5K7GxqtUoulWcT/37sm T0uA/eCpnwyo+uQkEpTQDMAXInWbscAVp9amXPd/Sg7wpjmUf3ryWrJbgpuBXCNGVmaRLyYnN IInu52oeJke6joYT87NJweDHadDH1ZK3OmWjWt6swLiuCRCWeT5j/WylKrxSdT7Bz0LmalIRS 1ye5MkP+kgzql5XEiuLurukt53VXX/M7uZ5a7j8yf+R28G8pxG1cIIciTtQ35lHuLWnX6ZrEE a0mJn2MyQIKDd+lbJy/jv8ugabR1GCa5G+pu9zKf3zHnq0XXV9pE5nXTylMNSCo14F1dko9gE JocEsl8TAUzdswoPcZuD0tCPaLhUjnpiRMlJVS6/D4/ZdBjziUQdVM3BVy2H+wCKhTG+gSdit BcdrtA2EIahivv8BMN15x8AGNT5Cd4W9pmodJ9StmeYS90MLhQIhI9JgVyb9Qy8xsI1hoxwcB 25n3NIMkEAyDdz0q0dOF70qYB0quBfnV/w78oQU00+B3HFicXUnAzwBuGaQvPCDGC7A63/xFz 16dNOMMSkpUhq9JwdwFBbwzosmWK+MOYvQjdDruNJGFPx0/ky+x39bmfOe 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). Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v5 -> v6 - adjust to dropped patch ''net: pktgen: use defines for the various dec/hex number parsing digits lengths' Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - add rev-by Simon Horman Changes v3 -> v4: - replace C99 comment (suggested by Paolo Abeni) - drop available characters check in strn_len() (suggested by Paolo Abeni) - factored out patch 'net: pktgen: align some variable declarations to the most common pattern' (suggested by Paolo Abeni) - factored out patch 'net: pktgen: remove extra tmp variable (re-use len instead)' (suggested by Paolo Abeni) - factored out patch 'net: pktgen: remove some superfluous variable initializing' (suggested by Paolo Abeni) - factored out patch 'net: pktgen: fix mpls maximum labels list parsing' (suggested by Paolo Abeni) - factored out 'net: pktgen: hex32_arg/num_arg error out in case no characters are available' (suggested by Paolo Abeni) - factored out 'net: pktgen: num_arg error out in case no valid character is parsed' (suggested by Paolo Abeni) Changes v2 -> v3: - no changes Changes v1 -> v2: - additional fix get_imix_entries() and get_labels() --- net/core/pktgen.c | 178 ++++++++++++++++++++++++++++++---------------- 1 file changed, 118 insertions(+), 60 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 03ea6b5db156..ae5e81e62733 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -842,10 +842,10 @@ static ssize_t strn_len(const char __user *user_buffer, size_t maxlen) * "size1,weight_1 size2,weight_2 ... size_n,weight_n" for example. */ static ssize_t get_imix_entries(const char __user *buffer, + size_t maxlen, struct pktgen_dev *pkt_dev) { - const size_t max_digits = 10; - size_t i = 0; + size_t i = 0, max; ssize_t len; char c; @@ -858,10 +858,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 +875,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,20 +886,23 @@ 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, + size_t maxlen, struct pktgen_dev *pkt_dev) { unsigned int n = 0; - size_t i = 0; + size_t i = 0, max; ssize_t len; char c; @@ -906,17 +913,20 @@ static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) if (n >= MAX_MPLS_LABELS) return -E2BIG; - len = hex32_arg(&buffer[i], 8, &tmp); + 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++; } while (c == ','); pkt_dev->nr_labels = n; @@ -981,8 +991,8 @@ static ssize_t pktgen_if_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; @@ -1010,7 +1020,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; @@ -1027,7 +1038,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; @@ -1046,7 +1058,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; @@ -1066,7 +1079,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; @@ -1077,7 +1091,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; @@ -1088,7 +1103,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; @@ -1098,7 +1114,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; @@ -1113,7 +1130,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; @@ -1128,7 +1146,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; @@ -1143,7 +1162,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; @@ -1156,7 +1176,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; @@ -1169,7 +1190,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; @@ -1182,7 +1204,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; @@ -1195,7 +1218,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 @@ -1216,7 +1240,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; @@ -1227,7 +1252,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; @@ -1241,7 +1267,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; @@ -1255,7 +1282,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; @@ -1274,7 +1302,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; @@ -1295,11 +1324,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; @@ -1335,11 +1365,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; @@ -1384,7 +1415,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; @@ -1404,7 +1436,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; @@ -1424,7 +1457,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; @@ -1447,7 +1481,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; @@ -1469,7 +1504,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; @@ -1490,7 +1526,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; @@ -1513,7 +1550,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; @@ -1533,7 +1571,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; @@ -1553,7 +1592,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; @@ -1570,7 +1610,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; @@ -1594,7 +1635,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; @@ -1608,7 +1650,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; @@ -1619,7 +1662,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; @@ -1630,7 +1674,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; @@ -1641,7 +1686,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; @@ -1654,7 +1700,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; @@ -1675,7 +1722,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; @@ -1702,7 +1750,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; @@ -1717,7 +1766,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; @@ -1732,7 +1782,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; @@ -1759,7 +1810,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; @@ -1774,7 +1826,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; @@ -1790,7 +1843,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "tos")) { __u32 tmp_value; - len = hex32_arg(&user_buffer[i], 2, &tmp_value); + + max = min(2, count - i); + len = hex32_arg(&user_buffer[i], max, &tmp_value); if (len < 0) return len; @@ -1806,7 +1861,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "traffic_class")) { __u32 tmp_value; - len = hex32_arg(&user_buffer[i], 2, &tmp_value); + + max = min(2, count - i); + len = hex32_arg(&user_buffer[i], max, &tmp_value); if (len < 0) return len; @@ -1821,7 +1878,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 Fri Feb 21 21:52:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986355 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 BD6AA254AFC; Fri, 21 Feb 2025 21:53:09 +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=1740174791; cv=none; b=DIIfy5wcQF25oupJYuAt5G1SLsgdFCSjgYl09wnVD3lGRKWH3zEPIpOW6fsokwnCBt1OhdkOZlWch2H/TNMgI3UDbGB3qkbalXlKO1XDe6HdJaag1rYco5dLqaY3/nQUH4v0MXnMR/CIktGa0RnjMhEKss1C3jXtP0eLVQ1qpYY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174791; c=relaxed/simple; bh=Qwm/ZyjpdhkDocHMi8i0ILfU4x9hiN8jcpFLjrntmoY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C3gHb0j28gvVIgMzSymh6/nz5lNAVIEi5wvNTs2QTxFyYwc+JAuon1r95UQMGzL0N+QkC0rxTfmxvu68aXwg1NC0OI8W46plceP57N9CUQiD1Xdm7PYqgie3F6BywkK3kMmb+qEYGiKeOZ8btvqeZAucH36s7UxvqLfc4aFzeUU= 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=qqXXQ370; 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="qqXXQ370" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174772; x=1740779572; i=ps.report@gmx.net; bh=Qwm/ZyjpdhkDocHMi8i0ILfU4x9hiN8jcpFLjrntmoY=; 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=qqXXQ370oFnCrQBLYEVKs1nHXoRDqA1ZhAjqhAPRLfu4sjpodQVzHtPCU5XJlIWG XCMpi0Pjr85cLkoyrTKYG+YBL39Mq4EMpJY4VX1Bpxb/x1RHfuqHHreVMoNAZN8FR UzHiRtkcON5DiIx2qPrld+PG3iRd6hTPO7OqrciS4evAy0NuAKke7lJkg4ycjUWPe y2DfJ/+n6R4UlaGrb9gYTfbofGISfZUx+lCsfjpJEhH3Ka/Lhr6M5fhnH3Geegwws lGJ2ljflG6hyXOf01G1NBSSsWmjsP1CS5kIabLYU1YkPzvugDcUWIJTpvL3xWSSpb pPn4/4VbbE+LDk2GcA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MjjCL-1t23mp1W0p-00qSBz; Fri, 21 Feb 2025 22:52:52 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 6/8] net: pktgen: fix mpls reset parsing Date: Fri, 21 Feb 2025 22:52:44 +0100 Message-ID: <20250221215246.383373-7-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:XCPdRkYaXrxHVQCYuZroPgUyVu/nBy1PlfUO+RagSKzue6EGDh7 9a1Jv6eGKwNWYW1zNyRtQfBa0Ttf8fqDql7kvE78cb8UIqEnoo+GrfBfOZfb7sibNNIsp0Z 2vivF5GhMhHyIlC0M6dbbLyF7kbT0Hh8eZnCcvkf/CR+VVU2QW/7PQ4D8yUNdhUle3tT0Q+ TLxVsVZXCl2bBpKqXMuyQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:3BS/0PHFWLo=;QpWdXmmbMNa+DayRbtScybxB2Mg 5w3tmXepl3PdJuTrlQZedwb99MKBiZJqseK62zCy/1A8JoP85ob2F229Hsg1sfecwI5sKszbW dplUUcKZ1UgryZon0y4LaWGhjPOZsWhl+kY2tt3RGr2tBpSQLKvV3XZwZ+NK9vG49iyuMMPSu rhj2YYRKorX4943ZtivWQKMx/CCBP4wtOOyb9v7nGwdwZoX0Vx1yYEQJnPt9dH37wdE+mzTSA QEGAAx4ssnLf/Q3DB/NTHWTH/+8G9DqvSoDrsW84JI/SGpXqP9FlqPAg2XPIBMaKwpYN+TCXw GjGwOeuVb2JXZ8DbUViIhENI0uf7dFKfTAwF32Fn3ehviqvcPwLjnFtGJFQIqmF5N44OoC9v4 KeYE2NQtYOFx7nYfSSwBfxzfavuawHoIptbR8+T4i4zZvSbjhSx8nGkH45zXxATmGfm7Xl80W +hvvSCAtZkiuwjdLjHkPLXJpDGzHjszkOx2Q+nwRzF7PI9YDwkg3dxfw8OQy2Z/4uWaFTeiIV fRaJc1i6SzI2gDui9mdtTYJAE0g2gRzZodbIuh4maeAeIVbOLsI0Adz7H2kI26yoXNu354GKN XRDWTbK1M/Y1A+WMrmyiM4ts2k8UGQc1QV4TNdWUX8vX33QM8R8c3K3B+7nw99iCbvRBuvcmL aFse7hA2vJw63YnHNEyvSnYkZTPMdBgIqkf8oXBI5u66/EN1wATtmyoiFsPtZfQqpQo8PgY70 LHYLKMbP/l2eNmwABTJiYXBGkKJszIyLXfVeD9IWTuvnRNoMCWjXAXa/6Cus1vQgAmjTTjgnW E/iMSoKimm5XzKE4s8K9BjTTn20u/8F+YGQ+wFhNDV6CptAJyM7mioXTYWW2Oh9d5wC0JwFwc WUtmVNVYvh5qVH2Yu3AM/t6xsxhRGZJGXHCFIdtiy93Q1Kp6FMi7Li0Cn41Ruiu1UI0953I9z uAqBiYsrPhLc9wVG7XiPYhewm14Rhzy0dLkD5K4q/BOBD2u5t7Jw8i2abtaMJEwP90kf2fgku rZjdidu8kuXPUAt/ltg+AzsaITb8GL64kTmz+bkkrC7GNya93gTZHVE9Q971HNgleFHwOEVsE 0Ctz3/UD75mWZrx0bLDcXn4AkrbW8+KLbzG7ZWWSByT8rolW6GWCkc5dNusUfGDL6PjHWBotO pmT5yAX+byCV27jTFxy8dieulmwu0x6wXko81kWe8lSFsaRPiYBmyKIDTBm0blPVQBawUg7vJ u6Zq2B/53xlcFRRB2yKOBDxxjESZk0D2Z/Amhf++0gqo1oKbFK5+UrA1n2D3quGMeL/5iPdVe Ewm2VofVPOG9MuWLWYT0eudRcLksjan+y6lqNiTzcnIuoVZWFQCd+ro/ahBfAkG6ylTltihWy gER9Va3exVHWukzusBVcWUaruEUPMgM3TeOVbYKJw9LDMcUZWQFLcKp9vO 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 v5 -> v6 - no changes Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) Changes v3 -> v4 - add rev-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 ae5e81e62733..bb13a4591709 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -915,8 +915,13 @@ static ssize_t get_labels(const char __user *buffer, 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 Fri Feb 21 21:52:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986351 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 E30A2254AEB; Fri, 21 Feb 2025 21:52:58 +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=1740174781; cv=none; b=WZYSeMGJq6VDPUkOjk8ggJBXyZp2E+1tq3lXjMPtDu/GpbCcbNam+fgUvXApnafkTYps5dp1T0GEBIAKkHk6fK5g8+gwr2f5gGG6EBTK+bo38fmVZyQgi7uH6Tjbi0bXvA5G3F0nsB5Lrj/VM9jGJhx2I2BFjpwVH2ToJv7/PpA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174781; c=relaxed/simple; bh=UtKew6Eez2SIXGIbQ5rXGr5jFF1Mk29CHbzNmGZAzXo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XOGt6bVzg6Iff5GXRGqUD5GhlDXdFR36iuISROHGjHLCjIumh7yleMTOJ2x8+/lz8sKpzlGVbUaPwX5qbuhGCG983joukfzv7DkrbOFE05eXeanFlkMU/QedqJZUZ5OyxygIwa9uY/oLnUp7SYub7mHJN2sYHu2qHNynFlfJSjs= 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=XjErbkeB; 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="XjErbkeB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174772; x=1740779572; i=ps.report@gmx.net; bh=UtKew6Eez2SIXGIbQ5rXGr5jFF1Mk29CHbzNmGZAzXo=; 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=XjErbkeBCRxRySC+DRLk/BhItVACLA9f6b2/eRCX2Nh/v19Zh/VazPddQyLHdGGM +2h/pI6o0iqm4/08f2NFXVPEyW/Yuh5BABJNUgGIae+BqsbLM77PvfVHGWmK+/E5F 0HgRTmrzPXWLGWNaTCSDMbPNqLZ7/6sPQI2Ee/kk623RPFk+lK3csAPMGo1Url33u PjkEuApqP2s7v5ii8sPfYIhLsvGbXhABv8KBn/yDS1Hv7P8oxpuRUtwRvjakVgDQS tvaZOrjOsJUvq5WFX++I09NixVfiFtLsZOOViJ7wCVngAjkvgytEa7+KjbPh9cNOl X5PuDlgtbGfMDW1y0A== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MpUUw-1sxueG31Bc-00khYe; Fri, 21 Feb 2025 22:52:52 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 7/8] net: pktgen: remove all superfluous index assignements Date: Fri, 21 Feb 2025 22:52:45 +0100 Message-ID: <20250221215246.383373-8-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:LEXTvr0eBkmeE0oHrcwUkDBgMRv2Lnvnd+7EYb0OUfYL1RkiOU2 l+XlHzO21/VojZv6oLmLBJFx+IIBr0/sLsLkJTMENtou3kfLSg+u2miDv7VksRIvrbqq2IC cvoehvzE95SI4NgCK0JrEfSMrm1J5MWwOjOdrJlOj2kDA9CNCEp65S5NHtVsGo9zmyG4S1H usaTLnCc4BkycD9v4BtEA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:cuDUjUyhPWc=;ni/nDQ1uGVO8q4/xLHAczPV3nDb hTe4S2yeDdmmygg1RHIIN9fhpIzyw0EBBGLCl/mH/l1VaqdaBPPjkHVY/+vUXlxlbGLUyD4ZM LdrgKXnEi+YxqSPi0+bRnPw4H+WfSucAETMnPJteFJrMu5LM4bu2aR+aV3IEvxQ0/ilu+E7TD 6Y2PPCe0feZDRKlPNPfxAlKl4kiib/caYBtbtb8mD8vvMTgCqCdFqXw4ogAGrPe7PwyBpn2/k KTQjG+A/dv4jVLfEwn5GZdQCLi1/KTofZbWFBJtxgXSW9c8ycVD8M4WkESBQ0cqIi7JtOqabC uvQCZ/v85qw0SmX1rGswMB5WqKFtAYPMUNfEOMchOztpR96kXFy9X+JTPXgKvmIc2tKy0MIKJ wL1KrbY4U0yqWp6AEClMsPD/JSbeepguIndzbS9rZ5TlX8zAFyon7aHUjf4Jkpnt8sCF5yKz9 pQ1kc3/lH9SelkKApWuFfhc0aeC55knPzgnBq444uzkiQSZ2d1kqlg/mdXFIMQJR1jcj1jzRk WL/ctigBIskqaO1sF2nvKQJW2NX7wNqmFmTuNHx/xixJTmqNY9Uu55ArvwyVkLbOl689lpJA4 f7uzjBGGoPlpYiObyOtSjsuLMucPHXyMgl4yGVeJ/oF603v9OE176+U2ZINqllF1BTdk4lJpL hXKcw57ldvL51Ls/9vypXisGnBbrKHBRH42dokY++ete+BUgOGa4vsCSCP8KDQWEB0PKavfrT RPshIkK3vBKQHoxPrAT9HlWNQdbP6e7H5K9CXIVSh9sugRzdzpuLb+sQYKAkob4o3P6nhkDUi husDCbq1t2Q2odLyrWVJL7Ujo/PVfagemuaAEsVlpc8yH+p8uL3vSvUg63EbOO+HcAJZcEviT uidOO41t0OnACSuSBRPWOIoaEuMvmnQwZYIrhkQG6ViEC1jXgvoLQRLLHR9BuixD6Gqp+fyEu tlQJzW0n12zji7bfMS3UEjdxnbNyY0+5bAoTvJDpyRQny0d8esRn1MxMlceTQ7P6BTtgHj3MC KoIxPpbGOvhpphoEqC6YAllICD5PNqmOKRuSMjhyGw93WJ/DYF7MjVWrr68ycuhClCAvifZVi SSViMWYDlNAKdEDncVkwhMTr2pCuVAtSooD6kd4cZ1evFWXkOvPlV+p4RFJnEnkQU7SM/LT37 vy9mHev06fUKEMDyqPppOwDWH3zR6F6XWpqkJMgeaSA0oJQEiaUxZOyQHgFpnuM9KNToYi4np wa2q0KVz2fm8jWdqvVZd2soapyzyMGAXxVl4I63PdXUUpWz8rEJynS2LEK/LF76CfQq8jfiPn sqSQwZc8BpDsUkWiRjUQGKA+aYuKxdeIYwJmxKE2Tw35ZwDFuBbJXRbrI3MxqYZ3hIPCU8r4q qzAlLJdvEkBQWIJhckfzNxv2qVgQ78WqEwu912+trWBkBxnJI53j3Ptea5 Remove all superfluous index ('i += len') assignements (value not used afterwards). Signed-off-by: Peter Seiderer Reviewed-by: Simon Horman --- Changes v5 -> v6 - add rev-by Simon Horman Changes v4 -> v5 - new patch (suggested by Simon Horman) --- net/core/pktgen.c | 52 ++++++----------------------------------------- 1 file changed, 6 insertions(+), 46 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index bb13a4591709..96511e57c3fb 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1030,7 +1030,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value < 14 + 20 + 8) value = 14 + 20 + 8; if (value != pkt_dev->min_pkt_size) { @@ -1048,7 +1047,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value < 14 + 20 + 8) value = 14 + 20 + 8; if (value != pkt_dev->max_pkt_size) { @@ -1068,7 +1066,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value < 14 + 20 + 8) value = 14 + 20 + 8; if (value != pkt_dev->min_pkt_size) { @@ -1091,7 +1088,6 @@ static ssize_t pktgen_if_write(struct file *file, fill_imix_distribution(pkt_dev); - i += len; return count; } @@ -1101,7 +1097,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; debug = value; sprintf(pg_result, "OK: debug=%u", debug); return count; @@ -1113,7 +1108,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->nfrags = value; sprintf(pg_result, "OK: frags=%d", pkt_dev->nfrags); return count; @@ -1124,7 +1118,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value == 0x7FFFFFFF) pkt_dev->delay = ULLONG_MAX; else @@ -1140,7 +1133,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (!value) return -EINVAL; pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value; @@ -1156,7 +1148,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (!value) return -EINVAL; pkt_dev->delay = NSEC_PER_SEC/value; @@ -1172,7 +1163,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value != pkt_dev->udp_src_min) { pkt_dev->udp_src_min = value; pkt_dev->cur_udp_src = value; @@ -1186,7 +1176,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value != pkt_dev->udp_dst_min) { pkt_dev->udp_dst_min = value; pkt_dev->cur_udp_dst = value; @@ -1200,7 +1189,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value != pkt_dev->udp_src_max) { pkt_dev->udp_src_max = value; pkt_dev->cur_udp_src = value; @@ -1214,7 +1202,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value != pkt_dev->udp_dst_max) { pkt_dev->udp_dst_max = value; pkt_dev->cur_udp_dst = value; @@ -1238,7 +1225,6 @@ static ssize_t pktgen_if_write(struct file *file, !(pkt_dev->flags & F_SHARED))) return -EINVAL; - i += len; pkt_dev->clone_skb = value; sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb); @@ -1250,7 +1236,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->count = value; sprintf(pg_result, "OK: count=%llu", (unsigned long long)pkt_dev->count); @@ -1262,7 +1247,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (pkt_dev->src_mac_count != value) { pkt_dev->src_mac_count = value; pkt_dev->cur_src_mac_offset = 0; @@ -1277,7 +1261,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (pkt_dev->dst_mac_count != value) { pkt_dev->dst_mac_count = value; pkt_dev->cur_dst_mac_offset = 0; @@ -1292,7 +1275,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if ((value > 1) && ((pkt_dev->xmit_mode == M_QUEUE_XMIT) || ((pkt_dev->xmit_mode == M_START_XMIT) && @@ -1312,8 +1294,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; - if (node_possible(value)) { pkt_dev->node = value; sprintf(pg_result, "OK: node=%d", pkt_dev->node); @@ -1337,7 +1317,6 @@ static ssize_t pktgen_if_write(struct file *file, memset(f, 0, sizeof(f)); if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; - i += len; if (strcmp(f, "start_xmit") == 0) { pkt_dev->xmit_mode = M_START_XMIT; @@ -1378,7 +1357,6 @@ static ssize_t pktgen_if_write(struct file *file, memset(f, 0, 32); if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; - i += len; flag = pktgen_read_flag(f, &disable); if (flag) { @@ -1436,7 +1414,7 @@ static ssize_t pktgen_if_write(struct file *file, } if (debug) pr_debug("dst_min set to: %s\n", pkt_dev->dst_min); - i += len; + sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min); return count; } @@ -1457,7 +1435,7 @@ static ssize_t pktgen_if_write(struct file *file, } if (debug) pr_debug("dst_max set to: %s\n", pkt_dev->dst_max); - i += len; + sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max); return count; } @@ -1481,7 +1459,6 @@ static ssize_t pktgen_if_write(struct file *file, if (debug) pr_debug("dst6 set to: %s\n", buf); - i += len; sprintf(pg_result, "OK: dst6=%s", buf); return count; } @@ -1504,7 +1481,6 @@ static ssize_t pktgen_if_write(struct file *file, if (debug) pr_debug("dst6_min set to: %s\n", buf); - i += len; sprintf(pg_result, "OK: dst6_min=%s", buf); return count; } @@ -1526,7 +1502,6 @@ static ssize_t pktgen_if_write(struct file *file, if (debug) pr_debug("dst6_max set to: %s\n", buf); - i += len; sprintf(pg_result, "OK: dst6_max=%s", buf); return count; } @@ -1550,7 +1525,6 @@ static ssize_t pktgen_if_write(struct file *file, if (debug) pr_debug("src6 set to: %s\n", buf); - i += len; sprintf(pg_result, "OK: src6=%s", buf); return count; } @@ -1571,7 +1545,7 @@ static ssize_t pktgen_if_write(struct file *file, } if (debug) pr_debug("src_min set to: %s\n", pkt_dev->src_min); - i += len; + sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min); return count; } @@ -1592,7 +1566,7 @@ static ssize_t pktgen_if_write(struct file *file, } if (debug) pr_debug("src_max set to: %s\n", pkt_dev->src_max); - i += len; + sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max); return count; } @@ -1645,7 +1619,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value > MAX_CFLOWS) value = MAX_CFLOWS; @@ -1660,7 +1633,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->spi = value; sprintf(pg_result, "OK: spi=%u", pkt_dev->spi); return count; @@ -1672,7 +1644,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->lflow = value; sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); return count; @@ -1684,7 +1655,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->queue_map_min = value; sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); return count; @@ -1696,7 +1666,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->queue_map_max = value; sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); return count; @@ -1709,7 +1678,7 @@ static ssize_t pktgen_if_write(struct file *file, len = get_labels(&user_buffer[i], max, pkt_dev); if (len < 0) return len; - i += len; + cnt = sprintf(pg_result, "OK: mpls="); for (n = 0; n < pkt_dev->nr_labels; n++) cnt += sprintf(pg_result + cnt, @@ -1732,7 +1701,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (value <= 4095) { pkt_dev->vlan_id = value; /* turn on VLAN */ @@ -1760,7 +1728,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { pkt_dev->vlan_p = value; sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p); @@ -1776,7 +1743,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { pkt_dev->vlan_cfi = value; sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi); @@ -1792,7 +1758,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { pkt_dev->svlan_id = value; /* turn on SVLAN */ @@ -1820,7 +1785,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { pkt_dev->svlan_p = value; sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p); @@ -1836,7 +1800,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { pkt_dev->svlan_cfi = value; sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi); @@ -1854,7 +1817,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (len == 2) { pkt_dev->tos = tmp_value; sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos); @@ -1872,7 +1834,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; if (len == 2) { pkt_dev->traffic_class = tmp_value; sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class); @@ -1888,7 +1849,6 @@ static ssize_t pktgen_if_write(struct file *file, if (len < 0) return len; - i += len; pkt_dev->skb_priority = value; sprintf(pg_result, "OK: skb_priority=%i", pkt_dev->skb_priority); @@ -2005,7 +1965,7 @@ static ssize_t pktgen_thread_write(struct file *file, } if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; - i += len; + mutex_lock(&pktgen_thread_lock); ret = pktgen_add_device(t, f); mutex_unlock(&pktgen_thread_lock); From patchwork Fri Feb 21 21:52:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13986356 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 82665257AE6; Fri, 21 Feb 2025 21:53:11 +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=1740174794; cv=none; b=p9rNLjJdXKRS1+JJWqfGF2eZGh+E30LzZJMb1XaxlbPqGnnAkcBw6F7n/Vv5XqptKNM6/1OCgcHh+7qkHA5TaqHdqr9bWq6+UFCq62hkoPZEXw6UBt3cR3XvkiTq1Dr5BrJXuxxq/X7rqvAEBKx6uQfDkRSmrqpPPjICmaSVaF4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740174794; c=relaxed/simple; bh=c4MzV5QNFOw17wXCRMjBHThIgwuK82KlV9LXlwSIj1w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f+mbcUJcBrz6TGx7BSTh1e0gvWLQ/UUspcjrkwWNFF54NBxVy993pUis0Nowq0CglXW9+HeVyyCu87Ng6b+pdpq0+C/EYJybg4GSsL088ramzLXsawOcugXBpAaoOH+/81t0M1KpP+hirVTPj2TeQK82q4Pq9v/CMsRlm2y6+SY= 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=sB2S4PlL; 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="sB2S4PlL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1740174773; x=1740779573; i=ps.report@gmx.net; bh=c4MzV5QNFOw17wXCRMjBHThIgwuK82KlV9LXlwSIj1w=; 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=sB2S4PlLEK/1hysYmCwkzAKmei70A3vsF4C1bxOeI9JeuChTxmYhBVPordufpaBq Q1aBsR5qox6gwbBkiJgcKI6f3mBJuZETF3Ya1Xw2C514fGqH915Igkq6Dn2qRATzI enrTI//2J44ugu/w+r2gXmKKsuCJZlsetZJpgI0mVB5ya5+vC8am4taMR4ZfAIg76 jYMHNob880em3qjN5zm/t9Uotn3WY/DqKqdt8Mmhp1DSfzwHwaWeNAFQRkLu3n9IV VuiZwQJ/IBxsSknMDJYbQfNaTtsmyMhLYXfA9LDoBY/cq9k86GysP553iVcNHlugL 2qPoiRH9VnpxRlGlsg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.92]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MSKuA-1ts6H70C52-00YNHA; Fri, 21 Feb 2025 22:52:53 +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 , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao Subject: [PATCH net-next v6 8/8] selftest: net: add proc_net_pktgen Date: Fri, 21 Feb 2025 22:52:46 +0100 Message-ID: <20250221215246.383373-9-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250221215246.383373-1-ps.report@gmx.net> References: <20250221215246.383373-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:n8h81UcJOY1mExQo/IHsFWCf+CZR/R9JSKO2xWYrfG99FkhpRLE LVvs6fiy8ad4U+OWAvURN9NqNBOYdYVN5auCx9tGNAu3Ly+l8lFnHq8nZROeeU1AmtKzDNn /VxOQxC19Q7izIjkeq5bnjBO5UsSpl6cPKJTd3EHitsKPhB0mvZfSXr7jm8tAqPbxylkKbH xOa9OWS5tJCwCKSocplTQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:MOHJ7BqcxXc=;qddsZSIDopy+NHPdo8RzT++H7Yp EEqA5KWAUZJ/FEzSJpb2eL1QW/G2oHKHbBF1YleQ+Pr+YD2/i/US9G9/7zdn14jUggALn66oy Wto+kQabLLrNarEb+3chhuFhiMJ+Sn1NTW5qmONJhmNRkmfPm4li7fqHk8C8ZnISRJBSexEiA d7H5yQ4wIpPAFlKo4SWGhLUvviMWV3Il8cfclH7ZRz8fvtDX/9GETiZKwpJwKmHPHQeAC+25p OAHv2gzobbTGhVG2MgJZ3/IPwDBZDAmrxWD3BKEjmZWt9X3EyOQEr6JolMYnysY9YCjreuv1l KboQ++1iqch1cvr0lgSsmk7zHe1BLRwiOB69yIckNz8OzRMeD9O4AtUWGuWHFzwKcb7+LVSxD ZFGl4U29pnBZqKFbgdQlwtq3a/+49DpvSrwRLaRS/3F1DjmqJrJrwQ0eSA0z0tLNjQGO/e1nL Mu0MqaaiK334N10mLp29fLR1J1QwyI2EppuNf9AsRA2At1JwGkOr6zlR2hm/ebDagFuY5E75N joEpb+JMOBeGIugs1BhK+O3NiFR+SKFNrKK0jZ74FyQ/pwdHbDq1rYtzfDopDyjw9qXFy4RPO ki8gDMa+3KdtPI867OFGS6ZGdQvFBGK6NVOvR3dTZzUPXrHMNuKuNgWBg/UwDc3QifpgDvqCZ 0ufKBRR3Au4Frf5cBV4WOnLNaAHKkI9h3/xSNu9hfbEnpvPwEKg8+Cyj1/09ARaG2cQazVYUI sJu0ZFm1BKT1JQklnk/ShZZHsksT6hl2GjO7q07T7MPRG0gwj8G8mjPV+X+EBCRgUAHeJmV1O TXau4/GmsZmqjbl5RbAbBWui5r+tY4M+T34u625MhBkZ6FOyXjt1mlYKJA6+5PqLYZM+AoOss uzLn1roW090mrJ9sqkh6l527KdBVAiIk1cyQSYcgGHOENj5b3TkqL/Y/w33d0EPkyg0k/5lU9 Zqqsi9myylCP7ofn1ZkDivDxGyBlVBa01cvBf16oq2vv+B3jfzMDqca9udXxqFjBZANYelPO3 1z3+eh5fH97jN7KS17+Dlwv8ElRP572gof7HIdG4MGhRNlVQj7NUlapww81WYqTUb7Or+oT6/ fMva5T0KPDK/UVpG9E/J/Ql9YtPFd8M2AtRqLkUqEnNvOZwGfUNlamZwh00pgEbXRIODPgxFQ EJSPaSB8rzsqBb9p51rIYu1i5Z7KDaa/J9ZqKz+TGuLLT+yDc4UjMRnUC4mw4gBpewfk9Ha/7 7GC6Ot6RFAW+qyBVU+Oy7Vwv6cqj6LJJN9/Xy24S13SVaEu1vmRP1yse2JDPGzfjXaGOL6ecW DBhzNRJ1qF3UIxMeVIaNmfPgOYZYXnJF7IXbyVp+ZqpX5bAK59tpbaYTQbO84KKUVqJD+1/aq gZtAB2PWT3sq5FnXust8IzrxKl/dXkgmzd5IfYBKxJ86DKvBdgbnwhFzlc 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 v5 -> v6 - no changes Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - addapt to dropped patch 'net: pktgen: hex32_arg/num_arg error out in case no characters are available', empty hex/num arg is now implicit assumed as zero value (instead of failure) Changes v3 -> v4: - no changes 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 | 646 ++++++++++++++++++ 3 files changed, 648 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 8d6116b80cf1..10b47fd964b0 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -103,6 +103,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..917f45be4769 --- /dev/null +++ b/tools/testing/selftests/net/proc_net_pktgen.c @@ -0,0 +1,646 @@ +// 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, sizeof(dev_cmd_min_pkt_size_0)); + + // 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, sizeof(dev_cmd_min_pkt_size_0) - 1); + + // with trailing '\0' + len = write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pkt_size_1)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_1)); + + // 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, sizeof(dev_cmd_min_pkt_size_1) - 1); + + // 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