KVM: SVM: Rename vmplX_ssp -> plX_ssp
[linux-2.6-block.git] / tools / testing / selftests / net / setup_loopback.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout"
5 readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs"
6 readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})"
7 readonly HARD_IRQS="$(< ${IRQ_PATH})"
8 readonly server_ns=$(mktemp -u server-XXXXXXXX)
9 readonly client_ns=$(mktemp -u client-XXXXXXXX)
10
11 netdev_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
28 setup_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
43 setup_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
68 cleanup_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
78 cleanup_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
92 setup_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
100 setup_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
106 cleanup_ns() {
107         cleanup_macvlan_ns ${server_ns} server ${client_ns} client
108 }
109
110 setup() {
111         setup_loopback_environment "${dev}"
112         setup_interrupt
113 }
114
115 cleanup() {
116         cleanup_loopback "${dev}"
117
118         echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}"
119         echo "${HARD_IRQS}" >"${IRQ_PATH}"
120 }