From 5b56f96aaad4a55a26576e0610fb49bde448dabe Mon Sep 17 00:00:00 2001 From: Gurucharan Shetty Date: Wed, 13 Mar 2013 12:24:54 -0700 Subject: [PATCH] rhel: Prevent duplicate ifup calls. When we configure OVS using rhel ifupdown scripts, we call ifup on a bridge twice. Once while configuring the bridge and once while configuring the ports of the bridge. This looks harmless but unnecessary. This patch fixes the behavior. Signed-off-by: Gurucharan Shetty --- rhel/README.RHEL | 6 +++- rhel/etc_sysconfig_network-scripts_ifup-ovs | 38 +++++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/rhel/README.RHEL b/rhel/README.RHEL index d9b68e4b3..ba2774a66 100644 --- a/rhel/README.RHEL +++ b/rhel/README.RHEL @@ -42,11 +42,15 @@ assignments. The following OVS-specific variable names are supported: Note ---- -"ifdown" on a bridge will not bring individual ports on the bridge +* "ifdown" on a bridge will not bring individual ports on the bridge down. "ifup" on a bridge will not add ports to the bridge. This behavior should be compatible with standard bridges (with TYPE=Bridge). +* If 'ifup' on an interface is called multiple times, one can see +"RTNETLINK answers: File exists" printed on the console. This comes from +ifup-eth trying to add zeroconf route multiple times and is harmless. + Examples -------- diff --git a/rhel/etc_sysconfig_network-scripts_ifup-ovs b/rhel/etc_sysconfig_network-scripts_ifup-ovs index ae095a083..b36252020 100755 --- a/rhel/etc_sysconfig_network-scripts_ifup-ovs +++ b/rhel/etc_sysconfig_network-scripts_ifup-ovs @@ -34,7 +34,7 @@ if [ ! -x ${OTHERSCRIPT} ]; then OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth" fi -check_recursion() +check_recursion () { [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do [ "$_r" = "$1" ] && return 1 @@ -43,6 +43,13 @@ check_recursion() return 0 } +ifup_ovs_bridge () +{ + if ovs-vsctl br-exists "${OVS_BRIDGE}"; then :; else + /sbin/ifup "${OVS_BRIDGE}" + fi +} + if [ -z "${UPPEDSTACK}" ]; then UPPEDSTACK="${DEVICE}" fi @@ -57,7 +64,22 @@ done case "$TYPE" in OVSBridge) - ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA} + # If bridge already exists and is up, it has been configured through + # other cases like OVSPort, OVSIntPort and OVSBond. If it is down or + # it does not exist, create it. It is possible for a bridge to exist + # because it remained in the OVSDB for some reason, but it won't be up. + if check_device_down "${DEVICE}"; then + ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS \ + ${OVS_EXTRA+-- $OVS_EXTRA} + else + OVSBRIDGECONFIGURED="yes" + fi + + # When dhcp is enabled, the assumption is that there will be a port to + # attach (otherwise, we can't reach out for dhcp). So, we do not + # configure the bridge through rhel's ifup infrastructure unless + # it is being configured after the port has been configured. + # The "OVSINTF" is set only after the port is configured. if [ "${OVSBOOTPROTO}" = "dhcp" ] && [ -n "${OVSINTF}" ]; then case " ${OVSDHCPINTERFACES} " in *" ${OVSINTF} "*) @@ -65,25 +87,29 @@ case "$TYPE" in ;; esac fi - if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ]; then + + # When dhcp is not enabled, it is possible that someone may want + # a standalone bridge (i.e it may not have any ports). Configure it. + if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ] && \ + [ "${OVSBRIDGECONFIGURED}" != "yes" ]; then ${OTHERSCRIPT} ${CONFIG} fi [ -n "${STP}" ] && ovs-vsctl --no-wait set bridge "${DEVICE}" stp_enable="${STP}" exit 0 ;; OVSPort) - /sbin/ifup "$OVS_BRIDGE" + ifup_ovs_bridge ${OTHERSCRIPT} ${CONFIG} ${2} ovs-vsctl -t ${TIMEOUT} -- --may-exist add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA} OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE" ;; OVSIntPort) - /sbin/ifup "$OVS_BRIDGE" + ifup_ovs_bridge ovs-vsctl -t ${TIMEOUT} -- --may-exist add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS -- set Interface "$DEVICE" type=internal ${OVS_EXTRA+-- $OVS_EXTRA} ${OTHERSCRIPT} ${CONFIG} ${2} ;; OVSBond) - /sbin/ifup "$OVS_BRIDGE" + ifup_ovs_bridge for _iface in $BOND_IFACES; do /sbin/ifup ${_iface} done -- 2.43.0