[PATCH net-next v5 6/8] net: pktgen: fix mpls reset parsing

From: Peter Seiderer
Date: Thu Feb 13 2025 - 06:20:36 EST


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 <ps.report@xxxxxxx>
Reviewed-by: Simon Horman <horms@xxxxxxxxxx>
---
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 780435a8e605..1a0cfff2f3d7 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -925,8 +925,13 @@ static ssize_t get_labels(const char __user *buffer,

max = min(HEX_8_DIGITS, 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;
--
2.48.1