121 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 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}; do15 carrier="$(cat /sys/class/net/${dev}/carrier)"16 if [[ "${carrier}" -ne 1 ]] ; then17 echo "carrier not ready yet..." >&218 sleep 119 else20 echo "carrier ready" >&221 break22 fi23 done24 echo "${carrier}"25}26 27# Assumes that there is no existing ipvlan device on the physical device28setup_loopback_environment() {29 local dev="$1"30 31 # Fail hard if cannot turn on loopback mode for current NIC32 ethtool -K "${dev}" loopback on || exit 133 sleep 134 35 # Check for the carrier36 carrier=$(netdev_check_for_carrier ${dev})37 if [[ "${carrier}" -ne 1 ]] ; then38 echo "setup_loopback_environment failed"39 exit 140 fi41}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 macvlan52 exit_code=$?53 if [[ "${exit_code}" -ne 0 ]]; then54 echo "setup_macvlan_ns failed"55 exit $exit_code56 fi57 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}" up61 if [[ -n "${addr}" ]]; then62 ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}"63 fi64 65 sleep 166}67 68cleanup_macvlan_ns(){69 while (( $# >= 2 )); do70 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 275 done76}77 78cleanup_loopback(){79 local -r dev="$1"80 81 ethtool -K "${dev}" loopback off82 sleep 183 84 # Check for the carrier85 carrier=$(netdev_check_for_carrier ${dev})86 if [[ "${carrier}" -ne 1 ]] ; then87 echo "setup_loopback_environment failed"88 exit 189 fi90}91 92setup_interrupt() {93 # Use timer on host to trigger the network stack94 # Also disable device interrupt to not depend on NIC interrupt95 # Reduce test flakiness caused by unexpected interrupts96 echo 100000 >"${FLUSH_PATH}"97 echo 50 >"${IRQ_PATH}"98}99 100setup_ns() {101 # Set up server_ns namespace and client_ns namespace102 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} client108}109 110setup() {111 setup_loopback_environment "${dev}"112 setup_interrupt113}114 115cleanup() {116 cleanup_loopback "${dev}"117 118 echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}"119 echo "${HARD_IRQS}" >"${IRQ_PATH}"120}121