]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/netbsd-tests/net/icmp/t_icmp_redirect.sh
MFC r305358,r305449,r305451,r306367,r306397,r309474:
[FreeBSD/stable/10.git] / contrib / netbsd-tests / net / icmp / t_icmp_redirect.sh
1 #       $NetBSD: t_icmp_redirect.sh,v 1.3 2016/08/10 22:17:44 kre Exp $
2 #
3 # Copyright (c) 2015 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27
28 # Most codes are derived from tests/net/route/t_flags.sh
29
30 netserver=\
31 "rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev"
32 SOCK_LOCAL=unix://commsock1
33 SOCK_PEER=unix://commsock2
34 SOCK_GW=unix://commsock3
35 BUS=bus1
36 BUS2=bus2
37 REDIRECT_TIMEOUT=5
38
39 DEBUG=false
40
41 atf_test_case icmp_redirect_timeout cleanup
42
43 icmp_redirect_timeout_head()
44 {
45
46         atf_set "descr" "Tests for ICMP redirect timeout";
47         atf_set "require.progs" "rump_server";
48 }
49
50 setup_local()
51 {
52
53         atf_check -s exit:0 ${netserver} ${SOCK_LOCAL}
54
55         export RUMP_SERVER=$SOCK_LOCAL
56         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
57         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
58         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.2/24
59         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
60
61         atf_check -s exit:0 -o ignore rump.sysctl -w \
62             net.inet.icmp.redirtimeout=$REDIRECT_TIMEOUT
63
64         $DEBUG && rump.ifconfig
65         $DEBUG && rump.netstat -rn -f inet
66 }
67
68 setup_peer()
69 {
70
71         atf_check -s exit:0 ${netserver} ${SOCK_PEER}
72
73         export RUMP_SERVER=$SOCK_PEER
74         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
75         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
76         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.1/24
77         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
78
79         $DEBUG && rump.ifconfig
80         $DEBUG && rump.netstat -rn -f inet
81 }
82
83 setup_gw()
84 {
85
86         atf_check -s exit:0 ${netserver} ${SOCK_GW}
87
88         export RUMP_SERVER=$SOCK_GW
89         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
90         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr ${BUS}
91         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.254/24
92         atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
93
94         atf_check -s exit:0 -o ignore rump.ifconfig shmif1 create
95         atf_check -s exit:0 -o ignore rump.ifconfig shmif1 linkstr ${BUS2}
96         atf_check -s exit:0 -o ignore rump.ifconfig shmif1 10.0.2.1/24
97         atf_check -s exit:0 -o ignore rump.ifconfig shmif1 alias 10.0.2.2/24
98         atf_check -s exit:0 -o ignore rump.ifconfig shmif1 up
99
100         # Wait until DAD completes (10 sec at most)
101         atf_check -s exit:0 -o ignore rump.ifconfig -w 10
102         atf_check -s not-exit:0 -x "rump.ifconfig shmif1 |grep -q tentative"
103
104         $DEBUG && rump.ifconfig
105         $DEBUG && rump.netstat -rn -f inet
106 }
107
108 teardown_gw()
109 {
110
111         env RUMP_SERVER=$SOCK_GW rump.halt
112 }
113
114 check_entry_flags()
115 {
116         local ip=$(echo $1 |sed 's/\./\\./g')
117         local flags=$2
118
119         atf_check -s exit:0 -o match:" $flags " -e ignore -x \
120             "rump.netstat -rn -f inet | grep ^'$ip'"
121 }
122
123 check_entry_gw()
124 {
125         local ip=$(echo $1 |sed 's/\./\\./g')
126         local gw=$2
127
128         atf_check -s exit:0 -o match:" $gw " -e ignore -x \
129             "rump.netstat -rn -f inet | grep ^'$ip'"
130 }
131
132 check_entry_fail()
133 {
134         local ip=$(echo $1 |sed 's/\./\\./g')
135         local flags=$2  # Not used currently
136
137         atf_check -s not-exit:0 -e ignore -x \
138             "rump.netstat -rn -f inet | grep ^'$ip'"
139 }
140
141 icmp_redirect_timeout_body()
142 {
143
144         $DEBUG && ulimit -c unlimited
145
146         setup_local
147         setup_peer
148
149         ### Testing Dynamic flag ###
150
151         #
152         # Setup a gateway 10.0.0.254. 10.0.2.1 is behind it.
153         #
154         setup_gw
155
156         #
157         # Teach the peer that 10.0.2.* is behind 10.0.0.254
158         #
159         export RUMP_SERVER=$SOCK_PEER
160         atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.254
161         # Up, Gateway, Static
162         check_entry_flags 10.0.2/24 UGS
163
164         #
165         # Setup the default gateway to the peer, 10.0.0.1
166         #
167         export RUMP_SERVER=$SOCK_LOCAL
168         atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
169         # Up, Gateway, Static
170         check_entry_flags default UGS
171
172         # Try ping 10.0.2.1
173         atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
174         $DEBUG && rump.netstat -rn -f inet
175
176         # Up, Gateway, Host, Dynamic
177         check_entry_flags 10.0.2.1 UGHD
178         check_entry_gw 10.0.2.1 10.0.0.254
179
180         atf_check -s exit:0 sleep $((REDIRECT_TIMEOUT + 2))
181
182         # The dynamic entry should be expired and removed
183         check_entry_fail 10.0.2.1
184
185         export RUMP_SERVER=$SOCK_PEER
186         $DEBUG && rump.netstat -rn -f inet
187
188         teardown_gw
189 }
190
191 dump()
192 {
193
194         shmif_dumpbus -p - $BUS 2>/dev/null | tcpdump -n -e -r -
195         gdb -ex bt /usr/bin/rump_server rump_server.core
196 }
197
198 cleanup()
199 {
200
201         env RUMP_SERVER=$SOCK_LOCAL rump.halt
202         env RUMP_SERVER=$SOCK_PEER rump.halt
203 }
204
205 icmp_redirect_timeout_cleanup()
206 {
207
208         $DEBUG && dump
209         cleanup
210 }
211
212 atf_test_case icmp_redirect cleanup
213
214 icmp_redirect_head()
215 {
216
217         atf_set "descr" "Tests for icmp redirect";
218         atf_set "require.progs" "rump_server";
219 }
220
221 setup_redirect()
222 {
223         atf_check -s exit:0 -o ignore rump.sysctl -w \
224             net.inet.ip.redirect=1
225 }
226
227 teardown_redirect()
228 {
229         atf_check -s exit:0 -o ignore rump.sysctl -w \
230             net.inet.ip.redirect=0
231 }
232
233 icmp_redirect_body()
234 {
235
236         $DEBUG && ulimit -c unlimited
237
238         setup_local
239         setup_peer
240
241         #
242         # Setup a gateway 10.0.0.254. 10.0.2.1 is behind it.
243         #
244         setup_gw
245
246         #
247         # Teach the peer that 10.0.2.* is behind 10.0.0.254
248         #
249         export RUMP_SERVER=$SOCK_PEER
250         atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.254
251         # Up, Gateway, Static
252         check_entry_flags 10.0.2/24 UGS
253
254         #
255         # Setup the default gateway to the peer, 10.0.0.1
256         #
257         export RUMP_SERVER=$SOCK_LOCAL
258         atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
259         # Up, Gateway, Static
260         check_entry_flags default UGS
261
262
263         ### ICMP redirects are NOT sent by the peer ###
264
265         #
266         # Disable net.inet.ip.redirect
267         #
268         export RUMP_SERVER=$SOCK_PEER
269         teardown_redirect
270
271         # Try ping 10.0.2.1
272         export RUMP_SERVER=$SOCK_LOCAL
273         atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
274         $DEBUG && rump.netstat -rn -f inet
275
276         # A direct route shouldn't be created
277         check_entry_fail 10.0.2.1
278
279
280         ### ICMP redirects are sent by the peer ###
281
282         #
283         # Enable net.inet.ip.redirect
284         #
285         export RUMP_SERVER=$SOCK_PEER
286         setup_redirect
287
288         # Try ping 10.0.2.1
289         export RUMP_SERVER=$SOCK_LOCAL
290         atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
291         $DEBUG && rump.netstat -rn -f inet
292
293         # Up, Gateway, Host, Dynamic
294         check_entry_flags 10.0.2.1 UGHD
295         check_entry_gw 10.0.2.1 10.0.0.254
296
297         export RUMP_SERVER=$SOCK_PEER
298         $DEBUG && rump.netstat -rn -f inet
299
300
301         # cleanup
302         export RUMP_SERVER=$SOCK_LOCAL
303         atf_check -s exit:0 -o ignore rump.route delete 10.0.2.1
304         check_entry_fail 10.0.2.1
305
306
307         ### ICMP redirects are NOT sent by the peer (again) ###
308
309         #
310         # Disable net.inet.ip.redirect
311         #
312         export RUMP_SERVER=$SOCK_PEER
313         teardown_redirect
314
315         # Try ping 10.0.2.1
316         export RUMP_SERVER=$SOCK_LOCAL
317         atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
318         $DEBUG && rump.netstat -rn -f inet
319
320         # A direct route shouldn't be created
321         check_entry_fail 10.0.2.1
322
323
324         teardown_gw
325 }
326
327 icmp_redirect_cleanup()
328 {
329
330         $DEBUG && dump
331         cleanup
332 }
333
334 atf_init_test_cases()
335 {
336
337         atf_add_test_case icmp_redirect
338         atf_add_test_case icmp_redirect_timeout
339 }