hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/tools/testing/selftests/net/forwarding/router.sh
....@@ -1,9 +1,23 @@
11 #!/bin/bash
22 # SPDX-License-Identifier: GPL-2.0
33
4
-ALL_TESTS="ping_ipv4 ping_ipv6"
4
+ALL_TESTS="
5
+ ping_ipv4
6
+ ping_ipv6
7
+ sip_in_class_e
8
+ mc_mac_mismatch
9
+ ipv4_sip_equal_dip
10
+ ipv6_sip_equal_dip
11
+ ipv4_dip_link_local
12
+"
13
+
514 NUM_NETIFS=4
615 source lib.sh
16
+source tc_common.sh
17
+
18
+require_command $MCD
19
+require_command $MC_CLI
20
+table_name=selftests
721
822 h1_create()
923 {
....@@ -64,6 +78,8 @@
6478 ip link set dev $rp1 up
6579 ip link set dev $rp2 up
6680
81
+ tc qdisc add dev $rp2 clsact
82
+
6783 ip address add 192.0.2.1/24 dev $rp1
6884 ip address add 2001:db8:1::1/64 dev $rp1
6985
....@@ -79,8 +95,29 @@
7995 ip address del 2001:db8:1::1/64 dev $rp1
8096 ip address del 192.0.2.1/24 dev $rp1
8197
98
+ tc qdisc del dev $rp2 clsact
99
+
82100 ip link set dev $rp2 down
83101 ip link set dev $rp1 down
102
+}
103
+
104
+start_mcd()
105
+{
106
+ SMCROUTEDIR="$(mktemp -d)"
107
+
108
+ for ((i = 1; i <= $NUM_NETIFS; ++i)); do
109
+ echo "phyint ${NETIFS[p$i]} enable" >> \
110
+ $SMCROUTEDIR/$table_name.conf
111
+ done
112
+
113
+ $MCD -N -I $table_name -f $SMCROUTEDIR/$table_name.conf \
114
+ -P $SMCROUTEDIR/$table_name.pid
115
+}
116
+
117
+kill_mcd()
118
+{
119
+ pkill $MCD
120
+ rm -rf $SMCROUTEDIR
84121 }
85122
86123 setup_prepare()
....@@ -90,6 +127,10 @@
90127
91128 rp2=${NETIFS[p3]}
92129 h2=${NETIFS[p4]}
130
+
131
+ rp1mac=$(mac_get $rp1)
132
+
133
+ start_mcd
93134
94135 vrf_prepare
95136
....@@ -113,6 +154,8 @@
113154 h1_destroy
114155
115156 vrf_cleanup
157
+
158
+ kill_mcd
116159 }
117160
118161 ping_ipv4()
....@@ -125,6 +168,150 @@
125168 ping6_test $h1 2001:db8:2::2
126169 }
127170
171
+sip_in_class_e()
172
+{
173
+ RET=0
174
+
175
+ # Disable rpfilter to prevent packets to be dropped because of it.
176
+ sysctl_set net.ipv4.conf.all.rp_filter 0
177
+ sysctl_set net.ipv4.conf.$rp1.rp_filter 0
178
+
179
+ tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
180
+ flower src_ip 240.0.0.1 ip_proto udp action pass
181
+
182
+ $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
183
+ -A 240.0.0.1 -b $rp1mac -B 198.51.100.2 -q
184
+
185
+ tc_check_packets "dev $rp2 egress" 101 5
186
+ check_err $? "Packets were dropped"
187
+
188
+ log_test "Source IP in class E"
189
+
190
+ tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
191
+ sysctl_restore net.ipv4.conf.$rp1.rp_filter
192
+ sysctl_restore net.ipv4.conf.all.rp_filter
193
+}
194
+
195
+create_mcast_sg()
196
+{
197
+ local if_name=$1; shift
198
+ local s_addr=$1; shift
199
+ local mcast=$1; shift
200
+ local dest_ifs=${@}
201
+
202
+ $MC_CLI -I $table_name add $if_name $s_addr $mcast $dest_ifs
203
+}
204
+
205
+delete_mcast_sg()
206
+{
207
+ local if_name=$1; shift
208
+ local s_addr=$1; shift
209
+ local mcast=$1; shift
210
+ local dest_ifs=${@}
211
+
212
+ $MC_CLI -I $table_name remove $if_name $s_addr $mcast $dest_ifs
213
+}
214
+
215
+__mc_mac_mismatch()
216
+{
217
+ local desc=$1; shift
218
+ local proto=$1; shift
219
+ local sip=$1; shift
220
+ local dip=$1; shift
221
+ local flags=${1:-""}; shift
222
+ local dmac=01:02:03:04:05:06
223
+
224
+ RET=0
225
+
226
+ tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
227
+ flower dst_ip $dip action pass
228
+
229
+ create_mcast_sg $rp1 $sip $dip $rp2
230
+
231
+ $MZ $flags $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $dmac \
232
+ -B $dip -q
233
+
234
+ tc_check_packets "dev $rp2 egress" 101 5
235
+ check_err $? "Packets were dropped"
236
+
237
+ log_test "Multicast MAC mismatch: $desc"
238
+
239
+ delete_mcast_sg $rp1 $sip $dip $rp2
240
+ tc filter del dev $rp2 egress protocol $proto pref 1 handle 101 flower
241
+}
242
+
243
+mc_mac_mismatch()
244
+{
245
+ __mc_mac_mismatch "IPv4" "ip" 192.0.2.2 225.1.2.3
246
+ __mc_mac_mismatch "IPv6" "ipv6" 2001:db8:1::2 ff0e::3 "-6"
247
+}
248
+
249
+ipv4_sip_equal_dip()
250
+{
251
+ RET=0
252
+
253
+ # Disable rpfilter to prevent packets to be dropped because of it.
254
+ sysctl_set net.ipv4.conf.all.rp_filter 0
255
+ sysctl_set net.ipv4.conf.$rp1.rp_filter 0
256
+
257
+ tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
258
+ flower src_ip 198.51.100.2 action pass
259
+
260
+ $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
261
+ -A 198.51.100.2 -b $rp1mac -B 198.51.100.2 -q
262
+
263
+ tc_check_packets "dev $rp2 egress" 101 5
264
+ check_err $? "Packets were dropped"
265
+
266
+ log_test "Source IP is equal to destination IP: IPv4"
267
+
268
+ tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
269
+ sysctl_restore net.ipv4.conf.$rp1.rp_filter
270
+ sysctl_restore net.ipv4.conf.all.rp_filter
271
+}
272
+
273
+ipv6_sip_equal_dip()
274
+{
275
+ RET=0
276
+
277
+ tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
278
+ flower src_ip 2001:db8:2::2 action pass
279
+
280
+ $MZ -6 $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
281
+ -A 2001:db8:2::2 -b $rp1mac -B 2001:db8:2::2 -q
282
+
283
+ tc_check_packets "dev $rp2 egress" 101 5
284
+ check_err $? "Packets were dropped"
285
+
286
+ log_test "Source IP is equal to destination IP: IPv6"
287
+
288
+ tc filter del dev $rp2 egress protocol ipv6 pref 1 handle 101 flower
289
+}
290
+
291
+ipv4_dip_link_local()
292
+{
293
+ local dip=169.254.1.1
294
+
295
+ RET=0
296
+
297
+ tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
298
+ flower dst_ip $dip action pass
299
+
300
+ ip neigh add 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2
301
+ ip route add 169.254.1.0/24 dev $rp2
302
+
303
+ $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $rp1mac -B $dip -q
304
+
305
+ tc_check_packets "dev $rp2 egress" 101 5
306
+ check_err $? "Packets were dropped"
307
+
308
+ log_test "IPv4 destination IP is link-local"
309
+
310
+ ip route del 169.254.1.0/24 dev $rp2
311
+ ip neigh del 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2
312
+ tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
313
+}
314
+
128315 trap cleanup EXIT
129316
130317 setup_prepare