xref: /linux/tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json (revision 78c1930198fc63f2d4761848cbe148c5b2958b01)
1[
2    {
3        "id": "ca5e",
4        "name": "Check class delete notification for ffff:",
5        "category": [
6            "qdisc"
7        ],
8        "plugins": {
9            "requires": "nsPlugin"
10        },
11        "setup": [
12            "$IP link set dev $DUMMY up || true",
13            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
14            "$TC qdisc add dev $DUMMY root handle 1: drr",
15            "$TC filter add dev $DUMMY parent 1: basic classid 1:1",
16            "$TC class add dev $DUMMY parent 1: classid 1:1 drr",
17            "$TC qdisc add dev $DUMMY parent 1:1 handle ffff: drr",
18            "$TC filter add dev $DUMMY parent ffff: basic classid ffff:1",
19            "$TC class add dev $DUMMY parent ffff: classid ffff:1 drr",
20            "$TC qdisc add dev $DUMMY parent ffff:1 netem delay 1s",
21            "ping -c1 -W0.01 -I $DUMMY 10.10.10.1 || true",
22            "$TC class del dev $DUMMY classid ffff:1",
23            "$TC class add dev $DUMMY parent ffff: classid ffff:1 drr"
24        ],
25        "cmdUnderTest": "ping -c1 -W0.01 -I $DUMMY 10.10.10.1",
26        "expExitCode": "1",
27        "verifyCmd": "$TC -s qdisc ls dev $DUMMY",
28        "matchPattern": "drr 1: root",
29        "matchCount": "1",
30        "teardown": [
31            "$TC qdisc del dev $DUMMY root handle 1: drr",
32            "$IP addr del 10.10.10.10/24 dev $DUMMY"
33        ]
34    },
35    {
36        "id": "e4b7",
37        "name": "Check class delete notification for root ffff:",
38        "category": [
39            "qdisc"
40        ],
41        "plugins": {
42            "requires": "nsPlugin"
43        },
44        "setup": [
45            "$IP link set dev $DUMMY up || true",
46            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
47            "$TC qdisc add dev $DUMMY root handle ffff: drr",
48            "$TC filter add dev $DUMMY parent ffff: basic classid ffff:1",
49            "$TC class add dev $DUMMY parent ffff: classid ffff:1 drr",
50            "$TC qdisc add dev $DUMMY parent ffff:1 netem delay 1s",
51            "ping -c1 -W0.01 -I $DUMMY 10.10.10.1 || true",
52            "$TC class del dev $DUMMY classid ffff:1",
53            "$TC class add dev $DUMMY parent ffff: classid ffff:1 drr"
54        ],
55        "cmdUnderTest": "ping -c1 -W0.01 -I $DUMMY 10.10.10.1",
56        "expExitCode": "1",
57        "verifyCmd": "$TC qdisc ls dev $DUMMY",
58        "matchPattern": "drr ffff: root",
59        "matchCount": "1",
60        "teardown": [
61            "$TC qdisc del dev $DUMMY root handle ffff: drr",
62            "$IP addr del 10.10.10.10/24 dev $DUMMY"
63        ]
64    },
65    {
66        "id": "33a9",
67        "name": "Check ingress is not searchable on backlog update",
68        "category": [
69            "qdisc"
70        ],
71        "plugins": {
72            "requires": "nsPlugin"
73        },
74        "setup": [
75            "$IP link set dev $DUMMY up || true",
76            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
77            "$TC qdisc add dev $DUMMY ingress",
78            "$TC qdisc add dev $DUMMY root handle 1: drr",
79            "$TC filter add dev $DUMMY parent 1: basic classid 1:1",
80            "$TC class add dev $DUMMY parent 1: classid 1:1 drr",
81            "$TC qdisc add dev $DUMMY parent 1:1 handle 2: drr",
82            "$TC filter add dev $DUMMY parent 2: basic classid 2:1",
83            "$TC class add dev $DUMMY parent 2: classid 2:1 drr",
84            "$TC qdisc add dev $DUMMY parent 2:1 netem delay 1s",
85            "ping -c1 -W0.01 -I $DUMMY 10.10.10.1 || true"
86        ],
87        "cmdUnderTest": "$TC class del dev $DUMMY classid 2:1",
88        "expExitCode": "0",
89        "verifyCmd": "$TC qdisc ls dev $DUMMY",
90        "matchPattern": "drr 1: root",
91        "matchCount": "1",
92        "teardown": [
93            "$TC qdisc del dev $DUMMY root handle 1: drr",
94            "$TC qdisc del dev $DUMMY ingress",
95            "$IP addr del 10.10.10.10/24 dev $DUMMY"
96        ]
97    },
98    {
99	"id": "a4b9",
100	"name": "Test class qlen notification",
101	"category": [
102	    "qdisc"
103	],
104	"plugins": {
105	    "requires": "nsPlugin"
106	},
107	"setup": [
108            "$IP link set dev $DUMMY up || true",
109            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
110            "$TC qdisc add dev $DUMMY root handle 1: drr",
111            "$TC filter add dev $DUMMY parent 1: basic classid 1:1",
112            "$TC class add dev $DUMMY parent 1: classid 1:1 drr",
113            "$TC qdisc add dev $DUMMY parent 1:1 handle 2: netem",
114            "$TC qdisc add dev $DUMMY parent 2: handle 3: drr",
115            "$TC filter add dev $DUMMY parent 3: basic action drop",
116            "$TC class add dev $DUMMY parent 3: classid 3:1 drr",
117            "$TC class del dev $DUMMY classid 1:1",
118            "$TC class add dev $DUMMY parent 1: classid 1:1 drr"
119        ],
120        "cmdUnderTest": "ping -c1 -W0.01 -I $DUMMY 10.10.10.1",
121        "expExitCode": "1",
122        "verifyCmd": "$TC qdisc ls dev $DUMMY",
123        "matchPattern": "drr 1: root",
124        "matchCount": "1",
125        "teardown": [
126            "$TC qdisc del dev $DUMMY root handle 1: drr",
127            "$IP addr del 10.10.10.10/24 dev $DUMMY"
128        ]
129    },
130    {
131        "id": "5456",
132        "name": "Test htb_dequeue_tree with deactivation and row emptying",
133        "category": [
134            "qdisc",
135            "htb"
136        ],
137        "plugins": {
138            "requires": "nsPlugin"
139        },
140        "setup": [
141            "$IP link set dev $DUMMY up || true",
142            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
143            "$TC qdisc add dev $DUMMY root handle 1: htb default 1",
144            "$TC class add dev $DUMMY parent 1: classid 1:1 htb rate 64bit ",
145            "$TC qdisc add dev $DUMMY parent 1:1 handle 2: netem",
146            "$TC qdisc add dev $DUMMY parent 2:1 handle 3: blackhole"
147        ],
148        "cmdUnderTest": "ping -c1 -W0.01 -I $DUMMY 10.10.11.11",
149        "expExitCode": "1",
150        "verifyCmd": "$TC -j qdisc show dev $DUMMY",
151        "matchJSON": [],
152        "teardown": [
153            "$TC qdisc del dev $DUMMY root"
154        ]
155    },
156    {
157        "id": "c024",
158        "name": "Test TBF with SKBPRIO - catch qlen corner cases",
159        "category": [
160            "qdisc",
161            "tbf",
162            "skbprio"
163        ],
164        "plugins": {
165            "requires": "nsPlugin"
166        },
167        "setup": [
168            "$IP link set dev $DUMMY up || true",
169            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
170            "$TC qdisc add dev $DUMMY handle 1: root tbf rate 100bit burst 2000 limit 1000",
171            "$TC qdisc add dev $DUMMY parent 1: handle 10: skbprio limit 1",
172            "ping -c 1 -W 0.1 -Q 0x00 -s 1400 -I $DUMMY 10.10.10.1 > /dev/null || true",
173            "ping -c 1 -W 0.1 -Q 0x1c -s 1400 -I $DUMMY 10.10.10.1 > /dev/null || true",
174            "ping -c 1 -W 0.1 -Q 0x00 -s 1400 -I $DUMMY 10.10.10.1 > /dev/null || true",
175            "ping -c 1 -W 0.1 -Q 0x1c -s 1400 -I $DUMMY 10.10.10.1 > /dev/null || true",
176            "sleep 0.5"
177        ],
178        "cmdUnderTest": "$TC -s qdisc show dev $DUMMY",
179        "expExitCode": "0",
180        "verifyCmd": "$TC -s qdisc show dev $DUMMY | grep -A 5 'qdisc skbprio'",
181        "matchPattern": "dropped [1-9][0-9]*",
182        "matchCount": "1",
183        "teardown": [
184            "$TC qdisc del dev $DUMMY handle 1: root",
185            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
186        ]
187    },
188    {
189        "id": "34c0",
190        "name": "Test TBF with HHF Backlog Accounting in gso_skb case against underflow",
191        "category": [
192            "qdisc",
193            "tbf",
194            "hhf"
195        ],
196        "plugins": {
197            "requires": [
198                "nsPlugin"
199            ]
200        },
201        "setup": [
202            "$IP link set dev $DUMMY up || true",
203            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
204            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 100ms",
205            "$TC qdisc replace dev $DUMMY handle 2: parent 1:1 hhf limit 1000",
206            [
207                "ping -I $DUMMY -c2 10.10.11.11",
208                1
209            ],
210            "$TC qdisc change dev $DUMMY handle 2: parent 1:1 hhf limit 1"
211        ],
212        "cmdUnderTest": "$TC qdisc del dev $DUMMY handle 2: parent 1:1",
213        "expExitCode": "0",
214        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
215        "matchPattern": "backlog 0b 0p",
216        "matchCount": "1",
217        "teardown": [
218            "$TC qdisc del dev $DUMMY handle 1: root"
219        ]
220    },
221    {
222        "id": "fd68",
223        "name": "Test TBF with CODEL Backlog Accounting in gso_skb case against underflow",
224        "category": [
225            "qdisc",
226            "tbf",
227            "codel"
228        ],
229        "plugins": {
230            "requires": [
231                "nsPlugin"
232            ]
233        },
234        "setup": [
235            "$IP link set dev $DUMMY up || true",
236            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
237            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 100ms",
238            "$TC qdisc replace dev $DUMMY handle 2: parent 1:1 codel limit 1000",
239            [
240                "ping -I $DUMMY -c2 10.10.11.11",
241                1
242            ],
243            "$TC qdisc change dev $DUMMY handle 2: parent 1:1 codel limit 1"
244        ],
245        "cmdUnderTest": "$TC qdisc del dev $DUMMY handle 2: parent 1:1",
246        "expExitCode": "0",
247        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
248        "matchPattern": "backlog 0b 0p",
249        "matchCount": "1",
250        "teardown": [
251            "$TC qdisc del dev $DUMMY handle 1: root"
252        ]
253    },
254    {
255        "id": "514e",
256        "name": "Test TBF with PIE Backlog Accounting in gso_skb case against underflow",
257        "category": [
258            "qdisc",
259            "tbf",
260            "pie"
261        ],
262        "plugins": {
263            "requires": [
264                "nsPlugin"
265            ]
266        },
267        "setup": [
268            "$IP link set dev $DUMMY up || true",
269            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
270            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 100ms",
271            "$TC qdisc replace dev $DUMMY handle 2: parent 1:1 pie limit 1000",
272            [
273                "ping -I $DUMMY -c2 10.10.11.11",
274                1
275            ],
276            "$TC qdisc change dev $DUMMY handle 2: parent 1:1 pie limit 1"
277        ],
278        "cmdUnderTest": "$TC qdisc del dev $DUMMY handle 2: parent 1:1",
279        "expExitCode": "0",
280        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
281        "matchPattern": "backlog 0b 0p",
282        "matchCount": "1",
283        "teardown": [
284            "$TC qdisc del dev $DUMMY handle 1: root"
285        ]
286    },
287    {
288        "id": "6c97",
289        "name": "Test TBF with FQ Backlog Accounting in gso_skb case against underflow",
290        "category": [
291            "qdisc",
292            "tbf",
293            "fq"
294        ],
295        "plugins": {
296            "requires": [
297                "nsPlugin"
298            ]
299        },
300        "setup": [
301            "$IP link set dev $DUMMY up || true",
302            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
303            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 100ms",
304            "$TC qdisc replace dev $DUMMY handle 2: parent 1:1 fq limit 1000",
305            [
306                "ping -I $DUMMY -c2 10.10.11.11",
307                1
308            ],
309            "$TC qdisc change dev $DUMMY handle 2: parent 1:1 fq limit 1"
310        ],
311        "cmdUnderTest": "$TC qdisc del dev $DUMMY handle 2: parent 1:1",
312        "expExitCode": "0",
313        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
314        "matchPattern": "backlog 0b 0p",
315        "matchCount": "1",
316        "teardown": [
317            "$TC qdisc del dev $DUMMY handle 1: root"
318        ]
319    },
320    {
321        "id": "5d0b",
322        "name": "Test TBF with FQ_CODEL Backlog Accounting in gso_skb case against underflow",
323        "category": [
324            "qdisc",
325            "tbf",
326            "fq_codel"
327        ],
328        "plugins": {
329            "requires": [
330                "nsPlugin"
331            ]
332        },
333        "setup": [
334            "$IP link set dev $DUMMY up || true",
335            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
336            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 100ms",
337            "$TC qdisc replace dev $DUMMY handle 2: parent 1:1 fq_codel limit 1000",
338            [
339                "ping -I $DUMMY -c2 10.10.11.11",
340                1
341            ],
342            "$TC qdisc change dev $DUMMY handle 2: parent 1:1 fq_codel limit 1"
343        ],
344        "cmdUnderTest": "$TC qdisc del dev $DUMMY handle 2: parent 1:1",
345        "expExitCode": "0",
346        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
347        "matchPattern": "backlog 0b 0p",
348        "matchCount": "1",
349        "teardown": [
350            "$TC qdisc del dev $DUMMY handle 1: root"
351        ]
352    },
353    {
354        "id": "21c3",
355        "name": "Test TBF with FQ_PIE Backlog Accounting in gso_skb case against underflow",
356        "category": [
357            "qdisc",
358            "tbf",
359            "fq_pie"
360        ],
361        "plugins": {
362            "requires": [
363                "nsPlugin"
364            ]
365        },
366        "setup": [
367            "$IP link set dev $DUMMY up || true",
368            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
369            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 100ms",
370            "$TC qdisc replace dev $DUMMY handle 2: parent 1:1 fq_pie limit 1000",
371            [
372                "ping -I $DUMMY -c2 10.10.11.11",
373                1
374            ],
375            "$TC qdisc change dev $DUMMY handle 2: parent 1:1 fq_pie limit 1"
376        ],
377        "cmdUnderTest": "$TC qdisc del dev $DUMMY handle 2: parent 1:1",
378        "expExitCode": "0",
379        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
380        "matchPattern": "backlog 0b 0p",
381        "matchCount": "1",
382        "teardown": [
383            "$TC qdisc del dev $DUMMY handle 1: root"
384        ]
385    },
386    {
387        "id": "a4bb",
388        "name": "Test FQ_CODEL with HTB parent - force packet drop with empty queue",
389        "category": [
390            "qdisc",
391            "fq_codel",
392            "htb"
393        ],
394        "plugins": {
395            "requires": [
396                "nsPlugin",
397                "scapyPlugin"
398            ]
399        },
400        "setup": [
401            "$TC qdisc add dev $IFB handle 1: root htb default 10",
402            "$TC class add dev $IFB parent 1: classid 1:10 htb rate 1kbit",
403            "$TC qdisc add dev $IFB parent 1:10 handle 10: fq_codel memory_limit 1 flows 1 target 0.1ms interval 1ms",
404            "$TC filter add dev $IFB parent 1: protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:10",
405            "$TC qdisc add dev $DEV1 ingress",
406            "$TC filter add dev $DEV1 ingress protocol ip prio 1 u32 match ip protocol 1 0xff action mirred egress mirror dev $IFB"
407        ],
408        "scapy": {
409            "iface": "$DEV0",
410            "count": 5,
411            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/ICMP()"
412        },
413        "cmdUnderTest": "$TC -s qdisc show dev $IFB",
414        "expExitCode": "0",
415        "verifyCmd": "$TC -s qdisc show dev $IFB | grep -A 5 'qdisc fq_codel'",
416        "matchPattern": "dropped [1-9][0-9]*",
417        "matchCount": "1",
418        "teardown": [
419            "$TC qdisc del dev $IFB root",
420            "$TC qdisc del dev $DEV1 ingress"
421        ]
422    },
423    {
424        "id": "a4be",
425        "name": "Test FQ_CODEL with QFQ parent - force packet drop with empty queue",
426        "category": [
427            "qdisc",
428            "fq_codel",
429            "qfq"
430        ],
431        "plugins": {
432            "requires": [
433                "nsPlugin",
434                "scapyPlugin"
435            ]
436        },
437        "setup": [
438            "$TC qdisc add dev $IFB handle 1: root qfq",
439            "$TC class add dev $IFB parent 1: classid 1:10 qfq weight 1 maxpkt 1000",
440            "$TC qdisc add dev $IFB parent 1:10 handle 10: fq_codel memory_limit 1 flows 1 target 0.1ms interval 1ms",
441            "$TC filter add dev $IFB parent 1: protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:10",
442            "$TC qdisc add dev $DEV1 ingress",
443            "$TC filter add dev $DEV1 ingress protocol ip prio 1 u32 match ip protocol 1 0xff action mirred egress mirror dev $IFB"
444        ],
445        "scapy": {
446            "iface": "$DEV0",
447            "count": 10,
448            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/ICMP()"
449        },
450        "cmdUnderTest": "$TC -s qdisc show dev $IFB",
451        "expExitCode": "0",
452        "verifyCmd": "$TC -s qdisc show dev $IFB | grep -A 5 'qdisc fq_codel'",
453        "matchPattern": "dropped [1-9][0-9]*",
454        "matchCount": "1",
455        "teardown": [
456            "$TC qdisc del dev $IFB root",
457            "$TC qdisc del dev $DEV1 ingress"
458        ]
459    },
460    {
461        "id": "a4bf",
462        "name": "Test FQ_CODEL with HFSC parent - force packet drop with empty queue",
463        "category": [
464            "qdisc",
465            "fq_codel",
466            "hfsc"
467        ],
468        "plugins": {
469            "requires": [
470                "nsPlugin",
471                "scapyPlugin"
472            ]
473        },
474        "setup": [
475            "$TC qdisc add dev $IFB handle 1: root hfsc default 10",
476            "$TC class add dev $IFB parent 1: classid 1:10 hfsc sc rate 1kbit ul rate 1kbit",
477            "$TC qdisc add dev $IFB parent 1:10 handle 10: fq_codel memory_limit 1 flows 1 target 0.1ms interval 1ms",
478            "$TC filter add dev $IFB parent 1: protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:10",
479            "$TC qdisc add dev $DEV1 ingress",
480            "$TC filter add dev $DEV1 ingress protocol ip prio 1 u32 match ip protocol 1 0xff action mirred egress mirror dev $IFB"
481        ],
482        "scapy": {
483            "iface": "$DEV0",
484            "count": 5,
485            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/ICMP()"
486        },
487        "cmdUnderTest": "$TC -s qdisc show dev $IFB",
488        "expExitCode": "0",
489        "verifyCmd": "$TC -s qdisc show dev $IFB | grep -A 5 'qdisc fq_codel'",
490        "matchPattern": "dropped [1-9][0-9]*",
491        "matchCount": "1",
492        "teardown": [
493            "$TC qdisc del dev $IFB root",
494            "$TC qdisc del dev $DEV1 ingress"
495        ]
496    },
497    {
498        "id": "a4c0",
499        "name": "Test FQ_CODEL with DRR parent - force packet drop with empty queue",
500        "category": [
501            "qdisc",
502            "fq_codel",
503            "drr"
504        ],
505        "plugins": {
506            "requires": [
507                "nsPlugin",
508                "scapyPlugin"
509            ]
510        },
511        "setup": [
512            "$TC qdisc add dev $IFB handle 1: root drr",
513            "$TC class add dev $IFB parent 1: classid 1:10 drr quantum 1500",
514            "$TC qdisc add dev $IFB parent 1:10 handle 10: fq_codel memory_limit 1 flows 1 target 0.1ms interval 1ms",
515            "$TC filter add dev $IFB parent 1: protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:10",
516            "$TC qdisc add dev $DEV1 ingress",
517            "$TC filter add dev $DEV1 ingress protocol ip prio 1 u32 match ip protocol 1 0xff action mirred egress mirror dev $IFB"
518        ],
519        "scapy": {
520            "iface": "$DEV0",
521            "count": 5,
522            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/ICMP()"
523        },
524        "cmdUnderTest": "$TC -s qdisc show dev $IFB",
525        "expExitCode": "0",
526        "verifyCmd": "$TC -s qdisc show dev $IFB | grep -A 5 'qdisc fq_codel'",
527        "matchPattern": "dropped [1-9][0-9]*",
528        "matchCount": "1",
529        "teardown": [
530            "$TC qdisc del dev $IFB root",
531            "$TC qdisc del dev $DEV1 ingress"
532        ]
533    },
534    {
535        "id": "a4c1",
536        "name": "Test FQ_CODEL with ETS parent - force packet drop with empty queue",
537        "category": [
538            "qdisc",
539            "fq_codel",
540            "ets"
541        ],
542        "plugins": {
543            "requires": [
544                "nsPlugin",
545                "scapyPlugin"
546            ]
547        },
548        "setup": [
549            "$TC qdisc add dev $IFB handle 1: root ets bands 2 strict 1",
550            "$TC class change dev $IFB parent 1: classid 1:1 ets",
551            "$TC qdisc add dev $IFB parent 1:1 handle 10: fq_codel memory_limit 1 flows 1 target 0.1ms interval 1ms",
552            "$TC filter add dev $IFB parent 1: protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:1",
553            "$TC qdisc add dev $DEV1 ingress",
554            "$TC filter add dev $DEV1 ingress protocol ip prio 1 u32 match ip protocol 1 0xff action mirred egress mirror dev $IFB"
555        ],
556        "scapy": {
557            "iface": "$DEV0",
558            "count": 5,
559            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/ICMP()"
560        },
561        "cmdUnderTest": "$TC -s qdisc show dev $IFB",
562        "expExitCode": "0",
563        "verifyCmd": "$TC -s qdisc show dev $IFB | grep -A 5 'qdisc fq_codel'",
564        "matchPattern": "dropped [1-9][0-9]*",
565        "matchCount": "1",
566        "teardown": [
567            "$TC qdisc del dev $IFB root",
568            "$TC qdisc del dev $DEV1 ingress"
569        ]
570    },
571    {
572        "id": "a4c3",
573        "name": "Test HFSC with netem/blackhole - queue emptying during peek operation",
574        "category": [
575            "qdisc",
576            "hfsc",
577            "netem",
578            "blackhole"
579        ],
580        "plugins": {
581            "requires": "nsPlugin"
582        },
583        "setup": [
584            "$IP link set dev $DUMMY up || true",
585            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
586            "$TC qdisc add dev $DUMMY handle 1:0 root drr",
587            "$TC class add dev $DUMMY parent 1:0 classid 1:1 drr",
588            "$TC class add dev $DUMMY parent 1:0 classid 1:2 drr",
589            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 plug limit 1024",
590            "$TC qdisc add dev $DUMMY parent 1:2 handle 3:0 hfsc default 1",
591            "$TC class add dev $DUMMY parent 3:0 classid 3:1 hfsc rt m1 5Mbit d 10ms m2 10Mbit",
592            "$TC qdisc add dev $DUMMY parent 3:1 handle 4:0 netem delay 1ms",
593            "$TC qdisc add dev $DUMMY parent 4:1 handle 5:0 blackhole",
594            "ping -c 3 -W 0.01 -i 0.001 -s 1 10.10.10.10 -I $DUMMY > /dev/null 2>&1 || true",
595            "$TC class change dev $DUMMY parent 3:0 classid 3:1 hfsc sc m1 5Mbit d 10ms m2 10Mbit",
596            "$TC class del dev $DUMMY parent 3:0 classid 3:1",
597            "$TC class add dev $DUMMY parent 3:0 classid 3:1 hfsc rt m1 5Mbit d 10ms m2 10Mbit",
598            "ping -c 3 -W 0.01 -i 0.001 -s 1 10.10.10.10 -I $DUMMY > /dev/null 2>&1 || true"
599        ],
600        "cmdUnderTest": "$TC class change dev $DUMMY parent 3:0 classid 3:1 hfsc sc m1 5Mbit d 10ms m2 10Mbit",
601        "expExitCode": "0",
602        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
603        "matchPattern": "qdisc hfsc 3:.*parent 1:2.*default 0x1",
604        "matchCount": "1",
605        "teardown": [
606            "$TC qdisc del dev $DUMMY handle 1:0 root",
607            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
608        ]
609    },
610    {
611        "id": "90ec",
612        "name": "Test DRR's enqueue reentrant behaviour with netem",
613        "category": [
614            "qdisc",
615            "drr"
616        ],
617        "plugins": {
618            "requires": "nsPlugin"
619        },
620        "setup": [
621            "$IP link set dev $DUMMY up || true",
622            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
623            "$TC qdisc add dev $DUMMY handle 1:0 root drr",
624            "$TC class replace dev $DUMMY parent 1:0 classid 1:1 drr",
625            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 netem duplicate 100%",
626            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:1"
627        ],
628        "cmdUnderTest": "ping -c 1 -I $DUMMY 10.10.10.1 > /dev/null || true",
629        "expExitCode": "0",
630        "verifyCmd": "$TC -j -s qdisc ls dev $DUMMY handle 1:0",
631        "matchJSON": [
632            {
633                "kind": "drr",
634                "handle": "1:",
635                "bytes": 196,
636                "packets": 2
637            }
638        ],
639        "matchCount": "1",
640        "teardown": [
641            "$TC qdisc del dev $DUMMY handle 1:0 root",
642            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
643        ]
644    },
645    {
646        "id": "1f1f",
647        "name": "Test ETS's enqueue reentrant behaviour with netem",
648        "category": [
649            "qdisc",
650            "ets"
651        ],
652        "plugins": {
653            "requires": "nsPlugin"
654        },
655        "setup": [
656            "$IP link set dev $DUMMY up || true",
657            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
658            "$TC qdisc add dev $DUMMY handle 1:0 root ets bands 2",
659            "$TC class replace dev $DUMMY parent 1:0 classid 1:1 ets quantum 1500",
660            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 netem duplicate 100%",
661            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:1"
662        ],
663        "cmdUnderTest": "ping -c 1 -I $DUMMY 10.10.10.1 > /dev/null || true",
664        "expExitCode": "0",
665        "verifyCmd": "$TC -j -s class show dev $DUMMY",
666        "matchJSON": [
667            {
668                "class": "ets",
669                "handle": "1:1",
670                "stats": {
671                    "bytes": 196,
672                    "packets": 2
673                }
674            }
675        ],
676        "matchCount": "1",
677        "teardown": [
678            "$TC qdisc del dev $DUMMY handle 1:0 root",
679            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
680        ]
681    },
682    {
683        "id": "5e6d",
684        "name": "Test QFQ's enqueue reentrant behaviour with netem",
685        "category": [
686            "qdisc",
687            "qfq"
688        ],
689        "plugins": {
690            "requires": "nsPlugin"
691        },
692        "setup": [
693            "$IP link set dev $DUMMY up || true",
694            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
695            "$TC qdisc add dev $DUMMY handle 1:0 root qfq",
696            "$TC class replace dev $DUMMY parent 1:0 classid 1:1 qfq weight 100 maxpkt 1500",
697            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 netem duplicate 100%",
698            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:1"
699        ],
700        "cmdUnderTest": "ping -c 1 -I $DUMMY 10.10.10.1 > /dev/null || true",
701        "expExitCode": "0",
702        "verifyCmd": "$TC -j -s qdisc ls dev $DUMMY handle 1:0",
703        "matchJSON": [
704            {
705                "kind": "qfq",
706                "handle": "1:",
707                "bytes": 196,
708                "packets": 2
709            }
710        ],
711        "matchCount": "1",
712        "teardown": [
713            "$TC qdisc del dev $DUMMY handle 1:0 root",
714            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
715        ]
716    },
717    {
718        "id": "bf1d",
719        "name": "Test HFSC's enqueue reentrant behaviour with netem",
720        "category": [
721            "qdisc",
722            "hfsc"
723        ],
724        "plugins": {
725            "requires": "nsPlugin"
726        },
727        "setup": [
728            "$IP link set dev $DUMMY up || true",
729            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
730            "$TC qdisc add dev $DUMMY handle 1:0 root hfsc",
731            "$TC class add dev $DUMMY parent 1:0 classid 1:1 hfsc ls m2 10Mbit",
732            "$TC qdisc add dev $DUMMY parent 1:1 handle 2:0 netem duplicate 100%",
733            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 1 u32 match ip dst 10.10.10.1/32 flowid 1:1",
734            "$TC class add dev $DUMMY parent 1:0 classid 1:2 hfsc ls m2 10Mbit",
735            "$TC qdisc add dev $DUMMY parent 1:2 handle 3:0 netem duplicate 100%",
736            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 2 u32 match ip dst 10.10.10.2/32 flowid 1:2",
737            "ping -c 1 10.10.10.1 -I$DUMMY > /dev/null || true",
738            "$TC filter del dev $DUMMY parent 1:0 protocol ip prio 1",
739            "$TC class del dev $DUMMY classid 1:1"
740        ],
741        "cmdUnderTest": "ping -c 1 10.10.10.2 -I$DUMMY > /dev/null || true",
742        "expExitCode": "0",
743        "verifyCmd": "$TC -j -s qdisc ls dev $DUMMY handle 1:0",
744        "matchJSON": [
745            {
746                "kind": "hfsc",
747                "handle": "1:",
748                "bytes": 392,
749                "packets": 4
750            }
751        ],
752        "matchCount": "1",
753        "teardown": [
754            "$TC qdisc del dev $DUMMY handle 1:0 root",
755            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
756        ]
757    },
758    {
759        "id": "7c3b",
760        "name": "Test nested DRR's enqueue reentrant behaviour with netem",
761        "category": [
762            "qdisc",
763            "drr"
764        ],
765        "plugins": {
766            "requires": "nsPlugin"
767        },
768        "setup": [
769            "$IP link set dev $DUMMY up || true",
770            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
771            "$TC qdisc add dev $DUMMY handle 1:0 root drr",
772            "$TC class add dev $DUMMY parent 1:0 classid 1:1 drr",
773            "$TC filter add dev $DUMMY parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:1",
774            "$TC qdisc add dev $DUMMY handle 2:0 parent 1:1 drr",
775            "$TC class add dev $DUMMY classid 2:1 parent 2:0 drr",
776            "$TC filter add dev $DUMMY parent 2:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 2:1",
777            "$TC qdisc add dev $DUMMY parent 2:1 handle 3:0 netem duplicate 100%"
778        ],
779        "cmdUnderTest": "ping -c 1 -I $DUMMY 10.10.10.1 > /dev/null || true",
780        "expExitCode": "0",
781        "verifyCmd": "$TC -j -s qdisc ls dev $DUMMY handle 1:0",
782        "matchJSON": [
783            {
784                "kind": "drr",
785                "handle": "1:",
786                "bytes": 196,
787                "packets": 2
788            }
789        ],
790        "matchCount": "1",
791        "teardown": [
792            "$TC qdisc del dev $DUMMY handle 1:0 root",
793            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
794        ]
795    },
796    {
797        "id": "62c4",
798        "name": "Test HTB with FQ_CODEL - basic functionality",
799        "category": [
800            "qdisc",
801            "htb",
802            "fq_codel"
803        ],
804        "plugins": {
805            "requires": [
806                "nsPlugin",
807                "scapyPlugin"
808            ]
809        },
810        "setup": [
811            "$TC qdisc add dev $DEV1 root handle 1: htb default 11",
812            "$TC class add dev $DEV1 parent 1: classid 1:1 htb rate 10kbit",
813            "$TC class add dev $DEV1 parent 1:1 classid 1:11 htb rate 10kbit prio 0 quantum 1486",
814            "$TC qdisc add dev $DEV1 parent 1:11 fq_codel quantum 300 noecn",
815            "sleep 0.5"
816        ],
817        "scapy": {
818            "iface": "$DEV0",
819            "count": 5,
820            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/TCP(sport=12345, dport=80)"
821        },
822        "cmdUnderTest": "$TC -s qdisc show dev $DEV1",
823        "expExitCode": "0",
824        "verifyCmd": "$TC -s qdisc show dev $DEV1 | grep -A 5 'qdisc fq_codel'",
825        "matchPattern": "Sent [0-9]+ bytes [0-9]+ pkt",
826        "matchCount": "1",
827        "teardown": [
828            "$TC qdisc del dev $DEV1 handle 1: root"
829        ]
830    },
831    {
832        "id": "831d",
833        "name": "Test HFSC qlen accounting with DRR/NETEM/BLACKHOLE chain",
834        "category": ["qdisc", "hfsc", "drr", "netem", "blackhole"],
835        "plugins": { "requires": ["nsPlugin", "scapyPlugin"] },
836        "setup": [
837            "$IP link set dev $DEV1 up || true",
838            "$TC qdisc add dev $DEV1 root handle 1: drr",
839            "$TC filter add dev $DEV1 parent 1: basic classid 1:1",
840            "$TC class add dev $DEV1 parent 1: classid 1:1 drr",
841            "$TC qdisc add dev $DEV1 parent 1:1 handle 2: hfsc def 1",
842            "$TC class add dev $DEV1 parent 2: classid 2:1 hfsc rt m1 8 d 1 m2 0",
843            "$TC qdisc add dev $DEV1 parent 2:1 handle 3: netem",
844            "$TC qdisc add dev $DEV1 parent 3:1 handle 4: blackhole"
845        ],
846        "scapy": {
847            "iface": "$DEV0",
848            "count": 5,
849            "packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/ICMP()"
850        },
851        "cmdUnderTest": "$TC -s qdisc show dev $DEV1",
852        "expExitCode": "0",
853        "verifyCmd": "$TC -s qdisc show dev $DEV1",
854        "matchPattern": "qdisc hfsc",
855        "matchCount": "1",
856        "teardown": ["$TC qdisc del dev $DEV1 root handle 1: drr"]
857    },
858    {
859        "id": "309e",
860        "name": "Test HFSC eltree double add with reentrant enqueue behaviour on netem",
861        "category": [
862            "qdisc",
863            "hfsc"
864        ],
865        "plugins": {
866            "requires": "nsPlugin"
867        },
868        "setup": [
869            "$IP link set dev $DUMMY up || true",
870            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
871            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 8bit burst 100b latency 1s",
872            "$TC qdisc add dev $DUMMY parent 1:0 handle 2:0 hfsc",
873            "ping -I $DUMMY -f -c10 -s48 -W0.001 10.10.11.1 || true",
874            "$TC class add dev $DUMMY parent 2:0 classid 2:1 hfsc rt m2 20Kbit",
875            "$TC qdisc add dev $DUMMY parent 2:1 handle 3:0 netem duplicate 100%",
876            "$TC class add dev $DUMMY parent 2:0 classid 2:2 hfsc rt m2 20Kbit",
877            "$TC filter add dev $DUMMY parent 2:0 protocol ip prio 1 u32 match ip dst 10.10.11.2/32 flowid 2:1",
878            "$TC filter add dev $DUMMY parent 2:0 protocol ip prio 2 u32 match ip dst 10.10.11.3/32 flowid 2:2",
879            "ping -c 1 10.10.11.2 -I$DUMMY > /dev/null || true",
880            "$TC filter del dev $DUMMY parent 2:0 protocol ip prio 1",
881            "$TC class del dev $DUMMY classid 2:1",
882            "ping -c 1 10.10.11.3 -I$DUMMY > /dev/null || true"
883        ],
884        "cmdUnderTest": "$TC class change dev $DUMMY parent 2:0 classid 2:2 hfsc sc m2 20Kbit",
885        "expExitCode": "0",
886        "verifyCmd": "$TC -j class ls dev $DUMMY classid 2:1",
887        "matchJSON": [],
888        "teardown": [
889            "$TC qdisc del dev $DUMMY handle 1:0 root",
890            "$IP addr del 10.10.10.10/24 dev $DUMMY || true"
891        ]
892    },
893    {
894        "id": "d74b",
895        "name": "Test use-after-free with DRR/NETEM/BLACKHOLE chain",
896        "category": [
897            "qdisc",
898            "hfsc",
899            "drr",
900            "netem",
901            "blackhole"
902        ],
903        "plugins": {
904            "requires": [
905                "nsPlugin",
906                "scapyPlugin"
907            ]
908        },
909        "setup": [
910            "$IP link set dev $DUMMY up || true",
911            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
912            "$TC qdisc add dev $DUMMY root handle 1: drr",
913            "$TC filter add dev $DUMMY parent 1: basic classid 1:1",
914            "$TC class add dev $DUMMY parent 1: classid 1:1 drr",
915            "$TC qdisc add dev $DUMMY parent 1:1 handle 2: hfsc def 1",
916            "$TC class add dev $DUMMY parent 2: classid 2:1 hfsc rt m1 8 d 1 m2 0",
917            "$TC qdisc add dev $DUMMY parent 2:1 handle 3: netem",
918            "$TC qdisc add dev $DUMMY parent 3:1 handle 4: blackhole",
919            "ping -c1 -W0.01 -I $DUMMY 10.10.11.11 || true",
920            "$TC class del dev $DUMMY classid 1:1"
921        ],
922        "cmdUnderTest": "ping -c1 -W0.01 -I $DUMMY 10.10.11.11",
923        "expExitCode": "1",
924        "verifyCmd": "$TC -j class ls dev $DUMMY classid 1:1",
925        "matchJSON": [],
926        "teardown": [
927            "$TC qdisc del dev $DUMMY root handle 1: drr"
928        ]
929    },
930    {
931        "id": "be28",
932        "name": "Try to add fq_codel qdisc as a child of an hhf qdisc",
933        "category": [
934            "qdisc",
935            "fq_codel",
936            "hhf"
937        ],
938        "plugins": {
939            "requires": "nsPlugin"
940        },
941        "setup": [
942            "$TC qdisc add dev $DUMMY root handle a: hhf"
943        ],
944        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent a: handle b: fq_codel",
945        "expExitCode": "2",
946        "verifyCmd": "$TC -j qdisc ls dev $DUMMY handle b:",
947        "matchJSON": [],
948        "teardown": [
949            "$TC qdisc del dev $DUMMY root"
950        ]
951    },
952    {
953        "id": "fcb5",
954        "name": "Try to add pie qdisc as a child of a drr qdisc",
955        "category": [
956            "qdisc",
957            "pie",
958            "drr"
959        ],
960        "plugins": {
961            "requires": "nsPlugin"
962        },
963        "setup": [
964            "$TC qdisc add dev $DUMMY root handle a: drr"
965        ],
966        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent a: handle b: pie",
967        "expExitCode": "2",
968        "verifyCmd": "$TC -j qdisc ls dev $DUMMY handle b:",
969        "matchJSON": [],
970        "teardown": [
971            "$TC qdisc del dev $DUMMY root"
972        ]
973    },
974    {
975        "id": "7801",
976        "name": "Try to add fq qdisc as a child of an inexistent hfsc class",
977        "category": [
978            "qdisc",
979            "sfq",
980            "hfsc"
981        ],
982        "plugins": {
983            "requires": "nsPlugin"
984        },
985        "setup": [
986            "$TC qdisc add dev $DUMMY root handle a: hfsc"
987        ],
988        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent a:fff2 sfq limit 4",
989        "expExitCode": "2",
990        "verifyCmd": "$TC -j qdisc ls dev $DUMMY handle b:",
991        "matchJSON": [],
992        "teardown": [
993            "$TC qdisc del dev $DUMMY root"
994        ]
995    },
996    {
997        "id": "4989",
998        "name": "Try to add an fq child to an ingress qdisc",
999        "category": [
1000            "qdisc",
1001            "ingress"
1002        ],
1003        "plugins": {
1004            "requires": "nsPlugin"
1005        },
1006        "setup": [
1007            "$TC qdisc add dev $DUMMY handle ffff:0 ingress"
1008        ],
1009        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent ffff:0 handle ffe0:0 fq",
1010        "expExitCode": "2",
1011        "verifyCmd": "$TC -j qdisc ls dev $DUMMY handle ffe0:",
1012        "matchJSON": [],
1013        "matchCount": "1",
1014        "teardown": [
1015            "$TC qdisc del dev $DUMMY ingress"
1016        ]
1017    },
1018    {
1019        "id": "c2b0",
1020        "name": "Try to add an fq child to a clsact qdisc",
1021        "category": [
1022            "qdisc",
1023            "ingress"
1024        ],
1025        "plugins": {
1026            "requires": "nsPlugin"
1027        },
1028        "setup": [
1029            "$TC qdisc add dev $DUMMY handle ffff:0 clsact"
1030        ],
1031        "cmdUnderTest": "$TC qdisc add dev $DUMMY parent ffff:0 handle ffe0:0 fq",
1032        "expExitCode": "2",
1033        "verifyCmd": "$TC -j qdisc ls dev $DUMMY handle ffe0:",
1034        "matchJSON": [],
1035        "matchCount": "1",
1036        "teardown": [
1037            "$TC qdisc del dev $DUMMY clsact"
1038        ]
1039    },
1040    {
1041        "id": "4366",
1042        "name": "CAKE with QFQ Parent - CAKE enqueue with packets dropping",
1043        "category": [
1044            "qdisc",
1045            "cake",
1046            "netem"
1047        ],
1048        "plugins": {
1049            "requires": "nsPlugin"
1050        },
1051        "setup":[
1052            "$TC qdisc add dev $DUMMY handle 1: root qfq",
1053            "$TC class add dev $DUMMY parent 1: classid 1:1 qfq maxpkt 1024",
1054            "$TC qdisc add dev $DUMMY parent 1:1 handle 2: cake memlimit 9",
1055            "$TC filter add dev $DUMMY protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1",
1056            "ping -I$DUMMY -f -c1 -s64 -W1 10.10.10.1 || true",
1057            "$TC qdisc replace dev $DUMMY parent 1:1 handle 3: netem delay 0ms"
1058        ],
1059        "cmdUnderTest": "ping -I$DUMMY -f -c1 -s64 -W1 10.10.10.1 || true",
1060        "expExitCode": "0",
1061        "verifyCmd": "$TC -s qdisc show dev $DUMMY",
1062        "matchPattern": "qdisc qfq 1:",
1063        "matchCount": "1",
1064        "teardown": [
1065            "$TC qdisc del dev $DUMMY handle 1: root"
1066        ]
1067    },
1068    {
1069        "id": "6e4f",
1070        "name": "Try to delete ets drr class' qdisc while still keeping it in the active list",
1071        "category": [
1072            "qdisc",
1073            "ets",
1074            "tbf"
1075        ],
1076        "plugins": {
1077            "requires": [
1078                "nsPlugin",
1079                "scapyPlugin"
1080            ]
1081        },
1082        "setup": [
1083            "$IP link set dev $DUMMY up || true",
1084            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
1085            "$TC qdisc add dev $DUMMY root handle 1: ets bands 2 strict 1",
1086            "$TC qdisc add dev $DUMMY parent 1:2 handle 20: tbf rate 8bit burst 100b latency 1s",
1087            "$TC filter add dev $DUMMY parent 1: basic classid 1:2",
1088            "ping -c2 -W0.01 -s 56 -I $DUMMY 10.10.11.11 || true",
1089            "$TC qdisc change dev $DUMMY root handle 1: ets bands 2 strict 2",
1090            "$TC qdisc change dev $DUMMY root handle 1: ets bands 1 strict 1"
1091        ],
1092        "cmdUnderTest": "ping -c1 -W0.01 -s 56 -I $DUMMY 10.10.11.11",
1093        "expExitCode": "1",
1094        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY root",
1095        "matchJSON": [
1096            {
1097                "kind": "ets",
1098                "handle": "1:",
1099                "bytes": 196,
1100                "packets": 2
1101            }
1102        ],
1103        "teardown": [
1104            "$TC qdisc del dev $DUMMY root handle 1:"
1105        ]
1106    },
1107    {
1108        "id": "0b8f",
1109        "name": "Try to add ets class to the active list twice",
1110        "category": [
1111            "qdisc",
1112            "ets",
1113            "tbf"
1114        ],
1115        "plugins": {
1116            "requires": [
1117                "nsPlugin",
1118                "scapyPlugin"
1119            ]
1120        },
1121        "setup": [
1122            "$IP link set dev $DUMMY up || true",
1123            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
1124            "$TC qdisc add dev $DUMMY root handle 1: ets bands 2 strict 1",
1125            "$TC qdisc add dev $DUMMY parent 1:2 handle 20: tbf rate 8bit burst 100b latency 1s",
1126            "$TC filter add dev $DUMMY parent 1: basic classid 1:2",
1127            "ping -c2 -W0.01 -s 56 -I $DUMMY 10.10.11.11 || true",
1128            "$TC qdisc change dev $DUMMY root handle 1: ets bands 2 strict 2",
1129            "$TC qdisc change dev $DUMMY root handle 1: ets bands 2 strict 1"
1130        ],
1131        "cmdUnderTest": "ping -c1 -W0.01 -s 56 -I $DUMMY 10.10.11.11",
1132        "expExitCode": "1",
1133        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY root",
1134        "matchJSON": [
1135            {
1136                "kind": "ets",
1137                "handle": "1:",
1138                "bytes": 98,
1139                "packets": 1
1140            }
1141        ],
1142        "teardown": [
1143            "$TC qdisc del dev $DUMMY root handle 1:"
1144        ]
1145    },
1146    {
1147        "id": "a3d7",
1148        "name": "HFSC with large m1 - no divide-by-zero on class reactivation",
1149        "category": [
1150            "qdisc",
1151            "hfsc"
1152        ],
1153        "plugins": {
1154            "requires": "nsPlugin"
1155        },
1156        "setup": [
1157            "$TC qdisc replace dev $DUMMY root handle 1: hfsc default 1",
1158            "$TC class replace dev $DUMMY parent 1: classid 1:1 hfsc rt m1 32gbit d 1ms m2 0bit ls m1 32gbit d 1ms m2 0bit",
1159            "ping -I$DUMMY -f -c1 -s64 -W1 10.10.10.1 || true",
1160            "sleep 1"
1161        ],
1162        "cmdUnderTest": "ping -I$DUMMY -f -c1 -s64 -W1 10.10.10.1 || true",
1163        "expExitCode": "0",
1164        "verifyCmd": "$TC qdisc show dev $DUMMY",
1165        "matchPattern": "qdisc hfsc 1: root",
1166        "matchCount": "1",
1167        "teardown": [
1168            "$TC qdisc del dev $DUMMY handle 1: root"
1169        ]
1170    },
1171    {
1172        "id": "7a5f",
1173        "name": "Force red to dequeue from its child's gso_skb with qfq leaf",
1174        "category": [
1175            "qdisc",
1176            "tbf",
1177            "red",
1178            "qfq"
1179        ],
1180        "plugins": {
1181            "requires": "nsPlugin"
1182        },
1183        "setup": [
1184            "$IP link set dev $DUMMY up || true",
1185            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
1186            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 88bit burst 1661b peakrate 2257333 minburst 1024 limit 7b",
1187            "$TC qdisc add dev $DUMMY parent 1: handle 2: red limit 757 min 16 max 24 avpkt 16",
1188            "$TC qdisc add dev $DUMMY parent 2: handle 3: qfq",
1189            "$TC class add dev $DUMMY classid 3:1 parent 3: qfq maxpkt 512 weight 1",
1190            "$TC filter add dev $DUMMY parent 3: protocol ip prio 1 matchall classid 3:1 action ok"
1191        ],
1192        "cmdUnderTest": "ping -c 1 10.10.10.1 -W0.01 -I$DUMMY || true",
1193        "expExitCode": "0",
1194        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY parent 1:",
1195        "matchJSON": [
1196            {
1197                "kind": "red",
1198                "handle": "2:",
1199                "bytes": 98,
1200                "packets": 1,
1201                "backlog": 0,
1202                "qlen": 0
1203            }
1204        ],
1205        "teardown": [
1206            "$TC qdisc del dev $DUMMY handle 1: root"
1207        ]
1208    },
1209    {
1210        "id": "cdae",
1211        "name": "Force sfb to dequeue from its child's gso_skb with qfq leaf",
1212        "category": [
1213            "qdisc",
1214            "tbf",
1215            "sfb",
1216            "qfq"
1217        ],
1218        "plugins": {
1219            "requires": "nsPlugin"
1220        },
1221        "setup": [
1222            "$IP link set dev $DUMMY up || true",
1223            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
1224            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 88bit burst 1661b peakrate 2257333 minburst 1024 limit 7b",
1225            "$TC qdisc add dev $DUMMY parent 1: handle 2: sfb",
1226            "$TC qdisc add dev $DUMMY parent 2: handle 3: qfq",
1227            "$TC class add dev $DUMMY classid 3:1 parent 3: qfq maxpkt 512 weight 1",
1228            "$TC filter add dev $DUMMY parent 3: protocol ip prio 1 matchall classid 3:1 action ok"
1229        ],
1230        "cmdUnderTest": "ping -c 1 10.10.10.1 -W0.01 -I$DUMMY || true",
1231        "expExitCode": "0",
1232        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY parent 1:",
1233        "matchJSON": [
1234            {
1235                "kind": "sfb",
1236                "handle": "2:",
1237                "bytes": 98,
1238                "packets": 1,
1239                "backlog": 0,
1240                "qlen": 0
1241            }
1242        ],
1243        "teardown": [
1244            "$TC qdisc del dev $DUMMY handle 1: root"
1245        ]
1246    },
1247    {
1248        "id": "291d",
1249        "name": "Force red to dequeue from its child's gso_skb with dualpi2 leaf",
1250        "category": [
1251            "qdisc",
1252            "tbf",
1253            "red",
1254            "dualpi2"
1255        ],
1256        "plugins": {
1257            "requires": "nsPlugin"
1258        },
1259        "setup": [
1260            "$IP link set dev $DUMMY up || true",
1261            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
1262            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 88bit burst 1661b peakrate 2257333 minburst 1024 limit 7b",
1263            "$TC qdisc add dev $DUMMY parent 1: handle 2: red limit 757 min 16 max 24 avpkt 16",
1264            "$TC qdisc add dev $DUMMY parent 2: handle 3: dualpi2"
1265        ],
1266        "cmdUnderTest": "ping -c 1 10.10.10.1 -W0.01 -I$DUMMY || true",
1267        "expExitCode": "0",
1268        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY parent 1:",
1269        "matchJSON": [
1270            {
1271                "kind": "red",
1272                "handle": "2:",
1273                "bytes": 98,
1274                "packets": 1,
1275                "backlog": 0,
1276                "qlen": 0
1277            }
1278        ],
1279        "teardown": [
1280            "$TC qdisc del dev $DUMMY handle 1: root"
1281        ]
1282    },
1283    {
1284        "id": "9c6d",
1285        "name": "Force sfb to dequeue from its child's gso_skb with dualpi2 leaf",
1286        "category": [
1287            "qdisc",
1288            "tbf",
1289            "sfb",
1290            "dualpi2"
1291        ],
1292        "plugins": {
1293            "requires": "nsPlugin"
1294        },
1295        "setup": [
1296            "$IP link set dev $DUMMY up || true",
1297            "$IP addr add 10.10.11.10/24 dev $DUMMY || true",
1298            "$TC qdisc add dev $DUMMY root handle 1: tbf rate 88bit burst 1661b peakrate 2257333 minburst 1024 limit 7b",
1299            "$TC qdisc add dev $DUMMY parent 1: handle 2: sfb",
1300            "$TC qdisc add dev $DUMMY parent 2: handle 3: dualpi2"
1301        ],
1302        "cmdUnderTest": "ping -c 1 10.10.10.1 -W0.01 -I$DUMMY || true",
1303        "expExitCode": "0",
1304        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY parent 1:",
1305        "matchJSON": [
1306            {
1307                "kind": "sfb",
1308                "handle": "2:",
1309                "bytes": 98,
1310                "packets": 1,
1311                "backlog": 0,
1312                "qlen": 0
1313            }
1314        ],
1315        "teardown": [
1316            "$TC qdisc del dev $DUMMY handle 1: root"
1317        ]
1318    },
1319    {
1320        "id": "3a62",
1321        "name": "Try to create a qlen underflow with QFQ/CBS",
1322        "category": [
1323            "qdisc",
1324            "qfq",
1325            "cbs"
1326        ],
1327        "plugins": {
1328            "requires": "nsPlugin"
1329        },
1330        "setup": [
1331            "$IP link set dev $DUMMY up || true",
1332            "$IP addr add 10.10.10.10/24 dev $DUMMY || true",
1333            "$TC qdisc add dev $DUMMY root handle 1: qfq",
1334            "$TC class add dev $DUMMY classid 1:1 parent 1: qfq",
1335            "$TC class add dev $DUMMY classid 1:2 parent 1: qfq",
1336            "$TC qdisc add dev $DUMMY handle 2: parent 1:1 cbs",
1337            "$TC qdisc add dev $DUMMY handle 3: parent 2: netem delay 5000000000",
1338            "$TC filter add dev $DUMMY parent 1: prio 1 u32 match ip dst 10.10.10.1 classid 1:1 action ok",
1339            "$TC filter add dev $DUMMY parent 1: prio 2 u32 match ip dst 10.10.10.2 classid 1:2 action ok",
1340            "ping -c 1 10.10.10.1 -W0.01 -I$DUMMY || true",
1341            "$IP l set $DUMMY down",
1342            "$IP l set $DUMMY up",
1343            "$TC qdisc replace dev $DUMMY handle 4: parent 2: pfifo"
1344        ],
1345        "cmdUnderTest": "ping -c 1 10.10.10.2 -W0.01 -I$DUMMY",
1346        "expExitCode": "1",
1347        "verifyCmd": "$TC -s -j qdisc ls dev $DUMMY parent 1:1",
1348        "matchJSON": [
1349            {
1350                "kind": "cbs",
1351                "handle": "2:",
1352                "bytes": 0,
1353                "packets": 0
1354            }
1355        ],
1356        "teardown": [
1357            "$TC qdisc del dev $DUMMY handle 1: root"
1358        ]
1359    }
1360]
1361