Re: [PATCH] dbus: register interface before acquiring name

Denis Kenzior <[email protected]> Fri, 30 Jan 2026 09:45:17 -0600
Newsgroups dev.linux.lists.iwd
Message-ID <[email protected]>
Hi Ronan,

On 1/27/26 4:40 PM, Ronan Pigott wrote:
> If the interface isn't available by the time we acquire the well-known
> name, clients can get confused when the expected interfaces are missing
> during bus activation.
> ---
> This code seems backwards to me. Presently, if IWD is not running,
> calling any IWD methods will fail:
> 
>    $ busctl call net.connman.iwd /net/connman/iwd net.connman.iwd.Daemon GetInfo
>    Call failed: No matching method found
> 
> only to succeed immediately after once the bus activation is complete:
> 
>    $ busctl call net.connman.iwd /net/connman/iwd net.connman.iwd.Daemon GetInfo
>    a{sv} 3 "NetworkConfigurationEnabled" b false "StateDirectory" s "/var/lib/iwd" "Version" s "3.10"
> 
> With this patch, we register IWD methods before acquiring the well-known
> name, and the abovve call succeeds on the first try.
> 
>   src/main.c | 46 +++++++++++++++++++++-------------------------
>   1 file changed, 21 insertions(+), 25 deletions(-)
> 

<snip>

> @@ -249,12 +228,29 @@ static void dbus_ready(void *user_data)
>   {
>   	struct l_dbus *dbus = user_data;
>   
> -	l_dbus_name_acquire(dbus, "net.connman.iwd", false, false, false,
> -				request_name_callback, NULL);
> -
>   	l_dbus_register_interface(dbus, IWD_DAEMON_INTERFACE,
>   					iwd_setup_deamon_interface,
>   					NULL, false);
> +
> +	if (!l_dbus_object_manager_enable(dbus, "/"))
> +		l_warn("Unable to register the ObjectManager");
> +
> +	if (!l_dbus_object_add_interface(dbus, IWD_BASE_PATH,
> +						IWD_DAEMON_INTERFACE,
> +						NULL) ||
> +			!l_dbus_object_add_interface(dbus, IWD_BASE_PATH,
> +						L_DBUS_INTERFACE_PROPERTIES,
> +						NULL))
> +		l_info("Unable to add %s and/or %s at %s",
> +			IWD_DAEMON_INTERFACE, L_DBUS_INTERFACE_PROPERTIES,
> +			IWD_BASE_PATH);
> +
> +	/* TODO: Always request nl80211 for now, ignoring auto-loading */
> +	l_genl_request_family(genl, NL80211_GENL_NAME, nl80211_appeared,
> +				NULL, NULL);

nit: I would preserve some of the original behavior and not request the NL80211 
family until we know that the DBus name request succeeded.  If we can't jump on 
the bus, we can't manage NL80211, so having the subsystem loaded, etc is wasteful.

> +
> +	l_dbus_name_acquire(dbus, "net.connman.iwd", false, false, false,
> +				request_name_callback, NULL);
>   }

Otherwise, looks reasonable.

>   
>   static void dbus_disconnected(void *user_data)

Regards,
-Denis