ref: 3ea0572f4f467f8f0712da7040a3dd163ac2dd0e
parent: c1c644d13c14cfb39eb598658652d4df9d28764b
author: cinap_lenrek <[email protected]>
date: Thu Feb 16 15:08:27 EST 2017
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
--- a/sys/src/9/pc/wifi.c
+++ b/sys/src/9/pc/wifi.c
@@ -369,9 +369,10 @@
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 @@
/* 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 @@
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 @@
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 @@
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 @@
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);