mac80211: handle drv_add_interface failures properly during reconfig
If any interface fails to be added to the driver in during reconfig, we should remove all the successfully added interfaces and report reconfig failure, so things can be cleaned up properly. Failing to do so can lead to subsequent failures and leave the drivers in a messed up state. Signed-off-by: Luciano Coelho <luciano.coelho@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
be72afe0a4
commit
c8fff3dc72
|
@ -1811,8 +1811,25 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
sdata->vif.type != NL80211_IFTYPE_MONITOR &&
|
||||
ieee80211_sdata_running(sdata))
|
||||
ieee80211_sdata_running(sdata)) {
|
||||
res = drv_add_interface(local, sdata);
|
||||
if (WARN_ON(res))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If adding any of the interfaces failed above, roll back and
|
||||
* report failure.
|
||||
*/
|
||||
if (res) {
|
||||
list_for_each_entry_continue_reverse(sdata, &local->interfaces,
|
||||
list)
|
||||
if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
sdata->vif.type != NL80211_IFTYPE_MONITOR &&
|
||||
ieee80211_sdata_running(sdata))
|
||||
drv_remove_interface(local, sdata);
|
||||
ieee80211_handle_reconfig_failure(local);
|
||||
return res;
|
||||
}
|
||||
|
||||
/* add channel contexts */
|
||||
|
|
Loading…
Reference in New Issue