Hi, On Tue, Jun 17, 2025 at 10:40 PM Ye He via B4 Relay <devnull+ye.he.amlogic.com@xxxxxxxxxx> wrote: > > From: Ye He <ye.he@xxxxxxxxxxx> > > This patch add a new Connected(string bearer) signal to indicate which transport > (LE or BR/EDR) has connected. Also extend the Disconnected signal to include > a bearer argument. > > This allows applications to distinguish transport-specific connection > events in dual-mode scenarios. > > Fixes: https://github.com/bluez/bluez/issues/1350 > > Signed-off-by: Ye He <ye.he@xxxxxxxxxxx> > --- > doc/org.bluez.Device.rst | 33 ++++++++++++++++++++++++++++++++- > src/device.c | 34 ++++++++++++++++++++++++++-------- > 2 files changed, 58 insertions(+), 9 deletions(-) > > diff --git a/doc/org.bluez.Device.rst b/doc/org.bluez.Device.rst > index 646e2c77ec2ddcbf7e6897336165d228c349fe00..1022402d95a1cd34dea88103ba66fb06f3007de7 100644 > --- a/doc/org.bluez.Device.rst > +++ b/doc/org.bluez.Device.rst > @@ -157,7 +157,26 @@ Possible errors: > Signals > ------- > > -void Disconnected(string reason, string message) > +void Connected(string bearer) > +```````````````````````````````````````````````` > + > +This signal is emitted when a device establishes a connection, indicating the > +bearer (transport type) over which the connection occurred. > + > +Client applications may use this signal to take actions such as stopping discovery > +or advertising, depending on their internal policy. > + > +Possible bearer: > + > +:"le": > + > + LE transport is cconnected. > + > +:"bredr": > + > + BR/EDR transport is connected. > + > +void Disconnected(string reason, string message, string bearer) > ```````````````````````````````````````````````` > > This signal is launched when a device is disconnected, with the reason of the > @@ -208,6 +227,18 @@ Possible reasons: > > Connection terminated by local host for suspend. > > +The additional 'bearer' field indicates which transport was disconnected. > + > +Possible bearer: > + > +:"le": > + > + LE transport is disconnected. > + > +:"bredr": > + > + BR/EDR transport is disconnected. Sometime ago, or perhaps I shall say long time, there was proposal to introduce bearer specific interfaces e.g. org.bluez.Device.LE/org.bluez.Device.BREDR, I wonder if that wouldn't be a better direction, otherwise we may mess up with existing interface which may cause API breakage, etc. > Properties > ---------- > > diff --git a/src/device.c b/src/device.c > index 902c4aa44d21eb89076eff3a47ffa727420967a8..ae6196eb2e5b6eca10a8e1c3360b85023dcddec2 100644 > --- a/src/device.c > +++ b/src/device.c > @@ -3491,8 +3491,10 @@ static const GDBusMethodTable device_methods[] = { > }; > > static const GDBusSignalTable device_signals[] = { > + { GDBUS_SIGNAL("Connected", > + GDBUS_ARGS({ "bearer", "s" })) }, > { GDBUS_SIGNAL("Disconnected", > - GDBUS_ARGS({ "name", "s" }, { "message", "s" })) }, > + GDBUS_ARGS({ "name", "s" }, { "message", "s" }, { "bearer", "s" })) }, > { } > }; > > @@ -3676,6 +3678,7 @@ void device_add_connection(struct btd_device *dev, uint8_t bdaddr_type, > uint32_t flags) > { > struct bearer_state *state = get_state(dev, bdaddr_type); > + const char *bearer; > > device_update_last_seen(dev, bdaddr_type, true); > device_update_last_used(dev, bdaddr_type); > @@ -3691,14 +3694,22 @@ void device_add_connection(struct btd_device *dev, uint8_t bdaddr_type, > dev->conn_bdaddr_type = dev->bdaddr_type; > > /* If this is the first connection over this bearer */ > - if (bdaddr_type == BDADDR_BREDR) > + if (bdaddr_type == BDADDR_BREDR) { > device_set_bredr_support(dev); > - else > + bearer = "bredr"; > + } else { > device_set_le_support(dev, bdaddr_type); > + bearer = "le"; > + } > > state->connected = true; > state->initiator = flags & BIT(3); > > + g_dbus_emit_signal(dbus_conn, dev->path, DEVICE_INTERFACE, > + "Connected", > + DBUS_TYPE_STRING, &bearer, > + DBUS_TYPE_INVALID); > + > if (dev->le_state.connected && dev->bredr_state.connected) > return; > > @@ -3747,7 +3758,7 @@ static void set_temporary_timer(struct btd_device *dev, unsigned int timeout) > dev, NULL); > } > > -static void device_disconnected(struct btd_device *device, uint8_t reason) > +static void device_disconnected(struct btd_device *device, uint8_t reason, const char *bearer) > { > const char *name; > const char *message; > @@ -3787,6 +3798,7 @@ static void device_disconnected(struct btd_device *device, uint8_t reason) > "Disconnected", > DBUS_TYPE_STRING, &name, > DBUS_TYPE_STRING, &message, > + DBUS_TYPE_STRING, &bearer, > DBUS_TYPE_INVALID); > } > > @@ -3798,10 +3810,16 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, > DBusMessage *reply; > bool remove_device = false; > bool paired_status_updated = false; > + const char *bearer; > > if (!state->connected) > return; > > + if (bdaddr_type == BDADDR_BREDR) > + bearer = "bredr"; > + else > + bearer = "le"; > + > state->connected = false; > state->initiator = false; > device->general_connect = FALSE; > @@ -3854,15 +3872,15 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, > DEVICE_INTERFACE, > "Paired"); > > - if (device->bredr_state.connected || device->le_state.connected) > - return; > - > device_update_last_seen(device, bdaddr_type, true); > > g_slist_free_full(device->eir_uuids, g_free); > device->eir_uuids = NULL; > > - device_disconnected(device, reason); > + device_disconnected(device, reason, bearer); > + > + if (device->bredr_state.connected || device->le_state.connected) > + return; > > g_dbus_emit_property_changed(dbus_conn, device->path, > DEVICE_INTERFACE, "Connected"); > > --- > base-commit: dc8db3601001de9a085da063e0c5e456074b8963 > change-id: 20250618-device-bearer-level-conn-state-3e29d56bda88 > > Best regards, > -- > Ye He <ye.he@xxxxxxxxxxx> > > > -- Luiz Augusto von Dentz