MBO: Add cellular capability to MBO IE
Add cellular capability attribute to MBO IE and add MBO IE with cellular capabilities to Probe Request frames. By default, cellular capability value is set to Not Cellular capable (3). Signed-off-by: David Spinadel <david.spinadel@intel.com>
This commit is contained in:
parent
2d5b8614b7
commit
c5d193d7b3
7 changed files with 49 additions and 2 deletions
|
@ -3561,6 +3561,10 @@ struct wpa_config * wpa_config_alloc_empty(const char *ctrl_interface,
|
||||||
config->cert_in_cb = DEFAULT_CERT_IN_CB;
|
config->cert_in_cb = DEFAULT_CERT_IN_CB;
|
||||||
config->wpa_rsc_relaxation = DEFAULT_WPA_RSC_RELAXATION;
|
config->wpa_rsc_relaxation = DEFAULT_WPA_RSC_RELAXATION;
|
||||||
|
|
||||||
|
#ifdef CONFIG_MBO
|
||||||
|
config->mbo_cell_capa = DEFAULT_MBO_CELL_CAPA;
|
||||||
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
if (ctrl_interface)
|
if (ctrl_interface)
|
||||||
config->ctrl_interface = os_strdup(ctrl_interface);
|
config->ctrl_interface = os_strdup(ctrl_interface);
|
||||||
if (driver_param)
|
if (driver_param)
|
||||||
|
@ -4270,6 +4274,8 @@ static const struct global_parse_data global_fields[] = {
|
||||||
{ STR(sched_scan_plans), CFG_CHANGED_SCHED_SCAN_PLANS },
|
{ STR(sched_scan_plans), CFG_CHANGED_SCHED_SCAN_PLANS },
|
||||||
#ifdef CONFIG_MBO
|
#ifdef CONFIG_MBO
|
||||||
{ STR(non_pref_chan), 0 },
|
{ STR(non_pref_chan), 0 },
|
||||||
|
{ INT_RANGE(mbo_cell_capa, MBO_CELL_CAPA_AVAILABLE,
|
||||||
|
MBO_CELL_CAPA_NOT_SUPPORTED), 0 },
|
||||||
#endif /*CONFIG_MBO */
|
#endif /*CONFIG_MBO */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#define DEFAULT_CERT_IN_CB 1
|
#define DEFAULT_CERT_IN_CB 1
|
||||||
#define DEFAULT_P2P_GO_CTWINDOW 0
|
#define DEFAULT_P2P_GO_CTWINDOW 0
|
||||||
#define DEFAULT_WPA_RSC_RELAXATION 1
|
#define DEFAULT_WPA_RSC_RELAXATION 1
|
||||||
|
#define DEFAULT_MBO_CELL_CAPA MBO_CELL_CAPA_NOT_SUPPORTED
|
||||||
|
|
||||||
#include "config_ssid.h"
|
#include "config_ssid.h"
|
||||||
#include "wps/wps.h"
|
#include "wps/wps.h"
|
||||||
|
@ -1284,6 +1285,11 @@ struct wpa_config {
|
||||||
* Detail is optional.
|
* Detail is optional.
|
||||||
*/
|
*/
|
||||||
char *non_pref_chan;
|
char *non_pref_chan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mbo_cell_capa - Cellular capabilities for MBO
|
||||||
|
*/
|
||||||
|
enum mbo_cellular_capa mbo_cell_capa;
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1331,6 +1331,8 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
|
||||||
#ifdef CONFIG_MBO
|
#ifdef CONFIG_MBO
|
||||||
if (config->non_pref_chan)
|
if (config->non_pref_chan)
|
||||||
fprintf(f, "non_pref_chan=%s\n", config->non_pref_chan);
|
fprintf(f, "non_pref_chan=%s\n", config->non_pref_chan);
|
||||||
|
if (config->mbo_cell_capa != DEFAULT_MBO_CELL_CAPA)
|
||||||
|
fprintf(f, "mbo_cell_capa=%u\n", config->mbo_cell_capa);
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,8 +136,7 @@ int wpas_mbo_ie(struct wpa_supplicant *wpa_s, u8 *buf, size_t len)
|
||||||
struct wpabuf *mbo;
|
struct wpabuf *mbo;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (!wpa_s->non_pref_chan || !wpa_s->non_pref_chan_num ||
|
if (len < MBO_IE_HEADER + 3 + 7)
|
||||||
len < MBO_IE_HEADER + 7)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Leave room for the MBO IE header */
|
/* Leave room for the MBO IE header */
|
||||||
|
@ -148,6 +147,14 @@ int wpas_mbo_ie(struct wpa_supplicant *wpa_s, u8 *buf, size_t len)
|
||||||
/* Add non-preferred channels attribute */
|
/* Add non-preferred channels attribute */
|
||||||
wpas_mbo_non_pref_chan_attrs(wpa_s, mbo, 0);
|
wpas_mbo_non_pref_chan_attrs(wpa_s, mbo, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send cellular capabilities attribute even if AP does not advertise
|
||||||
|
* cellular capabilities.
|
||||||
|
*/
|
||||||
|
wpabuf_put_u8(mbo, MBO_ATTR_ID_CELL_DATA_CAPA);
|
||||||
|
wpabuf_put_u8(mbo, 1);
|
||||||
|
wpabuf_put_u8(mbo, wpa_s->conf->mbo_cell_capa);
|
||||||
|
|
||||||
res = mbo_add_ie(buf, len, wpabuf_head_u8(mbo), wpabuf_len(mbo));
|
res = mbo_add_ie(buf, len, wpabuf_head_u8(mbo), wpabuf_len(mbo));
|
||||||
if (!res)
|
if (!res)
|
||||||
wpa_printf(MSG_ERROR, "Failed to add MBO IE");
|
wpa_printf(MSG_ERROR, "Failed to add MBO IE");
|
||||||
|
@ -330,3 +337,16 @@ fail:
|
||||||
os_free(cmd);
|
os_free(cmd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wpas_mbo_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ie)
|
||||||
|
{
|
||||||
|
wpabuf_put_u8(ie, WLAN_EID_VENDOR_SPECIFIC);
|
||||||
|
wpabuf_put_u8(ie, 7);
|
||||||
|
wpabuf_put_be24(ie, OUI_WFA);
|
||||||
|
wpabuf_put_u8(ie, MBO_OUI_TYPE);
|
||||||
|
|
||||||
|
wpabuf_put_u8(ie, MBO_ATTR_ID_CELL_DATA_CAPA);
|
||||||
|
wpabuf_put_u8(ie, 1);
|
||||||
|
wpabuf_put_u8(ie, wpa_s->conf->mbo_cell_capa);
|
||||||
|
}
|
||||||
|
|
|
@ -490,6 +490,12 @@ static struct wpabuf * wpa_supplicant_extra_ies(struct wpa_supplicant *wpa_s)
|
||||||
wpabuf_put_buf(extra_ie, wpa_s->fst_ies);
|
wpabuf_put_buf(extra_ie, wpa_s->fst_ies);
|
||||||
#endif /* CONFIG_FST */
|
#endif /* CONFIG_FST */
|
||||||
|
|
||||||
|
#ifdef CONFIG_MBO
|
||||||
|
/* Send cellular capabilities for potential MBO STAs */
|
||||||
|
if (wpabuf_resize(&extra_ie, 9) == 0)
|
||||||
|
wpas_mbo_scan_ie(wpa_s, extra_ie);
|
||||||
|
#endif /* CONFIG_MBO */
|
||||||
|
|
||||||
return extra_ie;
|
return extra_ie;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -649,6 +649,12 @@ fast_reauth=1
|
||||||
# Example:
|
# Example:
|
||||||
# non_pref_chan="81:5:10:2:0 81:1:0:2:0 81:9:0:2"
|
# non_pref_chan="81:5:10:2:0 81:1:0:2:0 81:9:0:2"
|
||||||
|
|
||||||
|
# MBO Cellular Data Capabilities
|
||||||
|
# 1 = Cellular data connection available
|
||||||
|
# 2 = Cellular data connection not available
|
||||||
|
# 3 = Not cellular capable (default)
|
||||||
|
#mbo_cell_capa=3
|
||||||
|
|
||||||
# network block
|
# network block
|
||||||
#
|
#
|
||||||
# Each network (usually AP's sharing the same SSID) is configured as a separate
|
# Each network (usually AP's sharing the same SSID) is configured as a separate
|
||||||
|
|
|
@ -1146,6 +1146,7 @@ void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s,
|
||||||
int wpas_mbo_ie(struct wpa_supplicant *wpa_s, u8 *buf, size_t len);
|
int wpas_mbo_ie(struct wpa_supplicant *wpa_s, u8 *buf, size_t len);
|
||||||
int wpas_mbo_update_non_pref_chan(struct wpa_supplicant *wpa_s,
|
int wpas_mbo_update_non_pref_chan(struct wpa_supplicant *wpa_s,
|
||||||
const char *non_pref_chan);
|
const char *non_pref_chan);
|
||||||
|
void wpas_mbo_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ie);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wpa_supplicant_ctrl_iface_ctrl_rsp_handle - Handle a control response
|
* wpa_supplicant_ctrl_iface_ctrl_rsp_handle - Handle a control response
|
||||||
|
|
Loading…
Reference in a new issue