mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-01-18 10:54:03 -05:00
nl80211: Allow driver-based roam to change ESS
This extends NL80211_CMD_ROAM event processing to allow the driver to roam to another ESS (different SSID) when using offloaded BSS selection. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
05121d3564
commit
c41d0840a1
@ -270,5 +270,6 @@ int wpa_driver_nl80211_sched_scan(void *priv,
|
|||||||
int wpa_driver_nl80211_stop_sched_scan(void *priv);
|
int wpa_driver_nl80211_stop_sched_scan(void *priv);
|
||||||
struct wpa_scan_results * wpa_driver_nl80211_get_scan_results(void *priv);
|
struct wpa_scan_results * wpa_driver_nl80211_get_scan_results(void *priv);
|
||||||
void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv);
|
void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv);
|
||||||
|
const u8 * nl80211_get_ie(const u8 *ies, size_t ies_len, u8 ie);
|
||||||
|
|
||||||
#endif /* DRIVER_NL80211_H */
|
#endif /* DRIVER_NL80211_H */
|
||||||
|
@ -271,6 +271,7 @@ static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
|
|||||||
struct nlattr *ptk_kek)
|
struct nlattr *ptk_kek)
|
||||||
{
|
{
|
||||||
union wpa_event_data event;
|
union wpa_event_data event;
|
||||||
|
const u8 *ssid;
|
||||||
u16 status_code;
|
u16 status_code;
|
||||||
|
|
||||||
if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
|
if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
|
||||||
@ -331,6 +332,16 @@ static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
|
|||||||
if (req_ie) {
|
if (req_ie) {
|
||||||
event.assoc_info.req_ies = nla_data(req_ie);
|
event.assoc_info.req_ies = nla_data(req_ie);
|
||||||
event.assoc_info.req_ies_len = nla_len(req_ie);
|
event.assoc_info.req_ies_len = nla_len(req_ie);
|
||||||
|
|
||||||
|
if (cmd == NL80211_CMD_ROAM) {
|
||||||
|
ssid = nl80211_get_ie(event.assoc_info.req_ies,
|
||||||
|
event.assoc_info.req_ies_len,
|
||||||
|
WLAN_EID_SSID);
|
||||||
|
if (ssid && ssid[1] > 0 && ssid[1] <= 32) {
|
||||||
|
drv->ssid_len = ssid[1];
|
||||||
|
os_memcpy(drv->ssid, ssid + 2, ssid[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (resp_ie) {
|
if (resp_ie) {
|
||||||
event.assoc_info.resp_ies = nla_data(resp_ie);
|
event.assoc_info.resp_ies = nla_data(resp_ie);
|
||||||
|
@ -433,7 +433,7 @@ int wpa_driver_nl80211_stop_sched_scan(void *priv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const u8 * nl80211_get_ie(const u8 *ies, size_t ies_len, u8 ie)
|
const u8 * nl80211_get_ie(const u8 *ies, size_t ies_len, u8 ie)
|
||||||
{
|
{
|
||||||
const u8 *end, *pos;
|
const u8 *end, *pos;
|
||||||
|
|
||||||
|
@ -158,11 +158,32 @@ static void wpa_supplicant_update_current_bss(struct wpa_supplicant *wpa_s)
|
|||||||
static int wpa_supplicant_select_config(struct wpa_supplicant *wpa_s)
|
static int wpa_supplicant_select_config(struct wpa_supplicant *wpa_s)
|
||||||
{
|
{
|
||||||
struct wpa_ssid *ssid, *old_ssid;
|
struct wpa_ssid *ssid, *old_ssid;
|
||||||
|
u8 drv_ssid[MAX_SSID_LEN];
|
||||||
|
size_t drv_ssid_len;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (wpa_s->conf->ap_scan == 1 && wpa_s->current_ssid) {
|
if (wpa_s->conf->ap_scan == 1 && wpa_s->current_ssid) {
|
||||||
wpa_supplicant_update_current_bss(wpa_s);
|
wpa_supplicant_update_current_bss(wpa_s);
|
||||||
return 0;
|
|
||||||
|
if (wpa_s->current_ssid->ssid_len == 0)
|
||||||
|
return 0; /* current profile still in use */
|
||||||
|
res = wpa_drv_get_ssid(wpa_s, drv_ssid);
|
||||||
|
if (res < 0) {
|
||||||
|
wpa_msg(wpa_s, MSG_INFO,
|
||||||
|
"Failed to read SSID from driver");
|
||||||
|
return 0; /* try to use current profile */
|
||||||
|
}
|
||||||
|
drv_ssid_len = res;
|
||||||
|
|
||||||
|
if (drv_ssid_len == wpa_s->current_ssid->ssid_len &&
|
||||||
|
os_memcmp(drv_ssid, wpa_s->current_ssid->ssid,
|
||||||
|
drv_ssid_len) == 0)
|
||||||
|
return 0; /* current profile still in use */
|
||||||
|
|
||||||
|
wpa_msg(wpa_s, MSG_DEBUG,
|
||||||
|
"Driver-initiated BSS selection changed the SSID to %s",
|
||||||
|
wpa_ssid_txt(drv_ssid, drv_ssid_len));
|
||||||
|
/* continue selecting a new network profile */
|
||||||
}
|
}
|
||||||
|
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "Select network based on association "
|
wpa_dbg(wpa_s, MSG_DEBUG, "Select network based on association "
|
||||||
|
Loading…
Reference in New Issue
Block a user