Blame | Last modification | View Log | RSS feed
#!/bin/bash# Network Interface Configuration System# Copyright (c) 1996-2013 Red Hat, Inc. all rights reserved.## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License, version 2,# as published by the Free Software Foundation.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.. /etc/init.d/functionscd /etc/sysconfig/network-scripts. ./network-functions[ -f ../network ] && . ../networkCONFIG=${1}source_config# Allow the user to override the detection of our physical device by passing# it in. No checking is done, if the user gives us a bogus dev, it's# their problem.[ -n "${PHYSDEV}" ] && REALDEVICE="$PHYSDEV". /etc/sysconfig/network# Check to make sure the device is actually upcheck_device_down ${DEVICE} && exit 0# If we are a P_Key device, we need to munge a few thingsif [ "${PKEY}" = yes ]; then[ -z "${PKEY_ID}" ] && {net_log $"InfiniBand IPoIB device: PKEY=yes requires a PKEY_ID"exit 1}[ -z "${PHYSDEV}" ] && {net_log $"InfiniBand IPoIB device: PKEY=yes requires a PHYSDEV"exit 1}# Normalize our PKEY_ID to have the high bit setNEW_PKEY_ID=`printf "0x%04x" $(( 0x8000 | ${PKEY_ID} ))`NEW_PKEY_NAME=`printf "%04x" ${NEW_PKEY_ID}`[ "${DEVICE}" != "${PHYSDEV}.${NEW_PKEY_NAME}" ] && {net_log $"Configured DEVICE name does not match what new device name would be. Thisis most likely because once the PKEY_ID was normalized, it no longerresulted in the expected device naming, and so the DEVICE entry in theconfig file needs to be updated to match. This can also be caused bygiving PKEY_ID as a hex number but without using the mandatory 0x prefix.Configured DEVICE=$DEVICEConfigured PHYSDEV=$PHYSDEVConfigured PKEY_ID=$PKEY_IDCalculated PKEY_ID=$NEW_PKEY_IDCalculated name=${PHYSDEV}.${NEW_PKEY_NAME}"exit 1}[ -d "/sys/class/net/${DEVICE}" ] || exit 0# When we get to downing the IP address, we need REALDEVICE to# point to our PKEY deviceREALDEVICE="${DEVICE}"fiif [ "${SLAVE}" != "yes" -o -z "${MASTER}" ]; thenif [ -n "${HWADDR}" -a -z "${MACADDR}" ]; thenHWADDR=$(echo $HWADDR | tail -c 24)FOUNDMACADDR=$(get_hwaddr ${REALDEVICE} | tail -c 24)if [ -n "${FOUNDMACADDR}" -a "${FOUNDMACADDR}" != "${HWADDR}" ]; thenNEWCONFIG=$(get_config_by_hwaddr ${FOUNDMACADDR})if [ -n "${NEWCONFIG}" ]; theneval $(LANG=C grep -F "DEVICE=" $NEWCONFIG)elsenet_log $"Device ${DEVICE} has MAC address ${FOUNDMACADDR}, instead of configured address ${HWADDR}. Ignoring."exit 1fiif [ -n "${NEWCONFIG}" -a "${NEWCONFIG##*/}" != "${CONFIG##*/}" -a "${DEVICE}" = "${REALDEVICE}" ]; thenexec /sbin/ifdown ${NEWCONFIG}elsenet_log $"Device ${DEVICE} has MAC address ${FOUNDMACADDR}, instead of configured address ${HWADDR}. Ignoring."exit 1fifififiif is_bonding_device ${DEVICE} ; thenfor device in $(LANG=C grep -l "^[[:space:]]*MASTER=\"\?${DEVICE}\"\?\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-*) ; dois_ignored_file "$device" && continue/sbin/ifdown ${device##*/}donefor arg in $BONDING_OPTS ; dokey=${arg%%=*};[[ "${key}" != "arp_ip_target" ]] && continuevalue=${arg##*=};if [ "${value:0:1}" != "" ]; thenOLDIFS=$IFS;IFS=',';for arp_ip in $value; doif grep -q $arp_ip /sys/class/net/${DEVICE}/bonding/arp_ip_target; thenecho "-$arp_ip" > /sys/class/net/${DEVICE}/bonding/arp_ip_targetfidoneIFS=$OLDIFS;elsevalue=${value#+};if grep -q $value /sys/class/net/${DEVICE}/bonding/arp_ip_target; thenecho "-$value" > /sys/class/net/${DEVICE}/bonding/arp_ip_targetfifidonefi/etc/sysconfig/network-scripts/ifdown-ipv6 ${CONFIG}retcode=0[ -n "$(pidof -x dhclient)" ] && {for VER in "" 6 ; doif [ -f "/var/run/dhclient$VER-${DEVICE}.pid" ]; thendhcpid=$(cat /var/run/dhclient$VER-${DEVICE}.pid)if [[ "$DHCPRELEASE" = [yY1]* ]]; then/sbin/dhclient -r -lf /var/lib/dhclient/dhclient$VER-${DEVICE}.leases -pf /var/run/dhclient-${DEVICE}.pid ${DEVICE} >/dev/null 2>&1retcode=$?elsekill $dhcpid >/dev/null 2>&1retcode=$?reason=STOP$VER interface=${DEVICE} /sbin/dhclient-scriptfiif [ -f "/var/run/dhclient$VER-${DEVICE}.pid" ]; thenrm -f /var/run/dhclient$VER-${DEVICE}.pidkill $dhcpid >/dev/null 2>&1fifidone}# we can't just delete the configured address because that address# may have been changed in the config file since the device was# brought up. Flush all addresses associated with this# instance instead.if [ -d "/sys/class/net/${REALDEVICE}" ]; thenif [ "${REALDEVICE}" = "${DEVICE}" ]; thenip addr flush dev ${REALDEVICE} scope global 2>/dev/nullelseip addr flush dev ${REALDEVICE} label ${DEVICE} scope global 2>/dev/nullfiif [ "${SLAVE}" = "yes" -a -n "${MASTER}" ]; thenecho "-${DEVICE}" > /sys/class/net/${MASTER}/bonding/slaves 2>/dev/nullfiif [ "${REALDEVICE}" = "${DEVICE}" ]; thenip link set dev ${DEVICE} down 2>/dev/nullfifi[ "$retcode" = "0" ] && retcode=$?# wait up to 5 seconds for device to actually come down...waited=0while ! check_device_down ${DEVICE} && [ "$waited" -lt 50 ] ; dousleep 10000waited=$(($waited+1))doneif [ "$retcode" = 0 ] ; then/etc/sysconfig/network-scripts/ifdown-post $CONFIG# do NOT use $? because ifdown should return whether or not# the interface went down.fiif [ -n "$PKEY" ]; then# PKey PKEYecho "$NEW_PKEY_ID" > /sys/class/net/${PHYSDEV}/delete_childfiexit $retcode