1c61a1653SRyan Zezeski#!/usr/bin/ksh 2c61a1653SRyan Zezeski# 3c61a1653SRyan Zezeski# This file and its contents are supplied under the terms of the 4c61a1653SRyan Zezeski# Common Development and Distribution License ("CDDL"), version 1.0. 5c61a1653SRyan Zezeski# You may only use this file in accordance with the terms of version 6c61a1653SRyan Zezeski# 1.0 of the CDDL. 7c61a1653SRyan Zezeski# 8c61a1653SRyan Zezeski# A full copy of the text of the CDDL should have accompanied this 9c61a1653SRyan Zezeski# source. A copy of the CDDL is also available via the Internet at 10c61a1653SRyan Zezeski# http://www.illumos.org/license/CDDL. 11c61a1653SRyan Zezeski 12c61a1653SRyan Zezeski# 13c61a1653SRyan Zezeski# Copyright 2019 Joyent, Inc. 14*c3e16711SDominik Hassler# Copyright 2020 OmniOS Community Edition (OmniOSce) Association. 15c61a1653SRyan Zezeski# 16c61a1653SRyan Zezeski 17c61a1653SRyan Zezeski# 18c61a1653SRyan Zezeski# Functions shared across the network tests. 19c61a1653SRyan Zezeski# 20c61a1653SRyan Zezeski 21c61a1653SRyan ZezeskiDEBUG=0 22c61a1653SRyan Zezeski 23c61a1653SRyan Zezeskifunction dbg 24c61a1653SRyan Zezeski{ 25c61a1653SRyan Zezeski typeset msg="$*" 26c61a1653SRyan Zezeski if (($DEBUG == 1)); then 27c61a1653SRyan Zezeski echo "DBG [$nt_tname]: $msg" 28c61a1653SRyan Zezeski fi 29c61a1653SRyan Zezeski} 30c61a1653SRyan Zezeski 31c61a1653SRyan Zezeskifunction fail 32c61a1653SRyan Zezeski{ 33c61a1653SRyan Zezeski typeset msg="$*" 34c61a1653SRyan Zezeski echo "FAIL [$nt_tname]: $msg" >&2 35c61a1653SRyan Zezeski exit 1 36c61a1653SRyan Zezeski} 37c61a1653SRyan Zezeski 38c61a1653SRyan Zezeskifunction maybe_fail 39c61a1653SRyan Zezeski{ 40c61a1653SRyan Zezeski typeset msg=$1 41c61a1653SRyan Zezeski 42c61a1653SRyan Zezeski if ((BAIL == 1)); then 43c61a1653SRyan Zezeski fail "$msg" 44c61a1653SRyan Zezeski else 45c61a1653SRyan Zezeski dbg "$msg" 46c61a1653SRyan Zezeski return 1 47c61a1653SRyan Zezeski fi 48c61a1653SRyan Zezeski} 49c61a1653SRyan Zezeski 50c61a1653SRyan Zezeskifunction zone_exists 51c61a1653SRyan Zezeski{ 52c61a1653SRyan Zezeski typeset name=$1 53c61a1653SRyan Zezeski 54c61a1653SRyan Zezeski if (($# != 1)); then 55c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 56c61a1653SRyan Zezeski fi 57c61a1653SRyan Zezeski 58c61a1653SRyan Zezeski dbg "checking for existence of zone: $name" 59c61a1653SRyan Zezeski if zoneadm -z $name list > /dev/null 2>&1; then 60c61a1653SRyan Zezeski dbg "found zone: $name" 61c61a1653SRyan Zezeski return 0 62c61a1653SRyan Zezeski else 63c61a1653SRyan Zezeski dbg "zone not found: $name" 64c61a1653SRyan Zezeski return 1 65c61a1653SRyan Zezeski fi 66c61a1653SRyan Zezeski} 67c61a1653SRyan Zezeski 68c61a1653SRyan Zezeskifunction zone_running 69c61a1653SRyan Zezeski{ 70c61a1653SRyan Zezeski typeset name=$1 71c61a1653SRyan Zezeski typeset state=$(zoneadm -z $name list -p | awk -F: '{ print $3 }') 72c61a1653SRyan Zezeski typeset err="zone $name is not running" 73c61a1653SRyan Zezeski 74c61a1653SRyan Zezeski if (($# != 1)); then 75c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 76c61a1653SRyan Zezeski fi 77c61a1653SRyan Zezeski 78c61a1653SRyan Zezeski dbg "check if zone $name is running" 79c61a1653SRyan Zezeski dbg "state of zone $name: $state" 80c61a1653SRyan Zezeski if [[ "$state" == "running" ]]; then 81c61a1653SRyan Zezeski dbg "zone $name is running" 82c61a1653SRyan Zezeski return 0 83c61a1653SRyan Zezeski fi 84c61a1653SRyan Zezeski 85c61a1653SRyan Zezeski maybe_fail "$err" 86c61a1653SRyan Zezeski} 87c61a1653SRyan Zezeski 88c61a1653SRyan Zezeskifunction simnet_exists 89c61a1653SRyan Zezeski{ 90c61a1653SRyan Zezeski typeset name=$1 91c61a1653SRyan Zezeski 92c61a1653SRyan Zezeski if (($# != 1)); then 93c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 94c61a1653SRyan Zezeski fi 95c61a1653SRyan Zezeski 96c61a1653SRyan Zezeski if dladm show-simnet $name > /dev/null 2>&1; then 97c61a1653SRyan Zezeski dbg "simnet $name found" 98c61a1653SRyan Zezeski return 0 99c61a1653SRyan Zezeski else 100c61a1653SRyan Zezeski dbg "simnet $name not found" 101c61a1653SRyan Zezeski return 1 102c61a1653SRyan Zezeski fi 103c61a1653SRyan Zezeski} 104c61a1653SRyan Zezeski 105c61a1653SRyan Zezeskifunction create_simnet 106c61a1653SRyan Zezeski{ 107c61a1653SRyan Zezeski typeset name=$1 108c61a1653SRyan Zezeski typeset err="failed to create simnet $name" 109c61a1653SRyan Zezeski 110c61a1653SRyan Zezeski if (($# != 1)); then 111c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 112c61a1653SRyan Zezeski fi 113c61a1653SRyan Zezeski 114c61a1653SRyan Zezeski dbg "creating simnet $name" 115c61a1653SRyan Zezeski if simnet_exists $name; then 116c61a1653SRyan Zezeski dbg "simnet $name already exists" 117c61a1653SRyan Zezeski maybe_fail "$err" 118c61a1653SRyan Zezeski return 1 119c61a1653SRyan Zezeski fi 120c61a1653SRyan Zezeski 121c61a1653SRyan Zezeski if dladm create-simnet > /dev/null $name; then 122c61a1653SRyan Zezeski dbg "created simnet $name" 123c61a1653SRyan Zezeski return 0 124c61a1653SRyan Zezeski fi 125c61a1653SRyan Zezeski 126c61a1653SRyan Zezeski maybe_fail "$err" 127c61a1653SRyan Zezeski} 128c61a1653SRyan Zezeski 129c61a1653SRyan Zezeskifunction delete_simnet 130c61a1653SRyan Zezeski{ 131c61a1653SRyan Zezeski typeset name=$1 132c61a1653SRyan Zezeski typeset err="failed to delete simnet $name" 133c61a1653SRyan Zezeski 134c61a1653SRyan Zezeski if (($# != 1)); then 135c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 136c61a1653SRyan Zezeski fi 137c61a1653SRyan Zezeski 138c61a1653SRyan Zezeski dbg "deleting simnet $name" 139c61a1653SRyan Zezeski if ! simnet_exists $name; then 140c61a1653SRyan Zezeski dbg "simnet $name doesn't exist" 141c61a1653SRyan Zezeski return 1 142c61a1653SRyan Zezeski fi 143c61a1653SRyan Zezeski 144c61a1653SRyan Zezeski if dladm delete-simnet $name; then 145c61a1653SRyan Zezeski dbg "simnet $name deleted" 146c61a1653SRyan Zezeski return 0 147c61a1653SRyan Zezeski fi 148c61a1653SRyan Zezeski 149c61a1653SRyan Zezeski maybe_fail "$err" 150c61a1653SRyan Zezeski} 151c61a1653SRyan Zezeski 152c61a1653SRyan Zezeskifunction link_simnets 153c61a1653SRyan Zezeski{ 154c61a1653SRyan Zezeski typeset sim1=$1 155c61a1653SRyan Zezeski typeset sim2=$2 156c61a1653SRyan Zezeski typeset err="failed to link simnet $sim1 to $sim2" 157c61a1653SRyan Zezeski 158c61a1653SRyan Zezeski if (($# != 2)); then 159c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 160c61a1653SRyan Zezeski fi 161c61a1653SRyan Zezeski 162c61a1653SRyan Zezeski dbg "linking simnet $sim1 to $sim2" 163c61a1653SRyan Zezeski if dladm modify-simnet -p $sim2 $sim1 > /dev/null; then 164c61a1653SRyan Zezeski dbg "linked simnet $sim1 to $sim2" 165c61a1653SRyan Zezeski return 0 166c61a1653SRyan Zezeski fi 167c61a1653SRyan Zezeski 168c61a1653SRyan Zezeski maybe_fail "$err" 169c61a1653SRyan Zezeski} 170c61a1653SRyan Zezeski 171c61a1653SRyan Zezeskifunction vnic_exists 172c61a1653SRyan Zezeski{ 173c61a1653SRyan Zezeski typeset name=$1 174c61a1653SRyan Zezeski typeset vid=$2 175c61a1653SRyan Zezeski typeset over=$3 176c61a1653SRyan Zezeski typeset zone=$4 177c61a1653SRyan Zezeski 178c61a1653SRyan Zezeski if (($# != 4)); then 179c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 180c61a1653SRyan Zezeski fi 181c61a1653SRyan Zezeski 182c61a1653SRyan Zezeski if dladm show-vnic $name > /dev/null 2>&1; then 183c61a1653SRyan Zezeski typeset avid=$(dladm show-vnic -p -o vid $name) 184c61a1653SRyan Zezeski typeset aover=$(dladm show-vnic -p -o over $name) 185c61a1653SRyan Zezeski typeset azone=$(dladm show-linkprop -cp zone -o value $name) 186c61a1653SRyan Zezeski if (($avid == $vid)) && [ $aover == $over ] && \ 187c61a1653SRyan Zezeski [ $azone == $zone ] 188c61a1653SRyan Zezeski then 189c61a1653SRyan Zezeski return 0 190c61a1653SRyan Zezeski else 191c61a1653SRyan Zezeski return 1 192c61a1653SRyan Zezeski fi 193c61a1653SRyan Zezeski else 194c61a1653SRyan Zezeski return 1 195c61a1653SRyan Zezeski fi 196c61a1653SRyan Zezeski} 197c61a1653SRyan Zezeski 198c61a1653SRyan Zezeskifunction create_vnic 199c61a1653SRyan Zezeski{ 200c61a1653SRyan Zezeski typeset name=$1 201c61a1653SRyan Zezeski typeset over=$2 202c61a1653SRyan Zezeski typeset vid=$3 203c61a1653SRyan Zezeski typeset zone=$4 204c61a1653SRyan Zezeski typeset r=1 205c61a1653SRyan Zezeski typeset vid_opt="" 206c61a1653SRyan Zezeski typeset vnic_info="$name, vid: $vid, over: $over, zone: $zone" 207c61a1653SRyan Zezeski typeset err="failed to create VNIC: $vnic_info" 208c61a1653SRyan Zezeski 209c61a1653SRyan Zezeski if (($# != 4)); then 210c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 211c61a1653SRyan Zezeski fi 212c61a1653SRyan Zezeski 213c61a1653SRyan Zezeski if ((vid != 0)); then 214c61a1653SRyan Zezeski vid_opt="-v $vid" 215c61a1653SRyan Zezeski fi 216c61a1653SRyan Zezeski 217c61a1653SRyan Zezeski dbg "creating VNIC: $vnic_info" 218*c3e16711SDominik Hassler if dladm create-vnic -l $over $vid_opt $name > /dev/null 2>&1 && \ 219*c3e16711SDominik Hassler dladm set-linkprop -t -p zone=$zone $name > /dev/null 2>&1 220c61a1653SRyan Zezeski then 221*c3e16711SDominik Hassler dbg "created VNIC: $vnic_info" 222c61a1653SRyan Zezeski return 0 223c61a1653SRyan Zezeski fi 224c61a1653SRyan Zezeski 225*c3e16711SDominik Hassler maybe_fail "$err" 226c61a1653SRyan Zezeski} 227c61a1653SRyan Zezeski 228c61a1653SRyan Zezeskifunction delete_vnic 229c61a1653SRyan Zezeski{ 230c61a1653SRyan Zezeski typeset name=$1 231c61a1653SRyan Zezeski typeset vid=$2 232c61a1653SRyan Zezeski typeset zone=$3 233c61a1653SRyan Zezeski typeset vnic_info="$name, vid: $vid, zone: $zone" 234c61a1653SRyan Zezeski typeset err1="failed to assign VNIC $name from $zone to GZ" 235c61a1653SRyan Zezeski typeset err2="failed to delete VNIC: $vnic_info" 236c61a1653SRyan Zezeski 237c61a1653SRyan Zezeski if (($# != 3)); then 238c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 239c61a1653SRyan Zezeski fi 240c61a1653SRyan Zezeski 241c61a1653SRyan Zezeski dbg "assigning VNIC $name from $zone to GZ" 242*c3e16711SDominik Hassler if ! dladm set-linkprop -t -p zone=global $name; then 243*c3e16711SDominik Hassler maybe_fail "$err1" 244c61a1653SRyan Zezeski return 1 245c61a1653SRyan Zezeski fi 246c61a1653SRyan Zezeski 247c61a1653SRyan Zezeski dbg "deleting VNIC: $vnic_info" 248c61a1653SRyan Zezeski if dladm delete-vnic $name > /dev/null; then 249c61a1653SRyan Zezeski dbg "deleted VNIC: $vnic_info" 250c61a1653SRyan Zezeski return 0 251c61a1653SRyan Zezeski fi 252c61a1653SRyan Zezeski 253c61a1653SRyan Zezeski maybe_fail "$err2" 254c61a1653SRyan Zezeski} 255c61a1653SRyan Zezeski 256c61a1653SRyan Zezeskifunction create_addr 257c61a1653SRyan Zezeski{ 258c61a1653SRyan Zezeski typeset zone=$1 259c61a1653SRyan Zezeski typeset vnic=$2 260c61a1653SRyan Zezeski typeset ip=$3 261c61a1653SRyan Zezeski typeset ipname=${vnic}/v4 262c61a1653SRyan Zezeski 263c61a1653SRyan Zezeski if (($# != 3)); then 264c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 265c61a1653SRyan Zezeski fi 266c61a1653SRyan Zezeski 267c61a1653SRyan Zezeski if zlogin $zone ipadm create-addr -t -T static -a $ip \ 268c61a1653SRyan Zezeski $ipname > /dev/null 269c61a1653SRyan Zezeski then 270c61a1653SRyan Zezeski dbg "created addr $ipname ($ip) in zone $zone" 271c61a1653SRyan Zezeski return 0 272c61a1653SRyan Zezeski fi 273c61a1653SRyan Zezeski 274c61a1653SRyan Zezeski maybe_fail "failed to create addr $ipname ($ip) in zone $zone" 275c61a1653SRyan Zezeski} 276c61a1653SRyan Zezeski 277c61a1653SRyan Zezeskifunction create_addr6 278c61a1653SRyan Zezeski{ 279c61a1653SRyan Zezeski typeset zone=$1 280c61a1653SRyan Zezeski typeset vnic=$2 281c61a1653SRyan Zezeski typeset ip=$3 282c61a1653SRyan Zezeski typeset ll_name=${vnic}/v6 283c61a1653SRyan Zezeski typeset uni_name=${vnic}/v6add 284c61a1653SRyan Zezeski typeset err1="failed to create link-local addr $ll_name in zone $zone" 285c61a1653SRyan Zezeski typeset err2="failed to create unicast addr $uni_name in zone $zone" 286c61a1653SRyan Zezeski 287c61a1653SRyan Zezeski if (($# != 3)); then 288c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 289c61a1653SRyan Zezeski fi 290c61a1653SRyan Zezeski 291c61a1653SRyan Zezeski if zlogin $zone ipadm create-addr -t -T addrconf $ll_name; then 292c61a1653SRyan Zezeski dbg "created link-local addr $ll_name in zone $zone" 293c61a1653SRyan Zezeski else 294c61a1653SRyan Zezeski maybe_fail "$err1" 295c61a1653SRyan Zezeski return 1 296c61a1653SRyan Zezeski fi 297c61a1653SRyan Zezeski 298c61a1653SRyan Zezeski if zlogin $zone ipadm create-addr -t -T static -a $ip/64 $uni_name; then 299c61a1653SRyan Zezeski dbg "created unicast addr $uni_name in zone $zone" 300c61a1653SRyan Zezeski else 301c61a1653SRyan Zezeski maybe_fail "$err2" 302c61a1653SRyan Zezeski fi 303c61a1653SRyan Zezeski} 304c61a1653SRyan Zezeski 305c61a1653SRyan Zezeskifunction delete_addr 306c61a1653SRyan Zezeski{ 307c61a1653SRyan Zezeski typeset zone=$1 308c61a1653SRyan Zezeski typeset ifname=$2 309c61a1653SRyan Zezeski typeset version=$3 310c61a1653SRyan Zezeski typeset ipname=$ifname/$version 311c61a1653SRyan Zezeski 312c61a1653SRyan Zezeski if (($# != 3)); then 313c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 314c61a1653SRyan Zezeski fi 315c61a1653SRyan Zezeski 316c61a1653SRyan Zezeski if zlogin $zone ipadm show-addr $ipname > /dev/null 2>&1; then 317c61a1653SRyan Zezeski if zlogin $zone ipadm delete-addr $ipname > /dev/null; then 318c61a1653SRyan Zezeski dbg "deleted addr $ipname in zone $zone" 319c61a1653SRyan Zezeski else 320c61a1653SRyan Zezeski maybe_fail "failed to delete addr $ipname in zone $zone" 321c61a1653SRyan Zezeski return 1 322c61a1653SRyan Zezeski fi 323c61a1653SRyan Zezeski else 324c61a1653SRyan Zezeski dbg "addr $ipname doesn't exist in zone $zone" 325c61a1653SRyan Zezeski fi 326c61a1653SRyan Zezeski 327c61a1653SRyan Zezeski if [[ "v6" == "$version" ]]; then 328c61a1653SRyan Zezeski typeset ipname=$ifname/v6add 329c61a1653SRyan Zezeski typeset err="failed to delete addr $ipname in zone $zone" 330c61a1653SRyan Zezeski 331c61a1653SRyan Zezeski if zlogin $zone ipadm show-addr $ipname > /dev/null 2>&1; then 332c61a1653SRyan Zezeski if zlogin $zone ipadm delete-addr $ipname > /dev/null 333c61a1653SRyan Zezeski then 334c61a1653SRyan Zezeski dbg "deleted addr $ipname in zone $zone" 335c61a1653SRyan Zezeski else 336c61a1653SRyan Zezeski maybe_fail "$err" 337c61a1653SRyan Zezeski fi 338c61a1653SRyan Zezeski else 339c61a1653SRyan Zezeski dbg "addr $ipname doesn't exist in zone $zone" 340c61a1653SRyan Zezeski fi 341c61a1653SRyan Zezeski fi 342c61a1653SRyan Zezeski} 343c61a1653SRyan Zezeski 344c61a1653SRyan Zezeskifunction delete_if 345c61a1653SRyan Zezeski{ 346c61a1653SRyan Zezeski typeset zone=$1 347c61a1653SRyan Zezeski typeset ifname=$2 348c61a1653SRyan Zezeski typeset err="failed to delete interface $ifname in zone $zone" 349c61a1653SRyan Zezeski 350c61a1653SRyan Zezeski if (($# != 2)); then 351c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 352c61a1653SRyan Zezeski fi 353c61a1653SRyan Zezeski 354c61a1653SRyan Zezeski if zlogin $zone ipadm show-if $ifname > /dev/null 2>&1; then 355c61a1653SRyan Zezeski if zlogin $zone ipadm delete-if $ifname > /dev/null; then 356c61a1653SRyan Zezeski dbg "deleted interface $ifname in zone $zone" 357c61a1653SRyan Zezeski else 358c61a1653SRyan Zezeski maybe_fail "$err" 359c61a1653SRyan Zezeski fi 360c61a1653SRyan Zezeski else 361c61a1653SRyan Zezeski dbg "interface $ifname doesn't exist in zone $zone" 362c61a1653SRyan Zezeski fi 363c61a1653SRyan Zezeski} 364c61a1653SRyan Zezeski 365c61a1653SRyan Zezeskifunction ip_fwd_enable 366c61a1653SRyan Zezeski{ 367c61a1653SRyan Zezeski typeset zone=$1 368c61a1653SRyan Zezeski 369c61a1653SRyan Zezeski if (($# != 1)); then 370c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 371c61a1653SRyan Zezeski fi 372c61a1653SRyan Zezeski 373c61a1653SRyan Zezeski if zlogin $zone routeadm -p ipv4-forwarding | \ 374c61a1653SRyan Zezeski egrep 'current=enabled' > /dev/null 375c61a1653SRyan Zezeski then 376c61a1653SRyan Zezeski dbg "IPv4 forwarding already enabled for $zone" 377c61a1653SRyan Zezeski else 378c61a1653SRyan Zezeski if zlogin $zone routeadm -ue ipv4-forwarding; then 379c61a1653SRyan Zezeski dbg "enabled IPv4 forwarding for $zone" 380c61a1653SRyan Zezeski else 381c61a1653SRyan Zezeski maybe_fail "failed to enable IPv4 forwarding for $zone" 382c61a1653SRyan Zezeski return 1 383c61a1653SRyan Zezeski fi 384c61a1653SRyan Zezeski fi 385c61a1653SRyan Zezeski 386c61a1653SRyan Zezeski if zlogin $zone routeadm -p ipv6-forwarding | \ 387c61a1653SRyan Zezeski egrep 'current=enabled' > /dev/null 388c61a1653SRyan Zezeski then 389c61a1653SRyan Zezeski dbg "IPv6 forwarding already enabled for $zone" 390c61a1653SRyan Zezeski else 391c61a1653SRyan Zezeski if zlogin $zone routeadm -ue ipv6-forwarding; then 392c61a1653SRyan Zezeski dbg "enabled IPv6 forwarding for $zone" 393c61a1653SRyan Zezeski else 394c61a1653SRyan Zezeski maybe_fail "failed to enable IPv6 forwarding for $zone" 395c61a1653SRyan Zezeski fi 396c61a1653SRyan Zezeski fi 397c61a1653SRyan Zezeski} 398c61a1653SRyan Zezeski 399c61a1653SRyan Zezeskifunction ip_fwd_disable 400c61a1653SRyan Zezeski{ 401c61a1653SRyan Zezeski typeset zone=$1 402c61a1653SRyan Zezeski 403c61a1653SRyan Zezeski if (($# != 1)); then 404c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 405c61a1653SRyan Zezeski fi 406c61a1653SRyan Zezeski 407c61a1653SRyan Zezeski if zlogin $zone routeadm -p ipv4-forwarding | \ 408c61a1653SRyan Zezeski egrep 'current=disabled' > /dev/null 409c61a1653SRyan Zezeski then 410c61a1653SRyan Zezeski dbg "IPv4 forwarding already disabled for $zone" 411c61a1653SRyan Zezeski else 412c61a1653SRyan Zezeski if zlogin $zone routeadm -ud ipv4-forwarding; then 413c61a1653SRyan Zezeski dbg "disabled IPv4 forwarding in $zone" 414c61a1653SRyan Zezeski else 415c61a1653SRyan Zezeski maybe_fail "failed to disable IPv4 forwarding in $zone" 416c61a1653SRyan Zezeski return 1 417c61a1653SRyan Zezeski fi 418c61a1653SRyan Zezeski fi 419c61a1653SRyan Zezeski 420c61a1653SRyan Zezeski if zlogin $zone routeadm -p ipv6-forwarding | \ 421c61a1653SRyan Zezeski egrep 'current=disabled' > /dev/null 422c61a1653SRyan Zezeski then 423c61a1653SRyan Zezeski dbg "IPv6 forwarding already disabled for $zone" 424c61a1653SRyan Zezeski else 425c61a1653SRyan Zezeski if zlogin $zone routeadm -ud ipv6-forwarding; then 426c61a1653SRyan Zezeski dbg "disabled IPv6 forwarding in $zone" 427c61a1653SRyan Zezeski else 428c61a1653SRyan Zezeski maybe_fail "failed to disable IPv6 forwarding in $zone" 429c61a1653SRyan Zezeski fi 430c61a1653SRyan Zezeski fi 431c61a1653SRyan Zezeski} 432c61a1653SRyan Zezeski 433c61a1653SRyan Zezeskifunction add_route 434c61a1653SRyan Zezeski{ 435c61a1653SRyan Zezeski typeset zone=$1 436c61a1653SRyan Zezeski typeset dest=$2 437c61a1653SRyan Zezeski typeset net=$3 438c61a1653SRyan Zezeski typeset gateway=$4 439c61a1653SRyan Zezeski 440c61a1653SRyan Zezeski if (($# != 4)); then 441c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 442c61a1653SRyan Zezeski fi 443c61a1653SRyan Zezeski 444c61a1653SRyan Zezeski if zlogin $zone route -n add $net $gateway > /dev/null; then 445c61a1653SRyan Zezeski dbg "added route $gateway => $net to $zone" 446c61a1653SRyan Zezeski return 0 447c61a1653SRyan Zezeski fi 448c61a1653SRyan Zezeski 449c61a1653SRyan Zezeski maybe_fail "failed to add route $gateway => $net to $zone" 450c61a1653SRyan Zezeski} 451c61a1653SRyan Zezeski 452c61a1653SRyan Zezeskifunction add_route6 453c61a1653SRyan Zezeski{ 454c61a1653SRyan Zezeski typeset zone=$1 455c61a1653SRyan Zezeski typeset dest=$2 456c61a1653SRyan Zezeski typeset net=$3 457c61a1653SRyan Zezeski typeset gateway=$4 458c61a1653SRyan Zezeski 459c61a1653SRyan Zezeski if (($# != 4)); then 460c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 461c61a1653SRyan Zezeski fi 462c61a1653SRyan Zezeski 463c61a1653SRyan Zezeski if zlogin $zone route -n add -inet6 $net $gateway > /dev/null 464c61a1653SRyan Zezeski then 465c61a1653SRyan Zezeski dbg "added route $gateway => $net to $zone" 466c61a1653SRyan Zezeski return 0 467c61a1653SRyan Zezeski fi 468c61a1653SRyan Zezeski 469c61a1653SRyan Zezeski maybe_fail "failed to add route $gateway => $net to $zone" 470c61a1653SRyan Zezeski} 471c61a1653SRyan Zezeski 472c61a1653SRyan Zezeskifunction rm_route 473c61a1653SRyan Zezeski{ 474c61a1653SRyan Zezeski typeset zone=$1 475c61a1653SRyan Zezeski typeset dest=$2 476c61a1653SRyan Zezeski typeset net=$3 477c61a1653SRyan Zezeski typeset gateway=$4 478c61a1653SRyan Zezeski typeset gw=$(zlogin $zone route -n get $dest | \ 479c61a1653SRyan Zezeski grep gateway | awk '{ print $2 }') 480c61a1653SRyan Zezeski typeset err="failed to remove route $gateway => $net from $zone" 481c61a1653SRyan Zezeski 482c61a1653SRyan Zezeski if (($# != 4)); then 483c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 484c61a1653SRyan Zezeski fi 485c61a1653SRyan Zezeski 486c61a1653SRyan Zezeski if [[ "$gw" == "$gateway" ]]; then 487c61a1653SRyan Zezeski if zlogin $zone route -n delete $net $gateway > /dev/null 488c61a1653SRyan Zezeski then 489c61a1653SRyan Zezeski dbg "removed route $gateway => $net from $zone" 490c61a1653SRyan Zezeski else 491c61a1653SRyan Zezeski maybe_fail "$err" 492c61a1653SRyan Zezeski fi 493c61a1653SRyan Zezeski else 494c61a1653SRyan Zezeski dbg "$zone already lacked route $gateway => $net" 495c61a1653SRyan Zezeski fi 496c61a1653SRyan Zezeski} 497c61a1653SRyan Zezeski 498c61a1653SRyan Zezeskifunction rm_route6 499c61a1653SRyan Zezeski{ 500c61a1653SRyan Zezeski typeset zone=$1 501c61a1653SRyan Zezeski typeset dest=$2 502c61a1653SRyan Zezeski typeset net=$3 503c61a1653SRyan Zezeski typeset gateway=$4 504c61a1653SRyan Zezeski typeset gw=$(zlogin $zone route -n get -inet6 $dest | \ 505c61a1653SRyan Zezeski grep gateway | awk '{ print $2 }') 506c61a1653SRyan Zezeski typeset err="failed to remove route $gateway => $net from $zone" 507c61a1653SRyan Zezeski 508c61a1653SRyan Zezeski if (($# != 4)); then 509c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 510c61a1653SRyan Zezeski fi 511c61a1653SRyan Zezeski 512c61a1653SRyan Zezeski if [[ "$gw" == "$gateway" ]]; then 513c61a1653SRyan Zezeski if zlogin $zone route -n delete -inet6 $net $gateway > /dev/null 514c61a1653SRyan Zezeski then 515c61a1653SRyan Zezeski dbg "removed route $gateway => $net from $zone" 516c61a1653SRyan Zezeski else 517c61a1653SRyan Zezeski maybe_fail "$err" 518c61a1653SRyan Zezeski fi 519c61a1653SRyan Zezeski else 520c61a1653SRyan Zezeski dbg "$zone already lacked route $gateway => $net" 521c61a1653SRyan Zezeski fi 522c61a1653SRyan Zezeski} 523c61a1653SRyan Zezeski 524c61a1653SRyan Zezeskifunction set_linkprop 525c61a1653SRyan Zezeski{ 526c61a1653SRyan Zezeski typeset link=$1 527c61a1653SRyan Zezeski typeset prop=$2 528c61a1653SRyan Zezeski typeset val=$3 529c61a1653SRyan Zezeski typeset err="failed to set $link prop: $prop=$val" 530c61a1653SRyan Zezeski 531c61a1653SRyan Zezeski if (($# != 3)); then 532c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 533c61a1653SRyan Zezeski fi 534c61a1653SRyan Zezeski 535c61a1653SRyan Zezeski dbg "attempt to set $link prop: $prop=$val" 536c61a1653SRyan Zezeski if dladm set-linkprop -p $prop=$val $link; then 537c61a1653SRyan Zezeski dbg "set $link prop: $prop=$val" 538c61a1653SRyan Zezeski return 0 539c61a1653SRyan Zezeski fi 540c61a1653SRyan Zezeski 541c61a1653SRyan Zezeski maybe_fail "$err" 542c61a1653SRyan Zezeski} 543c61a1653SRyan Zezeski 544c61a1653SRyan Zezeskifunction ping 545c61a1653SRyan Zezeski{ 546c61a1653SRyan Zezeski typeset zone=$1 547c61a1653SRyan Zezeski typeset src=$2 548c61a1653SRyan Zezeski typeset dst=$3 549c61a1653SRyan Zezeski typeset info="$src -> $dst" 550c61a1653SRyan Zezeski 551c61a1653SRyan Zezeski if (($# != 3)); then 552c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 553c61a1653SRyan Zezeski fi 554c61a1653SRyan Zezeski 555c61a1653SRyan Zezeski dbg "ping: $info" 556c61a1653SRyan Zezeski if zlogin $zone ping $dst > /dev/null 2>&1; then 557c61a1653SRyan Zezeski dbg "successful ping: $info" 558c61a1653SRyan Zezeski return 0 559c61a1653SRyan Zezeski fi 560c61a1653SRyan Zezeski 561c61a1653SRyan Zezeski maybe_fail "could not ping: $info" 562c61a1653SRyan Zezeski} 563c61a1653SRyan Zezeski 564c61a1653SRyan Zezeskifunction ping_udp 565c61a1653SRyan Zezeski{ 566c61a1653SRyan Zezeski typeset client=$1 567c61a1653SRyan Zezeski typeset client_ip=$2 568c61a1653SRyan Zezeski typeset server_ip=$3 569c61a1653SRyan Zezeski typeset size=$4 570c61a1653SRyan Zezeski typeset num=$5 571c61a1653SRyan Zezeski typeset info="$client_ip -> $server_ip (size: $size)" 572c61a1653SRyan Zezeski 573c61a1653SRyan Zezeski if (($# != 5)); then 574c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 575c61a1653SRyan Zezeski fi 576c61a1653SRyan Zezeski 577c61a1653SRyan Zezeski dbg "UDP ping: $info" 578c61a1653SRyan Zezeski if zlogin $client ping -ns -U $server_ip $size $num > /dev/null; then 579c61a1653SRyan Zezeski dbg "UDP ping passed: $info" 580c61a1653SRyan Zezeski return 0 581c61a1653SRyan Zezeski fi 582c61a1653SRyan Zezeski 583c61a1653SRyan Zezeski maybe_fail "UDP ping failed: $info" 584c61a1653SRyan Zezeski} 585c61a1653SRyan Zezeski 586c61a1653SRyan Zezeskifunction start_server 587c61a1653SRyan Zezeski{ 588c61a1653SRyan Zezeski typeset zone=$1 589c61a1653SRyan Zezeski typeset type=$2 590c61a1653SRyan Zezeski typeset ip=$3 591c61a1653SRyan Zezeski typeset port=$4 592c61a1653SRyan Zezeski typeset ofile=$5 593c61a1653SRyan Zezeski 594c61a1653SRyan Zezeski if (($# != 5)); then 595c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 596c61a1653SRyan Zezeski fi 597c61a1653SRyan Zezeski 598c61a1653SRyan Zezeski dbg "start server $rfile" 599c61a1653SRyan Zezeski zlogin $zone \ 600c61a1653SRyan Zezeski /usr/bin/socat -u ${type}-LISTEN:$port,bind=[$ip],reuseaddr \ 601c61a1653SRyan Zezeski CREATE:$ofile & 602c61a1653SRyan Zezeski listener_ppid=$! 603c61a1653SRyan Zezeski dbg "listener PPID: $listener_ppid, zone $zone" 604c61a1653SRyan Zezeski} 605c61a1653SRyan Zezeski 606c61a1653SRyan Zezeskifunction wait_for_pid 607c61a1653SRyan Zezeski{ 608c61a1653SRyan Zezeski typeset pid=$1 609c61a1653SRyan Zezeski typeset seconds=$2 610c61a1653SRyan Zezeski typeset s=0 611c61a1653SRyan Zezeski 612c61a1653SRyan Zezeski if (($# != 2)); then 613c61a1653SRyan Zezeski fail "$0: incorrect number of args provided" 614c61a1653SRyan Zezeski fi 615c61a1653SRyan Zezeski 616c61a1653SRyan Zezeski while true; do 617c61a1653SRyan Zezeski if kill -0 $pid > /dev/null 2>&1; then 618c61a1653SRyan Zezeski if ((seconds == s)); then 619c61a1653SRyan Zezeski maybe_fail "timed out waiting for pid $pid" 620c61a1653SRyan Zezeski return 1 621c61a1653SRyan Zezeski fi 622c61a1653SRyan Zezeski dbg "waiting for pid $pid" 623c61a1653SRyan Zezeski sleep 1 624c61a1653SRyan Zezeski ((s++)) 625c61a1653SRyan Zezeski else 626c61a1653SRyan Zezeski return 0 627c61a1653SRyan Zezeski fi 628c61a1653SRyan Zezeski done 629c61a1653SRyan Zezeski} 630