* [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected
@ 2025-07-14 20:35 Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 2/5] doc: Add org.bluez.Bearer.LE and org.bluez.Bearer.BREDR Luiz Augusto von Dentz
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2025-07-14 20:35 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds btd_device_bdaddr_type_connected which can return the
connected state based on the address type.
---
src/device.c | 8 ++++++++
src/device.h | 1 +
2 files changed, 9 insertions(+)
diff --git a/src/device.c b/src/device.c
index a50d9ad5cee5..eed2edcf0dfc 100644
--- a/src/device.c
+++ b/src/device.c
@@ -3632,6 +3632,14 @@ bool btd_device_bearer_is_connected(struct btd_device *dev)
return dev->bredr_state.connected || dev->le_state.connected;
}
+bool btd_device_bdaddr_type_connected(struct btd_device *dev, uint8_t type)
+{
+ if (type == BDADDR_BREDR)
+ return dev->bredr_state.connected;
+
+ return dev->le_state.connected;
+}
+
static void clear_temporary_timer(struct btd_device *dev)
{
if (dev->temporary_timer) {
diff --git a/src/device.h b/src/device.h
index 4eebcebe9d5c..9e7c30ad7186 100644
--- a/src/device.h
+++ b/src/device.h
@@ -110,6 +110,7 @@ void device_set_tx_power(struct btd_device *device, int8_t tx_power);
void device_set_flags(struct btd_device *device, uint8_t flags);
bool btd_device_is_connected(struct btd_device *dev);
bool btd_device_bearer_is_connected(struct btd_device *dev);
+bool btd_device_bdaddr_type_connected(struct btd_device *dev, uint8_t type);
uint8_t btd_device_get_bdaddr_type(struct btd_device *dev);
bool device_is_retrying(struct btd_device *device);
void device_bonding_complete(struct btd_device *device, uint8_t bdaddr_type,
--
2.50.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ v2 2/5] doc: Add org.bluez.Bearer.LE and org.bluez.Bearer.BREDR
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
@ 2025-07-14 20:35 ` Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 3/5] bearer: Add initial implementation of org.bluez.Bearer.{BREDR, LE} Luiz Augusto von Dentz
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2025-07-14 20:35 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds bearer specific interfaces so they can properly be operated
separately.
Fixes: https://github.com/bluez/bluez/issues/1350
---
Makefile.am | 3 +
doc/org.bluez.Bearer.BREDR.rst | 143 +++++++++++++++++++++++++++++++++
doc/org.bluez.Bearer.LE.rst | 143 +++++++++++++++++++++++++++++++++
3 files changed, 289 insertions(+)
create mode 100644 doc/org.bluez.Bearer.BREDR.rst
create mode 100644 doc/org.bluez.Bearer.LE.rst
diff --git a/Makefile.am b/Makefile.am
index c4b88d83c962..b75125e8887f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -358,6 +358,7 @@ if MANPAGES
man_MANS += src/bluetoothd.8
man_MANS += doc/hci.7 doc/mgmt.7 doc/l2cap.7 doc/rfcomm.7 doc/sco.7
man_MANS += doc/org.bluez.Adapter.5 doc/org.bluez.Device.5 \
+ doc/org.bluez.Bearer.LE.5 doc/org.bluez.Bearer.BREDR.5 \
doc/org.bluez.DeviceSet.5 doc/org.bluez.AgentManager.5 \
doc/org.bluez.Agent.5 doc/org.bluez.ProfileManager.5 \
doc/org.bluez.Profile.5 doc/org.bluez.NetworkServer.5 \
@@ -392,6 +393,7 @@ endif
manual_pages += src/bluetoothd.8
manual_pages += doc/hci.7 doc/mgmt.7 doc/l2cap.7 doc/rfcomm.7 doc/sco.7
manual_pages += doc/org.bluez.Adapter.5 doc/org.bluez.Device.5 \
+ doc/org.bluez.Bearer.LE.5 doc/org.bluez.Bearer.BREDR.5 \
doc/org.bluez.DeviceSet.5 doc/org.bluez.AgentManager.5 \
doc/org.bluez.Agent.5 doc/org.bluez.ProfileManager.5 \
doc/org.bluez.Profile.5 doc/org.bluez.NetworkServer.5 \
@@ -470,6 +472,7 @@ EXTRA_DIST += doc/health-api.txt \
EXTRA_DIST += doc/hci.rst doc/mgmt.rst doc/l2cap.rst doc/rfcomm.rst doc/sco.rst
EXTRA_DIST += doc/org.bluez.Adapter.rst doc/org.bluez.Device.rst \
+ doc/org.bluez.Bearer.LE.rst doc/org.bluez.Bearer.BREDR.rst \
doc/org.bluez.DeviceSet.rst doc/org.bluez.AgentManager.rst \
doc/org.bluez.Agent.rst doc/org.bluez.ProfileManager.rst \
doc/org.bluez.Profile.rst doc/org.bluez.NetworkServer.rst \
diff --git a/doc/org.bluez.Bearer.BREDR.rst b/doc/org.bluez.Bearer.BREDR.rst
new file mode 100644
index 000000000000..779490728872
--- /dev/null
+++ b/doc/org.bluez.Bearer.BREDR.rst
@@ -0,0 +1,143 @@
+======================
+org.bluez.Bearer.BREDR
+======================
+
+------------------------------------------
+BlueZ D-Bus Bearer BREDR API documentation
+------------------------------------------
+
+:Version: BlueZ
+:Date: July 2025
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: org.bluez
+:Interface: org.bluez.Bearer.BREDR1
+:Object path: [variable prefix]/{hci0,hci1,...}/dev_{BDADDR}
+
+Methods
+-------
+
+void Connect() [experimental]
+`````````````````````````````
+
+Connects all BREDR profiles the remote device supports that can be connected to
+and have been flagged as auto-connectable. If only subset of profiles is already
+connected it will try to connect currently disconnected ones.
+
+If at least one profile was connected successfully this method will indicate
+success.
+
+Possible errors:
+
+:org.bluez.Error.NotReady:
+:org.bluez.Error.Failed:
+:org.bluez.Error.InProgress:
+:org.bluez.Error.AlreadyConnected:
+
+void Disconnect() [experimental]
+````````````````````````````````
+
+Disconnects all connected profiles and then terminates low-level ACL connection.
+
+ACL connection will be terminated even if some profiles were not disconnected
+properly e.g. due to misbehaving device.
+
+This method can be also used to cancel a preceding Connect call before a reply
+to it has been received.
+
+For non-trusted devices connected calling this method will disable incoming
+connections until Connect method is called again.
+
+Possible errors:
+
+:org.bluez.Error.NotConnected:
+
+Signals
+-------
+
+void Disconnected(string reason, string message) [experimental]
+```````````````````````````````````````````````````````````````
+
+This signal is launched when a device is disconnected, with the reason of the
+disconnection.
+
+This could be used by client application, depending on internal policy, to try
+to reconnect to the device in case of timeout or unknown disconnection, or to
+try to connect to another device.
+
+Possible reasons:
+
+:org.bluez.Reason.Unknown:
+
+:org.bluez.Reason.Timeout:
+
+ Connection timeout.
+
+ The link supervision timeout has expired for a connection or the
+ synchronization timeout has expired for a broadcast.
+
+:org.bluez.Reason.Local:
+
+ Connection terminated by local host.
+
+ The local device terminated the connection, terminated synchronization
+ with a broadcaster, or terminated broadcasting packets.
+
+:org.bluez.Reason.Remote:
+
+ Connection terminated by remote host.
+
+ This disconnection can be due to:
+
+ - the user on the remote device either terminated the connection or
+ stopped broadcasting packets,
+
+ - the remote device terminated the connection because of low
+ resources,
+
+ - the remote device terminated the connection because the device is
+ about to power off.
+
+:org.bluez.Reason.Authentication:
+
+ Connection terminated due to an authentication failure.
+
+:org.bluez.Reason.Suspend:
+
+ Connection terminated by local host for suspend.
+
+Properties
+----------
+
+object Adapter [readonly, experimental]
+```````````````````````````````````````
+
+The object path of the adapter the set belongs to.
+
+
+boolean Paired [readonly, experimental]
+```````````````````````````````````````
+
+Indicates if the remote device is paired to BREDR bearer.
+
+Paired means the pairing process where devices exchange the information to
+establish an encrypted connection has been completed.
+
+boolean Bonded [readonly, experimental]
+```````````````````````````````````````
+
+Indicates if the remote device is bonded to BREDR bearer.
+
+Bonded means the information exchanged on pairing process has been stored and
+will be persisted.
+
+boolean Connected [readonly, experimental]
+``````````````````````````````````````````
+
+Indicates if the remote device is currently connected to BREDR bearer.
+
+A PropertiesChanged signal indicate changes to this status.
diff --git a/doc/org.bluez.Bearer.LE.rst b/doc/org.bluez.Bearer.LE.rst
new file mode 100644
index 000000000000..a4657755d119
--- /dev/null
+++ b/doc/org.bluez.Bearer.LE.rst
@@ -0,0 +1,143 @@
+===================
+org.bluez.Bearer.LE
+===================
+
+---------------------------------------
+BlueZ D-Bus Bearer LE API documentation
+---------------------------------------
+
+:Version: BlueZ
+:Date: July 2025
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: org.bluez
+:Interface: org.bluez.Bearer.LE1
+:Object path: [variable prefix]/{hci0,hci1,...}/dev_{BDADDR}
+
+Methods
+-------
+
+void Connect() [experimental]
+`````````````````````````````
+
+Connects all LE profiles the remote device supports that can be connected to and
+have been flagged as auto-connectable. If only subset of profiles is already
+connected it will try to connect currently disconnected ones.
+
+If at least one profile was connected successfully this method will indicate
+success.
+
+Possible errors:
+
+:org.bluez.Error.NotReady:
+:org.bluez.Error.Failed:
+:org.bluez.Error.InProgress:
+:org.bluez.Error.AlreadyConnected:
+
+void Disconnect() [experimental]
+````````````````````````````````
+
+Disconnects all connected profiles and then terminates low-level ACL-LE
+connection.
+
+ACL-LE connection will be terminated even if some profiles were not disconnected
+properly e.g. due to misbehaving device.
+
+This method can be also used to cancel a preceding Connect call before a reply
+to it has been received.
+
+For non-trusted devices connected calling this method will disable incoming
+connections until Connect method is called again.
+
+Possible errors:
+
+:org.bluez.Error.NotConnected:
+
+Signals
+-------
+
+void Disconnected(string reason, string message) [experimental]
+```````````````````````````````````````````````````````````````
+
+This signal is launched when a device is disconnected, with the reason of the
+disconnection.
+
+This could be used by client application, depending on internal policy, to try
+to reconnect to the device in case of timeout or unknown disconnection, or to
+try to connect to another device.
+
+Possible reasons:
+
+:org.bluez.Reason.Unknown:
+
+:org.bluez.Reason.Timeout:
+
+ Connection timeout.
+
+ The link supervision timeout has expired for a connection or the
+ synchronization timeout has expired for a broadcast.
+
+:org.bluez.Reason.Local:
+
+ Connection terminated by local host.
+
+ The local device terminated the connection, terminated synchronization
+ with a broadcaster, or terminated broadcasting packets.
+
+:org.bluez.Reason.Remote:
+
+ Connection terminated by remote host.
+
+ This disconnection can be due to:
+
+ - the user on the remote device either terminated the connection or
+ stopped broadcasting packets,
+
+ - the remote device terminated the connection because of low
+ resources,
+
+ - the remote device terminated the connection because the device is
+ about to power off.
+
+:org.bluez.Reason.Authentication:
+
+ Connection terminated due to an authentication failure.
+
+:org.bluez.Reason.Suspend:
+
+ Connection terminated by local host for suspend.
+
+Properties
+----------
+
+object Adapter [readonly, experimental]
+```````````````````````````````````````
+
+The object path of the adapter the set belongs to.
+
+boolean Paired [readonly, experimental]
+```````````````````````````````````````
+
+Indicates if the remote device is paired to LE bearer.
+
+Paired means the pairing process where devices exchange the information to
+establish an encrypted connection has been completed.
+
+boolean Bonded [readonly, experimental]
+```````````````````````````````````````
+
+Indicates if the remote device is bonded to LE bearer.
+
+Bonded means the information exchanged on pairing process has been stored and
+will be persisted.
+
+boolean Connected [readonly, experimental]
+``````````````````````````````````````````
+
+Indicates if the remote device is currently connected to LE bearer.
+
+A PropertiesChanged signal indicate changes to this status.
--
2.50.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ v2 3/5] bearer: Add initial implementation of org.bluez.Bearer.{BREDR, LE}
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 2/5] doc: Add org.bluez.Bearer.LE and org.bluez.Bearer.BREDR Luiz Augusto von Dentz
@ 2025-07-14 20:35 ` Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 4/5] client: Add support for org.bluez.Bearer.{BREDR, LE}1 Luiz Augusto von Dentz
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2025-07-14 20:35 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds initial implementation of org.bluez.Bearer{BREDR, LE}(5)
interfaces.
---
Makefile.am | 3 +-
src/bearer.c | 260 +++++++++++++++++++++++++++++++++++++++++++++++++++
src/bearer.h | 22 +++++
src/device.c | 66 ++++++++++---
4 files changed, 339 insertions(+), 12 deletions(-)
create mode 100644 src/bearer.c
create mode 100644 src/bearer.h
diff --git a/Makefile.am b/Makefile.am
index b75125e8887f..c70d6543e133 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -330,7 +330,8 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
src/adv_monitor.h src/adv_monitor.c \
src/battery.h src/battery.c \
src/settings.h src/settings.c \
- src/set.h src/set.c
+ src/set.h src/set.c \
+ src/bearer.h src/bearer.c
src_bluetoothd_LDADD = lib/libbluetooth-internal.la \
gdbus/libgdbus-internal.la \
src/libshared-glib.la \
diff --git a/src/bearer.c b/src/bearer.c
new file mode 100644
index 000000000000..d4286b431583
--- /dev/null
+++ b/src/bearer.c
@@ -0,0 +1,260 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2025 Intel Corporation
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <stdint.h>
+
+#include <glib.h>
+#include <dbus/dbus.h>
+
+#include "lib/bluetooth.h"
+#include "lib/mgmt.h"
+
+#include "gdbus/gdbus.h"
+#include "src/shared/util.h"
+
+#include "log.h"
+#include "error.h"
+#include "adapter.h"
+#include "device.h"
+#include "dbus-common.h"
+#include "bearer.h"
+
+struct btd_bearer {
+ struct btd_device *device;
+ uint8_t type;
+ const char *path;
+};
+
+static void bearer_free(void *data)
+{
+ struct btd_bearer *bearer = data;
+
+ free(bearer);
+}
+
+static DBusMessage *bearer_connect(DBusConnection *conn, DBusMessage *msg,
+ void *user_data)
+{
+ /* TODO */
+ return NULL;
+}
+
+static DBusMessage *bearer_disconnect(DBusConnection *conn, DBusMessage *msg,
+ void *user_data)
+{
+ /* TODO */
+ return NULL;
+}
+
+static const GDBusMethodTable bearer_methods[] = {
+ { GDBUS_EXPERIMENTAL_ASYNC_METHOD("Connect", NULL, NULL,
+ bearer_connect) },
+ { GDBUS_EXPERIMENTAL_ASYNC_METHOD("Disconnect", NULL, NULL,
+ bearer_disconnect) },
+ {}
+};
+
+static gboolean bearer_get_adapter(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_bearer *bearer = data;
+ struct btd_adapter *adapter = device_get_adapter(bearer->device);
+ const char *path = adapter_get_path(adapter);
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
+
+ return TRUE;
+}
+
+static gboolean bearer_get_paired(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_bearer *bearer = data;
+ dbus_bool_t paired = device_is_paired(bearer->device, bearer->type);
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &paired);
+
+ return TRUE;
+}
+
+static gboolean bearer_get_bonded(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_bearer *bearer = data;
+ dbus_bool_t bonded = device_is_bonded(bearer->device, bearer->type);
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &bonded);
+
+ return TRUE;
+}
+
+static gboolean bearer_get_connected(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_bearer *bearer = data;
+ dbus_bool_t connected = btd_device_bdaddr_type_connected(bearer->device,
+ bearer->type);
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &connected);
+
+ return TRUE;
+}
+
+static const GDBusSignalTable bearer_signals[] = {
+ { GDBUS_SIGNAL("Disconnected",
+ GDBUS_ARGS({ "name", "s" }, { "message", "s" })) },
+ { }
+};
+
+static const GDBusPropertyTable bearer_properties[] = {
+ { "Adapter", "o", bearer_get_adapter, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "Paired", "b", bearer_get_paired, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "Bonded", "b", bearer_get_bonded, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "Connected", "b", bearer_get_connected, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ {}
+};
+
+static const char *bearer_interface(uint8_t type)
+{
+ if (type == BDADDR_BREDR)
+ return BTD_BEARER_BREDR_INTERFACE;
+ else
+ return BTD_BEARER_LE_INTERFACE;
+}
+
+struct btd_bearer *btd_bearer_new(struct btd_device *device, uint8_t type)
+{
+ struct btd_bearer *bearer;
+
+ bearer = new0(struct btd_bearer, 1);
+ bearer->device = device;
+ bearer->type = type;
+ bearer->path = device_get_path(device);
+
+ if (!g_dbus_register_interface(btd_get_dbus_connection(),
+ bearer->path, bearer_interface(type),
+ bearer_methods, bearer_signals,
+ bearer_properties,
+ bearer, bearer_free)) {
+ error("Unable to register BREDR interface");
+ bearer->path = NULL;
+ }
+
+ return bearer;
+}
+
+void btd_bearer_destroy(struct btd_bearer *bearer)
+{
+ if (!bearer)
+ return;
+
+ if (!bearer->path) {
+ bearer_free(bearer);
+ return;
+ }
+
+ g_dbus_unregister_interface(btd_get_dbus_connection(), bearer->path,
+ bearer_interface(bearer->type));
+}
+
+void btd_bearer_paired(struct btd_bearer *bearer)
+{
+ if (!bearer || !bearer->path)
+ return;
+
+ g_dbus_emit_property_changed(btd_get_dbus_connection(), bearer->path,
+ bearer_interface(bearer->type),
+ "Paired");
+}
+
+void btd_bearer_bonded(struct btd_bearer *bearer)
+{
+ if (!bearer || !bearer->path)
+ return;
+
+ g_dbus_emit_property_changed(btd_get_dbus_connection(), bearer->path,
+ bearer_interface(bearer->type),
+ "Bonded");
+}
+
+void btd_bearer_connected(struct btd_bearer *bearer)
+{
+ if (!bearer || !bearer->path)
+ return;
+
+ g_dbus_emit_property_changed(btd_get_dbus_connection(), bearer->path,
+ bearer_interface(bearer->type),
+ "Connected");
+}
+
+void btd_bearer_disconnected(struct btd_bearer *bearer, uint8_t reason)
+{
+ const char *name;
+ const char *message;
+
+ if (!bearer || !bearer->path)
+ return;
+
+ g_dbus_emit_property_changed(btd_get_dbus_connection(), bearer->path,
+ bearer_interface(bearer->type),
+ "Connected");
+
+ switch (reason) {
+ case MGMT_DEV_DISCONN_UNKNOWN:
+ name = "org.bluez.Reason.Unknown";
+ message = "Unspecified";
+ break;
+ case MGMT_DEV_DISCONN_TIMEOUT:
+ name = "org.bluez.Reason.Timeout";
+ message = "Connection timeout";
+ break;
+ case MGMT_DEV_DISCONN_LOCAL_HOST:
+ name = "org.bluez.Reason.Local";
+ message = "Connection terminated by local host";
+ break;
+ case MGMT_DEV_DISCONN_REMOTE:
+ name = "org.bluez.Reason.Remote";
+ message = "Connection terminated by remote user";
+ break;
+ case MGMT_DEV_DISCONN_AUTH_FAILURE:
+ name = "org.bluez.Reason.Authentication";
+ message = "Connection terminated due to authentication failure";
+ break;
+ case MGMT_DEV_DISCONN_LOCAL_HOST_SUSPEND:
+ name = "org.bluez.Reason.Suspend";
+ message = "Connection terminated by local host for suspend";
+ break;
+ default:
+ warn("Unknown disconnection value: %u", reason);
+ name = "org.bluez.Reason.Unknown";
+ message = "Unspecified";
+ }
+
+ g_dbus_emit_signal(btd_get_dbus_connection(), bearer->path,
+ bearer_interface(bearer->type),
+ "Disconnected",
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_STRING, &message,
+ DBUS_TYPE_INVALID);
+}
diff --git a/src/bearer.h b/src/bearer.h
new file mode 100644
index 000000000000..4a39dcdd047e
--- /dev/null
+++ b/src/bearer.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2025 Intel Corporation
+ *
+ *
+ */
+
+#define BTD_BEARER_BREDR_INTERFACE "org.bluez.Bearer.BREDR1"
+#define BTD_BEARER_LE_INTERFACE "org.bluez.Bearer.LE1"
+
+struct btd_bearer;
+
+struct btd_bearer *btd_bearer_new(struct btd_device *device, uint8_t type);
+void btd_bearer_destroy(struct btd_bearer *bearer);
+
+void btd_bearer_paired(struct btd_bearer *bearer);
+void btd_bearer_bonded(struct btd_bearer *bearer);
+void btd_bearer_connected(struct btd_bearer *bearer);
+void btd_bearer_disconnected(struct btd_bearer *bearer, uint8_t reason);
diff --git a/src/device.c b/src/device.c
index eed2edcf0dfc..7e62112615e4 100644
--- a/src/device.c
+++ b/src/device.c
@@ -66,6 +66,7 @@
#include "eir.h"
#include "settings.h"
#include "set.h"
+#include "bearer.h"
#define DISCONNECT_TIMER 2
#define DISCOVERY_TIMER 1
@@ -205,8 +206,8 @@ struct btd_device {
uint8_t bdaddr_type;
bool rpa;
char *path;
- bool bredr;
- bool le;
+ struct btd_bearer *bredr;
+ struct btd_bearer *le;
bool pending_paired; /* "Paired" waiting for SDP */
bool svc_refreshed;
bool refresh_discovery;
@@ -949,6 +950,9 @@ static void device_free(gpointer user_data)
queue_destroy(device->sirks, free);
+ btd_bearer_destroy(device->bredr);
+ btd_bearer_destroy(device->le);
+
g_free(device->local_csrk);
g_free(device->remote_csrk);
free(device->ltk);
@@ -2981,6 +2985,11 @@ static void browse_request_complete(struct browse_req *req, uint8_t type,
}
if (dev->pending_paired) {
+ if (bdaddr_type == BDADDR_BREDR)
+ btd_bearer_paired(dev->bredr);
+ else
+ btd_bearer_paired(dev->le);
+
g_dbus_emit_property_changed(dbus_conn, dev->path,
DEVICE_INTERFACE, "Paired");
dev->pending_paired = false;
@@ -3072,6 +3081,11 @@ static void device_svc_resolved(struct btd_device *dev, uint8_t browse_type,
dev->eir_uuids = NULL;
if (dev->pending_paired) {
+ if (bdaddr_type == BDADDR_BREDR)
+ btd_bearer_paired(dev->bredr);
+ else
+ btd_bearer_paired(dev->le);
+
g_dbus_emit_property_changed(dbus_conn, dev->path,
DEVICE_INTERFACE, "Paired");
dev->pending_paired = false;
@@ -3698,10 +3712,13 @@ 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
+ btd_bearer_connected(dev->bredr);
+ } else {
device_set_le_support(dev, bdaddr_type);
+ btd_bearer_connected(dev->le);
+ }
state->connected = true;
state->initiator = flags & BIT(3);
@@ -3833,6 +3850,12 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
device->connect = NULL;
}
+ /* Update bearer interface */
+ if (bdaddr_type == BDADDR_BREDR)
+ btd_bearer_disconnected(device->bredr, reason);
+ else
+ btd_bearer_disconnected(device->le, reason);
+
/* Check paired status of both bearers since it's possible to be
* paired but not connected via link key to LTK conversion.
*/
@@ -3843,6 +3866,7 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
BDADDR_BREDR);
device->bredr_state.paired = false;
paired_status_updated = true;
+ btd_bearer_paired(device->bredr);
}
if (!device->le_state.connected && device->le_state.paired &&
@@ -3852,6 +3876,7 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
device->bdaddr_type);
device->le_state.paired = false;
paired_status_updated = true;
+ btd_bearer_paired(device->le);
}
/* report change only if both bearers are unpaired */
@@ -4191,9 +4216,9 @@ static void load_info(struct btd_device *device, const char *local,
for (t = techno; *t; t++) {
if (g_str_equal(*t, "BR/EDR"))
- device->bredr = true;
+ device->bredr = btd_bearer_new(device, BDADDR_BREDR);
else if (g_str_equal(*t, "LE"))
- device->le = true;
+ device->le = btd_bearer_new(device, BDADDR_LE_PUBLIC);
else
error("Unknown device technology");
}
@@ -4834,9 +4859,9 @@ struct btd_device *device_create(struct btd_adapter *adapter,
device->bdaddr_type = bdaddr_type;
if (bdaddr_type == BDADDR_BREDR)
- device->bredr = true;
+ device->bredr = btd_bearer_new(device, BDADDR_BREDR);
else
- device->le = true;
+ device->le = btd_bearer_new(device, BDADDR_LE_PUBLIC);
storage_dir = btd_adapter_get_storage_dir(adapter);
str = load_cached_name(device, storage_dir, dst);
@@ -4986,7 +5011,8 @@ void device_update_addr(struct btd_device *device, const bdaddr_t *bdaddr,
/* Since this function is only used for LE SMP Identity
* Resolving purposes we can now assume LE is supported.
*/
- device->le = true;
+ if (!device->le)
+ device->le = btd_bearer_new(device, BDADDR_LE_PUBLIC);
/* Remove old address from accept/auto-connect list since its address
* will be changed.
@@ -5016,7 +5042,8 @@ void device_set_bredr_support(struct btd_device *device)
if (btd_opts.mode == BT_MODE_LE || device->bredr)
return;
- device->bredr = true;
+ if (!device->bredr)
+ device->bredr = btd_bearer_new(device, BDADDR_BREDR);
if (device->le)
g_dbus_emit_property_changed(dbus_conn, device->path,
@@ -5030,7 +5057,9 @@ void device_set_le_support(struct btd_device *device, uint8_t bdaddr_type)
if (btd_opts.mode == BT_MODE_BREDR || device->le)
return;
- device->le = true;
+ if (!device->le)
+ device->le = btd_bearer_new(device, BDADDR_LE_PUBLIC);
+
device->bdaddr_type = bdaddr_type;
g_dbus_emit_property_changed(dbus_conn, device->path,
@@ -6613,6 +6642,11 @@ void device_set_bonded(struct btd_device *device, uint8_t bdaddr_type)
state->bonded = true;
+ if (bdaddr_type == BDADDR_BREDR)
+ btd_bearer_bonded(device->bredr);
+ else
+ btd_bearer_bonded(device->le);
+
btd_device_set_temporary(device, false);
/* If the other bearer state was already true we don't need to
@@ -6863,6 +6897,11 @@ void device_set_paired(struct btd_device *dev, uint8_t bdaddr_type)
state->paired = true;
+ if (bdaddr_type == BDADDR_BREDR)
+ btd_bearer_paired(dev->bredr);
+ else
+ btd_bearer_paired(dev->le);
+
/* If the other bearer state was already true we don't need to
* send any property signals.
*/
@@ -6887,6 +6926,11 @@ void device_set_unpaired(struct btd_device *dev, uint8_t bdaddr_type)
state->paired = false;
+ if (bdaddr_type == BDADDR_BREDR)
+ btd_bearer_paired(dev->bredr);
+ else
+ btd_bearer_paired(dev->le);
+
/*
* If the other bearer state is still true we don't need to
* send any property signals or remove device.
--
2.50.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ v2 4/5] client: Add support for org.bluez.Bearer.{BREDR, LE}1
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 2/5] doc: Add org.bluez.Bearer.LE and org.bluez.Bearer.BREDR Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 3/5] bearer: Add initial implementation of org.bluez.Bearer.{BREDR, LE} Luiz Augusto von Dentz
@ 2025-07-14 20:35 ` Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 5/5] client: Rework handling of Disconnected signal Luiz Augusto von Dentz
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2025-07-14 20:35 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds support for printing properties related to
org.bluez.Bearer.{BREDR, LE}1:
> info XX:XX:XX:XX:XX:XX
...
BREDR.Paired: yes
BREDR.Bonded: yes
BREDR.Connected: no
LE.Paired: yes
LE.Bonded: yes
LE.Connected: no
...
[CHG] BREDR XX:XX:XX:XX:XX:XX Connected: yes
---
client/main.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 122 insertions(+), 2 deletions(-)
diff --git a/client/main.c b/client/main.c
index d99a5158e35a..09df7b37c46f 100644
--- a/client/main.c
+++ b/client/main.c
@@ -58,6 +58,7 @@ struct adapter {
GDBusProxy *adv_monitor_proxy;
GList *devices;
GList *sets;
+ GList *bearers;
};
static struct adapter *default_ctrl;
@@ -452,6 +453,36 @@ static void set_added(GDBusProxy *proxy)
bt_shell_set_env(g_dbus_proxy_get_path(proxy), proxy);
}
+static void print_bearer(GDBusProxy *proxy, const char *label,
+ const char *description)
+{
+ bt_shell_printf("%s%s%s%s %s\n",
+ description ? "[" : "",
+ description ? : "",
+ description ? "] " : "",
+ label,
+ g_dbus_proxy_get_path(proxy));
+}
+
+static void bearer_added(GDBusProxy *proxy)
+{
+ struct adapter *adapter = find_parent(proxy);
+
+ if (!adapter)
+ return;
+
+ adapter->bearers = g_list_append(adapter->bearers, proxy);
+
+ if (!strcmp(g_dbus_proxy_get_interface(proxy),
+ "org.bluez.Bearer.BREDR1"))
+ print_bearer(proxy, "BREDR", COLORED_NEW);
+ else if (!strcmp(g_dbus_proxy_get_interface(proxy),
+ "org.bluez.Bearer.LE1"))
+ print_bearer(proxy, "LE", COLORED_NEW);
+
+ bt_shell_set_env(g_dbus_proxy_get_path(proxy), proxy);
+}
+
static void proxy_added(GDBusProxy *proxy, void *user_data)
{
const char *interface;
@@ -489,6 +520,10 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
admon_manager_added(proxy);
} else if (!strcmp(interface, "org.bluez.DeviceSet1")) {
set_added(proxy);
+ } else if (!strcmp(interface, "org.bluez.Bearer.BREDR1")) {
+ bearer_added(proxy);
+ } else if (!strcmp(interface, "org.bluez.Bearer.LE1")) {
+ bearer_added(proxy);
}
}
@@ -540,6 +575,7 @@ static void adapter_removed(GDBusProxy *proxy)
ctrl_list = g_list_remove_link(ctrl_list, ll);
g_list_free(adapter->devices);
g_list_free(adapter->sets);
+ g_list_free(adapter->bearers);
g_free(adapter);
g_list_free(ll);
return;
@@ -560,6 +596,19 @@ static void set_removed(GDBusProxy *proxy)
bt_shell_set_env(g_dbus_proxy_get_path(proxy), NULL);
}
+static void bearer_removed(GDBusProxy *proxy)
+{
+ struct adapter *adapter = find_parent(proxy);
+
+ if (!adapter)
+ return;
+
+ adapter->bearers = g_list_remove(adapter->bearers, proxy);
+
+ print_set(proxy, COLORED_DEL);
+ bt_shell_set_env(g_dbus_proxy_get_path(proxy), NULL);
+}
+
static void proxy_removed(GDBusProxy *proxy, void *user_data)
{
const char *interface;
@@ -602,6 +651,10 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
adv_monitor_remove_manager(dbus_conn);
} else if (!strcmp(interface, "org.bluez.DeviceSet1")) {
set_removed(proxy);
+ } else if (!strcmp(interface, "org.bluez.Bearer.BREDR1")) {
+ bearer_removed(proxy);
+ } else if (!strcmp(interface, "org.bluez.Bearer.LE1")) {
+ bearer_removed(proxy);
}
}
@@ -619,6 +672,20 @@ static struct adapter *find_ctrl(GList *source, const char *path)
return NULL;
}
+static GDBusProxy *find_proxies_by_path(GList *source, const char *path)
+{
+ GList *list;
+
+ for (list = g_list_first(source); list; list = g_list_next(list)) {
+ GDBusProxy *proxy = list->data;
+
+ if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
+ return proxy;
+ }
+
+ return NULL;
+}
+
static void property_changed(GDBusProxy *proxy, const char *name,
DBusMessageIter *iter, void *user_data)
{
@@ -703,6 +770,36 @@ static void property_changed(GDBusProxy *proxy, const char *name,
print_iter(str, name, iter);
g_free(str);
+ } else if (!strcmp(interface, "org.bluez.Bearer.BREDR1") ||
+ !strcmp(interface, "org.bluez.Bearer.LE1")) {
+ if (default_ctrl &&
+ proxy_is_child(proxy, default_ctrl->proxy)) {
+ DBusMessageIter addr_iter;
+ GDBusProxy *dev;
+ char *str;
+ bool le = !strcmp(interface, "org.bluez.Bearer.LE1");
+
+ dev = find_proxies_by_path(default_ctrl->devices,
+ g_dbus_proxy_get_path(proxy));
+ if (!dev)
+ return;
+
+ if (g_dbus_proxy_get_property(dev, "Address",
+ &addr_iter)) {
+ const char *address;
+
+ dbus_message_iter_get_basic(&addr_iter,
+ &address);
+ str = g_strdup_printf("[" COLORED_CHG
+ "] %s %s ",
+ le ? "LE" : "BREDR",
+ address);
+ } else
+ str = g_strdup("");
+
+ print_iter(str, name, iter);
+ g_free(str);
+ }
}
}
@@ -753,14 +850,17 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
return NULL;
}
-static GDBusProxy *find_proxies_by_path(GList *source, const char *path)
+static GDBusProxy *find_proxies_by_iface(GList *source, const char *path,
+ const char *iface)
{
GList *list;
for (list = g_list_first(source); list; list = g_list_next(list)) {
GDBusProxy *proxy = list->data;
- if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
+ if (!strcmp(g_dbus_proxy_get_path(proxy), path) &&
+ !strcmp(g_dbus_proxy_get_interface(proxy),
+ iface))
return proxy;
}
@@ -1728,6 +1828,7 @@ static void cmd_info(int argc, char *argv[])
{
GDBusProxy *proxy;
GDBusProxy *battery_proxy;
+ GDBusProxy *bearer;
DBusMessageIter iter;
const char *address;
@@ -1779,6 +1880,25 @@ static void cmd_info(int argc, char *argv[])
print_property_with_label(battery_proxy, "Percentage",
"Battery Percentage");
+ bearer = find_proxies_by_iface(default_ctrl->bearers,
+ g_dbus_proxy_get_path(proxy),
+ "org.bluez.Bearer.BREDR1");
+ if (bearer) {
+ print_property_with_label(proxy, "Paired", "BREDR.Paired");
+ print_property_with_label(proxy, "Bonded", "BREDR.Bonded");
+ print_property_with_label(proxy, "Connected",
+ "BREDR.Connected");
+ }
+
+ bearer = find_proxies_by_iface(default_ctrl->bearers,
+ g_dbus_proxy_get_path(proxy),
+ "org.bluez.Bearer.LE1");
+ if (bearer) {
+ print_property_with_label(proxy, "Paired", "LE.Paired");
+ print_property_with_label(proxy, "Bonded", "LE.Bonded");
+ print_property_with_label(proxy, "Connected", "LE.Connected");
+ }
+
return bt_shell_noninteractive_quit(EXIT_SUCCESS);
}
--
2.50.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ v2 5/5] client: Rework handling of Disconnected signal
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
` (2 preceding siblings ...)
2025-07-14 20:35 ` [PATCH BlueZ v2 4/5] client: Add support for org.bluez.Bearer.{BREDR, LE}1 Luiz Augusto von Dentz
@ 2025-07-14 20:35 ` Luiz Augusto von Dentz
2025-07-14 22:00 ` [BlueZ,v2,1/5] device: Add btd_device_bdaddr_type_connected bluez.test.bot
2025-07-15 18:30 ` [PATCH BlueZ v2 1/5] " patchwork-bot+bluetooth
5 siblings, 0 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2025-07-14 20:35 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Print with color the signal to indicate there is a change, also rework
the order of the parameters and use bearer specific suffix if the signal
comes from org.bluez.Bearer.*.
---
client/main.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/client/main.c b/client/main.c
index 09df7b37c46f..0a928efaa9bb 100644
--- a/client/main.c
+++ b/client/main.c
@@ -806,7 +806,11 @@ static void property_changed(GDBusProxy *proxy, const char *name,
static void message_handler(DBusConnection *connection,
DBusMessage *message, void *user_data)
{
- if (!strcmp(dbus_message_get_member(message), "Disconnected")) {
+ const char *iface = dbus_message_get_interface(message);
+ const char *member = dbus_message_get_member(message);
+
+ if (!strcmp(member, "Disconnected")) {
+ const char *label;
const char *name;
const char *msg;
@@ -816,16 +820,22 @@ static void message_handler(DBusConnection *connection,
DBUS_TYPE_INVALID))
goto failed;
- bt_shell_printf("[SIGNAL] %s.%s %s %s\n",
- dbus_message_get_interface(message),
- dbus_message_get_member(message),
- name, msg);
+ if (!strcmp(iface, "org.bluez.Bearer.BREDR1"))
+ label = "BREDR.Disconnected";
+ else if (!strcmp(iface, "org.bluez.Bearer.LE1"))
+ label = "LE.Disconnected";
+ else
+ label = "Disconnected";
+
+ bt_shell_printf("[" COLOR_YELLOW "SIGNAL" COLOR_OFF"] "
+ "%s - %s, %s\n",
+ label, name, msg);
return;
}
failed:
- bt_shell_printf("[SIGNAL] %s.%s\n", dbus_message_get_interface(message),
- dbus_message_get_member(message));
+ bt_shell_printf("[" COLOR_YELLOW "SIGNAL" COLOR_OFF"] %s.%s\n",
+ iface, member);
}
static struct adapter *find_ctrl_by_address(GList *source, const char *address)
--
2.50.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* RE: [BlueZ,v2,1/5] device: Add btd_device_bdaddr_type_connected
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
` (3 preceding siblings ...)
2025-07-14 20:35 ` [PATCH BlueZ v2 5/5] client: Rework handling of Disconnected signal Luiz Augusto von Dentz
@ 2025-07-14 22:00 ` bluez.test.bot
2025-07-15 18:30 ` [PATCH BlueZ v2 1/5] " patchwork-bot+bluetooth
5 siblings, 0 replies; 7+ messages in thread
From: bluez.test.bot @ 2025-07-14 22:00 UTC (permalink / raw)
To: linux-bluetooth, luiz.dentz
[-- Attachment #1: Type: text/plain, Size: 1261 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=982213
---Test result---
Test Summary:
CheckPatch PENDING 0.30 seconds
GitLint PENDING 0.33 seconds
BuildEll PASS 20.15 seconds
BluezMake PASS 2519.77 seconds
MakeCheck PASS 19.97 seconds
MakeDistcheck PASS 183.84 seconds
CheckValgrind PASS 236.40 seconds
CheckSmatch PASS 306.15 seconds
bluezmakeextell PASS 127.83 seconds
IncrementalBuild PENDING 0.27 seconds
ScanBuild PASS 908.01 seconds
Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:
##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
` (4 preceding siblings ...)
2025-07-14 22:00 ` [BlueZ,v2,1/5] device: Add btd_device_bdaddr_type_connected bluez.test.bot
@ 2025-07-15 18:30 ` patchwork-bot+bluetooth
5 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+bluetooth @ 2025-07-15 18:30 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hello:
This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:
On Mon, 14 Jul 2025 16:35:15 -0400 you wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds btd_device_bdaddr_type_connected which can return the
> connected state based on the address type.
> ---
> src/device.c | 8 ++++++++
> src/device.h | 1 +
> 2 files changed, 9 insertions(+)
Here is the summary with links:
- [BlueZ,v2,1/5] device: Add btd_device_bdaddr_type_connected
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=f406028b5d2e
- [BlueZ,v2,2/5] doc: Add org.bluez.Bearer.LE and org.bluez.Bearer.BREDR
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=8c8b5ed25a88
- [BlueZ,v2,3/5] bearer: Add initial implementation of org.bluez.Bearer.{BREDR, LE}
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=fdfaeddc9c71
- [BlueZ,v2,4/5] client: Add support for org.bluez.Bearer.{BREDR, LE}1
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=f4f8fe3e4813
- [BlueZ,v2,5/5] client: Rework handling of Disconnected signal
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=4c431e5dae3e
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-07-15 18:29 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-14 20:35 [PATCH BlueZ v2 1/5] device: Add btd_device_bdaddr_type_connected Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 2/5] doc: Add org.bluez.Bearer.LE and org.bluez.Bearer.BREDR Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 3/5] bearer: Add initial implementation of org.bluez.Bearer.{BREDR, LE} Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 4/5] client: Add support for org.bluez.Bearer.{BREDR, LE}1 Luiz Augusto von Dentz
2025-07-14 20:35 ` [PATCH BlueZ v2 5/5] client: Rework handling of Disconnected signal Luiz Augusto von Dentz
2025-07-14 22:00 ` [BlueZ,v2,1/5] device: Add btd_device_bdaddr_type_connected bluez.test.bot
2025-07-15 18:30 ` [PATCH BlueZ v2 1/5] " patchwork-bot+bluetooth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox