linux-wlan-ng/etc/wlan/shared

729 lines
17 KiB
Bash

#!/bin/bash
# etc/wlan/shared
#
# Copyright (C) 2002 AbsoluteValue Systems, Inc. All Rights Reserved.
# --------------------------------------------------------------------
#
# linux-wlan
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# Alternatively, the contents of this file may be used under the
# terms of the GNU Public License version 2 (the "GPL"), in which
# case the provisions of the GPL are applicable instead of the
# above. If you wish to allow the use of your version of this file
# only under the terms of the GPL and not to allow others to use
# your version of this file under the MPL, indicate your decision
# by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL. If you do not delete
# the provisions above, a recipient may use your version of this
# file under either the MPL or the GPL.
#
# --------------------------------------------------------------------
#
# Inquiries regarding the linux-wlan Open Source project can be
# made directly to:
#
# AbsoluteValue Systems Inc.
# info@linux-wlan.com
# http://www.linux-wlan.com
#
# --------------------------------------------------------------------
#
# Portions of the development of this software were funded by
# Intersil Corporation as part of PRISM(R) chipset product development.
#
# --------------------------------------------------------------------
TMPDIR=/tmp
if [ ! -n "$ECHO" ]; then
ECHO=echo
fi
if [ -x /sbin/modprobe ] ; then
MODPROBE=/sbin/modprobe
else
${ECHO} "/sbin/modprobe not found."
exit 1
fi
if [ -x /sbin/wlanctl-ng ] ; then
WLANCTL=/sbin/wlanctl-ng
else
${ECHO} "/sbin/wlanctl-ng not found."
exit 1
fi
# linux-wlan-ng > 0.2.4 there is no wland
#if [ -x /sbin/wland ] ; then
# WLAND=/sbin/wland
#else
# ${ECHO} "/sbin/wland not found."
# exit 1
#fi
if [ -f /proc/sys/kernel/hotplug -a \
-x `cat /proc/sys/kernel/hotplug` -a \
-f /etc/hotplug/wlan.agent ] ; then
HAS_HOTPLUG=y
else
HAS_HOTPLUG=n
fi
# Source the wlan configuration
if [ -f /etc/wlan/wlan.conf ] ; then
. /etc/wlan/wlan.conf
else
${ECHO} "/etc/wlan/wlan.conf not found."
exit 0
fi
# Source NSD specific functions
# nsd_fwload
# nsd_mibset
# Debian mod. If there is shared.dpkg-old we get a endless loop
if [ "`ls /etc/wlan/shared.* 2>/dev/null`" ]; then
for i in `find /etc/wlan -name 'shared.*' -and -not -name '*.dpkg*'` ; do
. $i
done
else
${ECHO} "/etc/wlan/shared.* not found."
exit 0
fi
is_true ()
{
# $1 == string containing a t/f indicator.
[ "$1" = "y" -o "$1" = "Y" -o "$1" = "yes" -o "$1" = "YES" \
-o "$1" = "t" -o "$1" = "T" -o "$1" = "true" -o "$1" = "TRUE" ]
}
wlan_nsdname ()
{
# $1 == wlandev
# Writes the given device's name to stdout
grep 'nsd name' /proc/net/p80211/$1/wlandev | sed -e 's/.*: \(.*\)_.*/\1/'
}
wlan_enable ()
{
# $1 == wlandev
#=======ENABLE IFSTATE=============================
# Bring the device into its operable state
$MODPROBE $1
# First, make sure the driver is loaded....
if ! ifconfig $1 > /dev/null 2>&1 ; then
${ECHO} "Error: Device $1 does not seem to be present."
${ECHO} "Make sure you've inserted the appropriate"
${ECHO} "modules or that your modules.conf file contains"
${ECHO} "the appropriate aliase(s)."
return 1
fi
# Call the nsd script's fwload function, in case the card needs
# a firmware load, or could use an optional one.
nsdname=`wlan_nsdname $1`
if ! ${nsdname}_fwload $1 ; then
${ECHO} "Firmware failed to load for device $1"
return 1
fi
# Enable the interface
result=`$WLANCTL $1 lnxreq_ifstate ifstate=enable`
if [ $? = 0 ] ; then
eval $result
if [ $resultcode != "success" ]; then
${ECHO} "Failed to enable the device, resultcode=" \
$resultcode "."
return 1
fi
else
${ECHO} "Failed to enable the device, exitcode=" $? "."
return 1
fi
# Set any NSD specific MIBs
${nsdname}_mibset $1
}
wlan_user_mibs ()
{
# $1 == wlandev
#=======USER MIB SETTINGS=============================
# Set the user specified MIB items.
for i in $USER_MIBS ; do
result=`$WLANCTL $1 dot11req_mibset "mibattribute=$i"`
if [ $? = 0 ] ; then
eval $result
if [ $resultcode != "success" ] ; then
${ECHO} "Failed to set user MIB $i."
return 1
fi
else
${ECHO} "Failed to set user MIB $i."
return 1
fi
done
}
wlan_source_config ()
{
# $1 == wlandev
# XXX what about stray singlequotes.
eval 'GOSSID="$SSID_'$1'"'
wlan_source_config_for_ssid "$GOSSID"
}
wlan_source_config_for_ssid ()
{
# $1 == ssid[:bssid]
# $2 == bssid (optional)
DesiredSSID="$1"
DesiredBSSID="$2"
if [ -n "$2" ] ; then
token_ssid=`echo $1 | sed -ne 's/\(.*\)\(:..:..:..:..:..:..\).*/\1/p'`
token_bssid=`echo $1 | sed -ne 's/\(.*\):\(..:..:..:..:..:..\).*/\2/p'`
if [ -n "$token_ssid" ] ; then
DesiredSSID="$token_ssid"
DesiredBSSID="$token_bssid"
fi
fi
if [ -f "/etc/wlan/wlancfg-$DesiredSSID:$DesiredBSSID" ] ; then
. "/etc/wlan/wlancfg-$DesiredSSID:$DesiredBSSID"
elif [ -f "/etc/wlan/wlancfg-$DesiredSSID" ] ; then
. "/etc/wlan/wlancfg-$DesiredSSID"
else
if [ -n "$1" ] ; then
${ECHO} "Failed to open network config file /etc/wlan/wlancfg-$1, using default."
fi
. "/etc/wlan/wlancfg-DEFAULT"
fi
}
wlan_disable ()
{
# $1 == wlandev
$WLANCTL $1 lnxreq_ifstate ifstate=disable
}
wlan_ssid_in_list ()
{
# $1 == wlandev, $2 == ssid, $3 == bssid
eval 'GOSSID="$SSID_'$1'"'
# This "eval" hackery is to allow escapes in GOSSID...
cmd="for token in $GOSSID ; do
ssid_token=\`echo \"\$token\" | sed -ne 's/\(.*\)\(:..:..:..:..:..:..\).*/\1/p'\`
bssid_token=\`echo \"\$token\" | sed -ne 's/\(.*\):\(..:..:..:..:..:..\).*/\2/p'\`
if [ -z \"\$ssid_token\" ] ; then
ssid_token="\$token"
fi
if [ -n \"\$bssid_token\" ] ; then
if [ \"\$bssid_token\" = \"\$3\" ] ; then
return 0
fi
elif [ \"\$2\" = \"\$ssid_token\" ] ; then
return 0
fi
done"
eval "$cmd"
return 1
}
wlan_supports_scan ()
{
# $1 == wlandev
if is_true "$WLAN_SCAN" ; then
cat /proc/net/p80211/$1/wlandev | grep 'scan' > /dev/null
if [ $? = 0 ] ; then
return 0
fi
fi
return 1
}
wlan_scan ()
{
# $1 == wlandev
# find our allowed SSID list.
# XXX what about stray singlequotes.
eval 'GOSSID="$SSID_'$1'"'
# kick off a quick scan with the broadcast SSID.
wlan_scan_one $1 '' '' n
if [ $? = 0 -a \
"$GOSSID" = "" ] ; then
# if successful and our ssid list is null, return.
sleep 1
return 0
fi
# otherwise we walk through the list, and scan for eacn in turn.
# this "eval" hackery is to allow escapes in GOSSID
cmd="for token in $GOSSID ; do
ssid_token=\`echo \"\$token\" | sed -ne 's/\(.*\)\(:..:..:..:..:..:..\).*/\1/p'\`
bssid_token=\`echo \"\$token\" | sed -ne 's/\(.*\):\(..:..:..:..:..:..\).*/\2/p'\`
if [ -z \"\$ssid_token\" ] ; then
ssid_token=\"\$token\"
fi
wlan_scan_one \$1 \"\$ssid_token\" \"\$bssid_token\"
if [ \$? = 0 ] ; then
sleep 1
return 0
fi
done"
eval "$cmd"
# We got to the end of the list. Maybe try "any"
if is_true "$WLAN_ANY" ; then
wlan_scan_one $1
sleep 1
return $?
fi
sleep 1
return 1
}
wlan_scan_one ()
{
# $1 == wlandev, [ $2 == ssid, $3 == bssid, $4 == append ]
if [ -z "$4" ] ; then
append=true
else
append=false
fi
numbss=0
result=`$WLANCTL $1 dot11req_scan bsstype=any bssid=ff:ff:ff:ff:ff:ff \
scantype=active probedelay=0 channellist=$ChannelList ssid="$2" \
minchanneltime=$ChannelMinTime maxchanneltime=$ChannelMaxTime append=$append`
eval $result
if [ $resultcode != 'success' ] ; then
${ECHO} "Scan failed ($resultcode) "
return 1
fi
## XXX if numbss == 0, repeat with $2 $3 $4?
i=0
bssfound=""
# walk through the results and do first-cut matching.
while [ $i -lt $numbss ] ; do
result=`$WLANCTL $1 dot11req_scan_results bssindex=$i`
eval $result
if [ -n "$3" ] ; then
if [ "$3" = "$bssid" ] ; then
bssfound="$bssfound $i"
fi
elif [ -z "$2" ] ; then
# if our ssid is "", then we pick the first entry.
bssfound="$bssfound $i"
elif [ "$2" = "$ssid" ] ; then
bssfound="$bssfound $i"
fi
i=`expr $i + 1`
done
if [ -z "$bssfound" ]; then # No BSSs found, bail.
return 1
else
# Now find the closest
bigsignal=0
for i in $bssfound ; do
result=`$WLANCTL $1 dot11req_scan_results bssindex=$i`
eval $result
if [ $bigsignal -lt $signal ]; then
bigsignal=$signal
bigbssindex=$i
fi
done
result=`$WLANCTL $1 dot11req_scan_results bssindex=$bigbssindex`
eval $result
return 0
fi
}
wlan_wep ()
{
# $1 == wlandev
#=======WEP===========================================
# Setup privacy
if [ ${dot11PrivacyInvoked:-"false"} = "false" ] ; then
return 0;
fi
result=`$WLANCTL $1 dot11req_mibget mibattribute=dot11PrivacyOptionImplemented`
if [ $? = 0 ] ; then
eval $result
eval $mibattribute
else
${ECHO} "dot11PrivacyOptionImplemented mibget failed."
return 1
fi
if [ $dot11PrivacyOptionImplemented = "false" ] ; then
${ECHO} "Cannot enable privacy, dot11PrivacyOptionImplemented=false."
return 1
fi
# Do we want host-based WEP?
result=`$WLANCTL $1 lnxreq_hostwep \
decrypt="${lnxreq_hostWEPDecrypt:-false}" \
encrypt="${lnxreq_hostWEPEncrypt:-false}"`
# set up the rest of the parametsrs.
if [ $dot11PrivacyOptionImplemented = "true" -a \
$dot11PrivacyInvoked = "true" ] ; then
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11WEPDefaultKeyID=$dot11WEPDefaultKeyID `
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11ExcludeUnencrypted=$dot11ExcludeUnencrypted `
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11PrivacyInvoked=$dot11PrivacyInvoked`
if [ "${PRIV_GENSTR:-empty}" != "empty" ] ; then
if [ ${PRIV_KEY128:-"false"} = "false" ]; then
keys=`$PRIV_GENERATOR "$PRIV_GENSTR" 5`
else
keys=`$PRIV_GENERATOR "$PRIV_GENSTR" 13`
fi
knum=0
for i in $keys ; do
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11WEPDefaultKey$knum=$i`
knum=`expr $knum + 1`
done
else
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11WEPDefaultKey0=$dot11WEPDefaultKey0 `
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11WEPDefaultKey1=$dot11WEPDefaultKey1 `
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11WEPDefaultKey2=$dot11WEPDefaultKey2 `
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11WEPDefaultKey3=$dot11WEPDefaultKey3 `
fi
else
# disable wep explicitly.
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11PrivacyInvoked=$dot11PrivacyInvoked `
result=`$WLANCTL $1 dot11req_mibset \
mibattribute=dot11ExcludeUnencrypted=false `
fi
}
wlan_adhoc ()
{
# $1 == wlandev
#=======IBSS STARTUP==================================
startcmd="$WLANCTL $1 dot11req_start "
startcmd="$startcmd ssid=$DesiredSSID"
startcmd="$startcmd bsstype=independent"
startcmd="$startcmd beaconperiod=$BCNINT"
startcmd="$startcmd dtimperiod=3"
startcmd="$startcmd cfpollable=false"
startcmd="$startcmd cfpollreq=false"
startcmd="$startcmd cfpperiod=3"
startcmd="$startcmd cfpmaxduration=100"
startcmd="$startcmd probedelay=100"
startcmd="$startcmd dschannel=$CHANNEL"
j=1
for i in $BASICRATES ; do
startcmd="$startcmd basicrate$j=$i"
j=`expr $j + 1`
done
j=1
for i in $OPRATES ; do
startcmd="$startcmd operationalrate$j=$i"
j=`expr $j + 1`
done
results=`$startcmd` # Here's where it runs
if [ $? = 0 ]; then
eval $results
if [ $resultcode != "success" ] ; then
${ECHO} "IBSS not started, resultcode=$resultcode"
exit 1
else
${ECHO} "IBSS mode started."
fi
else
${ECHO} FAILED: $startcmd
return 1
fi
WLAN_SCHEMESSID="$DesiredSSID"
}
wlan_infra ()
{
# $1 == wlandev
#==== INFRASTRUCURE STARTUP===========================
# XXX TODO: Grok DesiredBSSID
sleep 5
results=`$WLANCTL $1 lnxreq_autojoin \
"ssid=$DesiredSSID" \
authtype=${AuthType:="opensystem"} | sed 's/\([^=]*\)=\(.*\)/\1="\2"/'`
eval $results
if [ ${resultcode:-"failure"} != "success" ] ; then
${ECHO} 'error: Autojoin indicated failure!'
return 1;
fi
WLAN_SCHEMESSID="$DesiredSSID"
}
wlan_dot11_join ()
{
# $1 == wlandev
joincmd="$WLANCTL $1 dot11req_join bssid=$DesiredBSSID"
joincmd="$joincmd joinfailuretimeout=1"
j=1
for i in $OPRATES ; do
joincmd="$joincmd operationalrate$j=$i"
j=`expr $j + 1`
done
results=`$joincmd`
eval $results
if [ ${resultcode:-"failure"} != "success" ] ; then
${ECHO} "$1: JOIN Failure"
${ECHO} "joincmd=$joincmd"
${ECHO} "results=$results"
return 1;
fi
}
wlan_dot11_auth_assoc ()
{
# $1 == wlandev
if [ $bsstype = "infrastructure" ] ; then
results=`$WLANCTL $1 dot11req_authenticate \
peerstaaddress=$DesiredBSSID \
authenticationtype=$AuthType \
authenticationfailuretimeout=2000`
eval $results
if [ ${resultcode:-"failure"} != "success" ] ; then
${ECHO} "error: dot11req_authenticate failed, "\
"resultcode=$resultcode"
return 1;
fi
results=`$WLANCTL $1 dot11req_associate \
listeninterval=1000 \
associatefailuretimeout=2000 `
if [ ${resultcode:-"failure"} != "success" ] ; then
${ECHO} 'error: dot11req_associate failed!'
return 1;
fi
fi
}
wlan_set_ssid_schemefile ()
{
# $1 == SSID
# Find the scheme file
if [ -r /var/lib/misc/pcmcia-scheme ] ; then
# Debian
WLAN_SCHEMEFILE="/var/lib/misc/pcmcia-scheme"
elif [ -d /var/state/pcmcia ] ; then
WLAN_SCHEMEFILE="/var/state/pcmcia/scheme"
elif [ -d /var/lib/pcmcia ] ; then
WLAN_SCHEMEFILE="/var/lib/pcmcia/scheme"
else
WLAN_SCHEMEFILE="/var/run/pcmcia-scheme"
fi
# Collect the current scheme name and save the file
if [ -r $WLAN_SCHEMEFILE ] ; then
WLAN_SCHEME=`cat $WLAN_SCHEMEFILE`
cp $WLAN_SCHEMEFILE /var/run/wlan_scheme_`date +"%T"`.tmp
else
touch /var/run/wlan_scheme_`date +"%T"`.tmp
fi
# Set up the <scheme:SSID> string
if [ ! "$WLAN_SCHEME" ] ; then
WLAN_SCHEME="default"
fi
WLAN_SCHEME="$WLAN_SCHEME:$1"
# Write to schemefile
echo $WLAN_SCHEME > $WLAN_SCHEMEFILE
}
wlan_restore_schemefile ()
{
# Find the scheme file
if [ -r /var/lib/misc/pcmcia-scheme ] ; then
# Debian
WLAN_SCHEMEFILE="/var/lib/misc/pcmcia-scheme"
elif [ -d /var/state/pcmcia ] ; then
WLAN_SCHEMEFILE="/var/state/pcmcia/scheme"
elif [ -d /var/lib/pcmcia ] ; then
WLAN_SCHEMEFILE="/var/lib/pcmcia/scheme"
else
WLAN_SCHEMEFILE="/var/run/pcmcia-scheme"
fi
TMPFILE=`ls /var/run/wlan_scheme*.tmp | tail -n 1`
if [ -r $TMPFILE ] ; then
cat $TMPFILE > $WLAN_SCHEMEFILE
rm -f $TMPFILE
else
${ECHO} "wlan_restore_schemefile: No wlan_scheme\*.tmp file found."
fi
}
wlan_bring_it_up ()
{
# $1 == wlandev
# $2 == non-null if wext enabled.
#=======ENABLE========================================
# Do we want to init the card at all?
eval 'WLAN_ENABLE=$ENABLE_'$1
if ! is_true $WLAN_ENABLE ; then
return 1
fi
if wlan_enable $1 ; then
if [ -z "$2" ] ; then
wlan_scan_and_join $1
return $?
else
${ECHO} "Bypassing configuration due to wireless extensions"
fi
else
return 1;
fi
return 1
}
wlan_scan_and_join ()
{
#=======MAC STARTUP=========================================
wlan_supports_scan $1
if [ $? = 0 ] ; then
wlan_scan $1
if [ $? = 0 ] ; then
wlan_source_config_for_ssid "$ssid" "$bssid"
wlan_user_mibs $1
wlan_wep $1
wlan_join $1
else
if is_true $IS_ADHOC ; then
# start an IBSS; we didn't find one.
wlan_adhoc $1
else
return 1
fi
fi
else
wlan_source_config $1
wlan_user_mibs $1
wlan_wep $1
if is_true $IS_ADHOC ; then
wlan_adhoc $1
else
wlan_infra $1
fi
fi
return $?
}
wlan_join ()
{
# $1 == wlandev
grep 'autojoin' /proc/net/p80211/$1/wlandev > /dev/null
if [ $? = 0 ]; then
wlan_infra $1
else
wlan_dot11_join $1
wlan_dot11_auth_assoc $1
fi
}
tmpname ()
{
# $1 == prefix
local i=0
local tname=$TMPDIR/${1}_$$
if [ -f ${tname}.tmp ] ; then
for i in 0 1 2 3 4 5 6 7 8 9 ; do
if [ ! -f ${tname}_${i}.tmp ] ; then
echo ${tname}_${i}.tmp
return 0
fi
done
else
echo ${tname}.tmp
fi
return 0
}
source_procfile ()
{
# $1 == procfile to source
local fname=`tmpname wlan_procfile`
cat "$1" > $fname
. $fname
rm -f $fname
}
# This is set by the Configure script as part of 'make install'
#FIRMWARE_DIR="/usr/share/linux-wlan"