Commit ecdec65e authored by William Liu's avatar William Liu Committed by Jakub Kicinski
Browse files

selftests/tc-testing: Add tests for restrictions on netem duplication

Ensure that a duplicating netem cannot exist in a tree with other netems
in both qdisc addition and change. This is meant to prevent the soft
lockup and OOM loop scenario discussed in [1]. Also adjust a HFSC's
re-entrancy test case with netem for this new restriction - KASAN
still triggers upon its failure.

[1] https://lore.kernel.org/netdev/8DuRWwfqjoRDLDmBMlIfbrsZg9Gx50DHJc1ilxsEBNe2D6NMoigR_eIRIG0LOjMc3r10nUUZtArXx4oZBIdUfZQrwjcQhdinnMis_0G7VEk=@willsroot.io/



Signed-off-by: default avatarWilliam Liu <will@willsroot.io>
Reviewed-by: default avatarSavino Dicanosa <savy@syst3mfailure.io>
Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Link: https://patch.msgid.link/20250708164219.875521-1-will@willsroot.io


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent ec8e0e3d
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -478,7 +478,6 @@
            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 netem duplicate 100%",
            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 1 u32 match ip dst 10.10.10.1/32 flowid 1:1",
            "$TC class add dev $DUMMY parent 1:0 classid 1:2 hfsc ls m2 10Mbit",
            "$TC qdisc add dev $DUMMY parent 1:2 handle 3:0 netem duplicate 100%",
            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 2 u32 match ip dst 10.10.10.2/32 flowid 1:2",
            "ping -c 1 10.10.10.1 -I$DUMMY > /dev/null || true",
            "$TC filter del dev $DUMMY parent 1:0 protocol ip prio 1",
@@ -491,8 +490,8 @@
            {
                "kind": "hfsc",
                "handle": "1:",
                "bytes": 392,
                "packets": 4
                "bytes": 294,
                "packets": 3
            }
        ],
        "matchCount": "1",
+81 −0
Original line number Diff line number Diff line
@@ -336,5 +336,86 @@
        "teardown": [
            "$TC qdisc del dev $DUMMY handle 1: root"
        ]
    },
    {
        "id": "d34d",
        "name": "NETEM test qdisc duplication restriction in qdisc tree in netem_change root",
        "category": ["qdisc", "netem"],
        "plugins": {
            "requires": "nsPlugin"
        },
        "setup": [
            "$TC qdisc add dev $DUMMY root handle 1: netem limit 1",
            "$TC qdisc add dev $DUMMY parent 1: handle 2: netem limit 1"
        ],
        "cmdUnderTest": "$TC qdisc change dev $DUMMY handle 1: netem duplicate 50%",
        "expExitCode": "2",
        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
        "matchPattern": "qdisc netem",
        "matchCount": "2",
        "teardown": [
            "$TC qdisc del dev $DUMMY handle 1:0 root"
        ]
    },
    {
        "id": "b33f",
        "name": "NETEM test qdisc duplication restriction in qdisc tree in netem_change non-root",
        "category": ["qdisc", "netem"],
        "plugins": {
            "requires": "nsPlugin"
        },
        "setup": [
            "$TC qdisc add dev $DUMMY root handle 1: netem limit 1",
            "$TC qdisc add dev $DUMMY parent 1: handle 2: netem limit 1"
        ],
        "cmdUnderTest": "$TC qdisc change dev $DUMMY handle 2: netem duplicate 50%",
        "expExitCode": "2",
        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
        "matchPattern": "qdisc netem",
        "matchCount": "2",
        "teardown": [
            "$TC qdisc del dev $DUMMY handle 1:0 root"
        ]
    },
    {
        "id": "cafe",
        "name": "NETEM test qdisc duplication restriction in qdisc tree",
        "category": ["qdisc", "netem"],
        "plugins": {
            "requires": "nsPlugin"
        },
        "setup": [
            "$TC qdisc add dev $DUMMY root handle 1: netem limit 1 duplicate 100%"
        ],
        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1: handle 2: netem duplicate 100%",
        "expExitCode": "2",
        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
        "matchPattern": "qdisc netem",
        "matchCount": "1",
        "teardown": [
            "$TC qdisc del dev $DUMMY handle 1:0 root"
        ]
    },
    {
        "id": "1337",
        "name": "NETEM test qdisc duplication restriction in qdisc tree across branches",
        "category": ["qdisc", "netem"],
        "plugins": {
            "requires": "nsPlugin"
        },
        "setup": [
            "$TC qdisc add dev $DUMMY parent root handle 1:0 hfsc",
            "$TC class add dev $DUMMY parent 1:0 classid 1:1 hfsc rt m2 10Mbit",
            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 netem",
            "$TC class add dev $DUMMY parent 1:0 classid 1:2 hfsc rt m2 10Mbit"
        ],
        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:2 handle 3:0 netem duplicate 100%",
        "expExitCode": "2",
        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
        "matchPattern": "qdisc netem",
        "matchCount": "1",
        "teardown": [
            "$TC qdisc del dev $DUMMY handle 1:0 root"
        ]
    }
]