From 0f4bccdbbe642fc620d2b70f60c8ddc4ad09a5db Mon Sep 17 00:00:00 2001 From: Arik Nemtsov Date: Mon, 27 Jul 2015 22:24:24 +0300 Subject: [PATCH] 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 --- wpa_supplicant/events.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 558e97708..8b468101e 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -2998,25 +2998,13 @@ static void wpa_supplicant_update_channel_list( if (wpa_s->drv_priv == NULL) 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, radio_list) { - if (ifs != wpa_s) { - wpa_printf(MSG_DEBUG, "%s: Updating hw mode", - ifs->ifname); - free_hw_features(ifs); - ifs->hw.modes = wpa_drv_get_hw_feature_data( - ifs, &ifs->hw.num_modes, &ifs->hw.flags); - } + wpa_printf(MSG_DEBUG, "%s: Updating hw mode", + ifs->ifname); + free_hw_features(ifs); + ifs->hw.modes = wpa_drv_get_hw_feature_data( + ifs, &ifs->hw.num_modes, &ifs->hw.flags); } /* Restart sched_scan with updated channel list */ @@ -3026,6 +3014,8 @@ static void wpa_supplicant_update_channel_list( wpa_supplicant_cancel_sched_scan(wpa_s); wpa_supplicant_req_scan(wpa_s, 0, 0); } + + wpas_p2p_update_channel_list(wpa_s); }