#!/bin/sh
# Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved.
#
# 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 .
#
# Author: Alexey Kodanev
TCID=dctcp01
TST_TOTAL=1
TST_CLEANUP="cleanup"
def_alg="cubic"
prev_alg=
. test_net.sh
set_cong_alg()
{
local alg=$1
tst_resm TINFO "setting $alg"
tst_set_sysctl net.ipv4.tcp_congestion_control $alg safe
}
cleanup()
{
if [ "$prev_cong_ctl" ]; then
tst_set_sysctl net.ipv4.tcp_congestion_control $prev_alg
fi
tst_rmdir
tc qdisc del dev $(tst_iface) root netem loss 0.03% ecn
}
setup()
{
if tst_kvcmp -lt "3.18"; then
tst_brkm TCONF "test requires kernel 3.18 or newer"
fi
tst_require_root
tst_check_cmds ip sysctl tc
tst_resm TINFO "emulate congestion with packet loss 0.03% and ECN"
tc qdisc add dev $(tst_iface) root netem loss 0.03% ecn > /dev/null 2>&1
if [ $? -ne 0 ]; then
tst_brkm TCONF "netem doesn't support ECN"
fi
tst_tmpdir
prev_alg="$(sysctl -n net.ipv4.tcp_congestion_control)"
}
test_run()
{
tst_resm TINFO "compare '$def_alg' and 'dctcp' congestion alg. results"
set_cong_alg "$def_alg"
tst_netload -H $(tst_ipaddr rhost)
local res0="$(cat tst_netload.res)"
set_cong_alg "dctcp"
tst_netload -H $(tst_ipaddr rhost)
local res1="$(cat tst_netload.res)"
local per=$(( $res0 * 100 / $res1 - 100 ))
if [ "$per" -lt "10" ]; then
tst_resm TFAIL "dctcp performance $per %"
else
tst_resm TPASS "dctcp performance $per %"
fi
}
setup
test_run
tst_exit