17d157501SCoco Li#!/bin/bash 27d157501SCoco Li# SPDX-License-Identifier: GPL-2.0 39af771d2SPaolo Abeni 49af771d2SPaolo Abenireadonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout" 59af771d2SPaolo Abenireadonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs" 69af771d2SPaolo Abenireadonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})" 79af771d2SPaolo Abenireadonly HARD_IRQS="$(< ${IRQ_PATH})" 8*4416c5f5SHangbin Liureadonly server_ns=$(mktemp -u server-XXXXXXXX) 9*4416c5f5SHangbin Liureadonly client_ns=$(mktemp -u client-XXXXXXXX) 109af771d2SPaolo Abeni 117d157501SCoco Linetdev_check_for_carrier() { 127d157501SCoco Li local -r dev="$1" 137d157501SCoco Li 147d157501SCoco Li for i in {1..5}; do 157d157501SCoco Li carrier="$(cat /sys/class/net/${dev}/carrier)" 167d157501SCoco Li if [[ "${carrier}" -ne 1 ]] ; then 177d157501SCoco Li echo "carrier not ready yet..." >&2 187d157501SCoco Li sleep 1 197d157501SCoco Li else 207d157501SCoco Li echo "carrier ready" >&2 217d157501SCoco Li break 227d157501SCoco Li fi 237d157501SCoco Li done 247d157501SCoco Li echo "${carrier}" 257d157501SCoco Li} 267d157501SCoco Li 277d157501SCoco Li# Assumes that there is no existing ipvlan device on the physical device 287d157501SCoco Lisetup_loopback_environment() { 297d157501SCoco Li local dev="$1" 307d157501SCoco Li 317d157501SCoco Li # Fail hard if cannot turn on loopback mode for current NIC 327d157501SCoco Li ethtool -K "${dev}" loopback on || exit 1 337d157501SCoco Li sleep 1 347d157501SCoco Li 357d157501SCoco Li # Check for the carrier 367d157501SCoco Li carrier=$(netdev_check_for_carrier ${dev}) 377d157501SCoco Li if [[ "${carrier}" -ne 1 ]] ; then 387d157501SCoco Li echo "setup_loopback_environment failed" 397d157501SCoco Li exit 1 407d157501SCoco Li fi 417d157501SCoco Li} 427d157501SCoco Li 437d157501SCoco Lisetup_macvlan_ns(){ 447d157501SCoco Li local -r link_dev="$1" 457d157501SCoco Li local -r ns_name="$2" 467d157501SCoco Li local -r ns_dev="$3" 477d157501SCoco Li local -r ns_mac="$4" 487d157501SCoco Li local -r addr="$5" 497d157501SCoco Li 507d157501SCoco Li ip link add link "${link_dev}" dev "${ns_dev}" \ 517d157501SCoco Li address "${ns_mac}" type macvlan 527d157501SCoco Li exit_code=$? 537d157501SCoco Li if [[ "${exit_code}" -ne 0 ]]; then 547d157501SCoco Li echo "setup_macvlan_ns failed" 557d157501SCoco Li exit $exit_code 567d157501SCoco Li fi 577d157501SCoco Li 587d157501SCoco Li [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}" 597d157501SCoco Li ip link set dev "${ns_dev}" netns "${ns_name}" 607d157501SCoco Li ip -netns "${ns_name}" link set dev "${ns_dev}" up 617d157501SCoco Li if [[ -n "${addr}" ]]; then 627d157501SCoco Li ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}" 637d157501SCoco Li fi 647d157501SCoco Li 657d157501SCoco Li sleep 1 667d157501SCoco Li} 677d157501SCoco Li 687d157501SCoco Licleanup_macvlan_ns(){ 697d157501SCoco Li while (( $# >= 2 )); do 707d157501SCoco Li ns_name="$1" 717d157501SCoco Li ns_dev="$2" 727d157501SCoco Li ip -netns "${ns_name}" link del dev "${ns_dev}" 737d157501SCoco Li ip netns del "${ns_name}" 747d157501SCoco Li shift 2 757d157501SCoco Li done 767d157501SCoco Li} 777d157501SCoco Li 787d157501SCoco Licleanup_loopback(){ 797d157501SCoco Li local -r dev="$1" 807d157501SCoco Li 817d157501SCoco Li ethtool -K "${dev}" loopback off 827d157501SCoco Li sleep 1 837d157501SCoco Li 847d157501SCoco Li # Check for the carrier 857d157501SCoco Li carrier=$(netdev_check_for_carrier ${dev}) 867d157501SCoco Li if [[ "${carrier}" -ne 1 ]] ; then 877d157501SCoco Li echo "setup_loopback_environment failed" 887d157501SCoco Li exit 1 897d157501SCoco Li fi 907d157501SCoco Li} 919af771d2SPaolo Abeni 929af771d2SPaolo Abenisetup_interrupt() { 939af771d2SPaolo Abeni # Use timer on host to trigger the network stack 949af771d2SPaolo Abeni # Also disable device interrupt to not depend on NIC interrupt 959af771d2SPaolo Abeni # Reduce test flakiness caused by unexpected interrupts 969af771d2SPaolo Abeni echo 100000 >"${FLUSH_PATH}" 979af771d2SPaolo Abeni echo 50 >"${IRQ_PATH}" 989af771d2SPaolo Abeni} 999af771d2SPaolo Abeni 1009af771d2SPaolo Abenisetup_ns() { 1019af771d2SPaolo Abeni # Set up server_ns namespace and client_ns namespace 102*4416c5f5SHangbin Liu setup_macvlan_ns "${dev}" ${server_ns} server "${SERVER_MAC}" 103*4416c5f5SHangbin Liu setup_macvlan_ns "${dev}" ${client_ns} client "${CLIENT_MAC}" 1049af771d2SPaolo Abeni} 1059af771d2SPaolo Abeni 1069af771d2SPaolo Abenicleanup_ns() { 107*4416c5f5SHangbin Liu cleanup_macvlan_ns ${server_ns} server ${client_ns} client 1089af771d2SPaolo Abeni} 1099af771d2SPaolo Abeni 1109af771d2SPaolo Abenisetup() { 1119af771d2SPaolo Abeni setup_loopback_environment "${dev}" 1129af771d2SPaolo Abeni setup_interrupt 1139af771d2SPaolo Abeni} 1149af771d2SPaolo Abeni 1159af771d2SPaolo Abenicleanup() { 1169af771d2SPaolo Abeni cleanup_loopback "${dev}" 1179af771d2SPaolo Abeni 1189af771d2SPaolo Abeni echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}" 1199af771d2SPaolo Abeni echo "${HARD_IRQS}" >"${IRQ_PATH}" 1209af771d2SPaolo Abeni} 121