2 # SPDX-License-Identifier: GPL-2.0
11 # +-------------|-------------------------------+
15 # | 2001:db8:1::1/64 |
17 # | 2001:db8:2::1/64 2001:db8:3::1/64 |
18 # | 198.51.100.17/28 198.51.100.33/28 |
20 # +--------------|--------------------------|---+
23 # +--------------|---+ +--------------|---+
24 # | H2 (v$h2) | | | H3 (v$h3) | |
26 # | 198.51.100.18/28 | | 198.51.100.34/28 |
27 # | 2001:db8:2::2/64 | | 2001:db8:3::2/64 |
28 # +------------------+ +------------------+
31 ALL_TESTS="mcast_v4 mcast_v6"
37 require_command $MC_CLI
42 simple_if_init $h1 198.51.100.2/28 2001:db8:1::2/64
44 ip route add 198.51.100.16/28 vrf v$h1 nexthop via 198.51.100.1
45 ip route add 198.51.100.32/28 vrf v$h1 nexthop via 198.51.100.1
47 ip route add 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::1
48 ip route add 2001:db8:3::/64 vrf v$h1 nexthop via 2001:db8:1::1
53 ip route del 2001:db8:3::/64 vrf v$h1
54 ip route del 2001:db8:2::/64 vrf v$h1
56 ip route del 198.51.100.32/28 vrf v$h1
57 ip route del 198.51.100.16/28 vrf v$h1
59 simple_if_fini $h1 198.51.100.2/28 2001:db8:1::2/64
64 simple_if_init $h2 198.51.100.18/28 2001:db8:2::2/64
66 ip route add 198.51.100.0/28 vrf v$h2 nexthop via 198.51.100.17
67 ip route add 198.51.100.32/28 vrf v$h2 nexthop via 198.51.100.17
69 ip route add 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::1
70 ip route add 2001:db8:3::/64 vrf v$h2 nexthop via 2001:db8:2::1
72 tc qdisc add dev $h2 ingress
77 tc qdisc del dev $h2 ingress
79 ip route del 2001:db8:3::/64 vrf v$h2
80 ip route del 2001:db8:1::/64 vrf v$h2
82 ip route del 198.51.100.32/28 vrf v$h2
83 ip route del 198.51.100.0/28 vrf v$h2
85 simple_if_fini $h2 198.51.100.18/28 2001:db8:2::2/64
90 simple_if_init $h3 198.51.100.34/28 2001:db8:3::2/64
92 ip route add 198.51.100.0/28 vrf v$h3 nexthop via 198.51.100.33
93 ip route add 198.51.100.16/28 vrf v$h3 nexthop via 198.51.100.33
95 ip route add 2001:db8:1::/64 vrf v$h3 nexthop via 2001:db8:3::1
96 ip route add 2001:db8:2::/64 vrf v$h3 nexthop via 2001:db8:3::1
98 tc qdisc add dev $h3 ingress
103 tc qdisc del dev $h3 ingress
105 ip route del 2001:db8:2::/64 vrf v$h3
106 ip route del 2001:db8:1::/64 vrf v$h3
108 ip route del 198.51.100.16/28 vrf v$h3
109 ip route del 198.51.100.0/28 vrf v$h3
111 simple_if_fini $h3 198.51.100.34/28 2001:db8:3::2/64
116 ip link set dev $rp1 up
117 ip link set dev $rp2 up
118 ip link set dev $rp3 up
120 ip address add 198.51.100.1/28 dev $rp1
121 ip address add 198.51.100.17/28 dev $rp2
122 ip address add 198.51.100.33/28 dev $rp3
124 ip address add 2001:db8:1::1/64 dev $rp1
125 ip address add 2001:db8:2::1/64 dev $rp2
126 ip address add 2001:db8:3::1/64 dev $rp3
131 ip address del 2001:db8:3::1/64 dev $rp3
132 ip address del 2001:db8:2::1/64 dev $rp2
133 ip address del 2001:db8:1::1/64 dev $rp1
135 ip address del 198.51.100.33/28 dev $rp3
136 ip address del 198.51.100.17/28 dev $rp2
137 ip address del 198.51.100.1/28 dev $rp1
139 ip link set dev $rp3 down
140 ip link set dev $rp2 down
141 ip link set dev $rp1 down
146 SMCROUTEDIR="$(mktemp -d)"
148 for ((i = 1; i <= $NUM_NETIFS; ++i)); do
149 echo "phyint ${NETIFS[p$i]} enable" >> \
150 $SMCROUTEDIR/$table_name.conf
153 $MCD -N -I $table_name -f $SMCROUTEDIR/$table_name.conf \
154 -P $SMCROUTEDIR/$table_name.pid
206 local if_name=$1; shift
207 local s_addr=$1; shift
208 local mcast=$1; shift
211 $MC_CLI -I $table_name add $if_name $s_addr $mcast $dest_ifs
216 local if_name=$1; shift
217 local s_addr=$1; shift
218 local mcast=$1; shift
221 $MC_CLI -I $table_name remove $if_name $s_addr $mcast $dest_ifs
226 # Add two interfaces to an MC group, send a packet to the MC group and
227 # verify packets are received on both. Then delete the route and verify
228 # packets are no longer received.
232 tc filter add dev $h2 ingress protocol ip pref 1 handle 122 flower \
233 dst_ip 225.1.2.3 action drop
234 tc filter add dev $h3 ingress protocol ip pref 1 handle 133 flower \
235 dst_ip 225.1.2.3 action drop
237 create_mcast_sg $rp1 198.51.100.2 225.1.2.3 $rp2 $rp3
239 # Send frames with the corresponding L2 destination address.
240 $MZ $h1 -c 5 -p 128 -t udp -a 00:11:22:33:44:55 -b 01:00:5e:01:02:03 \
241 -A 198.51.100.2 -B 225.1.2.3 -q
243 tc_check_packets "dev $h2 ingress" 122 5
244 check_err $? "Multicast not received on first host"
245 tc_check_packets "dev $h3 ingress" 133 5
246 check_err $? "Multicast not received on second host"
248 delete_mcast_sg $rp1 198.51.100.2 225.1.2.3 $rp2 $rp3
250 $MZ $h1 -c 5 -p 128 -t udp -a 00:11:22:33:44:55 -b 01:00:5e:01:02:03 \
251 -A 198.51.100.2 -B 225.1.2.3 -q
253 tc_check_packets "dev $h2 ingress" 122 5
254 check_err $? "Multicast received on host although deleted"
255 tc_check_packets "dev $h3 ingress" 133 5
256 check_err $? "Multicast received on second host although deleted"
258 tc filter del dev $h3 ingress protocol ip pref 1 handle 133 flower
259 tc filter del dev $h2 ingress protocol ip pref 1 handle 122 flower
261 log_test "mcast IPv4"
266 # Add two interfaces to an MC group, send a packet to the MC group and
267 # verify packets are received on both. Then delete the route and verify
268 # packets are no longer received.
272 tc filter add dev $h2 ingress protocol ipv6 pref 1 handle 122 flower \
273 dst_ip ff0e::3 action drop
274 tc filter add dev $h3 ingress protocol ipv6 pref 1 handle 133 flower \
275 dst_ip ff0e::3 action drop
277 create_mcast_sg $rp1 2001:db8:1::2 ff0e::3 $rp2 $rp3
279 # Send frames with the corresponding L2 destination address.
280 $MZ $h1 -6 -c 5 -p 128 -t udp -a 00:11:22:33:44:55 \
281 -b 33:33:00:00:00:03 -A 2001:db8:1::2 -B ff0e::3 -q
283 tc_check_packets "dev $h2 ingress" 122 5
284 check_err $? "Multicast not received on first host"
285 tc_check_packets "dev $h3 ingress" 133 5
286 check_err $? "Multicast not received on second host"
288 delete_mcast_sg $rp1 2001:db8:1::2 ff0e::3 $rp2 $rp3
290 $MZ $h1 -6 -c 5 -p 128 -t udp -a 00:11:22:33:44:55 \
291 -b 33:33:00:00:00:03 -A 2001:db8:1::2 -B ff0e::3 -q
293 tc_check_packets "dev $h2 ingress" 122 5
294 check_err $? "Multicast received on first host although deleted"
295 tc_check_packets "dev $h3 ingress" 133 5
296 check_err $? "Multicast received on second host although deleted"
298 tc filter del dev $h3 ingress protocol ipv6 pref 1 handle 133 flower
299 tc filter del dev $h2 ingress protocol ipv6 pref 1 handle 122 flower
301 log_test "mcast IPv6"