etheriwl: dont let transmit change back receiver settings when in promisc mode, cleanup
This commit is contained in:
parent
194094683a
commit
0243f52bae
2 changed files with 23 additions and 24 deletions
|
@ -327,6 +327,7 @@ struct Ctlr {
|
||||||
int bssnodeid;
|
int bssnodeid;
|
||||||
|
|
||||||
/* current receiver settings */
|
/* current receiver settings */
|
||||||
|
uchar bssid[Eaddrlen];
|
||||||
int channel;
|
int channel;
|
||||||
int prom;
|
int prom;
|
||||||
int aid;
|
int aid;
|
||||||
|
@ -1264,43 +1265,39 @@ void
|
||||||
rxon(Ether *edev, Wnode *bss)
|
rxon(Ether *edev, Wnode *bss)
|
||||||
{
|
{
|
||||||
uchar c[Tcmdsize], *p;
|
uchar c[Tcmdsize], *p;
|
||||||
Ctlr *ctlr;
|
|
||||||
uchar *bssid;
|
|
||||||
int filter, flags;
|
int filter, flags;
|
||||||
|
Ctlr *ctlr;
|
||||||
|
|
||||||
ctlr = edev->ctlr;
|
ctlr = edev->ctlr;
|
||||||
bssid = edev->bcast;
|
|
||||||
filter = FilterMulticast | FilterBeacon;
|
filter = FilterMulticast | FilterBeacon;
|
||||||
if(ctlr->prom)
|
if(ctlr->prom){
|
||||||
filter |= FilterPromisc;
|
filter |= FilterPromisc;
|
||||||
|
bss = nil;
|
||||||
|
}
|
||||||
if(bss != nil){
|
if(bss != nil){
|
||||||
ctlr->channel = bss->channel;
|
ctlr->channel = bss->channel;
|
||||||
if(bss->aid != 0){
|
memmove(ctlr->bssid, bss->bssid, Eaddrlen);
|
||||||
bssid = bss->bssid;
|
ctlr->aid = bss->aid;
|
||||||
|
if(ctlr->aid != 0){
|
||||||
filter |= FilterBSS;
|
filter |= FilterBSS;
|
||||||
filter &= ~FilterBeacon;
|
filter &= ~FilterBeacon;
|
||||||
ctlr->aid = bss->aid;
|
|
||||||
|
|
||||||
ctlr->bssnodeid = -1;
|
ctlr->bssnodeid = -1;
|
||||||
} else {
|
} else
|
||||||
filter &= ~FilterBSS;
|
|
||||||
filter |= FilterBeacon;
|
|
||||||
ctlr->aid = 0;
|
|
||||||
|
|
||||||
ctlr->bcastnodeid = -1;
|
ctlr->bcastnodeid = -1;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
|
memmove(ctlr->bssid, edev->bcast, Eaddrlen);
|
||||||
|
ctlr->aid = 0;
|
||||||
ctlr->bcastnodeid = -1;
|
ctlr->bcastnodeid = -1;
|
||||||
ctlr->bssnodeid = -1;
|
ctlr->bssnodeid = -1;
|
||||||
}
|
}
|
||||||
flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
|
flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
|
||||||
|
|
||||||
if(0) print("rxon: bssid %E, aid %x, channel %d, filter %x, flags %x\n",
|
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));
|
memset(p = c, 0, sizeof(c));
|
||||||
memmove(p, edev->ea, 6); p += 8; /* myaddr */
|
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 */
|
memmove(p, edev->ea, 6); p += 8; /* wlap */
|
||||||
*p++ = 3; /* mode (STA) */
|
*p++ = 3; /* mode (STA) */
|
||||||
*p++ = 0; /* air (?) */
|
*p++ = 0; /* air (?) */
|
||||||
|
@ -1335,6 +1332,7 @@ rxon(Ether *edev, Wnode *bss)
|
||||||
ctlr->bssnodeid = 0;
|
ctlr->bssnodeid = 0;
|
||||||
addnode(ctlr, ctlr->bssnodeid, bss->bssid);
|
addnode(ctlr, ctlr->bssnodeid, bss->bssid);
|
||||||
}
|
}
|
||||||
|
flushcmd(ctlr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ratetab {
|
static struct ratetab {
|
||||||
|
@ -1386,7 +1384,11 @@ transmit(Wifi *wifi, Wnode *wn, Block *b)
|
||||||
ctlr = edev->ctlr;
|
ctlr = edev->ctlr;
|
||||||
|
|
||||||
qlock(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);
|
rxon(edev, wn);
|
||||||
|
|
||||||
rate = 0;
|
rate = 0;
|
||||||
|
@ -1515,10 +1517,7 @@ iwlpromiscuous(void *arg, int on)
|
||||||
ctlr = edev->ctlr;
|
ctlr = edev->ctlr;
|
||||||
qlock(ctlr);
|
qlock(ctlr);
|
||||||
ctlr->prom = on;
|
ctlr->prom = on;
|
||||||
if(ctlr->prom)
|
rxon(edev, ctlr->wifi->bss);
|
||||||
rxon(edev, nil);
|
|
||||||
else
|
|
||||||
rxon(edev, ctlr->wifi->bss);
|
|
||||||
qunlock(ctlr);
|
qunlock(ctlr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -345,7 +345,8 @@ wifietheroq(Wifi *wifi, Block *b)
|
||||||
Wnode *bss;
|
Wnode *bss;
|
||||||
SNAP *s;
|
SNAP *s;
|
||||||
|
|
||||||
if(BLEN(b) < ETHERHDRSIZE){
|
bss = wifi->bss;
|
||||||
|
if(bss == nil || BLEN(b) < ETHERHDRSIZE){
|
||||||
freeb(b);
|
freeb(b);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -357,8 +358,7 @@ wifietheroq(Wifi *wifi, Block *b)
|
||||||
w = (Wifipkt*)b->rp;
|
w = (Wifipkt*)b->rp;
|
||||||
w->fc[0] = 0x08; /* data */
|
w->fc[0] = 0x08; /* data */
|
||||||
w->fc[1] = 0x01; /* STA->AP */
|
w->fc[1] = 0x01; /* STA->AP */
|
||||||
bss = wifi->bss;
|
memmove(w->a1, bss->bssid, Eaddrlen);
|
||||||
memmove(w->a1, bss != nil ? bss->bssid : wifi->ether->bcast, Eaddrlen);
|
|
||||||
memmove(w->a2, e.s, Eaddrlen);
|
memmove(w->a2, e.s, Eaddrlen);
|
||||||
memmove(w->a3, e.d, Eaddrlen);
|
memmove(w->a3, e.d, Eaddrlen);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue