#!/sbin/runscript # Copyright 1999-2003 Gentoo Technologies, Inc. # Distributed under the terms of the GNU General Public License v2 # $Header: /etc/init.d/net.eth0,v 1.30 2003/10/18 18:03:19 faye Exp $ #NB: Config is in /etc/conf.d/net # For pcmcia users. note that pcmcia must be added to the same # runlevel as the net.* script that needs it. depend() { use hotplug } checkconfig() { if [ -z "${iface_IFACE}" ] then eerror "Please make sure that /etc/conf.d/net has \$iface_$IFACE set" return 1 fi } setup_env() { # No reason to check these multiple times in the file iface_IFACE="$(eval echo \$\{iface_${IFACE}\})" dhcpcd_IFACE="$(eval echo \$\{dhcpcd_${IFACE}\})" inet6_IFACE="$(eval echo \$\{inet6_${IFACE}\})" alias_IFACE="$(eval echo \$\{alias_${IFACE}\})" status_IFACE="$(ifconfig | gawk -v IFACE="${IFACE}" '/Link/ { if ($1 == IFACE) print "up" }')" if [ -x `which iwconfig` ]; then wireless_IFACE="$(iwconfig 2>/dev/null | gawk -v IFACE="${IFACE}" '/IEEE/ { if ($1 == IFACE) print "yes" }')" fi wireless_IFACE=${wireless_IFACE:-"no"} if [ -x `which mii-tool` ]; then link_IFACE=$(mii-tool ${IFACE} 2>/dev/null | gawk '{print $2}') fi link_IFACE=${link_IFACE:-"yes"} } setup_wireless() { # Reset to some defaults iwconfig $IFACE mode Managed iwconfig $IFACE rate auto iwconfig $IFACE key off iwconfig $IFACE rts off iwconfig $IFACE frag off iwconfig $IFACE essid any # Initiate a scan ifconfig $IFACE up # Wait for a response sleep 2 # Find known access points for AP in `iwlist ${IFACE} scan 2>/dev/null | grep ESSID | awk -F: '{print $2}' | sed 's/[-"]//g'`; do if [ -z ${essid_AP} ]; then essid_AP="$(eval echo \$\{essid_${AP}\})" if [ ! -z ${essid_AP} ]; then # setup variables key_AP="$(eval echo \$\{key_${AP}\})" iface_IFACE="$(eval echo \$\{iface_${AP}\})" gateway="${IFACE}/$(eval echo \$\{gateway_${AP}\})" fi fi done # Bring interface down to apply changes ifconfig $IFACE down #ewarn "Setting wireless parameters ${essid_AP} and ${key_AP}" if [ ! -z ${essid_AP} ]; then iwconfig ${IFACE} essid ${essid_AP} fi if [ ! -z ${key_AP} ]; then iwconfig ${IFACE} key ${key_AP} fi # Bring the interface up ifconfig $IFACE up # Wait for the system to associate while [ `iwconfig $IFACE | awk '/\<..:..:..:..:..:..\>/{print}' | sed 's/^.*\<\(..:..:..:..:..:..\)\>.*$/\1/g'` = FF:FF:FF:FF:FF:FF ]; do LC_NUMERIC=C sleep 0.5 done return 0 } start() { local retval=0 setup_env checkconfig || return 1 if [ ${wireless_IFACE} == "yes" ]; then ebegin "Detecting network for ${IFACE}" setup_wireless eend 0 fi ebegin "Bringing ${IFACE} up" if [ ${link_IFACE} == "no" ] then retval=1 eend ${retval} "Failed to bring ${IFACE} up" return ${retval} fi if [ "${iface_IFACE}" != "dhcp" ] then /sbin/ifconfig ${IFACE} ${iface_IFACE} >/dev/null || { retval=$? eend ${retval} "Failed to bring ${IFACE} up" return ${retval} } # ifconfig do not always return failure .. /sbin/ifconfig ${IFACE} &> /dev/null || { retval=$? eend ${retval} "Failed to bring ${IFACE} up" return ${retval} } else # Check that eth0 was not brough up by the kernel ... if [ "${status_IFACE}" != "up" ] then /sbin/dhcpcd ${dhcpcd_IFACE} ${IFACE} >/dev/null || { retval=$? eend ${retval} "Failed to bring ${IFACE} up" return ${retval} } fi fi eend 0 if [ -n "${alias_IFACE}" ] then local x="" local num=0 local aliasbcast="" local aliasnmask="" ebegin " Adding aliases" for x in ${alias_IFACE} do aliasbcast="$(eval echo \$\{broadcast_${IFACE}\} \| awk \'\{ print \$$((num + 1)) \}\')" if [ -n "${aliasbcast}" ] then aliasbcast="broadcast ${aliasbcast}" fi aliasnmask="$(eval echo \$\{netmask_${IFACE}\} \| awk \'\{ print \$$((num + 1)) \}\')" if [ -n "${aliasnmask}" ] then aliasnmask="netmask ${aliasnmask}" fi ebegin " ${IFACE}:${num}" /sbin/ifconfig ${IFACE}:${num} ${x} \ ${aliasbcast} ${aliasnmask} >/dev/null num=$((num + 1)) eend 0 done save_options "alias" "${alias_IFACE}" fi if [ -n "${inet6_IFACE}" ] then local x="" ebegin " Adding inet6 addresses" for x in ${inet6_IFACE} do ebegin " ${IFACE} inet6 add ${x}" /sbin/ifconfig ${IFACE} inet6 add ${x} >/dev/null eend 0 done save_options "inet6" "${inet6_IFACE}" fi if [ -n "${gateway}" ] && [ "${gateway%/*}" = "${IFACE}" ] then ebegin " Setting default gateway" # First delete any existing routes if it was setup by kernel .. /sbin/route del default dev ${gateway%/*} &>/dev/null /sbin/route add default gw ${gateway#*/} dev ${gateway%/*} \ netmask 0.0.0.0 metric 1 >/dev/null || { local error=$? ifconfig ${IFACE} down &>/dev/null eend ${error} "Failed to bring ${IFACE} up" stop return ${error} } eend 0 fi # Enabling rp_filter causes wacky packets to be auto-dropped by # the kernel if [ -e /proc/sys/net/ipv4/conf/${IFACE}/rp_filter ] then echo 1 > /proc/sys/net/ipv4/conf/${IFACE}/rp_filter fi # If started by hotplug, this doesn't get done. # perhaps the right fix is in hotplug ln -sf /etc/init.d/net.${IFACE} /var/lib/init.d/started/net.${IFACE} } stop() { local myalias="$(get_options alias)" local myinet6="$(get_options inet6)" setup_env ebegin "Bringing ${IFACE} down" # Also down the inet6 interfaces if [ -n "${myinet6}" ] then local x="" for x in ${myinet6} do /sbin/ifconfig ${IFACE} inet6 del ${x} >/dev/null done fi # Do some cleanup in case the amount of aliases change if [ -n "${myalias}" ] then local x="" local num=0 for x in ${myalias} do /sbin/ifconfig ${IFACE}:${num} down >/dev/null num=$((num + 1)) done fi if [ "${iface_IFACE}" = "dhcp" ] then local count=0 while /sbin/dhcpcd -k ${IFACE} &>/dev/null && [ "${count}" -lt 9 ] do # Give dhcpcd time to properly shutdown sleep 1 count=$((count + 1)) done if [ "${count}" -ge 9 ] then eerror "Timed out trying to stop dhcpcd" fi else /sbin/ifconfig ${IFACE} down >/dev/null fi eend 0 } # vim:ts=4