summaryrefslogtreecommitdiff
path: root/sys/src/9/pc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-02-13 22:26:38 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2017-02-13 22:26:38 +0100
commit45d01d9c99a423248687fc330ca028f2be4afae1 (patch)
tree0a4aa38e3aa9ff5be6ce27ddd024f2fe828c83c9 /sys/src/9/pc
parent7d4a1e3643caa658ee40271edb0dc9a48fd50b58 (diff)
wifi: handle short preamble and short time slot capabilities
- drivers enable short preamble and sort timeslot depending on the ap beacon capinfo field (bss->cap) - wifi sets short preamble bit in capinfo on association request - wifi sets short timeslot bit when ap advertized it in beacon
Diffstat (limited to 'sys/src/9/pc')
-rw-r--r--sys/src/9/pc/etheriwl.c6
-rw-r--r--sys/src/9/pc/etherrt2860.c8
-rw-r--r--sys/src/9/pc/etherwpi.c6
-rw-r--r--sys/src/9/pc/wifi.c15
4 files changed, 26 insertions, 9 deletions
diff --git a/sys/src/9/pc/etheriwl.c b/sys/src/9/pc/etheriwl.c
index 6bb902e2c..105bb44cc 100644
--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -1845,7 +1845,12 @@ rxon(Ether *edev, Wnode *bss)
ctlr->channel = bss->channel;
bss = nil;
}
+ flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
if(bss != nil){
+ if(bss->cap & (1<<5))
+ flags |= RFlagShPreamble;
+ if(bss->cap & (1<<10))
+ flags |= RFlagShSlot;
ctlr->channel = bss->channel;
memmove(ctlr->bssid, bss->bssid, Eaddrlen);
ctlr->aid = bss->aid;
@@ -1861,7 +1866,6 @@ rxon(Ether *edev, Wnode *bss)
ctlr->bcastnodeid = -1;
ctlr->bssnodeid = -1;
}
- flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
if(ctlr->aid != 0)
setled(ctlr, 2, 0, 1); /* on when associated */
diff --git a/sys/src/9/pc/etherrt2860.c b/sys/src/9/pc/etherrt2860.c
index 7d71d612f..2311611e8 100644
--- a/sys/src/9/pc/etherrt2860.c
+++ b/sys/src/9/pc/etherrt2860.c
@@ -1318,10 +1318,12 @@ rxon(Ether *edev, Wnode *bss)
{
u32int tmp;
Ctlr *ctlr;
+ int cap;
ctlr = edev->ctlr;
if(bss != nil){
+ cap = bss->cap;
ctlr->channel = bss->channel;
memmove(ctlr->bssid, bss->bssid, Eaddrlen);
ctlr->aid = bss->aid;
@@ -1332,6 +1334,7 @@ rxon(Ether *edev, Wnode *bss)
}else
ctlr->bcastnodeid = -1;
}else{
+ cap = 0;
memmove(ctlr->bssid, edev->bcast, Eaddrlen);
ctlr->aid = 0;
ctlr->bcastnodeid = -1;
@@ -1377,14 +1380,13 @@ rxon(Ether *edev, Wnode *bss)
/* update slot */
tmp = csr32r(ctlr, BkoffSlotCfg);
tmp &= ~0xff;
- tmp |= /* (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : */ 20;
+ tmp |= (cap & (1<<10)) ? 9 : 20;
csr32w(ctlr, BkoffSlotCfg, tmp);
/* set TX preamble */
tmp = csr32r(ctlr, AutoRspCfg);
tmp &= ~CckShortEn;
-/* if(sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
- tmp |= CckShortEn; */
+ if(cap & (1<<5)) tmp |= CckShortEn;
csr32w(ctlr, AutoRspCfg, tmp);
/* set basic rates */
diff --git a/sys/src/9/pc/etherwpi.c b/sys/src/9/pc/etherwpi.c
index 4dbc65e6d..1663eb31b 100644
--- a/sys/src/9/pc/etherwpi.c
+++ b/sys/src/9/pc/etherwpi.c
@@ -1304,7 +1304,12 @@ rxon(Ether *edev, Wnode *bss)
ctlr->channel = bss->channel;
bss = nil;
}
+ flags = RFlagTSF | RFlag24Ghz | RFlagAuto;
if(bss != nil){
+ if(bss->cap & (1<<5))
+ flags |= RFlagShPreamble;
+ if(bss->cap & (1<<10))
+ flags |= RFlagShSlot;
ctlr->channel = bss->channel;
memmove(ctlr->bssid, bss->bssid, Eaddrlen);
ctlr->aid = bss->aid;
@@ -1319,7 +1324,6 @@ rxon(Ether *edev, Wnode *bss)
ctlr->bcastnodeid = -1;
ctlr->bssnodeid = -1;
}
- flags = RFlagTSF | RFlag24Ghz | RFlagAuto;
if(ctlr->aid != 0)
setled(ctlr, 2, 0, 1); /* on when associated */
diff --git a/sys/src/9/pc/wifi.c b/sys/src/9/pc/wifi.c
index 8325c0aa7..7cea422f7 100644
--- a/sys/src/9/pc/wifi.c
+++ b/sys/src/9/pc/wifi.c
@@ -320,7 +320,7 @@ sendassoc(Wifi *wifi, Wnode *bss)
Wifipkt *w;
Block *b;
uchar *p;
- int n;
+ int cap, n;
b = allocb(WIFIHDRSIZE + 512);
w = (Wifipkt*)b->wp;
@@ -331,9 +331,16 @@ sendassoc(Wifi *wifi, Wnode *bss)
memmove(w->a3, bss->bssid, Eaddrlen);
b->wp += WIFIHDRSIZE;
p = b->wp;
- *p++ = 1; /* capinfo */
- *p++ = 0;
- *p++ = 16; /* interval */
+
+ /* capinfo */
+ cap = 1; // ESS
+ cap |= (1<<5); // Short Preamble
+ cap |= (1<<10) & bss->cap; // Short Slot Time
+ *p++ = cap;
+ *p++ = cap>>8;
+
+ /* interval */
+ *p++ = 16;
*p++ = 16>>8;
n = strlen(bss->ssid);