0001
0002
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
0026 setup_loopback_environment() {
0027 local dev="$1"
0028
0029
0030 ethtool -K "${dev}" loopback on || exit 1
0031 sleep 1
0032
0033
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 (( $
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
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
0092
0093
0094 echo 100000 >"${FLUSH_PATH}"
0095 echo 50 >"${IRQ_PATH}"
0096 }
0097
0098 setup_ns() {
0099
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 }