[PATCH] CHROMIUM: dbus: Add virtual interface create/remove logic to be inline with ctrl_iface

Jouni Malinen j at w1.fi
Mon Nov 7 02:44:55 PST 2022


On Thu, Nov 03, 2022 at 01:03:36AM +0000, Jintao Lin wrote:
> diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen

> +	      <tr><td>Create</td><td>b</td><td>Whether to create a new interface in the kernel</td><td>No</td>
> +	      <tr><td>Type</td><td>s</td><td>Interface type to create</td><td>No</td>

Should this list the possible values for the interface type (sta and ap
in the current patch)?

> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
> @@ -755,6 +755,10 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
> +	char *type = NULL;
> +	bool create_iface = false;
> +	enum wpa_driver_if_type if_type = WPA_IF_STATION;
> +	u8 mac_addr[ETH_ALEN];

Maintaining type and if_type separately seems unnecessarily complex for
this. Wouldn't if_type alone be sufficient to get rid of the dynamic
allocation?

> @@ -791,6 +795,17 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
> +		} else if (os_strcmp(entry.key, "Type") == 0 &&
> +			   entry.type == DBUS_TYPE_STRING) {
> +			os_free(type);
> +			type = os_strdup(entry.str_value);

In other words, this part there could do the string to enum
wpa_driver_if_type mapping without storing a copy of the string.

> +	if (create_iface) {
> +		if (os_strcmp(type, "sta") == 0) {
> +			if_type = WPA_IF_STATION;
> +		} else if (os_strcmp(type, "ap") == 0) {
> +			if_type = WPA_IF_AP_BSS;
> +		} else {
> +			goto error;
> +		}

So this could be moved above.

>  		reply = dbus_message_new_error(
>  			message, WPAS_DBUS_ERROR_IFACE_EXISTS,
>  			"wpa_supplicant already controls this interface.");
> +		goto fail;

So if the interface is already present, this would jump to the fail
label.

> @@ -845,6 +884,10 @@ error:
>  oom:
>  	reply = wpas_dbus_error_no_memory(message);
>  	goto out;
> +fail:
> +	if (create_iface)
> +		wpa_drv_if_remove(global->ifaces, WPA_IF_STATION, ifname);
> +	goto out;

And that would remove the interface that was already in use. That does
not sound correct. Furthermore, that use of the hardcoded WPA_IF_STATION
would not cover the AP case.

> @@ -865,19 +908,35 @@ 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_IF_STATION, wpa_s->ifname)) {

And same for this hardcoded WPA_IF_STATION case.. This needs to match
the interface type to cover the WPA_IF_AP_BSS specific operations in
wpa_driver_nl80211_if_remove().
 
-- 
Jouni Malinen                                            PGP id EFC895FA



More information about the Hostap mailing list