public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: netdev@vger.kernel.org
Cc: Stephen Hemminger <stephen@networkplumber.org>
Subject: [PATCH net v2 10/10] selftests/tc-testing: add netem configuration and traffic tests
Date: Sat, 14 Mar 2026 17:14:14 -0700	[thread overview]
Message-ID: <20260315001649.23931-11-stephen@networkplumber.org> (raw)
In-Reply-To: <20260315001649.23931-1-stephen@networkplumber.org>

Add tests for netem topologies that were previously untested.

Configuration tests (nsPlugin only) verify tc commands succeed:
  - HTB/HFSC roots with multiple netem leaves
  - netem with pfifo, TBF, SFQ child qdiscs
  - HTB -> netem -> TBF three-level chain
  - netem nested inside netem
  - all impairments combined in a single qdisc

Traffic tests (scapyPlugin) verify packets flow through:
  - basic delay, duplication, loss, corrupt
  - HTB with two duplicating netem leaves
  - HFSC with duplicating netem child
  - nested netem with duplication
  - netem with TBF child
  - all impairments combined

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 .../tc-testing/tc-tests/qdiscs/netem.json     | 590 ++++++++++++++++++
 1 file changed, 590 insertions(+)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/netem.json b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/netem.json
index 7985b5215853..01011cd05f55 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/netem.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/netem.json
@@ -417,5 +417,595 @@
         "teardown": [
             "$TC qdisc del dev $DUMMY handle 1:0 root"
         ]
