From af18604a29f9055eb4575d69a29da9617156aee5 Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Sat, 26 Aug 2006 07:29:39 +0000 Subject: [PATCH] Port wiviz to -ng SVN-Revision: 4675 --- net/wiviz/Makefile | 49 ++ net/wiviz/files/www/cgi-bin/wiviz/get.cgi | 15 + net/wiviz/files/www/cgi-bin/wiviz/set.cgi | 3 + net/wiviz/files/www/wiviz/adhoc-idle.gif | Bin 0 -> 332 bytes net/wiviz/files/www/wiviz/adhoc-idle.png | Bin 0 -> 730 bytes net/wiviz/files/www/wiviz/adhoc.gif | Bin 0 -> 451 bytes net/wiviz/files/www/wiviz/adhoc.png | Bin 0 -> 714 bytes net/wiviz/files/www/wiviz/ap-idle.gif | Bin 0 -> 812 bytes net/wiviz/files/www/wiviz/ap-idle.png | Bin 0 -> 814 bytes net/wiviz/files/www/wiviz/ap-wep-idle.gif | Bin 0 -> 812 bytes net/wiviz/files/www/wiviz/ap-wep-idle.png | Bin 0 -> 814 bytes net/wiviz/files/www/wiviz/ap-wep.gif | Bin 0 -> 1455 bytes net/wiviz/files/www/wiviz/ap-wep.png | Bin 0 -> 1997 bytes net/wiviz/files/www/wiviz/ap.gif | Bin 0 -> 1468 bytes net/wiviz/files/www/wiviz/ap.png | Bin 0 -> 1825 bytes net/wiviz/files/www/wiviz/pip-idle.gif | Bin 0 -> 190 bytes net/wiviz/files/www/wiviz/pip-idle.png | Bin 0 -> 331 bytes net/wiviz/files/www/wiviz/pip.gif | Bin 0 -> 190 bytes net/wiviz/files/www/wiviz/pip.png | Bin 0 -> 323 bytes net/wiviz/files/www/wiviz/station-idle.gif | Bin 0 -> 754 bytes net/wiviz/files/www/wiviz/station-idle.png | Bin 0 -> 1778 bytes net/wiviz/files/www/wiviz/station.gif | Bin 0 -> 929 bytes net/wiviz/files/www/wiviz/station.png | Bin 0 -> 2476 bytes net/wiviz/files/www/wiviz/wiviz.css | 76 +++ net/wiviz/files/www/wiviz/wiviz.html | 81 +++ net/wiviz/files/www/wiviz/wiviz.js | 291 +++++++++++ net/wiviz/src/Makefile | 25 + net/wiviz/src/channelhopper.c | 48 ++ net/wiviz/src/channelhopper.h | 19 + net/wiviz/src/structs.h | 169 ++++++ net/wiviz/src/wiviz.c | 572 +++++++++++++++++++++ net/wiviz/src/wl_access.c | 73 +++ net/wiviz/src/wl_access.h | 77 +++ 33 files changed, 1498 insertions(+) create mode 100644 net/wiviz/Makefile create mode 100755 net/wiviz/files/www/cgi-bin/wiviz/get.cgi create mode 100755 net/wiviz/files/www/cgi-bin/wiviz/set.cgi create mode 100755 net/wiviz/files/www/wiviz/adhoc-idle.gif create mode 100755 net/wiviz/files/www/wiviz/adhoc-idle.png create mode 100755 net/wiviz/files/www/wiviz/adhoc.gif create mode 100755 net/wiviz/files/www/wiviz/adhoc.png create mode 100755 net/wiviz/files/www/wiviz/ap-idle.gif create mode 100755 net/wiviz/files/www/wiviz/ap-idle.png create mode 100755 net/wiviz/files/www/wiviz/ap-wep-idle.gif create mode 100755 net/wiviz/files/www/wiviz/ap-wep-idle.png create mode 100755 net/wiviz/files/www/wiviz/ap-wep.gif create mode 100755 net/wiviz/files/www/wiviz/ap-wep.png create mode 100755 net/wiviz/files/www/wiviz/ap.gif create mode 100755 net/wiviz/files/www/wiviz/ap.png create mode 100755 net/wiviz/files/www/wiviz/pip-idle.gif create mode 100755 net/wiviz/files/www/wiviz/pip-idle.png create mode 100755 net/wiviz/files/www/wiviz/pip.gif create mode 100755 net/wiviz/files/www/wiviz/pip.png create mode 100755 net/wiviz/files/www/wiviz/station-idle.gif create mode 100755 net/wiviz/files/www/wiviz/station-idle.png create mode 100755 net/wiviz/files/www/wiviz/station.gif create mode 100755 net/wiviz/files/www/wiviz/station.png create mode 100755 net/wiviz/files/www/wiviz/wiviz.css create mode 100755 net/wiviz/files/www/wiviz/wiviz.html create mode 100755 net/wiviz/files/www/wiviz/wiviz.js create mode 100644 net/wiviz/src/Makefile create mode 100644 net/wiviz/src/channelhopper.c create mode 100644 net/wiviz/src/channelhopper.h create mode 100644 net/wiviz/src/structs.h create mode 100644 net/wiviz/src/wiviz.c create mode 100644 net/wiviz/src/wl_access.c create mode 100644 net/wiviz/src/wl_access.h diff --git a/net/wiviz/Makefile b/net/wiviz/Makefile new file mode 100644 index 0000000000..e767d0f87d --- /dev/null +++ b/net/wiviz/Makefile @@ -0,0 +1,49 @@ +# +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +# $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 $(INCLUDE_DIR)/package.mk + +define Package/wiviz + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libpcap + TITLE:=Wireless Network Visualization + DESCRIPTION:=Wireless Network Visualization + URL:=http://students.washington.edu/natetrue/wiviz/ +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile +$(call Build/Compile/Default,CC="$(TARGET_CC)" \ + CCOPTS="$(TARGET_CFLAGS)" \ + INCLUDE="-I$(STAGING_DIR)/include -I$(STAGING_DIR)/usr/include" \ + LDFLAGS="-L$(STAGING_DIR)/lib -L$(STAGING_DIR)/usr/lib") +endef + +define Package/wiviz/install + mkdir -p $(1)/usr/sbin + $(CP) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/sbin/ + $(RSTRIP) $(1) + $(CP) ./files/* $(1) + find $(1) -name CVS | xargs rm -rf + find $(1) -name .svn | xargs rm -rf +endef + +$(eval $(call BuildPackage,wiviz)) diff --git a/net/wiviz/files/www/cgi-bin/wiviz/get.cgi b/net/wiviz/files/www/cgi-bin/wiviz/get.cgi new file mode 100755 index 0000000000..161fc75ee1 --- /dev/null +++ b/net/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 &1 & + killall -USR1 wiviz > /dev/null + fi +echo "" diff --git a/net/wiviz/files/www/cgi-bin/wiviz/set.cgi b/net/wiviz/files/www/cgi-bin/wiviz/set.cgi new file mode 100755 index 0000000000..17b47873ae --- /dev/null +++ b/net/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/net/wiviz/files/www/wiviz/adhoc-idle.gif b/net/wiviz/files/www/wiviz/adhoc-idle.gif new file mode 100755 index 0000000000000000000000000000000000000000..05e479f78bed9f924ccdc093afe0ee94158d44ed GIT binary patch literal 332 zcmV-S0ki%`Nk%w1VKM+R0K@hY%Z-IFWY}8JstsRTLJYHejSl z7!#;At4a?Y5U(|{Nfa2iHL8&h91?JWqz@XWSW2~25*!!2l?@Ob9U2wa6&f26&^k{K e6WA5p-EmaIP3h|E?CtLF@bU8V^!4^SApkpU)sKz< literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/adhoc-idle.png b/net/wiviz/files/www/wiviz/adhoc-idle.png new file mode 100755 index 0000000000000000000000000000000000000000..b10b102ec9fc7e6ad2fadb6de7a27e4ca51064ac GIT binary patch literal 730 zcmV<00ww*4P)l&H6vzLsVoa1uW=R$^WlEH;u#}06DnR(!O z-Zzu^OA+Gx{sj?Du(6FC$3d-DOWR=>B97y2ZaO9_V=N>Hf+J?W%Wfyvb!0_>v$>UoBmdR$aRreDn*Pm&(F`DY`b2suk}AYJwXV8D2jIW$;=%9Kk~+6 zv?9#h)X$FNpjxe_eNsw{$KzZggb*O2TEE|S^TuK%gov8@St$jjRN8lce~-mtk;|V> z1WA(A^2TDcwX)3Ta}0;WH03@%KIXEQQsUs?pz!>q3DLxH{MNf-D^kk8X1ZN5O}{fk z`;<72)AXDqNp8QUhyBjPKFf4EO@(-#_dBn>>5AMM+5=c7iYSV3a&l7Gr;(6KrBaHJ zhldBauB*?;zZY_Kbrmu5z{H1A3PK2+pPz%7!=i<{!KdS)NGR=E+)pR<=Xf%T3IJ!RT6glLY(k@onJBgGMqtOV!>pKasyq74Y z&}y|%tyX8u+%ypZ?B}Z6)1`}23Sk&xKA*3Rb6r>0Wp~VMv=W-Ve0;dMx%te@*8rM$ z{qX^-Gu0!a!D?$7vlk(nAPA0#=u`H$BuQpvtboO0u~;k?i^Y!|NnnuV`Cu6Km(xolZBCiL771ZWH!i83~Ub$Of2xwk?KFO zr08Uh)%*)9O1#!at-rCR?DX5J{SP)&_~`kwH#SPy8gMhd{vqYicKZFRk5P#)TmDHG zF(zgUD%5w#mN&V4}hN;6Q85e*+th2Wc%0CWU^cb38UK WI@&E^oOS2K#>L0`6=nndYYhO(uccxD literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/adhoc.png b/net/wiviz/files/www/wiviz/adhoc.png new file mode 100755 index 0000000000000000000000000000000000000000..57db25c28a95ebefeaebb9ffe5c44bd081caf14d GIT binary patch literal 714 zcmV;*0yX`KP)W7!zoT&%kg+*%f7VJ4Bq?RAmq zg&L1Uv=l&NhLT0w2T=)WXMMjX6{yu2km*DJxXIpZy^;6+anaeJ=k@4x+|Q=F{m z&cjHEE7keVjr|VK#2vugq^wTq7~U`&SBgn=&fr`aP67J>_=Fd`YDTahq1tZ0kE{9K@xQ(J~*}iWm_cwL^>1TUsu( zh3u%;1D`Ax62zw(ZdTj3>59}Z@6rc;7?*AiIuh(4m~g!pyHih?v{|19qRhLb^FPK4^ocp*@wpC;oE^{G24 zl?er#s&SBKc{@&WNq*?W$-s;QPsi)0>D$GB>Z#jF9BNV&RN?%e4-miA6{-wunyy5` wl?X|2r8?GqZ%T!_uRx2%VzF2(7K_D*UmNVr>*VI!-v9sr07*qoM6N<$f|Dp!RR910 literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/ap-idle.gif b/net/wiviz/files/www/wiviz/ap-idle.gif new file mode 100755 index 0000000000000000000000000000000000000000..a9296961126dba336d6d7497a0046391ce7bc904 GIT binary patch literal 812 zcmZ?wbhEHbG-5Dfc*ejmefsoi)22;H#N7kwzYS3c6Imk_VrJg zIBD{fsne#WQeCvTU73%Ajg^g)S4do5OLu*%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*Oz%^%yMk5U3~05VL~nE#*T@H+xz7m>Rwb#{3)#v^|v%C2Hg@fMW{&V+~KAOVB$Y2cs(m)5Y literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/ap-idle.png b/net/wiviz/files/www/wiviz/ap-idle.png new file mode 100755 index 0000000000000000000000000000000000000000..a6e6fb3202556994679a960597c983ac8d135397 GIT binary patch literal 814 zcmV+}1JV46P)3`ER47LQ(Iu)V)D2;GiA5r8j7S z43hZQp`l_29*R&wgn}-Em!IL7YoF5)Ao|^*!CvZ%ZaE-kD5*f?-jIk5O7_`<+ zQc6K7)zq=pLP`mxR8z+RxumrQ5uN#X@!o#j8R6D|d#AN-K(y8yFfMl>>)7vDSX`@#3{cT)b4* z^+u|y3T0VtK^G2!#A7rtD~jT$kB?TO-;0Zj4@9)A>l#GVoZe3B zTkZOk5<(zN(?wAfAALQv5;Wf3-TfGiM*C3|y(`NSN~vZ#ts8fvptVMlBuLZrswj$2 zZFp$)K9XhGB@taoDN&Xsq?7=#5%CHku(!8&Pejw3o13p~_1*dnG0*e9wRQ|(OhhNo z%dNFjB3iU{p>leatFBX?=XSMPHP5G~r;H#N7kwzYS3c6Imk_VrJg zIBD{fsne#WQeCvTU73%Ajg^g)S4do5OLu*%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*Oz%^%yMk5U3~05VL~nE#*T@H+xz7m>Rwb#{3)#v^|v%C2Hg@fMW{&V+~KAOVB$Y2cs(m)5Y literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/ap-wep-idle.png b/net/wiviz/files/www/wiviz/ap-wep-idle.png new file mode 100755 index 0000000000000000000000000000000000000000..a6e6fb3202556994679a960597c983ac8d135397 GIT binary patch literal 814 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 literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/ap.gif b/net/wiviz/files/www/wiviz/ap.gif new file mode 100755 index 0000000000000000000000000000000000000000..7eb5b3a6bb5234b9822b2a01e0eddb3169cd1cf4 GIT binary patch literal 1468 zcmeH`c{AI20EfQ_rA0#Psw<&ut!itvW7%yrLC{ub!y0y4x~Z8MmKkx3?FuH5#4(bV zsyf2>MZ|r@vF?&Y4p+sI4pntm)RmZVuBqL=iT!IoZ{V4Ep85FP^LBN6>I|I0ApqbE z03`ss0LTFl0MG(J1puW0&;UpSARGV!I6XZ*IXO8#K0Z1+Iy^i)I5^nf-{0HYQ>j!+ zrE+(7cV}m3dwY9pYio0Jb7Nyep-`-^udl7Gt*)-FtgI|AFE1@EEiNuDEG&Hd_;G%I zer|5={rmT`v$HcZGwuYfDQDkH>3nZfPD|>N9J}A#%>$5NHBDCWM^%U;0>_k_ zUAaZR#`1M~Tqhmt4vorYeOqM}am)C=|uCFLA42Op&GVgEhWgaCZyWG!c{1#~Qe zPu06oPgXzwT{BWc|1MGmGsZ(~c0`a4O-|HMv0(;x7I9Qv=TSUWA8j$=WfYpD660Ma zO+$jL&)>>4eqdohgWuj75W+o?OE9CynYm(1^+&-gq)-u7YWd4;Hq6l5G}g<|5ACmM z@)S~OAvJ0a=Zah$(1DTZ2!Yrr&`V8J9uSyIHwlB5(yg|6A`}H@Y>z`mKjYDjp*R)R zG`w1sZsk`SjD#X8FL6;W{31-cX&3_|Hv7E|t3T%z8s5sZPN?U5o5xJ^GLXTR z;##JX`zHeBy78%&JDxZrL(&tX8hrZgDr-DGB#q!Yvj|rS9rWbvobHSHbJy=#4sBlV zgU@E)z@F?}_3!`U0V59R>-jl(YFYbT?>Tfx#tHQAjuHp8fA&)eK0PTx3|?+x#Y(hd TKk%fN^OAW(mpJt}H2CQswVNTv literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/ap.png b/net/wiviz/files/www/wiviz/ap.png new file mode 100755 index 0000000000000000000000000000000000000000..ccfc86431c5669cdf583f9be708d23b37a5384c9 GIT binary patch literal 1825 zcmV++2j2LJP) z|DJo!J!fEuA>JS)*WcjWlSpQdLeUbEd(1QQ{gr)7XiOrRL9+S%$VlErBKd;%NV3TS z?;f3%hd`1=lH5bGh~z6Iliy8|WEII0NmkLg(IcDu?urM_w^v`1duS{M0<577S8IQhZ4PNF)1iaWPP_)0X{)7{8?iL=ZeZ43Sl!!~zM6$ZeObMwLGi z1LEYl1CUH67cXACn3|iLi%d*R;PrYDLLj9?*LB+MHqB;}Mx#NkR^#s7yR5CPmGk-h zFBGpVA&HSA0u&JZ)#Vkyl9gOC`o)O3;xTemkc5Ha9@!^Ufr>(6_SC6U>AAVNNH`oO z6bdmmHpbZ47^9=3ghC;L!61P^fIuL?*w`3XuU_TSrAyIdGI>kWG&{~R2x9z`5|HSz ztN_G$MX`^pZ?MOKGXEh46v)-F`(Ql>qjKYf2kk{V<<$-lQnD+DS{c?fj}T};lc&yF(HKO_aKBq zAx@k)fyd)94a;&LsPGSK;Z&Fl8wKZgUm{^DmTOmBnIUE=h}fR$cDu3Z>1n#%t}{BF zjx%&!$1n^!oeqX!xSo?zIwKeix{a2U_=1XcJ*)g*0U|&ZEF1e0v0wTZASv%52vr0z zOCcVQCptMf=`!5TPOVmpR;%S)x7%%WU3W;?#0OpmsSlrP$h+ zh~PdFxC(sk4kpaii6M6rfY(`BBFwr^T`6VZ(W6H+ z8V!epJ=8eqN5)PF8yg!{!!Qbf-Au)J->M$eno2rnh@FBDAYvYd1=N&iDlGDQE1M+E z4A<>;)6btjuReSB%n9;-B>ItQwOYJ-^@?`8onBd4u?On!AcU))5zC?;Z zgkM{yr@P@*V*11E!~3ZNOe4=E|4&9Z@T=Q;O^kQ04(6p%)^HddGX?f z%kX|AwzjrdTU(=At!DE1{BCa{De_}7oF#)D}#i+1c4)dwZMh?d?jZ(@8BaFRRVd zEP@DGVwg$gSB^~MI+6?@k>(_6ORg5P`*w({K!pXWNTTEw#b)JM#_Z&7tFLLAHYue{ z00|*PZwg0BnG!-2oQBFh=MBsi-!;_SZWSa6@?_}kQx1gv1?4fb&IbUu{J>sa(=>Vc z@?~denkEl1uUl`DRg&CtzN8Gm;ExYxFs1kz1>Uwk0I26mk86(%s$PxjK$s6HfK}cP zKyQiCtMn$4I3JKe@S~%#^jjduZ6rmoPWhfprDCv0c42mmZx#o}#r_@v+toJ@eC~(B zA?H7gNB$=;By!v^By!v^By!v^By!v^By!v^By!v^By!v^By!yFe?#OOx4X)2eI!jG P00000NkvXXu0mjf4Ax%f literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/pip-idle.gif b/net/wiviz/files/www/wiviz/pip-idle.gif new file mode 100755 index 0000000000000000000000000000000000000000..fa923bdf162888c0df687cfd53cc96ef0b9ba2a4 GIT binary patch literal 190 zcmZ?wbhEHbnkfO%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/net/wiviz/files/www/wiviz/pip-idle.png b/net/wiviz/files/www/wiviz/pip-idle.png new file mode 100755 index 0000000000000000000000000000000000000000..3fe25fe333553b289a11a54d04a9a4c7f5b51e78 GIT binary patch literal 331 zcmV-R0kr;!P)aCk08sqFf1hxm`?9 zNCN$)^XEI~eCHhaC&bZ6lH|@9vl2qQPYK4DjSwRAeg7BWc9Po&AzmEEK}w0%n!2tT z8{7l0rwK`tya5}}^RR6jtu+8?nocK$K@fc1jDG04F0SjMl%gz4@;pD0hhab|6;35R zDy3+ehN`OA@AtDs`@W|v%ZJ$xUDuIi+1bmqZHsN&030Q4&oW0eO@owjdnz!-#Fxms z-43laj^o5I|HJ3ua0siaLP`mMQi`tYST2{VD2hI21pw>y`l%?2*s`qWG4!)oEMnjH dzpqKYia)m{a|fqo=sf@c002ovPDHLkV1lhjlN0~| literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/pip.gif b/net/wiviz/files/www/wiviz/pip.gif new file mode 100755 index 0000000000000000000000000000000000000000..1c566e9aa2d2085ed1c5f71a544fe470c39e19ef GIT binary patch literal 190 zcmZ?wbhEHb-|G|I(2`K(# zVPs&CX3znNf$U^pwSJ)1mm-Gv$S`kff80i(xBdH?_b literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/pip.png b/net/wiviz/files/www/wiviz/pip.png new file mode 100755 index 0000000000000000000000000000000000000000..5c05a737ae4ac87ecadf78df815281fc6663e270 GIT binary patch literal 323 zcmV-J0lfZ+P)(3`2IR2+|(_KcIi$E=$0ys;V_C zfm}mF#zoMUE*Sz|b@SfmocEl2;g6E);F_RqFhfDSCSWk3Aik2`8^CJgE)?YCkPbF2 zGBl4Qlnpk3(>lR5!37ZBbB2QjK!)assF~#}xxB3s{ByQ(ueNY-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@DoOFC=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*;*dN^PBjt4`jmNcj)0F@wmzJq(7tAo&HQD*| z^NY)~<0BhcIM3+1pGh;SvpxOk`9kmeKeC^;2z)jzbmEXJNSIOkq>`nHQ?9|ZzbM4O niK&t8(Dr*3ovbrXDRk9t;GfUD`-)M!z?2M&N1YMCLQ zH`#^W(yqLzvWZr&?aO%M0n-V&Xi}lcbs`~0(~PDI+Y^7uaa`4KLBEYg8qGQHb3R_3 z8Npa%jWyO-V~sV|SYwU#Gm|nZL*;ULPEnLa;E|#z8&b-ulgUg@PU8Fi$eehd$E{npa9wxa zvaCOQp4T6l@qHc62#TUCJC1`8V$^={JP*sVGEo#Qj@&rMK!9h>W^5$LoN9xFN zoCBMS`#-oN)e#UW<$GY+w(XIF9O(a*m5JjY%*@QVA3l6o6hh$p{z$gsY&OfCJ9n@w zi&m?J@B8zXW&PGP&3VhRels&ObHy}G-oAbN{-QokowX{J%3lhF!joJs$Li|pg#q&U zeB5tRN*u?*G)-n_XGx_}_`Xl4(}`dAgSG+eL{U^%6vZ7325use*x0X@uLCKU%X3$* zT-jJySm4Er7hjbXRaGgKN^xl(0Oa%ec=TztT7+SUs;a1}il%8yOiYkUrReo~gkgy1 zd2~9R7&Hh1fcie<#$YhmP!wh7;5K3C7%znQrx2o+PN&Z`Z>7^|3WWm2ViDi>ky7G$ zUJTIfcJY0mow=+0``$0<7Btj$AJq@goDLJckkpSoG-oepb8~Y{PEH>2(QGyef&kz5 zv2FVRZbM30KG7ownwgn#-@SYH0W)hc)I-X#bE8jS{u-b z$L8iH0JU0;?d|Ou&-4Cx=8aXQQu$Y{R?Bs}U8Iyp&Y7l3sZ=7D%dxe!6`wB@3S_g{ zz37L#_*I?Oz0Zq3F8x&-^B*2sXRj=SARr7wW@l$fCO==(>2!GY>J^^nQ7V<<-dkB& zK}xAio@#wxilQt@DW5%l{5Vc!Hk+kXDxvE-j^ptB`Evk-5a_y&=Xq?mex!A8n%2GR zgsIbAoB$xePX>68O{U)LqBgdEmHm&>uRun+^b+wIS5JqrY&QmOp( z@ZrOZs;VTDNmNyh4ePqj_3PJ}o}S)oP7S=@nfSMjq4rM8!13#*-t;K_$zf`03MnO; zrXhsDvaBQ7ab0%@SYBIOJG->@LB6#tYpGVNVcRy2q(M+KL#*O6T>iYUH8+7!%Uwf{{K|+W~2tm8uj<-==*GZ?-7={raCzDCS zFr?S(5d;DK{@#$Q>pF%pJX^4L-y)^NG)->bzKy170P#lB?RM*f!C-0FhGCG)2%_8CW@jZMNyW&G+%u+NV#0j0=YyYF&{-yMp2X+kOAh?=`@`t$z}fiFxF-1zv-!< UzT-5&xc~qF07*qoM6N<$f;oeKE&u=k literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/station.gif b/net/wiviz/files/www/wiviz/station.gif new file mode 100755 index 0000000000000000000000000000000000000000..c8a075f4200ea05bbffbe1ebddfb65ab61c4227e GIT binary patch literal 929 zcmV;S177?`Nk%w1VKM+R0M!5h05kssGx7#ARlatt%f4>P|RGnpJS zj2|<9CNpL!Gg&M%OfNG(VsB|P|Cu)Rl{xE@KiG^$#f40=e^01`2^ASJ`d%mV0E&nPj58EIW01K4+Lxk~uFZF)=fgk3^!Gn<^|eJPZ#lo_!ugid3biF**+l0ssj(tArtk zB%?~2HnOw~1OV0m0k^rlhp$b)sKUh8g=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=FrXoOq4mhF{myi;#Sb^hB_8Dq=veAfdc@07HHQ`u87t8A^b@0cASiz=CV-(N=^_HB`vLU>j7RVFc&7AfSs8SO5VHIqcBe zfwY)dL|r<>;93hW5T-!}7F0mNdCY~j+G;U)w%LIRI>^rqH{`%W4mZruf`lo=_QDIy zHTPN!JKTVRYxYxx)DGyZcu&5W1RcJ$@CGdb|ri=&y84shjD(kF81OWg$ DNjHN2 literal 0 HcmV?d00001 diff --git a/net/wiviz/files/www/wiviz/station.png b/net/wiviz/files/www/wiviz/station.png new file mode 100755 index 0000000000000000000000000000000000000000..8daf8df35abb3d9d3fa957748a0846dafb6e93cf GIT binary patch literal 2476 zcmV;d2~+loP)?{99XTghf$3_ZV-oV zZ!7g+538UgeOLm6Qg_LdVT-Z{>t)w*kjJnf%?%B@t)?40k+7?~N@ovNR4bDI#ctAv zd|xczd+zW2KEL1jo%=f%p6j`u>)Ais$rECX-;e;UDrG;6Y^z@o!o?U0SpbHZ<{kV% z7C48(Cr`zXebpPBCBq#ixz4|sK(dVF{Ihneza%3_LR*f>aGpt)`6F*3xryZBQ}S*X zlDya6tz^5%PxKx424|UMncsF`-g?TOZlet6$uQC0vEFJ!UGJNvHyL4)Wj^UFv;NTA z$hBvuHhjJ#nO zC;J+hEo!XnocH@C;Dauruc#x9x%foS>VEkdoxrRV||A^fkMCMd$esvwu*kSSY)LRHfN|X zj)P8+93prXUDvnHN`{XSm}E$!knCJv@5>g*aS2#K>4Mx;eKWGt=-a%F&6%!eD~$7* zb(wfvLsivuB9S<|u&~gtDV)Jz3P*~54cN)6&5jxk=_YJ56GkFODTJzKRY|S zA^Ly7LGNp@i4Thmb8|UHM@Px$^V86$yKR!k#Wauy63_+#keK`%h!NfuNHUo`;c~gA zcN_i9RN?0g)vo~H^ZCL;hzY|mKI|Iw0e6|i#K4ar(FLopz(4TwGZMQ3ak*UCP$-m0 zr_;NN{#LTcU>NTrgdm^KPXQnH8MZ))a2sT!R(3m|3!v3%O-A1ndIl+&JOsesbv?%ga$JC&*GOmA5<*-b9UVYh(9&saPx$i^b5?B8OPoi(LTf2y7>g<2VEY zfp997>OBc6JlHD)z`&y)mSx@2H0_+<@An@#aDe-^#e|ehR5T9jtTN`+>#iK?oo zs*2C&V_;wakH^F6>MG4<6U(xw)oLA3$8li2FI$mPF0@*$1w~O-9zkx}#tR{?3n9{8 zub0^yrA@Py{pK3>s7B?~*UtB3bgoM9nuV_hs;c5R4$WqhW51#2dDK-DWy&y&ORvBFI>q7@e9lh@g+j#RX*5lvR4Q@#@?`*o5NMi)Wm(*= z+@o@8h{~y>G(G*N=mEgNb~{+F2RZcF8fxJ-FTeaUjYfmT#YKw6BH?hD@$vBvV6|HP z+Sjc>+F4mXbLNa+RaM+>H>#?33~QRk(W6Hh8X8(JP9Io54q_h-BuA)tcJm^U|)qYjyp<5o&2^X-mMZAj;)3`FtLL)2B~&>Y!XMQz#Uu zR;y-v)9H6q-aW|U3IqZK0s+F|@Dl;5s)}J4*tU%jqO)A9)hdNTfpWRrDde5_v!kVz zN~M-{UH5C6hTH8X7!0DS>bA>eGr(%K%H6wniN#_FA#l6h)M~X(J0qo>QWRx+yZ&m| zAjxDh1cY5KS3*kZR}>}9`UiuA*XzaS^RW>U=q!=Vl*{GFWHMca+-Ni|NhzluFXVj# z*-D#00;E+{Mbk8VK3@k`RaJCdCzo6QfM*y6j^k`u$WH}iD+wV6Tdh{Y<#L6klwn0t q60B!34Irg7rIhFP0`OelR{bBXvzd#1Uw6p>0000 + + +Wi-viz wireless network environment visualization + + + + +

