]>
Commit | Line | Data |
---|---|---|
0fb42626 AF |
1 | #!/bin/bash |
2 | ||
3 | # Copyright (c) 2011 Alexey I. Froloff. | |
4 | # | |
5 | # Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | # you may not use this file except in compliance with the License. | |
7 | # You may obtain a copy of the License at: | |
8 | # | |
9 | # http://www.apache.org/licenses/LICENSE-2.0 | |
10 | # | |
11 | # Unless required by applicable law or agreed to in writing, software | |
12 | # distributed under the License is distributed on an "AS IS" BASIS, | |
13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | # See the License for the specific language governing permissions and | |
15 | # limitations under the License. | |
16 | ||
17 | . /etc/init.d/functions | |
18 | ||
19 | cd /etc/sysconfig/network-scripts | |
20 | . ./network-functions | |
21 | ||
22 | [ -f ../network ] && . ../network | |
23 | ||
24 | CONFIG=${1} | |
cfa9bf12 | 25 | TIMEOUT=10 |
0fb42626 AF |
26 | |
27 | need_config ${CONFIG} | |
28 | ||
29 | source_config | |
30 | ||
31 | OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${REAL_DEVICETYPE}" | |
32 | ||
33 | if [ ! -x ${OTHERSCRIPT} ]; then | |
5a0e4aec | 34 | OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth" |
0fb42626 AF |
35 | fi |
36 | ||
5b56f96a | 37 | check_recursion () |
3214851c | 38 | { |
5a0e4aec BP |
39 | [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do |
40 | [ "$_r" = "$1" ] && return 1 | |
41 | done | |
3214851c | 42 | |
5a0e4aec | 43 | return 0 |
3214851c TG |
44 | } |
45 | ||
5b56f96a GS |
46 | ifup_ovs_bridge () |
47 | { | |
5a0e4aec BP |
48 | if ovs-vsctl br-exists "${OVS_BRIDGE}"; then :; else |
49 | /sbin/ifup "${OVS_BRIDGE}" | |
50 | fi | |
5b56f96a GS |
51 | } |
52 | ||
3214851c | 53 | if [ -z "${UPPEDSTACK}" ]; then |
5a0e4aec | 54 | UPPEDSTACK="${DEVICE}" |
3214851c TG |
55 | fi |
56 | ||
57 | [ -n "${OVSREQUIRES}" ] && for _i in ${OVSREQUIRES}; do | |
5a0e4aec BP |
58 | if ( check_recursion "$_i" ); then |
59 | UPPEDSTACK="${UPPEDSTACK} $_i" /sbin/ifup "$_i" | |
60 | fi | |
3214851c TG |
61 | done |
62 | ||
84ad1208 | 63 | SERVICE_UNIT=/usr/lib/systemd/system/openvswitch.service |
b49c106e | 64 | if [ -f $SERVICE_UNIT ] && [ -x /usr/bin/systemctl ]; then |
5a0e4aec BP |
65 | if ! systemctl --quiet is-active openvswitch.service; then |
66 | systemctl start openvswitch.service | |
67 | fi | |
b49c106e | 68 | else |
5a0e4aec BP |
69 | if [ ! -f /var/lock/subsys/openvswitch ]; then |
70 | /sbin/service openvswitch start | |
71 | fi | |
b49c106e | 72 | fi |
60245300 | 73 | |
0fb42626 | 74 | case "$TYPE" in |
5a0e4aec BP |
75 | OVSBridge|OVSUserBridge) |
76 | # If bridge already exists and is up, it has been configured through | |
77 | # other cases like OVSPort, OVSIntPort and OVSBond. If it is down or | |
78 | # it does not exist, create it. It is possible for a bridge to exist | |
79 | # because it remained in the OVSDB for some reason, but it won't be up. | |
80 | if [ "${TYPE}" = "OVSUserBridge" ]; then | |
81 | DATAPATH="netdev" | |
82 | fi | |
83 | if check_device_down "${DEVICE}"; then | |
84 | ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS \ | |
85 | ${OVS_EXTRA+-- $OVS_EXTRA} \ | |
86 | ${STP+-- set bridge "$DEVICE" stp_enable="${STP}"} \ | |
87 | ${DATAPATH+-- set bridge "$DEVICE" datapath_type="$DATAPATH"} | |
88 | else | |
89 | OVSBRIDGECONFIGURED="yes" | |
90 | fi | |
91 | ||
92 | # If MACADDR is provided in the interface configuration file, | |
93 | # we need to set it using ovs-vsctl; setting it with the "ip" | |
94 | # command in ifup-eth does not make the change persistent. | |
95 | if [ -n "$MACADDR" ]; then | |
96 | ovs-vsctl -t ${TIMEOUT} -- set bridge "$DEVICE" \ | |
97 | other-config:hwaddr="$MACADDR" | |
98 | fi | |
99 | ||
100 | # When dhcp is enabled, the assumption is that there will be a port to | |
101 | # attach (otherwise, we can't reach out for dhcp). So, we do not | |
102 | # configure the bridge through rhel's ifup infrastructure unless | |
103 | # it is being configured after the port has been configured. | |
104 | # The "OVSINTF" is set only after the port is configured. | |
105 | if [ "${OVSBOOTPROTO}" = "dhcp" ] && [ -n "${OVSINTF}" ]; then | |
106 | case " ${OVSDHCPINTERFACES} " in | |
107 | *" ${OVSINTF} "*) | |
108 | BOOTPROTO=dhcp ${OTHERSCRIPT} ${CONFIG} | |
109 | ;; | |
110 | esac | |
111 | fi | |
112 | ||
113 | # When dhcp is not enabled, it is possible that someone may want | |
114 | # a standalone bridge (i.e it may not have any ports). Configure it. | |
115 | if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ] && \ | |
116 | [ "${OVSBRIDGECONFIGURED}" != "yes" ]; then | |
117 | ${OTHERSCRIPT} ${CONFIG} | |
118 | fi | |
119 | exit 0 | |
120 | ;; | |
121 | OVSPort) | |
122 | ifup_ovs_bridge | |
123 | ${OTHERSCRIPT} ${CONFIG} ${2} | |
124 | # The port might be already in the database but not yet | |
125 | # in the datapath. So, remove the stale interface first. | |
126 | ovs-vsctl -t ${TIMEOUT} \ | |
127 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
128 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA} | |
129 | OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE" | |
130 | ;; | |
131 | OVSIntPort) | |
132 | ifup_ovs_bridge | |
133 | ovs-vsctl -t ${TIMEOUT} \ | |
134 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
135 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \ | |
136 | -- set Interface "$DEVICE" type=internal ${OVS_EXTRA+-- $OVS_EXTRA} | |
137 | if [ -n "${OVSDHCPINTERFACES}" ]; then | |
138 | for _iface in ${OVSDHCPINTERFACES}; do | |
139 | /sbin/ifup ${_iface} | |
140 | done | |
141 | fi | |
142 | BOOTPROTO="${OVSBOOTPROTO}" ${OTHERSCRIPT} ${CONFIG} ${2} | |
143 | ;; | |
144 | OVSBond) | |
145 | ifup_ovs_bridge | |
146 | for _iface in $BOND_IFACES; do | |
147 | /sbin/ifup ${_iface} | |
148 | done | |
149 | ovs-vsctl -t ${TIMEOUT} \ | |
150 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
151 | -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA} | |
152 | OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE" | |
153 | ;; | |
154 | OVSTunnel) | |
155 | ifup_ovs_bridge | |
156 | ovs-vsctl -t ${TIMEOUT} \ | |
157 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
158 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \ | |
159 | -- set Interface "$DEVICE" type=$OVS_TUNNEL_TYPE $OVS_TUNNEL_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA} | |
160 | ;; | |
161 | OVSPatchPort) | |
162 | ifup_ovs_bridge | |
163 | ovs-vsctl -t ${TIMEOUT} \ | |
164 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
165 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \ | |
166 | -- set Interface "$DEVICE" type=patch options:peer="${OVS_PATCH_PEER}" ${OVS_EXTRA+-- $OVS_EXTRA} | |
167 | ;; | |
168 | OVSDPDKPort) | |
169 | ifup_ovs_bridge | |
170 | BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE) | |
171 | ovs-vsctl -t ${TIMEOUT} \ | |
172 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
173 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \ | |
174 | -- set Interface "$DEVICE" type=dpdk ${OVS_EXTRA+-- $OVS_EXTRA} | |
175 | BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE) | |
176 | # The bridge may change its MAC to be the lower one among all its | |
177 | # ports. If that happens, bridge configuration (e.g. routes) will | |
178 | # be lost. Restore the post-up bridge configuration again. | |
179 | if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then | |
180 | ${OTHERSCRIPT} "$OVS_BRIDGE" | |
181 | fi | |
182 | ;; | |
183 | OVSDPDKRPort) | |
184 | ifup_ovs_bridge | |
185 | ovs-vsctl -t ${TIMEOUT} \ | |
186 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
187 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \ | |
188 | -- set Interface "$DEVICE" type=dpdkr ${OVS_EXTRA+-- $OVS_EXTRA} | |
189 | ;; | |
190 | OVSDPDKVhostUserPort) | |
191 | ifup_ovs_bridge | |
192 | PORT_TYPE="dpdkvhostuser" | |
193 | PORT_PATH="" | |
194 | if [ "$OVS_PORT_MODE" == "client" ]; then | |
195 | PORT_TYPE="dpdkvhostuserclient" | |
196 | PORT_PATH="options:vhost-server-path=${OVS_PORT_PATH}" | |
197 | fi | |
198 | ovs-vsctl -t ${TIMEOUT} \ | |
199 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
200 | -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \ | |
201 | -- set Interface "$DEVICE" type=$PORT_TYPE \ | |
202 | $PORT_PATH \ | |
203 | ${OVS_EXTRA+-- $OVS_EXTRA} | |
204 | ;; | |
205 | OVSDPDKBond) | |
206 | ifup_ovs_bridge | |
207 | BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE) | |
208 | for _iface in $BOND_IFACES; do | |
209 | IFACE_TYPES="${IFACE_TYPES} -- set interface ${_iface} type=dpdk" | |
210 | done | |
211 | ovs-vsctl -t ${TIMEOUT} \ | |
212 | -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \ | |
213 | -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${IFACE_TYPES} ${OVS_EXTRA+-- $OVS_EXTRA} | |
214 | BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE) | |
215 | # The bridge may change its MAC to be the lower one among all its | |
216 | # ports. If that happens, bridge configuration (e.g. routes) will | |
217 | # be lost. Restore the post-up bridge configuration again. | |
218 | if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then | |
219 | ${OTHERSCRIPT} "$OVS_BRIDGE" | |
220 | fi | |
221 | ;; | |
222 | *) | |
223 | echo $"Invalid OVS interface type $TYPE" | |
224 | exit 1 | |
225 | ;; | |
0fb42626 | 226 | esac |