#!/bin/rc
#
# wifiroam [-r] essid
#
# switch bssids with a given essid randomly or
# re-associate with the same bssid
# until ping to the gateway is stable
#
rfork en
fn usage {
echo usage: /bin/wifiroam [-r] essid >[1=2]
exit usage
}
r=()
while(~ $1 -*){
switch($1){
case -r
r=1
shift
case -*
usage
}
}
if(~ $#* 0)
usage
path=(/bin)
builtin cd /
net=/net/ether0/
myap=$1
#mygate=`{ndb/query sys $sysname ipgw}
mygate=8.8.8.8
ramfs
builtin cd /tmp
cp /bin/ndb/query /tmp
cp /bin/ip/ping /tmp
cp /bin/grep /tmp
cp /bin/awk /tmp
cp /bin/rc /tmp
cp /bin/sleep /tmp
cp /bin/echo /tmp
cp /bin/fortune /tmp
cp /bin/test /tmp
cp /bin/hoc /tmp
cp /bin/wc /tmp
bind /tmp /rc
bind /tmp /bin
fn sigint {
exit $status
}
fn pinggate {
pcount=$1
plost=`{ping -n $pcount -i 200 -l -w 1000 $mygate | grep '^lost' | wc -l}
echo $plost^' / '^$pcount^' * 100' | hoc
}
fn nowap {
grep bssid: $net/ifstats | awk '{ print $2 }'
}
fn nextap {
fortune <{grep node: $net/ifstats | grep $myap | grep -v `{nowap} | awk '{ print $2 }' }
}
fn switchap {
echo bssid $1 > $net/clone
}
fn x {
lossy=0
echo connected to `{grep bssid: $net/ifstats | awk '{ print $2 }' }
while(sleep 1){
lost=`{pinggate 10}
if(test $lost -gt 50){
lossy=1
next=`{nextap}
if(! ~ $r 1 && ! ~ $#next 0){
echo lost $lost%, switching to $next...
}
if not {
echo lost $lost%, retrying `{nowap}
next=`{nowap}
}
switchap $next
}
if not{
if(~ $lossy 1){
lossy=0
echo connected to `{grep bssid: $net/ifstats | awk '{ print $2 }' }
}
}
}
}
x
|