OpenWRT Wi-viz network visualization

+
+Status: Monitoring
+ +

+Channel setting: +
+
+
+
+
+
+ + +
+
+
+ + + + + diff --git a/net/wiviz/files/www/wiviz/wiviz.js b/net/wiviz/files/www/wiviz/wiviz.js new file mode 100755 index 0000000000..dc67d8f011 --- /dev/null +++ b/net/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 += "
"; + nh += genHTML(hs) + "
"; + } + } + 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 += ""; + } + } + } + } + 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 += "

" + hs.mac + "
'" + hs.name; + nh += "'"; + if (hs.channel) { + nh += " ch" + hs.channel; + } + nh += "

"; + 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 += "
"; + 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 += "
RSSI: " + hs.rssi + " dBm
" + + "Seen " + hs.age + " seconds ago
"; + nh += "
"; + return nh; +} diff --git a/net/wiviz/src/Makefile b/net/wiviz/src/Makefile new file mode 100644 index 0000000000..6f230359df --- /dev/null +++ b/net/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/net/wiviz/src/channelhopper.c b/net/wiviz/src/channelhopper.c new file mode 100644 index 0000000000..0a3e6feb08 --- /dev/null +++ b/net/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 +#include +#include +#include +#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/net/wiviz/src/channelhopper.h b/net/wiviz/src/channelhopper.h new file mode 100644 index 0000000000..6ab63af088 --- /dev/null +++ b/net/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/net/wiviz/src/structs.h b/net/wiviz/src/structs.h new file mode 100644 index 0000000000..10f80f336e --- /dev/null +++ b/net/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/net/wiviz/src/wiviz.c b/net/wiviz/src/wiviz.c new file mode 100644 index 0000000000..d2ad9f2ee4 --- /dev/null +++ b/net/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 +#include +#include + +#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/net/wiviz/src/wl_access.c b/net/wiviz/src/wl_access.c new file mode 100644 index 0000000000..a5172c3665 --- /dev/null +++ b/net/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 +#include +#include +#include +#include +#include + +#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/net/wiviz/src/wl_access.h b/net/wiviz/src/wl_access.h new file mode 100644 index 0000000000..96f239d9b7 --- /dev/null +++ b/net/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.30.2