Refactor wpa_supplicant_need_to_roam()
Pull all the within-ESS roam code out of wpa_supplicant_need_to_roam() and into its own function, wpa_supplicant_need_to_roam_within_ess(). This way, we avoid interleaving several #ifndef's in the original function and wrap the new function in one big #ifndef. This also modularizes the within-ESS roam code and makes it easier to test. Signed-off-by: Matthew Wang <matthewmwang@chromium.org>
This commit is contained in:
parent
2ff5a1fdb1
commit
d6b450e890
2 changed files with 48 additions and 37 deletions
|
@ -1855,52 +1855,18 @@ wpas_get_est_throughput_from_bss_snr(const struct wpa_supplicant *wpa_s,
|
||||||
return wpas_get_est_tpt(wpa_s, ies, ie_len, rate, snr);
|
return wpas_get_est_tpt(wpa_s, ies, ie_len, rate, snr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_NO_ROAMING */
|
|
||||||
|
|
||||||
|
int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s,
|
||||||
static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
struct wpa_bss *current_bss,
|
||||||
struct wpa_bss *selected,
|
struct wpa_bss *selected)
|
||||||
struct wpa_ssid *ssid)
|
|
||||||
{
|
{
|
||||||
struct wpa_bss *current_bss = NULL;
|
|
||||||
#ifndef CONFIG_NO_ROAMING
|
|
||||||
int min_diff, diff;
|
int min_diff, diff;
|
||||||
int to_5ghz;
|
int to_5ghz;
|
||||||
int cur_level;
|
int cur_level;
|
||||||
unsigned int cur_est, sel_est;
|
unsigned int cur_est, sel_est;
|
||||||
struct wpa_signal_info si;
|
struct wpa_signal_info si;
|
||||||
int cur_snr = 0;
|
int cur_snr = 0;
|
||||||
#endif /* CONFIG_NO_ROAMING */
|
|
||||||
|
|
||||||
if (wpa_s->reassociate)
|
|
||||||
return 1; /* explicit request to reassociate */
|
|
||||||
if (wpa_s->wpa_state < WPA_ASSOCIATED)
|
|
||||||
return 1; /* we are not associated; continue */
|
|
||||||
if (wpa_s->current_ssid == NULL)
|
|
||||||
return 1; /* unknown current SSID */
|
|
||||||
if (wpa_s->current_ssid != ssid)
|
|
||||||
return 1; /* different network block */
|
|
||||||
|
|
||||||
if (wpas_driver_bss_selection(wpa_s))
|
|
||||||
return 0; /* Driver-based roaming */
|
|
||||||
|
|
||||||
if (wpa_s->current_ssid->ssid)
|
|
||||||
current_bss = wpa_bss_get(wpa_s, wpa_s->bssid,
|
|
||||||
wpa_s->current_ssid->ssid,
|
|
||||||
wpa_s->current_ssid->ssid_len);
|
|
||||||
if (!current_bss)
|
|
||||||
current_bss = wpa_bss_get_bssid(wpa_s, wpa_s->bssid);
|
|
||||||
|
|
||||||
if (!current_bss)
|
|
||||||
return 1; /* current BSS not seen in scan results */
|
|
||||||
|
|
||||||
if (current_bss == selected)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (selected->last_update_idx > current_bss->last_update_idx)
|
|
||||||
return 1; /* current BSS not seen in the last scan */
|
|
||||||
|
|
||||||
#ifndef CONFIG_NO_ROAMING
|
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "Considering within-ESS reassociation");
|
wpa_dbg(wpa_s, MSG_DEBUG, "Considering within-ESS reassociation");
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "Current BSS: " MACSTR
|
wpa_dbg(wpa_s, MSG_DEBUG, "Current BSS: " MACSTR
|
||||||
" freq=%d level=%d snr=%d est_throughput=%u",
|
" freq=%d level=%d snr=%d est_throughput=%u",
|
||||||
|
@ -2026,6 +1992,48 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
"Allow reassociation due to difference in signal level (%d >= %d)",
|
"Allow reassociation due to difference in signal level (%d >= %d)",
|
||||||
diff, min_diff);
|
diff, min_diff);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_NO_ROAMING */
|
||||||
|
|
||||||
|
|
||||||
|
static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
|
struct wpa_bss *selected,
|
||||||
|
struct wpa_ssid *ssid)
|
||||||
|
{
|
||||||
|
struct wpa_bss *current_bss = NULL;
|
||||||
|
|
||||||
|
if (wpa_s->reassociate)
|
||||||
|
return 1; /* explicit request to reassociate */
|
||||||
|
if (wpa_s->wpa_state < WPA_ASSOCIATED)
|
||||||
|
return 1; /* we are not associated; continue */
|
||||||
|
if (wpa_s->current_ssid == NULL)
|
||||||
|
return 1; /* unknown current SSID */
|
||||||
|
if (wpa_s->current_ssid != ssid)
|
||||||
|
return 1; /* different network block */
|
||||||
|
|
||||||
|
if (wpas_driver_bss_selection(wpa_s))
|
||||||
|
return 0; /* Driver-based roaming */
|
||||||
|
|
||||||
|
if (wpa_s->current_ssid->ssid)
|
||||||
|
current_bss = wpa_bss_get(wpa_s, wpa_s->bssid,
|
||||||
|
wpa_s->current_ssid->ssid,
|
||||||
|
wpa_s->current_ssid->ssid_len);
|
||||||
|
if (!current_bss)
|
||||||
|
current_bss = wpa_bss_get_bssid(wpa_s, wpa_s->bssid);
|
||||||
|
|
||||||
|
if (!current_bss)
|
||||||
|
return 1; /* current BSS not seen in scan results */
|
||||||
|
|
||||||
|
if (current_bss == selected)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (selected->last_update_idx > current_bss->last_update_idx)
|
||||||
|
return 1; /* current BSS not seen in the last scan */
|
||||||
|
|
||||||
|
#ifndef CONFIG_NO_ROAMING
|
||||||
|
return wpa_supplicant_need_to_roam_within_ess(wpa_s, current_bss,
|
||||||
|
selected);
|
||||||
#else /* CONFIG_NO_ROAMING */
|
#else /* CONFIG_NO_ROAMING */
|
||||||
return 0;
|
return 0;
|
||||||
#endif /* CONFIG_NO_ROAMING */
|
#endif /* CONFIG_NO_ROAMING */
|
||||||
|
|
|
@ -1523,6 +1523,9 @@ struct wpa_bss * wpa_supplicant_pick_network(struct wpa_supplicant *wpa_s,
|
||||||
int wpas_temp_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid);
|
int wpas_temp_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid);
|
||||||
void wpa_supplicant_update_channel_list(struct wpa_supplicant *wpa_s,
|
void wpa_supplicant_update_channel_list(struct wpa_supplicant *wpa_s,
|
||||||
struct channel_list_changed *info);
|
struct channel_list_changed *info);
|
||||||
|
int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s,
|
||||||
|
struct wpa_bss *current_bss,
|
||||||
|
struct wpa_bss *seleceted);
|
||||||
|
|
||||||
/* eap_register.c */
|
/* eap_register.c */
|
||||||
int eap_register_methods(void);
|
int eap_register_methods(void);
|
||||||
|
|
Loading…
Reference in a new issue