blob: c18340cee55d589baa1d5f58f82c11e01863177d (
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
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
lib_dir=$(dirname $0)/../../../net/forwarding
ALL_TESTS="
mac_profile_test
"
NUM_NETIFS=4
source $lib_dir/lib.sh
source $lib_dir/tc_common.sh
source $lib_dir/devlink_lib.sh
h1_create()
{
simple_if_init $h1 192.0.2.1/24
ip route add 198.51.100.0/24 vrf v$h1 nexthop via 192.0.2.2
tc qdisc add dev $h1 ingress
}
h1_destroy()
{
tc qdisc del dev $h1 ingress
ip route del 198.51.100.0/24 vrf v$h1
simple_if_fini $h1 192.0.2.1/24
}
h2_create()
{
simple_if_init $h2 198.51.100.1/24
ip route add 192.0.2.0/24 vrf v$h2 nexthop via 198.51.100.2
tc qdisc add dev $h2 ingress
}
h2_destroy()
{
tc qdisc del dev $h2 ingress
ip route del 192.0.2.0/24 vrf v$h2
simple_if_fini $h2 198.51.100.1/24
}
router_create()
{
ip link set dev $rp1 up
ip link set dev $rp2 up
tc qdisc add dev $rp1 clsact
tc qdisc add dev $rp2 clsact
ip address add 192.0.2.2/24 dev $rp1
ip address add 198.51.100.2/24 dev $rp2
}
router_destroy()
{
ip address del 198.51.100.2/24 dev $rp2
ip address del 192.0.2.2/24 dev $rp1
tc qdisc del dev $rp2 clsact
tc qdisc del dev $rp1 clsact
ip link set dev $rp2 down
ip link set dev $rp1 down
}
setup_prepare()
{
h1=${NETIFS[p1]}
rp1=${NETIFS[p2]}
rp2=${NETIFS[p3]}
h2=${NETIFS[p4]}
vrf_prepare
h1_create
h2_create
router_create
forwarding_enable
}
cleanup()
{
pre_cleanup
forwarding_restore
router_destroy
h2_destroy
h1_destroy
vrf_cleanup
}
h1_to_h2()
{
local test_name=$@; shift
local smac=$(mac_get $rp2)
RET=0
# Replace neighbour to avoid first packet being forwarded in software
ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
# Add a filter to ensure that packets are forwarded in hardware. Cannot
# match on source MAC because it is not set in eACL after routing
tc filter add dev $rp2 egress proto ip pref 1 handle 101 \
flower skip_sw ip_proto udp src_port 12345 dst_port 54321 \
action pass
# Add a filter to ensure that packets are received with the correct
# source MAC
tc filter add dev $h2 ingress proto ip pref 1 handle 101 \
flower skip_sw src_mac $smac ip_proto udp src_port 12345 \
dst_port 54321 action pass
$MZ $h1 -a own -b $(mac_get $rp1) -t udp "sp=12345,dp=54321" \
-A 192.0.2.1 -B 198.51.100.1 -c 10 -p 100 -d 1msec -q
tc_check_packets "dev $rp2 egress" 101 10
check_err $? "packets not forwarded in hardware"
tc_check_packets "dev $h2 ingress" 101 10
check_err $? "packets not forwarded with correct source mac"
log_test "h1->h2: $test_name"
tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
ip neigh del dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
}
h2_to_h1()
{
local test_name=$@; shift
local rp1_mac=$(mac_get $rp1)
RET=0
ip neigh replace dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
tc filter add dev $rp1 egress proto ip pref 1 handle 101 \
flower skip_sw ip_proto udp src_port 54321 dst_port 12345 \
action pass
tc filter add dev $h1 ingress proto ip pref 1 handle 101 \
flower skip_sw src_mac $rp1_mac ip_proto udp src_port 54321 \
dst_port 12345 action pass
$MZ $h2 -a own -b $(mac_get $rp2) -t udp "sp=54321,dp=12345" \
-A 198.51.100.1 -B 192.0.2.1 -c 10 -p 100 -d 1msec -q
tc_check_packets "dev $rp1 egress" 101 10
check_err $? "packets not forwarded in hardware"
tc_check_packets "dev $h1 ingress" 101 10
check_err $? "packets not forwarded with correct source mac"
log_test "h2->h1: $test_name"
tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
tc filter del dev $rp1 egress protocol ip pref 1 handle 101 flower
ip neigh del dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
}
smac_test()
{
local test_name=$@; shift
# Test that packets forwarded to $h2 via $rp2 are forwarded with the
# current source MAC of $rp2
h1_to_h2 $test_name
# Test that packets forwarded to $h1 via $rp1 are forwarded with the
# current source MAC of $rp1. This MAC is never changed during the test,
# but given the shared nature of MAC profile, the point is to see that
# changes to the MAC of $rp2 do not affect that of $rp1
h2_to_h1 $test_name
}
mac_profile_test()
{
local rp2_mac=$(mac_get $rp2)
# Test behavior when the RIF backing $rp2 is transitioned to use
# a new MAC profile
ip link set dev $rp2 addr 00:11:22:33:44:55
smac_test "new mac profile"
# Test behavior when the MAC profile used by the RIF is edited
ip link set dev $rp2 address 00:22:22:22:22:22
smac_test "edit mac profile"
# Restore original MAC
ip link set dev $rp2 addr $rp2_mac
}
trap cleanup EXIT
setup_prepare
setup_wait
mac_profiles=$(devlink_resource_size_get rif_mac_profiles)
if [[ $mac_profiles -ne 1 ]]; then
tests_run
fi
exit $EXIT_STATUS
|