| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| ############################################################################## |
| # Defines |
| |
| WAIT_TIMEOUT=${WAIT_TIMEOUT:=20} |
| BUSYWAIT_TIMEOUT=$((WAIT_TIMEOUT * 1000)) # ms |
| |
| # Kselftest framework requirement - SKIP code is 4. |
| ksft_skip=4 |
| # namespace list created by setup_ns |
| NS_LIST=() |
| |
| ############################################################################## |
| # Helpers |
| busywait() |
| { |
| local timeout=$1; shift |
| |
| local start_time="$(date -u +%s%3N)" |
| while true |
| do |
| local out |
| if out=$("$@"); then |
| echo -n "$out" |
| return 0 |
| fi |
| |
| local current_time="$(date -u +%s%3N)" |
| if ((current_time - start_time > timeout)); then |
| echo -n "$out" |
| return 1 |
| fi |
| done |
| } |
| |
| cleanup_ns() |
| { |
| local ns="" |
| local ret=0 |
| |
| for ns in "$@"; do |
| [ -z "${ns}" ] && continue |
| ip netns pids "${ns}" 2> /dev/null | xargs -r kill || true |
| ip netns delete "${ns}" &> /dev/null || true |
| if ! busywait $BUSYWAIT_TIMEOUT ip netns list \| grep -vq "^$ns$" &> /dev/null; then |
| echo "Warn: Failed to remove namespace $ns" |
| ret=1 |
| fi |
| done |
| |
| return $ret |
| } |
| |
| cleanup_all_ns() |
| { |
| cleanup_ns "${NS_LIST[@]}" |
| } |
| |
| # setup netns with given names as prefix. e.g |
| # setup_ns local remote |
| setup_ns() |
| { |
| local ns="" |
| local ns_name="" |
| local ns_list=() |
| local ns_exist= |
| for ns_name in "$@"; do |
| # Some test may setup/remove same netns multi times |
| if unset ${ns_name} 2> /dev/null; then |
| ns="${ns_name,,}-$(mktemp -u XXXXXX)" |
| eval readonly ${ns_name}="$ns" |
| ns_exist=false |
| else |
| eval ns='$'${ns_name} |
| cleanup_ns "$ns" |
| ns_exist=true |
| fi |
| |
| if ! ip netns add "$ns"; then |
| echo "Failed to create namespace $ns_name" |
| cleanup_ns "${ns_list[@]}" |
| return $ksft_skip |
| fi |
| ip -n "$ns" link set lo up |
| ! $ns_exist && ns_list+=("$ns") |
| done |
| NS_LIST+=("${ns_list[@]}") |
| } |