ref: 656e22d91f62399d67cd5be0ca88d15abddf2a29
parent: 2e410f6b62a519f3db8adf9a4972d20be2335522
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Wed Feb 13 03:23:54 EST 2013
etheriwl: dont let transmit change back receiver settings when in promisc mode, cleanup
--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -327,6 +327,7 @@
int bssnodeid;
/* current receiver settings */
+ uchar bssid[Eaddrlen];
int channel;
int prom;
int aid;
@@ -1264,32 +1265,28 @@
rxon(Ether *edev, Wnode *bss)
{uchar c[Tcmdsize], *p;
- Ctlr *ctlr;
- uchar *bssid;
int filter, flags;
+ Ctlr *ctlr;
ctlr = edev->ctlr;
- bssid = edev->bcast;
filter = FilterMulticast | FilterBeacon;
- if(ctlr->prom)
+ if(ctlr->prom){filter |= FilterPromisc;
+ bss = nil;
+ }
if(bss != nil){ctlr->channel = bss->channel;
- if(bss->aid != 0){- bssid = bss->bssid;
+ memmove(ctlr->bssid, bss->bssid, Eaddrlen);
+ ctlr->aid = bss->aid;
+ if(ctlr->aid != 0){filter |= FilterBSS;
filter &= ~FilterBeacon;
- ctlr->aid = bss->aid;
-
ctlr->bssnodeid = -1;
- } else {- filter &= ~FilterBSS;
- filter |= FilterBeacon;
- ctlr->aid = 0;
-
+ } else
ctlr->bcastnodeid = -1;
- }
} else {+ memmove(ctlr->bssid, edev->bcast, Eaddrlen);
+ ctlr->aid = 0;
ctlr->bcastnodeid = -1;
ctlr->bssnodeid = -1;
}
@@ -1296,11 +1293,11 @@
flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
if(0) print("rxon: bssid %E, aid %x, channel %d, filter %x, flags %x\n",- bssid, ctlr->aid, ctlr->channel, filter, flags);
+ ctlr->bssid, ctlr->aid, ctlr->channel, filter, flags);
memset(p = c, 0, sizeof(c));
memmove(p, edev->ea, 6); p += 8; /* myaddr */
- memmove(p, bssid, 6); p += 8; /* bssid */
+ memmove(p, ctlr->bssid, 6); p += 8; /* bssid */
memmove(p, edev->ea, 6); p += 8; /* wlap */
*p++ = 3; /* mode (STA) */
*p++ = 0; /* air (?) */
@@ -1335,6 +1332,7 @@
ctlr->bssnodeid = 0;
addnode(ctlr, ctlr->bssnodeid, bss->bssid);
}
+ flushcmd(ctlr);
}
static struct ratetab {@@ -1386,7 +1384,11 @@
ctlr = edev->ctlr;
qlock(ctlr);
- if(wn != nil && (wn->aid != ctlr->aid || wn->channel != ctlr->channel))
+
+ if(ctlr->prom == 0)
+ if(wn->aid != ctlr->aid
+ || wn->channel != ctlr->channel
+ || memcmp(wn->bssid, ctlr->bssid, Eaddrlen) != 0)
rxon(edev, wn);
rate = 0;
@@ -1515,10 +1517,7 @@
ctlr = edev->ctlr;
qlock(ctlr);
ctlr->prom = on;
- if(ctlr->prom)
- rxon(edev, nil);
- else
- rxon(edev, ctlr->wifi->bss);
+ rxon(edev, ctlr->wifi->bss);
qunlock(ctlr);
}
--- a/sys/src/9/pc/wifi.c
+++ b/sys/src/9/pc/wifi.c
@@ -345,7 +345,8 @@
Wnode *bss;
SNAP *s;
- if(BLEN(b) < ETHERHDRSIZE){+ bss = wifi->bss;
+ if(bss == nil || BLEN(b) < ETHERHDRSIZE){freeb(b);
return;
}
@@ -357,8 +358,7 @@
w = (Wifipkt*)b->rp;
w->fc[0] = 0x08; /* data */
w->fc[1] = 0x01; /* STA->AP */
- bss = wifi->bss;
- memmove(w->a1, bss != nil ? bss->bssid : wifi->ether->bcast, Eaddrlen);
+ memmove(w->a1, bss->bssid, Eaddrlen);
memmove(w->a2, e.s, Eaddrlen);
memmove(w->a3, e.d, Eaddrlen);
--
⑨