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@gmx.net Reviewed-by: Simon Horman horms@kernel.org --- 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;