Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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}