diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 08623e75b..1a5fe05ce 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -689,6 +689,8 @@ struct wpa_driver_capa { #define WPA_DRIVER_FLAGS_EAPOL_TX_STATUS 0x00010000 /* Driver indicates TX status events for Deauth/Disassoc frames */ #define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS 0x00020000 +/* Driver supports roaming (BSS selection) in firmware */ +#define WPA_DRIVER_FLAGS_BSS_SELECTION 0x00040000 unsigned int flags; int max_scan_ssids; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index eaafae787..6dfad0ac8 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -1688,6 +1688,7 @@ struct wiphy_info_data { int connect_supported; int offchan_tx_supported; int max_remain_on_chan; + int firmware_roam; }; @@ -1811,6 +1812,9 @@ broken_combination: if (tb[NL80211_ATTR_OFFCHANNEL_TX_OK]) info->offchan_tx_supported = 1; + if (tb[NL80211_ATTR_ROAM_SUPPORT]) + info->firmware_roam = 1; + if (tb[NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION]) info->max_remain_on_chan = nla_get_u32(tb[NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION]); @@ -1884,6 +1888,11 @@ static int wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv) drv->capa.flags |= WPA_DRIVER_FLAGS_OFFCHANNEL_TX; } + if (info.firmware_roam) { + wpa_printf(MSG_DEBUG, "nl80211: Using driver-based roaming"); + drv->capa.flags |= WPA_DRIVER_FLAGS_BSS_SELECTION; + } + drv->capa.flags |= WPA_DRIVER_FLAGS_SANE_ERROR_CODES; drv->capa.flags |= WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE; if (info.p2p_supported)