2009-08-26 17:00:38 +02:00
|
|
|
#!/bin/sh
|
|
|
|
# /etc/rc.d/rc.wireless
|
|
|
|
# $Id: rc.wireless,v 1.13 2007/04/13 14:14:43 eha Exp eha $
|
|
|
|
#
|
|
|
|
# Wireless network card setup.
|
|
|
|
#
|
|
|
|
# This script sets up PCI, USB, and 32-bit Cardbus wireless devices
|
|
|
|
# NOT 16-bit PCMCIA cards! Those are configured in /etc/pcmcia/.
|
|
|
|
# Single parameter to this script is the name of a network interface.
|
|
|
|
# Normally this script is called from rc.inet1 rather than run
|
|
|
|
# directly.
|
|
|
|
#
|
|
|
|
# This script is a modified '/etc/pcmcia/wireless' script
|
|
|
|
# 09/apr/2004 by Eric Hameleers
|
|
|
|
# 16/sep/2004 * Eric Hameleers * Fixed iwspy and iwpriv commands
|
|
|
|
# 08/apr/2005 * Eric Hameleers * Allow per-interface overrides of the wireless
|
|
|
|
# parameters (see /etc/rc.d/rc.inet1.conf)
|
|
|
|
# 11/apr/2005 * Eric Hameleers * Tune wpa_supplicant interactions.
|
|
|
|
# 23/apr/2005 * Eric Hameleers * First configure card with iwconfig,
|
|
|
|
# before starting wpa_supplicant
|
|
|
|
# 27/apr/2005 * Eric Hameleers * Multiple 'iwpriv $INTERFACE set' commands.
|
|
|
|
# 14/feb/2006 * Eric Hameleers * Better error messages; alternative way of
|
|
|
|
# getting HWADDR; parametrized WPA_WAIT value.
|
|
|
|
# Don't kill an already running wpa_supplicant.
|
|
|
|
# 29/apr/2006 * Pat Volkerding * Reverted HWADDR change, since it relies on
|
|
|
|
# a binary (macaddr) that is not built or
|
|
|
|
# installed by default since it is not
|
|
|
|
# compatible with all interfaces.
|
|
|
|
# 15/aug/2006 * Eric Hameleers * Added missing "" around $ESSID, which broke
|
|
|
|
# ESSIDs that contain a space character.
|
|
|
|
# 10/oct/2006 * Eric Hameleers * Added default empty values for all parameters.
|
|
|
|
# This makes a second wireless card leave
|
|
|
|
# wpa_supplicant alone if WPA is not configured.
|
|
|
|
# 15/oct/2006 * Eric Hameleers * Swapped the calls to "key <key>" and
|
|
|
|
# "key restricted" since that might be needed
|
|
|
|
# for WEP to work reliably.
|
|
|
|
# 09/jan/2007 * Eric Hameleers * Add explicit default values to wireless params;
|
|
|
|
# also set the ESSID before IWPRIV commands,
|
|
|
|
# needed for some RaLink cards;
|
|
|
|
# use /proc/net/wireless instead of calling
|
|
|
|
# iwconfig to determine if a card is wireless.
|
|
|
|
# 13/apr/2007 * Eric Hameleers * Use of the IWPRIV variable was broken.
|
|
|
|
# NOTE: if you need to enter multiple parameters
|
|
|
|
# in IWPRIV, you must separate them with the pipe
|
|
|
|
# (|) character - this used to be a space char!
|
|
|
|
# See the example in rc.inet1.conf.
|
|
|
|
# 16/apr/2008 * Pat Volkerding * Make sure that HWADDR is all upper case.
|
|
|
|
# 23/apr/2008 * Pat Volkerding * Increase sleep time after bringing up an
|
|
|
|
# interface to 3 seconds. Some drivers
|
2018-05-28 21:12:29 +02:00
|
|
|
# need this additional time to initalize.
|
2010-05-19 10:58:23 +02:00
|
|
|
# 02/jan/2010 * Pat Volkerding * Look for /sys/class/net/$NETDEV/wireless rather
|
|
|
|
# than the contents of /proc/net/wireless to find
|
|
|
|
# if a network device is wireless. In newer
|
|
|
|
# kernels devices will not show up in
|
|
|
|
# /proc/net/wireless until active.
|
2012-09-26 03:10:42 +02:00
|
|
|
# 16/aug/2012 * Pat Volkerding * Use several tests to determine if an interface
|
|
|
|
# is wireless, as the reliability of any given
|
|
|
|
# test may depend on the kernel options and the
|
|
|
|
# wireless driver used.
|
|
|
|
# Convert the MAC address to uppercase in sed.
|
2021-03-01 21:10:44 +01:00
|
|
|
# 11/Nov/2019 * Darren Austin * Log to syslog, failling back to stdout.
|
|
|
|
# Output error to stderr if not called from
|
|
|
|
# rc.inet1.
|
2021-03-19 00:54:14 +01:00
|
|
|
# 09/Mar/2021 * Darren Austin * Don't leave the interface in an 'up' state upon
|
|
|
|
# exit from the script - this causes problems for
|
|
|
|
# SLAAC in rc.inet1 when control is returned.
|
2009-08-26 17:00:38 +02:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
2021-03-01 21:10:44 +01:00
|
|
|
# If possible, log events in /var/log/messages:
|
|
|
|
if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then
|
|
|
|
LOGGER=/usr/bin/logger
|
|
|
|
else # output to stdout/stderr:
|
|
|
|
LOGGER=/bin/cat
|
|
|
|
fi
|
2009-08-26 17:00:38 +02:00
|
|
|
|
2021-03-01 21:10:44 +01:00
|
|
|
if [ -z "$IFNAME" ] ; then
|
|
|
|
echo "ERROR: The script 'rc.wireless' must be executed by 'rc.inet1'!" >&2
|
|
|
|
echo " You should run the command \"/etc/rc.d/rc.inet1 <your_interface>_start\" yourself." >&2
|
2009-08-26 17:00:38 +02:00
|
|
|
return 1 2> /dev/null || exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
INTERFACE=$1
|
|
|
|
|
|
|
|
# Find the path where wireless tools are installed
|
|
|
|
for IWPATH in /usr/{bin,sbin} /usr/local/{bin,sbin} /sbin /bin ; do
|
|
|
|
if [ -x $IWPATH/iwconfig ] ; then break ; fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# The same for wpa_supplicant (needed for WPA support)
|
|
|
|
for SUPPATH in /usr/{bin,sbin} /usr/local/{bin,sbin} /sbin /bin ; do
|
|
|
|
if [ -x $SUPPATH/wpa_supplicant ] ; then break ; fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# Set all desired settings through the wireless tools
|
|
|
|
IWCOMMAND="$IWPATH/iwconfig ${INTERFACE}"
|
|
|
|
IWPRIVCMD="$IWPATH/iwpriv ${INTERFACE}"
|
|
|
|
IWSPYCMD="$IWPATH/iwspy ${INTERFACE}"
|
2018-05-28 21:12:29 +02:00
|
|
|
IFCOMMAND="/sbin/ip link set dev ${INTERFACE}"
|
2009-08-26 17:00:38 +02:00
|
|
|
|
|
|
|
is_wireless_device ()
|
|
|
|
{
|
2012-09-26 03:10:42 +02:00
|
|
|
# Return 0 for a wireless interface, or 1 for a non-wireless interface.
|
2021-03-01 21:10:44 +01:00
|
|
|
if [ -d /sys/class/net/${1}/wireless ]; then
|
2012-09-26 03:10:42 +02:00
|
|
|
return 0
|
2021-03-01 21:10:44 +01:00
|
|
|
elif grep -Fxq 'DEVTYPE=wlan' /sys/class/net/${1}/uevent 2>/dev/null; then
|
2012-09-26 03:10:42 +02:00
|
|
|
return 0
|
2021-03-01 21:10:44 +01:00
|
|
|
elif LC_ALL=C $IWPATH/iwconfig $1 2>&1 | grep -q "IEEE 802.11" ; then
|
2012-09-26 03:10:42 +02:00
|
|
|
return 0
|
|
|
|
else # all tests failed, assume the device is not wireless (or add a better test :)
|
|
|
|
return 1
|
2009-08-26 17:00:38 +02:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
###############
|
|
|
|
# EXIT POINTS #
|
|
|
|
###############
|
|
|
|
|
|
|
|
# Is the device wireless? If not, exit this script.
|
|
|
|
is_wireless_device ${INTERFACE} || return 0 2> /dev/null || exit 0
|
|
|
|
|
|
|
|
# If we stop a wireless interface using wpa_supplicant,
|
|
|
|
# we'll kill its wpa_supplicant daemon too and exit this script:
|
|
|
|
if [ "$2" = "stop" ]; then
|
2021-03-01 21:10:44 +01:00
|
|
|
pkill --full "bin/wpa_supplicant.* -i${INTERFACE}"
|
2009-08-26 17:00:38 +02:00
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
# -----------------------------------------------------
|
|
|
|
# Continue with the script - bringing the interface UP.
|
|
|
|
# -----------------------------------------------------
|
|
|
|
|
|
|
|
# Bring interface up - for determining the HWADDR
|
|
|
|
$IFCOMMAND up
|
|
|
|
sleep 3
|
|
|
|
|
|
|
|
# Get the MAC address for the interface
|
2021-03-01 21:10:44 +01:00
|
|
|
HWADDR=$(cat "/sys/class/net/${INTERFACE}/address")
|
2009-08-26 17:00:38 +02:00
|
|
|
|
|
|
|
# Empty all wireless parameters- some of them could still be set for a previous interface:
|
|
|
|
# when rc.inet1 is sourced from rc.M all scripts are run in the same shell.
|
|
|
|
CHANNEL=""
|
|
|
|
ESSID=""
|
|
|
|
FREQ=""
|
|
|
|
FRAG=""
|
|
|
|
IWCONFIG=""
|
|
|
|
IWPRIV=""
|
|
|
|
IWSPY=""
|
|
|
|
KEY=""
|
|
|
|
MODE=""
|
|
|
|
NICKNAME=""
|
|
|
|
NWID=""
|
|
|
|
RATE=""
|
|
|
|
RTS=""
|
|
|
|
SENS=""
|
|
|
|
WPA=""
|
|
|
|
WPADRIVER=""
|
|
|
|
WPACONF=""
|
|
|
|
WPAWAIT=""
|
|
|
|
# Read the configuration information for the card with address $HWADDR
|
|
|
|
# from /etc/rc.d/rc.wireless.conf:
|
|
|
|
[[ -r /etc/rc.d/rc.wireless.conf ]] && . /etc/rc.d/rc.wireless.conf
|
|
|
|
|
|
|
|
# Let any per-interface overrides (the WLAN_xxxx parameters) that are set
|
|
|
|
# in /etc/rc.d/rc.inet1.conf have precedence.
|
|
|
|
# The reason: you might have multiple wireless cards of the same brand, or
|
|
|
|
# connecting to multiple networks.
|
|
|
|
# Position 'i' of this interface in the IFNAME array was determined in rc.inet1
|
|
|
|
CHANNEL=${WLAN_CHANNEL[$i]:-${CHANNEL}}
|
|
|
|
ESSID=${WLAN_ESSID[$i]:-${ESSID}}
|
|
|
|
FREQ=${WLAN_FREQ[$i]:-${FREQ}}
|
|
|
|
FRAG=${WLAN_FRAG[$i]:-${FRAG}}
|
|
|
|
IWCONFIG=${WLAN_IWCONFIG[$i]:-${IWCONFIG}}
|
|
|
|
IWPRIV=${WLAN_IWPRIV[$i]:-${IWPRIV}}
|
|
|
|
IWSPY=${WLAN_IWSPY[$i]:-${IWSPY}}
|
|
|
|
KEY=${WLAN_KEY[$i]:-${KEY}}
|
|
|
|
MODE=${WLAN_MODE[$i]:-${MODE}}
|
|
|
|
NICKNAME=${WLAN_NICKNAME[$i]:-${NICKNAME}}
|
|
|
|
NWID=${WLAN_NWID[$i]:-${NWID}}
|
|
|
|
RATE=${WLAN_RATE[$i]:-${RATE}}
|
|
|
|
RTS=${WLAN_RTS[$i]:-${RTS}}
|
|
|
|
SENS=${WLAN_SENS[$i]:-${SENS}}
|
|
|
|
WPA=${WLAN_WPA[$i]:-${WPA}}
|
|
|
|
# The "ext" interface will be default if not explicitly set
|
|
|
|
WPADRIVER=${WLAN_WPADRIVER[$i]:-${WPADRIVER:="wext"}}
|
|
|
|
# The default config file as installed by the wpa_supplicant package:
|
|
|
|
WPACONF=${WLAN_WPACONF[$i]:-${WPACONF:="/etc/wpa_supplicant.conf"}}
|
|
|
|
WPAWAIT=${WLAN_WPAWAIT[$i]:-${WPAWAIT:="60"}}
|
|
|
|
|
|
|
|
|
2021-03-01 21:10:44 +01:00
|
|
|
[ -n "$VERBOSE" ] && [ -n "$INFO" ] && echo "$0: $1 information: '$INFO'"
|
2009-08-26 17:00:38 +02:00
|
|
|
|
|
|
|
###################
|
|
|
|
# WIRELESS CONFIG #
|
|
|
|
###################
|
|
|
|
|
|
|
|
# Mode needs to be first : some settings apply only in a specific mode!
|
|
|
|
if [ -n "$MODE" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND mode $MODE" | $LOGGER
|
|
|
|
# if $IWCOMMAND fails, try taking the interface down to run it.
|
|
|
|
# Some drivers require this.
|
|
|
|
if ! $IWCOMMAND mode $MODE 2> /dev/null ; then
|
|
|
|
$IFCOMMAND down
|
|
|
|
$IWCOMMAND mode $MODE
|
|
|
|
$IFCOMMAND up
|
|
|
|
sleep 3
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
# This is a bit hackish, but should do the job right...
|
|
|
|
if [ ! -n "$NICKNAME" ] ; then
|
2012-09-26 03:10:42 +02:00
|
|
|
NICKNAME=$(/bin/hostname)
|
2009-08-26 17:00:38 +02:00
|
|
|
fi
|
2021-03-01 21:10:44 +01:00
|
|
|
if [ -n "$ESSID" ] || [ -n "$MODE" ] ; then
|
2009-08-26 17:00:38 +02:00
|
|
|
echo "$0: $IWCOMMAND nick $NICKNAME" | $LOGGER
|
|
|
|
$IWCOMMAND nick $NICKNAME
|
|
|
|
fi
|
|
|
|
# Regular stuff...
|
|
|
|
if [ -n "$NWID" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND nwid $NWID" | $LOGGER
|
|
|
|
$IWCOMMAND nwid $NWID
|
|
|
|
fi
|
|
|
|
if [ -n "$FREQ" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND freq $FREQ" | $LOGGER
|
|
|
|
$IWCOMMAND freq $FREQ
|
|
|
|
elif [ -n "$CHANNEL" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND channel $CHANNEL" | $LOGGER
|
|
|
|
$IWCOMMAND channel $CHANNEL
|
|
|
|
fi
|
|
|
|
|
|
|
|
# WEP keys (non-WPA)
|
2021-03-01 21:10:44 +01:00
|
|
|
if [ -n "$KEY" ] && [ ! -n "$WPA" ] ; then
|
2009-08-26 17:00:38 +02:00
|
|
|
if [ "$KEY" = "off" ]; then
|
|
|
|
echo "$0: $IWCOMMAND key open" | $LOGGER
|
|
|
|
$IWCOMMAND key open
|
|
|
|
echo "$0: $IWCOMMAND key off" | $LOGGER
|
|
|
|
$IWCOMMAND key off
|
|
|
|
else
|
|
|
|
echo "$0: $IWCOMMAND key ************" | $LOGGER
|
|
|
|
$IWCOMMAND key $KEY
|
|
|
|
if ! echo "$KEY" | egrep -qw "restricted|open" ; then
|
|
|
|
# Set "restricted" as the default security mode:
|
|
|
|
echo "$0: $IWCOMMAND key restricted" | $LOGGER
|
|
|
|
$IWCOMMAND key restricted
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
if [ -n "$SENS" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND sens $SENS" | $LOGGER
|
|
|
|
$IWCOMMAND sens $SENS
|
|
|
|
fi
|
|
|
|
if [ -n "$RATE" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND rate $RATE" | $LOGGER
|
|
|
|
$IWCOMMAND rate $RATE
|
|
|
|
fi
|
|
|
|
if [ -n "$RTS" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND rts $RTS" | $LOGGER
|
|
|
|
$IWCOMMAND rts $RTS
|
|
|
|
fi
|
|
|
|
if [ -n "$FRAG" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND frag $FRAG" | $LOGGER
|
|
|
|
$IWCOMMAND frag $FRAG
|
|
|
|
fi
|
|
|
|
# More specific parameters
|
|
|
|
if [ -n "$IWCONFIG" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND $IWCONFIG" | $LOGGER
|
|
|
|
$IWCOMMAND $IWCONFIG
|
|
|
|
fi
|
|
|
|
if [ -n "$IWSPY" ] ; then
|
|
|
|
echo "$0: $IWSPYCMD $IWSPY" | $LOGGER
|
|
|
|
$IWSPYCMD $IWSPY
|
|
|
|
fi
|
|
|
|
# For RaLink cards, the SSID must be set right before configuring WPAPSK/TKIP parameters
|
|
|
|
# using iwpriv commands in order to generate the wpapsk password. This should not hurt other cards:
|
|
|
|
if [ -n "$ESSID" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND essid \"$ESSID\"" | $LOGGER
|
|
|
|
$IWCOMMAND essid "$ESSID"
|
|
|
|
fi
|
|
|
|
# The iwpriv can set one private IOCTL at the time, so if the $IWPRIV
|
|
|
|
# variable contains multiple pipe ('|') separated settings, we split them here:
|
|
|
|
# WARNING: if your iwpriv commands contain a WEP/WPA key, these can be logged
|
|
|
|
# in /var/log/messages!
|
|
|
|
if [ -n "$IWPRIV" ] ; then
|
|
|
|
echo "${IWPRIV}|" | \
|
|
|
|
while read -d '|' iwi; do
|
|
|
|
if [ -n "$iwi" ]; then
|
2021-03-01 21:10:44 +01:00
|
|
|
echo "$0: $IWPRIVCMD $iwi" | $LOGGER
|
2009-08-26 17:00:38 +02:00
|
|
|
$IWPRIVCMD $iwi
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
##################
|
|
|
|
# WPA_SUPPLICANT #
|
|
|
|
##################
|
|
|
|
|
|
|
|
# Support for WPA (wireless protected access) is provided by wpa_supplicant
|
|
|
|
# for those drivers that support it (and it looks like wpa_supplicant is
|
|
|
|
# the future for WPA support in Linux anyway)
|
|
|
|
if [ "$WPA" = "wpa_supplicant" ] || [ "$WPA" = "wpaxsupplicant" ] && [ -x ${SUPPATH}/wpa_supplicant ]; then
|
|
|
|
# Interface down, so wpa_supplicant can associate with the AP
|
|
|
|
$IFCOMMAND down
|
|
|
|
#WPACONF=${WPACONF:-/etc/wpa_supplicant.conf}
|
|
|
|
WPA_OPTIONS=""
|
2021-03-01 21:10:44 +01:00
|
|
|
[ -n "$WPADRIVER" ] && WPA_OPTIONS="-D${WPADRIVER}" # specify the driver
|
|
|
|
[ "$WPA" = "wpaxsupplicant" ] && WPA_OPTIONS="${WPA_OPTIONS} -e" # Use external xsupplicant (disables the internal supplicant)
|
2009-08-26 17:00:38 +02:00
|
|
|
|
|
|
|
# We leave a running wpa_supplicant process in peace:
|
2021-03-01 21:10:44 +01:00
|
|
|
if pgrep --full "bin/wpa_supplicant.* -i${INTERFACE}" >/dev/null ; then
|
2009-08-26 17:00:38 +02:00
|
|
|
echo "$0: wpa_supplicant found running already" | $LOGGER
|
|
|
|
else
|
|
|
|
echo "$0: wpa_supplicant -B -c${WPACONF} ${WPA_OPTIONS} -i$INTERFACE" | $LOGGER
|
|
|
|
${SUPPATH}/wpa_supplicant -B -c${WPACONF} ${WPA_OPTIONS} -i$INTERFACE
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Buy wpa_supplicant some time to authenticate before bringing the
|
|
|
|
# interface back up... but we don't wait forever:
|
|
|
|
# You can increase this value in rc.inet1.conf (WLAN_WPAWAIT) or rc.wireless.conf (WPAWAIT)
|
|
|
|
# if your card takes longer to associate:
|
|
|
|
WPAWAIT=${WPAWAIT:-10}
|
|
|
|
wi=0
|
|
|
|
while [ $wi -lt $WPAWAIT ]; do
|
|
|
|
wi=$(($wi+1)); sleep 1
|
|
|
|
if (grep -q "^ctrl_interface=" ${WPACONF}); then
|
2012-09-26 03:10:42 +02:00
|
|
|
if (LC_ALL=C ${SUPPATH}/wpa_cli -i$INTERFACE status | grep -q "^wpa_state=COMPLETED"); then break; fi
|
2009-08-26 17:00:38 +02:00
|
|
|
else
|
2012-09-26 03:10:42 +02:00
|
|
|
if (LC_ALL=C ${IWCOMMAND} | grep -Eq "Encryption key:....-"); then break; fi
|
2009-08-26 17:00:38 +02:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
if [ $wi -eq $WPAWAIT ]; then
|
2021-03-01 21:10:44 +01:00
|
|
|
echo "$0: WPA authentication did not complete, try running '/etc/rc.d/rc.inet1 ${INTERFACE}_start' in a few seconds." | $LOGGER
|
2009-08-26 17:00:38 +02:00
|
|
|
fi
|
|
|
|
# Bring interface up to avoid 'not ready' errors when calling iwconfig
|
2021-03-19 00:54:14 +01:00
|
|
|
# Update 09/Mar/21: No point bringing it up here to be taken down at exit.
|
|
|
|
# $IFCOMMAND up
|
|
|
|
# sleep 3
|
2009-08-26 17:00:38 +02:00
|
|
|
else
|
|
|
|
# ESSID need to be last: most devices re-perform the scanning/discovery
|
|
|
|
# when this is set, and things like encryption keys had better be
|
|
|
|
# defined if we want to discover the right set of APs/nodes.
|
|
|
|
# NOTE: when automatic association does not work, but you manage to get
|
|
|
|
# an IP address by manually setting the ESSID and then calling dhcpcd,
|
|
|
|
# then the cause might be the incorrect definition of your ESSID="bla"
|
|
|
|
# parameter in rc.wireless.conf.
|
|
|
|
# Debug your wireless problems by running 'iwevent' while the card
|
|
|
|
# is being configured.
|
|
|
|
if [ -n "$ESSID" ] ; then
|
|
|
|
echo "$0: $IWCOMMAND essid \"$ESSID\"" | $LOGGER
|
|
|
|
$IWCOMMAND essid "$ESSID"
|
|
|
|
fi
|
|
|
|
fi
|
2021-03-19 00:54:14 +01:00
|
|
|
$IFCOMMAND down
|
|
|
|
sleep 3
|