1*c61a1653SRyan Zezeski#!/usr/bin/ksh 2*c61a1653SRyan Zezeski# 3*c61a1653SRyan Zezeski# This file and its contents are supplied under the terms of the 4*c61a1653SRyan Zezeski# Common Development and Distribution License ("CDDL"), version 1.0. 5*c61a1653SRyan Zezeski# You may only use this file in accordance with the terms of version 6*c61a1653SRyan Zezeski# 1.0 of the CDDL. 7*c61a1653SRyan Zezeski# 8*c61a1653SRyan Zezeski# A full copy of the text of the CDDL should have accompanied this 9*c61a1653SRyan Zezeski# source. A copy of the CDDL is also available via the Internet at 10*c61a1653SRyan Zezeski# http://www.illumos.org/license/CDDL. 11*c61a1653SRyan Zezeski 12*c61a1653SRyan Zezeski# 13*c61a1653SRyan Zezeski# Copyright 2019 Joyent, Inc. 14*c61a1653SRyan Zezeski# 15*c61a1653SRyan Zezeski 16*c61a1653SRyan Zezeski# 17*c61a1653SRyan Zezeski# Usage: 18*c61a1653SRyan Zezeski# 19*c61a1653SRyan Zezeski# ip_forwarding.ksh -bcflnpuv <client> <router> <server> 20*c61a1653SRyan Zezeski# 21*c61a1653SRyan Zezeski# Where client, router, and server are the names of three native 22*c61a1653SRyan Zezeski# zones. The user must create and start these zones; but other 23*c61a1653SRyan Zezeski# than that there is no special configuration required for them. 24*c61a1653SRyan Zezeski# 25*c61a1653SRyan Zezeski# -b Place server and router on same underlying simnet, causing 26*c61a1653SRyan Zezeski# them to talk via MAC-loopback. 27*c61a1653SRyan Zezeski# 28*c61a1653SRyan Zezeski# -c Run cleanup only. 29*c61a1653SRyan Zezeski# 30*c61a1653SRyan Zezeski# -f Enable Tx ULP hardware checksum. 31*c61a1653SRyan Zezeski# 32*c61a1653SRyan Zezeski# -l Enable TCP LSO. 33*c61a1653SRyan Zezeski# 34*c61a1653SRyan Zezeski# -n No cleanup: the various artifacts created by this script will 35*c61a1653SRyan Zezeski# remain after execution. 36*c61a1653SRyan Zezeski# 37*c61a1653SRyan Zezeski# -p Enabled partial Tx ULP hardware checksum. 38*c61a1653SRyan Zezeski# 39*c61a1653SRyan Zezeski# -r Enable Rx IPv4 header checksum offload. 40*c61a1653SRyan Zezeski# 41*c61a1653SRyan Zezeski# -u Run UDP tests. 42*c61a1653SRyan Zezeski# 43*c61a1653SRyan Zezeski# -v Vebose mode. 44*c61a1653SRyan Zezeski# 45*c61a1653SRyan Zezeski 46*c61a1653SRyan Zezeskiif [[ -z $NET_TESTS ]]; then 47*c61a1653SRyan Zezeski echo "NET_TESTS not set" >&2 48*c61a1653SRyan Zezeski exit 1 49*c61a1653SRyan Zezeskifi 50*c61a1653SRyan Zezeski 51*c61a1653SRyan Zezeski. $NET_TESTS/tests/net_common 52*c61a1653SRyan Zezeski 53*c61a1653SRyan Zezeskifunction cleanup 54*c61a1653SRyan Zezeski{ 55*c61a1653SRyan Zezeski if ((nt_cleanup == 0)); then 56*c61a1653SRyan Zezeski dbg "skipping cleanup" 57*c61a1653SRyan Zezeski return 0 58*c61a1653SRyan Zezeski fi 59*c61a1653SRyan Zezeski 60*c61a1653SRyan Zezeski rm -rf ${nt_tdirprefix}* 61*c61a1653SRyan Zezeski zlogin $nt_client rm -rf ${nt_tdirprefix}* 62*c61a1653SRyan Zezeski zlogin $nt_server rm -rf ${nt_tdirprefix}* 63*c61a1653SRyan Zezeski 64*c61a1653SRyan Zezeski rm_route $nt_client $nt_server_ip $nt_server_subnet $nt_client_router_ip 65*c61a1653SRyan Zezeski rm_route $nt_server $nt_client_ip $nt_client_subnet $nt_server_router_ip 66*c61a1653SRyan Zezeski rm_route6 $nt_client $nt_server_ip6 $nt_server_subnet6 \ 67*c61a1653SRyan Zezeski $nt_client_router_ip6 68*c61a1653SRyan Zezeski rm_route6 $nt_server $nt_client_ip6 $nt_client_subnet6 \ 69*c61a1653SRyan Zezeski $nt_server_router_ip6 70*c61a1653SRyan Zezeski 71*c61a1653SRyan Zezeski ip_fwd_disable $nt_router 72*c61a1653SRyan Zezeski 73*c61a1653SRyan Zezeski delete_addr $nt_client ipft_client0 v4 74*c61a1653SRyan Zezeski delete_addr $nt_router ipft_client_r0 v4 75*c61a1653SRyan Zezeski delete_addr $nt_router ipft_server_r0 v4 76*c61a1653SRyan Zezeski delete_addr $nt_server ipft_server0 v4 77*c61a1653SRyan Zezeski 78*c61a1653SRyan Zezeski delete_addr $nt_client ipft_client0 v6 79*c61a1653SRyan Zezeski delete_addr $nt_router ipft_client_r0 v6 80*c61a1653SRyan Zezeski delete_addr $nt_router ipft_server_r0 v6 81*c61a1653SRyan Zezeski delete_addr $nt_server ipft_server0 v6 82*c61a1653SRyan Zezeski 83*c61a1653SRyan Zezeski delete_if $nt_client ipft_client0 84*c61a1653SRyan Zezeski delete_if $nt_router ipft_client_r0 85*c61a1653SRyan Zezeski delete_if $nt_router ipft_server_r0 86*c61a1653SRyan Zezeski delete_if $nt_server ipft_server0 87*c61a1653SRyan Zezeski 88*c61a1653SRyan Zezeski delete_vnic ipft_client0 0 $nt_client 89*c61a1653SRyan Zezeski delete_vnic ipft_client_r0 0 $nt_router 90*c61a1653SRyan Zezeski delete_vnic ipft_server_r0 5 $nt_router 91*c61a1653SRyan Zezeski delete_vnic ipft_server0 5 $nt_server 92*c61a1653SRyan Zezeski 93*c61a1653SRyan Zezeski for nt_name in ${nt_nics[@]}; do 94*c61a1653SRyan Zezeski delete_simnet $nt_name 95*c61a1653SRyan Zezeski done 96*c61a1653SRyan Zezeski} 97*c61a1653SRyan Zezeski 98*c61a1653SRyan Zezeskifunction usage 99*c61a1653SRyan Zezeski{ 100*c61a1653SRyan Zezeski echo "$nt_tname -bcflnpruv <client> <router> <server>" >&2 101*c61a1653SRyan Zezeski} 102*c61a1653SRyan Zezeski 103*c61a1653SRyan Zezeski# 104*c61a1653SRyan Zezeski# Set test defaults. 105*c61a1653SRyan Zezeski# 106*c61a1653SRyan Zezeskint_tname=${NT_TNAME:-$(basename $0)} 107*c61a1653SRyan Zezeskint_loopback=0 108*c61a1653SRyan Zezeskint_ulp_full=0 109*c61a1653SRyan Zezeskint_ulp_partial=0 110*c61a1653SRyan Zezeskint_tcp_lso=0 111*c61a1653SRyan Zezeskint_udp=0 112*c61a1653SRyan Zezeskint_rx_ip_cksum=0 113*c61a1653SRyan Zezeskint_cleanup=1 114*c61a1653SRyan Zezeskint_cleanup_only=0 115*c61a1653SRyan Zezeski 116*c61a1653SRyan Zezeskint_tdirprefix=/var/tmp/${nt_tname} 117*c61a1653SRyan Zezeskint_tdir=${nt_tdirprefix}.$$ 118*c61a1653SRyan Zezeskint_dfile=${nt_tdir}/${nt_tname}.data 119*c61a1653SRyan Zezeskint_efile=${nt_tdir}/${nt_tname}-expected-sha1 120*c61a1653SRyan Zezeskint_rfile=${nt_tdir}/${nt_tname}-received-sha1 121*c61a1653SRyan Zezeskint_ofile=${nt_tdir}/${nt_tname}-received 122*c61a1653SRyan Zezeskint_client_subnet=192.168.77.0/24 123*c61a1653SRyan Zezeskint_client_ip=192.168.77.2 124*c61a1653SRyan Zezeskint_client_router_ip=192.168.77.1 125*c61a1653SRyan Zezeskint_server_subnet=192.168.88.0/24 126*c61a1653SRyan Zezeskint_server_ip=192.168.88.2 127*c61a1653SRyan Zezeskint_server_router_ip=192.168.88.1 128*c61a1653SRyan Zezeskint_port=7774 129*c61a1653SRyan Zezeskint_client_subnet6=fd00:0:1:4d::2/64 130*c61a1653SRyan Zezeskint_client_ip6=fd00:0:1:4d::2 131*c61a1653SRyan Zezeskint_client_router_ip6=fd00:0:1:4d::1 132*c61a1653SRyan Zezeskint_server_subnet6=fd00:0:1:58::/64 133*c61a1653SRyan Zezeskint_server_router_ip6=fd00:0:1:58::1 134*c61a1653SRyan Zezeskint_server_ip6=fd00:0:1:58::2 135*c61a1653SRyan Zezeskint_port6=7776 136*c61a1653SRyan Zezeskint_bridge=ipft_switch 137*c61a1653SRyan Zezeskitypeset -A nt_nics 138*c61a1653SRyan Zezeski 139*c61a1653SRyan Zezeskiwhile getopts "bcflnpruv" opt; do 140*c61a1653SRyan Zezeski case $opt in 141*c61a1653SRyan Zezeski b) 142*c61a1653SRyan Zezeski nt_loopback=1 143*c61a1653SRyan Zezeski ;; 144*c61a1653SRyan Zezeski c) 145*c61a1653SRyan Zezeski nt_cleanup_only=1 146*c61a1653SRyan Zezeski ;; 147*c61a1653SRyan Zezeski f) 148*c61a1653SRyan Zezeski nt_ulp_full=1 149*c61a1653SRyan Zezeski ;; 150*c61a1653SRyan Zezeski l) 151*c61a1653SRyan Zezeski nt_tcp_lso=1 152*c61a1653SRyan Zezeski ;; 153*c61a1653SRyan Zezeski n) 154*c61a1653SRyan Zezeski nt_cleanup=0 155*c61a1653SRyan Zezeski ;; 156*c61a1653SRyan Zezeski p) 157*c61a1653SRyan Zezeski nt_ulp_partial=1 158*c61a1653SRyan Zezeski ;; 159*c61a1653SRyan Zezeski r) 160*c61a1653SRyan Zezeski nt_rx_ip_cksum=1 161*c61a1653SRyan Zezeski ;; 162*c61a1653SRyan Zezeski u) 163*c61a1653SRyan Zezeski nt_udp=1 164*c61a1653SRyan Zezeski ;; 165*c61a1653SRyan Zezeski v) 166*c61a1653SRyan Zezeski DEBUG=1 167*c61a1653SRyan Zezeski ;; 168*c61a1653SRyan Zezeski esac 169*c61a1653SRyan Zezeskidone 170*c61a1653SRyan Zezeski 171*c61a1653SRyan Zezeskishift $((OPTIND - 1)) 172*c61a1653SRyan Zezeski 173*c61a1653SRyan Zezeskiif ((nt_ulp_partial == 1)) && ((nt_ulp_full == 1)); then 174*c61a1653SRyan Zezeski fail "both partial and full checksum enabled" 175*c61a1653SRyan Zezeskifi 176*c61a1653SRyan Zezeski 177*c61a1653SRyan Zezeskiif (( $# != 3 )); then 178*c61a1653SRyan Zezeski usage 179*c61a1653SRyan Zezeski fail "wrong number of arguments" 180*c61a1653SRyan Zezeskifi 181*c61a1653SRyan Zezeski 182*c61a1653SRyan Zezeskint_client=$1 183*c61a1653SRyan Zezeskint_router=$2 184*c61a1653SRyan Zezeskint_server=$3 185*c61a1653SRyan Zezeski 186*c61a1653SRyan Zezeskiif [[ "$nt_client" == "$nt_router" || "$nt_router" == "$nt_server" || 187*c61a1653SRyan Zezeski "$nt_client" == "$nt_server" ]]; then 188*c61a1653SRyan Zezeski fail "all zones must be unique" 189*c61a1653SRyan Zezeskifi 190*c61a1653SRyan Zezeski 191*c61a1653SRyan Zezeskidbg "client zone: $nt_client" 192*c61a1653SRyan Zezeskidbg "router zone: $nt_router" 193*c61a1653SRyan Zezeskidbg "server zone: $nt_server" 194*c61a1653SRyan Zezeski 195*c61a1653SRyan ZezeskiBAIL=1 196*c61a1653SRyan Zezeskizone_exists $nt_client || fail "zone $nt_client not found" 197*c61a1653SRyan Zezeskizone_exists $nt_router || fail "zone $nt_router not found" 198*c61a1653SRyan Zezeskizone_exists $nt_server || fail "zone $nt_server not found" 199*c61a1653SRyan Zezeski 200*c61a1653SRyan Zezeskizone_running $nt_client 201*c61a1653SRyan Zezeskizone_running $nt_router 202*c61a1653SRyan Zezeskizone_running $nt_server 203*c61a1653SRyan Zezeski 204*c61a1653SRyan Zezeskiif ! zlogin $nt_client ls /usr/bin/socat > /dev/null; then 205*c61a1653SRyan Zezeski fail "zone $nt_client missing socat" 206*c61a1653SRyan Zezeskifi 207*c61a1653SRyan Zezeski 208*c61a1653SRyan Zezeskiif ! zlogin $nt_server ls /usr/bin/socat > /dev/null; then 209*c61a1653SRyan Zezeski fail "zone $nt_client missing socat" 210*c61a1653SRyan Zezeskifi 211*c61a1653SRyan Zezeski 212*c61a1653SRyan Zezeskiif ((nt_loopback == 0)); then 213*c61a1653SRyan Zezeski nt_nics[0]=ipft_client_nic0 214*c61a1653SRyan Zezeski nt_nics[1]=ipft_router_nic0 215*c61a1653SRyan Zezeski nt_nics[2]=ipft_router_nic1 216*c61a1653SRyan Zezeski nt_nics[3]=ipft_server_nic0 217*c61a1653SRyan Zezeskielse 218*c61a1653SRyan Zezeski nt_nics[0]=ipft_nic0 219*c61a1653SRyan Zezeski nt_nics[1]=ipft_nic1 220*c61a1653SRyan Zezeskifi 221*c61a1653SRyan Zezeski 222*c61a1653SRyan Zezeski# 223*c61a1653SRyan Zezeski# Make a best effort to cleanup artifacts from a previous run. 224*c61a1653SRyan Zezeski# 225*c61a1653SRyan Zezeskiif ((nt_cleanup_only == 1)); then 226*c61a1653SRyan Zezeski dbg "performing cleanup only" 227*c61a1653SRyan Zezeski BAIL=0 228*c61a1653SRyan Zezeski cleanup 229*c61a1653SRyan Zezeski BAIL=1 230*c61a1653SRyan Zezeski exit 0 231*c61a1653SRyan Zezeskifi 232*c61a1653SRyan Zezeski 233*c61a1653SRyan Zezeskiif ! mkdir $nt_tdir; then 234*c61a1653SRyan Zezeski fail "failed to mkdir $nt_tdir in GZ" 235*c61a1653SRyan Zezeskifi 236*c61a1653SRyan Zezeskidbg "created dir $nt_tdir in GZ" 237*c61a1653SRyan Zezeskiif ! zlogin $nt_client mkdir $nt_tdir; then 238*c61a1653SRyan Zezeski fail "failed to mkdir $nt_tdir in $nt_client" 239*c61a1653SRyan Zezeskifi 240*c61a1653SRyan Zezeskidbg "created dir $nt_tdir in $nt_client" 241*c61a1653SRyan Zezeskiif ! zlogin $nt_server mkdir $nt_tdir; then 242*c61a1653SRyan Zezeski fail "failed to mkdir $nt_tdir in $nt_server" 243*c61a1653SRyan Zezeskifi 244*c61a1653SRyan Zezeskidbg "created dir $nt_tdir in $nt_server" 245*c61a1653SRyan Zezeski 246*c61a1653SRyan Zezeskitrap cleanup ERR 247*c61a1653SRyan Zezeski 248*c61a1653SRyan Zezeskifor nt_name in ${nt_nics[@]}; do 249*c61a1653SRyan Zezeski create_simnet $nt_name 250*c61a1653SRyan Zezeskidone 251*c61a1653SRyan Zezeski 252*c61a1653SRyan Zezeskiif ((nt_loopback == 0)); then 253*c61a1653SRyan Zezeski link_simnets ${nt_nics[0]} ${nt_nics[1]} 254*c61a1653SRyan Zezeski link_simnets ${nt_nics[2]} ${nt_nics[3]} 255*c61a1653SRyan Zezeskielse 256*c61a1653SRyan Zezeski link_simnets ${nt_nics[0]} ${nt_nics[1]} 257*c61a1653SRyan Zezeskifi 258*c61a1653SRyan Zezeski 259*c61a1653SRyan Zezeskifor nt_name in ${nt_nics[@]}; do 260*c61a1653SRyan Zezeski if ((nt_ulp_partial == 1)); then 261*c61a1653SRyan Zezeski set_linkprop $nt_name _tx_ulp_cksum partial 262*c61a1653SRyan Zezeski fi 263*c61a1653SRyan Zezeski 264*c61a1653SRyan Zezeski if ((nt_ulp_full == 1)); then 265*c61a1653SRyan Zezeski set_linkprop $nt_name _tx_ulp_cksum fullv4 266*c61a1653SRyan Zezeski fi 267*c61a1653SRyan Zezeski 268*c61a1653SRyan Zezeski if ((nt_ulp_full == 1)) || ((nt_ulp_partial == 1)); then 269*c61a1653SRyan Zezeski set_linkprop $nt_name _tx_ipv4_cksum on 270*c61a1653SRyan Zezeski fi 271*c61a1653SRyan Zezeski 272*c61a1653SRyan Zezeski if ((nt_tcp_lso == 1)); then 273*c61a1653SRyan Zezeski set_linkprop $nt_name _lso on 274*c61a1653SRyan Zezeski fi 275*c61a1653SRyan Zezeski 276*c61a1653SRyan Zezeski if ((nt_rx_ip_cksum == 1)); then 277*c61a1653SRyan Zezeski set_linkprop $nt_name _rx_ipv4_cksum on 278*c61a1653SRyan Zezeski fi 279*c61a1653SRyan Zezeskidone 280*c61a1653SRyan Zezeski 281*c61a1653SRyan Zezeskiif ((nt_loopback == 0)); then 282*c61a1653SRyan Zezeski create_vnic ipft_client0 ipft_client_nic0 0 $nt_client 283*c61a1653SRyan Zezeski create_vnic ipft_client_r0 ipft_router_nic0 0 $nt_router 284*c61a1653SRyan Zezeski create_vnic ipft_server_r0 ipft_router_nic1 5 $nt_router 285*c61a1653SRyan Zezeski create_vnic ipft_server0 ipft_server_nic0 5 $nt_server 286*c61a1653SRyan Zezeskielse 287*c61a1653SRyan Zezeski create_vnic ipft_client0 ipft_nic0 0 $nt_client 288*c61a1653SRyan Zezeski create_vnic ipft_client_r0 ipft_nic1 0 $nt_router 289*c61a1653SRyan Zezeski create_vnic ipft_server_r0 ipft_nic1 5 $nt_router 290*c61a1653SRyan Zezeski create_vnic ipft_server0 ipft_nic1 5 $nt_server 291*c61a1653SRyan Zezeskifi 292*c61a1653SRyan Zezeski 293*c61a1653SRyan Zezeskiip_fwd_enable $nt_router 294*c61a1653SRyan Zezeski 295*c61a1653SRyan Zezeskicreate_addr $nt_client ipft_client0 $nt_client_ip/24 296*c61a1653SRyan Zezeskicreate_addr $nt_router ipft_client_r0 $nt_client_router_ip/24 297*c61a1653SRyan Zezeskicreate_addr $nt_router ipft_server_r0 $nt_server_router_ip/24 298*c61a1653SRyan Zezeskicreate_addr $nt_server ipft_server0 $nt_server_ip/24 299*c61a1653SRyan Zezeski 300*c61a1653SRyan Zezeskiadd_route $nt_client $nt_server_ip $nt_server_subnet $nt_client_router_ip 301*c61a1653SRyan Zezeskiadd_route $nt_server $nt_client_ip $nt_client_subnet $nt_server_router_ip 302*c61a1653SRyan Zezeski 303*c61a1653SRyan Zezeskicreate_addr6 $nt_client ipft_client0 $nt_client_ip6 304*c61a1653SRyan Zezeskicreate_addr6 $nt_router ipft_client_r0 $nt_client_router_ip6 305*c61a1653SRyan Zezeskicreate_addr6 $nt_router ipft_server_r0 $nt_server_router_ip6 306*c61a1653SRyan Zezeskicreate_addr6 $nt_server ipft_server0 $nt_server_ip6 307*c61a1653SRyan Zezeski 308*c61a1653SRyan Zezeskiadd_route6 $nt_client $nt_server_ip6 $nt_server_subnet6 $nt_client_router_ip6 309*c61a1653SRyan Zezeskiadd_route6 $nt_server $nt_client_ip6 $nt_client_subnet6 $nt_server_router_ip6 310*c61a1653SRyan Zezeski 311*c61a1653SRyan Zezeskidd if=/dev/urandom of=$nt_dfile bs=1024 count=1024 > /dev/null 2>&1 312*c61a1653SRyan Zezeskiif (($? != 0)); then 313*c61a1653SRyan Zezeski fail "failed to create data file: $nt_dfile" 314*c61a1653SRyan Zezeskielse 315*c61a1653SRyan Zezeski dbg "created data file: $nt_dfile" 316*c61a1653SRyan Zezeskifi 317*c61a1653SRyan Zezeski 318*c61a1653SRyan Zezeskidigest -a sha1 $nt_dfile > $nt_efile 319*c61a1653SRyan Zezeski 320*c61a1653SRyan Zezeski# ================================================================ 321*c61a1653SRyan Zezeski# client -> server 322*c61a1653SRyan Zezeski# ================================================================ 323*c61a1653SRyan Zezeskiping $nt_client $nt_client_ip $nt_server_ip 324*c61a1653SRyan Zezeskiping $nt_client $nt_client_ip6 $nt_server_ip6 325*c61a1653SRyan Zezeski 326*c61a1653SRyan Zezeskistart_server $nt_server TCP4 $nt_server_ip $nt_port $nt_ofile 327*c61a1653SRyan Zezeskint_listener_ppid=$! 328*c61a1653SRyan Zezeski 329*c61a1653SRyan Zezeski# Give the server time to start. 330*c61a1653SRyan Zezeskisleep 1 331*c61a1653SRyan Zezeski 332*c61a1653SRyan Zezeskidbg "sending 1M $nt_client ($nt_client_ip) -> $nt_server ($nt_server_ip)" 333*c61a1653SRyan Zezeskizlogin $nt_client /usr/bin/socat -b 8192 STDIN \ 334*c61a1653SRyan Zezeski TCP4:$nt_server_ip:$nt_port,connect-timeout=5 < $nt_dfile 335*c61a1653SRyan Zezeski 336*c61a1653SRyan Zezeskiif (($? != 0)); then 337*c61a1653SRyan Zezeski pkill -TERM -P $nt_listener_ppid 338*c61a1653SRyan Zezeski fail "failed to run socat client" 339*c61a1653SRyan Zezeskielse 340*c61a1653SRyan Zezeski dbg "sent 1M $nt_client ($nt_client_ip) -> $nt_server ($nt_server_ip)" 341*c61a1653SRyan Zezeskifi 342*c61a1653SRyan Zezeski 343*c61a1653SRyan Zezeski# 344*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to 345*c61a1653SRyan Zezeski# exit and finish computing the SHA1. 346*c61a1653SRyan Zezeski# 347*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid" 348*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5 349*c61a1653SRyan Zezeskidbg "listener $nt_listener_ppid exited" 350*c61a1653SRyan Zezeski 351*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_server/root/$nt_ofile > $nt_rfile 352*c61a1653SRyan Zezeski 353*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then 354*c61a1653SRyan Zezeski fail "SHA1 comparison failed" 355*c61a1653SRyan Zezeskielse 356*c61a1653SRyan Zezeski dbg "SHA1 comparison passed" 357*c61a1653SRyan Zezeskifi 358*c61a1653SRyan Zezeski 359*c61a1653SRyan Zezeskistart_server $nt_server TCP6 $nt_server_ip6 $nt_port6 $nt_rfile 360*c61a1653SRyan Zezeskilistener_ppid=$! 361*c61a1653SRyan Zezeski 362*c61a1653SRyan Zezeski# Give the server time to start. 363*c61a1653SRyan Zezeskisleep 1 364*c61a1653SRyan Zezeski 365*c61a1653SRyan Zezeskizlogin $nt_client /usr/bin/socat -b 8192 STDIN \ 366*c61a1653SRyan Zezeski TCP6:[${nt_server_ip6}]:$nt_port6,connect-timeout=5 < $nt_dfile 367*c61a1653SRyan Zezeski 368*c61a1653SRyan Zezeskiif (($? != 0)); then 369*c61a1653SRyan Zezeski pkill -TERM -P $nt_listener_ppid 370*c61a1653SRyan Zezeski fail "failed to run socat client IPv6" 371*c61a1653SRyan Zezeskielse 372*c61a1653SRyan Zezeski dbg "sent 1M $nt_client ($nt_client_ip6)" \ 373*c61a1653SRyan Zezeski "-> $nt_server ($nt_server_ip6) IPv6" 374*c61a1653SRyan Zezeskifi 375*c61a1653SRyan Zezeski 376*c61a1653SRyan Zezeski# 377*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to 378*c61a1653SRyan Zezeski# exit and finish computing the SHA1. 379*c61a1653SRyan Zezeski# 380*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid" 381*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5 382*c61a1653SRyan Zezeskidbg "listener $nt_listener_ppid exited" 383*c61a1653SRyan Zezeski 384*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_server/root/$nt_ofile > $nt_rfile 385*c61a1653SRyan Zezeski 386*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then 387*c61a1653SRyan Zezeski fail "SHA1 comparison failed" 388*c61a1653SRyan Zezeskielse 389*c61a1653SRyan Zezeski dbg "SHA1 comparison passed" 390*c61a1653SRyan Zezeskifi 391*c61a1653SRyan Zezeski 392*c61a1653SRyan Zezeskiif ((nt_udp == 1)); then 393*c61a1653SRyan Zezeski ping_udp $nt_client $nt_client_ip $nt_server_ip 256 3 394*c61a1653SRyan Zezeski ping_udp $nt_client $nt_client_ip6 $nt_server_ip6 256 3 395*c61a1653SRyan Zezeski 396*c61a1653SRyan Zezeski # 397*c61a1653SRyan Zezeski # Test IP fragmentation by sending a larger-than-MTU datagram. 398*c61a1653SRyan Zezeski # You can verify fragmentation is happening by dtracing the 399*c61a1653SRyan Zezeski # various "Frag" and "Reasm" mibs. 400*c61a1653SRyan Zezeski # 401*c61a1653SRyan Zezeski dbg "test IP fragmentation $nt_client_ip -> $nt_server_ip" 402*c61a1653SRyan Zezeski ping_udp $nt_client $nt_client_ip $nt_server_ip $((1024 * 16)) 3 403*c61a1653SRyan Zezeski 404*c61a1653SRyan Zezeski dbg "test IPv6 fragmentation $nt_client_ip6 -> $nt_server_ip6" 405*c61a1653SRyan Zezeski ping_udp $nt_client $nt_client_ip6 $nt_server_ip6 $((1024 * 16)) 3 406*c61a1653SRyan Zezeskifi 407*c61a1653SRyan Zezeski 408*c61a1653SRyan Zezeski# ================================================================ 409*c61a1653SRyan Zezeski# server -> client 410*c61a1653SRyan Zezeski# ================================================================ 411*c61a1653SRyan Zezeskiping $nt_server $nt_server_ip $nt_client_ip 412*c61a1653SRyan Zezeskiping $nt_server $nt_server_ip6 $nt_client_ip6 413*c61a1653SRyan Zezeski 414*c61a1653SRyan Zezeskistart_server $nt_client TCP4 $nt_client_ip $nt_port $nt_ofile 415*c61a1653SRyan Zezeskint_listener_ppid=$! 416*c61a1653SRyan Zezeski 417*c61a1653SRyan Zezeski# Give the listener time to start. 418*c61a1653SRyan Zezeskisleep 1 419*c61a1653SRyan Zezeski 420*c61a1653SRyan Zezeskizlogin $nt_server /usr/bin/socat -b 8192 STDIN \ 421*c61a1653SRyan Zezeski TCP4:$nt_client_ip:$nt_port,bind=$nt_server_ip,connect-timeout=5 \ 422*c61a1653SRyan Zezeski < $nt_dfile 423*c61a1653SRyan Zezeski 424*c61a1653SRyan Zezeskiif (($? != 0)); then 425*c61a1653SRyan Zezeski pkill -TERM -P $nt_listener_ppid 426*c61a1653SRyan Zezeski fail "failed to run socat client" 427*c61a1653SRyan Zezeskielse 428*c61a1653SRyan Zezeski dbg "sent 1M $nt_server ($nt_server_ip) -> $nt_client ($nt_client_ip)" 429*c61a1653SRyan Zezeskifi 430*c61a1653SRyan Zezeski 431*c61a1653SRyan Zezeski# 432*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to 433*c61a1653SRyan Zezeski# exit and finish computing the SHA1. 434*c61a1653SRyan Zezeski# 435*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid" 436*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5 437*c61a1653SRyan Zezeskidbg "listener $nt_listener_ppid exited" 438*c61a1653SRyan Zezeski 439*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_client/root/$nt_ofile > $nt_rfile 440*c61a1653SRyan Zezeski 441*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then 442*c61a1653SRyan Zezeski fail "SHA1 comparison failed" 443*c61a1653SRyan Zezeskielse 444*c61a1653SRyan Zezeski dbg "SHA1 comparison passed" 445*c61a1653SRyan Zezeskifi 446*c61a1653SRyan Zezeski 447*c61a1653SRyan Zezeskistart_server $nt_client TCP6 $nt_client_ip6 $nt_port6 $nt_ofile 448*c61a1653SRyan Zezeskint_listener_ppid=$! 449*c61a1653SRyan Zezeski 450*c61a1653SRyan Zezeski# Give the listener time to start. 451*c61a1653SRyan Zezeskisleep 1 452*c61a1653SRyan Zezeski 453*c61a1653SRyan Zezeskizlogin $nt_server /usr/bin/socat -b 8192 STDIN \ 454*c61a1653SRyan Zezeski TCP6:[$nt_client_ip6]:$nt_port6,connect-timeout=5 < $nt_dfile 455*c61a1653SRyan Zezeski 456*c61a1653SRyan Zezeskiif (($? != 0)); then 457*c61a1653SRyan Zezeski pkill -TERM -P $nt_listener_ppid 458*c61a1653SRyan Zezeski fail "failed to run socat client IPv6" 459*c61a1653SRyan Zezeskielse 460*c61a1653SRyan Zezeski dbg "sent 1M $nt_server ($nt_server_ip6) -> $nt_client ($nt_client_ip6)" 461*c61a1653SRyan Zezeskifi 462*c61a1653SRyan Zezeski 463*c61a1653SRyan Zezeski# 464*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to 465*c61a1653SRyan Zezeski# exit and finish computing the SHA1. 466*c61a1653SRyan Zezeski# 467*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid" 468*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5 469*c61a1653SRyan Zezeskidbg "server $nt_listener_ppid exited" 470*c61a1653SRyan Zezeski 471*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_client/root/$nt_ofile > $nt_rfile 472*c61a1653SRyan Zezeski 473*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then 474*c61a1653SRyan Zezeski fail "SHA1 comparison failed" 475*c61a1653SRyan Zezeskielse 476*c61a1653SRyan Zezeski dbg "SHA1 comparison passed" 477*c61a1653SRyan Zezeskifi 478*c61a1653SRyan Zezeski 479*c61a1653SRyan Zezeskiif ((nt_udp == 1)); then 480*c61a1653SRyan Zezeski ping_udp $nt_server $nt_server_ip $nt_client_ip 256 3 481*c61a1653SRyan Zezeski ping_udp $nt_server $nt_server_ip6 $nt_client_ip6 256 3 482*c61a1653SRyan Zezeski 483*c61a1653SRyan Zezeski # 484*c61a1653SRyan Zezeski # Test IP fragmentation by sending a larger-than-MTU datagram. 485*c61a1653SRyan Zezeski # You can verify fragmentation is happening by dtracing the 486*c61a1653SRyan Zezeski # various "Frag" and "Reasm" mibs. 487*c61a1653SRyan Zezeski # 488*c61a1653SRyan Zezeski dbg "test IP fragmentation $nt_server_ip -> $nt_client_ip" 489*c61a1653SRyan Zezeski ping_udp $nt_server $nt_server_ip $nt_client_ip $((1024 * 16)) 3 490*c61a1653SRyan Zezeski 491*c61a1653SRyan Zezeski dbg "test IPv6 fragmentation $nt_server_ip6 -> $nt_client_ip6" 492*c61a1653SRyan Zezeski ping_udp $nt_server $nt_server_ip6 $nt_client_ip6 $((1024 * 16)) 3 493*c61a1653SRyan Zezeskifi 494*c61a1653SRyan Zezeski 495*c61a1653SRyan Zezeskicleanup 496*c61a1653SRyan Zezeskiecho "PASS [$nt_tname]" 497