Author: wmb
Date: 2008-12-14 18:43:28 +0100 (Sun, 14 Dec 2008)
New Revision: 1033
Modified:
cpu/x86/pc/olpc/nandcastui.fth
cpu/x86/pc/olpc/versions.fth
cpu/x86/pc/olpc/wifichannel.fth
ofw/wifi/eapol.fth
Log:
OLPC - Improved NANDblaster WIFI spectrum analysis, with ".wifi" command.
Modified: cpu/x86/pc/olpc/nandcastui.fth
===================================================================
--- cpu/x86/pc/olpc/nandcastui.fth 2008-12-12 00:13:49 UTC (rev 1032)
+++ cpu/x86/pc/olpc/nandcastui.fth 2008-12-14 17:43:28 UTC (rev 1033)
@@ -101,3 +101,27 @@
false to already-go?
" boot rom:nb_rx 10.20.0.16,,10.20.0.44" eval
;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: cpu/x86/pc/olpc/versions.fth
===================================================================
--- cpu/x86/pc/olpc/versions.fth 2008-12-12 00:13:49 UTC (rev 1032)
+++ cpu/x86/pc/olpc/versions.fth 2008-12-14 17:43:28 UTC (rev 1033)
@@ -2,7 +2,7 @@
\ The overall firmware revision
macro: FW_MAJOR E
-macro: FW_MINOR 24
+macro: FW_MINOR 24b
\ The EC microcode
macro: EC_VERSION e21
Modified: cpu/x86/pc/olpc/wifichannel.fth
===================================================================
--- cpu/x86/pc/olpc/wifichannel.fth 2008-12-12 00:13:49 UTC (rev 1032)
+++ cpu/x86/pc/olpc/wifichannel.fth 2008-12-14 17:43:28 UTC (rev 1033)
@@ -1,13 +1,22 @@
+purpose: Analyze WIFI spectrum to find good channels for NANDblaster
+\ See license at end of file
-
0 value wlan-ih
d# 2048 buffer: scan-buf
+: $call-wlan ( args method$ -- res ) wlan-ih $call-method ;
+: stop-mesh ( -- ) " mesh-stop" $call-wlan drop ;
+: start-mesh ( channel# -- )
+ " mesh-start" $call-wlan drop
+ d# 100 0 " set-beacon" $call-wlan
+;
+
: open-wlan ( -- )
" /wlan:force" open-dev to wlan-ih
wlan-ih 0= abort" Can't open wireless LAN"
- " " " set-ssid" wlan-ih $call-method
+ " " " set-ssid" $call-wlan
;
+: close-wlan ( -- ) wlan-ih ?dup if close-dev 0 to wlan-ih then ;
: analyze-beacons ( -- total-rssi max-rssi #beacons )
0 0 ( tot-rssi max-rssi )
@@ -39,18 +48,64 @@
drop r> ( tot-rssi max-rssi #beacons )
;
+0 value this-rssi
+0 0 2value this-ssid
+0 value this-channel
+: brief-.ap ( adr -- adr' )
+ dup 8 + c@ to this-rssi ( adr )
+ dup le-w@ ( adr len )
+ swap 2 + swap d# 19 /string ( adr' len' )
+ begin dup 0> while ( adr len )
+ over c@ case ( adr len )
+ 0 of over 2+ dup 1- c@ to this-ssid endof
+ 3 of over 2+ c@ to this-channel endof
+ endcase ( adr len )
+ over 1+ c@ 2 + /string ( adr' len' )
+ repeat drop ( adr )
+
+ push-decimal
+ ." Channel: " this-channel 2 u.r ( adr )
+ ." Strength: " this-rssi 2 u.r ( adr )
+ pop-base
+ ." SSID: " this-ssid type ( adr )
+ cr ( adr )
+;
+
+0 value this-#beacons
+
+d# 14 constant max-channel#
+max-channel# 1+ array >#beacons
+max-channel# 1+ array >channel-speed
+
+1 1 lshift 1 6 lshift or 1 d# 11 lshift or constant def-channel-mask
+
+: channel-bounds ( -- limit start ) max-channel# 1+ 1 ;
+
+: channel-avail? ( channel# -- flag ) 1 swap lshift def-channel-mask and ;
+
+: show-beacons ( -- #beacons )
+ \ The first AP structure begins at offset 3 within the scan result
+ scan-buf 3 + ( 'ap )
+ scan-buf 2 + c@ dup >r ( 'ap #beacons )
+ 0 ?do ( 'ap ) \ Byte 2 is number of beacons
+ brief-.ap ( 'ap' )
+ loop ( 'ap )
+ drop r> ( #beacons )
+;
+
+: scan-channel ( channel# -- actual )
+ 1 swap lshift " set-channel-mask" $call-wlan
+ scan-buf d# 2048 " scan" $call-wlan ( actual )
+;
+
: channel-stats ( channel# -- total-rssi max-rssi #beacons )
- 1 swap lshift " set-channel-mask" wlan-ih $call-method
- scan-buf d# 2048 " scan" wlan-ih $call-method ( actual )
- if
+ scan-channel if
analyze-beacons
else
0 0 0
then
;
-d# 15 constant rssi-limit
-
\ Keep the rssi,chan pair with the lowest max-rssi value
: lowest-rssi ( max-rssiN chanN max-rssiM chanM -- max-rssiP P )
3 pick 2 pick ( max-rssiN chanN max-rssiM chanM max-rssiN max-rssiM )
@@ -67,46 +122,59 @@
then ( max-rssiN' N' no-beacons? )
;
-: scan-mesh-channels ( -- max-rssi chan# )
- h# ffffffff 0 ( max-rssi0 0 ) \ This high rssi always loses
- d# 11 try-channel if exit then ( max-rssiN chanN )
- d# 6 try-channel if exit then ( max-rssiN chanN )
- d# 1 try-channel drop ( max-rssi chan# )
-;
-
: quietest-mesh-channel ( -- max-rssi chan# )
open-wlan
- scan-mesh-channels
- wlan-ih close-dev
+ h# ffffffff 0 \ High RSSI for starters ( max-rssi0 0 )
+ channel-bounds do ( max-rssiN chanN )
+ i channel-avail? if ( max-rssiN chanN )
+ i try-channel ?leave ( max-rssiN chanN )
+ then
+ loop
+ close-wlan
;
+d# 10 constant rssi-threshold
+: quietest-auto-channel ( -- chan# )
+ quietest-mesh-channel ( rssi chan# )
+ swap rssi-threshold > if ( chan# )
+ ." No wireless channels are quiet. The quietest is channel " dup .d cr ( chan# )
+ " Do you want to use that channel" confirmedn? ( chan# proceed? )
+ 0= abort" Stopping."
+ then ( chan# )
+;
+
: multinand-traffic? ( channel# -- flag )
- " mesh-start" wlan-ih $call-method drop
- d# 100 0 " set-beacon" wlan-ih $call-method
- " "(01 00 5e 7e 01 02)" " set-multicast" wlan-ih $call-method
+ start-mesh
+ " "(01 00 5e 7e 01 02)" " set-multicast" $call-wlan
d# 300 0 do
- scan-buf d# 2048 " read" wlan-ih $call-method ( actual )
+ scan-buf d# 2048 " read" $call-wlan ( actual )
0> if ( )
scan-buf d# 12 + " XO" comp 0= if ( )
- " mesh-stop" wlan-ih $call-method drop ( )
+ stop-mesh ( )
true unloop exit
then
then
1 ms
loop
- " mesh-stop" wlan-ih $call-method drop
+ stop-mesh
false
;
+
: search-channels ( -- true | chan# false )
- d# 11 multinand-traffic? if d# 11 false exit then
- d# 6 multinand-traffic? if d# 6 false exit then
- d# 1 multinand-traffic? if d# 1 false exit then
+ channel-bounds do ( )
+ i channel-avail? if ( )
+ i multinand-traffic? if ( )
+ i unloop false exit
+ then ( )
+ then ( )
+ loop ( )
true
;
+
: find-multinand-server ( -- true | chan# false )
open-wlan
search-channels
- wlan-ih close-dev
+ close-wlan
;
: nandblaster ( -- )
find-multinand-server abort" No multicast NAND server" ( chan# )
@@ -114,16 +182,146 @@
;
alias nb nandblaster
-d# 10 constant rssi-threshold
+d# 1514 buffer: mesh-test-buf
+
+: (channel-speed) ( channel# -- kb/sec )
+ dup >r start-mesh
+ " enable-multicast" $call-wlan
+ 1 " mesh-set-ttl" $call-wlan
+ h# b " mesh-set-bcast" $call-wlan
+
+ " "(00 00 00 00 00 00 01 00 5e 7e 01 01)XO" mesh-test-buf swap move
+
+ tsc@
+ d# 1000 0 do
+ mesh-test-buf d# 1514 " write" $call-wlan drop
+ loop
+ tsc@ 2swap d- ms-factor um/mod nip ( ms )
+ d# 1,514,000 swap / ( kb/sec )
+ stop-mesh ( kb/sec )
+ dup r> >channel-speed ! ( kb/sec )
+;
+: channel-speed ( channel# -- kb/sec )
+ open-wlan (channel-speed) close-wlan
+;
+
+: ?faster ( chan# kb/sec this-chan# -- chan#' kb/sec )
+ dup (channel-speed) ( chan# kb/sec this-chan# this-kb/sec )
+ 2 pick over u< if 2swap then ( chan# kb/sec this-chan# this-kb/sec )
+ 2drop
+;
+
+: (.channel-speed) ( channel# -- )
+ push-decimal
+ ." Channel: " dup 2 u.r ." "
+ (channel-speed)
+ <# u# u# u# [char] . hold u# u#> type ." Mbytes/sec" cr
+ pop-base
+;
+
+: .wifi-speeds ( -- )
+ open-wlan
+ channel-bounds do
+ i channel-avail? if
+ i (.channel-speed)
+ then
+ loop
+ close-wlan
+;
+
+: (.channel-beacons) ( channel# -- )
+ dup >r ( r: channel# )
+ scan-channel if ( r: channel# )
+ show-beacons ( #beacons r: channel# )
+ else ( r: channel# )
+ 0 ( #beacons r: channel# )
+ then ( #beacons r: channel# )
+ r> >#beacons ! ( )
+;
+
+: .wifi-beacons ( -- )
+ open-wlan
+ channel-bounds do
+ i channel-avail? if
+ i (.channel-beacons)
+ then
+ loop
+ close-wlan
+;
+
+: .wifi ( -- )
+ ." Beacons: " cr
+ .wifi-beacons
+ cr
+ ." Max transmit speeds: (congestion dependent)" cr
+ .wifi-speeds
+;
+
+d# 2000 constant wifi-speed-threshold
+: quiet&fast? ( channel# -- flag )
+ dup >#beacons @ if drop false exit then ( channel# )
+ >channel-speed @ wifi-speed-threshold >
+;
+
+: quiet-channel-mask ( -- mask )
+ 0 ( mask )
+ channel-bounds do ( mask )
+ i channel-avail? if ( mask )
+ i >#beacons @ 0= if ( mask )
+ 1 i lshift or ( mask' )
+ then ( mask )
+ then ( mask )
+ loop ( mask )
+;
+
+: fastest-of ( mask -- chan# )
+ 0 0
+ channel-bounds do ( mask chan# speed )
+ 2 pick 1 i lshift and if ( mask chan# speed )
+ dup i >channel-speed @ < if ( mask chan# speed )
+ 2drop i i >channel-speed @ ( mask chan#' speed' )
+ then ( mask chan# speed )
+ then ( mask chan# speed )
+ loop ( mask chan# speed )
+ rot 2drop
+;
+
: nb-auto-channel ( -- chan# )
- quietest-mesh-channel ( rssi chan# )
- swap rssi-threshold > if ( chan# )
- ." No wireless channels are quiet. The quietest is channel " dup .d cr ( chan# )
- " Do you want to use that channel" confirmedn? ( chan# proceed? )
- 0= abort" Stopping."
- then ( chan# )
+ ." Analyzing WIFI spectrum" cr
+ cr
+ .wifi
+
+ quiet-channel-mask ?dup 0= if def-channel-mask then
+ fastest-of
+ cr
+ ." Using channel " dup .d cr
+ d# 4000 ms
;
: nb-clone ( -- ) nb-auto-channel #nb-clone ;
: nb-secure ( -- ) nb-auto-channel #nb-secure-def ;
: nb-update ( -- ) nb-auto-channel #nb-update-def ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: ofw/wifi/eapol.fth
===================================================================
--- ofw/wifi/eapol.fth 2008-12-12 00:13:49 UTC (rev 1032)
+++ ofw/wifi/eapol.fth 2008-12-14 17:43:28 UTC (rev 1033)
@@ -500,7 +500,7 @@
: .ap ( adr -- )
." Address: " dup 2 + .enaddr cr
- ." RSSI: " dup 8 + c@ u. cr
+ ." RSSI: " dup 8 + c@ .d cr
." Beacon interval: " dup d# 17 + le-w@ .d cr
." Capabilities: " dup d# 19 + le-w@ cr .cap
dup le-w@ swap 2 + swap d# 19 /string ( adr' len' )