blob: f94ea4bafa133f310549c34b46ca2eae430196b3 [file] [log] [blame]
Ido Schimmel73bae672018-02-28 12:25:06 +02001#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4##############################################################################
5# Defines
6
7# Can be overridden by the configuration file.
8PING=${PING:=ping}
9PING6=${PING6:=ping6}
Ido Schimmeld4deb012018-02-28 12:25:07 +020010MZ=${MZ:=mausezahn}
Ido Schimmel73bae672018-02-28 12:25:06 +020011WAIT_TIME=${WAIT_TIME:=5}
12PAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no}
13PAUSE_ON_CLEANUP=${PAUSE_ON_CLEANUP:=no}
Ido Schimmel59be45c2018-03-11 09:57:25 +020014NETIF_TYPE=${NETIF_TYPE:=veth}
15NETIF_CREATE=${NETIF_CREATE:=yes}
Ido Schimmel73bae672018-02-28 12:25:06 +020016
17if [[ -f forwarding.config ]]; then
18 source forwarding.config
19fi
20
21##############################################################################
22# Sanity checks
23
David Ahern198979b2018-03-01 13:49:30 -080024check_tc_version()
25{
26 tc -j &> /dev/null
27 if [[ $? -ne 0 ]]; then
28 echo "SKIP: iproute2 too old; tc is missing JSON support"
29 exit 1
30 fi
31
32 tc filter help 2>&1 | grep block &> /dev/null
33 if [[ $? -ne 0 ]]; then
34 echo "SKIP: iproute2 too old; tc is missing shared block support"
35 exit 1
36 fi
37}
38
Ido Schimmel73bae672018-02-28 12:25:06 +020039if [[ "$(id -u)" -ne 0 ]]; then
40 echo "SKIP: need root privileges"
41 exit 0
42fi
43
David Ahern198979b2018-03-01 13:49:30 -080044if [[ "$CHECK_TC" = "yes" ]]; then
45 check_tc_version
Jiri Pirko4908e242018-02-28 12:25:19 +020046fi
47
Ido Schimmel73bae672018-02-28 12:25:06 +020048if [[ ! -x "$(command -v jq)" ]]; then
49 echo "SKIP: jq not installed"
David Ahern198979b2018-03-01 13:49:30 -080050 exit 1
Ido Schimmel73bae672018-02-28 12:25:06 +020051fi
52
Ido Schimmeld4deb012018-02-28 12:25:07 +020053if [[ ! -x "$(command -v $MZ)" ]]; then
54 echo "SKIP: $MZ not installed"
Ido Schimmelff0162a2018-03-11 09:57:23 +020055 exit 1
Ido Schimmeld4deb012018-02-28 12:25:07 +020056fi
57
Ido Schimmel73bae672018-02-28 12:25:06 +020058if [[ ! -v NUM_NETIFS ]]; then
59 echo "SKIP: importer does not define \"NUM_NETIFS\""
Ido Schimmel231b85a2018-03-11 09:57:24 +020060 exit 1
Ido Schimmel73bae672018-02-28 12:25:06 +020061fi
62
63##############################################################################
Jiri Pirko781fe632018-02-28 12:25:15 +020064# Command line options handling
65
66count=0
67
68while [[ $# -gt 0 ]]; do
69 if [[ "$count" -eq "0" ]]; then
70 unset NETIFS
71 declare -A NETIFS
72 fi
73 count=$((count + 1))
74 NETIFS[p$count]="$1"
75 shift
76done
77
78##############################################################################
Ido Schimmel73bae672018-02-28 12:25:06 +020079# Network interfaces configuration
80
David Ahern190f8872018-03-04 17:37:47 -080081create_netif_veth()
82{
83 local i
84
85 for i in $(eval echo {1..$NUM_NETIFS}); do
86 local j=$((i+1))
87
88 ip link show dev ${NETIFS[p$i]} &> /dev/null
89 if [[ $? -ne 0 ]]; then
90 ip link add ${NETIFS[p$i]} type veth \
91 peer name ${NETIFS[p$j]}
92 if [[ $? -ne 0 ]]; then
93 echo "Failed to create netif"
94 exit 1
95 fi
96 fi
97 i=$j
98 done
99}
100
101create_netif()
102{
103 case "$NETIF_TYPE" in
104 veth) create_netif_veth
105 ;;
106 *) echo "Can not create interfaces of type \'$NETIF_TYPE\'"
107 exit 1
108 ;;
109 esac
110}
111
112if [[ "$NETIF_CREATE" = "yes" ]]; then
113 create_netif
114fi
115
Ido Schimmel73bae672018-02-28 12:25:06 +0200116for i in $(eval echo {1..$NUM_NETIFS}); do
117 ip link show dev ${NETIFS[p$i]} &> /dev/null
118 if [[ $? -ne 0 ]]; then
119 echo "SKIP: could not find all required interfaces"
Ido Schimmel231b85a2018-03-11 09:57:24 +0200120 exit 1
Ido Schimmel73bae672018-02-28 12:25:06 +0200121 fi
122done
123
124##############################################################################
125# Helpers
126
127# Exit status to return at the end. Set in case one of the tests fails.
128EXIT_STATUS=0
129# Per-test return value. Clear at the beginning of each test.
130RET=0
131
132check_err()
133{
134 local err=$1
135 local msg=$2
136
137 if [[ $RET -eq 0 && $err -ne 0 ]]; then
138 RET=$err
139 retmsg=$msg
140 fi
141}
142
143check_fail()
144{
145 local err=$1
146 local msg=$2
147
148 if [[ $RET -eq 0 && $err -eq 0 ]]; then
149 RET=1
150 retmsg=$msg
151 fi
152}
153
154log_test()
155{
156 local test_name=$1
157 local opt_str=$2
158
159 if [[ $# -eq 2 ]]; then
160 opt_str="($opt_str)"
161 fi
162
163 if [[ $RET -ne 0 ]]; then
164 EXIT_STATUS=1
165 printf "TEST: %-60s [FAIL]\n" "$test_name $opt_str"
166 if [[ ! -z "$retmsg" ]]; then
167 printf "\t%s\n" "$retmsg"
168 fi
169 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
170 echo "Hit enter to continue, 'q' to quit"
171 read a
172 [ "$a" = "q" ] && exit 1
173 fi
174 return 1
175 fi
176
177 printf "TEST: %-60s [PASS]\n" "$test_name $opt_str"
178 return 0
179}
180
Ido Schimmel3d578d82018-02-28 12:25:11 +0200181log_info()
182{
183 local msg=$1
184
185 echo "INFO: $msg"
186}
187
Ido Schimmel73bae672018-02-28 12:25:06 +0200188setup_wait()
189{
190 for i in $(eval echo {1..$NUM_NETIFS}); do
191 while true; do
192 ip link show dev ${NETIFS[p$i]} up \
193 | grep 'state UP' &> /dev/null
194 if [[ $? -ne 0 ]]; then
195 sleep 1
196 else
197 break
198 fi
199 done
200 done
201
202 # Make sure links are ready.
203 sleep $WAIT_TIME
204}
205
206pre_cleanup()
207{
208 if [ "${PAUSE_ON_CLEANUP}" = "yes" ]; then
209 echo "Pausing before cleanup, hit any key to continue"
210 read
211 fi
212}
213
214vrf_prepare()
215{
216 ip -4 rule add pref 32765 table local
217 ip -4 rule del pref 0
218 ip -6 rule add pref 32765 table local
219 ip -6 rule del pref 0
220}
221
222vrf_cleanup()
223{
224 ip -6 rule add pref 0 table local
225 ip -6 rule del pref 32765
226 ip -4 rule add pref 0 table local
227 ip -4 rule del pref 32765
228}
229
230__last_tb_id=0
231declare -A __TB_IDS
232
233__vrf_td_id_assign()
234{
235 local vrf_name=$1
236
237 __last_tb_id=$((__last_tb_id + 1))
238 __TB_IDS[$vrf_name]=$__last_tb_id
239 return $__last_tb_id
240}
241
242__vrf_td_id_lookup()
243{
244 local vrf_name=$1
245
246 return ${__TB_IDS[$vrf_name]}
247}
248
249vrf_create()
250{
251 local vrf_name=$1
252 local tb_id
253
254 __vrf_td_id_assign $vrf_name
255 tb_id=$?
256
257 ip link add dev $vrf_name type vrf table $tb_id
258 ip -4 route add table $tb_id unreachable default metric 4278198272
259 ip -6 route add table $tb_id unreachable default metric 4278198272
260}
261
262vrf_destroy()
263{
264 local vrf_name=$1
265 local tb_id
266
267 __vrf_td_id_lookup $vrf_name
268 tb_id=$?
269
270 ip -6 route del table $tb_id unreachable default metric 4278198272
271 ip -4 route del table $tb_id unreachable default metric 4278198272
272 ip link del dev $vrf_name
273}
274
275__addr_add_del()
276{
277 local if_name=$1
278 local add_del=$2
279 local array
280
281 shift
282 shift
283 array=("${@}")
284
285 for addrstr in "${array[@]}"; do
286 ip address $add_del $addrstr dev $if_name
287 done
288}
289
290simple_if_init()
291{
292 local if_name=$1
293 local vrf_name
294 local array
295
296 shift
297 vrf_name=v$if_name
298 array=("${@}")
299
300 vrf_create $vrf_name
301 ip link set dev $if_name master $vrf_name
302 ip link set dev $vrf_name up
303 ip link set dev $if_name up
304
305 __addr_add_del $if_name add "${array[@]}"
306}
307
308simple_if_fini()
309{
310 local if_name=$1
311 local vrf_name
312 local array
313
314 shift
315 vrf_name=v$if_name
316 array=("${@}")
317
318 __addr_add_del $if_name del "${array[@]}"
319
320 ip link set dev $if_name down
321 vrf_destroy $vrf_name
322}
323
Petr Machata7d4cbae2018-04-27 01:17:56 +0200324tunnel_create()
325{
326 local name=$1; shift
327 local type=$1; shift
328 local local=$1; shift
329 local remote=$1; shift
330
331 ip link add name $name type $type \
332 local $local remote $remote "$@"
333 ip link set dev $name up
334}
335
336tunnel_destroy()
337{
338 local name=$1; shift
339
340 ip link del dev $name
341}
342
Petr Machata0e7a5042018-05-24 16:27:26 +0200343vlan_create()
344{
345 local if_name=$1; shift
346 local vid=$1; shift
347 local vrf=$1; shift
348 local ips=("${@}")
349 local name=$if_name.$vid
350
351 ip link add name $name link $if_name type vlan id $vid
352 if [ "$vrf" != "" ]; then
353 ip link set dev $name master $vrf
354 fi
355 ip link set dev $name up
356 __addr_add_del $name add "${ips[@]}"
357}
358
359vlan_destroy()
360{
361 local if_name=$1; shift
362 local vid=$1; shift
363 local name=$if_name.$vid
364
365 ip link del dev $name
366}
367
Ido Schimmel73bae672018-02-28 12:25:06 +0200368master_name_get()
369{
370 local if_name=$1
371
372 ip -j link show dev $if_name | jq -r '.[]["master"]'
373}
374
Ido Schimmel3d578d82018-02-28 12:25:11 +0200375link_stats_tx_packets_get()
376{
377 local if_name=$1
378
379 ip -j -s link show dev $if_name | jq '.[]["stats64"]["tx"]["packets"]'
380}
381
Petr Machata7d4cbae2018-04-27 01:17:56 +0200382tc_rule_stats_get()
383{
384 local dev=$1; shift
385 local pref=$1; shift
Petr Machataa66d62d2018-06-26 02:07:45 +0200386 local dir=$1; shift
Petr Machata7d4cbae2018-04-27 01:17:56 +0200387
Petr Machataa66d62d2018-06-26 02:07:45 +0200388 tc -j -s filter show dev $dev ${dir:-ingress} pref $pref \
389 | jq '.[1].options.actions[].stats.packets'
Petr Machata7d4cbae2018-04-27 01:17:56 +0200390}
391
Jiri Pirko4e4272d2018-02-28 12:25:14 +0200392mac_get()
393{
394 local if_name=$1
395
396 ip -j link show dev $if_name | jq -r '.[]["address"]'
397}
398
Ido Schimmeld4deb012018-02-28 12:25:07 +0200399bridge_ageing_time_get()
400{
401 local bridge=$1
402 local ageing_time
403
404 # Need to divide by 100 to convert to seconds.
405 ageing_time=$(ip -j -d link show dev $bridge \
406 | jq '.[]["linkinfo"]["info_data"]["ageing_time"]')
407 echo $((ageing_time / 100))
408}
409
Petr Machataf5ae5772018-05-03 12:36:59 +0200410declare -A SYSCTL_ORIG
411sysctl_set()
412{
413 local key=$1; shift
414 local value=$1; shift
415
416 SYSCTL_ORIG[$key]=$(sysctl -n $key)
417 sysctl -qw $key=$value
418}
419
420sysctl_restore()
421{
422 local key=$1; shift
423
424 sysctl -qw $key=${SYSCTL_ORIG["$key"]}
425}
426
Ido Schimmel7b7bc872018-02-28 12:25:09 +0200427forwarding_enable()
428{
Petr Machatad51d10a2018-05-03 12:37:13 +0200429 sysctl_set net.ipv4.conf.all.forwarding 1
430 sysctl_set net.ipv6.conf.all.forwarding 1
Ido Schimmel7b7bc872018-02-28 12:25:09 +0200431}
432
433forwarding_restore()
434{
Petr Machatad51d10a2018-05-03 12:37:13 +0200435 sysctl_restore net.ipv6.conf.all.forwarding
436 sysctl_restore net.ipv4.conf.all.forwarding
Ido Schimmel7b7bc872018-02-28 12:25:09 +0200437}
438
Jiri Pirko2f19f212018-02-28 12:25:13 +0200439tc_offload_check()
440{
441 for i in $(eval echo {1..$NUM_NETIFS}); do
442 ethtool -k ${NETIFS[p$i]} \
443 | grep "hw-tc-offload: on" &> /dev/null
444 if [[ $? -ne 0 ]]; then
445 return 1
446 fi
447 done
448
449 return 0
450}
451
Petr Machata87c0c042018-05-24 16:27:35 +0200452trap_install()
Petr Machata7d4cbae2018-04-27 01:17:56 +0200453{
454 local dev=$1; shift
455 local direction=$1; shift
456
Petr Machata87c0c042018-05-24 16:27:35 +0200457 # For slow-path testing, we need to install a trap to get to
458 # slow path the packets that would otherwise be switched in HW.
459 tc filter add dev $dev $direction pref 1 flower skip_sw action trap
460}
461
462trap_uninstall()
463{
464 local dev=$1; shift
465 local direction=$1; shift
466
467 tc filter del dev $dev $direction pref 1 flower skip_sw
468}
469
470slow_path_trap_install()
471{
Petr Machata7d4cbae2018-04-27 01:17:56 +0200472 if [ "${tcflags/skip_hw}" != "$tcflags" ]; then
Petr Machata87c0c042018-05-24 16:27:35 +0200473 trap_install "$@"
Petr Machata7d4cbae2018-04-27 01:17:56 +0200474 fi
475}
476
477slow_path_trap_uninstall()
478{
Petr Machata7d4cbae2018-04-27 01:17:56 +0200479 if [ "${tcflags/skip_hw}" != "$tcflags" ]; then
Petr Machata87c0c042018-05-24 16:27:35 +0200480 trap_uninstall "$@"
Petr Machata7d4cbae2018-04-27 01:17:56 +0200481 fi
482}
483
484__icmp_capture_add_del()
485{
486 local add_del=$1; shift
487 local pref=$1; shift
488 local vsuf=$1; shift
489 local tundev=$1; shift
490 local filter=$1; shift
491
492 tc filter $add_del dev "$tundev" ingress \
493 proto ip$vsuf pref $pref \
494 flower ip_proto icmp$vsuf $filter \
495 action pass
496}
497
498icmp_capture_install()
499{
500 __icmp_capture_add_del add 100 "" "$@"
501}
502
503icmp_capture_uninstall()
504{
505 __icmp_capture_add_del del 100 "" "$@"
506}
507
508icmp6_capture_install()
509{
510 __icmp_capture_add_del add 100 v6 "$@"
511}
512
513icmp6_capture_uninstall()
514{
515 __icmp_capture_add_del del 100 v6 "$@"
516}
517
Petr Machata2004a9b2018-05-31 19:52:02 +0200518__vlan_capture_add_del()
519{
520 local add_del=$1; shift
521 local pref=$1; shift
522 local dev=$1; shift
523 local filter=$1; shift
524
525 tc filter $add_del dev "$dev" ingress \
526 proto 802.1q pref $pref \
527 flower $filter \
528 action pass
529}
530
531vlan_capture_install()
532{
533 __vlan_capture_add_del add 100 "$@"
534}
535
536vlan_capture_uninstall()
537{
538 __vlan_capture_add_del del 100 "$@"
539}
540
Petr Machata7d4cbae2018-04-27 01:17:56 +0200541matchall_sink_create()
542{
543 local dev=$1; shift
544
545 tc qdisc add dev $dev clsact
546 tc filter add dev $dev ingress \
547 pref 10000 \
548 matchall \
549 action drop
550}
551
Ido Schimmel0eb80532018-05-03 10:51:33 +0300552tests_run()
553{
554 local current_test
555
556 for current_test in ${TESTS:-$ALL_TESTS}; do
557 $current_test
558 done
559}
560
Petr Machatab2c47872018-06-26 02:06:06 +0200561multipath_eval()
562{
Petr Machata1b86fa32018-06-26 02:07:08 +0200563 local desc="$1"
564 local weight_rp12=$2
565 local weight_rp13=$3
566 local packets_rp12=$4
567 local packets_rp13=$5
568 local weights_ratio packets_ratio diff
Petr Machatab2c47872018-06-26 02:06:06 +0200569
Petr Machata1b86fa32018-06-26 02:07:08 +0200570 RET=0
Petr Machatab2c47872018-06-26 02:06:06 +0200571
Petr Machata1b86fa32018-06-26 02:07:08 +0200572 if [[ "$weight_rp12" -gt "$weight_rp13" ]]; then
573 weights_ratio=$(echo "scale=2; $weight_rp12 / $weight_rp13" \
574 | bc -l)
575 else
576 weights_ratio=$(echo "scale=2; $weight_rp13 / $weight_rp12" \
577 | bc -l)
578 fi
Petr Machatab2c47872018-06-26 02:06:06 +0200579
Petr Machata1b86fa32018-06-26 02:07:08 +0200580 if [[ "$packets_rp12" -eq "0" || "$packets_rp13" -eq "0" ]]; then
581 check_err 1 "Packet difference is 0"
582 log_test "Multipath"
583 log_info "Expected ratio $weights_ratio"
584 return
585 fi
Petr Machatab2c47872018-06-26 02:06:06 +0200586
Petr Machata1b86fa32018-06-26 02:07:08 +0200587 if [[ "$weight_rp12" -gt "$weight_rp13" ]]; then
588 packets_ratio=$(echo "scale=2; $packets_rp12 / $packets_rp13" \
589 | bc -l)
590 else
591 packets_ratio=$(echo "scale=2; $packets_rp13 / $packets_rp12" \
592 | bc -l)
593 fi
Petr Machatab2c47872018-06-26 02:06:06 +0200594
Petr Machata1b86fa32018-06-26 02:07:08 +0200595 diff=$(echo $weights_ratio - $packets_ratio | bc -l)
596 diff=${diff#-}
597
598 test "$(echo "$diff / $weights_ratio > 0.15" | bc -l)" -eq 0
599 check_err $? "Too large discrepancy between expected and measured ratios"
600 log_test "$desc"
601 log_info "Expected ratio $weights_ratio Measured ratio $packets_ratio"
Petr Machatab2c47872018-06-26 02:06:06 +0200602}
603
Ido Schimmel73bae672018-02-28 12:25:06 +0200604##############################################################################
605# Tests
606
607ping_test()
608{
609 local if_name=$1
610 local dip=$2
611 local vrf_name
612
613 RET=0
614
615 vrf_name=$(master_name_get $if_name)
616 ip vrf exec $vrf_name $PING $dip -c 10 -i 0.1 -w 2 &> /dev/null
617 check_err $?
618 log_test "ping"
619}
620
621ping6_test()
622{
623 local if_name=$1
624 local dip=$2
625 local vrf_name
626
627 RET=0
628
629 vrf_name=$(master_name_get $if_name)
630 ip vrf exec $vrf_name $PING6 $dip -c 10 -i 0.1 -w 2 &> /dev/null
631 check_err $?
632 log_test "ping6"
633}
Ido Schimmeld4deb012018-02-28 12:25:07 +0200634
635learning_test()
636{
637 local bridge=$1
638 local br_port1=$2 # Connected to `host1_if`.
639 local host1_if=$3
640 local host2_if=$4
641 local mac=de:ad:be:ef:13:37
642 local ageing_time
643
644 RET=0
645
646 bridge -j fdb show br $bridge brport $br_port1 \
647 | jq -e ".[] | select(.mac == \"$mac\")" &> /dev/null
648 check_fail $? "Found FDB record when should not"
649
650 # Disable unknown unicast flooding on `br_port1` to make sure
651 # packets are only forwarded through the port after a matching
652 # FDB entry was installed.
653 bridge link set dev $br_port1 flood off
654
655 tc qdisc add dev $host1_if ingress
656 tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \
657 flower dst_mac $mac action drop
658
659 $MZ $host2_if -c 1 -p 64 -b $mac -t ip -q
660 sleep 1
661
662 tc -j -s filter show dev $host1_if ingress \
663 | jq -e ".[] | select(.options.handle == 101) \
664 | select(.options.actions[0].stats.packets == 1)" &> /dev/null
665 check_fail $? "Packet reached second host when should not"
666
667 $MZ $host1_if -c 1 -p 64 -a $mac -t ip -q
668 sleep 1
669
670 bridge -j fdb show br $bridge brport $br_port1 \
671 | jq -e ".[] | select(.mac == \"$mac\")" &> /dev/null
672 check_err $? "Did not find FDB record when should"
673
674 $MZ $host2_if -c 1 -p 64 -b $mac -t ip -q
675 sleep 1
676
677 tc -j -s filter show dev $host1_if ingress \
678 | jq -e ".[] | select(.options.handle == 101) \
679 | select(.options.actions[0].stats.packets == 1)" &> /dev/null
680 check_err $? "Packet did not reach second host when should"
681
682 # Wait for 10 seconds after the ageing time to make sure FDB
683 # record was aged-out.
684 ageing_time=$(bridge_ageing_time_get $bridge)
685 sleep $((ageing_time + 10))
686
687 bridge -j fdb show br $bridge brport $br_port1 \
688 | jq -e ".[] | select(.mac == \"$mac\")" &> /dev/null
689 check_fail $? "Found FDB record when should not"
690
691 bridge link set dev $br_port1 learning off
692
693 $MZ $host1_if -c 1 -p 64 -a $mac -t ip -q
694 sleep 1
695
696 bridge -j fdb show br $bridge brport $br_port1 \
697 | jq -e ".[] | select(.mac == \"$mac\")" &> /dev/null
698 check_fail $? "Found FDB record when should not"
699
700 bridge link set dev $br_port1 learning on
701
702 tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower
703 tc qdisc del dev $host1_if ingress
704
705 bridge link set dev $br_port1 flood on
706
707 log_test "FDB learning"
708}
Ido Schimmel236dd502018-02-28 12:25:08 +0200709
710flood_test_do()
711{
712 local should_flood=$1
713 local mac=$2
714 local ip=$3
715 local host1_if=$4
716 local host2_if=$5
717 local err=0
718
719 # Add an ACL on `host2_if` which will tell us whether the packet
720 # was flooded to it or not.
721 tc qdisc add dev $host2_if ingress
722 tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \
723 flower dst_mac $mac action drop
724
725 $MZ $host1_if -c 1 -p 64 -b $mac -B $ip -t ip -q
726 sleep 1
727
728 tc -j -s filter show dev $host2_if ingress \
729 | jq -e ".[] | select(.options.handle == 101) \
730 | select(.options.actions[0].stats.packets == 1)" &> /dev/null
731 if [[ $? -ne 0 && $should_flood == "true" || \
732 $? -eq 0 && $should_flood == "false" ]]; then
733 err=1
734 fi
735
736 tc filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower
737 tc qdisc del dev $host2_if ingress
738
739 return $err
740}
741
742flood_unicast_test()
743{
744 local br_port=$1
745 local host1_if=$2
746 local host2_if=$3
747 local mac=de:ad:be:ef:13:37
748 local ip=192.0.2.100
749
750 RET=0
751
752 bridge link set dev $br_port flood off
753
754 flood_test_do false $mac $ip $host1_if $host2_if
755 check_err $? "Packet flooded when should not"
756
757 bridge link set dev $br_port flood on
758
759 flood_test_do true $mac $ip $host1_if $host2_if
760 check_err $? "Packet was not flooded when should"
761
762 log_test "Unknown unicast flood"
763}
764
765flood_multicast_test()
766{
767 local br_port=$1
768 local host1_if=$2
769 local host2_if=$3
770 local mac=01:00:5e:00:00:01
771 local ip=239.0.0.1
772
773 RET=0
774
775 bridge link set dev $br_port mcast_flood off
776
777 flood_test_do false $mac $ip $host1_if $host2_if
778 check_err $? "Packet flooded when should not"
779
780 bridge link set dev $br_port mcast_flood on
781
782 flood_test_do true $mac $ip $host1_if $host2_if
783 check_err $? "Packet was not flooded when should"
784
785 log_test "Unregistered multicast flood"
786}
787
788flood_test()
789{
790 # `br_port` is connected to `host2_if`
791 local br_port=$1
792 local host1_if=$2
793 local host2_if=$3
794
795 flood_unicast_test $br_port $host1_if $host2_if
796 flood_multicast_test $br_port $host1_if $host2_if
797}