Merge tag 'qcom-drivers-for-6.9-2' of https://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / tools / testing / selftests / net / lib.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 ##############################################################################
5 # Defines
6
7 # Kselftest framework requirement - SKIP code is 4.
8 ksft_skip=4
9 # namespace list created by setup_ns
10 NS_LIST=""
11
12 ##############################################################################
13 # Helpers
14 busywait()
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
37 cleanup_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
61 cleanup_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
68 setup_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 }