xref: /illumos-gate/usr/src/test/net-tests/tests/ipv6/link-local.ksh (revision 44749cf0c208741d3c37035731688216f5517f58)
1*44749cf0SAndy Fiddaman#!/usr/bin/ksh
2*44749cf0SAndy Fiddaman#
3*44749cf0SAndy Fiddaman# This file and its contents are supplied under the terms of the
4*44749cf0SAndy Fiddaman# Common Development and Distribution License ("CDDL"), version 1.0.
5*44749cf0SAndy Fiddaman# You may only use this file in accordance with the terms of version
6*44749cf0SAndy Fiddaman# 1.0 of the CDDL.
7*44749cf0SAndy Fiddaman#
8*44749cf0SAndy Fiddaman# A full copy of the text of the CDDL should have accompanied this
9*44749cf0SAndy Fiddaman# source.  A copy of the CDDL is also available via the Internet at
10*44749cf0SAndy Fiddaman# http://www.illumos.org/license/CDDL.
11*44749cf0SAndy Fiddaman
12*44749cf0SAndy Fiddaman#
13*44749cf0SAndy Fiddaman# Copyright 2024 Oxide Computer Company
14*44749cf0SAndy Fiddaman#
15*44749cf0SAndy Fiddaman
16*44749cf0SAndy Fiddaman# This tests the behaviour of in.ndpd in conjunction with the creation and
17*44749cf0SAndy Fiddaman# deletion of IPv6 link local addresses in various combinations. It does this
18*44749cf0SAndy Fiddaman# using a VNIC on a simnet created just for the purpose. No special system
19*44749cf0SAndy Fiddaman# configuration is required, but the tests will restart the running in.ndpd
20*44749cf0SAndy Fiddaman# several times.
21*44749cf0SAndy Fiddaman
22*44749cf0SAndy FiddamanSIMNET=ndpt_simnet0
23*44749cf0SAndy FiddamanIF=ndpt_vnic0
24*44749cf0SAndy Fiddaman
25*44749cf0SAndy Fiddamantypeset -i comms=1
26*44749cf0SAndy Fiddamantypeset -i failures=0
27*44749cf0SAndy Fiddamantypeset -i zid=0
28*44749cf0SAndy Fiddaman
29*44749cf0SAndy Fiddamanfunction fatal {
30*44749cf0SAndy Fiddaman	print "$*" >&2
31*44749cf0SAndy Fiddaman	exit 1
32*44749cf0SAndy Fiddaman}
33*44749cf0SAndy Fiddaman
34*44749cf0SAndy Fiddamanfunction cleanup {
35*44749cf0SAndy Fiddaman	{
36*44749cf0SAndy Fiddaman		dladm delete-vnic $IF
37*44749cf0SAndy Fiddaman		dladm delete-simnet $SIMNET
38*44749cf0SAndy Fiddaman	} >/dev/null 2>&1
39*44749cf0SAndy Fiddaman}
40*44749cf0SAndy Fiddaman
41*44749cf0SAndy Fiddamantrap cleanup EXIT
42*44749cf0SAndy Fiddaman
43*44749cf0SAndy Fiddamanfunction init {
44*44749cf0SAndy Fiddaman	zid=$(zoneadm list -p | awk -F: -vz=`zonename` '$2 == z { print $1 }')
45*44749cf0SAndy Fiddaman	[[ -n "$zid" ]] || fatal "Cannot determine zone ID"
46*44749cf0SAndy Fiddaman	print "+ zone ID $zid"
47*44749cf0SAndy Fiddaman	print "+ creating simnet $SIMNET"
48*44749cf0SAndy Fiddaman	dladm create-simnet "$SIMNET" || \
49*44749cf0SAndy Fiddaman	    fatal "Could not create simnet $SIMNET"
50*44749cf0SAndy Fiddaman	print "+ creating VNIC $IF"
51*44749cf0SAndy Fiddaman	dladm create-vnic -l $SIMNET "$IF" || \
52*44749cf0SAndy Fiddaman	    fatal "Could not create vnic $IF"
53*44749cf0SAndy Fiddaman}
54*44749cf0SAndy Fiddaman
55*44749cf0SAndy Fiddamanfunction ndpid {
56*44749cf0SAndy Fiddaman	pgrep -x -z$zid in.ndpd || fatal "Could not find in.ndpd process"
57*44749cf0SAndy Fiddaman}
58*44749cf0SAndy Fiddaman
59*44749cf0SAndy Fiddamanfunction start {
60*44749cf0SAndy Fiddaman	print
61*44749cf0SAndy Fiddaman	print "************** $*"
62*44749cf0SAndy Fiddaman	print
63*44749cf0SAndy Fiddaman}
64*44749cf0SAndy Fiddaman
65*44749cf0SAndy Fiddamanfunction clean {
66*44749cf0SAndy Fiddaman	/usr/sbin/ipadm delete-if "$IF" 1>/dev/null 2>&1
67*44749cf0SAndy Fiddaman	restart_ndp
68*44749cf0SAndy Fiddaman
69*44749cf0SAndy Fiddaman	ifconfig "$IF" inet6 1>/dev/null 2>&1 && \
70*44749cf0SAndy Fiddaman	    fatal "$IF IPv6 interface exists"
71*44749cf0SAndy Fiddaman	mdb -p `ndpid` -e \
72*44749cf0SAndy Fiddaman	    'phyints::list struct phyint pi_next|::print struct phyint pi_name'\
73*44749cf0SAndy Fiddaman	    | egrep -s "$IF" && fatal "$IF exists in ndpd state after restart"
74*44749cf0SAndy Fiddaman
75*44749cf0SAndy Fiddaman	# Check that in.ndpd is running
76*44749cf0SAndy Fiddaman	ndpid >/dev/null
77*44749cf0SAndy Fiddaman}
78*44749cf0SAndy Fiddaman
79*44749cf0SAndy Fiddamanfunction ndpdump {
80*44749cf0SAndy Fiddaman	typeset cmd=
81*44749cf0SAndy Fiddaman	cmd+='phyints::list struct phyint pi_next '
82*44749cf0SAndy Fiddaman	cmd+='| ::print struct phyint '
83*44749cf0SAndy Fiddaman	cmd+='pi_name pi_ifaddr pi_autoconf pi_ipadm_aobjname'
84*44749cf0SAndy Fiddaman	mdb -e "$cmd" -p `ndpid` | sed -n "
85*44749cf0SAndy Fiddaman		/pi_name.*$IF/,/aobjname/ {
86*44749cf0SAndy Fiddaman			/name = /s/, '\\0'.*/.../
87*44749cf0SAndy Fiddaman			s/^/    /
88*44749cf0SAndy Fiddaman			p
89*44749cf0SAndy Fiddaman		}
90*44749cf0SAndy Fiddaman	"
91*44749cf0SAndy Fiddaman}
92*44749cf0SAndy Fiddaman
93*44749cf0SAndy Fiddamanfunction ndpac {
94*44749cf0SAndy Fiddaman	typeset cmd=
95*44749cf0SAndy Fiddaman	cmd+='phyints::list struct phyint pi_next '
96*44749cf0SAndy Fiddaman	cmd+='| ::printf "%s %s\n" struct phyint pi_name pi_autoconf'
97*44749cf0SAndy Fiddaman	mdb -p `ndpid` -e "$cmd" | awk "/$IF/ {print \$NF}"
98*44749cf0SAndy Fiddaman}
99*44749cf0SAndy Fiddaman
100*44749cf0SAndy Fiddamanfunction check_ac {
101*44749cf0SAndy Fiddaman	((comms)) || return
102*44749cf0SAndy Fiddaman
103*44749cf0SAndy Fiddaman	typeset ac=`ndpac`
104*44749cf0SAndy Fiddaman
105*44749cf0SAndy Fiddaman	[[ "$ac" == "$1" ]] && return
106*44749cf0SAndy Fiddaman	[[ -z "$ac" ]] && ac="<entry missing>"
107*44749cf0SAndy Fiddaman	print "FAIL: Expected autoconf $1, got $ac"
108*44749cf0SAndy Fiddaman	ndpdump >&2
109*44749cf0SAndy Fiddaman	((failures++))
110*44749cf0SAndy Fiddaman}
111*44749cf0SAndy Fiddaman
112*44749cf0SAndy Fiddamanfunction ipadm {
113*44749cf0SAndy Fiddaman	print "+ ipadm $*"
114*44749cf0SAndy Fiddaman	if ! /sbin/ipadm $*; then
115*44749cf0SAndy Fiddaman		print "FAIL: ipadm command unexpectedly failed"
116*44749cf0SAndy Fiddaman		((failures++))
117*44749cf0SAndy Fiddaman	fi
118*44749cf0SAndy Fiddaman}
119*44749cf0SAndy Fiddaman
120*44749cf0SAndy Fiddamanfunction restart_ndp {
121*44749cf0SAndy Fiddaman	disable_ndp
122*44749cf0SAndy Fiddaman	enable_ndp
123*44749cf0SAndy Fiddaman}
124*44749cf0SAndy Fiddaman
125*44749cf0SAndy Fiddamanfunction disable_ndp {
126*44749cf0SAndy Fiddaman	comms=0
127*44749cf0SAndy Fiddaman	svcadm disable -s ndp
128*44749cf0SAndy Fiddaman}
129*44749cf0SAndy Fiddaman
130*44749cf0SAndy Fiddamanfunction enable_ndp {
131*44749cf0SAndy Fiddaman	comms=1
132*44749cf0SAndy Fiddaman	svcadm enable -s ndp
133*44749cf0SAndy Fiddaman}
134*44749cf0SAndy Fiddaman
135*44749cf0SAndy Fiddamanfunction create_if {
136*44749cf0SAndy Fiddaman	ipadm create-if $IF
137*44749cf0SAndy Fiddaman	check_ac B_FALSE
138*44749cf0SAndy Fiddaman}
139*44749cf0SAndy Fiddaman
140*44749cf0SAndy Fiddamanfunction delete_if {
141*44749cf0SAndy Fiddaman	ipadm delete-if $IF
142*44749cf0SAndy Fiddaman	check_ac B_TRUE
143*44749cf0SAndy Fiddaman}
144*44749cf0SAndy Fiddaman
145*44749cf0SAndy Fiddamanfunction create_addr {
146*44749cf0SAndy Fiddaman	ipadm create-addr -T addrconf $IF/ll
147*44749cf0SAndy Fiddaman	check_ac B_TRUE
148*44749cf0SAndy Fiddaman}
149*44749cf0SAndy Fiddaman
150*44749cf0SAndy Fiddamanfunction delete_addr {
151*44749cf0SAndy Fiddaman	ipadm delete-addr $IF/ll
152*44749cf0SAndy Fiddaman	check_ac B_FALSE
153*44749cf0SAndy Fiddaman}
154*44749cf0SAndy Fiddaman
155*44749cf0SAndy Fiddamaninit
156*44749cf0SAndy Fiddaman
157*44749cf0SAndy Fiddamanstart "create-if, delete-if, repeat"
158*44749cf0SAndy Fiddamanclean
159*44749cf0SAndy Fiddamanfor _ in {0..3}; do
160*44749cf0SAndy Fiddaman	create_if
161*44749cf0SAndy Fiddaman	delete_if
162*44749cf0SAndy Fiddamandone
163*44749cf0SAndy Fiddaman
164*44749cf0SAndy Fiddamanstart "create/delete-addr with plumbed interface"
165*44749cf0SAndy Fiddamanclean
166*44749cf0SAndy Fiddamancreate_if
167*44749cf0SAndy Fiddamancreate_addr
168*44749cf0SAndy Fiddamandelete_addr
169*44749cf0SAndy Fiddamandelete_if
170*44749cf0SAndy Fiddaman
171*44749cf0SAndy Fiddamanstart "create/delete_addr without plumbed interface"
172*44749cf0SAndy Fiddamanclean
173*44749cf0SAndy Fiddamancreate_addr
174*44749cf0SAndy Fiddamandelete_addr
175*44749cf0SAndy Fiddamandelete_if
176*44749cf0SAndy Fiddaman
177*44749cf0SAndy Fiddamanstart "create_addr, delete-addr, repeat"
178*44749cf0SAndy Fiddamanclean
179*44749cf0SAndy Fiddamanfor _ in {0..3}; do
180*44749cf0SAndy Fiddaman	create_addr
181*44749cf0SAndy Fiddaman	delete_addr
182*44749cf0SAndy Fiddamandone
183*44749cf0SAndy Fiddaman
184*44749cf0SAndy Fiddamanstart "create_addr, delete-if, create-if, create-addr"
185*44749cf0SAndy Fiddamanclean
186*44749cf0SAndy Fiddamancreate_addr
187*44749cf0SAndy Fiddamandelete_if
188*44749cf0SAndy Fiddamancreate_if
189*44749cf0SAndy Fiddamancreate_addr
190*44749cf0SAndy Fiddaman
191*44749cf0SAndy Fiddamanstart "run without ndp"
192*44749cf0SAndy Fiddamanclean
193*44749cf0SAndy Fiddamandisable_ndp
194*44749cf0SAndy Fiddamancreate_addr
195*44749cf0SAndy Fiddamandelete_addr
196*44749cf0SAndy Fiddamandelete_if
197*44749cf0SAndy Fiddaman
198*44749cf0SAndy Fiddamanstart "start without ndp, enable after create-if"
199*44749cf0SAndy Fiddamanclean
200*44749cf0SAndy Fiddamandisable_ndp
201*44749cf0SAndy Fiddamancreate_if
202*44749cf0SAndy Fiddamanenable_ndp
203*44749cf0SAndy Fiddamancreate_addr
204*44749cf0SAndy Fiddamandelete_addr
205*44749cf0SAndy Fiddamandelete_if
206*44749cf0SAndy Fiddamanenable_ndp
207*44749cf0SAndy Fiddaman
208*44749cf0SAndy Fiddamanstart "start without ndp, enable after create-addr"
209*44749cf0SAndy Fiddamanclean
210*44749cf0SAndy Fiddamandisable_ndp
211*44749cf0SAndy Fiddamancreate_if
212*44749cf0SAndy Fiddamancreate_addr
213*44749cf0SAndy Fiddamanenable_ndp
214*44749cf0SAndy Fiddamandelete_addr
215*44749cf0SAndy Fiddamandelete_if
216*44749cf0SAndy Fiddaman
217*44749cf0SAndy Fiddamanstart "start without ndp, enable after delete-addr"
218*44749cf0SAndy Fiddamanclean
219*44749cf0SAndy Fiddamandisable_ndp
220*44749cf0SAndy Fiddamancreate_addr
221*44749cf0SAndy Fiddamandelete_addr
222*44749cf0SAndy Fiddamanenable_ndp
223*44749cf0SAndy Fiddamandelete_if
224*44749cf0SAndy Fiddaman
225*44749cf0SAndy Fiddamanstart "restart ndp after create-if"
226*44749cf0SAndy Fiddamanclean
227*44749cf0SAndy Fiddamancreate_if
228*44749cf0SAndy Fiddamanrestart_ndp
229*44749cf0SAndy Fiddamancreate_addr
230*44749cf0SAndy Fiddamandelete_addr
231*44749cf0SAndy Fiddamandelete_if
232*44749cf0SAndy Fiddaman
233*44749cf0SAndy Fiddamanstart "restart ndp after create-addr"
234*44749cf0SAndy Fiddamanclean
235*44749cf0SAndy Fiddamancreate_if
236*44749cf0SAndy Fiddamancreate_addr
237*44749cf0SAndy Fiddamanrestart_ndp
238*44749cf0SAndy Fiddamandelete_addr
239*44749cf0SAndy Fiddamandelete_if
240*44749cf0SAndy Fiddaman
241*44749cf0SAndy Fiddamanprint
242*44749cf0SAndy Fiddamanif ((FAILURES)); then
243*44749cf0SAndy Fiddaman	print "$FAILURES failure(s) detected"
244*44749cf0SAndy Fiddaman	exit 1
245*44749cf0SAndy Fiddamanfi
246*44749cf0SAndy Fiddamanprint "All tests passed"
247*44749cf0SAndy Fiddamanexit 0
248