OpenWrt DFS
Enable DFS for OpenWRT
Aim is to enable DFS for 5GHz wifi band. Until today we found no usable solution to integrade DFS suipport into OpenWRT. Without DFS there is no official 802.11n outdoor channels support.
In the following we will log our approach to (try to) enable DFS.
Compile trunk of OpenWRT
On 2014-01-24 we made SVN checkout of OpenWRT trunk with rev. 39385. All compiled well.
1st Run
Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): Configuration file: /var/run/hostapd-phy0.conf Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): wlan0: IEEE 802.11 Configured channel (112) not found from the channel list of current mode (2) IEEE 802.11a Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): wlan0: IEEE 802.11 Hardware does not support configured channel Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): Could not select hw_mode and channel. (-3) Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): wlan0: Unable to setup interface. Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): hostapd_free_hapd_data: Interface wlan0 wasn't started Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): cat: can't open '/var/run/wifi-phy0.pid': No such file or directory Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): Command failed: Invalid argument Thu Jan 1 00:08:10 1970 daemon.notice netifd: radio0 (933): Device setup failed: HOSTAPD_START_FAILED
Message "not found from the channel list of current mode" origin:
/trunk/build_dir/target-mips_34kc_uClibc-0.9.33.2/hostapd-wpad-mini/hostapd-20131120/src/ap/hw_features.c:885
Three places in source code can generate this error. Now, find the exact place. Add more debug messages manually.
2nd Run
Again compiles and executed we get error
Thu Jan 1 00:00:49 1970 daemon.warn hostapd: wlan0: IEEE 802.11 debug oni: select_hw_mode
Therefore the reason for this error is
... case HOSTAPD_CHAN_INVALID: default: hostapd_notify_bad_chans(iface); return -3; ...
new method to search for
hostapd_check_chans(iface)
In that method we have
if (iface->conf->channel) { if (hostapd_is_usable_chans(iface)) return HOSTAPD_CHAN_VALID; else return HOSTAPD_CHAN_INVALID; }
Search now for hostapd_is_usable_chans()
static int hostapd_is_usable_chans(struct hostapd_iface *iface) { if (!hostapd_is_usable_chan(iface, iface->conf->channel, 1)) return 0; if (!iface->conf->secondary_channel) return 1; return hostapd_is_usable_chan(iface, iface->conf->channel + iface->conf->secondary_channel * 4, 0); }
There are two possible places to return zero.
Result of next test:
Thu Jan 1 00:00:19 1970 daemon.warn hostapd: wlan0: IEEE 802.11 debug oni: select_hw_mode Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (697): debug oni: test1234 debug oni: if (!hostapd_is_usable_chan(iface, iface->conf->channel, 1))wlan0: IEEE 802.11 Configured channel (112) not found from the channel list of current mode (2) IEEE 802.11a Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (697): wlan0: IEEE 802.11 debug oni: select_hw_mode
Is is the first if clause. Debug this one.
Result:
Thu Jan 1 00:00:18 1970 daemon.warn hostapd: wlan0: IEEE 802.11 debug oni: select_hw_mode Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: test1234debug oni: chan->chan is 36 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 40 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 44 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 48 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 52 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 56 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 60 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 64 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 100 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 104 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 108 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 116 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 120 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 124 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 128 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 132 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 136 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 140 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 149 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 153 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 157 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 161 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: chan->chan is 165 and channel is 112 Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): debug oni: is_usable_chan now returns 0debug oni: if (!hostapd_is_usable_chan(iface, iface->conf->channel, 1))wlan0: IEEE 802.11 Configured channel (112) not found from the channel list of current mode (2) IEEE 802.11a Thu Jan 1 00:00:18 1970 daemon.notice netifd: radio0 (689): wlan0: IEEE 802.11 debug oni: select_hw_mode
netifd is searching for channel 112 but does not find it. We are changing the channel for futher tests to 108.
Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: test1234debug oni: chan->chan is 36 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 40 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 44 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 48 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 52 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 56 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 60 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 64 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 100 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 104 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 132 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 136 and channel is 108 Thu Jan 1 00:00:19 1970 daemon.notice netifd: radio0 (696): debug oni: chan->chan is 140 and channel is 108
Again he is not finding the new channel 108.