#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
TEXTDOMAIN=initscripts
cd /etc/sysconfig/network-scripts
. /etc/sysconfig/network-scripts/network-functions
cd /etc/sysconfig/network-scripts
[ -f ../network ] && . ../network
CONFIG=${1}
[ -z "${CONFIG}" ] && {
    echo $"Usage: ifup <device name>" >&2
    exit 1
}
need_config ${CONFIG}
[ -f "${CONFIG}" ] || {
    echo $"$0: configuration for ${1} not found." >&2
    echo $"Usage: ifup <device name>" >&2
    exit 1
}
source_config
IFSTAT_FILE="$IFSTAT_FILENAME_BASE${DEVICE}"
echo "bringup" > $IFSTAT_FILE
if [ -n "$IN_HOTPLUG" -a "${HOTPLUG}" = "no" -o "${HOTPLUG}" = "NO" ] ; then
    exit 0
fi
stop_dynamic_networking ${DEVICE}
if [ "${VLAN}" = "yes" ] ; then
    PHYSICAL_DEV=`echo ${DEVICE} | cut -d '.' -f1`
    check_device_down ${PHYSICAL_DEV} && {
        echo "VLAN physical device ${PHYSICAL_DEV} is down, cannot start VLAN ${DEVICE}"
        exit 1
    }
    if echo ${DEVICE} | \
       LANG=C egrep -q \
        'eth[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?|bond[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?' ; then
        VID="`echo ${DEVICE} | \
          LANG=C egrep 'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$|bond[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
          LANG=C sed 's/^[a-z0-9]*\.//g;s/^0*//'`"
        is_available ${PHYSICAL_DEV} ${BONDINGMODE} || {
            if [ "$?" = "1" ] ; then
                echo $"$alias device ${DEVICE} does not seem to be present, delaying initialization."
                exit 1
            else
                exit 0
            fi
        }
        if [ ! -f /proc/net/vlan/${DEVICE} ] ; then
            vconfig add ${PHYSICAL_DEV} ${VID} || {        
                echo $"ERROR: could not add vlan ${VID} as ${DEVICE} on dev ${PHYSICAL_DEV}"
                exit 1
            }
        fi
        if [ -f /proc/net/vlan/${DEVICE} ] ; then
            case "$REORDER_HDR" in
                yes|1)
                    vconfig set_flag ${DEVICE} 1 1 || {
                        echo $"WARNING: vconfig not able to enable REORDER_HDR on ${DEVICE}"
                    }
                ;;
                no|0)
                    vconfig set_flag ${DEVICE} 1 0 || {
                    echo $"WARNING: vconfig not able to disable REORDER_HDR on ${DEVICE}"
                }
                ;;
            esac
            echo $PRIORITY | grep -q "^[0-7]"
            if [ "$?" = "0" ] ; then
                vconfig set_egress_map ${DEVICE} 0 ${PRIORITY} 
            else
                echo $"Warning: no PRIORITY specified for VLAN device $DEVICE"
            fi
        fi
    fi
fi
if [ -n "${HWADDR}" ] ; then
    FOUNDMACADDR=`LC_ALL= LANG= /sbin/ip -o link show ${DEVICE} | \
    sed 's/.*link\/ether \([[:alnum:]:]*\).*/\1/'`
    if [ "${FOUNDMACADDR}" != "${HWADDR}" ] ; then        
        echo $"Device ${DEVICE} MAC address is $FOUNDMACADDR"
        echo $"Device ${DEVICE} hardware address is $HWADDR"
        echo $"Device ${DEVICE} MAC and hardware address differ, ignoring device!"
        echo $"Hint: if you wanted to trick kernel, specify ${DEVICE} MAC address only."
        exit 1    
    fi
fi
echo ${DEVICE} | grep "^bond"
if [ "$?" = "0" ] ; then 
    TYPE="bonding"
fi
if [ ${MACADDR} ] ; then
    /sbin/ip link set ${DEVICE} addr ${MACADDR}
fi
if [ ${MTU} ] ; then
    /sbin/ip link set ${DEVICE} mtu ${MTU}
fi
if [ "${TYPE}" = "bonding" ] ; then
    if [ "x$BONDINGMODE" = "x" ] ; then
        echo 1 > /sys/class/net/$DEVICE/bonding/mode
    else
        echo $BONDINGMODE > /sys/class/net/$DEVICE/bonding/mode
    fi
fi
if [ "${SLAVE}" = "yes" -a "${MASTER}" != "" ] ; then
    RFLAG="" ; [ "${RECEIVEONLY}" = "yes" ] && RFLAG="-r"
    /sbin/ip link set dev ${DEVICE} down
    echo $"Enslaving ${DEVICE} to ${MASTER}"
    /usr/bin/ifenslave ${RFLAG} "${MASTER}" "${DEVICE}"
    echo "enslaved" > $IFSTAT_FILE
    exit 0
else
    echo "This is not a slave device"
fi
if [ "${BOOTPROTO}" = "dhcp" ] ; then
    echo -n $"Determining IP information for ${DEVICE}..."
    start_dynamic_networking ${DEVICE}
else 
    echo $" DHCP not used on device ${DEVICE}"
    if [ -z "${IPADDR}" ] ; then
        if  ! /sbin/ip link set ${DEVICE} up ; then
            echo $"Failed to bring up ${DEVICE}."
            exit 1
        else
            echo $" Bringing up ${DEVICE} with no IP address."
        fi
        echo "noip" > $IFSTAT_FILE
        exit 0
    fi
    if [ -z "${NETMASK}" ] ; then
        NETMASK=`ipcalc -b ${IPADDR} | cut -d '=' -f2`
    fi
    PREFIX=`ipcalc -p ${IPADDR} ${NETMASK} | cut -d '=' -f2`
    if [ -z "${BROADCAST}" ] ; then
        BROADCAST=`ipcalc -b ${IPADDR} ${NETMASK} | cut -d '=' -f2`
    fi
    if [ -z "${NETWORK}" ] ; then
        NETWORK=`ipcalc -n ${IPADDR} ${NETMASK} | cut -d '=' -f2`
    fi
    [ -n "${ARP}${PROMISC}${ALLMULTI}" ] && \
       /sbin/ip link set ${DEVICE} $(toggle_value arp $ARP) \
       $(toggle_value promisc $PROMISC) \
       $(toggle_value allmulti $ALLMULTI)
    if [ "${DEVICE}" = "lo" ] ; then
        SCOPE="scope host"
    else
        SCOPE=
    fi
    if  ! /sbin/ip link set ${DEVICE} up ; then
        echo $"Failed to bring up ${DEVICE}."
        exit 1
    else
        echo $" Bringing up ${DEVICE}"
        if [ ${MACADDR} ] ; then
            /sbin/ip link set ${DEVICE} addr ${MACADDR}
        fi
        if [ ${MTU} ] ; then
            /sbin/ip link set ${DEVICE} mtu ${MTU}
        fi
    fi
    if ! arping -q -c 2 -w 3 -D -I ${DEVICE} ${IPADDR} ; then
        echo $"Error, some other host already uses address ${IPADDR}."
        echo $"Bringing down ${DEVICE}."
        /sbin/ip link set ${DEVICE} down
        exit 1
    fi
    if  ! LC_ALL=C /sbin/ip addr list ${DEVICE} | grep -q "${IPADDR}/${PREFIX}"  ; then
        if  ! /sbin/ip addr add ${IPADDR}/${PREFIX} \
          brd ${BROADCAST:-+} dev ${DEVICE} ${SCOPE} label ${DEVICE}  ; then
            echo $"Error adding address ${IPADDR} for ${DEVICE}."
        else
            echo $"Adding address ${IPADDR} for ${DEVICE}."
        fi
    fi
    if [ -n "$SRCADDR" ] ; then
        sysctl -w "net.ipv4.conf.${DEVICE}.arp_filter=1" >/dev/null 2>&1
    fi
    echo "Updating ARP cache of other devices on this subnet. Please wait 2 sec."
    arping -q -A -c 1 -I ${DEVICE} ${IPADDR}
    ( sleep 2; arping -q -U -c 1 -I ${DEVICE} ${IPADDR} ) > \
    /dev/null 2>&1 < /dev/null &
    if [ "$?" = "0" ] ; then
        echo "Failure to update ARP tables."
    else
        echo "ARP tables updated successfully."
    fi
    if [ "${DEVICE}" = "lo" ] ; then
        echo "Adding route add ${NETWORK}/${PREFIX} dev ${DEVICE} ${SRC}"
        /sbin/ip route add ${NETWORK}/${PREFIX} dev ${DEVICE} ${SRC}
    else
        add_policy_route ${DEVICE}
    fi
    update_mDNS
    echo "static" > $IFSTAT_FILE
fi
exit 0
