a4f5df7a07
- If there was an exiting dhclient running on the same interface as the new iface that left and returned then dhclient would be told to use the same interface twice. Dhclient would fail and exit after getting confused. Use "sort -u" on them to ensure no duplicates. This is a mostly a race condition on suspend and resume and how things happen to occur. - Check for netmask being set on an interface rather then up. An interface can be up but not configured. Reviewed by: mbr
273 lines
5.6 KiB
Bash
Executable File
273 lines
5.6 KiB
Bash
Executable File
#!/bin/sh -
|
|
#
|
|
# $FreeBSD$
|
|
#
|
|
# pccard_ether interfacename [start|stop] [ifconfig option]
|
|
#
|
|
# example: pccard_ether fxp0 start link0
|
|
#
|
|
|
|
. /etc/network.subr
|
|
|
|
stop_dhcp() {
|
|
# If dhclient is already running, record
|
|
# its interfaces.
|
|
if [ -x /usr/bin/grep ]; then
|
|
eval _active_list=\"`/bin/ps -axwww | \
|
|
/usr/bin/grep dhclient | \
|
|
/usr/bin/grep -v grep | \
|
|
/usr/bin/sed -e 's|^.*dhclient||' | \
|
|
/usr/bin/awk '{for (i=1;i<=NF;i++) \
|
|
{ if ($i~/[a-zA-Z].[0-9]$/) \
|
|
{ printf(" %s",$i) } }}'` \
|
|
\"
|
|
fi
|
|
|
|
# Get the rc.conf list of dhcp configured interfaces
|
|
static_dhcp_list="`list_net_interfaces dhcp`"
|
|
|
|
# Get the current ifconfig list of interfaces
|
|
_aprefix=
|
|
_nlist=
|
|
for _if in ${_active_list} ; do
|
|
_test_if=`ifconfig ${_if} 2>&1`
|
|
case "$_test_if" in
|
|
"ifconfig: interface $_if does not exist")
|
|
;;
|
|
${interface})
|
|
# Don't record the same device twice.
|
|
;;
|
|
*)
|
|
#
|
|
# Catch devices which were specified before,
|
|
# but have not been part of the rc. We need
|
|
# them again for the restart.
|
|
#
|
|
for _cif in ${static_dhcp_list} ; do
|
|
case "$_cif" in
|
|
${_if})
|
|
# Nothing to add
|
|
;;
|
|
*)
|
|
# Found interface beside rc.conf
|
|
_nlist="${_nlist}${_aprefix}${_if}"
|
|
;;
|
|
esac
|
|
done
|
|
_dhcplist="${_dhcplist}${_aprefix}${_if}"
|
|
[ -z "$_aprefix" ] && _aprefix=' '
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -s /var/run/dhclient.pid ]; then
|
|
pidfile="/var/run/dhclient.pid"
|
|
else
|
|
return
|
|
fi
|
|
/sbin/dhclient -r ${interface}
|
|
rm -f ${pidfile}
|
|
case ${startstop} in
|
|
[Ss][Tt][Oo][Pp])
|
|
if [ -z "${_nlist}" ]; then
|
|
sh `/etc/rc.d/dhclient start`
|
|
else
|
|
start_dhcp_keep_current
|
|
fi
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
}
|
|
|
|
start_dhcp() {
|
|
stop_dhcp
|
|
case ${pccard_ether_delay} in
|
|
[Nn][Oo])
|
|
;;
|
|
[0-9]*)
|
|
sleep ${pccard_ether_delay}
|
|
;;
|
|
esac
|
|
[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
|
|
[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
|
|
if [ -x "${dhclient_program}" ]; then
|
|
interfaces=`echo $_dhcplist ${interface} | xargs -n 1 echo | sort -u `
|
|
${dhclient_program} ${dhclient_flags} ${interfaces}
|
|
else
|
|
echo "${dhclient_program}: DHCP client software not available"
|
|
fi
|
|
}
|
|
|
|
# Called after detaching a card, if dhclient has been
|
|
# used for more than one interface.
|
|
start_dhcp_keep_current() {
|
|
[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
|
|
[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
|
|
if [ -x "${dhclient_program}" ]; then
|
|
${dhclient_program} ${dhclient_flags} \
|
|
${_dhcplist}
|
|
else
|
|
echo "${dhclient_program}: DHCP client software not available"
|
|
fi
|
|
}
|
|
|
|
# Suck in the configuration variables
|
|
#
|
|
if [ -r /etc/defaults/rc.conf ]; then
|
|
. /etc/defaults/rc.conf
|
|
source_rc_confs
|
|
elif [ -r /etc/rc.conf ]; then
|
|
. /etc/rc.conf
|
|
fi
|
|
|
|
interface=$1
|
|
shift
|
|
startstop=$1
|
|
shift
|
|
|
|
case ${pccard_ifconfig} in
|
|
[Nn][Oo] | '')
|
|
expr "${removable_interfaces}" : ".*${interface}" > /dev/null || exit 0
|
|
;;
|
|
*)
|
|
# Backward compatible
|
|
eval ifconfig_${interface}=\${pccard_ifconfig}
|
|
;;
|
|
esac
|
|
|
|
case ${startstop} in
|
|
[Ss][Tt][Aa][Rr][Tt] | '')
|
|
if [ -x /usr/bin/grep ]; then
|
|
if ifconfig ${interface} | grep -s netmask > /dev/null 2>&1; then
|
|
# Interface is already up, so ignore it.
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
if [ -r /etc/start_if.${interface} ]; then
|
|
. /etc/start_if.${interface}
|
|
fi
|
|
|
|
eval ifconfig_args=\$ifconfig_${interface}
|
|
case ${ifconfig_args} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
[Dd][Hh][Cc][Pp])
|
|
# Start up the DHCP client program
|
|
start_dhcp
|
|
;;
|
|
*)
|
|
# Do the primary ifconfig if specified
|
|
ifconfig ${interface} ${ifconfig_args} $*
|
|
|
|
# Check to see if aliases need to be added
|
|
alias=0
|
|
while :
|
|
do
|
|
eval ifx_args=\$ifconfig_${interface}_alias${alias}
|
|
if [ -n "${ifx_args}" ]; then
|
|
ifconfig ${interface} ${ifx_args} alias
|
|
alias=`expr ${alias} + 1`
|
|
else
|
|
break;
|
|
fi
|
|
done
|
|
|
|
# Do ipx address if specified
|
|
eval ifx_args=\$ifconfig_${interface}_ipx
|
|
if [ -n "${ifx_args}" ]; then
|
|
ifconfig ${interface} ${ifx_args}
|
|
fi
|
|
|
|
# Add default route into $static_routes
|
|
case ${defaultrouter} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
static_routes="default ${static_routes}"
|
|
route_default="default ${defaultrouter}"
|
|
;;
|
|
esac
|
|
|
|
# Add private route for this interface into $static_routes
|
|
eval ifx_routes=\$static_routes_${interface}
|
|
if [ -n "${ifx_routes}" ]; then
|
|
static_routes="${ifx_routes} ${static_routes}"
|
|
fi
|
|
|
|
# Set up any static routes if specified
|
|
if [ -n "${static_routes}" ]; then
|
|
for i in ${static_routes}; do
|
|
eval route_args=\$route_${i}
|
|
route add ${route_args}
|
|
done
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# IPv6 setup
|
|
case ${ipv6_enable} in
|
|
[Yy][Ee][Ss])
|
|
if [ -r /etc/network.subr ]; then
|
|
. /etc/network.subr
|
|
network6_interface_setup ${interface}
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
# Stop the interface
|
|
*)
|
|
if [ -r /etc/stop_if.${interface} ]; then
|
|
. /etc/stop_if.${interface}
|
|
fi
|
|
|
|
eval ifconfig_args=\$ifconfig_${interface}
|
|
case ${ifconfig_args} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
[Dd][Hh][Cc][Pp])
|
|
# Stop the DHCP client for this interface
|
|
stop_dhcp
|
|
;;
|
|
*)
|
|
# Delete static route if specified
|
|
eval ifx_routes=\$static_routes_${interface}
|
|
if [ -n "${ifx_routes}" ]; then
|
|
for i in ${ifx_routes}; do
|
|
eval route_args=\$route_${i}
|
|
route delete ${route_args}
|
|
done
|
|
fi
|
|
|
|
# Delete aliases if exist
|
|
alias=0
|
|
while :
|
|
do
|
|
eval ifx_args=\$ifconfig_${interface}_alias${alias}
|
|
if [ -n "${ifx_args}" ]; then
|
|
ifconfig ${interface} ${ifx_args} alias delete
|
|
alias=`expr ${alias} + 1`
|
|
else
|
|
break;
|
|
fi
|
|
done
|
|
;;
|
|
esac
|
|
|
|
# Remove the network interface and cleaning ARP table
|
|
ifconfig ${interface} delete
|
|
arp -d -a
|
|
|
|
# Clean the routing table
|
|
case ${removable_route_flush} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
# flush beforehand, just in case....
|
|
route -n flush -inet
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|