hc
2023-12-06 d38611ca164021d018c1b23eee65bbebc09c63e0
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
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test that blackhole routes are marked as offloaded and that packets hitting
# them are dropped by the ASIC and not by the kernel.
#
# +---------------------------------+
# | H1 (vrf)                        |
# |    + $h1                        |
# |    | 192.0.2.1/24               |
# |    | 2001:db8:1::1/64           |
# |    |                            |
# |    |  default via 192.0.2.2     |
# |    |  default via 2001:db8:1::2 |
# +----|----------------------------+
#      |
# +----|----------------------------------------------------------------------+
# | SW |                                                                      |
# |    + $rp1                                                                 |
# |        192.0.2.2/24                                                       |
# |        2001:db8:1::2/64                                                   |
# |                                                                           |
# |        2001:db8:2::2/64                                                   |
# |        198.51.100.2/24                                                    |
# |    + $rp2                                                                 |
# |    |                                                                      |
# +----|----------------------------------------------------------------------+
#      |
# +----|----------------------------+
# |    |  default via 198.51.100.2  |
# |    |  default via 2001:db8:2::2 |
# |    |                            |
# |    | 2001:db8:2::1/64           |
# |    | 198.51.100.1/24            |
# |    + $h2                        |
# | H2 (vrf)                        |
# +---------------------------------+
 
lib_dir=$(dirname $0)/../../../net/forwarding
 
ALL_TESTS="
   ping_ipv4
   ping_ipv6
   blackhole_ipv4
   blackhole_ipv6
"
NUM_NETIFS=4
: ${TIMEOUT:=20000} # ms
source $lib_dir/tc_common.sh
source $lib_dir/lib.sh
 
h1_create()
{
   simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
 
   ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
   ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
}
 
h1_destroy()
{
   ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
   ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
 
   simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
}
 
h2_create()
{
   simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64
 
   ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
   ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
}
 
h2_destroy()
{
   ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
   ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
 
   simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64
}
 
router_create()
{
   ip link set dev $rp1 up
   ip link set dev $rp2 up
 
   tc qdisc add dev $rp1 clsact
 
   __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
   __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
}
 
router_destroy()
{
   __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
   __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
 
   tc qdisc del dev $rp1 clsact
 
   ip link set dev $rp2 down
   ip link set dev $rp1 down
}
 
ping_ipv4()
{
   ping_test $h1 198.51.100.1 ": h1->h2"
}
 
ping_ipv6()
{
   ping6_test $h1 2001:db8:2::1 ": h1->h2"
}
 
blackhole_ipv4()
{
   # Transmit packets from H1 to H2 and make sure they are dropped by the
   # ASIC and not by the kernel
   RET=0
 
   ip -4 route add blackhole 198.51.100.0/30
   tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
       skip_hw dst_ip 198.51.100.1 src_ip 192.0.2.1 ip_proto icmp \
       action pass
 
   busywait "$TIMEOUT" wait_for_offload ip -4 route show 198.51.100.0/30
   check_err $? "route not marked as offloaded when should"
 
   ping_do $h1 198.51.100.1
   check_fail $? "ping passed when should not"
 
   tc_check_packets "dev $rp1 ingress" 101 0
   check_err $? "packets trapped and not dropped by ASIC"
 
   log_test "IPv4 blackhole route"
 
   tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
   ip -4 route del blackhole 198.51.100.0/30
}
 
blackhole_ipv6()
{
   RET=0
 
   ip -6 route add blackhole 2001:db8:2::/120
   tc filter add dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower \
       skip_hw dst_ip 2001:db8:2::1 src_ip 2001:db8:1::1 \
       ip_proto icmpv6 action pass
 
   busywait "$TIMEOUT" wait_for_offload ip -6 route show 2001:db8:2::/120
   check_err $? "route not marked as offloaded when should"
 
   ping6_do $h1 2001:db8:2::1
   check_fail $? "ping passed when should not"
 
   tc_check_packets "dev $rp1 ingress" 101 0
   check_err $? "packets trapped and not dropped by ASIC"
 
   log_test "IPv6 blackhole route"
 
   tc filter del dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower
   ip -6 route del blackhole 2001:db8:2::/120
}
 
setup_prepare()
{
   h1=${NETIFS[p1]}
   rp1=${NETIFS[p2]}
 
   rp2=${NETIFS[p3]}
   h2=${NETIFS[p4]}
 
   vrf_prepare
   forwarding_enable
 
   h1_create
   h2_create
   router_create
}
 
cleanup()
{
   pre_cleanup
 
   router_destroy
   h2_destroy
   h1_destroy
 
   forwarding_restore
   vrf_cleanup
}
 
trap cleanup EXIT
 
setup_prepare
setup_wait
 
tests_run
 
exit $EXIT_STATUS