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