Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/netinet6/proxy_ndp.sh
39478 views
1
#!/usr/bin/env atf-sh
2
#-
3
# SPDX-License-Identifier: BSD-2-Clause
4
#
5
# Copyright (c) 2022 KUROSAWA Takahiro <[email protected]>
6
#
7
# Redistribution and use in source and binary forms, with or without
8
# modification, are permitted provided that the following conditions
9
# are met:
10
# 1. Redistributions of source code must retain the above copyright
11
# notice, this list of conditions and the following disclaimer.
12
# 2. Redistributions in binary form must reproduce the above copyright
13
# notice, this list of conditions and the following disclaimer in the
14
# documentation and/or other materials provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
# SUCH DAMAGE.
27
#
28
#
29
30
. $(atf_get_srcdir)/../common/vnet.subr
31
32
atf_test_case "pndp_add_gu_success" "cleanup"
33
pndp_add_gu_success_head() {
34
atf_set descr 'Test proxy ndp record addition'
35
atf_set require.user root
36
}
37
38
pndp_add_gu_success_body() {
39
40
vnet_init
41
42
jname="v6t-pndp_add_success"
43
44
epair0=$(vnet_mkepair)
45
46
vnet_mkjail ${jname} ${epair0}a
47
jexec ${jname} ndp -i ${epair0}a -- -disabled
48
jexec ${jname} ifconfig ${epair0}a up
49
50
jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64
51
proxy_mac=`jexec ${jname} ifconfig ${epair0}a ether | awk '$1~/ether/{print$2}'`
52
53
# wait for DAD to complete
54
while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
55
sleep 0.1
56
done
57
58
atf_check jexec ${jname} ndp -s 2001:db8::2 ${proxy_mac} proxy
59
while [ `jexec ${jname} ifmcstat | grep -c undefined` != "0" ]; do
60
sleep 0.1
61
done
62
63
# checking the output of ndp -an is covered by ndp.sh.
64
# we check the output of ifmcstat output here.
65
t=`jexec ${jname} ifmcstat -i ${epair0}a -f inet6 | grep -A1 'group ff02::1:ff00:2'`
66
atf_check -o match:'mcast-macaddr 33:33:ff:00:00:02' echo $t
67
}
68
69
pndp_add_gu_success_cleanup() {
70
vnet_cleanup
71
}
72
73
atf_test_case "pndp_del_gu_success" "cleanup"
74
pndp_del_gu_success_head() {
75
atf_set descr 'Test proxy ndp record deletion'
76
atf_set require.user root
77
}
78
79
pndp_del_gu_success_body() {
80
81
vnet_init
82
83
jname="v6t-pndp_del_gu_success"
84
85
epair0=$(vnet_mkepair)
86
87
vnet_mkjail ${jname} ${epair0}a
88
89
jexec ${jname} ndp -i ${epair0}a -- -disabled
90
jexec ${jname} ifconfig ${epair0}a up
91
92
jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64
93
proxy_mac=`jexec ${jname} ifconfig ${epair0}a ether | awk '$1~/ether/{print$2}'`
94
95
# wait for DAD to complete
96
while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
97
sleep 0.1
98
done
99
100
atf_check jexec ${jname} ndp -s 2001:db8::2 ${proxy_mac} proxy
101
while [ `jexec ${jname} ifmcstat | grep -c undefined` != "0" ]; do
102
sleep 0.1
103
done
104
jexec ${jname} ping -c1 -t1 2001:db8::2
105
106
atf_check -o match:"2001:db8::2 \(2001:db8::2\) deleted" jexec ${jname} ndp -nd 2001:db8::2
107
while [ `jexec ${jname} ifmcstat | grep -c undefined` != "0" ]; do
108
sleep 0.1
109
done
110
atf_check \
111
-o not-match:'group ff02::1:ff00:2' \
112
-o not-match:'mcast-macaddr 33:33:ff:00:00:02' \
113
jexec ${jname} ifmcstat -i ${epair0}a -f inet6
114
}
115
116
pndp_del_gu_success_cleanup() {
117
vnet_cleanup
118
}
119
120
atf_test_case "pndp_ifdestroy_success" "cleanup"
121
pndp_ifdetroy_success_head() {
122
atf_set descr 'Test interface destruction with proxy ndp'
123
atf_set require.user root
124
}
125
126
pndp_ifdestroy_success_body() {
127
128
vnet_init
129
130
jname="v6t-pndp_ifdestroy_success"
131
132
epair0=$(vnet_mkepair)
133
134
vnet_mkjail ${jname} ${epair0}a
135
136
jexec ${jname} ndp -i ${epair0}a -- -disabled
137
jexec ${jname} ifconfig ${epair0}a up
138
139
jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64
140
proxy_mac=`jexec ${jname} ifconfig ${epair0}a ether | awk '$1~/ether/{print$2}'`
141
142
# wait for DAD to complete
143
while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
144
sleep 0.1
145
done
146
147
atf_check jexec ${jname} ndp -s 2001:db8::2 ${proxy_mac} proxy
148
while [ `jexec ${jname} ifmcstat | grep -c undefined` != "0" ]; do
149
sleep 0.1
150
done
151
152
atf_check jexec ${jname} ifconfig ${epair0}a destroy
153
}
154
155
pndp_ifdestroy_success_cleanup() {
156
vnet_cleanup
157
}
158
159
atf_test_case "pndp_neighbor_advert" "cleanup"
160
pndp_neighbor_advert_head() {
161
atf_set descr 'Test Neighbor Advertisement for proxy ndp'
162
atf_set require.user root
163
}
164
165
pndp_neighbor_advert_body() {
166
167
vnet_init
168
169
jname_a="v6t-pndp_neighbor_advert_a" # NA sender (w/proxy ndp entry)
170
jname_b="v6t-pndp_neighbor_advert_b" # NA receiver (checker)
171
proxy_addr="2001:db8::aaaa"
172
173
epair0=$(vnet_mkepair)
174
175
vnet_mkjail ${jname_a} ${epair0}a
176
jexec ${jname_a} ndp -i ${epair0}a -- -disabled
177
jexec ${jname_a} ifconfig ${epair0}a up
178
jexec ${jname_a} ifconfig ${epair0}a inet6 2001:db8::1/64
179
proxy_mac=`jexec ${jname_a} ifconfig ${epair0}a ether | awk '$1~/ether/{print$2}'`
180
# wait for DAD to complete
181
while [ `jexec ${jname_a} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
182
sleep 0.1
183
done
184
atf_check jexec ${jname_a} ndp -s ${proxy_addr} ${proxy_mac} proxy
185
while [ `jexec ${jname_a} ifmcstat | grep -c undefined` != "0" ]; do
186
sleep 0.1
187
done
188
189
vnet_mkjail ${jname_b} ${epair0}b
190
jexec ${jname_b} ndp -i ${epair0}b -- -disabled
191
jexec ${jname_b} ifconfig ${epair0}b up
192
jexec ${jname_b} ifconfig ${epair0}b inet6 2001:db8::2/64
193
# wait for DAD to complete
194
while [ `jexec ${jname_b} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do
195
sleep 0.1
196
done
197
198
jexec ${jname_b} ndp -nc
199
# jname_b sends a NS before ICMPv6 Echo Request for the proxy address.
200
# jname_a responds with a NA resolving the proxy address.
201
# Then there must be a NDP entry of the proxy address in jname_b.
202
jexec ${jname_b} ping -c1 -t1 ${proxy_addr}
203
atf_check -o match:"${proxy_addr} +${proxy_mac} +${epair0}b" \
204
jexec ${jname_b} ndp -an
205
}
206
207
pndp_neighbor_advert_cleanup() {
208
vnet_cleanup
209
}
210
211
atf_init_test_cases()
212
{
213
214
atf_add_test_case "pndp_add_gu_success"
215
atf_add_test_case "pndp_del_gu_success"
216
atf_add_test_case "pndp_ifdestroy_success"
217
atf_add_test_case "pndp_neighbor_advert"
218
}
219
220
# end
221
222
223