Home | History | Annotate | Download | only in ns-tools
      1 #!/bin/sh
      2 # Copyright (c) International Business Machines  Corp., 2006
      3 # Copyright (c) 2015-2017 Oracle and/or its affiliates. All Rights Reserved.
      4 # Copyright (c) 2017 Petr Vorel <pvorel (at] suse.cz>
      5 #
      6 # This program is free software; you can redistribute it and/or
      7 # modify it under the terms of the GNU General Public License as
      8 # published by the Free Software Foundation; either version 2 of
      9 # the License, or (at your option) any later version.
     10 #
     11 # This program is distributed in the hope that it would be useful,
     12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 # GNU General Public License for more details.
     15 #
     16 # You should have received a copy of the GNU General Public License
     17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
     18 #
     19 # Author: Petr Vorel <pvorel (at] suse.cz>
     20 # Author: Alexey Kodanev <alexey.kodanev (at] oracle.com>
     21 #
     22 # Library for all network/stress/ tests.
     23 # NOTE: More information about network variables can be found
     24 # in test_net.sh and testcases/network/stress/README.
     25 
     26 export TCID="${TCID:-$(basename $0)}"
     27 
     28 . test_net.sh
     29 
     30 ipver=${TST_IPV6:-4}
     31 
     32 # Netmask of for the tested network
     33 IPV4_NETMASK="255.255.255.0"
     34 IPV4_NETMASK_NUM=24
     35 
     36 # Multicast address and it's prefix
     37 MCAST_IPV4_ADDR_PREFIX="224.10"
     38 MCAST_IPV4_ADDR="${MCAST_IPV4_ADDR_PREFIX}.10.1"
     39 MCAST_IPV6_ADDR_PREFIX="ff0e::1111"
     40 MCAST_IPV6_ADDR="${MCAST_IPV6_ADDR_PREFIX}:1"
     41 
     42 # Setup for tests using netstress.
     43 netstress_setup()
     44 {
     45 	tst_require_root
     46 	tst_check_cmds ip pgrep pkill
     47 	trap "tst_brkm TBROK 'test interrupted'" INT
     48 }
     49 
     50 # Cleanup for tests using netstress.
     51 netstress_cleanup()
     52 {
     53 	# Stop the background TCP traffic
     54 	pkill -13 -x netstress
     55 	tst_rhost_run -c "pkill -13 -x netstress"
     56 }
     57 
     58 # restore_ipaddr [TYPE] [LINK] [LOCAL_IFACE] [REMOTE_IFACE]
     59 # TYPE: { lhost | rhost }; Default value is 'lhost'.
     60 # LINK: link number starting from 0. Default value is '0'.
     61 # LOCAL_IFACE: local iface name.
     62 # REMOTE_IFACE: local iface name.
     63 restore_ipaddr()
     64 {
     65 	local type="${1:-lhost}"
     66 	local link_num="${2:-0}"
     67 	local iface_loc=${3:-$(tst_iface lhost $link_num)}
     68 	local iface_rmt=${4:-$(tst_iface rhost $link_num)}
     69 
     70 	tst_restore_ipaddr $type $link_num || return $?
     71 	[ $type = "lhost" ] && tst_wait_ipv6_dad $iface_loc $iface_rmt
     72 }
     73 
     74 # Check connectivity with tst_ping.
     75 # check_connectivity SRC_IFACE DST_ADDR [CNT]
     76 # SRC_IFACE: source interface name.
     77 # DST_ADDR: destination IPv4 or IPv6 address.
     78 # CNT: loop step.
     79 check_connectivity()
     80 {
     81 	local src_iface="${1}"
     82 	local dst_addr="${2}"
     83 	local cnt="${3:-}"
     84 	local cnt_msg
     85 
     86 	[ -n "$cnt" ] && cnt_msg=" (step $cnt)"
     87 
     88 	tst_resm TINFO "ping through $src_iface iface to ${dst_addr}$cnt_msg"
     89 
     90 	tst_ping $src_iface $dst_addr
     91 }
     92 
     93 # check_connectivity_interval CNT [RESTORE] [SRC_IFACE] [DST_ADDR]
     94 # CNT: loop step.
     95 # RESTORE: whether restore ip addr.
     96 # SRC_IFACE: source interface name.
     97 # DST_ADDR: destination IPv4 or IPv6 address.
     98 check_connectivity_interval()
     99 {
    100 	local cnt="$1"
    101 	local restore="${2:-false}"
    102 	local src_iface="${3:-$(tst_iface)}"
    103 	local dst_addr="${4:-$(tst_ipaddr rhost)}"
    104 
    105 	[ $CHECK_INTERVAL -eq 0 ] && return
    106 
    107 	[ $(($cnt % $CHECK_INTERVAL)) -ne 0 ] && return
    108 
    109 	[ "$restore" != "false" ] && restore_ipaddr
    110 
    111 	check_connectivity $src_iface $dst_addr $cnt
    112 }
    113 
    114 # Run netstress process on both lhost and rhost.
    115 # make_background_tcp_traffic [IP]
    116 # IP: server IP; Default value is $(tst_ipaddr).
    117 make_background_tcp_traffic()
    118 {
    119 	pgrep -x netstress > /dev/null && return
    120 
    121 	local ip="${1:-$(tst_ipaddr)}"
    122 	local port=$(tst_get_unused_port ipv${ipver} stream)
    123 
    124 	netstress -R 3 -g $port > /dev/null 2>&1 &
    125 	tst_rhost_run -b -c "netstress -l -H $ip -g $port"
    126 }
    127