Gentoo Archives: gentoo-commits

From: "Robin H. Johnson" <robbat2@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/netifrc:master commit in: net/
Date: Sun, 21 Apr 2019 04:12:05
Message-Id: 1555819841.963d378276193c9ae73b889da03960258773d259.robbat2@OpenRC
1 commit: 963d378276193c9ae73b889da03960258773d259
2 Author: Kirill Semenkov <semenkovk <AT> gmail <DOT> com>
3 AuthorDate: Mon Dec 17 09:07:18 2018 +0000
4 Commit: Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
5 CommitDate: Sun Apr 21 04:10:41 2019 +0000
6 URL: https://gitweb.gentoo.org/proj/netifrc.git/commit/?id=963d3782
7
8 Veth support added
9
10 Signed-off-by: Robin H. Johnson <robbat2 <AT> gentoo.org>
11
12 net/veth.sh | 193 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13 1 file changed, 193 insertions(+)
14
15 diff --git a/net/veth.sh b/net/veth.sh
16 new file mode 100644
17 index 0000000..d969a14
18 --- /dev/null
19 +++ b/net/veth.sh
20 @@ -0,0 +1,193 @@
21 +# Copyright (c) 2018
22 +# Released under the 2-clause BSD license.
23 +
24 +veth_depend()
25 +{
26 + program ip awk
27 +}
28 +
29 +_config_vars="$_config_vars veth"
30 +
31 +
32 +# We need it because _exists() function seeks in /sys/class/net
33 +_netns_exists()
34 +{
35 + [ -e "/var/run/netns/$1" ]
36 +}
37 +
38 +
39 +#Creates the network namespace if it doesn't exist. If called with no arguments, does nothing
40 +#Arguments:
41 +# $1 - name of the namespace
42 +_create_ns() {
43 +
44 + vethrc=0
45 + for _ns in "$@"; do
46 + if [ -z "$_ns" ]; then
47 + continue
48 + fi
49 + if ! _netns_exists "$_ns"; then
50 + ip netns add "$_ns" > /dev/null 2>&1
51 + vethrc=$(($?+ vethrc))
52 + fi
53 + done
54 + return $vethrc
55 +}
56 +
57 +#Brings a virtual interface up and takes network namespaces into account
58 +#Arguments:
59 +# $1 - name of the interface, required!
60 +# $2 - namespace
61 +_bring_peer_up()
62 +{
63 + if [ ! -z "$2" ]; then
64 + ip link set "$1" netns "$2" > /dev/null 2>&1
65 + vethrc=$?
66 + ip netns exec "$2" ip link set dev "$1" up > /dev/null 2>&1
67 + vethrc=$(($?+ vethrc))
68 + return $vethrc
69 + fi
70 +
71 + ip link set dev "$1" up > /dev/null 2>&1
72 + return $?
73 +}
74 +
75 +#Brings a virtual interface down and takes network namespaces into account
76 +#Arguments:
77 +# $1 - name of the interface, required!
78 +# $2 - namespace
79 +_bring_peer_down()
80 +{
81 +
82 + if [ ! -z "$2" ]; then
83 + ip netns exec "$2" ip link del dev "$1" > /dev/null 2>&1
84 + return $?
85 + fi
86 +
87 + ip link del dev "$1" > /dev/null 2>&1
88 + return $?
89 +}
90 +
91 +
92 +#Create and bring the veth pair up
93 +_create_peers()
94 +{
95 + local peers
96 + peers="$(_get_array "veth_${IFVAR}")"
97 +
98 + # veth has exactly two peers.
99 + # For POSIX compatibility we evade bash arrays
100 + local npeers
101 + npeers=$(echo "$peers" | awk '{print NF}')
102 + if [ "$npeers" != 2 ]; then
103 + eerror "veth interface must have exactly two peers"
104 + return 1
105 + fi
106 +
107 + for x in ${peers}; do
108 + if _exists "$x" ; then
109 + eerror "Interface $x already exists. Can't continue"
110 + return 1
111 + fi
112 + done
113 +
114 + local netns1
115 + netns1="$(_get_array "veth_${IFVAR}_ns1")"
116 + local netns2
117 + netns2="$(_get_array "veth_${IFVAR}_ns2")"
118 +
119 + local vethrc
120 +
121 + if ! _create_ns "$netns1" "$netns2"
122 + then
123 + eerror "Can't create namespaces: $netns1 $netns2"
124 + return 1
125 + fi
126 +
127 + local peer1
128 + peer1=$(echo "$peers" | awk '{print $1}')
129 + local peer2
130 + peer2=$(echo "$peers" | awk '{print $2}')
131 +
132 +
133 + ip link add "$peer1" type veth peer name "$peer2" > /dev/null 2>&1 || {
134 + eerror "Can't create veth peer $peer1 or $peer2"
135 + return 1
136 + }
137 +
138 +
139 + if ! _bring_peer_up "$peer1" "$netns1"
140 + then
141 + eerror "Can't bring the veth peer $peer1 up"
142 + return 1
143 +
144 + fi
145 + if ! _bring_peer_up "$peer2" "$netns2"
146 + then
147 + eerror "Can't bring the veth peer $peer2 up"
148 + return 1
149 +
150 + fi
151 +
152 + return 0
153 +}
154 +
155 +# Create peers and namespaces
156 +veth_pre_start()
157 +{
158 + local itype
159 + eval itype=\$type_${IFVAR}
160 + if [ "$itype" != "veth" ]; then
161 + return 0
162 + fi
163 +
164 + local createveth
165 + eval createveth=\$veth_${IFVAR}_create
166 + if [ "$createveth" == "no" ]; then
167 + return 0
168 + fi
169 +
170 + type ip >/dev/null 2>&1 || {
171 + eerror "iproute2 nor found, please install iproute2"
172 + return 1
173 + }
174 +
175 + if ! _create_peers
176 + then
177 + return 1
178 + fi
179 +
180 +
181 + return 0
182 +}
183 +
184 +#Delete the veth pair
185 +#We don't delete namespaces because someone may use them for some purposes
186 +veth_post_stop()
187 +{
188 + local itype
189 + eval itype=\$type_${IFVAR}
190 + if [ "$itype" != "veth" ]; then
191 + return 0
192 + fi
193 +
194 + local createveth
195 + eval createveth=\$veth_${IFVAR}_create
196 + if [ "$createveth" == "no" ]; then
197 + return 0
198 + fi
199 +
200 + local peers
201 + peers="$(_get_array "veth_${IFVAR}")"
202 + local first
203 + first=$(echo "$peers" | awk '{print $1}')
204 + local netns1
205 + netns1="$(_get_array "veth_${IFVAR}_ns1")"
206 +
207 + if ! _bring_peer_down "$first" "$netns1"
208 + then
209 + eerror "Can't delete the veth pair ${IFVAR}"
210 + eend 1
211 + fi
212 + return 0
213 +}