blob: ff5b893472474e4e084ec7c86abdcc6e47ea0b7b (
plain)
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
|
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test multicast delivery to macvlan bridge ports when the source MAC
# matches the macvlan's own MAC address (e.g., VRRP virtual MAC shared
# across multiple hosts).
#
# Topology:
#
# NS_SRC NS_BRIDGE
# veth_src (SHARED_MAC) <-----> veth_dst
# |
# +-- macvlan0 (bridge mode, SHARED_MAC)
#
# A multicast packet sent from NS_SRC with source MAC equal to
# macvlan0's MAC must still be delivered to macvlan0.
source lib.sh
SHARED_MAC="00:00:5e:00:01:01"
MCAST_ADDR="239.0.0.1"
setup() {
setup_ns NS_SRC NS_BRIDGE
ip -net "${NS_BRIDGE}" link add veth_dst type veth \
peer name veth_src netns "${NS_SRC}"
ip -net "${NS_SRC}" link set veth_src address "${SHARED_MAC}"
ip -net "${NS_SRC}" link set veth_src up
ip -net "${NS_SRC}" addr add 192.168.1.1/24 dev veth_src
ip -net "${NS_BRIDGE}" link set veth_dst up
ip -net "${NS_BRIDGE}" link add macvlan0 link veth_dst \
type macvlan mode bridge
ip -net "${NS_BRIDGE}" link set macvlan0 address "${SHARED_MAC}"
ip -net "${NS_BRIDGE}" link set macvlan0 up
ip -net "${NS_BRIDGE}" addr add 192.168.1.2/24 dev macvlan0
# Accept all multicast so the mc_filter passes for any group.
ip -net "${NS_BRIDGE}" link set macvlan0 allmulticast on
}
cleanup() {
rm -f "${CAPFILE}" "${CAPOUT}"
cleanup_ns "${NS_SRC}" "${NS_BRIDGE}"
}
test_macvlan_mcast_shared_mac() {
CAPFILE=$(mktemp)
CAPOUT=$(mktemp)
echo "Testing multicast delivery to macvlan with shared source MAC"
# Listen for one ICMP packet on macvlan0.
timeout 5s ip netns exec "${NS_BRIDGE}" \
tcpdump -i macvlan0 -c 1 -w "${CAPFILE}" icmp &> "${CAPOUT}" &
local pid=$!
if ! slowwait 1 grep -qs "listening" "${CAPOUT}"; then
echo "[FAIL] tcpdump did not start listening"
return "${ksft_fail}"
fi
# Send multicast ping from NS_SRC; source MAC equals macvlan0's MAC.
ip netns exec "${NS_SRC}" \
ping -W 0.1 -c 3 -I veth_src "${MCAST_ADDR}" &> /dev/null
wait "${pid}"
local count
count=$(tcpdump -r "${CAPFILE}" 2>/dev/null | wc -l)
if [[ "${count}" -ge 1 ]]; then
echo "[ OK ]"
return "${ksft_pass}"
else
echo "[FAIL] expected at least 1 ICMP packet on macvlan0," \
"got ${count}"
return "${ksft_fail}"
fi
}
if [ ! -x "$(command -v tcpdump)" ]; then
echo "SKIP: Could not run test without tcpdump tool"
exit "${ksft_skip}"
fi
trap cleanup EXIT
setup
test_macvlan_mcast_shared_mac
exit $?
|