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.