xref: /linux/tools/testing/selftests/net/test_vxlan_fdb_changelink.sh (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4ALL_TESTS="
5	test_set_remote
6	test_change_mc_remote
7"
8source lib.sh
9
10check_remotes()
11{
12	local what=$1; shift
13	local N=$(bridge fdb sh dev vx | grep 00:00:00:00:00:00 | wc -l)
14
15	((N == 2))
16	check_err $? "expected 2 remotes after $what, got $N"
17}
18
19# Check FDB default-remote handling across "ip link set".
20test_set_remote()
21{
22	RET=0
23
24	ip_link_add vx up type vxlan id 2000 dstport 4789
25	bridge fdb ap dev vx 00:00:00:00:00:00 dst 192.0.2.20 self permanent
26	bridge fdb ap dev vx 00:00:00:00:00:00 dst 192.0.2.30 self permanent
27	check_remotes "fdb append"
28
29	ip link set dev vx type vxlan remote 192.0.2.30
30	check_remotes "link set"
31
32	log_test 'FDB default-remote handling across "ip link set"'
33}
34
35fmt_remote()
36{
37	local addr=$1; shift
38
39	if [[ $addr == 224.* ]]; then
40		echo "group $addr"
41	else
42		echo "remote $addr"
43	fi
44}
45
46change_remote()
47{
48	local remote=$1; shift
49
50	ip link set dev vx type vxlan $(fmt_remote $remote) dev v1
51}
52
53check_membership()
54{
55	local check_vec=("$@")
56
57	local memberships
58	memberships=$(
59	    netstat -n --groups |
60		sed -n '/^v1\b/p' |
61		grep -o '[^ ]*$'
62	)
63	check_err $? "Couldn't obtain group memberships"
64
65	local item
66	for item in "${check_vec[@]}"; do
67		eval "local $item"
68		echo "$memberships" | grep -q "\b$group\b"
69		check_err_fail $fail $? "$group is_ex reported in IGMP query response"
70	done
71}
72
73test_change_mc_remote()
74{
75	check_command netstat || return
76
77	ip_link_add v1 up type veth peer name v2
78	ip_link_set_up v2
79
80	RET=0
81
82	ip_link_add vx up type vxlan dstport 4789 \
83		local 192.0.2.1 $(fmt_remote 224.1.1.1) dev v1 vni 1000
84
85	check_membership "group=224.1.1.1 fail=0" \
86			 "group=224.1.1.2 fail=1" \
87			 "group=224.1.1.3 fail=1"
88
89	log_test "MC group report after VXLAN creation"
90
91	RET=0
92
93	change_remote 224.1.1.2
94	check_membership "group=224.1.1.1 fail=1" \
95			 "group=224.1.1.2 fail=0" \
96			 "group=224.1.1.3 fail=1"
97
98	log_test "MC group report after changing VXLAN remote MC->MC"
99
100	RET=0
101
102	change_remote 192.0.2.2
103	check_membership "group=224.1.1.1 fail=1" \
104			 "group=224.1.1.2 fail=1" \
105			 "group=224.1.1.3 fail=1"
106
107	log_test "MC group report after changing VXLAN remote MC->UC"
108}
109
110trap defer_scopes_cleanup EXIT
111
112tests_run
113
114exit $EXIT_STATUS
115