rdobuilder f9eca4
#!/bin/bash
rdobuilder f9eca4
rdobuilder f9eca4
# Copyright (c) 2011 Alexey I. Froloff.
rdobuilder f9eca4
#
rdobuilder f9eca4
# Licensed under the Apache License, Version 2.0 (the "License");
rdobuilder f9eca4
# you may not use this file except in compliance with the License.
rdobuilder f9eca4
# You may obtain a copy of the License at:
rdobuilder f9eca4
#
rdobuilder f9eca4
#     http://www.apache.org/licenses/LICENSE-2.0
rdobuilder f9eca4
#
rdobuilder f9eca4
# Unless required by applicable law or agreed to in writing, software
rdobuilder f9eca4
# distributed under the License is distributed on an "AS IS" BASIS,
rdobuilder f9eca4
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rdobuilder f9eca4
# See the License for the specific language governing permissions and
rdobuilder f9eca4
# limitations under the License.
rdobuilder f9eca4
rdobuilder f9eca4
. /etc/init.d/functions
rdobuilder f9eca4
rdobuilder f9eca4
cd /etc/sysconfig/network-scripts
rdobuilder f9eca4
. ./network-functions
rdobuilder f9eca4
rdobuilder f9eca4
[ -f ../network ] && . ../network
rdobuilder f9eca4
rdobuilder f9eca4
CONFIG=${1}
rdobuilder f9eca4
TIMEOUT=10
rdobuilder f9eca4
rdobuilder f9eca4
need_config ${CONFIG}
rdobuilder f9eca4
rdobuilder f9eca4
source_config
rdobuilder f9eca4
rdobuilder f9eca4
OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${REAL_DEVICETYPE}"
rdobuilder f9eca4
rdobuilder f9eca4
if [ ! -x ${OTHERSCRIPT} ]; then
rdobuilder f9eca4
        OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
rdobuilder f9eca4
fi
rdobuilder f9eca4
rdobuilder f9eca4
check_recursion ()
rdobuilder f9eca4
{
rdobuilder f9eca4
        [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do
rdobuilder f9eca4
                [ "$_r" = "$1" ] && return 1
rdobuilder f9eca4
        done
rdobuilder f9eca4
rdobuilder f9eca4
        return 0
rdobuilder f9eca4
}
rdobuilder f9eca4
rdobuilder f9eca4
ifup_ovs_bridge ()
rdobuilder f9eca4
{
rdobuilder f9eca4
        if ovs-vsctl br-exists "${OVS_BRIDGE}"; then :; else
rdobuilder f9eca4
                /sbin/ifup "${OVS_BRIDGE}"
rdobuilder f9eca4
        fi
rdobuilder f9eca4
}
rdobuilder f9eca4
rdobuilder f9eca4
if [ -z "${UPPEDSTACK}" ]; then
rdobuilder f9eca4
        UPPEDSTACK="${DEVICE}"
rdobuilder f9eca4
fi
rdobuilder f9eca4
rdobuilder f9eca4
[ -n "${OVSREQUIRES}" ] && for _i in ${OVSREQUIRES}; do
rdobuilder f9eca4
        if ( check_recursion "$_i" ); then
rdobuilder f9eca4
                UPPEDSTACK="${UPPEDSTACK} $_i" /sbin/ifup "$_i"
rdobuilder f9eca4
        fi
rdobuilder f9eca4
done
rdobuilder f9eca4
rdobuilder f9eca4
SERVICE_UNIT=/usr/lib/systemd/system/openvswitch.service
rdobuilder f9eca4
if [ -f $SERVICE_UNIT ] && [ -x /usr/bin/systemctl ]; then
rdobuilder f9eca4
        if ! systemctl --quiet is-active openvswitch.service; then
rdobuilder f9eca4
                systemctl start openvswitch.service
rdobuilder f9eca4
        fi
rdobuilder f9eca4
else
rdobuilder f9eca4
        if [ ! -f /var/lock/subsys/openvswitch ]; then
rdobuilder f9eca4
                /sbin/service openvswitch start
rdobuilder f9eca4
        fi
rdobuilder f9eca4
fi
rdobuilder f9eca4
rdobuilder f9eca4
case "$TYPE" in
rdobuilder f9eca4
        OVSBridge|OVSUserBridge)
