1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4############################################################################## 5# Defines 6 7# Kselftest framework requirement - SKIP code is 4. 8ksft_skip=4 9# namespace list created by setup_ns 10NS_LIST="" 11 12############################################################################## 13# Helpers 14busywait() 15{ 16 local timeout=$1; shift 17 18 local start_time="$(date -u +%s%3N)" 19 while true 20 do 21 local out 22 out=$("$@") 23 local ret=$? 24 if ((!ret)); then 25 echo -n "$out" 26 return 0 27 fi 28 29 local current_time="$(date -u +%s%3N)" 30 if ((current_time - start_time > timeout)); then 31 echo -n "$out" 32 return 1 33 fi 34 done 35} 36 37cleanup_ns() 38{ 39 local ns="" 40 local errexit=0 41 local ret=0 42 43 # disable errexit temporary 44 if [[ $- =~ "e" ]]; then 45 errexit=1 46 set +e 47 fi 48 49 for ns in "$@"; do 50 ip netns delete "${ns}" &> /dev/null 51 if ! busywait 2 ip netns list \| grep -vq "^$ns$" &> /dev/null; then 52 echo "Warn: Failed to remove namespace $ns" 53 ret=1 54 fi 55 done 56 57 [ $errexit -eq 1 ] && set -e 58 return $ret 59} 60 61cleanup_all_ns() 62{ 63 cleanup_ns $NS_LIST 64} 65 66# setup netns with given names as prefix. e.g 67# setup_ns local remote 68setup_ns() 69{ 70 local ns="" 71 local ns_name="" 72 local ns_list="" 73 for ns_name in "$@"; do 74 # Some test may setup/remove same netns multi times 75 if unset ${ns_name} 2> /dev/null; then 76 ns="${ns_name,,}-$(mktemp -u XXXXXX)" 77 eval readonly ${ns_name}="$ns" 78 else 79 eval ns='$'${ns_name} 80 cleanup_ns "$ns" 81 82 fi 83 84 if ! ip netns add "$ns"; then 85 echo "Failed to create namespace $ns_name" 86 cleanup_ns "$ns_list" 87 return $ksft_skip 88 fi 89 ip -n "$ns" link set lo up 90 ns_list="$ns_list $ns" 91 done 92 NS_LIST="$NS_LIST $ns_list" 93} 94