On Sun, Jan 29, 2017 at 07:49:56AM +0200, Timo Myyrä wrote: > Hmm, I've been running the 11n for a while and it seems to be a lot slower > than > 11g for me. Just did quick benchmark using tcpbench between OpenBSD hostAP > (athn) and > laptop (iwn). It looks when my athn is in 11n mode I get around ~3 Mbps:
Which direction did you measure? Client->AP or AP->Client? Have you measured both directions? I expect client->AP to be faster if a non-OpenBSD client is used. Such clients will likely use Tx aggregation. But OpenBSD does not (yet). > Quickly looking it seems the 11g is 3x faster than 11n which seems a bit odd. > I'd assume they should be roughly the same. > > Any idea what could explain the difference? It might be due to RTS/CTS. https://en.wikipedia.org/wiki/IEEE_802.11_RTS/CTS Without TX aggregation, RTS/CTS causes up to 77% overhead on a 20MHz channel and a 1500 byte MTU. See Figure 10 in http://www.nle.com/literature/Airmagnet_impact_of_legacy_devices_on_80211n.pdf Perhaps this overhead is making the difference? You could take a look at what is happening at the wifi frame layer and compare 11n and 11g. To do so, get an iwn(4) device and put it in monitor mode on the same channel, and use tcpdump's -y IEEE802_11_RADIO option. This will show control frames such as rts/cts (but only with iwn(4) because most other drivers unfortunately filter these frames). You'll see RTS/CTS being exchanged for every frame with an OpenBSD 11n hostap. This is because OpenBSD 11n hostap forces "HT protection" on. This forces clients (and the AP) to reserve the medium with an RTS frame before sending a data frame to avoid collisions from legacy 11a/b/g clients. This is the simplest way of being standard compliant in any environment. HT protection could be switched off if only 11n clients exist on the channel (not just on the same AP), and with good commercial APs you'll see this behaviour. But OpenBSD's wifi stack does not yet monitor the channel in a way that allows a decision to be made about turning HT protection off. In any case, this will likely get better once OpenBSD supports Tx aggregation. Then it will send multiple frames after reserving the medium with RTS/CTS and the overhead is reduced. > There are 8 other wireless networks in range but all of those are on > different channels. Are they on overlapping channels? See here for a good illustration: https://en.wikipedia.org/wiki/IEEE_802.11#/media/File:2.4_GHz_Wi-Fi_channels_(802.11b,g_WLAN).svg If no other networks overlap, or all other networks use 11n only, then you don't need HT protection. The crude patch below should disable it and might make 11n and 11g perform equally in your environment. Obviously this patch is not a real fix and I don't intend to commit it. Index: ieee80211_node.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v retrieving revision 1.112 diff -u -p -r1.112 ieee80211_node.c --- ieee80211_node.c 16 Jan 2017 09:35:43 -0000 1.112 +++ ieee80211_node.c 29 Jan 2017 08:37:47 -0000 @@ -364,8 +364,12 @@ ieee80211_create_ibss(struct ieee80211co * beacons from other networks) which proves that only HT * STAs are on the air. */ +#if 0 ni->ni_htop1 = IEEE80211_HTPROT_NONMEMBER; ic->ic_protmode = IEEE80211_PROT_RTSCTS; +#else + ni->ni_htop1 = IEEE80211_HTPROT_NONE; +#endif /* Configure QoS EDCA parameters. */ for (aci = 0; aci < EDCA_NUM_AC; aci++) { @@ -1476,9 +1480,11 @@ ieee80211_node_join_ht(struct ieee80211c /* Update HT protection setting. */ if ((ni->ni_flags & IEEE80211_NODE_HT) == 0) { ic->ic_nonhtsta++; +#if 0 ic->ic_bss->ni_htop1 = IEEE80211_HTPROT_NONHT_MIXED; if (ic->ic_update_htprot) ic->ic_update_htprot(ic, ic->ic_bss); +#endif } } @@ -1776,9 +1782,11 @@ ieee80211_node_leave(struct ieee80211com panic("bogus non-HT station count %d", ic->ic_nonhtsta); if (--ic->ic_nonhtsta == 0) { /* All associated stations now support HT. */ +#if 0 ic->ic_bss->ni_htop1 = IEEE80211_HTPROT_NONMEMBER; if (ic->ic_update_htprot) ic->ic_update_htprot(ic, ic->ic_bss); +#endif } }