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