]> Git Repo - linux.git/blob - tools/testing/selftests/net/fdb_flush.sh
Linux 6.14-rc3
[linux.git] / tools / testing / selftests / net / fdb_flush.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # This test is for checking functionality of flushing FDB entries.
5 # Check that flush works as expected with all the supported arguments and verify
6 # some combinations of arguments.
7
8 source lib.sh
9
10 FLUSH_BY_STATE_TESTS="
11         vxlan_test_flush_by_permanent
12         vxlan_test_flush_by_nopermanent
13         vxlan_test_flush_by_static
14         vxlan_test_flush_by_nostatic
15         vxlan_test_flush_by_dynamic
16         vxlan_test_flush_by_nodynamic
17 "
18
19 FLUSH_BY_FLAG_TESTS="
20         vxlan_test_flush_by_extern_learn
21         vxlan_test_flush_by_noextern_learn
22         vxlan_test_flush_by_router
23         vxlan_test_flush_by_norouter
24 "
25
26 TESTS="
27         vxlan_test_flush_by_dev
28         vxlan_test_flush_by_vni
29         vxlan_test_flush_by_src_vni
30         vxlan_test_flush_by_port
31         vxlan_test_flush_by_dst_ip
32         vxlan_test_flush_by_nhid
33         $FLUSH_BY_STATE_TESTS
34         $FLUSH_BY_FLAG_TESTS
35         vxlan_test_flush_by_several_args
36         vxlan_test_flush_by_remote_attributes
37         bridge_test_flush_by_dev
38         bridge_test_flush_by_vlan
39         bridge_vxlan_test_flush
40 "
41
42 : ${VERBOSE:=0}
43 : ${PAUSE_ON_FAIL:=no}
44 : ${PAUSE:=no}
45 : ${VXPORT:=4789}
46
47 run_cmd()
48 {
49         local cmd="$1"
50         local out
51         local rc
52         local stderr="2>/dev/null"
53
54         if [ "$VERBOSE" = "1" ]; then
55                 printf "COMMAND: $cmd\n"
56                 stderr=
57         fi
58
59         out=$(eval $cmd $stderr)
60         rc=$?
61         if [ "$VERBOSE" = "1" -a -n "$out" ]; then
62                 echo "    $out"
63         fi
64
65         return $rc
66 }
67
68 log_test()
69 {
70         local rc=$1
71         local expected=$2
72         local msg="$3"
73         local nsuccess
74         local nfail
75         local ret
76
77         if [ ${rc} -eq ${expected} ]; then
78                 printf "TEST: %-60s  [ OK ]\n" "${msg}"
79                 nsuccess=$((nsuccess+1))
80         else
81                 ret=1
82                 nfail=$((nfail+1))
83                 printf "TEST: %-60s  [FAIL]\n" "${msg}"
84                 if [ "$VERBOSE" = "1" ]; then
85                         echo "    rc=$rc, expected $expected"
86                 fi
87
88                 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
89                 echo
90                         echo "hit enter to continue, 'q' to quit"
91                         read a
92                         [ "$a" = "q" ] && exit 1
93                 fi
94         fi
95
96         if [ "${PAUSE}" = "yes" ]; then
97                 echo
98                 echo "hit enter to continue, 'q' to quit"
99                 read a
100                 [ "$a" = "q" ] && exit 1
101         fi
102
103         [ "$VERBOSE" = "1" ] && echo
104 }
105
106 MAC_POOL_1="
107         de:ad:be:ef:13:10
108         de:ad:be:ef:13:11
109         de:ad:be:ef:13:12
110         de:ad:be:ef:13:13
111         de:ad:be:ef:13:14
112 "
113 mac_pool_1_len=$(echo "$MAC_POOL_1" | grep -c .)
114
115 MAC_POOL_2="
116         ca:fe:be:ef:13:10
117         ca:fe:be:ef:13:11
118         ca:fe:be:ef:13:12
119         ca:fe:be:ef:13:13
120         ca:fe:be:ef:13:14
121 "
122 mac_pool_2_len=$(echo "$MAC_POOL_2" | grep -c .)
123
124 fdb_add_mac_pool_1()
125 {
126         local dev=$1; shift
127         local args="$@"
128
129         for mac in $MAC_POOL_1
130         do
131                 $BRIDGE fdb add $mac dev $dev $args
132         done
133 }
134
135 fdb_add_mac_pool_2()
136 {
137         local dev=$1; shift
138         local args="$@"
139
140         for mac in $MAC_POOL_2
141         do
142                 $BRIDGE fdb add $mac dev $dev $args
143         done
144 }
145
146 fdb_check_n_entries_by_dev_filter()
147 {
148         local dev=$1; shift
149         local exp_entries=$1; shift
150         local filter="$@"
151
152         local entries=$($BRIDGE fdb show dev $dev | grep "$filter" | wc -l)
153
154         [[ $entries -eq $exp_entries ]]
155         rc=$?
156
157         log_test $rc 0 "$dev: Expected $exp_entries FDB entries, got $entries"
158         return $rc
159 }
160
161 vxlan_test_flush_by_dev()
162 {
163         local vni=3000
164         local dst_ip=192.0.2.1
165
166         fdb_add_mac_pool_1 vx10 vni $vni dst $dst_ip
167         fdb_add_mac_pool_2 vx20 vni $vni dst $dst_ip
168
169         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len
170         fdb_check_n_entries_by_dev_filter vx20 $mac_pool_2_len
171
172         run_cmd "$BRIDGE fdb flush dev vx10"
173         log_test $? 0 "Flush FDB by dev vx10"
174
175         fdb_check_n_entries_by_dev_filter vx10 0
176         log_test $? 0 "Flush FDB by dev vx10 - test vx10 entries"
177
178         fdb_check_n_entries_by_dev_filter vx20 $mac_pool_2_len
179         log_test $? 0 "Flush FDB by dev vx10 - test vx20 entries"
180 }
181
182 vxlan_test_flush_by_vni()
183 {
184         local vni_1=3000
185         local vni_2=4000
186         local dst_ip=192.0.2.1
187
188         fdb_add_mac_pool_1 vx10 vni $vni_1 dst $dst_ip
189         fdb_add_mac_pool_2 vx10 vni $vni_2 dst $dst_ip
190
191         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vni $vni_1
192         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len vni $vni_2
193
194         run_cmd "$BRIDGE fdb flush dev vx10 vni $vni_2"
195         log_test $? 0 "Flush FDB by dev vx10 and vni $vni_2"
196
197         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vni $vni_1
198         log_test $? 0 "Test entries with vni $vni_1"
199
200         fdb_check_n_entries_by_dev_filter vx10 0 vni $vni_2
201         log_test $? 0 "Test entries with vni $vni_2"
202 }
203
204 vxlan_test_flush_by_src_vni()
205 {
206         # Set some entries with {vni=x,src_vni=y} and some with the opposite -
207         # {vni=y,src_vni=x}, to verify that when we flush by src_vni=x, entries
208         # with vni=x are not flused.
209         local vni_1=3000
210         local vni_2=4000
211         local src_vni_1=4000
212         local src_vni_2=3000
213         local dst_ip=192.0.2.1
214
215         # Reconfigure vx10 with 'external' to get 'src_vni' details in
216         # 'bridge fdb' output
217         $IP link del dev vx10
218         $IP link add name vx10 type vxlan dstport "$VXPORT" external
219
220         fdb_add_mac_pool_1 vx10 vni $vni_1 src_vni $src_vni_1 dst $dst_ip
221         fdb_add_mac_pool_2 vx10 vni $vni_2 src_vni $src_vni_2 dst $dst_ip
222
223         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len \
224                 src_vni $src_vni_1
225         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len \
226                 src_vni $src_vni_2
227
228         run_cmd "$BRIDGE fdb flush dev vx10 src_vni $src_vni_2"
229         log_test $? 0 "Flush FDB by dev vx10 and src_vni $src_vni_2"
230
231         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len \
232                 src_vni $src_vni_1
233         log_test $? 0 "Test entries with src_vni $src_vni_1"
234
235         fdb_check_n_entries_by_dev_filter vx10 0 src_vni $src_vni_2
236         log_test $? 0 "Test entries with src_vni $src_vni_2"
237 }
238
239 vxlan_test_flush_by_port()
240 {
241         local port_1=1234
242         local port_2=4321
243         local dst_ip=192.0.2.1
244
245         fdb_add_mac_pool_1 vx10 port $port_1 dst $dst_ip
246         fdb_add_mac_pool_2 vx10 port $port_2 dst $dst_ip
247
248         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len port $port_1
249         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len port $port_2
250
251         run_cmd "$BRIDGE fdb flush dev vx10 port $port_2"
252         log_test $? 0 "Flush FDB by dev vx10 and port $port_2"
253
254         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len port $port_1
255         log_test $? 0 "Test entries with port $port_1"
256
257         fdb_check_n_entries_by_dev_filter vx10 0 port $port_2
258         log_test $? 0 "Test entries with port $port_2"
259 }
260
261 vxlan_test_flush_by_dst_ip()
262 {
263         local dst_ip_1=192.0.2.1
264         local dst_ip_2=192.0.2.2
265
266         fdb_add_mac_pool_1 vx10 dst $dst_ip_1
267         fdb_add_mac_pool_2 vx10 dst $dst_ip_2
268
269         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1
270         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len dst $dst_ip_2
271
272         run_cmd "$BRIDGE fdb flush dev vx10 dst $dst_ip_2"
273         log_test $? 0 "Flush FDB by dev vx10 and dst $dst_ip_2"
274
275         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1
276         log_test $? 0 "Test entries with dst $dst_ip_1"
277
278         fdb_check_n_entries_by_dev_filter vx10 0 dst $dst_ip_2
279         log_test $? 0 "Test entries with dst $dst_ip_2"
280 }
281
282 nexthops_add()
283 {
284         local nhid_1=$1; shift
285         local nhid_2=$1; shift
286
287         $IP nexthop add id 10 via 192.0.2.1 fdb
288         $IP nexthop add id $nhid_1 group 10 fdb
289
290         $IP nexthop add id 20 via 192.0.2.2 fdb
291         $IP nexthop add id $nhid_2 group 20 fdb
292 }
293
294 vxlan_test_flush_by_nhid()
295 {
296         local nhid_1=100
297         local nhid_2=200
298
299         nexthops_add $nhid_1 $nhid_2
300
301         fdb_add_mac_pool_1 vx10 nhid $nhid_1
302         fdb_add_mac_pool_2 vx10 nhid $nhid_2
303
304         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len nhid $nhid_1
305         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len nhid $nhid_2
306
307         run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid_2"
308         log_test $? 0 "Flush FDB by dev vx10 and nhid $nhid_2"
309
310         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len nhid $nhid_1
311         log_test $? 0 "Test entries with nhid $nhid_1"
312
313         fdb_check_n_entries_by_dev_filter vx10 0 nhid $nhid_2
314         log_test $? 0 "Test entries with nhid $nhid_2"
315
316         # Flush also entries with $nhid_1, and then verify that flushing by
317         # 'nhid' does not return an error when there are no entries with
318         # nexthops.
319         run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid_1"
320         log_test $? 0 "Flush FDB by dev vx10 and nhid $nhid_1"
321
322         fdb_check_n_entries_by_dev_filter vx10 0 nhid
323         log_test $? 0 "Test entries with 'nhid' keyword"
324
325         run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid_1"
326         log_test $? 0 "Flush FDB by nhid when there are no entries with nexthop"
327 }
328
329 vxlan_test_flush_by_state()
330 {
331         local flush_by_state=$1; shift
332         local state_1=$1; shift
333         local exp_state_1=$1; shift
334         local state_2=$1; shift
335         local exp_state_2=$1; shift
336
337         local dst_ip_1=192.0.2.1
338         local dst_ip_2=192.0.2.2
339
340         fdb_add_mac_pool_1 vx10 dst $dst_ip_1 $state_1
341         fdb_add_mac_pool_2 vx10 dst $dst_ip_2 $state_2
342
343         # Check the entries by dst_ip as not all states appear in 'bridge fdb'
344         # output.
345         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1
346         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len dst $dst_ip_2
347
348         run_cmd "$BRIDGE fdb flush dev vx10 $flush_by_state"
349         log_test $? 0 "Flush FDB by dev vx10 and state $flush_by_state"
350
351         fdb_check_n_entries_by_dev_filter vx10 $exp_state_1 dst $dst_ip_1
352         log_test $? 0 "Test entries with state $state_1"
353
354         fdb_check_n_entries_by_dev_filter vx10 $exp_state_2 dst $dst_ip_2
355         log_test $? 0 "Test entries with state $state_2"
356 }
357
358 vxlan_test_flush_by_permanent()
359 {
360         # Entries that are added without state get 'permanent' state by
361         # default, add some entries with flag 'extern_learn' instead of state,
362         # so they will be added with 'permanent' and should be flushed also.
363         local flush_by_state="permanent"
364         local state_1="permanent"
365         local exp_state_1=0
366         local state_2="extern_learn"
367         local exp_state_2=0
368
369         vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \
370                 $state_2 $exp_state_2
371 }
372
373 vxlan_test_flush_by_nopermanent()
374 {
375         local flush_by_state="nopermanent"
376         local state_1="permanent"
377         local exp_state_1=$mac_pool_1_len
378         local state_2="static"
379         local exp_state_2=0
380
381         vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \
382                 $state_2 $exp_state_2
383 }
384
385 vxlan_test_flush_by_static()
386 {
387         local flush_by_state="static"
388         local state_1="static"
389         local exp_state_1=0
390         local state_2="dynamic"
391         local exp_state_2=$mac_pool_2_len
392
393         vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \
394                 $state_2 $exp_state_2
395 }
396
397 vxlan_test_flush_by_nostatic()
398 {
399         local flush_by_state="nostatic"
400         local state_1="permanent"
401         local exp_state_1=$mac_pool_1_len
402         local state_2="dynamic"
403         local exp_state_2=0
404
405         vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \
406                 $state_2 $exp_state_2
407 }
408
409 vxlan_test_flush_by_dynamic()
410 {
411         local flush_by_state="dynamic"
412         local state_1="dynamic"
413         local exp_state_1=0
414         local state_2="static"
415         local exp_state_2=$mac_pool_2_len
416
417         vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \
418                 $state_2 $exp_state_2
419 }
420
421 vxlan_test_flush_by_nodynamic()
422 {
423         local flush_by_state="nodynamic"
424         local state_1="permanent"
425         local exp_state_1=0
426         local state_2="dynamic"
427         local exp_state_2=$mac_pool_2_len
428
429         vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \
430                 $state_2 $exp_state_2
431 }
432
433 vxlan_test_flush_by_flag()
434 {
435         local flush_by_flag=$1; shift
436         local flag_1=$1; shift
437         local exp_flag_1=$1; shift
438         local flag_2=$1; shift
439         local exp_flag_2=$1; shift
440
441         local dst_ip_1=192.0.2.1
442         local dst_ip_2=192.0.2.2
443
444         fdb_add_mac_pool_1 vx10 dst $dst_ip_1 $flag_1
445         fdb_add_mac_pool_2 vx10 dst $dst_ip_2 $flag_2
446
447         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len $flag_1
448         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len $flag_2
449
450         run_cmd "$BRIDGE fdb flush dev vx10 $flush_by_flag"
451         log_test $? 0 "Flush FDB by dev vx10 and flag $flush_by_flag"
452
453         fdb_check_n_entries_by_dev_filter vx10 $exp_flag_1 dst $dst_ip_1
454         log_test $? 0 "Test entries with flag $flag_1"
455
456         fdb_check_n_entries_by_dev_filter vx10 $exp_flag_2 dst $dst_ip_2
457         log_test $? 0 "Test entries with flag $flag_2"
458 }
459
460 vxlan_test_flush_by_extern_learn()
461 {
462         local flush_by_flag="extern_learn"
463         local flag_1="extern_learn"
464         local exp_flag_1=0
465         local flag_2="router"
466         local exp_flag_2=$mac_pool_2_len
467
468         vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \
469                 $flag_2 $exp_flag_2
470 }
471
472 vxlan_test_flush_by_noextern_learn()
473 {
474         local flush_by_flag="noextern_learn"
475         local flag_1="extern_learn"
476         local exp_flag_1=$mac_pool_1_len
477         local flag_2="router"
478         local exp_flag_2=0
479
480         vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \
481                 $flag_2 $exp_flag_2
482 }
483
484 vxlan_test_flush_by_router()
485 {
486         local flush_by_flag="router"
487         local flag_1="router"
488         local exp_flag_1=0
489         local flag_2="extern_learn"
490         local exp_flag_2=$mac_pool_2_len
491
492         vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \
493                 $flag_2 $exp_flag_2
494 }
495
496 vxlan_test_flush_by_norouter()
497 {
498
499         local flush_by_flag="norouter"
500         local flag_1="router"
501         local exp_flag_1=$mac_pool_1_len
502         local flag_2="extern_learn"
503         local exp_flag_2=0
504
505         vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \
506                 $flag_2 $exp_flag_2
507 }
508
509 vxlan_test_flush_by_several_args()
510 {
511         local dst_ip_1=192.0.2.1
512         local dst_ip_2=192.0.2.2
513         local state_1=permanent
514         local state_2=static
515         local vni=3000
516         local port=1234
517         local nhid=100
518         local flag=router
519         local flush_args
520
521         ################### Flush by 2 args - nhid and flag ####################
522         $IP nexthop add id 10 via 192.0.2.1 fdb
523         $IP nexthop add id $nhid group 10 fdb
524
525         fdb_add_mac_pool_1 vx10 nhid $nhid $flag $state_1
526         fdb_add_mac_pool_2 vx10 nhid $nhid $flag $state_2
527
528         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len $state_1
529         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len $state_2
530
531         run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid $flag"
532         log_test $? 0 "Flush FDB by dev vx10 nhid $nhid $flag"
533
534         # All entries should be flushed as 'state' is not an argument for flush
535         # filtering.
536         fdb_check_n_entries_by_dev_filter vx10 0 $state_1
537         log_test $? 0 "Test entries with state $state_1"
538
539         fdb_check_n_entries_by_dev_filter vx10 0 $state_2
540         log_test $? 0 "Test entries with state $state_2"
541
542         ################ Flush by 3 args - VNI, port and dst_ip ################
543         fdb_add_mac_pool_1 vx10 vni $vni port $port dst $dst_ip_1
544         fdb_add_mac_pool_2 vx10 vni $vni port $port dst $dst_ip_2
545
546         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1
547         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len dst $dst_ip_2
548
549         flush_args="vni $vni port $port dst $dst_ip_2"
550         run_cmd "$BRIDGE fdb flush dev vx10 $flush_args"
551         log_test $? 0 "Flush FDB by dev vx10 $flush_args"
552
553         # Only entries with $dst_ip_2 should be flushed, even the rest arguments
554         # match the filter, the flush should be AND of all the arguments.
555         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1
556         log_test $? 0 "Test entries with dst $dst_ip_1"
557
558         fdb_check_n_entries_by_dev_filter vx10 0 dst $dst_ip_2
559         log_test $? 0 "Test entries with dst $dst_ip_2"
560 }
561
562 multicast_fdb_entries_add()
563 {
564         mac=00:00:00:00:00:00
565         vnis=(2000 3000)
566
567         for vni in "${vnis[@]}"; do
568                 $BRIDGE fdb append $mac dev vx10 dst 192.0.2.1 vni $vni \
569                         src_vni 5000
570                 $BRIDGE fdb append $mac dev vx10 dst 192.0.2.1 vni $vni \
571                         port 1111
572                 $BRIDGE fdb append $mac dev vx10 dst 192.0.2.2 vni $vni \
573                         port 2222
574         done
575 }
576
577 vxlan_test_flush_by_remote_attributes()
578 {
579         local flush_args
580
581         # Reconfigure vx10 with 'external' to get 'src_vni' details in
582         # 'bridge fdb' output
583         $IP link del dev vx10
584         $IP link add name vx10 type vxlan dstport "$VXPORT" external
585
586         # For multicat FDB entries, the VXLAN driver stores a linked list of
587         # remotes for a given key. Verify that only the expected remotes are
588         # flushed.
589         multicast_fdb_entries_add
590
591         ## Flush by 3 remote's attributes - destination IP, port and VNI ##
592         flush_args="dst 192.0.2.1 port 1111 vni 2000"
593         fdb_check_n_entries_by_dev_filter vx10 1 $flush_args
594
595         t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
596         run_cmd "$BRIDGE fdb flush dev vx10 $flush_args"
597         log_test $? 0 "Flush FDB by dev vx10 $flush_args"
598
599         fdb_check_n_entries_by_dev_filter vx10 0 $flush_args
600
601         exp_n_entries=$((t0_n_entries - 1))
602         t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
603         [[ $t1_n_entries -eq $exp_n_entries ]]
604         log_test $? 0 "Check how many entries were flushed"
605
606         ## Flush by 2 remote's attributes - destination IP and port ##
607         flush_args="dst 192.0.2.2 port 2222"
608
609         fdb_check_n_entries_by_dev_filter vx10 2 $flush_args
610
611         t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
612         run_cmd "$BRIDGE fdb flush dev vx10 $flush_args"
613         log_test $? 0 "Flush FDB by dev vx10 $flush_args"
614
615         fdb_check_n_entries_by_dev_filter vx10 0 $flush_args
616
617         exp_n_entries=$((t0_n_entries - 2))
618         t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
619         [[ $t1_n_entries -eq $exp_n_entries ]]
620         log_test $? 0 "Check how many entries were flushed"
621
622         ## Flush by source VNI, which is not remote's attribute and VNI ##
623         flush_args="vni 3000 src_vni 5000"
624
625         fdb_check_n_entries_by_dev_filter vx10 1 $flush_args
626
627         t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
628         run_cmd "$BRIDGE fdb flush dev vx10 $flush_args"
629         log_test $? 0 "Flush FDB by dev vx10 $flush_args"
630
631         fdb_check_n_entries_by_dev_filter vx10 0 $flush_args
632
633         exp_n_entries=$((t0_n_entries -1))
634         t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
635         [[ $t1_n_entries -eq $exp_n_entries ]]
636         log_test $? 0 "Check how many entries were flushed"
637
638         # Flush by 1 remote's attribute - destination IP ##
639         flush_args="dst 192.0.2.1"
640
641         fdb_check_n_entries_by_dev_filter vx10 2 $flush_args
642
643         t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
644         run_cmd "$BRIDGE fdb flush dev vx10 $flush_args"
645         log_test $? 0 "Flush FDB by dev vx10 $flush_args"
646
647         fdb_check_n_entries_by_dev_filter vx10 0 $flush_args
648
649         exp_n_entries=$((t0_n_entries -2))
650         t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l)
651         [[ $t1_n_entries -eq $exp_n_entries ]]
652         log_test $? 0 "Check how many entries were flushed"
653 }
654
655 bridge_test_flush_by_dev()
656 {
657         local dst_ip=192.0.2.1
658         local br0_n_ent_t0=$($BRIDGE fdb show dev br0 | wc -l)
659         local br1_n_ent_t0=$($BRIDGE fdb show dev br1 | wc -l)
660
661         fdb_add_mac_pool_1 br0 dst $dst_ip
662         fdb_add_mac_pool_2 br1 dst $dst_ip
663
664         # Each 'fdb add' command adds one extra entry in the bridge with the
665         # default vlan.
666         local exp_br0_n_ent=$(($br0_n_ent_t0 + 2 * $mac_pool_1_len))
667         local exp_br1_n_ent=$(($br1_n_ent_t0 + 2 * $mac_pool_2_len))
668
669         fdb_check_n_entries_by_dev_filter br0 $exp_br0_n_ent
670         fdb_check_n_entries_by_dev_filter br1 $exp_br1_n_ent
671
672         run_cmd "$BRIDGE fdb flush dev br0"
673         log_test $? 0 "Flush FDB by dev br0"
674
675         # The default entry should not be flushed
676         fdb_check_n_entries_by_dev_filter br0 1
677         log_test $? 0 "Flush FDB by dev br0 - test br0 entries"
678
679         fdb_check_n_entries_by_dev_filter br1 $exp_br1_n_ent
680         log_test $? 0 "Flush FDB by dev br0 - test br1 entries"
681 }
682
683 bridge_test_flush_by_vlan()
684 {
685         local vlan_1=10
686         local vlan_2=20
687         local vlan_1_ent_t0
688         local vlan_2_ent_t0
689
690         $BRIDGE vlan add vid $vlan_1 dev br0 self
691         $BRIDGE vlan add vid $vlan_2 dev br0 self
692
693         vlan_1_ent_t0=$($BRIDGE fdb show dev br0 | grep "vlan $vlan_1" | wc -l)
694         vlan_2_ent_t0=$($BRIDGE fdb show dev br0 | grep "vlan $vlan_2" | wc -l)
695
696         fdb_add_mac_pool_1 br0 vlan $vlan_1
697         fdb_add_mac_pool_2 br0 vlan $vlan_2
698
699         local exp_vlan_1_ent=$(($vlan_1_ent_t0 + $mac_pool_1_len))
700         local exp_vlan_2_ent=$(($vlan_2_ent_t0 + $mac_pool_2_len))
701
702         fdb_check_n_entries_by_dev_filter br0 $exp_vlan_1_ent vlan $vlan_1
703         fdb_check_n_entries_by_dev_filter br0 $exp_vlan_2_ent vlan $vlan_2
704
705         run_cmd "$BRIDGE fdb flush dev br0 vlan $vlan_1"
706         log_test $? 0 "Flush FDB by dev br0 and vlan $vlan_1"
707
708         fdb_check_n_entries_by_dev_filter br0 0 vlan $vlan_1
709         log_test $? 0 "Test entries with vlan $vlan_1"
710
711         fdb_check_n_entries_by_dev_filter br0 $exp_vlan_2_ent vlan $vlan_2
712         log_test $? 0 "Test entries with vlan $vlan_2"
713 }
714
715 bridge_vxlan_test_flush()
716 {
717         local vlan_1=10
718         local dst_ip=192.0.2.1
719
720         $IP link set dev vx10 master br0
721         $BRIDGE vlan add vid $vlan_1 dev br0 self
722         $BRIDGE vlan add vid $vlan_1 dev vx10
723
724         fdb_add_mac_pool_1 vx10 vni 3000 dst $dst_ip self master
725
726         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vlan $vlan_1
727         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vni 3000
728
729         # Such command should fail in VXLAN driver as vlan is not supported,
730         # but the command should flush the entries in the bridge
731         run_cmd "$BRIDGE fdb flush dev vx10 vlan $vlan_1 master self"
732         log_test $? 255 \
733                 "Flush FDB by dev vx10, vlan $vlan_1, master and self"
734
735         fdb_check_n_entries_by_dev_filter vx10 0 vlan $vlan_1
736         log_test $? 0 "Test entries with vlan $vlan_1"
737
738         fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip
739         log_test $? 0 "Test entries with dst $dst_ip"
740 }
741
742 setup()
743 {
744         setup_ns NS
745         IP="ip -netns ${NS}"
746         BRIDGE="bridge -netns ${NS}"
747
748         $IP link add name vx10 type vxlan id 1000 dstport "$VXPORT"
749         $IP link add name vx20 type vxlan id 2000 dstport "$VXPORT"
750
751         $IP link add br0 type bridge vlan_filtering 1
752         $IP link add br1 type bridge vlan_filtering 1
753 }
754
755 cleanup()
756 {
757         $IP link del dev br1
758         $IP link del dev br0
759
760         $IP link del dev vx20
761         $IP link del dev vx10
762
763         cleanup_ns ${NS}
764 }
765
766 ################################################################################
767 # main
768
769 while getopts :t:pPhvw: o
770 do
771         case $o in
772                 t) TESTS=$OPTARG;;
773                 p) PAUSE_ON_FAIL=yes;;
774                 P) PAUSE=yes;;
775                 v) VERBOSE=$(($VERBOSE + 1));;
776                 w) PING_TIMEOUT=$OPTARG;;
777                 h) usage; exit 0;;
778                 *) usage; exit 1;;
779         esac
780 done
781
782 # make sure we don't pause twice
783 [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
784
785 if [ "$(id -u)" -ne 0 ];then
786         echo "SKIP: Need root privileges"
787         exit $ksft_skip;
788 fi
789
790 if [ ! -x "$(command -v ip)" ]; then
791         echo "SKIP: Could not run test without ip tool"
792         exit $ksft_skip
793 fi
794
795 # Check a flag that is added to flush command as part of VXLAN flush support
796 bridge fdb help 2>&1 | grep -q "\[no\]router"
797 if [ $? -ne 0 ]; then
798         echo "SKIP: iproute2 too old, missing flush command for VXLAN"
799         exit $ksft_skip
800 fi
801
802 ip link add dev vx10 type vxlan id 1000 2> /dev/null
803 out=$(bridge fdb flush dev vx10 2>&1 | grep -q "Operation not supported")
804 if [ $? -eq 0 ]; then
805         echo "SKIP: kernel lacks vxlan flush support"
806         exit $ksft_skip
807 fi
808 ip link del dev vx10
809
810 for t in $TESTS
811 do
812         setup; $t; cleanup;
813 done
This page took 0.074522 seconds and 4 git commands to generate.