+    },
+    {
+        "id": "a1b2",
+        "name": "NETEM with pfifo child qdisc",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:1 handle 10: pfifo limit 50",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc pfifo 10:",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "c2d3",
+        "name": "NETEM under HTB with two netem leaves",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: htb default 10",
+            "$TC class add dev $DUMMY parent 1: classid 1:10 htb rate 10mbit",
+            "$TC class add dev $DUMMY parent 1: classid 1:20 htb rate 10mbit",
+            "$TC qdisc add dev $DUMMY parent 1:10 handle 10: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:20 handle 20: netem delay 20ms",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "d4e5",
+        "name": "NETEM under HTB with duplication on one leaf",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: htb default 10",
+            "$TC class add dev $DUMMY parent 1: classid 1:10 htb rate 10mbit",
+            "$TC class add dev $DUMMY parent 1: classid 1:20 htb rate 10mbit",
+            "$TC qdisc add dev $DUMMY parent 1:10 handle 10: netem delay 10ms duplicate 25%"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:20 handle 20: netem delay 20ms",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "e5f6",
+        "name": "NETEM under HTB with duplication on both leaves",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: htb default 10",
+            "$TC class add dev $DUMMY parent 1: classid 1:10 htb rate 10mbit",
+            "$TC class add dev $DUMMY parent 1: classid 1:20 htb rate 10mbit",
+            "$TC qdisc add dev $DUMMY parent 1:10 handle 10: netem delay 10ms duplicate 25%"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:20 handle 20: netem delay 10ms duplicate 25%",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "f6a7",
+        "name": "NETEM under HFSC class",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: hfsc default 1",
+            "$TC class add dev $DUMMY parent 1: classid 1:1 hfsc rt m2 10mbit"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:1 handle 10: netem delay 10ms",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem 10:",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "a7b8",
+        "name": "NETEM with duplication under HFSC class",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: hfsc default 1",
+            "$TC class add dev $DUMMY parent 1: classid 1:1 hfsc rt m2 10mbit"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:1 handle 10: netem delay 10ms duplicate 50%",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem 10:.*duplicate 50%",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "b8c9",
+        "name": "NETEM under two HFSC classes",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: hfsc default 1",
+            "$TC class add dev $DUMMY parent 1: classid 1:1 hfsc rt m2 10mbit",
+            "$TC class add dev $DUMMY parent 1: classid 1:2 hfsc rt m2 10mbit",
+            "$TC qdisc add dev $DUMMY parent 1:1 handle 10: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:2 handle 20: netem delay 20ms duplicate 25%",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "c9d0",
+        "name": "NETEM with TBF child qdisc",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:1 handle 10: tbf rate 1mbit burst 10kb latency 50ms",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc tbf 10:",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "d0e1",
+        "name": "NETEM with SFQ child qdisc",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:1 handle 10: sfq perturb 10",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc sfq 10:",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "e1f2",
+        "name": "NETEM under HTB with TBF chain",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: htb default 10",
+            "$TC class add dev $DUMMY parent 1: classid 1:10 htb rate 10mbit",
+            "$TC qdisc add dev $DUMMY parent 1:10 handle 10: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 10:1 handle 100: tbf rate 1mbit burst 10kb latency 50ms",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc tbf 100:",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "f2a3",
+        "name": "NETEM nested inside netem",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+            "$TC qdisc add dev $DUMMY root handle 1: netem delay 10ms"
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent 1:1 handle 10: netem delay 5ms duplicate 10%",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "a3b4",
+        "name": "NETEM with all impairments combined",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": "nsPlugin"
+        },
+        "setup": [
+        ],
+        "cmdUnderTest": "$TC qdisc add dev $DUMMY handle 1: root netem delay 50ms 10ms distribution normal loss 5% duplicate 10% corrupt 1% reorder 25% 50% gap 5 rate 10mbit",
+        "expExitCode": "0",
+        "verifyCmd": "$TC qdisc show dev $DUMMY",
+        "matchPattern": "qdisc netem 1: root refcnt [0-9]+ .*delay 50ms",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DUMMY handle 1: root"
+        ]
+    },
+    {
+        "id": "7a01",
+        "name": "NETEM passes traffic with delay",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7b02",
+        "name": "NETEM passes traffic with duplication",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms duplicate 50%"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7c03",
+        "name": "NETEM passes traffic with loss",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms loss 30%"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7d04",
+        "name": "NETEM passes traffic with corrupt",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms corrupt 10%"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7e05",
+        "name": "NETEM passes traffic under HTB with two netem leaves",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 root handle 1: htb default 10",
+            "$TC class add dev $DEV1 parent 1: classid 1:10 htb rate 10mbit",
+            "$TC class add dev $DEV1 parent 1: classid 1:20 htb rate 10mbit",
+            "$TC qdisc add dev $DEV1 parent 1:10 handle 10: netem delay 1ms duplicate 25%",
+            "$TC qdisc add dev $DEV1 parent 1:20 handle 20: netem delay 1ms duplicate 25%"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7f06",
+        "name": "NETEM passes traffic under HFSC with duplication",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 root handle 1: hfsc default 1",
+            "$TC class add dev $DEV1 parent 1: classid 1:1 hfsc rt m2 10mbit",
+            "$TC qdisc add dev $DEV1 parent 1:1 handle 10: netem delay 1ms duplicate 25%"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7a07",
+        "name": "NETEM passes traffic with nested netem",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 root handle 1: netem delay 1ms",
+            "$TC qdisc add dev $DEV1 parent 1:1 handle 10: netem delay 1ms duplicate 10%"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7b08",
+        "name": "NETEM passes traffic with TBF child",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 root handle 1: netem delay 1ms",
+            "$TC qdisc add dev $DEV1 parent 1:1 handle 10: tbf rate 1mbit burst 10kb latency 50ms"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7c09",
+        "name": "NETEM passes traffic with all impairments",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms 500us distribution normal loss 5% duplicate 10% corrupt 1% reorder 25% 50% gap 5"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 50,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7d0a",
+        "name": "NETEM passes traffic with reorder",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 10ms reorder 25% 50% gap 5"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 30,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7e0b",
+        "name": "NETEM passes traffic with slot pacing",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms slot 20ms 40ms packets 5 bytes 1500"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 1",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7f0c",
+        "name": "NETEM passes traffic with rate limiting",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 handle 1: root netem delay 1ms rate 1mbit"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "1",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
+    },
+    {
+        "id": "7a0d",
+        "name": "NETEM passes traffic with SFQ child",
+        "category": ["qdisc", "netem"],
+        "plugins": {
+            "requires": ["nsPlugin", "scapyPlugin"]
+        },
+        "setup": [
+            "$TC qdisc add dev $DEV1 root handle 1: netem delay 1ms",
+            "$TC qdisc add dev $DEV1 parent 1:1 handle 10: sfq perturb 10"
+        ],
+        "scapy": [
+            {
+                "iface": "$DEV0",
+                "count": 20,
+                "packet": "Ether(type=0x800)/IP(src='10.0.0.10',dst='10.0.0.20')/UDP(sport=5000,dport=5001)/Raw('X'*64)"
+            }
+        ],
+        "cmdUnderTest": "sleep 0.5",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s qdisc show dev $DEV1",
+        "matchPattern": "Sent [1-9][0-9]* bytes [1-9][0-9]* pkt",
+        "matchCount": "2",
+        "teardown": [
+            "$TC qdisc del dev $DEV1 handle 1: root"
+        ]
     }
 ]
-- 
2.51.0


  parent reply	other threads:[~2026-03-15  0:17 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-15  0:14 [PATCH net v2 00/10] netem: fixes and selftests Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 01/10] Revert "net/sched: Restrict conditions for adding duplicating netems to qdisc tree" Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 02/10] net/sched: netem: add per-CPU recursion guard for duplication Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 03/10] selftests/tc-testing: update netem tests after check_netem_in_tree revert Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 04/10] net/sched: netem: restructure dequeue to avoid re-entrancy with child qdisc Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 05/10] net/sched: netem: fix probability gaps in 4-state loss model Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 06/10] net/sched: netem: fix slot delay calculation overflow Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 07/10] net/sched: netem: fix queue limit check to include reordered packets Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 08/10] net/sched: netem: null-terminate tfifo linear queue tail Stephen Hemminger
2026-03-15  0:14 ` [PATCH net v2 09/10] net/sched: netem: only reseed PRNG when seed is explicitly provided Stephen Hemminger
2026-03-15  0:14 ` Stephen Hemminger [this message]
2026-03-15 15:19 ` [PATCH net v2 00/10] netem: fixes and selftests Jakub Kicinski
2026-03-15 16:09   ` Stephen Hemminger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260315001649.23931-11-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox