From patchwork Wed Feb 26 18:11:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 13992913 Received: from mail-vk1-f174.google.com (mail-vk1-f174.google.com [209.85.221.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ACEC3221DAA for ; Wed, 26 Feb 2025 18:11:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593498; cv=none; b=JKJV9fCjcLyGmDpHezmqsb6Co9laqvVIIBKvamw93rOR5Wrjc1aZqzuDX6I8V9m2jzRcPkki7vZBm1ys2eEVNvxezF1cXXA1MXheLMml7qEGKUZdoLxsJBzPpCtw12rMH/8xg26UlVf/o1Tuk8uDP4adFCXCX0DzuBy+86caU3k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593498; c=relaxed/simple; bh=u4D2ysouWFu5bTZIUpNIs3fhNumzbXtmogCIuiOZa5Y=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=h7mhJ5DADjrN/Whx+MNhClxSExUw7xGW1ZuZivZC74hWdt3ZQ+VnfIrx7+flF4SU5kzXiqwLLOqhepnZfTgXcP3WQCh0oUQhAGCu2vMI8WNOODLi51gLsIkJJZouLV/YjUIQLlDDl6w27wNN4/3IN0tG+YpQSjuiIOONE8ICX0k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GDYh2lHd; arc=none smtp.client-ip=209.85.221.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GDYh2lHd" Received: by mail-vk1-f174.google.com with SMTP id 71dfb90a1353d-52099627b5aso88491e0c.1 for ; Wed, 26 Feb 2025 10:11:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740593494; x=1741198294; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=DtVsiCTPXcLKZohphQdspl/F7ltUoceFtEFau8xmyg8=; b=GDYh2lHdKCqJZiRYLVband5puz2Wq3kFUjZEj1qeVHpS8tnVBdB8cmvRh+JmY9rFim AgulzpM6nBEv8C6x3cKAk3lL/JhxvU28ng0QTeIBMdIdKZxyn6eZ2UpFoT/QIJp9eUMk lPPDN97PAUbLMmmmQblmXJhJNWeNfG9MkXarJYuwwYM52UW2W2U30TDPygNTKhOhZiz6 G0MaV8Qt32nE0rNpa2KGaLSDDTiS9z3BQgqhwBDwh84ebPAOBYCp9HGxaLg9PLnxa0CO pREPa+35R80A9qCfFEhetTOOmdwOnyP+rTqomiZ4O14Thb8g50O5JGB2WDT/moZVeP34 KRwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740593494; x=1741198294; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=DtVsiCTPXcLKZohphQdspl/F7ltUoceFtEFau8xmyg8=; b=CQ4rm13gbJw/so+CP+BfQGmIdayB6FRxF9EI54gYohv7wEImtQli2vEyPMVeH83zS9 dDZy4axl9VbEU/SlV4XCL3X8Bk66swRZAHVYgzy49aD45zcRsv0b/qBkOQtOogmR229w ktFi/vF27iJXzSp4tSIEQxydOyrUqPV7a/KeFawlYP/PJbCllGwhWq592becynvT5OPu Js2kP05ripYSE3TK/IvIChz21yDS3R5grt4zv3sHYhoQ0shpgOOcn7jDikdrommjQyyQ cBZ9K6ziL/S6WoA0rt8vB63zMTU+hk28WTkgYm041IEZZBvxIftPMZSDO823DpytKsXl AAXg== X-Gm-Message-State: AOJu0Yy1qcnDQz3+o8cRTchc6MOblnjIVSUiu7yphod+X9o3837sv6XI TppuWTe2bJFOzzbMRnR/DLMmE7bHQ0djYPEX5G/5tKsCpsJniTWUQx93JWti X-Gm-Gg: ASbGnctCxGFgQCnziWeX32iu6Xl8NgpTchTiW5ZnKaojeiS7YThNOK154qLOo7fxe9E XJtsCjGew4hJZii0GLmGRk4BAw6qkk3nYpNY10W5xfuoDRDDVxkc+InnJpEBTVnw01IMwBAw2zp C2GRIo3L+gCxM9eDIS+S0ZtcGs4MgY7WgTRiLpN5HLd5oXEVA682hhtbXzPDyeDRkS8QV4onSEr YnoNlx84Bdde1vXw5KlfzJIicm73BGZjIlk0lJ7BNEwg3Lr/G4ZzX6BriL4PAu/zgYgDwpNoYih 4Ar3DynJ6jGu5L0DIX01UTSFQgfpuqLtqu0JpuEO92Rrf5rqPVY3oUYsVPrqzfkKm94pOkk= X-Google-Smtp-Source: AGHT+IHBL7e+Mm51CNt9pJm4FXKqDvyl2TBZ5757KUpFDSx1AcsjQIpfvuXJJXhTZ9t5cVoZ9g+3UA== X-Received: by 2002:a05:6122:3213:b0:520:a84c:1b59 with SMTP id 71dfb90a1353d-5234972a094mr325547e0c.5.1740593494134; Wed, 26 Feb 2025 10:11:34 -0800 (PST) Received: from lvondent-mobl5.. (syn-050-089-067-214.res.spectrum.com. [50.89.67.214]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-86b1ef052a6sm857744241.27.2025.02.26.10.11.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 10:11:31 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v3 1/4] org.bluez.Device: Introduced PreferredBearer Date: Wed, 26 Feb 2025 13:11:26 -0500 Message-ID: <20250226181129.2958079-1-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.48.1 Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luiz Augusto von Dentz This introduces PreferredBearer property which can be used to indicate what bearer shall be connected first rather than just using last seen bearer which may not work always since it seems some devices sometimes advertises on LE bearer but expects connections over BR/EDR e.g: https://github.com/bluez/bluez/issues/1092 Also with the introduction of LE Audio this might become even more of a problem since most likely users would like to select which bearer to use rather than using the last-seen policy. --- doc/org.bluez.Device.rst | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/doc/org.bluez.Device.rst b/doc/org.bluez.Device.rst index f8d4a68a6b41..13328249b0b0 100644 --- a/doc/org.bluez.Device.rst +++ b/doc/org.bluez.Device.rst @@ -40,7 +40,8 @@ void Connect() are skip and check latest seen bearer. 3. Connect last seen bearer, in case the timestamps are the same BR/EDR - takes precedence. + takes precedence, or in case **PreferredBearer** has been set to a + specific bearer then that is used instead. Possible errors: @@ -346,3 +347,29 @@ array{object, dict} Sets [readonly, experimental] :byte Rank: Rank of the device in the Set. + +string PreferredBearer [readwrite, optional, experimental] +`````````````````````````````````````````````````````````` + + Indicate the preferred bearer when initiating a connection, only + available for dual-mode devices. + + When changing from "bredr" to "le" the device will be removed from the + 'auto-connect' list so it won't automatically be connected when + adverting. + + Note: Changes only take effect when the device is disconnected. + + Possible values: + + :"last-seen": + + Connect to last seen bearer first. Default. + + :"bredr": + + Connect to BR/EDR first. + + :"le": + + Connect to LE first. From patchwork Wed Feb 26 18:11:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 13992914 Received: from mail-vk1-f181.google.com (mail-vk1-f181.google.com [209.85.221.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 07B83221DAA for ; Wed, 26 Feb 2025 18:11:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593500; cv=none; b=P1eZ9HwP/JWZI6Hn4NhzpVbMbrKY5ZMV+VaNhs4uqyxXul/vuK0M0FIfHk4YYaD5FTU6pZ8widvM2WVb+5mNCYq4iI01z2V9H+0GphDq49e6Yr4szUxfjLaRXTi5PU3OKX8bkDfHHWss5mI0M0imM1Rq3AiWtzVRMpU9YYPOUvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593500; c=relaxed/simple; bh=UM4LraNquXqIiw5KEQxKvAh1fdU10xFrkj3UAl3JWXY=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YI8UZotO5CEOZJe4tKO84IQfzMVWd5syIezi4cYTPPBfUUlrjlt7efz4Wfh9HF6iqUT35PatMfr1bwEXO0lIj8IkX+9b/+2YFE3MycpA8JtnK9tIybQE0Ft3Jlakwk5b5YW4k1EY2447WfL4omHKtr5SO5Z08qf8ayWhrG+2dfI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Hl0xS9NY; arc=none smtp.client-ip=209.85.221.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Hl0xS9NY" Received: by mail-vk1-f181.google.com with SMTP id 71dfb90a1353d-521b3ebb0f3so22165e0c.3 for ; Wed, 26 Feb 2025 10:11:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740593497; x=1741198297; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=tU+iSDsWWRst0jbrXq0PzBAipjCohQXsQ98Za+pHcEY=; b=Hl0xS9NY5EQ0IMy1uldlTPQowQmdudUkgrW02sYGgwNxZ0vWhjzBYfvmB2HsaYyEZe fP/rkKOyPIgvz/FJHBUD8lSI6KqmhSe5U9EZoGJIBR+0l3Fe3B3O3bIzq54gQfnyP2hN zXzC2alwSQrSkwrEMpHRC0P7KmCbR8IPfI3ewDBRcaAyR8UnMnD/qN1AoQf/H6dT/M0V WtN3tvQ9fNBTsBVCL+zVYexP5/NpJ92ksY2R3BtB2mm8iuOhfekUD1L00ikz3vjydz5A fvrBKCxLMNEUazj4AXdrWxOr5NtA9IPyIhuVh3ZewHGe8qpsThsBnztLHPcWAhA/yiJn wDZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740593497; x=1741198297; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tU+iSDsWWRst0jbrXq0PzBAipjCohQXsQ98Za+pHcEY=; b=NXBtjNoWrx2GahGKzJorFwa08M4985NJGj/NwALnxwz2ODIANzi/fghu46R+A2I7LQ tU0I7F36z5IuKBYDUK/NpupZYa640tqnFY/EnE/teYv84U9yv4QUHg1FOlU1xRb+lyZW Zmm5Dwj98BpbMv0IZzKqLBl7pKbPuKic86kGIgZeDs+BN43V456pxqS9CroBYSZdQUX2 7ZNAHOzNnFEnnxOn5p0vKRfF3J15xX+uR/cQqwKWUbfDx6eBfjORPjanoInPT9YyN52D SGESePxsK1ZXTihwGjPRql2qNOLV0LKL38V5dEHrNsUyYeb5P5pVgyFOdqaD7eZ39sbF gJUg== X-Gm-Message-State: AOJu0YwIR4Kn2dKfRTTMH1tA7PJTkKotZ26WttZfA3evQA6DHfgBRcGG xQSs0KJzTwExdk1eRsmk2MBuPWGmRdIrScxYDJGSUeID+e+gbO9hnJPJ00z3 X-Gm-Gg: ASbGncsNyS0DBS8Ar0NGQClcVynFembPSE7o+prY2i7IYPJUSpVPs6ZDgFlJGn/qsVe Jk2e+mMp3hOTSPnooih0C+aGuP06nAk118CnGp6wykulK2ppYNxAJs5intAkKVd9D5d7vW+LsPU 2Mg2Tvc8hiSyWst3TtaXOvgkLGaDq6udSLj9Hs9pQFCcM5LshVo19851qjsPunSA4dcA2LiS8I8 n2tilyhr4mpfHwX4fC4xE1H1JI99Pb4Tct2YAhoOX2hLiIvWHomJTx+Feuq7VWm7rjJHiVgmyCE ppUEIpNqG+szAW2IY0Tglu2TqJ9xmDTYpEss6ZBNOm7QewZ3EOk7Srw3v+sY6w0YcLCsPYE= X-Google-Smtp-Source: AGHT+IGMQFoNBOddF3dqYZS7UQ32QD+6tZq9P3fczmqIh9kt83INESazm9lPqUr1c5pe7G80HycT4Q== X-Received: by 2002:a05:6122:828a:b0:520:6773:e5ca with SMTP id 71dfb90a1353d-5224ccd522bmr2569064e0c.6.1740593497164; Wed, 26 Feb 2025 10:11:37 -0800 (PST) Received: from lvondent-mobl5.. (syn-050-089-067-214.res.spectrum.com. [50.89.67.214]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-86b1ef052a6sm857744241.27.2025.02.26.10.11.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 10:11:35 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v3 2/4] device: Add implementation of PreferredBearer Date: Wed, 26 Feb 2025 13:11:27 -0500 Message-ID: <20250226181129.2958079-2-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226181129.2958079-1-luiz.dentz@gmail.com> References: <20250226181129.2958079-1-luiz.dentz@gmail.com> Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luiz Augusto von Dentz This adds initial implementation of PreferredBearer. --- src/device.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/src/device.c b/src/device.c index ec97fc889056..de92e68d2780 100644 --- a/src/device.c +++ b/src/device.c @@ -152,6 +152,7 @@ struct svc_callback { /* Per-bearer (LE or BR/EDR) device state */ struct bearer_state { + bool prefer; bool paired; bool bonded; bool connected; @@ -2543,10 +2544,12 @@ static uint8_t select_conn_bearer(struct btd_device *dev) time_t bredr_last = NVAL_TIME, le_last = NVAL_TIME; time_t current = time(NULL); - /* Prefer bonded bearer in case only one is bonded */ - if (dev->bredr_state.bonded && !dev->le_state.bonded ) + /* Use preferred bearer or bonded bearer in case only one is bonded */ + if (dev->bredr_state.prefer || + (dev->bredr_state.bonded && !dev->le_state.bonded)) return BDADDR_BREDR; - else if (!dev->bredr_state.bonded && dev->le_state.bonded) + else if (dev->le_state.prefer || + (!dev->bredr_state.bonded && dev->le_state.bonded)) return dev->bdaddr_type; /* If the address is random it can only be connected over LE */ @@ -3340,6 +3343,92 @@ static const GDBusMethodTable device_methods[] = { { } }; +static const char *device_prefer_bearer_str(struct btd_device *device) +{ + if (device->bredr_state.prefer) + return "bredr"; + else if (device->le_state.prefer) + return "le"; + else + return "last-seen"; +} + +static gboolean +dev_property_get_prefer_bearer(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct btd_device *device = data; + const char *str = device_prefer_bearer_str(device); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str); + + return TRUE; +} + +static void +dev_property_set_prefer_bearer(const GDBusPropertyTable *property, + DBusMessageIter *value, + GDBusPendingPropertySet id, void *data) +{ + struct btd_device *device = data; + const char *str; + + if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING) { + g_dbus_pending_property_error(id, + ERROR_INTERFACE ".InvalidArguments", + "Invalid arguments in method call"); + return; + } + + dbus_message_iter_get_basic(value, &str); + + if (!strcasecmp(device_prefer_bearer_str(device), str)) + goto done; + + if (!strcasecmp(str, "last-seen")) { + device->bredr_state.prefer = false; + device->le_state.prefer = false; + } else if (!strcasecmp(str, "bredr")) { + device->bredr_state.prefer = true; + device->le_state.prefer = false; + /* Remove device from auto-connect list so the kernel does not + * attempt to auto-connect to it in case it starts advertising. + */ + device_set_auto_connect(device, FALSE); + } else if (!strcasecmp(str, "le")) { + device->le_state.prefer = true; + device->bredr_state.prefer = false; + /* Add device to auto-connect list */ + device_set_auto_connect(device, TRUE); + } else { + g_dbus_pending_property_error(id, + ERROR_INTERFACE ".InvalidArguments", + "Invalid arguments in method call"); + return; + } + + g_dbus_emit_property_changed(dbus_conn, device->path, + DEVICE_INTERFACE, "PreferredBearer"); + +done: + g_dbus_pending_property_success(id); +} + +static gboolean +dev_property_prefer_bearer_exists(const GDBusPropertyTable *property, + void *data) +{ + struct btd_device *device = data; + + /* Check if both BR/EDR and LE bearer are connected/bonded */ + if ((device->bredr_state.connected || device->bredr_state.bonded) && + (device->le_state.connected || device->le_state.bonded)) + return TRUE; + + /* Check if both BR/EDR and LE are connectable */ + return device->bredr_state.connectable && device->le_state.connectable; +} + static const GDBusPropertyTable device_properties[] = { { "Address", "s", dev_property_get_address }, { "AddressType", "s", property_get_address_type }, @@ -3378,6 +3467,10 @@ static const GDBusPropertyTable device_properties[] = { dev_property_wake_allowed_exist }, { "Sets", "a{oa{sv}}", dev_property_get_set, NULL, dev_property_set_exists }, + { "PreferredBearer", "s", dev_property_get_prefer_bearer, + dev_property_set_prefer_bearer, + dev_property_prefer_bearer_exists, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, { } }; From patchwork Wed Feb 26 18:11:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 13992915 Received: from mail-vs1-f50.google.com (mail-vs1-f50.google.com [209.85.217.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD61422F163 for ; Wed, 26 Feb 2025 18:11:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593504; cv=none; b=IkBpILCskG8ypyhfYh5PQiidnrwkxLUamti6xebYwxEWDGaPdQDVnIcmqxV0EHPFaWFV7W6L8HRVeaVp5q7uVoYbXtiNJlqL/h5TDhTPhAxxq0ziGCRQy3GeczTlGLVCtPAbZYDPnKViJfpuWt7WbMVJSuid8+j/+70TvNI9qIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593504; c=relaxed/simple; bh=E+J/gJDBllzgbPg2jXiGzP4lQt8++u2b00nKG6/ZWcw=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pjBMBQr1DnYpJWKCsVizlO6scqIDfm4xDrPsW8gFJhcvjtjC7flMxsvIugo+uFr254rTxAyxqc+3R+4CSoYJJ1WppN2Nu4dRY82zpPb+dlyl5ZYtzG2HyeSC/2HudAYoCP7YAFnl4dgU5E76K6VlTTFkPKB1jgFQ+weFEhoSrLE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PfwNpCpJ; arc=none smtp.client-ip=209.85.217.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PfwNpCpJ" Received: by mail-vs1-f50.google.com with SMTP id ada2fe7eead31-4be4d72bceaso34961137.1 for ; Wed, 26 Feb 2025 10:11:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740593501; x=1741198301; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=SvKrfYWbmyHXvv9pqahfsRLswqJ46HGYbtz5HENIf3U=; b=PfwNpCpJNeNM36i3DW1qlZXs/8JNpnL+guWBXTzsejUxf9Yzy17WjS4fNxOvtvJKre UERBV+OBU6KQO4nLYQVvzUacWJk5qAthnKtR5Vq9UzqiQzM6iijy3PPqDaHxYd+J+D2j Mm1bcBvcDEWuWMzwh4KxPnviAFLLdoM4Nn3vPjgjfFdNo1hL7cVaUOXncs6EcVBVlWyf SYxmF6FhN7xHGICyzABfqyV4EQTWkN8vOA1WcLpfD/7Th8ft4BrdxleybwiYYff0Wk0T bgueQb6VnIZ+JLuV2qc21tJ8v3KgMMyVVOkj/DGXt+nETEO+ujRm/v/TTwdIWDsDuvsG JWRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740593501; x=1741198301; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SvKrfYWbmyHXvv9pqahfsRLswqJ46HGYbtz5HENIf3U=; b=FHPkZUgiGCO38Qa4wDDnxzebfW5xhyewg7pxPwvhOmA2DTuNz/9L74ktXQbjpFT90P qg3fz9L5Etih4XRKVGSTYF3CCsbYLHNZaNss/3inF4ZOkdFTzjlSzqfzVzNgA0h1Oxzm MCVtrQBHSfjLg+9fVr9FypjB5Xq2s/QR44HyVUcdBdtnirhWChkRhKuo+aMSIPQzxCs7 k3IJR95V0iIBLdczi1RducBHCy4nrBybbnqYYraCKUIg4R9J7XzAOfcuXfFbWeoZPFgs gIIxCFZwXlQ+DMfpTlmxMDXuycDNH3DqTzZ7Eof2VxXGKZ5uBwTP/86EmZ8ny4x5tJOn 7UGQ== X-Gm-Message-State: AOJu0YyZTkksCq4N46NCNgDTUYUsDvLRJxLzDkcSLz5nQYa4Yy/motBM W3EJyRMKUSPrbGJN4PxdFgSkFa01DYb7NCC+hqON5qGgwH1TK4LH0AetL7xe X-Gm-Gg: ASbGncst9TEKtACdfzEEXi0djb2ppYPxLkL8ssYV7CEVdYprQmw7yM7tuPPKJ2K1SEF gvvWepapIRYrtxvtQ0jeCXj2XDVUSgq4GKEsjIlTN7E5aGJM4kQjhHf4SsTTz8+pQvTuXj0b/fu z9oOhgvfG3O3F5bgd683VQZCqNtqea5PGNHXJHceGFPb5EaweMrmUS2iIIpO63Uk9IkRXkKBCqi wHI3aVkDeOocmWM700STnERS9jHJmdj3dfovEuq4V7jUxY89byVID/DisTqzcyergh6lmAwrK0t kdCAcqmyttxss2hZ7X2UiSaVEY0UYwiYHWjBwV6PLMb30o7FE312263/+Wiy79yea/6RDs4= X-Google-Smtp-Source: AGHT+IEOrCIuk5J+2HpzoWNShtUKHGRFr5llb/KN0CAbXkNb2znW3qSWSMvHr5/exNyWa0VrPBlCIw== X-Received: by 2002:a05:6102:2b85:b0:4bb:e6bc:e164 with SMTP id ada2fe7eead31-4c00ae76dd5mr5911891137.25.1740593500823; Wed, 26 Feb 2025 10:11:40 -0800 (PST) Received: from lvondent-mobl5.. (syn-050-089-067-214.res.spectrum.com. [50.89.67.214]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-86b1ef052a6sm857744241.27.2025.02.26.10.11.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 10:11:39 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v3 3/4] client: Add support get/set PreferredBearer Date: Wed, 26 Feb 2025 13:11:28 -0500 Message-ID: <20250226181129.2958079-3-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226181129.2958079-1-luiz.dentz@gmail.com> References: <20250226181129.2958079-1-luiz.dentz@gmail.com> Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luiz Augusto von Dentz This adds support for PreferredBearer which is printed with the likes of info command: bluetoothctl> info ... PreferredBearer: last-seen It also introduces a new command to get/set the PreferredBearer: [bluetoothctl]> bearer --help Get/Set preferred bearer Usage: bearer [last-seen/bredr/le] [bluetoothctl]> bearer PreferredBearer: last-seen [bluetoothctl]> bearer le bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8 LE Address: Action: Auto-connect remote device (0x02) [CHG] Device PreferredBearer: le Changing le succeeded [bluetoothctl]> bearer PreferredBearer: le [bluetoothctl]> bearer bredr bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7 LE Address: [CHG] Device PreferredBearer: bredr Changing bredr succeeded --- client/bluetoothctl.rst | 17 +++++++++++++++++ client/main.c | 27 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/client/bluetoothctl.rst b/client/bluetoothctl.rst index b6c2efa351d8..106ed971a59f 100644 --- a/client/bluetoothctl.rst +++ b/client/bluetoothctl.rst @@ -288,6 +288,23 @@ Device information. :Usage: **> info ** +bearer +------ + +Get/Set preferred bearer. + +:Usage: **> bearer [last-seen/bredr/le]** +:Example get preferred bearer: + | > bearer + | PreferredBearer: last-seen +:Example set preferred bearer to LE: + | > bearer le + | [CHG] Device PreferredBearer: le + | Changing le succeeded +:Example set preferred bearer to BREDR: + | > bearer bredr + | [CHG] Device PreferredBearer: bredr + | Changing bredr succeeded Advertise Submenu ================= diff --git a/client/main.c b/client/main.c index feb21a1163d2..76c9bc329c96 100644 --- a/client/main.c +++ b/client/main.c @@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[]) print_property(proxy, "AdvertisingFlags"); print_property(proxy, "AdvertisingData"); print_property(proxy, "Sets"); + print_property(proxy, "PreferredBearer"); battery_proxy = find_proxies_by_path(battery_proxies, g_dbus_proxy_get_path(proxy)); @@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[]) return bt_shell_noninteractive_quit(EXIT_FAILURE); } +static void cmd_bearer(int argc, char *argv[]) +{ + GDBusProxy *proxy; + char *str; + + proxy = find_device(argc, argv); + if (!proxy) + return bt_shell_noninteractive_quit(EXIT_FAILURE); + + if (argc <= 2) { + print_property(proxy, "PreferredBearer"); + return; + } + + str = strdup(argv[2]); + + if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer", + DBUS_TYPE_STRING, &str, + generic_callback, str, free)) + return; + + return bt_shell_noninteractive_quit(EXIT_FAILURE); +} + static void cmd_list_attributes(int argc, char *argv[]) { GDBusProxy *proxy; @@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = { dev_generator }, { "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support", dev_generator }, + { "bearer", " [last-seen/bredr/le]", cmd_bearer, + "Get/Set preferred bearer", dev_generator }, { } }, }; From patchwork Wed Feb 26 18:11:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 13992916 Received: from mail-vs1-f46.google.com (mail-vs1-f46.google.com [209.85.217.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2559D22F163 for ; Wed, 26 Feb 2025 18:11:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593507; cv=none; b=MJiEjMHVug5vt3spBQUbg/kT339HjxAHrvnx0yn8GIcYM1NrQe9N5XnYQNXVw2gXGp8BN8caCSoMD726Rq2ICCMAQ2aTFrP32H9VaLza/sq8XlSD4Ii+8QaX7R4xRyvlV+PflzpGNeeAe60FMUuvZZ9DIMNnU+WsNoEWVJjzpwA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740593507; c=relaxed/simple; bh=4DWOG/7vaA0lA92dINcbsX6inqNXR5xkFYj0PWRSVIQ=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zu8Sl3RHoNjHyoaScTmmLcdSwFVnciozEZ4+/VuQABfqJk4geGFfyaCrpr8p+HshHScby3jDumNpvJHdKdME7bvlen9EWX6qYDbw+1cH6yW5nfBoAkggNT+A+Ar8yp1b0zf6QQ4CMZDEcubFfH4U8DpdVGXiCg+JZKMSc+3Z0uo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Dhwzab40; arc=none smtp.client-ip=209.85.217.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Dhwzab40" Received: by mail-vs1-f46.google.com with SMTP id ada2fe7eead31-4bd3a8b88f3so71425137.0 for ; Wed, 26 Feb 2025 10:11:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740593504; x=1741198304; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=rMFkHd1q6uurURxgZwux7q4Uho1ru3VqXOk3BkRMwEM=; b=Dhwzab40h6gaf+UsA9L4w0AF2H8Vg+xGrXTzZL8dle8NguCYfb6F470dt+U2AzYmZb B1RjnxAz/yijsETtkPT7jIMh2CJ8kCkft7JBugu0P1Fzgugplg+nmIro6QwjlwllLOuE GMSFSdN1NVHcbqB6gdg05xVE7S3sOdh02u3fywMN+nTKuIQK8Z3bBUMXrzSdkaB+bEjz aLYMwK/rfH8DvVZv8UMqkQZ8QruQtQ2maFbIAPlvB2AQzrejN+d+0kOr66FHcK4rwYrv uZAwBqreWzumIoVJBtuuEOxHKCWRdBVmFiKGkqc8xfccAT6oeGXnLxSN5QK9HVCPvu/0 IINg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740593504; x=1741198304; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rMFkHd1q6uurURxgZwux7q4Uho1ru3VqXOk3BkRMwEM=; b=qYop2f+7vk4UfJdGFG7CZ7AP1o6/Gvyj0cmo0450wq7WpEfhGsexJJh4A6DkQUzxkA PFTYmEjC1TftI5jqdfmKizH1WMtf59NWHPPCA3FSJmu4tMBDuiSI41PnJsLXW0/PUxe8 5HzvqbjArXmyOEWGzMgqxlezXVCMa1K+4YpsWxqc1n9Lfy2pKhWITE4iSoeGCLx55O0v mqF7RB4nEQKzFL8BpAEajsC3YhD4niaUswgxo1ObGNgY/qsBZmA5XMoR1cnbOxFtjGsM FsBf7pznAk/n9XtASu+HWcIDngea/t8iUVbxeiMNQlJ2gunMabjzxzYyfju+pQWSzvjJ zaRQ== X-Gm-Message-State: AOJu0Yw9EWkJ0gDALFBxnz3QHRkf8AXD4Jc6IiGGKL1GayE4zIMTED3Q qpc7QW1MiDNLkzLawZ/I/BWz4hQRmWU9LaJtTGiY/vWw4dTReS5OKruhJUVx X-Gm-Gg: ASbGncsCkQBc+CsNpHJMDVc7ttDCMeAScxnVP1FGFTEb5j7raeL4jp0JTF3cqiZI+z3 7LS6m/u2FCIVbuQtnqGkRVhKEXbphxNNhmr9Wv9uwQw5+195qIz88J3sYfuG6ObOnMUAsAILYaD N/d2M3sywDaSvRuQd/YpLcbQZIJXm9oxCSm3UQE6dHTZMXYQKqfG5gz3ICJ7G1C5/5nkt7017FI Nr+yjCIegM4MuP0Wb6gaAWaKZ8AUH4H1NqA/IDKbG7py0uxQgEdunDOYzJowd2gY6WpYdjhayI8 gmgpe8yZN5eWCAQzPuSi54VH3mQkToyp0j9I2LopeG0HTxdDVnB+clE9qCBxnfv2mphQvPM= X-Google-Smtp-Source: AGHT+IEZWTm5IJlggfSM24nLJ/c4n/eWB3uVtMelPlurgYxKqEQ5S8m5X/WDtZpHUGFrcYZHmLHrfA== X-Received: by 2002:a05:6102:32d2:b0:4bb:d64d:8331 with SMTP id ada2fe7eead31-4c01e1ef3cemr3310172137.11.1740593504278; Wed, 26 Feb 2025 10:11:44 -0800 (PST) Received: from lvondent-mobl5.. (syn-050-089-067-214.res.spectrum.com. [50.89.67.214]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-86b1ef052a6sm857744241.27.2025.02.26.10.11.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 10:11:42 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v3 4/4] storage: Add support for storing PreferredBearer Date: Wed, 26 Feb 2025 13:11:29 -0500 Message-ID: <20250226181129.2958079-4-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250226181129.2958079-1-luiz.dentz@gmail.com> References: <20250226181129.2958079-1-luiz.dentz@gmail.com> Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luiz Augusto von Dentz This adds support for storing PreferredBearer into device info file. --- doc/settings-storage.txt | 2 ++ src/device.c | 66 +++++++++++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/doc/settings-storage.txt b/doc/settings-storage.txt index 178e7d07bf11..4e9881eedf02 100644 --- a/doc/settings-storage.txt +++ b/doc/settings-storage.txt @@ -293,6 +293,8 @@ Long term key) related to a remote device. strings remote in 128-bits UUID format, separated by ";" + PreferredBearer String Preferred bearer for remote device + [DeviceID] group contains: diff --git a/src/device.c b/src/device.c index de92e68d2780..9219eb674f87 100644 --- a/src/device.c +++ b/src/device.c @@ -368,10 +368,25 @@ static GSList *find_service_with_uuid(GSList *list, char *uuid) return NULL; } +static const char *device_prefer_bearer_str(struct btd_device *device) +{ + /* Check if both BR/EDR and LE bearer are supported */ + if (!device->bredr || !device->le) + return NULL; + + if (device->bredr_state.prefer) + return "bredr"; + else if (device->le_state.prefer) + return "le"; + else + return "last-seen"; +} + static void update_technologies(GKeyFile *file, struct btd_device *dev) { const char *list[2]; size_t len = 0; + const char *bearer; if (dev->bredr) list[len++] = "BR/EDR"; @@ -391,6 +406,12 @@ static void update_technologies(GKeyFile *file, struct btd_device *dev) g_key_file_set_string_list(file, "General", "SupportedTechnologies", list, len); + + /* Store the PreferredBearer in case of dual-mode devices */ + bearer = device_prefer_bearer_str(dev); + if (bearer) + g_key_file_set_string(file, "General", "PreferredBearer", + bearer); } static void store_csrk(struct csrk_info *csrk, GKeyFile *key_file, @@ -2080,6 +2101,7 @@ bool btd_device_add_set(struct btd_device *device, bool encrypted, static void device_set_auto_connect(struct btd_device *device, gboolean enable) { char addr[18]; + const char *bearer; if (!device || !device->le || device_address_is_private(device)) return; @@ -2100,6 +2122,11 @@ static void device_set_auto_connect(struct btd_device *device, gboolean enable) return; } + /* Inhibit auto connect if BR/EDR bearer is preferred */ + bearer = device_prefer_bearer_str(device); + if (bearer && !strcasecmp(bearer, "bredr")) + return; + /* Enabling auto connect */ adapter_auto_connect_add(device->adapter, device); @@ -3343,16 +3370,6 @@ static const GDBusMethodTable device_methods[] = { { } }; -static const char *device_prefer_bearer_str(struct btd_device *device) -{ - if (device->bredr_state.prefer) - return "bredr"; - else if (device->le_state.prefer) - return "le"; - else - return "last-seen"; -} - static gboolean dev_property_get_prefer_bearer(const GDBusPropertyTable *property, DBusMessageIter *iter, void *data) @@ -3382,6 +3399,7 @@ dev_property_set_prefer_bearer(const GDBusPropertyTable *property, dbus_message_iter_get_basic(value, &str); + /* Check if current preferred bearer is the same */ if (!strcasecmp(device_prefer_bearer_str(device), str)) goto done; @@ -3407,6 +3425,8 @@ dev_property_set_prefer_bearer(const GDBusPropertyTable *property, return; } + store_device_info(device); + g_dbus_emit_property_changed(dbus_conn, device->path, DEVICE_INTERFACE, "PreferredBearer"); @@ -3420,13 +3440,7 @@ dev_property_prefer_bearer_exists(const GDBusPropertyTable *property, { struct btd_device *device = data; - /* Check if both BR/EDR and LE bearer are connected/bonded */ - if ((device->bredr_state.connected || device->bredr_state.bonded) && - (device->le_state.connected || device->le_state.bonded)) - return TRUE; - - /* Check if both BR/EDR and LE are connectable */ - return device->bredr_state.connectable && device->le_state.connectable; + return device_prefer_bearer_str(device) != NULL; } static const GDBusPropertyTable device_properties[] = { @@ -3996,6 +4010,24 @@ static void load_info(struct btd_device *device, const char *local, g_strfreev(techno); + /* Load preferred bearer */ + str = g_key_file_get_string(key_file, "General", "PreferredBearer", + NULL); + if (str) { + if (!strcasecmp(str, "last-seen")) { + device->bredr_state.prefer = false; + device->le_state.prefer = false; + } else if (!strcasecmp(str, "bredr")) { + device->bredr_state.prefer = true; + device->le_state.prefer = false; + } else if (!strcasecmp(str, "le")) { + device->le_state.prefer = true; + device->bredr_state.prefer = false; + } + + g_free(str); + } + next: /* Load trust */ device->trusted = g_key_file_get_boolean(key_file, "General",