Merge branches 'acpi-bus' and 'acpi-video'
[linux-block.git] / tools / testing / selftests / net / forwarding / bridge_mdb_max.sh
CommitLineData
3446dcd7
PM
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# +-----------------------+ +------------------------+
5# | H1 (vrf) | | H2 (vrf) |
6# | + $h1.10 | | + $h2.10 |
7# | | 192.0.2.1/28 | | | 192.0.2.2/28 |
8# | | 2001:db8:1::1/64 | | | 2001:db8:1::2/64 |
9# | | | | | |
10# | | + $h1.20 | | | + $h2.20 |
11# | \ | 198.51.100.1/24 | | \ | 198.51.100.2/24 |
12# | \ | 2001:db8:2::1/64 | | \ | 2001:db8:2::2/64 |
13# | \| | | \| |
14# | + $h1 | | + $h2 |
15# +----|------------------+ +----|-------------------+
16# | |
17# +----|--------------------------------------------------|-------------------+
18# | SW | | |
19# | +--|--------------------------------------------------|-----------------+ |
20# | | + $swp1 BR0 (802.1q) + $swp2 | |
21# | | vid 10 vid 10 | |
22# | | vid 20 vid 20 | |
23# | | | |
24# | +-----------------------------------------------------------------------+ |
25# +---------------------------------------------------------------------------+
26
27ALL_TESTS="
28 test_8021d
29 test_8021q
30 test_8021qvs
31"
32
33NUM_NETIFS=4
34source lib.sh
35source tc_common.sh
36
37h1_create()
38{
39 simple_if_init $h1
40 vlan_create $h1 10 v$h1 192.0.2.1/28 2001:db8:1::1/64
41 vlan_create $h1 20 v$h1 198.51.100.1/24 2001:db8:2::1/64
42}
43
44h1_destroy()
45{
46 vlan_destroy $h1 20
47 vlan_destroy $h1 10
48 simple_if_fini $h1
49}
50
51h2_create()
52{
53 simple_if_init $h2
54 vlan_create $h2 10 v$h2 192.0.2.2/28
55 vlan_create $h2 20 v$h2 198.51.100.2/24
56}
57
58h2_destroy()
59{
60 vlan_destroy $h2 20
61 vlan_destroy $h2 10
62 simple_if_fini $h2
63}
64
65switch_create_8021d()
66{
67 log_info "802.1d tests"
68
69 ip link add name br0 type bridge vlan_filtering 0 \
70 mcast_snooping 1 \
71 mcast_igmp_version 3 mcast_mld_version 2
72 ip link set dev br0 up
73
74 ip link set dev $swp1 master br0
75 ip link set dev $swp1 up
76 bridge link set dev $swp1 fastleave on
77
78 ip link set dev $swp2 master br0
79 ip link set dev $swp2 up
80}
81
82switch_create_8021q()
83{
84 local br_flags=$1; shift
85
86 log_info "802.1q $br_flags${br_flags:+ }tests"
87
88 ip link add name br0 type bridge vlan_filtering 1 vlan_default_pvid 0 \
89 mcast_snooping 1 $br_flags \
90 mcast_igmp_version 3 mcast_mld_version 2
91 bridge vlan add vid 10 dev br0 self
92 bridge vlan add vid 20 dev br0 self
93 ip link set dev br0 up
94
95 ip link set dev $swp1 master br0
96 ip link set dev $swp1 up
97 bridge link set dev $swp1 fastleave on
98 bridge vlan add vid 10 dev $swp1
99 bridge vlan add vid 20 dev $swp1
100
101 ip link set dev $swp2 master br0
102 ip link set dev $swp2 up
103 bridge vlan add vid 10 dev $swp2
104 bridge vlan add vid 20 dev $swp2
105}
106
107switch_create_8021qvs()
108{
109 switch_create_8021q "mcast_vlan_snooping 1"
110 bridge vlan global set dev br0 vid 10 mcast_igmp_version 3
111 bridge vlan global set dev br0 vid 10 mcast_mld_version 2
112 bridge vlan global set dev br0 vid 20 mcast_igmp_version 3
113 bridge vlan global set dev br0 vid 20 mcast_mld_version 2
114}
115
116switch_destroy()
117{
118 ip link set dev $swp2 down
119 ip link set dev $swp2 nomaster
120
121 ip link set dev $swp1 down
122 ip link set dev $swp1 nomaster
123
124 ip link set dev br0 down
125 ip link del dev br0
126}
127
128setup_prepare()
129{
130 h1=${NETIFS[p1]}
131 swp1=${NETIFS[p2]}
132
133 swp2=${NETIFS[p3]}
134 h2=${NETIFS[p4]}
135
136 vrf_prepare
137 forwarding_enable
138
139 h1_create
140 h2_create
141}
142
143cleanup()
144{
145 pre_cleanup
146
147 switch_destroy 2>/dev/null
148 h2_destroy
149 h1_destroy
150
151 forwarding_restore
152 vrf_cleanup
153}
154
155cfg_src_list()
156{
157 local IPs=("$@")
158 local IPstr=$(echo ${IPs[@]} | tr '[:space:]' , | sed 's/,$//')
159
160 echo ${IPstr:+source_list }${IPstr}
161}
162
163cfg_group_op()
164{
165 local op=$1; shift
166 local locus=$1; shift
167 local GRP=$1; shift
168 local state=$1; shift
169 local IPs=("$@")
170
171 local source_list=$(cfg_src_list ${IPs[@]})
172
173 # Everything besides `bridge mdb' uses the "dev X vid Y" syntax,
174 # so we use it here as well and convert.
175 local br_locus=$(echo "$locus" | sed 's/^dev /port /')
176
177 bridge mdb $op dev br0 $br_locus grp $GRP $state \
178 filter_mode include $source_list
179}
180
181cfg4_entries_op()
182{
183 local op=$1; shift
184 local locus=$1; shift
185 local state=$1; shift
186 local n=$1; shift
187 local grp=${1:-1}; shift
188
189 local GRP=239.1.1.${grp}
190 local IPs=$(seq -f 192.0.2.%g 1 $((n - 1)))
191 cfg_group_op "$op" "$locus" "$GRP" "$state" ${IPs[@]}
192}
193
194cfg4_entries_add()
195{
196 cfg4_entries_op add "$@"
197}
198
199cfg4_entries_del()
200{
201 cfg4_entries_op del "$@"
202}
203
204cfg6_entries_op()
205{
206 local op=$1; shift
207 local locus=$1; shift
208 local state=$1; shift
209 local n=$1; shift
210 local grp=${1:-1}; shift
211
212 local GRP=ff0e::${grp}
213 local IPs=$(printf "2001:db8:1::%x\n" $(seq 1 $((n - 1))))
214 cfg_group_op "$op" "$locus" "$GRP" "$state" ${IPs[@]}
215}
216
217cfg6_entries_add()
218{
219 cfg6_entries_op add "$@"
220}
221
222cfg6_entries_del()
223{
224 cfg6_entries_op del "$@"
225}
226
227locus_dev_peer()
228{
229 local dev_kw=$1; shift
230 local dev=$1; shift
231 local vid_kw=$1; shift
232 local vid=$1; shift
233
234 echo "$h1.${vid:-10}"
235}
236
237locus_dev()
238{
239 local dev_kw=$1; shift
240 local dev=$1; shift
241
242 echo $dev
243}
244
245ctl4_entries_add()
246{
247 local locus=$1; shift
248 local state=$1; shift
249 local n=$1; shift
250 local grp=${1:-1}; shift
251
252 local IPs=$(seq -f 192.0.2.%g 1 $((n - 1)))
253 local peer=$(locus_dev_peer $locus)
254 local GRP=239.1.1.${grp}
cb034948
IS
255 local dmac=01:00:5e:01:01:$(printf "%02x" $grp)
256 $MZ $peer -a own -b $dmac -c 1 -A 192.0.2.1 -B $GRP \
3446dcd7
PM
257 -t ip proto=2,p=$(igmpv3_is_in_get $GRP $IPs) -q
258 sleep 1
259
260 local nn=$(bridge mdb show dev br0 | grep $GRP | wc -l)
261 if ((nn != n)); then
262 echo mcast_max_groups > /dev/stderr
263 false
264 fi
265}
266
267ctl4_entries_del()
268{
269 local locus=$1; shift
270 local state=$1; shift
271 local n=$1; shift
272 local grp=${1:-1}; shift
273
274 local peer=$(locus_dev_peer $locus)
275 local GRP=239.1.1.${grp}
cb034948
IS
276 local dmac=01:00:5e:00:00:02
277 $MZ $peer -a own -b $dmac -c 1 -A 192.0.2.1 -B 224.0.0.2 \
3446dcd7
PM
278 -t ip proto=2,p=$(igmpv2_leave_get $GRP) -q
279 sleep 1
280 ! bridge mdb show dev br0 | grep -q $GRP
281}
282
283ctl6_entries_add()
284{
285 local locus=$1; shift
286 local state=$1; shift
287 local n=$1; shift
288 local grp=${1:-1}; shift
289
290 local IPs=$(printf "2001:db8:1::%x\n" $(seq 1 $((n - 1))))
291 local peer=$(locus_dev_peer $locus)
292 local SIP=fe80::1
293 local GRP=ff0e::${grp}
cb034948 294 local dmac=33:33:00:00:00:$(printf "%02x" $grp)
3446dcd7 295 local p=$(mldv2_is_in_get $SIP $GRP $IPs)
cb034948
IS
296 $MZ -6 $peer -a own -b $dmac -c 1 -A $SIP -B $GRP \
297 -t ip hop=1,next=0,p="$p" -q
3446dcd7
PM
298 sleep 1
299
300 local nn=$(bridge mdb show dev br0 | grep $GRP | wc -l)
301 if ((nn != n)); then
302 echo mcast_max_groups > /dev/stderr
303 false
304 fi
305}
306
307ctl6_entries_del()
308{
309 local locus=$1; shift
310 local state=$1; shift
311 local n=$1; shift
312 local grp=${1:-1}; shift
313
314 local peer=$(locus_dev_peer $locus)
315 local SIP=fe80::1
316 local GRP=ff0e::${grp}
cb034948 317 local dmac=33:33:00:00:00:$(printf "%02x" $grp)
3446dcd7 318 local p=$(mldv1_done_get $SIP $GRP)
cb034948
IS
319 $MZ -6 $peer -a own -b $dmac -c 1 -A $SIP -B $GRP \
320 -t ip hop=1,next=0,p="$p" -q
3446dcd7
PM
321 sleep 1
322 ! bridge mdb show dev br0 | grep -q $GRP
323}
324
325bridge_maxgroups_errmsg_check_cfg()
326{
327 local msg=$1; shift
328 local needle=$1; shift
329
330 echo "$msg" | grep -q mcast_max_groups
331 check_err $? "Adding MDB entries failed for the wrong reason: $msg"
332}
333
334bridge_maxgroups_errmsg_check_cfg4()
335{
336 bridge_maxgroups_errmsg_check_cfg "$@"
337}
338
339bridge_maxgroups_errmsg_check_cfg6()
340{
341 bridge_maxgroups_errmsg_check_cfg "$@"
342}
343
344bridge_maxgroups_errmsg_check_ctl4()
345{
346 :
347}
348
349bridge_maxgroups_errmsg_check_ctl6()
350{
351 :
352}
353
354bridge_port_ngroups_get()
355{
356 local locus=$1; shift
357
358 bridge -j -d link show $locus |
359 jq '.[].mcast_n_groups'
360}
361
362bridge_port_maxgroups_get()
363{
364 local locus=$1; shift
365
366 bridge -j -d link show $locus |
367 jq '.[].mcast_max_groups'
368}
369
370bridge_port_maxgroups_set()
371{
372 local locus=$1; shift
373 local max=$1; shift
374
375 bridge link set dev $(locus_dev $locus) mcast_max_groups $max
376}
377
378bridge_port_vlan_ngroups_get()
379{
380 local locus=$1; shift
381
382 bridge -j -d vlan show $locus |
383 jq '.[].vlans[].mcast_n_groups'
384}
385
386bridge_port_vlan_maxgroups_get()
387{
388 local locus=$1; shift
389
390 bridge -j -d vlan show $locus |
391 jq '.[].vlans[].mcast_max_groups'
392}
393
394bridge_port_vlan_maxgroups_set()
395{
396 local locus=$1; shift
397 local max=$1; shift
398
399 bridge vlan set $locus mcast_max_groups $max
400}
401
402test_ngroups_reporting()
403{
404 local CFG=$1; shift
405 local context=$1; shift
406 local locus=$1; shift
407
408 RET=0
409
410 local n0=$(bridge_${context}_ngroups_get "$locus")
411 ${CFG}_entries_add "$locus" temp 5
412 check_err $? "Couldn't add MDB entries"
413 local n1=$(bridge_${context}_ngroups_get "$locus")
414
415 ((n1 == n0 + 5))
416 check_err $? "Number of groups was $n0, now is $n1, but $((n0 + 5)) expected"
417
418 ${CFG}_entries_del "$locus" temp 5
419 check_err $? "Couldn't delete MDB entries"
420 local n2=$(bridge_${context}_ngroups_get "$locus")
421
422 ((n2 == n0))
423 check_err $? "Number of groups was $n0, now is $n2, but should be back to $n0"
424
425 log_test "$CFG: $context: ngroups reporting"
426}
427
428test_8021d_ngroups_reporting_cfg4()
429{
430 test_ngroups_reporting cfg4 port "dev $swp1"
431}
432
433test_8021d_ngroups_reporting_ctl4()
434{
435 test_ngroups_reporting ctl4 port "dev $swp1"
436}
437
438test_8021d_ngroups_reporting_cfg6()
439{
440 test_ngroups_reporting cfg6 port "dev $swp1"
441}
442
443test_8021d_ngroups_reporting_ctl6()
444{
445 test_ngroups_reporting ctl6 port "dev $swp1"
446}
447
448test_8021q_ngroups_reporting_cfg4()
449{
450 test_ngroups_reporting cfg4 port "dev $swp1 vid 10"
451}
452
453test_8021q_ngroups_reporting_ctl4()
454{
455 test_ngroups_reporting ctl4 port "dev $swp1 vid 10"
456}
457
458test_8021q_ngroups_reporting_cfg6()
459{
460 test_ngroups_reporting cfg6 port "dev $swp1 vid 10"
461}
462
463test_8021q_ngroups_reporting_ctl6()
464{
465 test_ngroups_reporting ctl6 port "dev $swp1 vid 10"
466}
467
468test_8021qvs_ngroups_reporting_cfg4()
469{
470 test_ngroups_reporting cfg4 port_vlan "dev $swp1 vid 10"
471}
472
473test_8021qvs_ngroups_reporting_ctl4()
474{
475 test_ngroups_reporting ctl4 port_vlan "dev $swp1 vid 10"
476}
477
478test_8021qvs_ngroups_reporting_cfg6()
479{
480 test_ngroups_reporting cfg6 port_vlan "dev $swp1 vid 10"
481}
482
483test_8021qvs_ngroups_reporting_ctl6()
484{
485 test_ngroups_reporting ctl6 port_vlan "dev $swp1 vid 10"
486}
487
488test_ngroups_cross_vlan()
489{
490 local CFG=$1; shift
491
492 local locus1="dev $swp1 vid 10"
493 local locus2="dev $swp1 vid 20"
494
495 RET=0
496
497 local n10=$(bridge_port_vlan_ngroups_get "$locus1")
498 local n20=$(bridge_port_vlan_ngroups_get "$locus2")
499 ${CFG}_entries_add "$locus1" temp 5 111
500 check_err $? "Couldn't add MDB entries to VLAN 10"
501 local n11=$(bridge_port_vlan_ngroups_get "$locus1")
502 local n21=$(bridge_port_vlan_ngroups_get "$locus2")
503
504 ((n11 == n10 + 5))
505 check_err $? "Number of groups at VLAN 10 was $n10, now is $n11, but 5 entries added on VLAN 10, $((n10 + 5)) expected"
506
507 ((n21 == n20))
508 check_err $? "Number of groups at VLAN 20 was $n20, now is $n21, but no change expected on VLAN 20"
509
510 ${CFG}_entries_add "$locus2" temp 5 112
511 check_err $? "Couldn't add MDB entries to VLAN 20"
512 local n12=$(bridge_port_vlan_ngroups_get "$locus1")
513 local n22=$(bridge_port_vlan_ngroups_get "$locus2")
514
515 ((n12 == n11))
516 check_err $? "Number of groups at VLAN 10 was $n11, now is $n12, but no change expected on VLAN 10"
517
518 ((n22 == n21 + 5))
519 check_err $? "Number of groups at VLAN 20 was $n21, now is $n22, but 5 entries added on VLAN 20, $((n21 + 5)) expected"
520
521 ${CFG}_entries_del "$locus1" temp 5 111
522 check_err $? "Couldn't delete MDB entries from VLAN 10"
523 ${CFG}_entries_del "$locus2" temp 5 112
524 check_err $? "Couldn't delete MDB entries from VLAN 20"
525 local n13=$(bridge_port_vlan_ngroups_get "$locus1")
526 local n23=$(bridge_port_vlan_ngroups_get "$locus2")
527
528 ((n13 == n10))
529 check_err $? "Number of groups at VLAN 10 was $n10, now is $n13, but should be back to $n10"
530
531 ((n23 == n20))
532 check_err $? "Number of groups at VLAN 20 was $n20, now is $n23, but should be back to $n20"
533
534 log_test "$CFG: port_vlan: isolation of port and per-VLAN ngroups"
535}
536
537test_8021qvs_ngroups_cross_vlan_cfg4()
538{
539 test_ngroups_cross_vlan cfg4
540}
541
542test_8021qvs_ngroups_cross_vlan_ctl4()
543{
544 test_ngroups_cross_vlan ctl4
545}
546
547test_8021qvs_ngroups_cross_vlan_cfg6()
548{
549 test_ngroups_cross_vlan cfg6
550}
551
552test_8021qvs_ngroups_cross_vlan_ctl6()
553{
554 test_ngroups_cross_vlan ctl6
555}
556
557test_maxgroups_zero()
558{
559 local CFG=$1; shift
560 local context=$1; shift
561 local locus=$1; shift
562
563 RET=0
564 local max
565
566 max=$(bridge_${context}_maxgroups_get "$locus")
567 ((max == 0))
568 check_err $? "Max groups on $locus should be 0, but $max reported"
569
570 bridge_${context}_maxgroups_set "$locus" 100
571 check_err $? "Failed to set max to 100"
572 max=$(bridge_${context}_maxgroups_get "$locus")
573 ((max == 100))
574 check_err $? "Max groups expected to be 100, but $max reported"
575
576 bridge_${context}_maxgroups_set "$locus" 0
577 check_err $? "Couldn't set maximum to 0"
578
579 # Test that setting 0 explicitly still serves as infinity.
580 ${CFG}_entries_add "$locus" temp 5
581 check_err $? "Adding 5 MDB entries failed but should have passed"
582 ${CFG}_entries_del "$locus" temp 5
583 check_err $? "Couldn't delete MDB entries"
584
585 log_test "$CFG: $context maxgroups: reporting and treatment of 0"
586}
587
588test_8021d_maxgroups_zero_cfg4()
589{
590 test_maxgroups_zero cfg4 port "dev $swp1"
591}
592
593test_8021d_maxgroups_zero_ctl4()
594{
595 test_maxgroups_zero ctl4 port "dev $swp1"
596}
597
598test_8021d_maxgroups_zero_cfg6()
599{
600 test_maxgroups_zero cfg6 port "dev $swp1"
601}
602
603test_8021d_maxgroups_zero_ctl6()
604{
605 test_maxgroups_zero ctl6 port "dev $swp1"
606}
607
608test_8021q_maxgroups_zero_cfg4()
609{
610 test_maxgroups_zero cfg4 port "dev $swp1 vid 10"
611}
612
613test_8021q_maxgroups_zero_ctl4()
614{
615 test_maxgroups_zero ctl4 port "dev $swp1 vid 10"
616}
617
618test_8021q_maxgroups_zero_cfg6()
619{
620 test_maxgroups_zero cfg6 port "dev $swp1 vid 10"
621}
622
623test_8021q_maxgroups_zero_ctl6()
624{
625 test_maxgroups_zero ctl6 port "dev $swp1 vid 10"
626}
627
628test_8021qvs_maxgroups_zero_cfg4()
629{
630 test_maxgroups_zero cfg4 port_vlan "dev $swp1 vid 10"
631}
632
633test_8021qvs_maxgroups_zero_ctl4()
634{
635 test_maxgroups_zero ctl4 port_vlan "dev $swp1 vid 10"
636}
637
638test_8021qvs_maxgroups_zero_cfg6()
639{
640 test_maxgroups_zero cfg6 port_vlan "dev $swp1 vid 10"
641}
642
643test_8021qvs_maxgroups_zero_ctl6()
644{
645 test_maxgroups_zero ctl6 port_vlan "dev $swp1 vid 10"
646}
647
648test_maxgroups_zero_cross_vlan()
649{
650 local CFG=$1; shift
651
652 local locus0="dev $swp1"
653 local locus1="dev $swp1 vid 10"
654 local locus2="dev $swp1 vid 20"
655 local max
656
657 RET=0
658
659 bridge_port_vlan_maxgroups_set "$locus1" 100
660 check_err $? "$locus1: Failed to set max to 100"
661
662 max=$(bridge_port_maxgroups_get "$locus0")
663 ((max == 0))
664 check_err $? "$locus0: Max groups expected to be 0, but $max reported"
665
666 max=$(bridge_port_vlan_maxgroups_get "$locus2")
667 ((max == 0))
668 check_err $? "$locus2: Max groups expected to be 0, but $max reported"
669
670 bridge_port_vlan_maxgroups_set "$locus2" 100
671 check_err $? "$locus2: Failed to set max to 100"
672
673 max=$(bridge_port_maxgroups_get "$locus0")
674 ((max == 0))
675 check_err $? "$locus0: Max groups expected to be 0, but $max reported"
676
677 max=$(bridge_port_vlan_maxgroups_get "$locus2")
678 ((max == 100))
679 check_err $? "$locus2: Max groups expected to be 100, but $max reported"
680
681 bridge_port_maxgroups_set "$locus0" 100
682 check_err $? "$locus0: Failed to set max to 100"
683
684 max=$(bridge_port_maxgroups_get "$locus0")
685 ((max == 100))
686 check_err $? "$locus0: Max groups expected to be 100, but $max reported"
687
688 max=$(bridge_port_vlan_maxgroups_get "$locus2")
689 ((max == 100))
690 check_err $? "$locus2: Max groups expected to be 100, but $max reported"
691
692 bridge_port_vlan_maxgroups_set "$locus1" 0
693 check_err $? "$locus1: Failed to set max to 0"
694
695 max=$(bridge_port_maxgroups_get "$locus0")
696 ((max == 100))
697 check_err $? "$locus0: Max groups expected to be 100, but $max reported"
698
699 max=$(bridge_port_vlan_maxgroups_get "$locus2")
700 ((max == 100))
701 check_err $? "$locus2: Max groups expected to be 100, but $max reported"
702
703 bridge_port_vlan_maxgroups_set "$locus2" 0
704 check_err $? "$locus2: Failed to set max to 0"
705
706 max=$(bridge_port_maxgroups_get "$locus0")
707 ((max == 100))
708 check_err $? "$locus0: Max groups expected to be 100, but $max reported"
709
710 max=$(bridge_port_vlan_maxgroups_get "$locus2")
711 ((max == 0))
712 check_err $? "$locus2: Max groups expected to be 0 but $max reported"
713
714 bridge_port_maxgroups_set "$locus0" 0
715 check_err $? "$locus0: Failed to set max to 0"
716
717 max=$(bridge_port_maxgroups_get "$locus0")
718 ((max == 0))
719 check_err $? "$locus0: Max groups expected to be 0, but $max reported"
720
721 max=$(bridge_port_vlan_maxgroups_get "$locus2")
722 ((max == 0))
723 check_err $? "$locus2: Max groups expected to be 0, but $max reported"
724
725 log_test "$CFG: port_vlan maxgroups: isolation of port and per-VLAN maximums"
726}
727
728test_8021qvs_maxgroups_zero_cross_vlan_cfg4()
729{
730 test_maxgroups_zero_cross_vlan cfg4
731}
732
733test_8021qvs_maxgroups_zero_cross_vlan_ctl4()
734{
735 test_maxgroups_zero_cross_vlan ctl4
736}
737
738test_8021qvs_maxgroups_zero_cross_vlan_cfg6()
739{
740 test_maxgroups_zero_cross_vlan cfg6
741}
742
743test_8021qvs_maxgroups_zero_cross_vlan_ctl6()
744{
745 test_maxgroups_zero_cross_vlan ctl6
746}
747
748test_maxgroups_too_low()
749{
750 local CFG=$1; shift
751 local context=$1; shift
752 local locus=$1; shift
753
754 RET=0
755
756 local n=$(bridge_${context}_ngroups_get "$locus")
757 local msg
758
759 ${CFG}_entries_add "$locus" temp 5 111
760 check_err $? "$locus: Couldn't add MDB entries"
761
762 bridge_${context}_maxgroups_set "$locus" $((n+2))
763 check_err $? "$locus: Setting maxgroups to $((n+2)) failed"
764
765 msg=$(${CFG}_entries_add "$locus" temp 2 112 2>&1)
766 check_fail $? "$locus: Adding more entries passed when max<n"
767 bridge_maxgroups_errmsg_check_cfg "$msg"
768
769 ${CFG}_entries_del "$locus" temp 5 111
770 check_err $? "$locus: Couldn't delete MDB entries"
771
772 ${CFG}_entries_add "$locus" temp 2 112
773 check_err $? "$locus: Adding more entries failed"
774
775 ${CFG}_entries_del "$locus" temp 2 112
776 check_err $? "$locus: Deleting more entries failed"
777
778 bridge_${context}_maxgroups_set "$locus" 0
779 check_err $? "$locus: Couldn't set maximum to 0"
780
781 log_test "$CFG: $context maxgroups: configure below ngroups"
782}
783
784test_8021d_maxgroups_too_low_cfg4()
785{
786 test_maxgroups_too_low cfg4 port "dev $swp1"
787}
788
789test_8021d_maxgroups_too_low_ctl4()
790{
791 test_maxgroups_too_low ctl4 port "dev $swp1"
792}
793
794test_8021d_maxgroups_too_low_cfg6()
795{
796 test_maxgroups_too_low cfg6 port "dev $swp1"
797}
798
799test_8021d_maxgroups_too_low_ctl6()
800{
801 test_maxgroups_too_low ctl6 port "dev $swp1"
802}
803
804test_8021q_maxgroups_too_low_cfg4()
805{
806 test_maxgroups_too_low cfg4 port "dev $swp1 vid 10"
807}
808
809test_8021q_maxgroups_too_low_ctl4()
810{
811 test_maxgroups_too_low ctl4 port "dev $swp1 vid 10"
812}
813
814test_8021q_maxgroups_too_low_cfg6()
815{
816 test_maxgroups_too_low cfg6 port "dev $swp1 vid 10"
817}
818
819test_8021q_maxgroups_too_low_ctl6()
820{
821 test_maxgroups_too_low ctl6 port "dev $swp1 vid 10"
822}
823
824test_8021qvs_maxgroups_too_low_cfg4()
825{
826 test_maxgroups_too_low cfg4 port_vlan "dev $swp1 vid 10"
827}
828
829test_8021qvs_maxgroups_too_low_ctl4()
830{
831 test_maxgroups_too_low ctl4 port_vlan "dev $swp1 vid 10"
832}
833
834test_8021qvs_maxgroups_too_low_cfg6()
835{
836 test_maxgroups_too_low cfg6 port_vlan "dev $swp1 vid 10"
837}
838
839test_8021qvs_maxgroups_too_low_ctl6()
840{
841 test_maxgroups_too_low ctl6 port_vlan "dev $swp1 vid 10"
842}
843
844test_maxgroups_too_many_entries()
845{
846 local CFG=$1; shift
847 local context=$1; shift
848 local locus=$1; shift
849
850 RET=0
851
852 local n=$(bridge_${context}_ngroups_get "$locus")
853 local msg
854
855 # Configure a low maximum
856 bridge_${context}_maxgroups_set "$locus" $((n+1))
857 check_err $? "$locus: Couldn't set maximum"
858
859 # Try to add more entries than the configured maximum
860 msg=$(${CFG}_entries_add "$locus" temp 5 2>&1)
861 check_fail $? "Adding 5 MDB entries passed, but should have failed"
862 bridge_maxgroups_errmsg_check_${CFG} "$msg"
863
864 # When adding entries through the control path, as many as possible
865 # get created. That's consistent with the mcast_hash_max behavior.
866 # So there, drop the entries explicitly.
867 if [[ ${CFG%[46]} == ctl ]]; then
868 ${CFG}_entries_del "$locus" temp 17 2>&1
869 fi
870
871 local n2=$(bridge_${context}_ngroups_get "$locus")
872 ((n2 == n))
873 check_err $? "Number of groups was $n, but after a failed attempt to add MDB entries it changed to $n2"
874
875 bridge_${context}_maxgroups_set "$locus" 0
876 check_err $? "$locus: Couldn't set maximum to 0"
877
878 log_test "$CFG: $context maxgroups: add too many MDB entries"
879}
880
881test_8021d_maxgroups_too_many_entries_cfg4()
882{
883 test_maxgroups_too_many_entries cfg4 port "dev $swp1"
884}
885
886test_8021d_maxgroups_too_many_entries_ctl4()
887{
888 test_maxgroups_too_many_entries ctl4 port "dev $swp1"
889}
890
891test_8021d_maxgroups_too_many_entries_cfg6()
892{
893 test_maxgroups_too_many_entries cfg6 port "dev $swp1"
894}
895
896test_8021d_maxgroups_too_many_entries_ctl6()
897{
898 test_maxgroups_too_many_entries ctl6 port "dev $swp1"
899}
900
901test_8021q_maxgroups_too_many_entries_cfg4()
902{
903 test_maxgroups_too_many_entries cfg4 port "dev $swp1 vid 10"
904}
905
906test_8021q_maxgroups_too_many_entries_ctl4()
907{
908 test_maxgroups_too_many_entries ctl4 port "dev $swp1 vid 10"
909}
910
911test_8021q_maxgroups_too_many_entries_cfg6()
912{
913 test_maxgroups_too_many_entries cfg6 port "dev $swp1 vid 10"
914}
915
916test_8021q_maxgroups_too_many_entries_ctl6()
917{
918 test_maxgroups_too_many_entries ctl6 port "dev $swp1 vid 10"
919}
920
921test_8021qvs_maxgroups_too_many_entries_cfg4()
922{
923 test_maxgroups_too_many_entries cfg4 port_vlan "dev $swp1 vid 10"
924}
925
926test_8021qvs_maxgroups_too_many_entries_ctl4()
927{
928 test_maxgroups_too_many_entries ctl4 port_vlan "dev $swp1 vid 10"
929}
930
931test_8021qvs_maxgroups_too_many_entries_cfg6()
932{
933 test_maxgroups_too_many_entries cfg6 port_vlan "dev $swp1 vid 10"
934}
935
936test_8021qvs_maxgroups_too_many_entries_ctl6()
937{
938 test_maxgroups_too_many_entries ctl6 port_vlan "dev $swp1 vid 10"
939}
940
941test_maxgroups_too_many_cross_vlan()
942{
943 local CFG=$1; shift
944
945 RET=0
946
947 local locus0="dev $swp1"
948 local locus1="dev $swp1 vid 10"
949 local locus2="dev $swp1 vid 20"
950 local n1=$(bridge_port_vlan_ngroups_get "$locus1")
951 local n2=$(bridge_port_vlan_ngroups_get "$locus2")
952 local msg
953
954 if ((n1 > n2)); then
955 local tmp=$n1
956 n1=$n2
957 n2=$tmp
958
959 tmp="$locus1"
960 locus1="$locus2"
961 locus2="$tmp"
962 fi
963
964 # Now 0 <= n1 <= n2.
965 ${CFG}_entries_add "$locus2" temp 5 112
966 check_err $? "Couldn't add 5 entries"
967
968 n2=$(bridge_port_vlan_ngroups_get "$locus2")
969 # Now 0 <= n1 < n2-1.
970
971 # Setting locus1'maxgroups to n2-1 should pass. The number is
972 # smaller than both the absolute number of MDB entries, and in
973 # particular than number of locus2's number of entries, but it is
974 # large enough to cover locus1's entries. Thus we check that
975 # individual VLAN's ngroups are independent.
976 bridge_port_vlan_maxgroups_set "$locus1" $((n2-1))
977 check_err $? "Setting ${locus1}'s maxgroups to $((n2-1)) failed"
978
979 msg=$(${CFG}_entries_add "$locus1" temp $n2 111 2>&1)
980 check_fail $? "$locus1: Adding $n2 MDB entries passed, but should have failed"
981 bridge_maxgroups_errmsg_check_${CFG} "$msg"
982
983 bridge_port_maxgroups_set "$locus0" $((n1 + n2 + 2))
984 check_err $? "$locus0: Couldn't set maximum"
985
986 msg=$(${CFG}_entries_add "$locus1" temp 5 111 2>&1)
987 check_fail $? "$locus1: Adding 5 MDB entries passed, but should have failed"
988 bridge_maxgroups_errmsg_check_${CFG} "$msg"
989
990 # IGMP/MLD packets can cause several entries to be added, before
991 # the maximum is hit and the rest is then bounced. Remove what was
992 # committed, if anything.
993 ${CFG}_entries_del "$locus1" temp 5 111 2>/dev/null
994
995 ${CFG}_entries_add "$locus1" temp 2 111
996 check_err $? "$locus1: Adding 2 MDB entries failed, but should have passed"
997
998 ${CFG}_entries_del "$locus1" temp 2 111
999 check_err $? "Couldn't delete MDB entries"
1000
1001 ${CFG}_entries_del "$locus2" temp 5 112
1002 check_err $? "Couldn't delete MDB entries"
1003
1004 bridge_port_vlan_maxgroups_set "$locus1" 0
1005 check_err $? "$locus1: Couldn't set maximum to 0"
1006
1007 bridge_port_maxgroups_set "$locus0" 0
1008 check_err $? "$locus0: Couldn't set maximum to 0"
1009
1010 log_test "$CFG: port_vlan maxgroups: isolation of port and per-VLAN ngroups"
1011}
1012
1013test_8021qvs_maxgroups_too_many_cross_vlan_cfg4()
1014{
1015 test_maxgroups_too_many_cross_vlan cfg4
1016}
1017
1018test_8021qvs_maxgroups_too_many_cross_vlan_ctl4()
1019{
1020 test_maxgroups_too_many_cross_vlan ctl4
1021}
1022
1023test_8021qvs_maxgroups_too_many_cross_vlan_cfg6()
1024{
1025 test_maxgroups_too_many_cross_vlan cfg6
1026}
1027
1028test_8021qvs_maxgroups_too_many_cross_vlan_ctl6()
1029{
1030 test_maxgroups_too_many_cross_vlan ctl6
1031}
1032
1033test_vlan_attributes()
1034{
1035 local locus=$1; shift
1036 local expect=$1; shift
1037
1038 RET=0
1039
1040 local max=$(bridge_port_vlan_maxgroups_get "$locus")
1041 local n=$(bridge_port_vlan_ngroups_get "$locus")
1042
1043 eval "[[ $max $expect ]]"
1044 check_err $? "$locus: maxgroups attribute expected to be $expect, but was $max"
1045
1046 eval "[[ $n $expect ]]"
1047 check_err $? "$locus: ngroups attribute expected to be $expect, but was $n"
1048
1049 log_test "port_vlan: presence of ngroups and maxgroups attributes"
1050}
1051
1052test_8021q_vlan_attributes()
1053{
1054 test_vlan_attributes "dev $swp1 vid 10" "== null"
1055}
1056
1057test_8021qvs_vlan_attributes()
1058{
1059 test_vlan_attributes "dev $swp1 vid 10" "-ge 0"
1060}
1061
1062test_toggle_vlan_snooping()
1063{
1064 local mode=$1; shift
1065
1066 RET=0
1067
1068 local CFG=cfg4
1069 local context=port_vlan
1070 local locus="dev $swp1 vid 10"
1071
1072 ${CFG}_entries_add "$locus" $mode 5
1073 check_err $? "Couldn't add MDB entries"
1074
1075 bridge_${context}_maxgroups_set "$locus" 100
1076 check_err $? "Failed to set max to 100"
1077
1078 ip link set dev br0 type bridge mcast_vlan_snooping 0
1079 sleep 1
1080 ip link set dev br0 type bridge mcast_vlan_snooping 1
1081
1082 local n=$(bridge_${context}_ngroups_get "$locus")
1083 local nn=$(bridge mdb show dev br0 | grep $swp1 | wc -l)
1084 ((nn == n))
1085 check_err $? "mcast_n_groups expected to be $nn, but $n reported"
1086
1087 local max=$(bridge_${context}_maxgroups_get "$locus")
1088 ((max == 100))
1089 check_err $? "Max groups expected to be 100 but $max reported"
1090
1091 bridge_${context}_maxgroups_set "$locus" 0
1092 check_err $? "Failed to set max to 0"
1093
1094 log_test "$CFG: $context: $mode: mcast_vlan_snooping toggle"
1095}
1096
1097test_toggle_vlan_snooping_temp()
1098{
1099 test_toggle_vlan_snooping temp
1100}
1101
1102test_toggle_vlan_snooping_permanent()
1103{
1104 test_toggle_vlan_snooping permanent
1105}
1106
1107# ngroup test suites
1108
1109test_8021d_ngroups_cfg4()
1110{
1111 test_8021d_ngroups_reporting_cfg4
1112}
1113
1114test_8021d_ngroups_ctl4()
1115{
1116 test_8021d_ngroups_reporting_ctl4
1117}
1118
1119test_8021d_ngroups_cfg6()
1120{
1121 test_8021d_ngroups_reporting_cfg6
1122}
1123
1124test_8021d_ngroups_ctl6()
1125{
1126 test_8021d_ngroups_reporting_ctl6
1127}
1128
1129test_8021q_ngroups_cfg4()
1130{
1131 test_8021q_ngroups_reporting_cfg4
1132}
1133
1134test_8021q_ngroups_ctl4()
1135{
1136 test_8021q_ngroups_reporting_ctl4
1137}
1138
1139test_8021q_ngroups_cfg6()
1140{
1141 test_8021q_ngroups_reporting_cfg6
1142}
1143
1144test_8021q_ngroups_ctl6()
1145{
1146 test_8021q_ngroups_reporting_ctl6
1147}
1148
1149test_8021qvs_ngroups_cfg4()
1150{
1151 test_8021qvs_ngroups_reporting_cfg4
1152 test_8021qvs_ngroups_cross_vlan_cfg4
1153}
1154
1155test_8021qvs_ngroups_ctl4()
1156{
1157 test_8021qvs_ngroups_reporting_ctl4
1158 test_8021qvs_ngroups_cross_vlan_ctl4
1159}
1160
1161test_8021qvs_ngroups_cfg6()
1162{
1163 test_8021qvs_ngroups_reporting_cfg6
1164 test_8021qvs_ngroups_cross_vlan_cfg6
1165}
1166
1167test_8021qvs_ngroups_ctl6()
1168{
1169 test_8021qvs_ngroups_reporting_ctl6
1170 test_8021qvs_ngroups_cross_vlan_ctl6
1171}
1172
1173# maxgroups test suites
1174
1175test_8021d_maxgroups_cfg4()
1176{
1177 test_8021d_maxgroups_zero_cfg4
1178 test_8021d_maxgroups_too_low_cfg4
1179 test_8021d_maxgroups_too_many_entries_cfg4
1180}
1181
1182test_8021d_maxgroups_ctl4()
1183{
1184 test_8021d_maxgroups_zero_ctl4
1185 test_8021d_maxgroups_too_low_ctl4
1186 test_8021d_maxgroups_too_many_entries_ctl4
1187}
1188
1189test_8021d_maxgroups_cfg6()
1190{
1191 test_8021d_maxgroups_zero_cfg6
1192 test_8021d_maxgroups_too_low_cfg6
1193 test_8021d_maxgroups_too_many_entries_cfg6
1194}
1195
1196test_8021d_maxgroups_ctl6()
1197{
1198 test_8021d_maxgroups_zero_ctl6
1199 test_8021d_maxgroups_too_low_ctl6
1200 test_8021d_maxgroups_too_many_entries_ctl6
1201}
1202
1203test_8021q_maxgroups_cfg4()
1204{
1205 test_8021q_maxgroups_zero_cfg4
1206 test_8021q_maxgroups_too_low_cfg4
1207 test_8021q_maxgroups_too_many_entries_cfg4
1208}
1209
1210test_8021q_maxgroups_ctl4()
1211{
1212 test_8021q_maxgroups_zero_ctl4
1213 test_8021q_maxgroups_too_low_ctl4
1214 test_8021q_maxgroups_too_many_entries_ctl4
1215}
1216
1217test_8021q_maxgroups_cfg6()
1218{
1219 test_8021q_maxgroups_zero_cfg6
1220 test_8021q_maxgroups_too_low_cfg6
1221 test_8021q_maxgroups_too_many_entries_cfg6
1222}
1223
1224test_8021q_maxgroups_ctl6()
1225{
1226 test_8021q_maxgroups_zero_ctl6
1227 test_8021q_maxgroups_too_low_ctl6
1228 test_8021q_maxgroups_too_many_entries_ctl6
1229}
1230
1231test_8021qvs_maxgroups_cfg4()
1232{
1233 test_8021qvs_maxgroups_zero_cfg4
1234 test_8021qvs_maxgroups_zero_cross_vlan_cfg4
1235 test_8021qvs_maxgroups_too_low_cfg4
1236 test_8021qvs_maxgroups_too_many_entries_cfg4
1237 test_8021qvs_maxgroups_too_many_cross_vlan_cfg4
1238}
1239
1240test_8021qvs_maxgroups_ctl4()
1241{
1242 test_8021qvs_maxgroups_zero_ctl4
1243 test_8021qvs_maxgroups_zero_cross_vlan_ctl4
1244 test_8021qvs_maxgroups_too_low_ctl4
1245 test_8021qvs_maxgroups_too_many_entries_ctl4
1246 test_8021qvs_maxgroups_too_many_cross_vlan_ctl4
1247}
1248
1249test_8021qvs_maxgroups_cfg6()
1250{
1251 test_8021qvs_maxgroups_zero_cfg6
1252 test_8021qvs_maxgroups_zero_cross_vlan_cfg6
1253 test_8021qvs_maxgroups_too_low_cfg6
1254 test_8021qvs_maxgroups_too_many_entries_cfg6
1255 test_8021qvs_maxgroups_too_many_cross_vlan_cfg6
1256}
1257
1258test_8021qvs_maxgroups_ctl6()
1259{
1260 test_8021qvs_maxgroups_zero_ctl6
1261 test_8021qvs_maxgroups_zero_cross_vlan_ctl6
1262 test_8021qvs_maxgroups_too_low_ctl6
1263 test_8021qvs_maxgroups_too_many_entries_ctl6
1264 test_8021qvs_maxgroups_too_many_cross_vlan_ctl6
1265}
1266
1267# other test suites
1268
1269test_8021qvs_toggle_vlan_snooping()
1270{
1271 test_toggle_vlan_snooping_temp
1272 test_toggle_vlan_snooping_permanent
1273}
1274
1275# test groups
1276
1277test_8021d()
1278{
1279 # Tests for vlan_filtering 0 mcast_vlan_snooping 0.
1280
1281 switch_create_8021d
1282 setup_wait
1283
1284 test_8021d_ngroups_cfg4
1285 test_8021d_ngroups_ctl4
1286 test_8021d_ngroups_cfg6
1287 test_8021d_ngroups_ctl6
1288 test_8021d_maxgroups_cfg4
1289 test_8021d_maxgroups_ctl4
1290 test_8021d_maxgroups_cfg6
1291 test_8021d_maxgroups_ctl6
1292
1293 switch_destroy
1294}
1295
1296test_8021q()
1297{
1298 # Tests for vlan_filtering 1 mcast_vlan_snooping 0.
1299
1300 switch_create_8021q
1301 setup_wait
1302
1303 test_8021q_vlan_attributes
1304 test_8021q_ngroups_cfg4
1305 test_8021q_ngroups_ctl4
1306 test_8021q_ngroups_cfg6
1307 test_8021q_ngroups_ctl6
1308 test_8021q_maxgroups_cfg4
1309 test_8021q_maxgroups_ctl4
1310 test_8021q_maxgroups_cfg6
1311 test_8021q_maxgroups_ctl6
1312
1313 switch_destroy
1314}
1315
1316test_8021qvs()
1317{
1318 # Tests for vlan_filtering 1 mcast_vlan_snooping 1.
1319
1320 switch_create_8021qvs
1321 setup_wait
1322
1323 test_8021qvs_vlan_attributes
1324 test_8021qvs_ngroups_cfg4
1325 test_8021qvs_ngroups_ctl4
1326 test_8021qvs_ngroups_cfg6
1327 test_8021qvs_ngroups_ctl6
1328 test_8021qvs_maxgroups_cfg4
1329 test_8021qvs_maxgroups_ctl4
1330 test_8021qvs_maxgroups_cfg6
1331 test_8021qvs_maxgroups_ctl6
1332 test_8021qvs_toggle_vlan_snooping
1333
1334 switch_destroy
1335}
1336
6bdf3d97
IS
1337if ! bridge link help 2>&1 | grep -q "mcast_max_groups"; then
1338 echo "SKIP: iproute2 too old, missing bridge \"mcast_max_groups\" support"
1339 exit $ksft_skip
1340fi
1341
3446dcd7
PM
1342trap cleanup EXIT
1343
1344setup_prepare
1345tests_run
1346
1347exit $EXIT_STATUS