802.11n can double the channel bandwidth of 802.11g from 20 MHz to 40 MHz, but this operation mode is not recommended in areas that the spectrums are congested and likely interfere with existing WIFI and bluetooth devices. As a result, hostapd will not enable 40 MHz when it finds other channels are being used, like what is seen from the hostapd log below:
1 2 3 4 5 6 7 8 |
nl80211: New scan results available nl80211: Received scan results (16 BSSes) 40 MHz affected channel range: [2397,2447] MHz Neighboring BSS: 1c:fa:68:8e:a6:e0 freq=2412 pri=1 sec=5 Neighboring BSS: e0:05:c5:4c:e2:b6 freq=2427 pri=0 sec=0 Neighboring BSS: b0:48:7a:6a:9d:32 freq=2437 pri=6 sec=10 40 MHz pri/sec mismatch with BSS b0:48:7a:6a:9d:32 <2437,2457> (chan=6+) vs. <2412,2432> 20/40 MHz operation not permitted on channel pri=1 sec=5 based on overlapping BSSes |
However, this is unrealistic in modern cities. You should be grateful the primary channel you choose has not been used already, let alone the additional one for 40 MHz. What can we do? We have to force hostapd to turn on 40 MHz anyway. But since hostapd does not have any configuration options for that, we have to recompile hostapd from source. Actually, this has been done in other distros. For example, OpenWRT and Arch has patched their hostapd with the noscan patch, which adds an option to force 40MHz mode regardless of the environment.
Before turning on 40 MHz, the iwconfig on my laptop is like this, notice the bit rate is only 54 Mb/s:
1 2 3 4 5 6 7 8 |
wlan0 IEEE 802.11abgn ESSID:"bibiworld" Mode:Managed Frequency:2.437 GHz Access Point: C8:3A:35:C9:17:4A Bit Rate=54 Mb/s Tx-Power=15 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:off Link Quality=70/70 Signal level=-32 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:30 Invalid misc:683 Missed beacon:0 |
Now let us start. First you need to add a deb-src source to apt so that we can download source packages. Note that I am still using Raspbian Wheezy. If you use Jessie, change the deb-src line according to your original deb line.
1 2 3 4 5 6 |
pi@raspberrypi $ echo "deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi" \ | sudo tee /etc/apt/sources.list pi@raspberrypi $ sudo apt-get update pi@raspberrypi $ apt-get source hostapd # download source of hostapd pi@raspberrypi $ apt-get build-dep hostapd # download all build dependencies pi@raspberrypi $ cd wpa-1.0 |
Save the following patch into a file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--- wpa-1.0.orig/src/ap/hw_features.c 2012-05-10 05:56:09.000000000 +0800 +++ wpa-1.0/src/ap/hw_features.c 2015-07-18 17:22:37.788215009 +0800 @@ -430,6 +430,7 @@ oper40 = ieee80211n_check_40mhz_2g4(iface, scan_res); wpa_scan_results_free(scan_res); +#if 0 if (!oper40) { wpa_printf(MSG_INFO, "20/40 MHz operation not permitted on " "channel pri=%d sec=%d based on overlapping BSSes", @@ -439,6 +440,12 @@ iface->conf->secondary_channel = 0; iface->conf->ht_capab &= ~HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; } +#endif + wpa_printf(MSG_INFO, "Force 20/40 MHz operation on " + "channel pri=%d sec=%d even there are overlapping BSSes", + iface->conf->channel, + iface->conf->channel + + iface->conf->secondary_channel * 4); res = ieee80211n_allowed_ht40_channel_pair(iface); hostapd_setup_interface_complete(iface, !res); |
1 |
pi@raspberrypi $ patch -p1 < patch.diff |
Because we are going to create a new hostapd package, it’d be a good practice to increment the version number by adding a new section at the top of debian/changelog, like this:
1 2 3 4 5 6 7 8 |
wpa (1.0-3+deb7u3) wheezy; urgency=low * Force 20/40 MHz. -- Anthony Wong <ypwong@gmail.com> Sat, 18 Jul 2015 16:30:43 +0800 wpa (1.0-3+deb7u2) wheezy-security; urgency=high ... |
Now we are ready to compile the packages:
1 |
pi@raspberrypi $ fakeroot debian/rules binary |
If it succeeds, install the new package with dpkg -i
.
Restart hostapd, it should now force 40 MHz mode:
1 2 3 4 5 6 7 8 9 |
nl80211: New scan results available nl80211: Received scan results (23 BSSes) 40 MHz affected channel range: [2397,2447] MHz Neighboring BSS: e0:05:c5:4c:e2:b6 freq=2427 pri=0 sec=0 Neighboring BSS: 00:d0:41:c4:25:31 freq=2437 pri=6 sec=2 40 MHz pri/sec mismatch with BSS 00:d0:41:c4:25:31 <2437,2417> (chan=6-) vs. <2412,2432> Force 20/40 MHz operation on channel pri=1 sec=5 even there are overlapping BSSes HT40: control channel: 1 secondary channel: 5 Completing interface initialization |
And my iwconfig output now shows Bit Rate is 150 Mb/s, yay!
1 2 3 4 5 6 7 8 |
wlan0 IEEE 802.11abgn ESSID:"bibiworld" Mode:Managed Frequency:2.412 GHz Access Point: C8:3A:35:C9:17:4A Bit Rate=150 Mb/s Tx-Power=15 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:off Link Quality=70/70 Signal level=-28 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:31 Invalid misc:330 Missed beacon:0 |