From ff774311807ba9d72e0d92bc8a7eb118beb29346 Mon Sep 17 00:00:00 2001 From: Ben Greear Date: Tue, 19 Mar 2019 14:34:24 -0700 Subject: [PATCH] nl80211: Don't set offchan-OK flag if doing on-channel frame in AP mode I saw a case where the kernel's cfg80211 rejected hostapd's attempt to send a neighbor report response because nl80211 flagged the frame as offchannel-OK, but kernel rejects because channel was 100 (DFS) and so kernel failed thinking it was constrained by DFS/CAC requirements that do not allow the operating channel to be left (at least in FCC). Don't set the packet as off-channel OK if we are transmitting on the current operating channel of an AP to avoid such issues with transmission of Action frames. Signed-off-by: Ben Greear --- src/drivers/driver_nl80211.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 3d63790dd..967a24225 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -7515,10 +7515,14 @@ static int wpa_driver_nl80211_send_action(struct i802_bss *bss, int ret = -1; u8 *buf; struct ieee80211_hdr *hdr; + int offchanok = 1; + + if (is_ap_interface(drv->nlmode) && (int) freq == bss->freq) + offchanok = 0; wpa_printf(MSG_DEBUG, "nl80211: Send Action frame (ifindex=%d, " - "freq=%u MHz wait=%d ms no_cck=%d)", - drv->ifindex, freq, wait_time, no_cck); + "freq=%u MHz wait=%d ms no_cck=%d offchanok=%d)", + drv->ifindex, freq, wait_time, no_cck, offchanok); buf = os_zalloc(24 + data_len); if (buf == NULL) @@ -7544,12 +7548,12 @@ static int wpa_driver_nl80211_send_action(struct i802_bss *bss, (int) freq == bss->freq || drv->device_ap_sme || !drv->use_monitor)) ret = wpa_driver_nl80211_send_mlme(bss, buf, 24 + data_len, - 0, freq, no_cck, 1, + 0, freq, no_cck, offchanok, wait_time, NULL, 0, 0); else ret = nl80211_send_frame_cmd(bss, freq, wait_time, buf, 24 + data_len, - 1, no_cck, 0, 1, NULL, 0); + 1, no_cck, 0, offchanok, NULL, 0); os_free(buf); return ret;