Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout"
0005 readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs"
0006 readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})"
0007 readonly HARD_IRQS="$(< ${IRQ_PATH})"
0008 
0009 netdev_check_for_carrier() {
0010         local -r dev="$1"
0011 
0012         for i in {1..5}; do
0013                 carrier="$(cat /sys/class/net/${dev}/carrier)"
0014                 if [[ "${carrier}" -ne 1 ]] ; then
0015                         echo "carrier not ready yet..." >&2
0016                         sleep 1
0017                 else
0018                         echo "carrier ready" >&2
0019                         break
0020                 fi
0021         done
0022         echo "${carrier}"
0023 }
0024 
0025 # Assumes that there is no existing ipvlan device on the physical device
0026 setup_loopback_environment() {
0027         local dev="$1"
0028 
0029         # Fail hard if cannot turn on loopback mode for current NIC
0030         ethtool -K "${dev}" loopback on || exit 1
0031         sleep 1
0032 
0033         # Check for the carrier
0034         carrier=$(netdev_check_for_carrier ${dev})
0035         if [[ "${carrier}" -ne 1 ]] ; then
0036                 echo "setup_loopback_environment failed"
0037                 exit 1
0038         fi
0039 }
0040 
0041 setup_macvlan_ns(){
0042         local -r link_dev="$1"
0043         local -r ns_name="$2"
0044         local -r ns_dev="$3"
0045         local -r ns_mac="$4"
0046         local -r addr="$5"
0047 
0048         ip link add link "${link_dev}" dev "${ns_dev}" \
0049                 address "${ns_mac}" type macvlan
0050         exit_code=$?
0051         if [[ "${exit_code}" -ne 0 ]]; then
0052                 echo "setup_macvlan_ns failed"
0053                 exit $exit_code
0054         fi
0055 
0056         [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}"
0057         ip link set dev "${ns_dev}" netns "${ns_name}"
0058         ip -netns "${ns_name}" link set dev "${ns_dev}" up
0059         if [[ -n "${addr}" ]]; then
0060                 ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}"
0061         fi
0062 
0063         sleep 1
0064 }
0065 
0066 cleanup_macvlan_ns(){
0067         while (( $# >= 2 )); do
0068                 ns_name="$1"
0069                 ns_dev="$2"
0070                 ip -netns "${ns_name}" link del dev "${ns_dev}"
0071                 ip netns del "${ns_name}"
0072                 shift 2
0073         done
0074 }
0075 
0076 cleanup_loopback(){
0077         local -r dev="$1"
0078 
0079         ethtool -K "${dev}" loopback off
0080         sleep 1
0081 
0082         # Check for the carrier
0083         carrier=$(netdev_check_for_carrier ${dev})
0084         if [[ "${carrier}" -ne 1 ]] ; then
0085                 echo "setup_loopback_environment failed"
0086                 exit 1
0087         fi
0088 }
0089 
0090 setup_interrupt() {
0091         # Use timer on  host to trigger the network stack
0092         # Also disable device interrupt to not depend on NIC interrupt
0093         # Reduce test flakiness caused by unexpected interrupts
0094         echo 100000 >"${FLUSH_PATH}"
0095         echo 50 >"${IRQ_PATH}"
0096 }
0097 
0098 setup_ns() {
0099         # Set up server_ns namespace and client_ns namespace
0100         setup_macvlan_ns "${dev}" server_ns server "${SERVER_MAC}"
0101         setup_macvlan_ns "${dev}" client_ns client "${CLIENT_MAC}"
0102 }
0103 
0104 cleanup_ns() {
0105         cleanup_macvlan_ns server_ns server client_ns client
0106 }
0107 
0108 setup() {
0109         setup_loopback_environment "${dev}"
0110         setup_interrupt
0111 }
0112 
0113 cleanup() {
0114         cleanup_loopback "${dev}"
0115 
0116         echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}"
0117         echo "${HARD_IRQS}" >"${IRQ_PATH}"
0118 }