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 <greearb@candelatech.com>
This commit is contained in:
parent
91588eeb69
commit
ff77431180
1 changed files with 8 additions and 4 deletions
|
@ -7515,10 +7515,14 @@ static int wpa_driver_nl80211_send_action(struct i802_bss *bss,
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
u8 *buf;
|
u8 *buf;
|
||||||
struct ieee80211_hdr *hdr;
|
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, "
|
wpa_printf(MSG_DEBUG, "nl80211: Send Action frame (ifindex=%d, "
|
||||||
"freq=%u MHz wait=%d ms no_cck=%d)",
|
"freq=%u MHz wait=%d ms no_cck=%d offchanok=%d)",
|
||||||
drv->ifindex, freq, wait_time, no_cck);
|
drv->ifindex, freq, wait_time, no_cck, offchanok);
|
||||||
|
|
||||||
buf = os_zalloc(24 + data_len);
|
buf = os_zalloc(24 + data_len);
|
||||||
if (buf == NULL)
|
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 ||
|
(int) freq == bss->freq || drv->device_ap_sme ||
|
||||||
!drv->use_monitor))
|
!drv->use_monitor))
|
||||||
ret = wpa_driver_nl80211_send_mlme(bss, buf, 24 + data_len,
|
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);
|
wait_time, NULL, 0, 0);
|
||||||
else
|
else
|
||||||
ret = nl80211_send_frame_cmd(bss, freq, wait_time, buf,
|
ret = nl80211_send_frame_cmd(bss, freq, wait_time, buf,
|
||||||
24 + data_len,
|
24 + data_len,
|
||||||
1, no_cck, 0, 1, NULL, 0);
|
1, no_cck, 0, offchanok, NULL, 0);
|
||||||
|
|
||||||
os_free(buf);
|
os_free(buf);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue