linux/tools/testing/selftests/net/setup_loopback.sh
Coco Li 7d1575014a selftests/net: GRO coalesce test
Implement a GRO testsuite that expects Linux kernel GRO behavior.
All tests pass with the kernel software GRO stack. Run against a device
with hardware GRO to verify that it matches the software stack.

gro.c generates packets and sends them out through a packet socket. The
receiver in gro.c (run separately) receives the packets on a packet
socket, filters them by destination ports using BPF and checks the
packet geometry to see whether GRO was applied.

gro.sh provides a wrapper to run the gro.c in NIC loopback mode.
It is not included in continuous testing because it modifies network
configuration around a physical NIC: gro.sh sets the NIC in loopback
mode, creates macvlan devices on the physical device in separate
namespaces, and sends traffic generated by gro.c between the two
namespaces to observe coalescing behavior.

GRO coalescing is time sensitive.
Some tests may prove flaky on some hardware.

Note that this test suite tests for software GRO unless hardware GRO is
enabled (ethtool -K $DEV rx-gro-hw on).

To test, run ./gro.sh.
The wrapper will output success or failed test names, and generate
log.txt and stderr.

Sample log.txt result:
...
pure data packet of same size: Test succeeded

large data packets followed by a smaller one: Test succeeded

small data packets followed by a larger one: Test succeeded
...

Sample stderr result:
...
carrier ready
running test ipv4 data
Expected {200 }, Total 1 packets
Received {200 }, Total 1 packets.
...

Signed-off-by: Coco Li <lixiaoyan@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-08-05 13:14:09 +01:00

83 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
netdev_check_for_carrier() {
local -r dev="$1"
for i in {1..5}; do
carrier="$(cat /sys/class/net/${dev}/carrier)"
if [[ "${carrier}" -ne 1 ]] ; then
echo "carrier not ready yet..." >&2
sleep 1
else
echo "carrier ready" >&2
break
fi
done
echo "${carrier}"
}
# Assumes that there is no existing ipvlan device on the physical device
setup_loopback_environment() {
local dev="$1"
# Fail hard if cannot turn on loopback mode for current NIC
ethtool -K "${dev}" loopback on || exit 1
sleep 1
# Check for the carrier
carrier=$(netdev_check_for_carrier ${dev})
if [[ "${carrier}" -ne 1 ]] ; then
echo "setup_loopback_environment failed"
exit 1
fi
}
setup_macvlan_ns(){
local -r link_dev="$1"
local -r ns_name="$2"
local -r ns_dev="$3"
local -r ns_mac="$4"
local -r addr="$5"
ip link add link "${link_dev}" dev "${ns_dev}" \
address "${ns_mac}" type macvlan
exit_code=$?
if [[ "${exit_code}" -ne 0 ]]; then
echo "setup_macvlan_ns failed"
exit $exit_code
fi
[[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}"
ip link set dev "${ns_dev}" netns "${ns_name}"
ip -netns "${ns_name}" link set dev "${ns_dev}" up
if [[ -n "${addr}" ]]; then
ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}"
fi
sleep 1
}
cleanup_macvlan_ns(){
while (( $# >= 2 )); do
ns_name="$1"
ns_dev="$2"
ip -netns "${ns_name}" link del dev "${ns_dev}"
ip netns del "${ns_name}"
shift 2
done
}
cleanup_loopback(){
local -r dev="$1"
ethtool -K "${dev}" loopback off
sleep 1
# Check for the carrier
carrier=$(netdev_check_for_carrier ${dev})
if [[ "${carrier}" -ne 1 ]] ; then
echo "setup_loopback_environment failed"
exit 1
fi
}