diff options
-rw-r--r-- | rc.inet1 | 326 | ||||
-rw-r--r-- | rc.inet1.conf | 117 | ||||
-rw-r--r-- | rc.wireless | 342 | ||||
-rw-r--r-- | rc.wireless.conf | 225 |
4 files changed, 1010 insertions, 0 deletions
diff --git a/rc.inet1 b/rc.inet1 new file mode 100644 index 0000000..19b89d5 --- /dev/null +++ b/rc.inet1 @@ -0,0 +1,326 @@ +#! /bin/sh +# /etc/rc.d/rc.inet1 +# This script is used to bring up the various network interfaces. +# +# @(#)/etc/rc.d/rc.inet1 10.2 Sun Jul 24 12:45:56 PDT 2005 (pjv) + +############################ +# READ NETWORK CONFIG FILE # +############################ + +# Get the configuration information from /etc/rc.d/rc.inet1.conf: +. /etc/rc.d/rc.inet1.conf + +########### +# LOGGING # +########### + +# If possible, log events in /var/log/messages: +if [ -f /var/run/syslogd.pid -a -x /usr/bin/logger ]; then + LOGGER=/usr/bin/logger +else # output to stdout/stderr: + LOGGER=/bin/cat +fi + +############################ +# DETERMINE INTERFACE LIST # +############################ + +# Compose a list of interfaces from /etc/rc.d/rc.inet1.conf (with a maximum +# of 6 interfaces, but you can easily enlarge the interface limit +# - send me a picture of such a box :-). +# If a value for IFNAME[n] is not set, we assume it is an eth'n' interface. +# This way, the new script is compatible with older rc.inet1.conf files. +# The IFNAME array will be used to determine which interfaces to bring up/down. +MAXNICS=${MAXNICS:-6} +i=0 +while [ $i -lt $MAXNICS ]; +do + IFNAME[$i]=${IFNAME[$i]:=eth${i}} + i=$(($i+1)) +done +if [ "$DEBUG_ETH_UP" = "yes" ]; then + echo "/etc/rc.d/rc.inet1: List of interfaces: '${IFNAME[@]}'" | $LOGGER +fi + +###################### +# LOOPBACK FUNCTIONS # +###################### + +# Function to bring up the loopback interface. If loopback is +# already up, do nothing. +lo_up() { + if grep lo: /proc/net/dev 1> /dev/null ; then + if ! /sbin/ifconfig | grep "^lo" 1> /dev/null ; then + echo "/etc/rc.d/rc.inet1: /sbin/ifconfig lo 127.0.0.1" | $LOGGER + /sbin/ifconfig lo 127.0.0.1 + echo "/etc/rc.d/rc.inet1: /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo" | $LOGGER + /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo + fi + fi +} + +# Function to take down the loopback interface: +lo_down() { + if grep lo: /proc/net/dev 1> /dev/null ; then + echo "/etc/rc.d/rc.inet1: /sbin/ifconfig lo down" | $LOGGER + /sbin/ifconfig lo down + fi +} + +####################### +# INTERFACE FUNCTIONS # +####################### + +# Function to assemble a bridge interface. +br_open() { + # argument is 'i' - the position of this interface in the IFNAME array. + /sbin/brctl addbr ${IFNAME[$1]} + for BRIF in $(echo ${BRNICS[$1]}); do + /sbin/ifconfig $BRIF down + /sbin/ifconfig $BRIF 0.0.0.0 promisc up + /sbin/brctl addif ${IFNAME[$1]} $BRIF + done +} + +# Function to disassemble a bridge interface. +br_close() { + # argument is 'i' - the position of this interface in the IFNAME array. + #for BRIF in $(echo ${BRNICS[$1]}); do + for BRIF in $(ls --indicator-style=none /sys/class/net/${IFNAME[$1]}/brif/) + do + /sbin/brctl delif ${IFNAME[$1]} $BRIF + done + /sbin/ifconfig ${IFNAME[$1]} down + /sbin/brctl delbr ${IFNAME[$1]} +} + +# Function to bring up a network interface. If the interface is +# already up or does not yet exist (perhaps because the kernel driver +# is not loaded yet), do nothing. +if_up() { + # Determine position 'i' of this interface in the IFNAME array: + i=0 + while [ $i -lt $MAXNICS ]; do + [ "${IFNAME[$i]}" = "${1}" ] && break + i=$(($i+1)) + done + # If the interface is a bridge, then create it first: + [ -n "${BRNICS[$i]}" ] && br_open $i + # If the interface isn't in the kernel yet (but there's an alias for it in + # modules.conf), then it should be loaded first: + if [ "${IPADDR[$i]}" = "" -a "${USE_DHCP[$i]}" != "yes" ]; then # skip unconfigured interfaces + if [ "$DEBUG_ETH_UP" = "yes" ]; then + echo "/etc/rc.d/rc.inet1: skipping ${1} early, interface is not configured in /etc/rc.d/rc.inet1.conf" | $LOGGER + fi + continue + fi + if ! grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then # no interface yet + if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${1}" | grep -vw "alias ${1} off" > /dev/null ; then + echo "/etc/rc.d/rc.inet1: /sbin/modprobe ${1}" | $LOGGER + /sbin/modprobe ${1} + fi + fi + if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then # interface exists + if ! /sbin/ifconfig | grep -w "${1}" 1>/dev/null || \ + ! /sbin/ifconfig ${1} | grep -w inet 1> /dev/null ; then # interface not up or not configured + if [ ! "${HWADDR[$i]}" = "" ]; then # Set hardware address _before_ the interface goes up: + echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} hw ether ${HWADDR[$i]}" | $LOGGER + /sbin/ifconfig ${1} hw ether ${HWADDR[$i]} + fi + if [ ! "${MTU[$i]}" = "" ]; then # Set MTU to something else than 1500 + echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} mtu ${MTU[$i]}" | $LOGGER + /sbin/ifconfig ${1} mtu ${MTU[$i]} + fi + if [ -x /etc/rc.d/rc.wireless ]; then + . /etc/rc.d/rc.wireless ${1} start # Initialize any wireless parameters + fi + if [ "${USE_DHCP[$i]}" = "yes" ]; then # use DHCP to bring interface up + # Clear DHCP_OPTIONS before adding new options to it: + unset DHCP_OPTIONS + # Set DHCP_OPTIONS for this interface: + [ ${DHCP_HOSTNAME[$i]} ] && DHCP_OPTIONS="-h ${DHCP_HOSTNAME[$i]}" + [ "${DHCP_KEEPRESOLV[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C resolv.conf" + [ "${DHCP_KEEPNTP[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C ntp.conf" + [ "${DHCP_KEEPGW[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -G" + [ "${DHCP_DEBUG[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -d" + [ "${DHCP_NOIPV4LL[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -L" + [ ${DHCP_IPADDR[$i]} ] && DHCP_OPTIONS="$DHCP_OPTIONS -r ${DHCP_IPADDR[$i]}" + echo "Polling for DHCP server on interface ${1}:" + # If you set a timeout, you get one, even if the kernel doesn't think that + # your device is connected, in case /sys isn't right (which it usually isn't + # except right after the device is loaded, when it usually is): + #### (start commented out) + # This is deactivated for now since the kernel has been returning incorrect + # results concerning whether the interface carrier is detected. + #if [ "${DHCP_TIMEOUT[$i]}" = "" ]; then + # ifconfig ${1} up && sleep 1 + # CONNSTATUS="$(cat /sys/class/net/${1}/carrier 2> /dev/null)" + # ifconfig ${1} down + # if [ "$CONNSTATUS" = "0" ]; then + # # The kernel has just told us the cable isn't even plugged in, but we will + # # give any DHCP server a short chance to reply anyway: + # echo "No carrier detected on ${1}. Reducing DHCP timeout to 10 seconds." + # DHCP_TIMEOUT[$i]=10 + # fi + #fi + #### (end commented out) + # 10 seconds should be a reasonable default DHCP timeout. 30 was too much. + echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -L -t ${DHCP_TIMEOUT[$i]:-10} ${DHCP_OPTIONS} ${1}" | $LOGGER + /sbin/dhcpcd -L -t ${DHCP_TIMEOUT[$i]:-10} ${DHCP_OPTIONS} ${1} + else # bring up interface using a static IP address + if [ ! "${IPADDR[$i]}" = "" ]; then # skip unconfigured interfaces + # Determine broadcast address from the IP address and netmask: + BROADCAST[$i]=`/bin/ipmask ${NETMASK[$i]} ${IPADDR[$i]}|cut -f1 -d' '` + # Set up the network card: + echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]}" | $LOGGER + /sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]} + else + if [ "$DEBUG_ETH_UP" = "yes" ]; then + echo "/etc/rc.d/rc.inet1: ${1} interface is not configured in /etc/rc.d/rc.inet1.conf" | $LOGGER + fi + fi + fi + else + if [ "$DEBUG_ETH_UP" = "yes" ]; then + echo "/etc/rc.d/rc.inet1: ${1} is already up, skipping" | $LOGGER + fi + fi + else + if [ "$DEBUG_ETH_UP" = "yes" ]; then + echo "/etc/rc.d/rc.inet1: ${1} interface does not exist (yet)" | $LOGGER + fi + fi +} + +# Function to take down a network interface: +if_down() { + # Determine position 'i' of this interface in the IFNAME array: + i=0 + while [ $i -lt $MAXNICS ]; do + [ "${IFNAME[$i]}" = "${1}" ] && break + i=$(($i+1)) + done + if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then + if [ "${USE_DHCP[$i]}" = "yes" ]; then + echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -k -d ${1}" | $LOGGER + /sbin/dhcpcd -k -d ${1} 2> /dev/null || /sbin/ifconfig ${1} down + sleep 1 + else + echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} down" | $LOGGER + /sbin/ifconfig ${1} down + fi + if [ -x /etc/rc.d/rc.wireless ]; then + . /etc/rc.d/rc.wireless ${1} stop # Kill wireless daemons if any. + fi + # If the interface is a bridge, then destroy it now: + if [ -n "${BRNICS[$i]}" ]; then + br_close $i + fi + fi +} + +##################### +# GATEWAY FUNCTIONS # +##################### + +# Function to bring up the gateway if there is not yet a default route: +gateway_up() { + if ! /sbin/route -n | grep "^0.0.0.0" 1> /dev/null ; then + if [ ! "$GATEWAY" = "" ]; then + echo "/etc/rc.d/rc.inet1: /sbin/route add default gw ${GATEWAY} metric 1" | $LOGGER + /sbin/route add default gw ${GATEWAY} metric 1 2>&1 | $LOGGER + fi + fi +} + +# Function to take down an existing default gateway: +gateway_down() { + if /sbin/route -n | grep "^0.0.0.0" 1> /dev/null ; then + echo "/etc/rc.d/rc.inet1: /sbin/route del default" | $LOGGER + /sbin/route del default + fi +} + +# Function to start the network: +start() { + lo_up + for i in ${IFNAME[@]} ; do + if_up $i + done + gateway_up +} + +# Function to stop the network: +stop() { + gateway_down + for i in ${IFNAME[@]} ; do + if_down $i + done + lo_down +} + + +############ +### MAIN ### +############ + +case "$1" in +'start') # "start" brings up all configured interfaces: + start + ;; +'stop') # "stop" takes down all configured interfaces: + stop + ;; +'restart') # "restart" restarts the network: + stop + start + ;; +'lo_start') # Start the loopback interface: + lo_up + ;; +*_start) # Example: "eth1_start" will start the specified interface 'eth1' + INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` + if_up $INTERFACE + gateway_up + ;; +'lo_stop') # Stop the loopback interface: + lo_down + ;; +*_stop) # Example: "eth0_stop" will stop the specified interface 'eth0' + INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` + if_down $INTERFACE + ;; +*_restart) # Example: "wlan0_restart" will take 'wlan0' down and up again + INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` + if_down $INTERFACE + sleep 1 + if_up $INTERFACE + gateway_up + ;; +'up') # "up" does the same thing as "start" + start + ;; +'down') # "down" does the same thing as "stop" + stop + ;; +'lo_up') # Start the loopback interface: + lo_up + ;; +*_up) # "*_up" does the same thing as "*_start" + INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` + if_up $INTERFACE + gateway_up + ;; +'lo_down') # Stop the loopback interface: + lo_down + ;; +*_down) # "*_down" does the same thing as "*_stop" + INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` + if_down $INTERFACE + ;; +*) # The default is to bring up all configured interfaces: + start +esac + +# End of /etc/rc.d/rc.inet1 diff --git a/rc.inet1.conf b/rc.inet1.conf new file mode 100644 index 0000000..85a8041 --- /dev/null +++ b/rc.inet1.conf @@ -0,0 +1,117 @@ +# /etc/rc.d/rc.inet1.conf +# +# This file contains the configuration settings for network interfaces. +# If USE_DHCP[interface] is set to "yes", this overrides any other settings. +# If you don't have an interface, leave the settings null (""). + +# You can configure network interfaces other than eth0,eth1... by setting +# IFNAME[interface] to the interface's name. If IFNAME[interface] is unset +# or empty, it is assumed you're configuring eth<interface>. + +# Several other parameters are available, the end of this file contains a +# comprehensive set of examples. + +# ============================================================================= + +# Config information for eth0: +IPADDR[0]="" +NETMASK[0]="" +USE_DHCP[0]="" +DHCP_HOSTNAME[0]="" + +# Config information for eth1: +IPADDR[1]="" +NETMASK[1]="" +USE_DHCP[1]="" +DHCP_HOSTNAME[1]="" + +# Config information for eth2: +IPADDR[2]="" +NETMASK[2]="" +USE_DHCP[2]="" +DHCP_HOSTNAME[2]="" + +# Config information for eth3: +IPADDR[3]="" +NETMASK[3]="" +USE_DHCP[3]="" +DHCP_HOSTNAME[3]="" + +# Default gateway IP address: +GATEWAY="" + +# Change this to "yes" for debugging output to stdout. Unfortunately, +# /sbin/hotplug seems to disable stdout so you'll only see debugging output +# when rc.inet1 is called directly. +DEBUG_ETH_UP="no" + +# Example of how to configure a bridge: +# Note the added "BRNICS" variable which contains a space-separated list +# of the physical network interfaces you want to add to the bridge. +#IFNAME[0]="br0" +#BRNICS[0]="eth0" +#IPADDR[0]="192.168.0.1" +#NETMASK[0]="255.255.255.0" +#USE_DHCP[0]="" +#DHCP_HOSTNAME[0]="" + +## Example config information for wlan0. Uncomment the lines you need and fill +## in your data. (You may not need all of these for your wireless network) +#IFNAME[4]="wlan0" +#IPADDR[4]="" +#NETMASK[4]="" +#USE_DHCP[4]="yes" +#DHCP_HOSTNAME[4]="icculus-wireless" +#DHCP_KEEPRESOLV[4]="yes" +#DHCP_KEEPNTP[4]="yes" +#DHCP_KEEPGW[4]="yes" +#DHCP_IPADDR[4]="" +#WLAN_ESSID[4]=DARKSTAR +#WLAN_MODE[4]=Managed +#WLAN_RATE[4]="54M auto" +#WLAN_CHANNEL[4]="auto" +#WLAN_KEY[4]="D5A31F54ACF0487C2D0B1C10D2" +#WLAN_IWPRIV[4]="set AuthMode=WPAPSK | set EncrypType=TKIP | set WPAPSK=96389dc66eaf7e6efd5b5523ae43c7925ff4df2f8b7099495192d44a774fda16" +#WLAN_WPA[4]="wpa_supplicant" +#WLAN_WPADRIVER[4]="wext" +#WLAN_WPAWAIT[4]=30 + +## Some examples of additional network parameters that you can use. +## Config information for wlan0: +#IFNAME[4]="wlan0" # Use a different interface name instead of + # the default 'eth4' +#IFNAME[4]="eth0:1" # Set up an IP alias. +#HWADDR[4]="00:01:23:45:67:89" # Overrule the card's hardware MAC address +#MTU[4]="" # The default MTU is 1500, but you might need + # 1360 when you use NAT'ed IPSec traffic. +#DHCP_TIMEOUT[4]=15 # The default timeout for the DHCP client to + # wait for server resonse is 10 seconds, but + # you might want a shorter or longer wait. +#DHCP_KEEPRESOLV[4]="yes" # If you don't want /etc/resolv.conf overwritten +#DHCP_KEEPNTP[4]="yes" # If you don't want ntp.conf overwritten +#DHCP_KEEPGW[4]="yes" # If you don't want the DHCP server to change + # your default gateway +#DHCP_IPADDR[4]="" # Request a specific IP address from the DHCP + # server +#DHCP_DEBUG[4]="yes" # Make dhcpcd show verbose diagnostics +#DHCP_NOIPV4LL[4]="yes" # Do not assign an ipv4ll address when a DHCP + # server is not found (ipv4ll link-local + # adresses in the IP range 169.254.0.0/16 are + # also known as "zeroconf" addresses) +#WLAN_ESSID[4]=DARKSTAR # An example of how you can override _any_ + # parameter defined in rc.wireless.conf, by + # prepending 'WLAN_' to the parameter's name. + # Useful with multiple wireless interfaces. +#WLAN_IWPRIV[4]="set AuthMode=WPAPSK | set EncrypType=TKIP | set WPAPSK=thekey" + # Some drivers require a private ioctl to be + # set through the iwpriv command. If more than + # one is required, you can place them in the + # IWPRIV parameter (separated with the pipe (|) + # character, see the example). +#WLAN_WPA[4]="wpa_supplicant" # Run wpa_supplicant for WPA support +#WLAN_WPADRIVER[4]="ndiswrapper"# Tell wpa_supplicant to specifically use the + # ndiswrapper driver (if you leave this empty + # the 'wext' driver is used by default) +#WLAN_WPAWAIT[4]=30 # In case it takes long for the WPA association + # to finish, you can increase the wait time + # (defaults to 10 seconds) diff --git a/rc.wireless b/rc.wireless new file mode 100644 index 0000000..51623d5 --- /dev/null +++ b/rc.wireless @@ -0,0 +1,342 @@ +#!/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 +# need this additional time to initalize. +# 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. +# 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. +# ------------------------------------------------------------------------------ + +LOGGER=${LOGGER:-cat} + +if [ -z $IFNAME ] ; then + echo "WARNING: The script 'rc.wireless' must be executed by 'rc.inet1'!" | $LOGGER + echo " You should run the command \"/etc/rc.d/rc.inet1 <your_interface>_start\" yourself." | $LOGGER + 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}" +IFCOMMAND="/sbin/ifconfig ${INTERFACE}" + +is_wireless_device () +{ + # Return 0 for a wireless interface, or 1 for a non-wireless interface. + if LC_ALL=C $IWPATH/iwconfig $1 2>&1 | grep -q "IEEE 802.11" ; then + return 0 + elif [ -d /sys/class/net/${1}/wireless ]; then + return 0 + elif [ "$(cat /sys/class/net/${1}/uevent | grep DEVTYPE)" = "DEVTYPE=wlan" ]; then + return 0 + else # all tests failed, assume the device is not wireless (or add a better test :) + return 1 + 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 + WPAPID=$(echo $(ps axww | grep wpa_supplicant | grep i${INTERFACE}) | cut -f1 -d' ') + [ ${WPAPID} ] && kill ${WPAPID} + 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 +HWADDR=$(/sbin/ifconfig ${INTERFACE} | sed -ne 's/.*\(..:..:..:..:..:..\).*/\U\1/p') + +# 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"}} + + +[ -n "$VERBOSE" -a -n "$INFO" ] && echo "$0: $1 information: '$INFO'" + +################### +# 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 + NICKNAME=$(/bin/hostname) +fi +if [ -n "$ESSID" -o -n "$MODE" ] ; then + 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) +if [ -n "$KEY" -a ! -n "$WPA" ] ; then + 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 + echo "$0: '$IWPRIVCMD $iwi'" | $LOGGER + $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="" + [ ${WPADRIVER} ] && WPA_OPTIONS="-D${WPADRIVER}" # specify the driver + [ ${WPA} = "wpaxsupplicant" ] && WPA_OPTIONS="${WPA_OPTIONS} -e" # Use external xsupplicant (disables the internal supplicant) + + # We leave a running wpa_supplicant process in peace: + WPAPID=$(echo $(ps axww | grep wpa_supplicant | grep i${INTERFACE}) | cut -f1 -d' ') + if [ ${WPAPID} ]; then + 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 + if (LC_ALL=C ${SUPPATH}/wpa_cli -i$INTERFACE status | grep -q "^wpa_state=COMPLETED"); then break; fi + else + if (LC_ALL=C ${IWCOMMAND} | grep -Eq "Encryption key:....-"); then break; fi + fi + done + if [ $wi -eq $WPAWAIT ]; then + echo "WPA authentication did not complete, try running '/etc/rc.d/rc.inet1 ${INTERFACE}_start' in a few seconds." | $LOGGER + fi + # Bring interface up to avoid 'not ready' errors when calling iwconfig + $IFCOMMAND up + sleep 3 + +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 diff --git a/rc.wireless.conf b/rc.wireless.conf new file mode 100644 index 0000000..d02d7c2 --- /dev/null +++ b/rc.wireless.conf @@ -0,0 +1,225 @@ +# Wireless LAN adapter configuration +# +# Theory of operation : +# +# The script attempts to match a block of settings to the specific wireless +# card inserted, the *first* block matching the card is used. +# The address format is "hwaddr", with * as a wildcard. +# 'hwaddr' is the unique MAC address identifier of the wireless card. +# The MAC address is usually printed on the card, or can be found via ifconfig. +# Some examples here use only half of the MAC address with a wildcard to +# match a whole family of cards... +# +# All the Wireless specific configuration is done through the Wireless +# Extensions, so we will just call 'iwconfig' with the right parameters +# defined below. +# Of course, you need to have iwconfig installled on your system. +# To download iwconfig, or for more info on Wireless Extensions : +# http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html +# +# Note : you don't need to fill all parameters, leave them blank, in most +# cases the driver will initialise itself with sane defaults values or +# automatically figure out the value... And no drivers do support all +# possible settings... +# +# -- This is a modified '/etc/pcmcia/wireless.opts' script -- +# -- I added sections for Prism/GT and Atheros based cards -- +# -- (supported by the prism54 and madwifi drivers) -- +# -- 16/sep/2004 * Eric Hameleers -- +# + +VERBOSE=1 + +case "$HWADDR" in + +## NOTE : Comment out the following five lines to activate the samples below ... +## --------- START SECTION TO REMOVE ----------- +## Pick up any Access Point, should work on most 802.11 cards +*) + INFO="Any ESSID" + ESSID="any" + ;; +## ---------- END SECTION TO REMOVE ------------ + + +# Here are a few examples with a few Wireless LANs supported... +# The matching is done on the first 3 bytes of the MAC address + +# SMC2835W EZ Connect g 2.4GHz 54 Mbps Wireless Cardbus Adapter +00:04:E2:*) + INFO="SMC2835W EZ Connect g 2.4GHz 54 Mbps Wireless Cardbus Adapter" + # ESSID (extended network name) : My Network, any + ESSID="any" + # NWID/Domain (cell identifier) : 89AB, 100, off + NWID="" + # Operation mode : Ad-Hoc, Managed, Master, Repeater, Secondary, auto + MODE="Managed" + # Frequency or channel : 1, 2, 3 (channel) ; 2.422G, 2.46G (frequency) + FREQ="" + CHANNEL="7" + # Sensitivity (cell size + roaming speed) : 1, 2, 3 ; -70 (dBm) + SENS="" + # Bit rate : auto, 1M, 11M,54M + RATE="auto" + # Encryption key : 4567-89AB-CD, s:password + # Example for 40-bit encryption: + #KEY="883e-aa67-21 [1] key 5501-d0da-87 [2] key 91f5-3368-6b [3] key 2d73-31b7-96 [4]" + # Example for 104-bit encryption (aka 128-bit WEP): + #KEY="d5ad2f05abd048ecf10b1c80c7" + KEY="" + # RTS threshold : off, 500 + RTS="" + # Fragmentation threshold : off, 1000 + FRAG="" + # Other iwconfig parameters : power off, ap 01:23:45:67:89:AB + IWCONFIG="" + # iwspy parameters : + 01:23:45:67:89:AB + IWSPY="" + # iwpriv parameters : set_port 2, set_histo 50 60 + IWPRIV="" +;; + +# Multiband Atheros based 802.11a/b/g universal NIC cards +00:05:4E:*) + INFO="Multiband Atheros based 802.11a/b/g universal NIC" + # ESSID (extended network name) : My Network, any + ESSID="" + # Operation mode : Ad-Hoc, Managed, Master, Repeater, Secondary, auto + MODE="Managed" + # Frequency or channel : 1, 2, 3 (channel) ; 2.422G, 2.46G (frequency) + FREQ="" + CHANNEL="7" + # Bit rate : auto, 1M, 11M,54M + RATE="auto" + # Encryption key : 4567-89AB-CD, s:password + # Example for 40-bit encryption: + #KEY="883e-aa67-21 [1] key 5501-d0da-87 [2] key 91f5-3368-6b [3] key 2d73-31b7-96 [4]" + # Example for 104-bit encryption (aka 128-bit WEP): + #KEY="d5ad2f05abd048ecf10b1c80c7" + KEY="" + # Other iwconfig parameters : power off, ap 01:23:45:67:89:AB + IWCONFIG="" + # iwspy parameters : + 01:23:45:67:89:AB + IWSPY="" + # iwpriv parameters : set_port 2, set_histo 50 60 + IWPRIV="" + ;; + +# Lucent Wavelan IEEE (+ Orinoco, RoamAbout and ELSA) +# Note : wvlan_cs driver only, and version 1.0.4+ for encryption support +00:60:1D:*|00:02:2D:*) + INFO="Wavelan IEEE example (Lucent default settings)" + ESSID="Wavelan Network" + MODE="Managed" + #RATE="auto" + KEY="s:secu1" + # To set all four keys, use : + #KEY="s:secu1 [1] key s:secu2 [2] key s:secu3 [3] key s:secu4 [4] key [1]" + # For the RG 1000 Residential Gateway: The ESSID is the identifier on + # the unit, and the default key is the last 5 digits of the same. + #ESSID="084d70" + #KEY="s:84d70" + ;; + +# Cisco/Aironet 4800/3x0 +# Note : MPL driver only (airo/airo_cs), version 1.3 or later +00:40:96:*|00:02:8A:*) + INFO="Cisco/Aironet example (Cisco default settings)" + ESSID="any" + # To set all four ESSID, use iwconfig v21 and the same trick as above + MODE="Managed" + #RATE="11M auto" + #KEY="d5ad2f05abd048ecf10b1c80c7" + KEY="off" + ;; + +# Samsung MagicLan (+ some other PrismII cards) +# Note : Samsung binary library driver, version 1.20 or later +00:00:F0:*|00:02:78:*) + INFO="Samsung MagicLan example (Samsung default settings)" + ESSID="any" + MODE="Managed" + CHANNEL="4" + RATE="auto" + #KEY="883e-aa67-21 [1] key 5501-d0da-87 [2] key 91f5-3368-6b [3] key 2d73-31b7-96 [4]" + #IWCONFIG="power on" + ;; + +# Raytheon Raylink/WebGear Aviator2.4 +# Note : doesn't work yet, please use for debugging only :-( +00:00:8F:*|00:00:F1:*) + INFO="Raylink/Aviator2.4 example (Aviator default ad-hoc setting)" + ESSID="ADHOC_ESSID" + MODE="Ad-Hoc" + RATE="auto" + IWPRIV="set_framing 1" + ;; + +# Old Lucent Wavelan +08:00:0E:*) + INFO="Wavelan example (Lucent default settings)" + NWID="0100" + MODE="Ad-Hoc" + FREQ="2.425G" + KEY="off" + ;; + +# Netwave (Xircom Netwave/Netwave Airsurfer) +00:80:C7:*) + INFO="Netwave example (Netwave default settings)" + NWID="100" + KEY="00" + ;; + +# Proxim RangeLan2/Symphony (what is the MAC address ???) +XX:XX:XX:*) + INFO="Proxim RangeLan2/Symphony example" + NWID="0" + MODE="Master" + CHANNEL="15" + IWPRIV="setsubchan 1" + ;; + +# No Wires Needed Swallow 550 and 1100 setting (what is the MAC address ???) +XX:XX:XX:*) + INFO="NWN Swallow example" + ESSID="session" + KEY="0000-0000-00 open" + ;; + +# Symbol Spectrum24 setting (what is the MAC address ???) +XX:XX:XX:*) + INFO="Symbol Spectrum24 example" + ESSID="Essid string" + ;; + +# Generic example (decribe all possible settings) +*) + INFO="Fill with your own settings..." + # ESSID (extended network name) : My Network, any + ESSID="" + # NWID/Domain (cell identifier) : 89AB, 100, off + NWID="" + # Operation mode : Ad-Hoc, Managed, Master, Repeater, Secondary, auto + MODE="" + # Frequency or channel : 1, 2, 3 (channel) ; 2.422G, 2.46G (frequency) + FREQ="" + CHANNEL="" + # Sensitivity (cell size + roaming speed) : 1, 2, 3 ; -70 (dBm) + SENS="" + # Bit rate : auto, 1M, 11M + RATE="" + # Encryption key : 4567-89AB-CD, s:password + KEY="" + # RTS threshold : off, 500 + RTS="" + # Fragmentation threshold : off, 1000 + FRAG="" + # Other iwconfig parameters : power off, ap 01:23:45:67:89:AB + IWCONFIG="" + # iwspy parameters : + 01:23:45:67:89:AB + IWSPY="" + # iwpriv parameters : set_port 2, set_histo 50 60 + IWPRIV="" + ;; +esac |