From 35015fbd8d07398f9633a096e69f1dadb9a4c389 Mon Sep 17 00:00:00 2001
From: nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Mon, 29 Aug 2005 11:30:35 +0000
Subject: [PATCH] add Wi-viz

git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@1785 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/Config.in                             |   1 +
 package/Makefile                              |   1 +
 package/wiviz/Config.in                       |   7 +
 package/wiviz/Makefile                        |  42 ++
 package/wiviz/files/www/cgi-bin/wiviz/get.cgi |  15 +
 package/wiviz/files/www/cgi-bin/wiviz/set.cgi |   3 +
 package/wiviz/files/www/wiviz/adhoc-idle.gif  | Bin 0 -> 332 bytes
 package/wiviz/files/www/wiviz/adhoc-idle.png  | Bin 0 -> 729 bytes
 package/wiviz/files/www/wiviz/adhoc.gif       | Bin 0 -> 451 bytes
 package/wiviz/files/www/wiviz/adhoc.png       | Bin 0 -> 713 bytes
 package/wiviz/files/www/wiviz/ap-idle.gif     | Bin 0 -> 812 bytes
 package/wiviz/files/www/wiviz/ap-idle.png     | Bin 0 -> 813 bytes
 package/wiviz/files/www/wiviz/ap-wep-idle.gif | Bin 0 -> 812 bytes
 package/wiviz/files/www/wiviz/ap-wep-idle.png | Bin 0 -> 813 bytes
 package/wiviz/files/www/wiviz/ap-wep.gif      | Bin 0 -> 1455 bytes
 package/wiviz/files/www/wiviz/ap-wep.png      | Bin 0 -> 1996 bytes
 package/wiviz/files/www/wiviz/ap.gif          | Bin 0 -> 1468 bytes
 package/wiviz/files/www/wiviz/ap.png          | Bin 0 -> 1824 bytes
 package/wiviz/files/www/wiviz/pip-idle.gif    | Bin 0 -> 190 bytes
 package/wiviz/files/www/wiviz/pip-idle.png    | Bin 0 -> 330 bytes
 package/wiviz/files/www/wiviz/pip.gif         | Bin 0 -> 190 bytes
 package/wiviz/files/www/wiviz/pip.png         | Bin 0 -> 322 bytes
 .../wiviz/files/www/wiviz/station-idle.gif    | Bin 0 -> 754 bytes
 .../wiviz/files/www/wiviz/station-idle.png    | Bin 0 -> 1777 bytes
 package/wiviz/files/www/wiviz/station.gif     | Bin 0 -> 929 bytes
 package/wiviz/files/www/wiviz/station.png     | Bin 0 -> 2475 bytes
 package/wiviz/files/www/wiviz/wiviz.css       |  76 +++
 package/wiviz/files/www/wiviz/wiviz.html      |  81 +++
 package/wiviz/files/www/wiviz/wiviz.js        | 291 +++++++++
 package/wiviz/ipkg/wiviz.control              |   7 +
 package/wiviz/src/Makefile                    |  25 +
 package/wiviz/src/channelhopper.c             |  48 ++
 package/wiviz/src/channelhopper.h             |  19 +
 package/wiviz/src/structs.h                   | 169 ++++++
 package/wiviz/src/wiviz.c                     | 572 ++++++++++++++++++
 package/wiviz/src/wl_access.c                 |  73 +++
 package/wiviz/src/wl_access.h                 |  77 +++
 37 files changed, 1507 insertions(+)
 create mode 100644 package/wiviz/Config.in
 create mode 100644 package/wiviz/Makefile
 create mode 100755 package/wiviz/files/www/cgi-bin/wiviz/get.cgi
 create mode 100755 package/wiviz/files/www/cgi-bin/wiviz/set.cgi
 create mode 100755 package/wiviz/files/www/wiviz/adhoc-idle.gif
 create mode 100755 package/wiviz/files/www/wiviz/adhoc-idle.png
 create mode 100755 package/wiviz/files/www/wiviz/adhoc.gif
 create mode 100755 package/wiviz/files/www/wiviz/adhoc.png
 create mode 100755 package/wiviz/files/www/wiviz/ap-idle.gif
 create mode 100755 package/wiviz/files/www/wiviz/ap-idle.png
 create mode 100755 package/wiviz/files/www/wiviz/ap-wep-idle.gif
 create mode 100755 package/wiviz/files/www/wiviz/ap-wep-idle.png
 create mode 100755 package/wiviz/files/www/wiviz/ap-wep.gif
 create mode 100755 package/wiviz/files/www/wiviz/ap-wep.png
 create mode 100755 package/wiviz/files/www/wiviz/ap.gif
 create mode 100755 package/wiviz/files/www/wiviz/ap.png
 create mode 100755 package/wiviz/files/www/wiviz/pip-idle.gif
 create mode 100755 package/wiviz/files/www/wiviz/pip-idle.png
 create mode 100755 package/wiviz/files/www/wiviz/pip.gif
 create mode 100755 package/wiviz/files/www/wiviz/pip.png
 create mode 100755 package/wiviz/files/www/wiviz/station-idle.gif
 create mode 100755 package/wiviz/files/www/wiviz/station-idle.png
 create mode 100755 package/wiviz/files/www/wiviz/station.gif
 create mode 100755 package/wiviz/files/www/wiviz/station.png
 create mode 100755 package/wiviz/files/www/wiviz/wiviz.css
 create mode 100755 package/wiviz/files/www/wiviz/wiviz.html
 create mode 100755 package/wiviz/files/www/wiviz/wiviz.js
 create mode 100644 package/wiviz/ipkg/wiviz.control
 create mode 100644 package/wiviz/src/Makefile
 create mode 100644 package/wiviz/src/channelhopper.c
 create mode 100644 package/wiviz/src/channelhopper.h
 create mode 100644 package/wiviz/src/structs.h
 create mode 100644 package/wiviz/src/wiviz.c
 create mode 100644 package/wiviz/src/wl_access.c
 create mode 100644 package/wiviz/src/wl_access.h

diff --git a/package/Config.in b/package/Config.in
index f9d6de650..1a7cfb8c9 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -108,6 +108,7 @@ source "package/wpa_supplicant/Config.in"
 source "package/wput/Config.in"
 source "package/xinetd/Config.in"
 source "package/wificonf/Config.in"
+source "package/wiviz/Config.in"
 
 comment "Libraries"
 source "package/cgilib/Config.in"
diff --git a/package/Makefile b/package/Makefile
index 9ee4fa9e5..d081bf98e 100644
--- a/package/Makefile
+++ b/package/Makefile
@@ -157,6 +157,7 @@ package-$(BR2_PACKAGE_USBUTILS) += usbutils
 package-$(BR2_PACKAGE_VTUN) += vtun
 package-$(BR2_PACKAGE_VSFTPD) += vsftpd
 package-$(BR2_PACKAGE_WIFICONF) += wificonf
+package-$(BR2_PACKAGE_WIVIZ) += wiviz
 package-$(BR2_PACKAGE_WIRELESS_TOOLS) += wireless-tools
 package-$(BR2_PACKAGE_WOL) += wol
 package-$(BR2_PACKAGE_WPA_SUPPLICANT) += wpa_supplicant
