blob: 77f5797dfe4946877e48580efd2aa103244b33ee [file] [log] [blame]
#!/bin/sh
# Copyright (c) International Business Machines Corp., 2006
# Copyright (c) 2015-2017 Oracle and/or its affiliates. All Rights Reserved.
# Copyright (c) 2017 Petr Vorel <pvorel@suse.cz>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Petr Vorel <pvorel@suse.cz>
# Author: Alexey Kodanev <alexey.kodanev@oracle.com>
#
# Library for all network/stress/ tests.
# NOTE: More information about network variables can be found
# in test_net.sh and testcases/network/stress/README.
export TCID="${TCID:-$(basename $0)}"
. test_net.sh
ipver=${TST_IPV6:-4}
# Netmask of for the tested network
IPV4_NETMASK="255.255.255.0"
IPV4_NETMASK_NUM=24
# Multicast address and it's prefix
MCAST_IPV4_ADDR_PREFIX="224.10"
MCAST_IPV4_ADDR="${MCAST_IPV4_ADDR_PREFIX}.10.1"
MCAST_IPV6_ADDR_PREFIX="ff0e::1111"
MCAST_IPV6_ADDR="${MCAST_IPV6_ADDR_PREFIX}:1"
# Setup for tests using netstress.
netstress_setup()
{
tst_require_root
tst_check_cmds ip pgrep pkill
trap "tst_brkm TBROK 'test interrupted'" INT
}
# Cleanup for tests using netstress.
netstress_cleanup()
{
# Stop the background TCP traffic
pkill -13 -x netstress
tst_rhost_run -c "pkill -13 -x netstress"
}
# restore_ipaddr [TYPE] [LINK] [LOCAL_IFACE] [REMOTE_IFACE]
# TYPE: { lhost | rhost }; Default value is 'lhost'.
# LINK: link number starting from 0. Default value is '0'.
# LOCAL_IFACE: local iface name.
# REMOTE_IFACE: local iface name.
restore_ipaddr()
{
local type="${1:-lhost}"
local link_num="${2:-0}"
local iface_loc=${3:-$(tst_iface lhost $link_num)}
local iface_rmt=${4:-$(tst_iface rhost $link_num)}
tst_restore_ipaddr $type $link_num || return $?
[ $type = "lhost" ] && tst_wait_ipv6_dad $iface_loc $iface_rmt
}
# Check connectivity with tst_ping.
# check_connectivity SRC_IFACE DST_ADDR [CNT]
# SRC_IFACE: source interface name.
# DST_ADDR: destination IPv4 or IPv6 address.
# CNT: loop step.
check_connectivity()
{
local src_iface="${1}"
local dst_addr="${2}"
local cnt="${3:-}"
local cnt_msg
[ -n "$cnt" ] && cnt_msg=" (step $cnt)"
tst_resm TINFO "ping through $src_iface iface to ${dst_addr}$cnt_msg"
tst_ping $src_iface $dst_addr
}
# check_connectivity_interval CNT [RESTORE] [SRC_IFACE] [DST_ADDR]
# CNT: loop step.
# RESTORE: whether restore ip addr.
# SRC_IFACE: source interface name.
# DST_ADDR: destination IPv4 or IPv6 address.
check_connectivity_interval()
{
local cnt="$1"
local restore="${2:-false}"
local src_iface="${3:-$(tst_iface)}"
local dst_addr="${4:-$(tst_ipaddr rhost)}"
[ $CHECK_INTERVAL -eq 0 ] && return
[ $(($cnt % $CHECK_INTERVAL)) -ne 0 ] && return
[ "$restore" != "false" ] && restore_ipaddr
check_connectivity $src_iface $dst_addr $cnt
}
# Run netstress process on both lhost and rhost.
# make_background_tcp_traffic [IP]
# IP: server IP; Default value is $(tst_ipaddr).
make_background_tcp_traffic()
{
pgrep -x netstress > /dev/null && return
local ip="${1:-$(tst_ipaddr)}"
local port=$(tst_get_unused_port ipv${ipver} stream)
netstress -R 3 -g $port > /dev/null 2>&1 &
tst_rhost_run -b -c "netstress -l -H $ip -g $port"
}