DPP: Respond to GAS on the same channel it was received on

When I was testing dpp_auth_init on an AP with Enrollee on a different
channel from the AP I was getting failures. This happened on hwsim in
UML with time-travel for me. I don't recall seeing this with real
devices, presumably because of lax offchan implementation.

The DPP authentication would succeed. However the station would then try
to get configuration through a GAS request and fail.

The AP reported the following logs (grepped):

> 1614762426.860212: RX_ACTION category 4 action 10 sa 02:00:00:00:01:00 da 02:00:00:00:00:00 len 227 freq 2412
> 1614762426.860212: wlan0: GAS: GAS Initial Request from 02:00:00:00:01:00 (dialog token 239)
> 1614762426.860233: DPP: Wait for Configuration Result
> 1614762426.860234: nl80211: Send Action frame (ifindex=5, freq=2462 MHz wait=0 ms no_cck=0 offchanok=0)
> 1614762428.861186: DPP: Timeout while waiting for Configuration Result
> 1614762428.861186: wlan0: DPP-CONF-FAILED

While the STA reported the following logs (grepped):

> 1614762426.860193: wlan1: DPP-AUTH-SUCCESS init=0
> 1614762426.860195: DPP: Stop listen on 2412 MHz
> 1614762426.860202: wlan1: GAS-QUERY-START addr=02:00:00:00:00:00 dialog_token=239 freq=2412
> 1614762428.861185: GAS: No response received for query to 02:00:00:00:00:00 dialog token 239
> 1614762428.861189: DPP: GAS query did not succeed
> 1614762428.861189: wlan1: DPP-CONF-FAILED

AP would still receive the GAS request on ch1 but would then try to
respond on ch11 while STA was waiting on ch1.

Signed-off-by: Michal Kazior <michal@plume.com>
This commit is contained in:
Michal Kazior 2021-03-03 09:53:33 +00:00 committed by Jouni Malinen
parent 651c9e9578
commit d9d5e55c54
3 changed files with 8 additions and 7 deletions

View file

@ -3376,7 +3376,7 @@ static void hostapd_dpp_relay_gas_resp_tx(void *ctx, const u8 *addr,
{ {
struct hostapd_data *hapd = ctx; struct hostapd_data *hapd = ctx;
gas_serv_req_dpp_processing(hapd, addr, dialog_token, prot, buf); gas_serv_req_dpp_processing(hapd, addr, dialog_token, prot, buf, 0);
} }
#endif /* CONFIG_DPP2 */ #endif /* CONFIG_DPP2 */

View file

@ -1524,7 +1524,7 @@ static void gas_serv_req_local_processing(struct hostapd_data *hapd,
#ifdef CONFIG_DPP #ifdef CONFIG_DPP
void gas_serv_req_dpp_processing(struct hostapd_data *hapd, void gas_serv_req_dpp_processing(struct hostapd_data *hapd,
const u8 *sa, u8 dialog_token, const u8 *sa, u8 dialog_token,
int prot, struct wpabuf *buf) int prot, struct wpabuf *buf, int freq)
{ {
struct wpabuf *tx_buf; struct wpabuf *tx_buf;
@ -1582,7 +1582,7 @@ void gas_serv_req_dpp_processing(struct hostapd_data *hapd,
return; return;
if (prot) if (prot)
convert_to_protected_dual(tx_buf); convert_to_protected_dual(tx_buf);
hostapd_drv_send_action(hapd, hapd->iface->freq, 0, sa, hostapd_drv_send_action(hapd, freq ? freq : hapd->iface->freq, 0, sa,
wpabuf_head(tx_buf), wpabuf_head(tx_buf),
wpabuf_len(tx_buf)); wpabuf_len(tx_buf));
wpabuf_free(tx_buf); wpabuf_free(tx_buf);
@ -1593,7 +1593,7 @@ void gas_serv_req_dpp_processing(struct hostapd_data *hapd,
static void gas_serv_rx_gas_initial_req(struct hostapd_data *hapd, static void gas_serv_rx_gas_initial_req(struct hostapd_data *hapd,
const u8 *sa, const u8 *sa,
const u8 *data, size_t len, int prot, const u8 *data, size_t len, int prot,
int std_addr3) int std_addr3, int freq)
{ {
const u8 *pos = data; const u8 *pos = data;
const u8 *end = data + len; const u8 *end = data + len;
@ -1688,7 +1688,8 @@ static void gas_serv_rx_gas_initial_req(struct hostapd_data *hapd,
data, len); data, len);
if (!msg) if (!msg)
return; return;
gas_serv_req_dpp_processing(hapd, sa, dialog_token, prot, msg); gas_serv_req_dpp_processing(hapd, sa, dialog_token, prot, msg,
freq);
return; return;
} }
#endif /* CONFIG_DPP */ #endif /* CONFIG_DPP */
@ -1871,7 +1872,7 @@ static void gas_serv_rx_public_action(void *ctx, const u8 *buf, size_t len,
switch (data[0]) { switch (data[0]) {
case WLAN_PA_GAS_INITIAL_REQ: case WLAN_PA_GAS_INITIAL_REQ:
gas_serv_rx_gas_initial_req(hapd, sa, data + 1, len - 1, prot, gas_serv_rx_gas_initial_req(hapd, sa, data + 1, len - 1, prot,
std_addr3); std_addr3, freq);
break; break;
case WLAN_PA_GAS_COMEBACK_REQ: case WLAN_PA_GAS_COMEBACK_REQ:
gas_serv_rx_gas_comeback_req(hapd, sa, data + 1, len - 1, prot, gas_serv_rx_gas_comeback_req(hapd, sa, data + 1, len - 1, prot,

View file

@ -90,6 +90,6 @@ void gas_serv_deinit(struct hostapd_data *hapd);
void gas_serv_req_dpp_processing(struct hostapd_data *hapd, void gas_serv_req_dpp_processing(struct hostapd_data *hapd,
const u8 *sa, u8 dialog_token, const u8 *sa, u8 dialog_token,
int prot, struct wpabuf *buf); int prot, struct wpabuf *buf, int freq);
#endif /* GAS_SERV_H */ #endif /* GAS_SERV_H */