Radix cross Linux

The main Radix cross Linux repository contains the build scripts of packages, which have the most complete and common functionality for desktop machines

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