WNM: Add candidate list to BSS transition query
Add an option to configure a candidate list to BSS transition query ("list" as the second argument to WNM_BSS_QUERY). The candidate list is built from the available scan results. If no updated scan results (< 10 sec) are available, the command fails. Signed-off-by: David Spinadel <david.spinadel@intel.com> Signed-off-by: Avraham Stern <avraham.stern@intel.com>
This commit is contained in:
parent
84d1c0fd5a
commit
9a493fab73
4 changed files with 27 additions and 10 deletions
|
@ -6724,14 +6724,27 @@ static int wpas_ctrl_iface_wnm_sleep(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
|
|
||||||
static int wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd)
|
static int wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd)
|
||||||
{
|
{
|
||||||
int query_reason;
|
int query_reason, list = 0;
|
||||||
|
|
||||||
query_reason = atoi(cmd);
|
query_reason = atoi(cmd);
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: WNM_BSS_QUERY query_reason=%d",
|
cmd = os_strchr(cmd, ' ');
|
||||||
query_reason);
|
if (cmd) {
|
||||||
|
cmd++;
|
||||||
|
if (os_strncmp(cmd, "list", 4) == 0) {
|
||||||
|
list = 1;
|
||||||
|
} else {
|
||||||
|
wpa_printf(MSG_DEBUG, "WNM Query: Invalid option %s",
|
||||||
|
cmd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"CTRL_IFACE: WNM_BSS_QUERY query_reason=%d%s",
|
||||||
|
query_reason, list ? " candidate list" : "");
|
||||||
|
|
||||||
|
return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_WNM */
|
#endif /* CONFIG_WNM */
|
||||||
|
|
|
@ -1165,16 +1165,17 @@ static void ieee802_11_rx_bss_trans_mgmt_req(struct wpa_supplicant *wpa_s,
|
||||||
|
|
||||||
|
|
||||||
int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
|
int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
|
||||||
u8 query_reason)
|
u8 query_reason, int cand_list)
|
||||||
{
|
{
|
||||||
u8 buf[1000], *pos;
|
u8 buf[2000], *pos;
|
||||||
struct ieee80211_mgmt *mgmt;
|
struct ieee80211_mgmt *mgmt;
|
||||||
size_t len;
|
size_t len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Query to "
|
wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Query to "
|
||||||
MACSTR " query_reason=%u",
|
MACSTR " query_reason=%u%s",
|
||||||
MAC2STR(wpa_s->bssid), query_reason);
|
MAC2STR(wpa_s->bssid), query_reason,
|
||||||
|
cand_list ? " candidate list" : "");
|
||||||
|
|
||||||
mgmt = (struct ieee80211_mgmt *) buf;
|
mgmt = (struct ieee80211_mgmt *) buf;
|
||||||
os_memset(&buf, 0, sizeof(buf));
|
os_memset(&buf, 0, sizeof(buf));
|
||||||
|
@ -1189,6 +1190,9 @@ int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
|
||||||
mgmt->u.action.u.bss_tm_query.query_reason = query_reason;
|
mgmt->u.action.u.bss_tm_query.query_reason = query_reason;
|
||||||
pos = mgmt->u.action.u.bss_tm_query.variable;
|
pos = mgmt->u.action.u.bss_tm_query.variable;
|
||||||
|
|
||||||
|
if (cand_list)
|
||||||
|
pos += wnm_add_cand_list(wpa_s, pos, buf + sizeof(buf) - pos);
|
||||||
|
|
||||||
len = pos - (u8 *) &mgmt->u.action.category;
|
len = pos - (u8 *) &mgmt->u.action.category;
|
||||||
|
|
||||||
ret = wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
|
ret = wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
|
||||||
|
|
|
@ -56,7 +56,7 @@ void ieee802_11_rx_wnm_action(struct wpa_supplicant *wpa_s,
|
||||||
const struct ieee80211_mgmt *mgmt, size_t len);
|
const struct ieee80211_mgmt *mgmt, size_t len);
|
||||||
|
|
||||||
int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
|
int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
|
||||||
u8 query_reason);
|
u8 query_reason, int cand_list);
|
||||||
void wnm_deallocate_memory(struct wpa_supplicant *wpa_s);
|
void wnm_deallocate_memory(struct wpa_supplicant *wpa_s);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3418,7 +3418,7 @@ static const struct wpa_cli_cmd wpa_cli_commands[] = {
|
||||||
{ "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
|
{ "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
|
||||||
"<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
|
"<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
|
||||||
{ "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
|
{ "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
|
||||||
"<query reason> = Send BSS Transition Management Query" },
|
"<query reason> [list] = Send BSS Transition Management Query" },
|
||||||
#endif /* CONFIG_WNM */
|
#endif /* CONFIG_WNM */
|
||||||
{ "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
|
{ "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
|
||||||
"<params..> = Sent unprocessed command" },
|
"<params..> = Sent unprocessed command" },
|
||||||
|
|
Loading…
Reference in a new issue