diff --git a/package/wiviz/Config.in b/package/wiviz/Config.in
new file mode 100644
index 000000000..301bb627f
--- /dev/null
+++ b/package/wiviz/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_WIVIZ
+	tristate "wiviz - Wireless Network Visualization"
+	default m if CONFIG_DEVEL
+	help
+	 Wireless Network Visualization
+
+	 http://students.washington.edu/natetrue/wiviz/
diff --git a/package/wiviz/Makefile b/package/wiviz/Makefile
new file mode 100644
index 000000000..e3453f6cc
--- /dev/null
+++ b/package/wiviz/Makefile
@@ -0,0 +1,42 @@
+# $Id$
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=wiviz
+PKG_VERSION:=1.0
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+include $(TOPDIR)/package/rules.mk
+
+$(eval $(call PKG_template,WIVIZ,wiviz,$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))
+
+$(PKG_BUILD_DIR)/.prepared:
+	mkdir -p $(PKG_BUILD_DIR)
+	cp -fpR ./src/* $(PKG_BUILD_DIR)/
+	touch $@
+
+$(PKG_BUILD_DIR)/.configured:
+	touch $@
+
+$(PKG_BUILD_DIR)/.built:
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+		CC="$(TARGET_CC)" \
+		COPTS="$(TARGET_CFLAGS)" \
+		INCLUDE="-I$(STAGING_DIR)/include -I$(STAGING_DIR)/usr/include" \
+		LDFLAGS="-L$(STAGING_DIR)/lib -L$(STAGING_DIR)/usr/lib"
+	touch $@
+
+$(IPKG_WIVIZ): 
+	mkdir -p $(IDIR_WIVIZ)/usr/sbin
+	cp $(PKG_BUILD_DIR)/$(PKG_NAME) $(IDIR_WIVIZ)/usr/sbin/
+	$(RSTRIP) $(IDIR_WIVIZ)
+	cp -fpR ./files/* $(IDIR_WIVIZ)
+	find $(IDIR_WIVIZ) -name CVS | xargs rm -rf
+	find $(IDIR_WIVIZ) -name .svn | xargs rm -rf
+	$(IPKG_BUILD) $(IDIR_WIVIZ) $(PACKAGE_DIR)
+
+mostlyclean:
+	$(MAKE) -C $(PKG_BUILD_DIR) clean
+	rm -f $(PKG_BUILD_DIR)/.built
diff --git a/package/wiviz/files/www/cgi-bin/wiviz/get.cgi b/package/wiviz/files/www/cgi-bin/wiviz/get.cgi
new file mode 100755
index 000000000..161fc75ee
--- /dev/null
+++ b/package/wiviz/files/www/cgi-bin/wiviz/get.cgi
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+WIVIZ_PATH=wiviz
+
+echo Content-type: text/html
+echo 
+killall -USR1 wiviz >/dev/null 2>&1
+if [ 0 -ne $? ]
+ then #### Wi-Viz daemon not running, start it
+  $WIVIZ_PATH >/dev/null </dev/null 2>&1 &
+  killall -USR1 wiviz > /dev/null
+ fi
+echo "<html><head><script language='JavaScript1.2'>"
+cat /tmp/wiviz-pipe
+echo "</script></head><body></body></html>"
diff --git a/package/wiviz/files/www/cgi-bin/wiviz/set.cgi b/package/wiviz/files/www/cgi-bin/wiviz/set.cgi
new file mode 100755
index 000000000..17b47873a
--- /dev/null
+++ b/package/wiviz/files/www/cgi-bin/wiviz/set.cgi
@@ -0,0 +1,3 @@
+#!/bin/sh
+httpd -d $QUERY_STRING > /tmp/wiviz-cfg
+killall -USR2 wiviz
diff --git a/package/wiviz/files/www/wiviz/adhoc-idle.gif b/package/wiviz/files/www/wiviz/adhoc-idle.gif
new file mode 100755
index 0000000000000000000000000000000000000000..79db61c4d35baa3e25394423a2f0cab2beb0722b
GIT binary patch
literal 332
zcmV-S0ki%`Nk%w1VKM+R0K@<Q|NsB^`1tbj^6TsC-{0TT($dV#%*DmUxVX5ova+nK
ztfi%;pP!$ZnVFcFn39r`jEszhg@u2Ae{yniY;0_1W@cYsUs+jMQc_Y(OiV^bMn6A4
zIXO8qGc*7H{{R30A^8LW0015UEC2ui05SkF000HapeK%GX`X1Ru59bRa4gSsZQppV
z?|kq7z@TtQEY2K_q_SZYA(v1`5lU4`gHVNGtDpv-3WNYa1{kV8@S$8LRIfZ`f?Y0D
znLXv8JV4y7JWmQ`0t|mi6?i&I3jt&Yhe;iZIavl>hY%Z-IFWY}8JstsRTLJYHejSl
z7!#;At4a?Y5U(|{Nfa2iHL8&h91?JWqz@XWSW2~25*!!2l?o6Y9U2wa6&f26&^k{K
e6WA5p-EmaIP3h|E?CtLF@bU8V^!4^SApkpSl8=Z0

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/adhoc-idle.png b/package/wiviz/files/www/wiviz/adhoc-idle.png
new file mode 100755
index 0000000000000000000000000000000000000000..24ae2769fa7fec1b2abcbc1f1196ea66f4f60d50
GIT binary patch
literal 729
zcmV;~0w(>5P)<h*8VUda018P+L{b0%05Sjo05S*$0000UKZvma00N;&L_t(|ob8w~
zZ`wc<$N#TlOq5DyNft9@N|dg!l!=Vx8<a|s@R*O#egnGM5d%!Dsl*513!IcHTPAxU
zODs_x%OS-t1Ds_@NwCj!>HQ`jckkW%b9c}03|K4{i^XEGSS<ewv=67g?|%W%CZaZg
zj~m@H025}Oc%JvOtT{^+;`{yufLkJ}?J}O3Ln8X#?RJNzbC)J02!gKw21RU{dEj~8
zH<S5G5#sy)1rbfKv5g$ZL9JFx+hG_Yj^k}^IwmV)EF=hmBWAwKZYS4u(P%VqczC!r
zRtNzh#8zL--1a>0SCKeA6fxSEyq6Vmc6Nr#%ga|HfaMCkLoWz|qatw_3F-IyE)jKf
z`}p`6jYebZcq!$Z{#Jj;b&*&qMT|7h&(ED~yI!xa^*=p5K?s2;igxzN%pCwf^2TDc
zBFx;>&yM4uTCJviQc8@+<6I(y5Fnyjzu$NB#$qIdh?@FYDFvle+IN3{kHun<%b!jJ
zNs`p^#$vR!vdrgm42Q!s<vu<>=CYSk;^5$*@cg9-(Zq55*1KXWQp&$(x?M3%zcWMo
zlsJyl^qeF~Zoj67{m#Tb%XB(Tg?OI#JFmUzirgC716U@CD2i}$a#Gl*k&sHIQi_m=
zhX=T>tIx>47jkuV6*2R`#D`J}LI|9npM#mhqJ^VztwluF%p4Z6RZ3wz9^>@%RBx+x
z(Kw8Sbi3U@s{qzA&3kp#bUMXoG=k$ex<2a^IpmtsE>_t)iIftf(FnlnI|;D7mnfys
zYPC?UR%guIG!X&p=c?P&rHfJuVHjdQpRbK`U02s-cg$?G5}Lhye7L!}`OM7M0GfFH
z@d2wd)gz+8YHJ#^7a^J;2#$#8Q}(wcNoHlNfW>05SS%Kc#gdyBcd85j3_23C00000
LNkvXXu0mjf18`i4

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/adhoc.gif b/package/wiviz/files/www/wiviz/adhoc.gif
new file mode 100755
index 0000000000000000000000000000000000000000..d07c80cce31f59cfb5c9a171352975f732097527
GIT binary patch
literal 451
zcmZ?wbhEHbG-5DfxXQp_^nZrY|Cz@BXBY#?Pm_$_PcVMkV|=64=xU46r6&9T^Nr8c
z8}F|)+E!|`w!nC4j`7U2$p357{%<m_k1YDX!?-A@{{MdCG#}$gx0(OXEd76J)BhX$
z|KC6J|EaOP<&FQZpZ@>!|NnnuV`Cu6Km(xolZBCiL771ZWH!i83~Ub$Of2xwk?KFO
zr08Uh)%*)9O1#!at-rCR?DX5J{SP)&_~`kwH#SPy8gMhd{vqYicKZFRk5P#)TmDHG
zF(zgUD%5w#mN&<h33W_RtjLYcZl72`IhH9)Y@)2Bq+mH4cS&@1U5CizEKw!Sm~80|
znYCHsO5B^WxTNG2w{73Kd&Tz2a!M?Fju){gDNTtwTh5~-ekt-wk+71$&0Dvb&nvO_
zK3abx{tDY&C61OX7H+meHvW@Je94*bF8se>V4}hN;6Q85e*+th2Wc%0CWU^cb38UK
WI@&E^oOS2K#>L0`6=nndYYhO(uccxD

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/adhoc.png b/package/wiviz/files/www/wiviz/adhoc.png
new file mode 100755
index 0000000000000000000000000000000000000000..7cabb3e8f991102ef42d87875994a5e7ae41a84f
GIT binary patch
literal 713
zcmV;)0yh1LP)<h*8VUda018P+L{b0%05Sjo05S*$0000UKZvma00NOoL_t(|ob8w~
zOjAJ^$A4FhI!I_zmv*rOdAd=2i;Lk+BpQfBXF~^L*%;hhth*50S{7tsCXvPMb&=_X
z8mBTnma<4v^H?B(&*Aw>rA6Ai5=^|`a`$@oeRu!dclX^DEEbE!VzF2(mj4BH6;55L
zEQ0a`JO$~_Hi4D`AH)yT!pC8aIaDF8RObaLD^$Lp{(^)8b31C`o9Wm?6Y@|hYYJ7=
zG%p6Kv~Du~P=vTrod-T8-*>o)N1j<6TypJxpK0)(T9>^*OAyawWsHSPN@XI2swdwL
z89p#gj?u2Z0ZmG5_4E^q87b_jS9?11Na+}LqF^(ryJXqmMNbiNd#>m2zx||BoUG{1
z!$^oL)%nhi{SME>9l+eAtWN0|-Y^?iib-_N;9M9^0s8>>gcrMNMz9~D+-wngY@|yt
z6r#MOHjC5M`i3vm=riP(zCvve)}DEn_U(aoXq^v%Cea`5K4JeN01l4<P{${ESE^%!
z&c}GOCoHke2H$D$!`Rm;sxYXHVQ8Ik$T7=o>pN&1#HEwbG9TKC7!e({LyOT{S}wGO
z?5NiRpDY&=#HSi=R@=AfiqtRf(g%JRmu?O^66_$D3enEQZK5OC+KuZ|_ux8&1gf+y
zNND1NvLBaj7Vh7z>)wKmH@lE3Y8f`8SVS$(HM01qb;`(`?mVvK8c%cty9baRh1|Jo
zOEZf1#A?t!spReBmOOuOz1R4J_;tvNf;46SEbjk?lR;iigzCw7AyB2CCgTtFsXHl^
z2?d*~agb+uJ5F**e(1!>z>EV=$Lpu*+r@wCsoO~$YEl$b;ryQu5Wm$GstjzJu0+C>
v2uX0II@Wz}N`<<wK#Rp<u~;k?i^Ygv8|=;N<mTJo00000NkvXXu0mjfWo}hP

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap-idle.gif b/package/wiviz/files/www/wiviz/ap-idle.gif
new file mode 100755
index 0000000000000000000000000000000000000000..376e194da9fb06984bf27ac4c60ecb52073e964f
GIT binary patch
literal 812
zcmZ?wbhEHbG-5Dfc*ejmefsoi)22<GI(72o$&)5cnlNEPe}8{pUte!;Z%<E8cXxMZ
zXJ<!8M|*pFTU%ReYimnOOLKE`Q&Ur8V`D=@Lw$XHU0q#GO-*%mbyZbWWo2bWMMZge
zd0AOmX=!OmNl9^WaZyoGVPRoGK|x+#UT$t~PEJmCc6L@)R%T{qMn*<@dU{$~T54))
zN=iy{a&l5qQet9aLPA1(e0*G7Tx@J?OiWC4baYfyRAgjiL_|b*cz9S?SZHWyNJvOf
zP*7lCU_d~Cv9a<0|Nj|=AW;0t!pOkj%%B5uJ19;V*#9>;H#N7kwzYS3c6Imk_VrJg
zIBD{fsne#<m^o|qoPM483+B)5(NdNX;o=vTQeCvTU73%Ajg^g)OGsQ^OLu*%Iv+bT
z0|O%qC!eUa(w==y+Jc;ij~rp;7Lrg<)79ChD|e9T$`NKRfnBP1_Gybge9Z9lx%^9m
zed=QTm)>8yaZA^5uiMlE3W<%4na3uCUQl2<$}M%*ZSI2v#zRajtXX$YJ#B31lCV%J
z^I~*rZsp(;(@9wHiiurNJ?6p<#Yw{4Lh@!YD-0GcXXTM`+A^u}u=@c&osbC}7ZaP?
zc%&?91QL^2d8BPBDvB3AV&N22Jk+Pr*u>f+W!-S1;2M)#x2Q&^-yDaDO-H#U&C34V
zc<2+*EoqdnM?xmqtyjjj;f=+s*O$3u%yMk5U3~05VL~nE#*T@H+xz7m>Rwb#{3)<K
zV5#s%fkV5}vd*q)-BG8TQJQ_LE$8&HSdZ^HxAs*Y-lw~#?9Ki4&EoQl_EZ!<JYVU4
j+*bC-$ERo3>#v^|v%C2Hg@fMW{&V+~KAOVB$Y2cs$lV92

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap-idle.png b/package/wiviz/files/www/wiviz/ap-idle.png
new file mode 100755
index 0000000000000000000000000000000000000000..b5e593978d706312af06e65120758f3251409eaa
GIT binary patch
literal 813
zcmV+|1JeA7P)<h*8VUda018P+L{b0%05Sjo05S*$0000UKZvma00Q+%L_t(|ob8uA
zZrd;zhTo4=C`SS0Oo1~cM~D#*-I^OTM{watK&SW!K0?OE%HSK+y+JPEpdGuVH)w$j
zlK9u5p<)Lficmp>f-gW25-IY1#J`U~P*6}%P|(XouhD3p=U)JvZz;M5uq2|z_4W1l
zHv4Q9B+v6cV{F;$_0Hlr#_sMe;y8ve21+TEWr>G}2UJxB080Sl`F#GnjlQEc8UcVT
z%Px~7nI0S*9LI4C#u$hQ)>>$-n`h3s13K4Q-vSu6(LZmaku1yJ3n4xq9v%*Qy&i-R
z5JDh|B5=+@^mpK`wJ^rOS_>kA)_O1;4v$Bp(d}xrs(d^!Ux>+Ma>N*04hDmLAp~}I
zb`V8R15HHDJI;BN7-O#97{JWehc^ggY?h|!zB9+z_9oZMiKt1BnocH@BQGC5A3rYc
zagroH%|Iyy#@M!9?w{oaVvIS9q6pU7X8s#vw${~JH|4IrwH5$e{&paYu@lA^wAM{h
zN<k^r)Unn=N(rS@Q^x_hq_qYSo%wk2-hSN~;nskAr?qZCwALFiE_Wd7;4hUIh%x4y
zGvXkeanAY1vr-CD%B?^S`prN%=lAY!yTi{IvoSgVHm02eak+!B)_(Kx;<ZLxyj0iq
zMyjd`Wm#_IRaI@&aS(1aiD>EL#e0odYZpqXF@WZ;ub<|?)0$b|4BRx6Qlj7Q|I%77
ze0;RA*k_Ef^SZ8^L-Bc7;?~LYDJG@FV>B=;isGk_k5;1Ji;Ig7M6|5y8bs8b-cIXV
z?fR4wLLg1kMNt$VeLb`iG~V6a{TPi#`%x6VE6Wl}sb)H@8+W6iwMLR8NYnJHD2h*Q
zcxd%Ll4aQ?5nV|sQI;j7lmM_1@d_cZx3_msMAMs_o3Cy4-TDeK&-1>ub_`%lL?_S7
zt+i7kTC{bca(b1ku2Y`pcC}hH&!?xSn9t|0(x-PA-xURrt|@?YO#!593Lsrm0O^_n
rNY@lVx~2fqH3g8aDS&iM{|d+-K)VKdPt(B&00000NkvXXu0mjfX`On%

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap-wep-idle.gif b/package/wiviz/files/www/wiviz/ap-wep-idle.gif
new file mode 100755
index 0000000000000000000000000000000000000000..376e194da9fb06984bf27ac4c60ecb52073e964f
GIT binary patch
literal 812
zcmZ?wbhEHbG-5Dfc*ejmefsoi)22<GI(72o$&)5cnlNEPe}8{pUte!;Z%<E8cXxMZ
zXJ<!8M|*pFTU%ReYimnOOLKE`Q&Ur8V`D=@Lw$XHU0q#GO-*%mbyZbWWo2bWMMZge
zd0AOmX=!OmNl9^WaZyoGVPRoGK|x+#UT$t~PEJmCc6L@)R%T{qMn*<@dU{$~T54))
zN=iy{a&l5qQet9aLPA1(e0*G7Tx@J?OiWC4baYfyRAgjiL_|b*cz9S?SZHWyNJvOf
zP*7lCU_d~Cv9a<0|Nj|=AW;0t!pOkj%%B5uJ19;V*#9>;H#N7kwzYS3c6Imk_VrJg
zIBD{fsne#<m^o|qoPM483+B)5(NdNX;o=vTQeCvTU73%Ajg^g)OGsQ^OLu*%Iv+bT
z0|O%qC!eUa(w==y+Jc;ij~rp;7Lrg<)79ChD|e9T$`NKRfnBP1_Gybge9Z9lx%^9m
zed=QTm)>8yaZA^5uiMlE3W<%4na3uCUQl2<$}M%*ZSI2v#zRajtXX$YJ#B31lCV%J
z^I~*rZsp(;(@9wHiiurNJ?6p<#Yw{4Lh@!YD-0GcXXTM`+A^u}u=@c&osbC}7ZaP?
zc%&?91QL^2d8BPBDvB3AV&N22Jk+Pr*u>f+W!-S1;2M)#x2Q&^-yDaDO-H#U&C34V
zc<2+*EoqdnM?xmqtyjjj;f=+s*O$3u%yMk5U3~05VL~nE#*T@H+xz7m>Rwb#{3)<K
zV5#s%fkV5}vd*q)-BG8TQJQ_LE$8&HSdZ^HxAs*Y-lw~#?9Ki4&EoQl_EZ!<JYVU4
j+*bC-$ERo3>#v^|v%C2Hg@fMW{&V+~KAOVB$Y2cs$lV92

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap-wep-idle.png b/package/wiviz/files/www/wiviz/ap-wep-idle.png
new file mode 100755
index 0000000000000000000000000000000000000000..b5e593978d706312af06e65120758f3251409eaa
GIT binary patch
literal 813
zcmV+|1JeA7P)<h*8VUda018P+L{b0%05Sjo05S*$0000UKZvma00Q+%L_t(|ob8uA
zZrd;zhTo4=C`SS0Oo1~cM~D#*-I^OTM{watK&SW!K0?OE%HSK+y+JPEpdGuVH)w$j
zlK9u5p<)Lficmp>f-gW25-IY1#J`U~P*6}%P|(XouhD3p=U)JvZz;M5uq2|z_4W1l
zHv4Q9B+v6cV{F;$_0Hlr#_sMe;y8ve21+TEWr>G}2UJxB080Sl`F#GnjlQEc8UcVT
z%Px~7nI0S*9LI4C#u$hQ)>>$-n`h3s13K4Q-vSu6(LZmaku1yJ3n4xq9v%*Qy&i-R
z5JDh|B5=+@^mpK`wJ^rOS_>kA)_O1;4v$Bp(d}xrs(d^!Ux>+Ma>N*04hDmLAp~}I
zb`V8R15HHDJI;BN7-O#97{JWehc^ggY?h|!zB9+z_9oZMiKt1BnocH@BQGC5A3rYc
zagroH%|Iyy#@M!9?w{oaVvIS9q6pU7X8s#vw${~JH|4IrwH5$e{&paYu@lA^wAM{h
zN<k^r)Unn=N(rS@Q^x_hq_qYSo%wk2-hSN~;nskAr?qZCwALFiE_Wd7;4hUIh%x4y
zGvXkeanAY1vr-CD%B?^S`prN%=lAY!yTi{IvoSgVHm02eak+!B)_(Kx;<ZLxyj0iq
zMyjd`Wm#_IRaI@&aS(1aiD>EL#e0odYZpqXF@WZ;ub<|?)0$b|4BRx6Qlj7Q|I%77
ze0;RA*k_Ef^SZ8^L-Bc7;?~LYDJG@FV>B=;isGk_k5;1Ji;Ig7M6|5y8bs8b-cIXV
z?fR4wLLg1kMNt$VeLb`iG~V6a{TPi#`%x6VE6Wl}sb)H@8+W6iwMLR8NYnJHD2h*Q
zcxd%Ll4aQ?5nV|sQI;j7lmM_1@d_cZx3_msMAMs_o3Cy4-TDeK&-1>ub_`%lL?_S7
zt+i7kTC{bca(b1ku2Y`pcC}hH&!?xSn9t|0(x-PA-xURrt|@?YO#!593Lsrm0O^_n
rNY@lVx~2fqH3g8aDS&iM{|d+-K)VKdPt(B&00000NkvXXu0mjfX`On%

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap-wep.gif b/package/wiviz/files/www/wiviz/ap-wep.gif
new file mode 100755
index 0000000000000000000000000000000000000000..33debb12505a2186f1b051055fd33b8ca611e858
GIT binary patch
literal 1455
zcmeH`{WBYO0EfS6qD?e+qT<~oQM)6@-DuZx>pC<v;;mGxEnCZ)Tr##Os#f6=jmAqT
zTEyE4p-ovxa_nMcMAAqpf-=iY2{%HJSkd%$v-O|YPy74>&)xIf=VEwRKwz>z@COF~
zfI|RG0PFxT3&1b{QUKZjXaax@Kmh<00LWl}k92SlX?Yj5WsKO_j(+?08@-+;5>em3
zmo6>}{umCQ5JzWyn_{t8_V@Sq_V#vncg<$=&d$#E_V(7+meFY3+}t!64D0LbYinz(
ztE($3D|)?td3kwhY3a?IH;aplI-PEQetvFl?)B@}Gcz;O)6-K^Q(CQda&mHFVq$!J
z{MD;hV`F2ZqoW#)W@KbUtyZg4Dy34XP$&im2jz14z`#I%e}7+JpG+p}?d|R9>5)pM
z5{X1C7I$}dcXf4%M54~l&W?_b=g*%Dg~Dggo;`i~w7tE(t*uQU5VW?owzRbH`TXYQ
z=BB2m#>U2mhKBn3`ntM09*<XBTU%38Q(ayC`0?Yas;bJ$%14hLm6w;7m6dV1+|tt0
z;^N|>q9P85!)CJ!3JO>(7L&=$&(F`x%VRJYxw*Ob@88eK$+>s$UUqhNR#sMKW@bi4
z2Axh%OG`^lO{LLjR4SE1p^(YsQ>RWH9{yY9|NR#Ra26N@01oi^0Q>L>06zpa2sfgb
zuXq5r!zXFPElLjRB&jjL7Q85Qz}!emx5bTck!SJiIVOR!3>F*)<4=34FSs3(asw+W
z#v9HY#}l=2kg?j6WOq2;6yxd}k~Aa?CPZOFVD`vMfpP7@r34!YJm}8~7iWAlFF-MD
zW$hlej`oo8$%%ztWDoxL7mt?MV$LzWB>ER+n9$K5?1jvr2oVC}!w<~FVqJZRSz4?T
z@dWQjdF#{)vx(=O7kHeXzeZv43OfdfxReVI&z&7q&Eq^@)=YBHaL|W6ZCLPjJdR|4
zeYeQ^WBA==@yLWx7iU7o-(qe|b`FuJxdN!#`Xv@_b!ZtXte{L>UPWey=VU2lHz26b
zXC8!=_6N{6yoXgKE(`RiwXaB@ynOOIjtVL-Abo{F8Y|RkQ;?M{Dnn&=y$FK60(H^w
z7*M$%+a^$BI)ZZu&;lqrUIw#IdLn6|UPZ94q(k@as8C-Rna~ov)JuVhy={Bc^}(;i
z75a6S7YcV38%sbX-m1`-pd*)#I^5*Na+q_oPB#<o*vF07MYuu2^3TYZL!HxL{-|7e
zF->rUP@PT0(IO$Cc9F0R0{RNo9O|5EG`lB$bYlKC>j<Lip+my8WN(MW96z;lnz7O|
z*Gd;iAw|2VTy{-nn5~?WEABjWNq@(MEHU~12CrcDU$|o~G@(N6#z1DwCb#OmFm=c5
zt1vXx8CY`&+sVWCI|L%ZhxH{6z14%9wf?0yhLj5LEv{@6$yV!+PyM*k5n<bJ_~|#)
zz%GeEmv6R~(tlpq-qgzf_J^epX*VKFAy5qC(y+CoDqZ=hGg1<46O-hpay;888Fs}i
KNJ1bG@Yz4(RS^CF

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap-wep.png b/package/wiviz/files/www/wiviz/ap-wep.png
new file mode 100755
index 0000000000000000000000000000000000000000..2a907f05b0495dfe705c1a4058339251bf8778dd
GIT binary patch
literal 1996
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

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap.gif b/package/wiviz/files/www/wiviz/ap.gif
new file mode 100755
index 0000000000000000000000000000000000000000..739c18c918cb25eb3b7bac3f2fc77257eb28d3f1
GIT binary patch
literal 1468
zcmeH`c{AI20EfRwmDEUR9c_aIwN@32vF!Fp5VW<kVGTPi-PBAnEHlorUC~ZL;uwii
zb%ybai2I7N?jwmDu8JcaN7Y?XS7N4B*3@p_#QwFPH}K3n&wPCE`nY>Mb_UMi2mo*f
zfC_*E02BZS0cZoD3V?C|=m4YwKn8#WPESuyPEL-Gk3WC@d~|g5>C>l=A3q)*9;(%9
zl}dGRaIn9>zqhxyySuxyv$MUutyC(vwzf7mH#asm*4Nk9*49>6S65b6mY0{`y?eK`
zw6wUmxUjG=KR-V=H}~ev8-+qKJ3BiwGc!FsJvB8Ym&+$7CttsQJuxvcK0ZD+Ha0ps
zDwD~iQmI5D5sSsc!^0wxNGKEv1cITVp~1nyfq{Yk{{FtczTV#6o}QlW?(VLxuFlTR
zj*gD@_V!n=UbVHg@%jAL*4CDmmgeT>rlzKbhKBn3`ntNh+S=NhnwskBY95bQRaM31
zaw{t<IUEiIK@}Ah<>lpUHoLU6w4|h@xVX5esHm{8u%MtIKR^G)ix+u$dC#9e&&kPQ
zu~<wdGdnvwD=RA_BZE$-r>3UTXf!I7`s~@Wr%#_!D3s*n<fNpe#KgpegoOC`_?VcO
z=;-LEsHn)u$cTstGMP*wkz8C{&d&Z#^8fxL1DIo&1_0^6{wwe6CxFfwfa{|CS|LH2
z&PBUWSu01Bfwa0;=57GQ3}cH2p|J)SDO2xzJLMA<SHyzhd|=SDwT~C-d>hjvHg|&U
zcEQe19;h)^WJNO9v6CZEj$T3SxdByh2nRFLBX|VzaM|8)4IS(Zfo)=iO#uO(cqYnk
z7irlAksdN^NtRI77CsYhVoy|J!_TqIedUctwN&i=CS47C$RlB;;_@|jLMFfo8HjI)
zO7xmFBB=N_*Yft<uVh*=y{!?+!KG?xBWz-wRyC!$Hox7z8i)oPsq(5nYC`Ri1eW5m
zwJY@o`>#El;6uG2BK5;$gOD^`mcTuyJM!`d<xJK$KVtMlT9~1Em{W5w@Kz`@X=}|4
zIOXpzw>0thuP(*>Bz<(xY2;-&ChC-!cEOgZqMb+Q5`*<UZNI~tkbs|ps_m@3jEzGI
z(%_DbR89D|t!OR%J7_h`m<Vw=5y852MXZ*Z12ed_LP*nd9w(;hV^LGyMq#;X3DIrZ
zG&I-(?wV<QA7wyC+}s@!A-vG5Fr$Z=c@i_t2O;Z}Ffm?c_RCEU%+SX)&fCx*8*t9#
zF{IW;Yt<bsmblqrgCf(BLWxn3w}!YfFer~<5)Q4VoA2?(7#hLYmVl0a!e<ym@oKy&
zxmKNS?q45*h9asj@i1<J5?s1zI1?wi{Chjb*8=F*e#kF2bj`F#Y!vuhjhW?VphL_g
z^(+<dPb9{D`+YrcGHFhZW+X;6`3~At*Ll889wT&Rk*<?E87bMhJr@fW9qyWq>^Srz
z=Cd8~C;Qg}2ETa1Vu$qM{!U)n7XA*sM|LR$q5hrm*kPTY{nf(vkIIn4S6bL{Qti06
SeA$)!6#mF1ZX*E;e*6cOnjy3R

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/ap.png b/package/wiviz/files/www/wiviz/ap.png
new file mode 100755
index 0000000000000000000000000000000000000000..038aab83a3da95f195141db6cf5fb1613f76d153
GIT binary patch
literal 1824
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
O0000<MNUMnLSTYaPhP?R

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/pip-idle.gif b/package/wiviz/files/www/wiviz/pip-idle.gif
new file mode 100755
index 0000000000000000000000000000000000000000..fa923bdf162888c0df687cfd53cc96ef0b9ba2a4
GIT binary patch
literal 190
zcmZ?wbhEHb<YC}pIKsei<Hn8i=g*%xbLPZ}6Gx98J#^^MrcImHuV24r&6*V}RxDk*
zbmq*NGiJ<~I(6!#Nt62e`g(eLIyyR9TU+bv>nkfO%gf74OG}H2it_XGb8>PrGc*7H
z|IdH~6o0ZXGB8Lp=zzpPb~3P9KTzvSIjQsF&=id%8O@y{jS5E|6*06-T+r+8XXvm*
kY=ZZ@8MAz*ondt|>hdx&Vn3RB(Zy?a*Jn<>ZYKt70J>FCssI20

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/pip-idle.png b/package/wiviz/files/www/wiviz/pip-idle.png
new file mode 100755
index 0000000000000000000000000000000000000000..33c280ea65a3be9586bd91ffed21ca716ca70f54
GIT binary patch
literal 330
zcmV-Q0k!^#P)<h*8VUda018P+L{b0%01N;C01OBQ00011bzJ8F009z7L_t(|oRyKk
zYJ*S|#(%ezi;J`%IAlpzx4uF92<;QJn~rvK^a`4eW=bDOh`T~31xdi7TnTu&T})6&
z0{y1*=R4<o=N$Ma#L-BS<jxqg5<<LB3C5U>5F+$_{}<qPlG_L&UL40kN{QB*x~>@;
z+yk$t2}zQ?0UOWrux%TyH2`UvPA7#y5PaQ?e(1U`uIr+dqAW}DJU@|#VL&MrP9;4m
zrD&Rls;b!U_p?R&zNak9huIEY*O6t}*~_$Ti*4Hg93^efGDkE`gOqZ6Dlo>xm&m)_
z4y`qg<HRuk!{^~}2&<|>N(q2cimvNeE|;q)iaurq0PFSosVIurvaIJZ^s`tjV&C__
cuSvd&Ker`w2d8D|Jpcdz07*qoM6N<$f|Pxe0RR91

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/pip.gif b/package/wiviz/files/www/wiviz/pip.gif
new file mode 100755
index 0000000000000000000000000000000000000000..4d48ff92ab681c612cc26543c6bf1b0684970bad
GIT binary patch
literal 190
zcmZ?wbhEHb<YC}pIKseSG$YOE{|ux5GmU}h(<I}kJw}(BjL*~??JhIkRAjuN(0FEA
z+W$?)^^wNqA;v{P_5b%9r}^~!KWZH5HuL`(V|&XR|6f1-|H;_L{?q>-|G|I(2`K(#
zVPs&CX3znNf$U^pwSJ)1mm<mYLSTx9i=(Dx#H_NTj}&f-Gz+!KC@Xt%@lBj#xHUp!
cdUIzIi*JHQlhfj#D-^t>-Gv$S`kff80i$P0cK`qY

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/pip.png b/package/wiviz/files/www/wiviz/pip.png
new file mode 100755
index 0000000000000000000000000000000000000000..96be6a1e7e6217540046a5be121efde0f7026978
GIT binary patch
literal 322
zcmV-I0lof-P)<h*8VUda018P+L{b0%01N;C01OBQ00011bzJ8F009a~L_t(|oSl&^
zPs30YhMz-lWDL=Sqzbhf#6mR*2pr+dp{N_O^N48-Lw2eN(jNdnpnu>lOTetEsx>Tu
zTth>~MbMTm83JB)^WNv2_ndp-kCN)(nxJhkLqWVIU@)N|zLMS>z-r?z6y)TP4mK?^
zG>;^d3O0b#I>9x;1rXkIhJyt_hUSQ<ndK|FysZ-abGC7?>duPnht&lpef5F5pqns5
zQxNe)#Pi~&$qX5(t%V&FIs4o#e;Sp8YXh)ST9f5usW^qrwMktt#|(ajAEuxS=Eu$e
z8vn3kf*Z-S&q#sY`ZlL8pmNOB?r?l?-EWS>SbF_Wdwq}hkGS$o$4ZGkuY&)jFAsxR
ULq{(IumAu607*qoM6N<$f}Jsq!T<mO

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/station-idle.gif b/package/wiviz/files/www/wiviz/station-idle.gif
new file mode 100755
index 0000000000000000000000000000000000000000..4abead018920f9e77f78c6b384b00ea864fe334f
GIT binary patch
literal 754
zcmZ?wbhEHbG-5DfxXQqgl%Hw*f2P^jsg|!N**xmEztQ7%wAE)*z5j}up!t<yQ%fUz
ziej4b<12G!&YU@Q>eNY-CiV36bar;Owzf7kHPzSGS5{V*mX;P373JsW=j7yMW@e_P
zr6naL#mC1-Mn(n&1^M{+czSxexw+Zf+gn;%8XFrM85#Zm|DS;xK=CIFBLjm5gAT|r
zke?XX{yR)5@X(R!Ke43fWRBJR3oA;z)<&(rv8L?w+p7H!HdOfN&EC0u^2;2PsdiI^
zqG!k@DoJsr=a$v0iOQ=rixnl8mP@HL_b65;)-^QsOi^o%>!|3SI#oqNJ$ho}oF&Z?
zDp6_*0?U`Ko3|iRRX}y!HklQXYE|3TsY-2(P}#C~sf==zy2Rw8bLK}W3Z7jeuXu9t
z<*DZ*6+~~|y0%MD@%}1N0r{+hA?osCH{}Hdn-s-GrQ{T6*92_-y;RlWgz%T;huHX}
z3_=zNG&-^JUCrW(N@`+m3zty{QTTqGiJg^|iASS=;UE*AjGRTp%LPsDogQ8m6Fg2%
zX69C8^7}9&!J*;*d<QO*3kHp<r@53p_Bb!f@mJ>N^PBj<fRUMj#jf$6$gF_FY#chu
z4IDcr&7YXKb(dqnlguVI26mQ=yH+C2ZES1;DFqCThov|0sm;(WT6Cy|qt?6S!~?PS
zF}q@A*%dZC4C&y~KDy3Y=xp;NE;dPt3Ymu2t-BZ3%e_!o#L_nPg-?#1QAbPLR51gY
zm<10S8ku6ct6VxKmAY=|WLICwk<`*Ds9+Icp>t4`jmNcj)0F@wmzJq(7tAo&HQD*|
z^NY)~<0BhcIM3+1pGh;SvpxOk`9kmeKeC^;2z)jzbmEXJNSIOkq>`nHQ?9|ZzbM4O
niK&t8(Dr*3ovbrXDRk9t;GfUD`-)M!z?2M&N1YMC<Y5f}&WsTu

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/station-idle.png b/package/wiviz/files/www/wiviz/station-idle.png
new file mode 100755
index 0000000000000000000000000000000000000000..e37469c2f6257c11de966bca481541c7be64c484
GIT binary patch
literal 1777
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
T<21mz00000NkvXXu0mjfyW4*l

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/station.gif b/package/wiviz/files/www/wiviz/station.gif
new file mode 100755
index 0000000000000000000000000000000000000000..0008a706a2f2e5d8fe5bff137e54242b2af4ca1a
GIT binary patch
literal 929
zcmV;S177?`Nk%w1VKM+R0M!5h05kssGx7#A<q0#`6Em_FGo>Rlatt%f4>P|RGnpJS
zj2|<9CNpL!Gg&M%OfNG(VsB|P|Cu)Rl{xE@KiG^$#f40=e^01<QlEKNm33K+a$JIM
zUwLc*{{R5+007JY0Hy!{nE(Ko003qH0A&D~nVFT9m6DQ@jEszliHU`Ug@S^De}8{@
zd3kkpb#iiYZ*OmGY;0+1X=Y|-Vq#)nUtd{SSyEC`OiWBhMn*qBKRG!$Gcz+XGBW@F
z{{R30A^8LW002G!EC2ui05SkF000L6K%a0(EE<o<q;kn@I-k&}bV_Y@uGQ@E+R;`=
zV3H8){f@@v>`2^ASJ`d%mV0E&nPj5<ZY259MSFZkYd&#8BqN7|frgEXX+1qWeU5sN
zT0A>8EIW01K4+Lxk~uFZF)=fgk3^!Gn<^|eJPZ#lo_!ugid3biF**+l0ssj(tArtk
zB%?~2HnOw~1OV0m0k^rlhp$b)sKUh8<OMn}J$=lU&#|+$)#UO34lg==AFk|3JU1uy
z!-~zDN8nsKJs=i28?xiX4g~`vT5B-lUJ(%s`Ke+cG2($8F%Ejs;c!65fedEki1fn7
zf|K(G@IaRa2MQhnVP0Ec14pF)SrBzz6EIVxmK!V{1P}^9K!OJ^e3s#X0!IR!0v7aR
zal*zVqf>g=XyM@G0Rud2pg=(jhYJ=lYT(epqpp;OI^xYkz+lIWwX~wKkTE013l=L-
ztY9&t=Z?CplJJ=EqO3du4s^^o!2(BG6)k3Dpb%jK1q&B6%$Q-KgzFM4LO%w}u*8l7
z)&eBR{Gvn)9DYI1z%U_#@#7UZ#8C12HH#cNT0}0=<HZaHP9NZCQNo^P6)zxMD1O{{
za>FrXoOq4mhF{myi;#Sb^hB_8Dq=veAfdc@<uAm*K?N7UP{Ii_Y_eVnD#S-b4=kvF
z0)ji>07HHQ`u87t8A^b@0cASiz=CV-(N=^_HB`vLU>j7RVFc&7AfSs8SO5VEIqcBe
zfwY)dL|r<>;93hW5T-!}7F0mNdCY~j+G;U)w%LIRI>^rqH{`%W4mZruf`lo=_QDIy
zHTPN!JKTVRYxY<vS#!c=xn-AMn&}z~I_NMWY&rP&jGb_XCMTC(b_SAbD&XMf5<TEh
z!weAu8Yq@L)UX~~Zb|`Jh>xx)DGyZcu&5W1RcJ$@CGdb|ri=&y84shjD(kF81OWg$
DM^u9Q

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/station.png b/package/wiviz/files/www/wiviz/station.png
new file mode 100755
index 0000000000000000000000000000000000000000..2df942058291111883ba727234e77fffbb468506
GIT binary patch
literal 2475
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

literal 0
HcmV?d00001

diff --git a/package/wiviz/files/www/wiviz/wiviz.css b/package/wiviz/files/www/wiviz/wiviz.css
new file mode 100755
index 000000000..7b5afa706
--- /dev/null
+++ b/package/wiviz/files/www/wiviz/wiviz.css
@@ -0,0 +1,76 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+body {
+	background-color: #D0D0D0;
+	vertical-align: center;
+	text-align: center;
+}
+div.main {
+	background-color: #D0F0D0;
+	width: 500px;
+	height: 500px;
+	border: 1px solid #555599;
+	vertical-align: center;
+	text-align: center;
+}
+div.floater {
+	background-color: #D0F0D0;
+	width: 125px;
+	height: 300px;
+	border: 1px solid #555599;
+	float: right;
+	z-index: 3;
+}
+span.status {
+	color: #FF0000;
+}
+img.icon {
+	width: 50px;
+	height: 50px;
+}
+img.pip {
+	width: 12px;
+	height: 12px;
+	position: absolute;
+	z-index: 1;
+}
+td {
+	vertical-align: center;
+  text-align: center;
+}
+span.hostdesc {
+	font-size: 10pt;
+}
+span.extrafo {
+	font-size: 10pt;
+	visibility: hidden;
+}
+div.hostdiv {
+	position: absolute;
+	background-color: transparent;
+	text-align: center;
+	width: 150px;
+	z-index: 2;
+}
+div.hostdiv_hov {
+	position: absolute;
+	background-color: #C0E0C0;
+	text-align: center;
+	width: 150px;
+	z-index: 3;
+	border: 1px solid #000000;
+}
diff --git a/package/wiviz/files/www/wiviz/wiviz.html b/package/wiviz/files/www/wiviz/wiviz.html
new file mode 100755
index 000000000..f1356fd82
--- /dev/null
+++ b/package/wiviz/files/www/wiviz/wiviz.html
@@ -0,0 +1,81 @@
+<html>
+<head>
+<!--
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+-->
+<title>Wi-viz wireless network environment visualization</title>
+<link rel='stylesheet' type='text/css' href='wiviz.css'>
+<script language='JavaScript1.2' src='wiviz.js'>
+</script>
+</head>
+<body>
+<h2>OpenWRT Wi-viz network visualization</h2>
+<div class='floater'>
+Status: <span id='status' class='status'>Monitoring</span><br>
+<input type='button' id='togglelisten' value='Stop monitoring' onclick='toggleListen()'>
+<p><form name='channelform' action='/cgi-bin/wiviz/set.cgi' method='get' target='wivizGetFrame'>
+Channel setting:
+<select id='channelsel' name='channelsel' onchange='channelSet()'>
+<option value='nochange' selected>No change</option>
+<option value='hop'>Hopping</option>
+<option>1</option>
+<option>2</option>
+<option>3</option>
+<option>4</option>
+<option>5</option>
+<option>6</option>
+<option>7</option>
+<option>8</option>
+<option>9</option>
+<option>10</option>
+<option>11</option>
+<option>12</option>
+<option>13</option>
+<option>14</option>
+</select><br>
+<span id='hopoptions' style='display: none'>
+Time/channel: <select name='hopdwell'>
+<option value='500'>0.5 sec</option>
+<option selected value='1000'>1 sec</option>
+<option value='2000'>2 sec</option>
+<option value='5000'>5 sec</option>
+</select><br>
+Hop sequence: <select name='hopseq'>
+<option selected>1,3,6,8,11</option>
+<option>1,3,6,8,11,14</option>
+<option>1,6,11</option>
+<option value='1,2,3,4,5,6,7,8,9,10,11'>1 to 11</option>
+<option value='1,2,3,4,5,6,7,8,9,10,11,12,13,14'>1 to 14</option>
+</select><br>
+<input type='submit' value='Set'>
+</form>
+</span>
+</div>
+<center>
+<div id='infodiv' class='main'>
+<table height=100% width=100%><tr><td>
+<span id='pips' style='position: relative'></span>
+<span id='content' style='position: relative'></span>
+</td></tr></table>
+</div>
+</center>
+<span id='debug' style='display: none'></span>
+<iframe style='display:none' id='wivizGetFrame' name='wivizGetFrame' src='about:blank'></iframe>
+<script language='JavaScript1.2'>
+ scan_thread();
+</script>
+</body>
+</html>
diff --git a/package/wiviz/files/www/wiviz/wiviz.js b/package/wiviz/files/www/wiviz/wiviz.js
new file mode 100755
index 000000000..dc67d8f01
--- /dev/null
+++ b/package/wiviz/files/www/wiviz/wiviz.js
@@ -0,0 +1,291 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+var mv = 353;
+var stupid = eval('window.attachEvent') ? 1 : 0;
+var hosts;
+var idle_timeout = 20;
+var erase_timeout = 35;
+var skew_x = 0; skew_y = 0;
+var listening = 1;
+var wiviz_cgi_url = "/cgi-bin/wiviz/get.cgi";
+
+//What? You mean the POSIX thread API hasn't been ported to Javascript?  Bugger.
+function scan_thread() {
+	var loc = document.getElementById('wivizGetFrame').contentWindow.location;
+	if (!listening) return;
+	if (loc.href != wiviz_cgi_url) {
+		loc.replace(wiviz_cgi_url);
+	}
+	else {
+		loc.reload(true);
+	}
+	setTimeout("scan_thread()", 5000);
+}
+
+function toggleListen() {
+	statusel = document.getElementById('status');
+	statusbutton = document.getElementById('togglelisten');
+	listening = 1 - listening;
+	if (listening) {
+	    statusel.innerHTML = "Monitoring";
+	    statusbutton.value = "Stop monitoring";
+	    document.getElementById('content').innerHTML = '';
+	    scan_thread();
+	}
+	else {
+	    statusel.innerHTML = "Stopped";
+	    statusbutton.value = "Start monitoring";
+	}
+}
+
+function channelSet() {
+	channelset = document.getElementById('channelsel').value;
+	if (channelset == 'hop') {
+	    document.getElementById('hopoptions').style.display = 'inline';
+	}
+	else {
+	    document.getElementById('hopoptions').style.display = 'none';
+	    if (channelset != 'nochange') document.forms[0].submit();
+	}
+}
+
+function mousenter(e) {
+	if (stupid) e = event;
+	el = stupid ? e.srcElement : e.currentTarget;
+	el.parentNode.parentNode.className = 'hostdiv_hov';
+	el.nextSibling.nextSibling.nextSibling.style.visibility = 'visible';
+}
+
+function mouseout(e) {
+	if (stupid) e = event;
+	el = stupid ? e.srcElement : e.currentTarget;
+	el.parentNode.parentNode.className = 'hostdiv';
+	el.nextSibling.nextSibling.nextSibling.style.visibility = 'hidden';
+}
+
+function generate_mnemonic(hash) {
+	c = new Array('b','c','d','f','g','h','j','k','l','m','n','p','qu','r','s',
+		't','v','w','y','z','th','ch','sh','cc','rr');
+	v = new Array('a','e','i','o','u','ae','ai','ao','au','eo','ei','eu','iu','oa','oe');
+	var i, a;
+	var p = hash & 1;
+	var n = '';
+	for (i = 0; i < 4; i++) {
+		a = p ? c : v;
+		n += a[hash % a.length];
+		hash += a.length << 3 + a.length / 2;
+		hash *= hash;
+	  p = 1 - p;
+	}
+	return n;
+}
+
+function mkhash(mac) {
+	var	macarr = mac.split(/:/);
+  var hash = 0;
+		for (j = 0; j < 6; j++) {
+			hash += parseInt(macarr[j]) * j << j;
+			hash += 11;
+		}
+	if (hash < 0) hash = -hash;
+	return hash;
+}
+
+function wiviz_callback(mhosts, cfgstring) {
+	var nh = '';
+	hosts = mhosts;
+	for (i = 0; i < hosts.length; i++) {
+	  hs = hosts[i];
+	  if (hs.length == 0) break;
+    hs.mac = hs[0];
+    hs.rssi = hs[1];
+    hs.desc = hs[2];
+    hs.descarr = hs.desc.split(/-/)
+    hs.age = hs[3];
+		hs.hash = mkhash(hs.mac);
+    hs.mnem = generate_mnemonic(hs.hash)
+    hs.name = hs.mnem;
+    el = document.getElementById(hs.mnem);
+    if (el) {
+      if (hs.age > erase_timeout) {
+        el.parentNode.removeChild(el);
+        continue;
+      }
+	el.innerHTML = genHTML(hs);
+    }
+    else {
+      if (hs.age > erase_timeout) continue;
+			hs.x = Math.sin(hs.hash / mv) * hs.rssi * 2 - 67;
+			hs.y = Math.cos(hs.hash / mv) * hs.rssi * 2;
+			nh += "<div class='hostdiv' id='" + hs.mnem + "' style='top: ";
+			nh += parseInt(hs.y) + "px; left: " + parseInt(hs.x) + "px'>";
+		  nh += genHTML(hs) + "</div>";
+    }
+	}
+	document.getElementById('content').innerHTML += nh;
+	
+	cfgarr = cfgstring.split(/-/);
+	if (cfgarr[1]) {
+	    if (cfgarr[1] == 'hopping') cfgarr[1] = 'hop';
+	    document.getElementById('channelsel').value = cfgarr[1];
+	    if (cfgarr[1] == 'hop') channelSet();
+	}
+	
+	//repip();
+	setTimeout("declump(); repip();", 250);
+}
+
+function repip() {
+  var nh = "";
+  if (!hosts) return;
+	for (i = 0; i < hosts.length; i++) {
+	  hs = hosts[i];
+	  if (hs.length == 0) break;
+    mac = hs[0];
+    rssi = hs[1];
+    desc = hs[2].split(/-/);
+		if (desc[0] == 'sta' && desc[1] == 'assoc') {
+			bss = desc[2];
+			hs.apmnem = generate_mnemonic(mkhash(bss));
+			ap = document.getElementById(hs.apmnem);
+			sta = document.getElementById(hs.mnem);
+			if (ap && sta) {
+			  x = parseInt(sta.style.left);
+			  y = parseInt(sta.style.top);
+			  dx = parseInt(ap.style.left) - x;
+			  dy = parseInt(ap.style.top) - y;
+			  x += 67;
+			  y += 10;
+			  d = Math.sqrt(dx*dx+dy*dy);
+			  for (j = 0; j < d; j += 15) {
+			    nh += "<img src='"
+					  + ((hs.age < idle_timeout) ? "pip" : "pip-idle")
+					  + (stupid ? ".gif" : ".png")
+						+ "' class='pip' style='top:"
+			      + parseInt(y+dy * j / d) + "; left:"
+			      + parseInt(x+dx * j / d) + "'>";
+			  }
+			}
+		}
+	}
+	document.getElementById('pips').innerHTML = nh;
+}
+
+function declump() {
+	var c = 0;
+	var top = 30000,left = 30000,right = -30000,bottom = -30000;
+	for (i = 0; i < hosts.length; i++) {
+ 	  for (j = 0; j < hosts.length; j++) {
+	    if (i == j) continue;
+			e1 = document.getElementById(hosts[i].mnem);
+			e2 = document.getElementById(hosts[j].mnem);
+			if (!e1 || !e2) continue;
+			x1 = parseInt(e1.style.left);
+			x2 = parseInt(e2.style.left);
+			y1 = parseInt(e1.style.top);
+			y2 = parseInt(e2.style.top);
+			if (x1 < left) left = x1;
+			if (y1 < top) top = y1;
+			if (x1 > right) right = x1;
+			if (y1 > bottom) bottom = y1;
+			ox = x2;
+			oy = y2;
+			dist = Math.sqrt(Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2));
+			if (dist == 0) {
+			    x2 += Math.random() * 5;
+				y2 += Math.random() * 5;
+				dist = 10;
+			}
+			if (dist < 100) {
+				cx = (x1-x2) * 5 / (dist / 3);
+				cy = (y1-y2) * 5 / (dist / 3);
+				x2 -= cx;
+				y2 -= cy;
+				}
+			if (hosts[j].apmnem == hosts[i].mnem
+					|| hosts[i].apmnem == hosts[j].mnem) {
+			  cx = (x1-x2) * 5 / (dist / 3);
+			  cy = (y1-y2) * 5 / (dist / 3);
+				if (dist > 150) {
+				  x2 += cx;
+				  y2 += cy;
+				}
+			}
+			if (Math.abs(ox-x2) > 2 || Math.abs(oy-y2) > 2) {
+				e2.style.left = parseInt(x2);
+				e2.style.top = parseInt(y2);
+				c++;
+			}
+	  }
+	}
+	if (top < bottom && left < right) {
+	  document.getElementById('debug').innerHTML = left + "," + right + "," + top + "," +bottom;
+	  document.getElementById('content').style.left =
+		document.getElementById('pips').style.left =
+			 -(right - left) / 2 - left - 67;
+	  document.getElementById('content').style.top =
+	  document.getElementById('pips').style.top =
+			 -(bottom - top) / 2 - top - 25;
+	}
+	repip();
+	if (c) setTimeout("declump()", 100);
+}
+
+function genHTML(hs) {
+	var nh = '';
+  nh += "<center><img class='icon' src='"
+	a = hs.descarr;
+	if (a[0] == 'ap' || a[0] == 'adhoc') {
+	  if (a[0] == 'ap') {
+			nh += "ap";
+			if (a[5] == 'enc') nh += "-wep";
+	  }
+	  else {
+	    nh += "adhoc";
+	  }
+		hs.channel = a[2];
+		hs.name = a[4];
+	}
+	else if (a[0] == 'sta') {
+		nh += "station";
+		hs.channel = 0;
+	}
+	nh += (hs.age < idle_timeout) ? "": "-idle";
+	nh += stupid ? ".gif" : ".png";
+	nh += "' onmouseover='mousenter(event)' onmouseout='mouseout(event)'"
+		+ "><br><span class='hostdesc'>" + hs.mac + "<br><i>'" + hs.name;
+	nh += "'</i>";
+	if (hs.channel) {
+	  nh += " ch" + hs.channel;
+	}
+	nh += "</span><span class='extrafo'><br>";
+	if (a[0] == 'ap') nh += "Access point";
+	if (a[0] == 'sta') nh += "Station";
+	if (a[0] == 'adhoc') nh += "Logical ad-hoc entity";
+	if (a[0] == 'ap' || a[0] == 'adhoc') {
+		nh += "<br>";
+		if (a[5] == '?enc') nh += "Encryption unknown";
+		if (a[5] == 'enc') nh += "Encrypted";
+		if (a[5] == 'unenc') nh += "Unencrypted";
+		if (a[6] == 'wep') nh += "-WEP";
+		if (a[6] == 'wpa') nh += "-WPA";
+	}
+	nh += "<br>RSSI: " + hs.rssi + " dBm<br>"
+		+ "Seen " + hs.age + " seconds ago<br>";
+ 	nh += "</span></center>";
+	return nh;
+}
diff --git a/package/wiviz/ipkg/wiviz.control b/package/wiviz/ipkg/wiviz.control
new file mode 100644
index 000000000..f90cb7930
--- /dev/null
+++ b/package/wiviz/ipkg/wiviz.control
@@ -0,0 +1,7 @@
+Package: wiviz
+Priority: optional
+Section: net
+Maintainer: Felix Fietkau <openwrt@nbd.name>
+Source: buildroot internal
+Depends: libpcap
+Description: Wireless Network Visualization
diff --git a/package/wiviz/src/Makefile b/package/wiviz/src/Makefile
new file mode 100644
index 000000000..6f230359d
--- /dev/null
+++ b/package/wiviz/src/Makefile
@@ -0,0 +1,25 @@
+## Wi-viz makefile
+# Supply your own C cross-compiler; I recommend the one from the OpenWRT buildroot
+# Also requires a libpcap to link with, use libpcap.a for static, .so for shared
+CC=~/buildroot/staging_dir_mipsel/bin/mipsel-linux-gcc
+LDFLAGS=-L~/buildroot/staging_dir_mipsel/lib
+LIBS=-lpcap
+
+CCOPTS=-O2 -Os -pipe -mips32 -mtune=mips32
+INCLUDE=-I~/buildroot/staging_dir_mipsel/include
+SOURCES=wiviz.c wl_access.c channelhopper.c
+OBJS=wiviz.o wl_access.o channelhopper.o
+TARGET=wiviz
+
+wiviz: ${OBJS}
+	${CC} ${CCOPTS} ${INCLUDE} -o ${TARGET} ${OBJS} ${LDFLAGS} ${LIBS}
+
+wiviz.o: wiviz.c
+	${CC} ${CCOPTS} ${INCLUDE} -c ${SOURCES}
+wl_access.o: wl_access.c
+	${CC} ${CCOPTS} ${INCLUDE} -c ${SOURCES}
+channelhopper.o: channelhopper.c
+	${CC} ${CCOPTS} ${INCLUDE} -c ${SOURCES}
+
+remake:
+	touch wiviz.c wl_access.c channelhopper.c
diff --git a/package/wiviz/src/channelhopper.c b/package/wiviz/src/channelhopper.c
new file mode 100644
index 000000000..0a3e6feb0
--- /dev/null
+++ b/package/wiviz/src/channelhopper.c
@@ -0,0 +1,48 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <stdio.h>
+#include <pcap.h>
+#include <signal.h>
+#include <sys/time.h>
+#include "wl_access.h"
+#include "channelhopper.h"
+#include "structs.h"
+
+void ch_sig_handler(int i) {
+
+  }
+
+void channelHopper(wiviz_cfg * cfg) {
+  int hopPos;
+  int nc;
+
+  //Turn off signal handling from parent process
+  signal(SIGUSR1, &ch_sig_handler);
+  signal(SIGUSR2, &ch_sig_handler);
+
+  //Start hoppin'!
+  hopPos = 0;
+  while (1) {
+    nc = cfg->channelHopSeq[hopPos];
+    hopPos = (hopPos + 1) % cfg->channelHopSeqLen;
+    //Set the channel
+    fprintf(stderr, "It sets the channel to %i\n", nc);
+    wl_ioctl(WL_DEVICE, WLC_SET_CHANNEL, &nc, 4);
+    //Sleep
+    usleep(cfg->channelDwellTime * 1000);
+    }
+  }
diff --git a/package/wiviz/src/channelhopper.h b/package/wiviz/src/channelhopper.h
new file mode 100644
index 000000000..6ab63af08
--- /dev/null
+++ b/package/wiviz/src/channelhopper.h
@@ -0,0 +1,19 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+// Channel hopper definition
+
+void channelHopper();
diff --git a/package/wiviz/src/structs.h b/package/wiviz/src/structs.h
new file mode 100644
index 000000000..10f80f336
--- /dev/null
+++ b/package/wiviz/src/structs.h
@@ -0,0 +1,169 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+//Structure definitions for wireless packets
+
+#define MAX_HOSTS 257
+
+#ifdef DEFINE_TYPES
+typedef unsigned short u_short;
+typedef unsigned char u_char;
+typedef unsigned int u_int;
+#endif
+
+typedef enum {
+  mgt_assocRequest = 0,
+  mgt_assocResponse = 1,
+  mgt_reassocRequest = 2,
+  mgt_reassocResponse = 3,
+  mgt_probeRequest = 4,
+  mgt_probeResponse = 5,
+  mgt_beacon = 8,
+  mgt_disassoc = 10,
+  mgt_auth = 11,
+  mgt_deauth = 12
+  } wifi_frametype;
+
+typedef struct ieee802_11_hdr {
+  u_char frame_control;
+  u_char flags;
+#define IEEE80211_TO_DS 0x01
+#define IEEE80211_FROM_DS 0x02
+#define IEEE80211_MORE_FRAG 0x04
+#define IEEE80211_RETRY 0x08
+#define IEEE80211_PWR_MGT 0x10
+#define IEEE80211_MORE_DATA 0x20
+#define IEEE80211_WEP_FLAG 0x40
+#define IEEE80211_ORDER_FLAG 0x80
+  u_short duration;
+  u_char addr1[6];
+  u_char addr2[6];
+  u_char addr3[6];
+  u_short frag_and_seq;
+  } ieee802_11_hdr;
+
+typedef struct {
+  u_char timestamp[8];
+  u_short bcn_interval;
+  u_short caps;
+#define MGT_CAPS_AP 0x1
+#define MGT_CAPS_IBSS 0x2
+#define MGT_CAPS_WEP 0x10
+  } ieee_802_11_mgt_frame;
+
+typedef struct {
+  u_char tag;
+  u_char length;
+  } ieee_802_11_tag;
+
+typedef enum {
+  tagSSID = 0,
+  tagRates = 1,
+  tagChannel = 3,
+  tagVendorSpecific = 0xDD
+  } i81tag;
+
+typedef struct prism_hdr {
+  u_int msg_code;
+  u_int msg_length;
+  char cap_device[16];
+  //char dids[0];
+  } prism_hdr;
+
+typedef struct prism_did {
+  u_short did;
+  u_short status1;
+  u_short status2;
+  u_short length;
+  //int value[0];
+  } prism_did;
+
+typedef enum prism_did_num {
+  pdn_host_time = 0x1041,
+  pdn_mac_time = 0x2041,
+  pdn_rssi = 0x4041,
+  pdn_sq = 0x5041,
+  pdn_datarate = 0x8041,
+  pdn_framelen = 0xa041
+  } prism_did_num;
+
+
+
+//Structure definitions for data collection
+
+typedef enum {
+  typeUnknown,
+  typeAP,
+  typeSta,
+  typeAdhocHub
+  } host_type;
+
+typedef enum {
+  ssUnknown,
+  ssUnassociated,
+  ssAssociated
+  } sta_state;
+
+typedef enum {
+  aetUnknown,
+  aetUnencrypted,
+  aetEncUnknown,
+  aetEncWEP,
+  aetEncWPA
+  } ap_enc_type;
+
+typedef struct {
+  u_char bssid[6];
+  char * ssid[32];
+  u_char ssidlen;
+  u_char channel;
+  u_short flags;
+  ap_enc_type encryption;
+  } ap_info;
+
+typedef struct {
+  sta_state state;
+  u_char connectedBSSID[6];
+  } sta_info;
+
+typedef struct {
+  u_char occupied;
+  u_char mac[6];
+  host_type type;
+  time_t lastSeen;
+  int RSSI;
+  ap_info * apInfo;
+  sta_info * staInfo;
+  } wiviz_host;
+
+//Primary config struct
+typedef struct {
+  wiviz_host hosts[MAX_HOSTS];
+  int numHosts;
+  int readFromWl;
+  time_t lastKeepAlive;
+  int channelHopping;
+  int channelDwellTime;
+  int channelHopSeq[14];
+  int channelHopSeqLen;
+  int curChannel;
+  int channelHopperPID;
+  } wiviz_cfg;
+
+
+
+
+
diff --git a/package/wiviz/src/wiviz.c b/package/wiviz/src/wiviz.c
new file mode 100644
index 000000000..d2ad9f2ee
--- /dev/null
+++ b/package/wiviz/src/wiviz.c
@@ -0,0 +1,572 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <stdio.h>
+#include <pcap.h>
+#include <signal.h>
+
+#define HOST_TIMEOUT 300
+
+#include "wl_access.h"
+#include "structs.h"
+#include "channelhopper.h"
+
+#ifdef WIN32
+#define OFFLINE
+#endif
+#ifndef __cplusplus
+#define __cdecl
+#endif
+
+#define nonzeromac(x) memcmp(x, "\0\0\0\0\0\0", 6)
+
+void dealWithPacket(wiviz_cfg * cfg, struct pcap_pkthdr * header, const u_char * packet);
+wiviz_host * gotHost(wiviz_cfg * cfg, u_char * mac, host_type type);
+void fprint_mac(FILE * outf, u_char * mac, char * extra);
+void print_mac(u_char * mac, char * extra);
+void print_host(FILE * outf, wiviz_host * host);
+void __cdecl signal_handler(int);
+void readWL(wiviz_cfg * cfg);
+void reloadConfig();
+
+wiviz_cfg * global_cfg;
+
+////////////////////////////////////////////////////////////////////////////////
+int main(int argc, char * * argv) {
+  pcap_t *handle;                        
+  char *dev;                                
+  char errbuf[PCAP_ERRBUF_SIZE]; 
+  int stop = 0;
+  int oldMonitor, newMonitor;
+  struct pcap_pkthdr header;          
+  const u_char *packet;                 
+  wiviz_cfg cfg;
+  int i;
+  int defaultHopSeq[] = { 1, 3, 6, 8, 11 };
+  
+  global_cfg = &cfg;
+  signal(SIGUSR1, &signal_handler);
+  signal(SIGUSR2, &signal_handler);
+
+  fprintf(stderr, "Wi-Viz infogathering daemon by Nathan True\n");
+  
+  memset(&cfg, 0, sizeof(wiviz_cfg));
+  cfg.numHosts = 0;
+  cfg.lastKeepAlive = time(NULL);
+  cfg.channelHopping = 0;
+  cfg.channelDwellTime = 1000;
+  cfg.channelHopSeqLen = 5;
+  memcpy(cfg.channelHopSeq, defaultHopSeq, sizeof(defaultHopSeq));
+
+  wl_ioctl(WL_DEVICE, WLC_GET_MAGIC, &i, 4);
+	if (i != WLC_IOCTL_MAGIC) {
+		fprintf(stderr, "Wireless magic not correct, not querying wl for info\n");
+		cfg.readFromWl = 0;
+	}
+	else {
+	  cfg.readFromWl = 1;
+	  wl_ioctl(WL_DEVICE, WLC_GET_MONITOR, &oldMonitor, 4);
+	  newMonitor = 1;
+	  wl_ioctl(WL_DEVICE, WLC_SET_MONITOR, &newMonitor, 4);
+	}
+
+  reloadConfig();
+
+#ifndef OFFLINE
+  dev = "prism0";
+  handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);
+#else
+  dev = "c:\\cifsroot\\wdump2.pcap";
+  handle = pcap_open_offline(dev, errbuf);
+#endif
+
+	if (cfg.readFromWl) {
+	  readWL(&cfg);
+	}
+
+  if (!handle) {
+    fprintf(stderr, "Failure to open pcap!\nErr=%s\n", errbuf);
+    return -1;
+    }
+  while (!stop) {
+    packet = pcap_next(handle, &header);
+    if (!packet) break;
+    dealWithPacket(&cfg, &header, packet);
+    if (time(NULL) - cfg.lastKeepAlive > 30) stop = 1;
+    }
+
+  signal_handler(SIGUSR1);
+
+  if (cfg.channelHopperPID) kill(cfg.channelHopperPID, SIGKILL);
+
+  for (i = 0; i < MAX_HOSTS; i++) {
+    print_host(stderr, cfg.hosts + i);
+    if (cfg.hosts[i].occupied) printf("\n");
+    if (cfg.hosts[i].apInfo) free(cfg.hosts[i].apInfo);
+    if (cfg.hosts[i].staInfo) free(cfg.hosts[i].staInfo);
+    }
+
+  wl_ioctl(WL_DEVICE, WLC_SET_MONITOR, &oldMonitor, 4);
+
+  pcap_close(handle);
+  return 0;
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void writeJavascript() { 
+  int i;
+  FILE * outf;
+  wiviz_host * h;
+
+  outf = fopen("/tmp/wiviz-pipe", "w");
+  if (!outf) {
+    fprintf(stderr, "Failure to open output file\n");
+    return;
+    }
+
+  global_cfg->lastKeepAlive = time(NULL);
+  
+  if(global_cfg->readFromWl) readWL(global_cfg);
+  
+  fprintf(outf, "top.hosts = new Array(\n");
+  for (i = 0; i < MAX_HOSTS; i++) {
+    h = global_cfg->hosts + i;
+    if (h->occupied == 0) continue;
+    if (time(NULL) - h->lastSeen > HOST_TIMEOUT) {
+      h->occupied = 0;
+      }
+    fprintf(outf, "  new Array(");
+    print_host(outf, h);
+    fprintf(outf, "),\n");
+    }
+  fprintf(outf, "new Array());\n");
+  fprintf(outf, "var cfg_string = 'channel-");
+  if (global_cfg->channelHopping) {
+    fprintf(outf, "hopping");
+    }
+  else {
+    fprintf(outf, "%i", global_cfg->curChannel);
+    }
+  fprintf(outf, "';\ntop.wiviz_callback(top.hosts, cfg_string);\n");
+  fclose(outf);
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void reloadConfig() {
+  FILE * cnf;
+  wiviz_cfg * cfg = global_cfg;
+  char filebuffer[512];
+  char * fbptr, * p, * v, * vv;
+  int fblen, val;
+  int hopCfgChanged = 0;
+  int newHopSeq[12];
+  int newHopSeqLen = 0;
+
+  fprintf(stderr, "Loading config file\n");
+
+  cnf = fopen("/tmp/wiviz-cfg", "r");
+  if (!cnf) {
+    fprintf(stderr, "Wiviz: No config file (/tmp/wiviz-cfg) present, using defaults\n");
+    return;
+    }
+
+  fblen = fread(filebuffer, 1, 512, cnf);
+  fclose(cnf);
+  if (fblen >= 512) {
+    fprintf(stderr, "Error reading config file\n");
+    return;
+    }
+  filebuffer[fblen] = 0;
+  fprintf(stderr, "Read %i bytes from config file\n", fblen);
+
+  fbptr = filebuffer;
+
+  while (fbptr < filebuffer + fblen && *fbptr != 0) {
+    p = fbptr;
+    //Find end of parameter
+    for (; *fbptr != '=' && *fbptr != 0; fbptr++);
+    *fbptr = 0;
+    v = ++fbptr;
+    //Find end of value
+    for (; *fbptr != '&' && *fbptr != 0; fbptr++);
+    *(fbptr++) = 0;
+    fprintf(stderr, "Config: %s=%s\n", p, v);
+    //Apply configuration
+    if (!strcmp(p, "channelsel")) {
+      //Channel selector
+      cfg->channelHopping = 0;
+      if (!strcmp(v, "hop")) {
+        //Set channel hopping
+        cfg->channelHopping = 1;
+        hopCfgChanged = 1;
+        }
+      else if (!strcmp(v, "nochange")) {
+        //Don't change anything, read channel from wireless card
+        readWL(cfg);
+        }
+      else {
+        val = atoi(v);
+        if (val < 1 || val > 14) {
+          fprintf(stderr, "Channel setting in config file invalid (%i)\n", cfg->curChannel);
+        }
+        else {
+          cfg->curChannel = val;
+          if (cfg->readFromWl) {
+            if (wl_ioctl(WL_DEVICE, WLC_SET_CHANNEL, &cfg->curChannel, 4) < 0) {
+              fprintf(stderr, "Channel set to %i failed\n", cfg->curChannel);
+              }
+            }
+          else {
+            fprintf(stderr, "Can't set channel, no Broadcom wireless device present\n");
+            }
+          }
+        }
+      }
+    if (!strcmp(p, "hopdwell")) {
+      val = atoi(v);
+      if (val < 100) val = 100;
+      if (val > 30000) val = 30000;
+      if (cfg->channelDwellTime != val) hopCfgChanged = 1;
+      cfg->channelDwellTime = val;
+      }
+    if (!strcmp(p, "hopseq")) {
+      cfg->channelHopSeqLen = 0;
+      while (v < fbptr) {
+        for (vv = v; *vv != ',' && *vv != 0; vv++);
+        if (*vv == 0) {
+          cfg->channelHopSeq[cfg->channelHopSeqLen++] = atoi(v);
+          break;          
+          }
+        *vv = 0;
+        cfg->channelHopSeq[cfg->channelHopSeqLen++] = atoi(v);
+        v = vv + 1;
+        }
+      }
+    /*
+    if (!strcmp(p, "")) {
+      }
+    */
+    }
+  //Apply channel hopper settings
+  if (cfg->channelHopping == 0 && cfg->channelHopperPID) {
+    kill(cfg->channelHopperPID, SIGKILL);
+    cfg->channelHopperPID = 0;
+    }
+  if (cfg->channelHopping == 1 && hopCfgChanged) {
+    if (cfg->channelHopperPID) kill(cfg->channelHopperPID, SIGKILL);
+    if ((cfg->channelHopperPID = fork()) == 0) {
+      channelHopper(cfg);
+      }
+    }
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void __cdecl signal_handler(int signum) {
+  if (signum == SIGUSR1) writeJavascript();
+  if (signum == SIGUSR2) reloadConfig();
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void dealWithPacket(wiviz_cfg * cfg, struct pcap_pkthdr * header, const u_char * packet) {
+  ieee802_11_hdr * hWifi;
+  prism_hdr * hPrism;
+  wiviz_host * host;
+  wiviz_host * emergebss;
+  host_type type = typeUnknown;
+  int wfType;
+  int rssi = 0;
+  int to_ds, from_ds;
+  prism_did * i;
+  ieee_802_11_tag * e;
+  ieee_802_11_mgt_frame * m;
+  char * src = "\0\0\0\0\0\0";
+  char * dst = "\0\0\0\0\0\0";
+  char * bss = "\0\0\0\0\0\0";
+  char * ssid = "";
+  int channel = 0;
+  int adhocbeacon = 0;
+  u_char ssidlen = 0;
+  ap_enc_type encType = aetUnknown;
+
+  if (!packet) return;
+  if (header->len < sizeof(prism_hdr) + sizeof(ieee802_11_hdr)) return;
+  hPrism = (prism_hdr *) packet;
+  hWifi = (ieee802_11_hdr *) (packet + (hPrism->msg_length));
+
+  //Parse the prism DIDs
+  i = (prism_did *)((char *)hPrism + sizeof(prism_hdr));
+  while ((int)i < (int)hWifi) {
+    if (i->did == pdn_rssi) rssi = *(int *)(i+1);
+    i = (prism_did *) ((int)(i+1) + i->length);
+    }
+
+  //Establish the frame type
+  wfType = ((hWifi->frame_control & 0xF0) >> 4) + ((hWifi->frame_control & 0xC) << 2);
+  switch (wfType) {
+    case mgt_assocRequest:
+    case mgt_reassocRequest:
+    case mgt_probeRequest:
+      type = typeSta;
+      src=hWifi->addr2;
+      dst=hWifi->addr1;
+      break;
+    case mgt_assocResponse:
+    case mgt_reassocResponse:
+    case mgt_probeResponse:
+    case mgt_beacon:
+      src=hWifi->addr2;
+      dst=hWifi->addr1;
+      bss=hWifi->addr3;
+      type = typeAP;
+      break;
+    }
+  to_ds = hWifi->flags & IEEE80211_TO_DS;
+  from_ds = hWifi->flags & IEEE80211_FROM_DS;
+  if ((wfType & 0xF0) == 0x20 && (wfType & 0xF) < 4) {
+    //Data frame
+    src=hWifi->addr2;
+    dst=hWifi->addr1;
+    if (!from_ds) type = typeSta;
+      else type = typeAP;
+    if (!to_ds && !from_ds) bss = hWifi->addr3;
+    if (to_ds && !from_ds) bss = hWifi->addr1;
+    if (!to_ds && from_ds) bss = hWifi->addr2;
+    }
+  if (type == typeUnknown) return;
+
+  //Parse the 802.11 tags
+  if (wfType == mgt_probeResponse || wfType == mgt_beacon) {
+    m = (ieee_802_11_mgt_frame *) (hWifi + 1);
+    if (m->caps & MGT_CAPS_IBSS) {
+      type = typeSta;
+      adhocbeacon = 1;
+      }
+    if (m->caps & MGT_CAPS_WEP) encType = aetEncWEP;
+    else encType = aetUnencrypted;
+    e = (ieee_802_11_tag *) ((int) m + sizeof(ieee_802_11_mgt_frame));
+    while ((u_int)e < (u_int)packet + header->len) {
+      if (e->tag == tagSSID) {
+        ssidlen = e->length;
+        ssid = (char *)(e + 1);
+        }
+      if (e->tag == tagChannel) {
+        channel = *(char *)(e + 1);
+        }
+      if (e->tag == tagVendorSpecific) {
+        if (e->length >= 4 && memcmp(e + 1, "\x00\x50\xf2\x01", 4) == 0) {
+          //WPA encryption
+          encType = aetEncWPA;
+          }
+        }
+      e = (ieee_802_11_tag *) ((int)(e + 1) + e->length);
+      }
+    }
+  
+  //Look up the host in the hash table
+  host = gotHost(cfg, src, type);
+
+  //Add any info we received
+  if (host->RSSI) {
+    host->RSSI = host->RSSI * 9 / 10 + (-rssi * 10);
+    }
+  else {
+    host->RSSI = -rssi * 100;
+    }
+  if (type == typeSta) {
+    if (nonzeromac(bss)) {
+      memcpy(host->staInfo->connectedBSSID, bss, 6);
+      host->staInfo->state = ssAssociated;
+      emergebss = gotHost(cfg, bss, typeAP);
+      if (emergebss->RSSI == 0) emergebss->RSSI = 10000;
+      memcpy(emergebss->apInfo->bssid, bss, 6);
+      if (adhocbeacon) {
+        emergebss->type = typeAdhocHub;
+        if (ssidlen > 0 && ssidlen <= 32) {
+          memcpy(emergebss->apInfo->ssid, ssid, ssidlen);
+          emergebss->apInfo->ssidlen = ssidlen;
+          }
+        if (channel) emergebss->apInfo->channel = channel;
+        emergebss->apInfo->flags = hWifi->flags;
+        emergebss->RSSI = host->RSSI;
+        if (encType != aetUnknown) emergebss->apInfo->encryption = encType;
+        }
+      }
+    if (wfType == mgt_probeRequest && host->staInfo->state == ssUnknown) host->staInfo->state = ssUnassociated;
+    }
+  if (type == typeAP) {
+    if (nonzeromac(bss)) {
+      memcpy(host->apInfo->bssid, bss, 6);
+      }
+    if (ssidlen > 0 && ssidlen <= 32) {
+      memcpy(host->apInfo->ssid, ssid, ssidlen);
+      host->apInfo->ssidlen = ssidlen;
+      }
+    if (channel) host->apInfo->channel = channel;
+    host->apInfo->flags = hWifi->flags;
+    if (encType != aetUnknown) host->apInfo->encryption = encType;
+    }
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void print_mac(u_char * mac, char * extra) {
+  fprint_mac(stdout, mac, extra);
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void fprint_mac(FILE * outf, u_char * mac, char * extra) {
+  fprintf(outf, "%02X:%02X:%02X:%02X:%02X:%02X%s",
+      mac[0] & 0xFF,
+      mac[1] & 0xFF,
+      mac[2] & 0xFF,
+      mac[3] & 0xFF,
+      mac[4] & 0xFF,
+      mac[5] & 0xFF,
+      extra);
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+#define MAX_PROBES MAX_HOSTS/2
+wiviz_host * gotHost(wiviz_cfg * cfg, u_char * mac, host_type type) {
+  int i = (mac[5] + (mac[4] << 8)) % MAX_HOSTS;
+  int c = 0;
+  wiviz_host * h = cfg->hosts + i;
+  while (h->occupied && memcmp(h->mac, mac, 6)) {
+    i++; h++; c++;
+    if (i >= MAX_HOSTS) {
+      i = 0;
+      h = cfg->hosts;
+      }
+    if (c > MAX_PROBES) break;
+    } 
+  if (!h->occupied) {
+    fprintf(stderr, "New host, ");
+    fprint_mac(stderr, mac, ", type=");
+    fprintf(stderr, "%s\n", (type==typeAP) ? "AP" : ((type==typeSta) ? "Sta" : "Unk"));
+    }
+  h->occupied = 1;
+  h->lastSeen = time(NULL);
+  h->type = type;
+  memcpy(h->mac, mac, 6);
+  if (h->type == typeAP && !h->apInfo) {
+    h->apInfo = (ap_info *) malloc(sizeof(ap_info));
+    memset(h->apInfo, 0, sizeof(ap_info));
+    }
+  if (h->type == typeSta && !h->staInfo) {
+    h->staInfo = (sta_info *) malloc(sizeof(sta_info));
+    memset(h->staInfo, 0, sizeof(sta_info));
+    }
+  return h;
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+void print_host(FILE * outf, wiviz_host * host) {
+  int i;
+
+  if (!host->occupied) return;
+  fprintf(outf, "'");
+  fprint_mac(outf, host->mac, "'");
+  fprintf(outf, ", -%i, '", host->RSSI / 100);
+  switch (host->type) {
+    case typeAP:  fprintf(outf, "ap"); break;
+    case typeSta: fprintf(outf, "sta"); break;
+    case typeAdhocHub: fprintf(outf, "adhoc"); break;
+    }
+  if (host->type == typeSta) {
+    switch(host->staInfo->state) {
+      case ssAssociated:
+        fprintf(outf, "-assoc-");
+        fprint_mac(outf, host->staInfo->connectedBSSID, "");
+        break;
+      case ssUnassociated:
+        fprintf(outf, "-unassoc");
+      }
+    }
+  if (host->type == typeAP || host->type == typeAdhocHub) {
+    fprintf(outf, "-channel-%i-ssid-", host->apInfo->channel & 0xFF);
+    for (i = 0; i < host->apInfo->ssidlen; i++) {
+      fprintf(outf, "\\x%02X", *((char *)host->apInfo->ssid + i) & 0xFF);
+    	}
+    switch (host->apInfo->encryption) {
+      case aetUnknown: fprintf(outf, "-?enc-?alg"); break;
+      case aetUnencrypted: fprintf(outf, "-unenc-na"); break;
+      case aetEncUnknown: fprintf(outf, "-enc-unknown"); break;
+      case aetEncWEP: fprintf(outf, "-enc-wep"); break;
+      case aetEncWPA: fprintf(outf, "-enc-wpa"); break;
+      }
+    }
+  fprintf(outf, "', %i", time(0) - host->lastSeen);
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+#define MAX_STA_COUNT 64
+void readWL(wiviz_cfg * cfg) {
+	int ap, i;
+	wiviz_host * host, * sta;
+	uchar mac[6];
+	wlc_ssid_t ssid; 
+	channel_info_t channel;
+	maclist_t * macs;
+  sta_rssi_t starssi;
+	
+	get_mac(WL_DEVICE, mac);
+	printf("AP mac: ");
+	print_mac(mac, "\n");
+	if (!nonzeromac(mac)) return;
+	wl_ioctl(WL_DEVICE, WLC_GET_AP, &ap, 4);
+	if (ap) {
+		host = gotHost(cfg, mac, typeAP);
+		wl_ioctl(WL_DEVICE, WLC_GET_BSSID, host->apInfo->bssid, 6);
+		wl_ioctl(WL_DEVICE, WLC_GET_SSID, &ssid, sizeof(wlc_ssid_t));
+		memcpy(host->apInfo->ssid, ssid.SSID, 32);
+		host->apInfo->ssidlen = ssid.SSID_len;
+		host->RSSI = 0;
+		wl_ioctl(WL_DEVICE, WLC_GET_CHANNEL, &channel, sizeof(channel_info_t));
+		host->apInfo->channel = channel.hw_channel;
+		macs = (maclist_t *) malloc(4 + MAX_STA_COUNT * sizeof(ether_addr_t));
+		macs->count = MAX_STA_COUNT;
+		if (wl_ioctl(WL_DEVICE, WLC_GET_ASSOCLIST, macs, 4 + MAX_STA_COUNT * sizeof(ether_addr_t)) > -1) {
+			for (i = 0; i < macs->count; i++) {
+			  sta = gotHost(cfg, (char *)&macs->ea[i], typeSta);
+        memcpy(starssi.mac, &macs->ea[i], 6);
+        starssi.RSSI = 3000;
+        starssi.zero_ex_forty_one = 0x41;
+				if (wl_ioctl(WL_DEVICE, WLC_GET_RSSI, &starssi, 12) < 0) printf("rssifail\n");
+				sta->RSSI = -starssi.RSSI * 100;
+				sta->staInfo->state = ssAssociated;
+				memcpy(sta->staInfo->connectedBSSID, host->apInfo->bssid, 6);
+			}
+		}
+	}
+	else {
+		host = gotHost(cfg, mac, typeSta);
+		host->RSSI = 0;
+		if (wl_ioctl(WL_DEVICE, WLC_GET_BSSID, &host->staInfo->connectedBSSID, 6) < 0) {
+		  host->staInfo->state = ssUnassociated;
+		}
+		else {
+		  host->staInfo->state = ssAssociated;
+		}
+	}
+  if (wl_ioctl(WL_DEVICE, WLC_GET_CHANNEL, &channel, sizeof(channel_info_t)) >= 0) {
+    cfg->curChannel = channel.hw_channel;
+    fprintf(stderr, "Current channel is %i\n", cfg->curChannel);
+    }
+}
+
+
+
+
+
diff --git a/package/wiviz/src/wl_access.c b/package/wiviz/src/wl_access.c
new file mode 100644
index 000000000..a5172c366
--- /dev/null
+++ b/package/wiviz/src/wl_access.c
@@ -0,0 +1,73 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+
+#include "wl_access.h"
+
+int wl_ioctl(char *name, int cmd, void *buf, int len)
+{
+	struct ifreq ifr;
+	wl_ioctl_t ioc;
+	int ret = 0;
+ 	int s;
+
+	/* open socket to kernel */
+	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+		perror("socket");
+		return errno;
+	}
+
+	/* do it */
+	ioc.cmd = cmd;
+	ioc.buf = buf;
+	ioc.len = len;
+	strncpy(ifr.ifr_name, name, IFNAMSIZ);
+	ifr.ifr_data = (caddr_t) &ioc;
+	ret = ioctl(s, SIOCDEVPRIVATE, &ifr);
+
+	/* cleanup */
+	close(s);
+	return ret;
+}
+
+int get_mac(char *name, void *buf)
+{
+	struct ifreq ifr;
+	int ret = 0;
+ 	int s;
+
+	/* open socket to kernel */
+	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+		perror("socket");
+		return errno;
+	}
+
+	strncpy(ifr.ifr_name, name, IFNAMSIZ);
+	//ifr.ifr_data = (caddr_t) buf;
+	if ((ret = ioctl(s, SIOCGIFHWADDR, &ifr)) < 0)
+			perror(ifr.ifr_name);
+
+	/* cleanup */
+	close(s);
+	memcpy(buf, &ifr.ifr_hwaddr.sa_data, 6);
+	return ret;
+}
diff --git a/package/wiviz/src/wl_access.h b/package/wiviz/src/wl_access.h
new file mode 100644
index 000000000..96f239d9b
--- /dev/null
+++ b/package/wiviz/src/wl_access.h
@@ -0,0 +1,77 @@
+/*
+This file is part of Wi-viz (http://wiviz.natetrue.com).
+
+Wi-viz is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License v2 as published by
+the Free Software Foundation.
+
+Wi-viz is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Wi-viz; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+//wl_access.h - functions for accessing broadcom crap
+
+#define WL_DEVICE "eth1"
+
+typedef unsigned int uint32;
+typedef unsigned char uchar;
+typedef int bool;
+
+typedef struct ether_addr {
+	uchar addr[6];
+} ether_addr_t;
+
+typedef struct wlc_ssid {
+	uint32		SSID_len;
+	uchar		SSID[32];
+} wlc_ssid_t;
+/* For ioctls that take a list of MAC addresses */
+typedef struct maclist {
+	uint count;			/* number of MAC addresses */
+	struct ether_addr ea[1];	/* variable length array of MAC addresses */
+} maclist_t;
+/* Linux network driver ioctl encoding */
+typedef struct wl_ioctl {
+	uint cmd;	/* common ioctl definition */
+	void *buf;	/* pointer to user buffer */
+	uint len;	/* length of user buffer */
+	bool set;	/* get or set request (optional) */
+	uint used;	/* bytes read or written (optional) */
+	uint needed;	/* bytes needed (optional) */
+} wl_ioctl_t;
+/* channel encoding */
+typedef struct channel_info {
+	int hw_channel;
+	int target_channel;
+	int scan_channel;
+} channel_info_t;
+/* RSSI info for sta */
+typedef struct sta_rssi {
+  int RSSI;
+  char mac[6];
+  u_short zero_ex_forty_one;
+  } sta_rssi_t;
+/* check this magic number */
+#define WLC_IOCTL_MAGIC		0x14e46c77
+
+#define WLC_GET_MAGIC				0
+#define WLC_GET_BSSID				23
+#define WLC_SET_BSSID				24
+#define WLC_GET_SSID				25
+#define WLC_SET_SSID				26
+#define WLC_GET_CHANNEL				29
+#define WLC_SET_CHANNEL				30
+#define WLC_GET_MONITOR				107     /* discovered by nbd */
+#define WLC_SET_MONITOR				108     /* discovered by nbd */
+#define WLC_GET_AP				117
+#define WLC_SET_AP				118
+#define WLC_GET_RSSI				127
+#define WLC_GET_ASSOCLIST			159
+
+
+int wl_ioctl(char *name, int cmd, void *buf, int len);
-- 
2.20.1