diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-15 19:02:17 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-15 19:02:17 +0200 |
commit | 4cf627a131bb343f2ca0c252658186bcd68dfc5a (patch) | |
tree | 9ceb41f94c2d30da9e2840b62d64d765861bd775 /sys/src/9/pc/wifi.c | |
parent | 2e0fac766c44301086d98910555ba351778cfb52 (diff) |
wpa: automatically pick cipher suits from beacon rsne
Diffstat (limited to 'sys/src/9/pc/wifi.c')
-rw-r--r-- | sys/src/9/pc/wifi.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/sys/src/9/pc/wifi.c b/sys/src/9/pc/wifi.c index 1f0bd73b2..9d17fd249 100644 --- a/sys/src/9/pc/wifi.c +++ b/sys/src/9/pc/wifi.c @@ -280,6 +280,7 @@ recvassoc(Wifi *wifi, Wnode *wn, uchar *d, int len) static void recvbeacon(Wifi *, Wnode *wn, uchar *d, int len) { + static uchar wpa1oui[4] = { 0x00, 0x50, 0xf2, 0x01 }; uchar *e, *x; uchar t, m[256/8]; @@ -304,7 +305,7 @@ recvbeacon(Wifi *, Wnode *wn, uchar *d, int len) m[t/8] |= 1<<(t%8); switch(t){ - case 0: /* SSID */ + case 0x00: /* SSID */ len = 0; while(len < Essidlen && d+len < x && d[len] != 0) len++; @@ -315,10 +316,20 @@ recvbeacon(Wifi *, Wnode *wn, uchar *d, int len) wn->ssid[len] = 0; } break; - case 3: /* DSPARAMS */ + case 0x03: /* DSPARAMS */ if(d != x) wn->channel = d[0]; break; + case 0xdd: /* vendor specific */ + len = x - d; + if(len < sizeof(wpa1oui) || memcmp(d, wpa1oui, sizeof(wpa1oui)) != 0) + break; + /* no break */ + case 0x30: /* RSN information */ + len = x - &d[-2]; + memmove(wn->brsne, &d[-2], len); + wn->brsnelen = len; + break; } } } @@ -655,8 +666,20 @@ wifistat(Wifi *wifi, void *buf, long n, ulong off) p = seprint(p, e, "status: %s\n", wifi->status); p = seprint(p, e, "essid: %s\n", wifi->essid); + wn = wifi->bss; - p = seprint(p, e, "bssid: %E\n", wn != nil ? wn->bssid : zeros); + if(wn != nil){ + p = seprint(p, e, "bssid: %E\n", wn->bssid); + if(wn->brsnelen > 0){ + int i; + + p = seprint(p, e, "brsne: "); + for(i=0; i<wn->brsnelen; i++) + p = seprint(p, e, "%.2X", wn->brsne[i]); + p = seprint(p, e, "\n"); + } + p = seprint(p, e, "channel: %.2d\n", wn->channel); + } now = MACHP(0)->ticks; for(wn = wifi->node; wn != &wifi->node[nelem(wifi->node)]; wn++){ |