Refactor channel list update event in wpa_supplicant

Update hardware features for all interfaces inside the loop, don't treat
the calling wpa_s instance specially. Perform the P2P channel list
updates after the hardware features are updated. This will prevent P2P
from relying on stale information.

Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
This commit is contained in:
Arik Nemtsov 2015-07-27 22:24:24 +03:00 committed by Jouni Malinen
parent b130812100
commit 0f4bccdbbe

View file

@ -2998,26 +2998,14 @@ static void wpa_supplicant_update_channel_list(
if (wpa_s->drv_priv == NULL) if (wpa_s->drv_priv == NULL)
return; /* Ignore event during drv initialization */ return; /* Ignore event during drv initialization */
free_hw_features(wpa_s);
wpa_s->hw.modes = wpa_drv_get_hw_feature_data(
wpa_s, &wpa_s->hw.num_modes, &wpa_s->hw.flags);
wpas_p2p_update_channel_list(wpa_s);
/*
* Check other interfaces to see if they share the same radio. If
* so, they get updated with this same hw mode info.
*/
dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant, dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
radio_list) { radio_list) {
if (ifs != wpa_s) {
wpa_printf(MSG_DEBUG, "%s: Updating hw mode", wpa_printf(MSG_DEBUG, "%s: Updating hw mode",
ifs->ifname); ifs->ifname);
free_hw_features(ifs); free_hw_features(ifs);
ifs->hw.modes = wpa_drv_get_hw_feature_data( ifs->hw.modes = wpa_drv_get_hw_feature_data(
ifs, &ifs->hw.num_modes, &ifs->hw.flags); ifs, &ifs->hw.num_modes, &ifs->hw.flags);
} }
}
/* Restart sched_scan with updated channel list */ /* Restart sched_scan with updated channel list */
if (wpa_s->sched_scanning) { if (wpa_s->sched_scanning) {
@ -3026,6 +3014,8 @@ static void wpa_supplicant_update_channel_list(
wpa_supplicant_cancel_sched_scan(wpa_s); wpa_supplicant_cancel_sched_scan(wpa_s);
wpa_supplicant_req_scan(wpa_s, 0, 0); wpa_supplicant_req_scan(wpa_s, 0, 0);
} }
wpas_p2p_update_channel_list(wpa_s);
} }