rdobuilder f9eca4
                # If bridge already exists and is up, it has been configured through
rdobuilder f9eca4
                # other cases like OVSPort, OVSIntPort and OVSBond. If it is down or
rdobuilder f9eca4
                # it does not exist, create it. It is possible for a bridge to exist
rdobuilder f9eca4
                # because it remained in the OVSDB for some reason, but it won't be up.
rdobuilder f9eca4
                if [ "${TYPE}" = "OVSUserBridge" ]; then
rdobuilder f9eca4
                        DATAPATH="netdev"
rdobuilder f9eca4
                fi
rdobuilder f9eca4
                if check_device_down "${DEVICE}"; then
rdobuilder f9eca4
                        ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS \
rdobuilder f9eca4
                        ${OVS_EXTRA+-- $OVS_EXTRA} \
rdobuilder f9eca4
                        ${STP+-- set bridge "$DEVICE" stp_enable="${STP}"} \
rdobuilder f9eca4
                        ${DATAPATH+-- set bridge "$DEVICE" datapath_type="$DATAPATH"}
rdobuilder f9eca4
                else
rdobuilder f9eca4
                        OVSBRIDGECONFIGURED="yes"
rdobuilder f9eca4
                fi
rdobuilder f9eca4
rdobuilder f9eca4
                # If MACADDR is provided in the interface configuration file,
rdobuilder f9eca4
                # we need to set it using ovs-vsctl; setting it with the "ip"
rdobuilder f9eca4
                # command in ifup-eth does not make the change persistent.
rdobuilder f9eca4
                if [ -n "$MACADDR" ]; then
rdobuilder f9eca4
                        ovs-vsctl -t ${TIMEOUT} -- set bridge "$DEVICE" \
rdobuilder f9eca4
                                other-config:hwaddr="$MACADDR"
rdobuilder f9eca4
                fi
rdobuilder f9eca4
rdobuilder f9eca4
                # When dhcp is enabled, the assumption is that there will be a port to
rdobuilder f9eca4
                # attach (otherwise, we can't reach out for dhcp). So, we do not
rdobuilder f9eca4
                # configure the bridge through rhel's ifup infrastructure unless
rdobuilder f9eca4
                # it is being configured after the port has been configured.
rdobuilder f9eca4
                # The "OVSINTF" is set only after the port is configured.
rdobuilder f9eca4
                if [ "${OVSBOOTPROTO}" = "dhcp" ] && [ -n "${OVSINTF}" ]; then
rdobuilder f9eca4
                        case " ${OVSDHCPINTERFACES} " in
rdobuilder f9eca4
                                *" ${OVSINTF} "*)
rdobuilder f9eca4
                                        BOOTPROTO=dhcp ${OTHERSCRIPT} ${CONFIG}
rdobuilder f9eca4
                                ;;
rdobuilder f9eca4
                        esac
rdobuilder f9eca4
                fi
rdobuilder f9eca4
rdobuilder f9eca4
                # When dhcp is not enabled, it is possible that someone may want
rdobuilder f9eca4
                # a standalone bridge (i.e it may not have any ports). Configure it.
rdobuilder f9eca4
                if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ] && \
rdobuilder f9eca4
                        [ "${OVSBRIDGECONFIGURED}" != "yes" ]; then
rdobuilder f9eca4
                        ${OTHERSCRIPT} ${CONFIG}
rdobuilder f9eca4
                fi
rdobuilder f9eca4
                exit 0
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSPort)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                ${OTHERSCRIPT} ${CONFIG} ${2}
rdobuilder f9eca4
                # The port might be already in the database but not yet
