Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.10.11.
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3
  4readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout"
  5readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs"
  6readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})"
  7readonly HARD_IRQS="$(< ${IRQ_PATH})"
  8readonly server_ns=$(mktemp -u server-XXXXXXXX)
  9readonly client_ns=$(mktemp -u client-XXXXXXXX)
 10
 11netdev_check_for_carrier() {
 12	local -r dev="$1"
 13
 14	for i in {1..5}; do
 15		carrier="$(cat /sys/class/net/${dev}/carrier)"
 16		if [[ "${carrier}" -ne 1 ]] ; then
 17			echo "carrier not ready yet..." >&2
 18			sleep 1
 19		else
 20			echo "carrier ready" >&2
 21			break
 22		fi
 23	done
 24	echo "${carrier}"
 25}
 26
 27# Assumes that there is no existing ipvlan device on the physical device
 28setup_loopback_environment() {
 29	local dev="$1"
 30
 31	# Fail hard if cannot turn on loopback mode for current NIC
 32	ethtool -K "${dev}" loopback on || exit 1
 33	sleep 1
 34
 35	# Check for the carrier
 36	carrier=$(netdev_check_for_carrier ${dev})
 37	if [[ "${carrier}" -ne 1 ]] ; then
 38		echo "setup_loopback_environment failed"
 39		exit 1
 40	fi
 41}
 42
 43setup_macvlan_ns(){
 44	local -r link_dev="$1"
 45	local -r ns_name="$2"
 46	local -r ns_dev="$3"
 47	local -r ns_mac="$4"
 48	local -r addr="$5"
 49
 50	ip link add link "${link_dev}" dev "${ns_dev}" \
 51		address "${ns_mac}" type macvlan
 52	exit_code=$?
 53	if [[ "${exit_code}" -ne 0 ]]; then
 54		echo "setup_macvlan_ns failed"
 55		exit $exit_code
 56	fi
 57
 58	[[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}"
 59	ip link set dev "${ns_dev}" netns "${ns_name}"
 60	ip -netns "${ns_name}" link set dev "${ns_dev}" up
 61	if [[ -n "${addr}" ]]; then
 62		ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}"
 63	fi
 64
 65	sleep 1
 66}
 67
 68cleanup_macvlan_ns(){
 69	while (( $# >= 2 )); do
 70		ns_name="$1"
 71		ns_dev="$2"
 72		ip -netns "${ns_name}" link del dev "${ns_dev}"
 73		ip netns del "${ns_name}"
 74		shift 2
 75	done
 76}
 77
 78cleanup_loopback(){
 79	local -r dev="$1"
 80
 81	ethtool -K "${dev}" loopback off
 82	sleep 1
 83
 84	# Check for the carrier
 85	carrier=$(netdev_check_for_carrier ${dev})
 86	if [[ "${carrier}" -ne 1 ]] ; then
 87		echo "setup_loopback_environment failed"
 88		exit 1
 89	fi
 90}
 91
 92setup_interrupt() {
 93	# Use timer on  host to trigger the network stack
 94	# Also disable device interrupt to not depend on NIC interrupt
 95	# Reduce test flakiness caused by unexpected interrupts
 96	echo 100000 >"${FLUSH_PATH}"
 97	echo 50 >"${IRQ_PATH}"
 98}
 99
100setup_ns() {
101	# Set up server_ns namespace and client_ns namespace
102	setup_macvlan_ns "${dev}" ${server_ns} server "${SERVER_MAC}"
103	setup_macvlan_ns "${dev}" ${client_ns} client "${CLIENT_MAC}"
104}
105
106cleanup_ns() {
107	cleanup_macvlan_ns ${server_ns} server ${client_ns} client
108}
109
110setup() {
111	setup_loopback_environment "${dev}"
112	setup_interrupt
113}
114
115cleanup() {
116	cleanup_loopback "${dev}"
117
118	echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}"
119	echo "${HARD_IRQS}" >"${IRQ_PATH}"
120}