diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-02-16 20:08:27 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-02-16 20:08:27 +0100 |
commit | 3ea0572f4f467f8f0712da7040a3dd163ac2dd0e (patch) | |
tree | f809e1eb90e39c83fcd83a1a4192a5be0183716c /sys | |
parent | c1c644d13c14cfb39eb598658652d4df9d28764b (diff) |
wifi: timestamps in debug print, flush queue on deassoc, shorter roam timeout, timeout in blocked state, fix essid seprint race
- add some milisecond timestamps to the status change debug printing
- flush the packets in the queue on deassoc to avoid processing old pae
packets on next association.
- make roaming timeout shorter (60 -> 20 seconds)
- automatically timeout and restart wpa/pae blocked state
- fix printing race when essid gets changed underneath seprint
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/9/pc/wifi.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/src/9/pc/wifi.c b/sys/src/9/pc/wifi.c index 7cea422f7..f176883fd 100644 --- a/sys/src/9/pc/wifi.c +++ b/sys/src/9/pc/wifi.c @@ -369,9 +369,10 @@ setstatus(Wifi *wifi, Wnode *wn, char *new) old = wn->status; wn->status = new; if(wifi->debug && new != old) - print("#l%d: status %E: %s -> %s (from pc=%#p)\n", + print("#l%d: status %E: %.12ld %.12ld: %s -> %s (from pc=%#p)\n", wifi->ether->ctlrno, wn->bssid, + TK2MS(MACHP(0)->ticks), TK2MS(MACHP(0)->ticks - wn->lastsend), old, new, getcallerpc(&wifi)); } @@ -507,14 +508,16 @@ wifideauth(Wifi *wifi, Wnode *wn) /* notify driver about node aid association */ (*wifi->transmit)(wifi, wn, nil); - /* notify aux/wpa with a zero length write that we got deassociated from the ap */ + /* notify aux/wpa with a zero length packet that we got deassociated from the ap */ ether = wifi->ether; for(i=0; i<ether->nfile; i++){ f = ether->f[i]; if(f == nil || f->in == nil || f->inuse == 0 || f->type != 0x888e) continue; + qflush(f->in); qwrite(f->in, 0, 0); } + qflush(ether->oq); } } @@ -733,13 +736,13 @@ Scan: if(ether->link && (rate = wn->actrate) != nil) ether->mbps = ((*rate & 0x7f)+1)/2; now = MACHP(0)->ticks; - if(wn->status != Sneedauth && TK2SEC(now - wn->lastseen) > 60 || goodbss(wifi, wn) == 0){ + if(wn->status != Sneedauth && TK2SEC(now - wn->lastseen) > 20 || goodbss(wifi, wn) == 0){ wifideauth(wifi, wn); wifi->bss = nil; break; } if(TK2MS(now - wn->lastsend) > 1000){ - if(wn->status == Sauth && (++tmout & 7) == 0) + if((wn->status == Sauth || wn->status == Sblocked) && (++tmout & 7) == 0) wifideauth(wifi, wn); /* stuck in auth, start over */ if(wn->status == Sconn || wn->status == Sunauth) sendauth(wifi, wn); @@ -1019,6 +1022,7 @@ long wifistat(Wifi *wifi, void *buf, long n, ulong off) { static uchar zeros[Eaddrlen]; + char essid[Essidlen+1]; char *s, *p, *e; Wnode *wn; Wkey *k; @@ -1030,7 +1034,9 @@ wifistat(Wifi *wifi, void *buf, long n, ulong off) wn = wifi->bss; if(wn != nil){ - p = seprint(p, e, "essid: %s\n", wn->ssid); + strncpy(essid, wn->ssid, Essidlen); + essid[Essidlen] = 0; + p = seprint(p, e, "essid: %s\n", essid); p = seprint(p, e, "bssid: %E\n", wn->bssid); p = seprint(p, e, "status: %s\n", wn->status); p = seprint(p, e, "channel: %.2d\n", wn->channel); @@ -1064,8 +1070,10 @@ wifistat(Wifi *wifi, void *buf, long n, ulong off) for(wn = wifi->node; wn != &wifi->node[nelem(wifi->node)]; wn++){ if(wn->lastseen == 0) continue; + strncpy(essid, wn->ssid, Essidlen); + essid[Essidlen] = 0; p = seprint(p, e, "node: %E %.4x %-11ld %.2d %s\n", - wn->bssid, wn->cap, TK2MS(now - wn->lastseen), wn->channel, wn->ssid); + wn->bssid, wn->cap, TK2MS(now - wn->lastseen), wn->channel, essid); } n = readstr(off, buf, n, s); free(s); |