rdobuilder f9eca4
                # in the datapath.  So, remove the stale interface first.
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSIntPort)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
rdobuilder f9eca4
                        -- set Interface "$DEVICE" type=internal ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                if [ -n "${OVSDHCPINTERFACES}" ]; then
rdobuilder f9eca4
                        for _iface in ${OVSDHCPINTERFACES}; do
rdobuilder f9eca4
                                /sbin/ifup ${_iface}
rdobuilder f9eca4
                        done
rdobuilder f9eca4
                fi
rdobuilder f9eca4
                BOOTPROTO="${OVSBOOTPROTO}" ${OTHERSCRIPT} ${CONFIG} ${2}
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSBond)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                for _iface in $BOND_IFACES; do
rdobuilder f9eca4
                        /sbin/ifup ${_iface}
rdobuilder f9eca4
                done
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSTunnel)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
rdobuilder f9eca4
                        -- set Interface "$DEVICE" type=$OVS_TUNNEL_TYPE $OVS_TUNNEL_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSPatchPort)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
rdobuilder f9eca4
                        -- set Interface "$DEVICE" type=patch options:peer="${OVS_PATCH_PEER}" ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSDPDKPort)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE)
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
rdobuilder f9eca4
                        -- set Interface "$DEVICE" type=dpdk ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE)
rdobuilder f9eca4
                # The bridge may change its MAC to be the lower one among all its
rdobuilder f9eca4
                # ports. If that happens, bridge configuration (e.g. routes) will
rdobuilder f9eca4
                # be lost. Restore the post-up bridge configuration again.
rdobuilder f9eca4
                if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then
rdobuilder f9eca4
                        ${OTHERSCRIPT} "$OVS_BRIDGE"
rdobuilder f9eca4
                fi
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSDPDKVhostUserPort)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                PORT_TYPE="dpdkvhostuser"
rdobuilder f9eca4
                PORT_PATH=""
rdobuilder f9eca4
                if [ "$OVS_PORT_MODE" == "client" ]; then
rdobuilder f9eca4
                        PORT_TYPE="dpdkvhostuserclient"
rdobuilder f9eca4
                        PORT_PATH="options:vhost-server-path=${OVS_PORT_PATH}"
rdobuilder f9eca4
                fi
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
rdobuilder f9eca4
                        -- set Interface "$DEVICE" type=$PORT_TYPE \
rdobuilder f9eca4
                        $PORT_PATH \
rdobuilder f9eca4
                        ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        OVSDPDKBond)
rdobuilder f9eca4
                ifup_ovs_bridge
rdobuilder f9eca4
                BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE)
rdobuilder f9eca4
                for _iface in $BOND_IFACES; do
rdobuilder f9eca4
                        IFACE_TYPES="${IFACE_TYPES} -- set interface ${_iface} type=dpdk"
rdobuilder f9eca4
                done
rdobuilder f9eca4
                ovs-vsctl -t ${TIMEOUT} \
rdobuilder f9eca4
                        -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
rdobuilder f9eca4
                        -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${IFACE_TYPES} ${OVS_EXTRA+-- $OVS_EXTRA}
rdobuilder f9eca4
                BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE)
rdobuilder f9eca4
                # The bridge may change its MAC to be the lower one among all its
rdobuilder f9eca4
                # ports. If that happens, bridge configuration (e.g. routes) will
rdobuilder f9eca4
                # be lost. Restore the post-up bridge configuration again.
rdobuilder f9eca4
                if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then
rdobuilder f9eca4
                        ${OTHERSCRIPT} "$OVS_BRIDGE"
rdobuilder f9eca4
                fi
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
        *)
rdobuilder f9eca4
                echo $"Invalid OVS interface type $TYPE"
rdobuilder f9eca4
                exit 1
rdobuilder f9eca4
                ;;
rdobuilder f9eca4
esac