set TEST_NAME_BASE "ipaddr" if {![installtest_p]} { untested $TEST_NAME_BASE; return } # nc server management variables set IPV4_ONLY -1 set nc_pipe 0 # Start an 'nc' server. To start an IPv4 server, pass 1 as the # argument. To start an IPv6 server, pass 0 as the argument. proc start_nc_server { IPV4 } { global TEST_NAME IPV4_ONLY nc_pipe if {$IPV4_ONLY < 0} { # First, does 'nc' exist on this system? if {[catch { exec which nc } res]} { fail "$TEST_NAME find 'nc'" return -1 } pass "$TEST_NAME find 'nc'" # Older versions of 'nc' (on RHEL4 for instance) don't support # IPv6. Does this 'nc' support IPv6? set IPV4_ONLY 0 if {[catch { exec sh -c "nc -h 2>&1 | grep -qi IPv6" } res]} { # If we're here, 'nc' doesn't support IPv6. So, it # supports IPv4 only. set IPV4_ONLY 1 } } # Figure out the 'nc' command line. if {$IPV4} { if {$IPV4_ONLY} { set nc_cmd "| nc -l localhost -p 8079" } else { set nc_cmd "| nc -l -4 localhost 8079" } } else { if {$IPV4_ONLY} { untested "$TEST_NAME starting IPv6 nc server" return -1 } set nc_cmd "| nc -l -6 localhost6 8079" } # Actually start the 'nc' server. verbose -log "starting $nc_cmd" if {[catch {open $nc_cmd} nc_pipe]} { verbose -log "nc command failed: $fl" fail "$TEST_NAME nc server start" return -1 } pass "$TEST_NAME nc server start" return 0 } # Stop the nc server. proc stop_nc_server {} { global TEST_NAME nc_pipe kill -INT [pid $nc_pipe] 5 catch { close $nc_pipe } res pass "$TEST_NAME nc server stop" return } # "load" generation function for stap_run. It runs a client version # of 'nc' and sends some IPv4 data through it. proc run_ipv4_client {} { global srcdir subdir global IPV4_ONLY catch { exec bash -c "cat $srcdir/$subdir/ipaddr.txt > /dev/tcp/127.0.0.1/8079" } return 0 } # "load" generation function for stap_run. It runs a client version # of 'nc' and sends some IPv6 data through it. proc run_ipv6_client {} { global srcdir subdir global IPV4_ONLY if {$IPV4_ONLY} { verbose -log "error: nc only supports IPv4" return 1 } catch { exec bash -c "cat $srcdir/$subdir/ipaddr.txt > /dev/tcp/::1/8079" } return 0 } # Start the 1st IPv4 test set TEST_NAME "${TEST_NAME_BASE}_IPv4_recvmsg" if {[start_nc_server 1]} { # If we couldn't start the server, we're done. return } set script_output "packets = \[0-9\]+\r\naddress errors = 0\r\nbad family errors = 0\r\n" stap_run $TEST_NAME run_ipv4_client $script_output $srcdir/$subdir/ipaddr1.stp # Stop/cleanup the IPv4 server. stop_nc_server # Start the 2nd IPv4 test set TEST_NAME "${TEST_NAME_BASE}_IPv4_receive" if {[start_nc_server 1]} { # If we couldn't start the server, we're done. return } stap_run $TEST_NAME run_ipv4_client $script_output $srcdir/$subdir/ipaddr2.stp # Stop/cleanup the IPv4 server stop_nc_server # Start the 1st IPv6 test set TEST_NAME "${TEST_NAME_BASE}_IPv6_recvmsg" if {[start_nc_server 0]} { # If we couldn't start the server, we're done. return } stap_run $TEST_NAME run_ipv6_client $script_output $srcdir/$subdir/ipaddr1.stp # Stop/cleanup the IPv6 server. stop_nc_server # Start the 2nd IPv6 test set TEST_NAME "${TEST_NAME_BASE}_IPv6_receive" if {[start_nc_server 0]} { # If we couldn't start the server, we're done. return } stap_run $TEST_NAME run_ipv6_client $script_output $srcdir/$subdir/ipaddr2.stp # Stop/cleanup the IPv6 server. stop_nc_server