[PATCH] dbus: Do not bring down the primary interface when remove the wpa_supplicant created virtual AP interface
Jintao Lin
jintaolin at chromium.org
Tue Dec 6 09:41:58 PST 2022
If use dbus command CreateInterface to create a virtual AP interface,
deleting this interface using dbus command RemoveInterface will also
bring down the primary interface.
wpa_supplicant never uses MBSSID when creating AP interface in
wpa_driver_nl80211_if_add, so it should not go through the MBSSID
tear down procedure in wpa_driver_nl80211_if_remove. The virtual AP
resources init and deinit are well handled in wpa_driver_nl80211_init
and wpa_driver_nl80211_deinit.
Collapse the interface type to WPA_IF_STATION to skip the MBSSID
cleanup procedure. This is inline with ctrl_iface. Add comments before
the code to avoid confusion.
Signed-off-by: Jintao Lin <jintaolin at chromium.org>
---
wpa_supplicant/ctrl_iface.c | 7 ++++++-
wpa_supplicant/dbus/dbus_new_handlers.c | 13 ++++++++-----
wpa_supplicant/wpa_supplicant_i.h | 1 -
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 6e878be96..fd548cecb 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -11906,8 +11906,11 @@ static int wpa_supplicant_global_iface_add(struct wpa_global *global,
return 0;
fail:
- if (create_iface)
+ if (create_iface) {
+ // wpa_supplicant does not create MBSSID AP,
+ // collapse to WPA_IF_STATION to avoid MBSSID clean up in driver.
wpa_drv_if_remove(global->ifaces, WPA_IF_STATION, iface.ifname);
+ }
return -1;
}
@@ -11929,6 +11932,8 @@ static int wpa_supplicant_global_iface_remove(struct wpa_global *global,
if (!ret && delete_iface) {
wpa_printf(MSG_DEBUG, "CTRL_IFACE deleting the interface '%s'",
cmd);
+ // wpa_supplicant does not create MBSSID AP,
+ // collapse to WPA_IF_STATION to avoid MBSSID clean up in driver.
ret = wpa_drv_if_remove(global->ifaces, WPA_IF_STATION, cmd);
}
return ret;
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
index 7afd4006b..6e940b633 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers.c
@@ -856,8 +856,6 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
const char *path = wpa_s->dbus_new_path;
wpa_s->added_vif = create_iface;
- wpa_s->added_vif_type = create_iface? if_type :
- WPA_IF_MAX;
reply = dbus_message_new_method_return(message);
dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
&path, DBUS_TYPE_INVALID);
@@ -865,9 +863,12 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
reply = wpas_dbus_error_unknown_error(
message,
"wpa_supplicant couldn't grab this interface.");
- if (create_iface)
- wpa_drv_if_remove(global->ifaces, if_type,
+ if (create_iface) {
+ // wpa_supplicant does not create MBSSID AP, collapse to
+ // WPA_IF_STATION to avoid MBSSID clean up in driver.
+ wpa_drv_if_remove(global->ifaces, WPA_IF_STATION,
ifname);
+ }
}
}
@@ -925,7 +926,9 @@ DBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
if (delete_iface) {
wpa_printf(MSG_DEBUG, "%s[dbus]: deleting the interface '%s'",
__func__, wpa_s->ifname);
- if (wpa_drv_if_remove(global->ifaces, wpa_s->added_vif_type,
+ // wpa_supplicant does not create MBSSID AP,
+ // collapse to WPA_IF_STATION to avoid MBSSID clean up in driver.
+ if (wpa_drv_if_remove(global->ifaces, WPA_IF_STATION,
wpa_s->ifname)) {
reply = wpas_dbus_error_unknown_error(
message,
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index ce7132145..d7c2c56bb 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -857,7 +857,6 @@ struct wpa_supplicant {
unsigned int connection_vht:1;
unsigned int connection_he:1;
unsigned int disable_mbo_oce:1;
- enum wpa_driver_if_type added_vif_type;
struct os_reltime last_mac_addr_change;
int last_mac_addr_style;
--
2.39.0.rc0.267.gcb52ba06e7-goog
More information about the Hostap
mailing list