aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh
blob: b90dff8d3a94bf41640564513e4bb73e54f7bcdc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

ALL_TESTS="ping_ipv4 ping_ipv6 learning flooding vlan_deletion extern_learn"
NUM_NETIFS=4
CHECK_TC="yes"
source lib.sh

h1_create()
{
	simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
}

h1_destroy()
{
	simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
}

h2_create()
{
	simple_if_init $h2 192.0.2.2/24 2001:db8:1::2/64
}

h2_destroy()
{
	simple_if_fini $h2 192.0.2.2/24 2001:db8:1::2/64
}

switch_create()
{
	# 10 Seconds ageing time.
	ip link add dev br0 type bridge vlan_filtering 1 ageing_time 1000 \
		mcast_snooping 0

	ip link set dev $swp1 master br0
	ip link set dev $swp2 master br0

	ip link set dev br0 up
	ip link set dev $swp1 up
	ip link set dev $swp2 up
}

switch_destroy()
{
	ip link set dev $swp2 down
	ip link set dev $swp1 down

	ip link del dev br0
}

setup_prepare()
{
	h1=${NETIFS[p1]}
	swp1=${NETIFS[p2]}

	swp2=${NETIFS[p3]}
	h2=${NETIFS[p4]}

	vrf_prepare

	h1_create
	h2_create

	switch_create
}

cleanup()
{
	pre_cleanup

	switch_destroy

	h2_destroy
	h1_destroy

	vrf_cleanup
}

ping_ipv4()
{
	ping_test $h1 192.0.2.2
}

ping_ipv6()
{
	ping6_test $h1 2001:db8:1::2
}

learning()
{
	learning_test "br0" $swp1 $h1 $h2
}

flooding()
{
	flood_test $swp2 $h1 $h2
}

vlan_deletion()
{
	# Test that the deletion of a VLAN on a bridge port does not affect
	# the PVID VLAN
	log_info "Add and delete a VLAN on bridge port $swp1"

	bridge vlan add vid 10 dev $swp1
	bridge vlan del vid 10 dev $swp1

	ping_ipv4
	ping_ipv6
}

extern_learn()
{
	local mac=de:ad:be:ef:13:37
	local ageing_time

	# Test that externally learned FDB entries can roam, but not age out
	RET=0

	bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn vlan 1

	bridge fdb show brport $swp1 | grep -q de:ad:be:ef:13:37
	check_err $? "Did not find FDB entry when should"

	# Wait for 10 seconds after the ageing time to make sure the FDB entry
	# was not aged out
	ageing_time=$(bridge_ageing_time_get br0)
	sleep $((ageing_time + 10))

	bridge fdb show brport $swp1 | grep -q de:ad:be:ef:13:37
	check_err $? "FDB entry was aged out when should not"

	$MZ $h2 -c 1 -p 64 -a $mac -t ip -q

	bridge fdb show brport $swp2 | grep -q de:ad:be:ef:13:37
	check_err $? "FDB entry did not roam when should"

	log_test "Externally learned FDB entry - ageing & roaming"

	bridge fdb del de:ad:be:ef:13:37 dev $swp2 master vlan 1 &> /dev/null
	bridge fdb del de:ad:be:ef:13:37 dev $swp1 master vlan 1 &> /dev/null
}

trap cleanup EXIT

setup_prepare
setup_wait

tests_run

exit $EXIT_STATUS