From patchwork Thu Oct 29 21:23:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 99659C2D0A3 for ; Thu, 29 Oct 2020 21:23:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 323A720838 for ; Thu, 29 Oct 2020 21:23:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PNjemyS6" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726320AbgJ2VXs (ORCPT ); Thu, 29 Oct 2020 17:23:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725948AbgJ2VXr (ORCPT ); Thu, 29 Oct 2020 17:23:47 -0400 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BB2F1C0613CF for ; Thu, 29 Oct 2020 14:23:47 -0700 (PDT) Received: by mail-qk1-x74a.google.com with SMTP id x85so2632602qka.14 for ; Thu, 29 Oct 2020 14:23:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=txKoRgXFpX5OkMoNQV35XeQq+co/kJjUR3niRDei33Q=; b=PNjemyS6pu+tgo4jjlNOk6+DABURU5fkxZ/HA/21CRZr+BqeQNEImZN+eWwKEpq2zk qKkIT+PCVjm49sTgdOJUrdfkegN8g/EiKhYgnuwFaAvgYwzEAl02QQnK/jJL4eZZxqQf O9gz7S5sydefKcuz78ERv6BU6BsEsZ/zy7/7mPNYs0NoWihVl42DHMWe/ydjg4TuWphZ BN53T/zMf/PqRXhOhXgww0uEOzIvIQF61lOz/DG+YK9wccL/RYiWdPmxwVPQc18mG2qk iS/Xdt/BV5lD/MwjbSrkAltu1COr474a6RSgkQ42fgfahK0QezzQA2f4wJzqBIOJRz9U N8Qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=txKoRgXFpX5OkMoNQV35XeQq+co/kJjUR3niRDei33Q=; b=r/4AHMtRGIa03WL8XbkKH9/Dny1Y+CDgFQT06PTAiK5shuTqeLmo+goVmXRkHKH/8y t1BG0SpUU2AlfgdRtvb01wmPq88JSMOspSv0VbwpxFnbFCAHMJ2woHzf5GqMexLlD2Sb kFa/RoFBjZ/zRqUFuB6JtUTG/7ScJvMGSSnTsV5a9bZUPLHF7WyQc1CCe4nc6LdBl0j1 9Uo+WCXNSbDnJnPI0e8HSDIpOm1Bvby7RMlN1zmOHt4RshLmWPvQOolJo0TcN5XnIBcO aEzHqUu1mXWd7KO7K4pKgAL5+rSPgULvP2/0Nwn+FaNNcN3HbC7LxK4OXyvHOXRrstR7 uoWA== X-Gm-Message-State: AOAM533akoh3sRKKfAPfO2ePeF/JcQv5UTFWvP6aB/6u6dmIvSEdbnkk rYqlQDpecTspmY/ILsrmy6b399w8XCAPmWyz1w8T X-Google-Smtp-Source: ABdhPJxWUj090iNAeJmqRNWcSY/dGZq4v/0KPg5SwBkxAfJXllUhjcbtQxN48aWHXPhcMeOxATg6QMSZgwclRYKrM6Ft Sender: "danielwinkler via sendgmr" X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a0c:cb02:: with SMTP id o2mr6342760qvk.8.1604006626942; Thu, 29 Oct 2020 14:23:46 -0700 (PDT) Date: Thu, 29 Oct 2020 14:23:26 -0700 In-Reply-To: <20201029212336.3283410-1-danielwinkler@google.com> Message-Id: <20201029141832.Bluez.v5.1.Ifaa96e71a871158e5d9d454073b2b6846eae339f@changeid> Mime-Version: 1.0 References: <20201029212336.3283410-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v5 01/10] doc/advertising-api: update API with new interface From: Daniel Winkler To: luiz.von.dentz@intel.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka , Alain Michaud Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This updates the advertising documentation to include the following features: LE Advertising Manager: - New SupportedCapabilities property LE Advertisement: - New min/max interval properties - New tx power property Reviewed-by: Sonny Sasaka Reviewed-by: Alain Michaud --- Changes in v5: - Changed interval API from jiffies to milliseconds for clarity - Changed new dbus endpoints to be experimental Changes in v4: None Changes in v3: None Changes in v2: None doc/advertising-api.txt | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/doc/advertising-api.txt b/doc/advertising-api.txt index b0565eab2..541c57004 100644 --- a/doc/advertising-api.txt +++ b/doc/advertising-api.txt @@ -138,6 +138,31 @@ Properties string Type "2M" "Coded" + uint32 MinInterval [Experimental] + + Minimum advertising interval to be used by the + advertising set, in milliseconds. Acceptable values + are in the range [20ms, 10,485s]. If the provided + MinInterval is larger than the provided MaxInterval, + the registration will return failure. + + uint32 MaxInterval [Experimental] + + Maximum advertising interval to be used by the + advertising set, in milliseconds. Acceptable values + are in the range [20ms, 10,485s]. If the provided + MinInterval is larger than the provided MaxInterval, + the registration will return failure. + + int16 TxPower [Experimental] + + Requested transmission power of this advertising set. + The provided value is used only if the "CanSetTxPower" + feature is enabled on the Advertising Manager. The + provided value must be in range [-127 to +20], where + units are in dBm. + + LE Advertising Manager hierarchy ================================ @@ -209,3 +234,26 @@ Properties byte ActiveInstances Possible values: "1M" "2M" "Coded" + + dict SupportedCapabilities [Experimental] + + Enumerates Advertising-related controller capabilities + useful to the client. + + Possible Values: + + byte MaxAdvLen + + Max advertising data length + + byte MaxScnRspLen + + Max advertising scan response length + + int16 MinTxPower + + Min advertising tx power (dBm) + + int16 MaxTxPower + + Max advertising tx power (dBm) From patchwork Thu Oct 29 21:23:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314388 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2D22AC4742C for ; Thu, 29 Oct 2020 21:23:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B76B120838 for ; Thu, 29 Oct 2020 21:23:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PmWdaDnf" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726439AbgJ2VXy (ORCPT ); Thu, 29 Oct 2020 17:23:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725948AbgJ2VXx (ORCPT ); Thu, 29 Oct 2020 17:23:53 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A4179C0613CF for ; Thu, 29 Oct 2020 14:23:53 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id k7so4039283ybm.13 for ; Thu, 29 Oct 2020 14:23:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=Q/yW8CGo6ujkkewo4nJeNplHo7X6JGElLM5ul8fz5ac=; b=PmWdaDnf44Y9Pq2VOQXdi7GU5vmjRXg1qfAnm5FApQRyCn9z4a2VeFOcG/fylfgYuP 6JPVZNgJtkpCPZW8Ui8b7Ob/jYn6VPi5KSigBEIGiNCr4z69cfNx32YqF0Q5EbGjSdOx Xbmi687L0fS1I6PYzRlp7DeF9Z4NTx+sR7/N3Si7gGIMgvn5BhGdoo/BRgFA9N2xTxs3 CESN35dmb9IdPITMhw2O1CFL2MaTB+vUS3LGVQNb1NUr+2IJ2AC/iBB1acOJ8jwrkXkc 37ArM7HfNMm9u5Mb6NfhzsFBDtWveQY9NSG0fxxmOgsp117lmKfZ6scJ+i3X+iuAkZRN OIUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Q/yW8CGo6ujkkewo4nJeNplHo7X6JGElLM5ul8fz5ac=; b=UMmn9zaizYPFGBH2b/7des5i8aBqyQbzVUWfO5LMqmApFHd4NF3GVmG88Nv5IDqRoR N53RiOvLFblGjjf3EacKI1C86Qx9uCwgkK4D/T7RaoKmdPCzgUoHGjhYELD92B9nU3Xr Lr24ZLZRPuxQJsgBbzfwE20xLzUppQI/357ckKEWBUzIQaDzNyLSO6eyY31p28lme0o3 ATJwMijWhQaecIEc6dMDcEcthfsi3kJVKgQSW8SVt3GcqQjE5KDp/IZiswMgH2ztq+i4 CxnNKylASQWOA08eZkCgRZC0+UZwOg7a2AWkrKrVQFTRr37aWY+4Zcx4Sroby1Iepg59 6gbw== X-Gm-Message-State: AOAM532UJMA/+8K/RJdDCwTjEzBcAvcozVFCsKS364WBMm5UwnPc7/jb IFQ69ycytRuf4U+jPSt31OCKeVlAjoZeKzkuMOVz X-Google-Smtp-Source: ABdhPJxOFyX8Wjp+BEnA4Z9CZRVrNP44tJ08uucz1Or4uZ+hG4PprlXJN7Uc9Ntv8yuEMMygT2w02O3rKyKo8jKxOHRx Sender: "danielwinkler via sendgmr" X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a5b:ec2:: with SMTP id a2mr8656365ybs.13.1604006632915; Thu, 29 Oct 2020 14:23:52 -0700 (PDT) Date: Thu, 29 Oct 2020 14:23:29 -0700 In-Reply-To: <20201029212336.3283410-1-danielwinkler@google.com> Message-Id: <20201029141832.Bluez.v5.4.I50d9faa25e9da6e71d77c83c7d47a5b135e88799@changeid> Mime-Version: 1.0 References: <20201029212336.3283410-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v5 04/10] advertising: Detect if extended advertising mgmt commands are supported From: Daniel Winkler To: luiz.von.dentz@intel.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka , Alain Michaud Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org We need to know if kernel supports the new MGMT interface. To do so, we check the return from adapter's MGMT_OP_READ_COMMANDS call for the new commands. This will later be used to route our requests for new advertisements. The change is tested by manually verifying that the correct MGMT commands are used when the feature is and is not available in kernel. Reviewed-by: Sonny Sasaka Reviewed-by: Alain Michaud --- Changes in v5: None Changes in v4: None Changes in v3: None Changes in v2: - Uses btd_has_kernel_features to detect kernel command support src/adapter.c | 4 ++++ src/adapter.h | 1 + src/advertising.c | 3 +++ 3 files changed, 8 insertions(+) diff --git a/src/adapter.c b/src/adapter.c index c0053000a..0e035172e 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -9640,6 +9640,10 @@ static void read_commands_complete(uint8_t status, uint16_t length, DBG("kernel supports exp features"); kernel_features |= KERNEL_EXP_FEATURES; break; + case MGMT_OP_ADD_EXT_ADV_PARAMS: + DBG("kernel supports ext adv commands"); + kernel_features |= KERNEL_HAS_EXT_ADV_ADD_CMDS; + break; default: break; } diff --git a/src/adapter.h b/src/adapter.h index dcc574857..ace72affd 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -233,6 +233,7 @@ enum kernel_features { KERNEL_SET_SYSTEM_CONFIG = 1 << 2, KERNEL_EXP_FEATURES = 1 << 3, KERNEL_HAS_RESUME_EVT = 1 << 4, + KERNEL_HAS_EXT_ADV_ADD_CMDS = 1 << 5, }; bool btd_has_kernel_features(uint32_t feature); diff --git a/src/advertising.c b/src/advertising.c index c03869e50..7c7599552 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -48,6 +48,7 @@ struct btd_adv_manager { uint8_t max_ads; uint32_t supported_flags; unsigned int instance_bitmap; + bool extended_add_cmds; }; #define AD_TYPE_BROADCAST 0 @@ -1417,6 +1418,8 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, manager->mgmt_index = btd_adapter_get_index(adapter); manager->clients = queue_new(); manager->supported_flags = MGMT_ADV_FLAG_LOCAL_NAME; + manager->extended_add_cmds = + btd_has_kernel_features(KERNEL_HAS_EXT_ADV_ADD_CMDS); if (!g_dbus_register_interface(btd_get_dbus_connection(), adapter_get_path(manager->adapter), From patchwork Thu Oct 29 21:23:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314387 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9AF5DC55178 for ; Thu, 29 Oct 2020 21:23:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 38A4120838 for ; Thu, 29 Oct 2020 21:23:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dwnuvDkW" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726463AbgJ2VXz (ORCPT ); Thu, 29 Oct 2020 17:23:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725948AbgJ2VXz (ORCPT ); Thu, 29 Oct 2020 17:23:55 -0400 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CEB0C0613CF for ; Thu, 29 Oct 2020 14:23:55 -0700 (PDT) Received: by mail-pf1-x44a.google.com with SMTP id l188so3121722pfl.23 for ; Thu, 29 Oct 2020 14:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=P+SDqtmg4eLZ9mT2fhiYwlVLZMV5m/3vumx5CxGCgm8=; b=dwnuvDkW11YTKmsQMZgTI8w2owcjkIh0Ey3qzfRtkySpH7yfAi8qUP7K9m0gcKyIE6 93aRbgIEU6Rq38x8BzSsvhab6ekyCx11+uXOLC3G1aUkKPCSm7wv65vCJVN4L3nhLKdQ cdSqWKP8sT3FssbQ1Jm/0RQHO8e/jad+5xFkVY2L+w4W/PYcwDGZl4baIzW2SvaDem6f SRQeVmFvzvmfE+GWj3g5LcJ5rowcUdZ4DsaXoyzkeXJu6tU0PuxtjkbzleCd34ARkmYW DGNoCZgGyGIkWFDuyeuqGBz9O/WFjMZ3RtwKwFdNvWqiflr25w0KlSZ0j3GvmyYMXi49 y0Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=P+SDqtmg4eLZ9mT2fhiYwlVLZMV5m/3vumx5CxGCgm8=; b=ns7By4+pyHP/qMS4GFiSKuXwJhu4BVSJy050vk9rjKHW4qN+8odsejlt2MNRUVtET5 g9/33ciXg9FkWHeV1jfXfTA4gUfgttc5+/azLe5yyP4ReBUe4IDkEbhIDZbXsn1xkglO 3uyJ5UBZMB1+O/Sk6UnpkUnNryrh05xpCfFO2oIG95Y1+0xYrtdWhT6GZxenujfiu/vd g5nQT1aOoCtV2pf/XcYVD060gLsCb0Q13lvCYbFS6VMtI6AtNcDjWQuUZNGbB1BicpL4 7gt6X9023EWEFM19Hml7ZKcc64ze9vKHT9pm4NRB5bAVwt2BW6WbiNi6p/uPXQP0GkUC fFVg== X-Gm-Message-State: AOAM531cBdDVp/JJ3lSpnhng/CAsbo/waxULZ69QavJAGG9Q2gylQZRc 9OdtNHISrCUK1B7nfAxUVWCdWXrSE8ijpPbpujG1 X-Google-Smtp-Source: ABdhPJzAXooqtpaZ+hh71tMrvsseHKzEy3icvc6g6KOiyR28W0od8fsCkNMt7yahPDXLICaqU27cQwTgyIAoUZ/9iV+P Sender: "danielwinkler via sendgmr" X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:aa7:92d4:0:b029:163:e68e:5ffb with SMTP id k20-20020aa792d40000b0290163e68e5ffbmr5792088pfa.40.1604006634850; Thu, 29 Oct 2020 14:23:54 -0700 (PDT) Date: Thu, 29 Oct 2020 14:23:30 -0700 In-Reply-To: <20201029212336.3283410-1-danielwinkler@google.com> Message-Id: <20201029141832.Bluez.v5.5.Ic4a3667da774f5f34477d5168a68a9280657e2da@changeid> Mime-Version: 1.0 References: <20201029212336.3283410-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v5 05/10] advertising: Parse intervals and tx power from adv From: Daniel Winkler To: luiz.von.dentz@intel.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka , Alain Michaud Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This change adds parsers for the advertising intervals and tx power properties of the LEAdvertisement1 object. It validates that each field adheres to the 5.2 spec, and that min and max intervals are compatible with each other, i.e. that min interval is less than max interval. A note here for maintainers: The tx power that is sent in the hci parameter command is an int8_t, but as far as I can tell, there is no clean way to use a signed 8-bit integer in dbus. The dbus byte type seems incompatible with negative values in high-level languages (python) without awkward usage manipulation on the client side. For this reason, I chose to use an int16_t type for the tx power dbus field, which is then downcasted to the int8_t in bluetoothd, which at least makes the signed-ness of the type crystal clear to the dbus client that uses it. This change is manually verified by ensuring the intervals and tx power parameters are correctly parsed from the LEAdvertisement1 object, and that the parse fails if the parameters are incorrect or not compatible with each other. Reviewed-by: Sonny Sasaka Reviewed-by: Alain Michaud --- Changes in v5: - Only parse new properties if experimental flag is set Changes in v4: None Changes in v3: None Changes in v2: None src/advertising.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/advertising.c b/src/advertising.c index 7c7599552..25d8ba770 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -54,6 +54,11 @@ struct btd_adv_manager { #define AD_TYPE_BROADCAST 0 #define AD_TYPE_PERIPHERAL 1 +/* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2585 + * defines tx power value indicating no preference + */ +#define ADV_TX_POWER_NO_PREFERENCE 0x7F + struct btd_adv_client { struct btd_adv_manager *manager; char *owner; @@ -74,6 +79,9 @@ struct btd_adv_client { struct bt_ad *data; struct bt_ad *scan; uint8_t instance; + uint32_t min_interval; + uint32_t max_interval; + int8_t tx_power; }; struct dbus_obj_match { @@ -937,6 +945,96 @@ static bool parse_secondary(DBusMessageIter *iter, return false; } +static bool parse_min_interval(DBusMessageIter *iter, + struct btd_adv_client *client) +{ + uint32_t min_interval_ms; + + /* Only consider this property if experimental setting is applied */ + if (!g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) + return true; + + if (!iter) + return false; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT32) + return false; + + dbus_message_iter_get_basic(iter, &min_interval_ms); + + /* Convert ms to jiffies to be used in adv request */ + client->min_interval = min_interval_ms / 0.625; + + /* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2584 + * defines acceptable interval range + */ + if (client->min_interval < 0x20 || client->min_interval > 0xFFFFFF) { + client->min_interval = 0; + return false; + } + + return true; +} + +static bool parse_max_interval(DBusMessageIter *iter, + struct btd_adv_client *client) +{ + uint32_t max_interval_ms; + + /* Only consider this property if experimental setting is applied */ + if (!g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) + return true; + + if (!iter) + return false; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT32) + return false; + + dbus_message_iter_get_basic(iter, &max_interval_ms); + + /* Convert ms to jiffies to be used in adv request */ + client->max_interval = max_interval_ms / 0.625; + + /* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2584 + * defines acceptable interval range + */ + if (client->max_interval < 0x20 || client->max_interval > 0xFFFFFF) { + client->max_interval = 0; + return false; + } + + return true; +} + +static bool parse_tx_power(DBusMessageIter *iter, + struct btd_adv_client *client) +{ + int16_t val; + + /* Only consider this property if experimental setting is applied */ + if (!g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) + return true; + + if (!iter) + return false; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INT16) + return false; + + dbus_message_iter_get_basic(iter, &val); + + /* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2585 + * defines acceptable tx power range + */ + if (val < -127 || val > 20) + return false; + + client->tx_power = val; + + return true; +} + static struct adv_parser { const char *name; bool (*func)(DBusMessageIter *iter, struct btd_adv_client *client); @@ -955,6 +1053,9 @@ static struct adv_parser { { "Discoverable", parse_discoverable }, { "DiscoverableTimeout", parse_discoverable_timeout }, { "SecondaryChannel", parse_secondary }, + { "MinInterval", parse_min_interval }, + { "MaxInterval", parse_max_interval }, + { "TxPower", parse_tx_power }, { }, }; @@ -1083,6 +1184,13 @@ static DBusMessage *parse_advertisement(struct btd_adv_client *client) goto fail; } + if (client->min_interval > client->max_interval) { + /* Min interval must not be bigger than max interval */ + error("MinInterval must be less than MaxInterval (%lu > %lu)", + client->min_interval, client->max_interval); + goto fail; + } + err = refresh_adv(client, add_adv_callback, &client->add_adv_id); if (!err) return NULL; @@ -1158,6 +1266,9 @@ static struct btd_adv_client *client_create(struct btd_adv_manager *manager, client->manager = manager; client->appearance = UINT16_MAX; + client->tx_power = ADV_TX_POWER_NO_PREFERENCE; + client->min_interval = 0; + client->max_interval = 0; return client; From patchwork Thu Oct 29 21:23:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314386 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2F412C4741F for ; Thu, 29 Oct 2020 21:24:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C11E320838 for ; Thu, 29 Oct 2020 21:24:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Vh/F7xBe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726528AbgJ2VYA (ORCPT ); Thu, 29 Oct 2020 17:24:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45352 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725948AbgJ2VYA (ORCPT ); Thu, 29 Oct 2020 17:24:00 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E988EC0613CF for ; Thu, 29 Oct 2020 14:23:59 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id y11so4066427ybm.22 for ; Thu, 29 Oct 2020 14:23:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=u+Hok0SjaVZEId5o72brIfJOgIbEOMTDJClF83T+CY4=; b=Vh/F7xBegU1FfPUFGcyS30Y6G+a6T1tsaheDs3xy2BdRkK7+AKVWyo3T0GMTGtIHa8 4qizXz5CUWsReFnbEUdVHdFqOHneUMjVPrt1aB4vXLG2ldGZlqZHHirjeOFD+FZ2pgcU ZRhDPqEx6Sf8a3RbntIpkT1FsgWl3nl5DNBHvGkAFK3upUZuS8MDeqVTQ8Q71hOUs/7X ClVNZJMkdq47JJUFM1EiDQgLoUhwnsT0klWGd/SFa3ilKDc5fl/7SwKBL9PaJ9azrju2 13DKdUeoAoQaVkQtKGnD5rNM6/xm4Mj7dFVn+6u5DiCqnHNnKYLQl8xbdR13j3kYZUG/ +I9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=u+Hok0SjaVZEId5o72brIfJOgIbEOMTDJClF83T+CY4=; b=DxtZLb3iDrhxJ5//3cAc5RIj8NhpL+QoyygqrXwiNYY38kwu6oNdbO3OhzQpM75+Q8 3l8Oo6VNWBftXEezc+WEhxT6LSG+mvE81USXtm6DvgwfIFriYsYWTgkLkvZVaOPDDDyV cV11FneCC5ITQvgxjhDkBr5Zn6GoSv5cr2pIVp0zdTXWbY8No8DfKjeOQxewI3LdtFVh Q/BKqTp1vWrGeOjUiG39fn+v/qJfYh2jWGHdM2dQygaTs24JQoAGAAxvwiVyCZ5kmDe5 3UEalDTcS4KnBluMXFzcAJCpLLLLdiMXBsvEziDwSaPRluj2bARfJb0kFisivWMkifg+ gFIQ== X-Gm-Message-State: AOAM532KhZ2zD0IQXvBCfHjGJewPELzJA1adaKytYv4IdVyRM9oeMhuX dEQPARXCbqDfWlwSr2ntnb5PtMqFiJPPBvxLULiy X-Google-Smtp-Source: ABdhPJzloO06Rc1pCI6wNiz0o9UvZCTR/TkketSx06MknJnl8Houk9URHc07vqVJ4mNrCH5AcNXuRbsns9/w7gopWGcf Sender: "danielwinkler via sendgmr" X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a25:2fc2:: with SMTP id v185mr8194365ybv.107.1604006639187; Thu, 29 Oct 2020 14:23:59 -0700 (PDT) Date: Thu, 29 Oct 2020 14:23:32 -0700 In-Reply-To: <20201029212336.3283410-1-danielwinkler@google.com> Message-Id: <20201029141832.Bluez.v5.7.I187f71748b9bd93f6bf97ec4a195216109c3ea06@changeid> Mime-Version: 1.0 References: <20201029212336.3283410-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v5 07/10] advertising: Query LE TX range at manager initialization From: Daniel Winkler To: luiz.von.dentz@intel.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka , Alain Michaud Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch calls the new MGMT command to get controller capabilities, and parses the min and max LE tx power range when the manager is initialized. This will be used to populate a client-facing dbus entry so that the client will know the advertising capabilities of the controller before registering an advertisement. This patch is tested by manually verifying the data is parsed correctly from the MGMT response. Reviewed-by: Sonny Sasaka Reviewed-by: Alain Michaud --- Changes in v5: - Verify capabilities MGMT command is supported before calling it Changes in v4: - Move tx power range into single capability field Changes in v3: None Changes in v2: None lib/mgmt.h | 14 ++++++++---- src/adapter.c | 4 ++++ src/adapter.h | 1 + src/advertising.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ tools/btmgmt.c | 12 +++++----- 5 files changed, 77 insertions(+), 10 deletions(-) diff --git a/lib/mgmt.h b/lib/mgmt.h index 7ab4fb797..f37f7e654 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -599,10 +599,16 @@ struct mgmt_cp_set_blocked_keys { struct mgmt_blocked_key_info keys[0]; } __packed; -#define MGMT_OP_READ_SECURITY_INFO 0x0048 -struct mgmt_rp_read_security_info { - uint16_t sec_len; - uint8_t sec[0]; +#define MGMT_CAP_SEC_FLAGS 0x01 +#define MGMT_CAP_MAX_ENC_KEY_SIZE 0x02 +#define MGMT_CAP_SMP_MAX_ENC_KEY_SIZE 0x03 +#define MGMT_CAP_LE_TX_PWR 0x04 + +#define MGMT_OP_READ_CONTROLLER_CAP 0x0048 +#define MGMT_READ_CONTROLLER_CAP_SIZE 0 +struct mgmt_rp_read_controller_cap { + uint16_t cap_len; + uint8_t cap[0]; } __packed; #define MGMT_OP_READ_EXP_FEATURES_INFO 0x0049 diff --git a/src/adapter.c b/src/adapter.c index 0e035172e..f21598feb 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -9644,6 +9644,10 @@ static void read_commands_complete(uint8_t status, uint16_t length, DBG("kernel supports ext adv commands"); kernel_features |= KERNEL_HAS_EXT_ADV_ADD_CMDS; break; + case MGMT_OP_READ_CONTROLLER_CAP: + DBG("kernel supports controller cap command"); + kernel_features |= KERNEL_HAS_CONTROLLER_CAP_CMD; + break; default: break; } diff --git a/src/adapter.h b/src/adapter.h index ace72affd..e5750a37b 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -234,6 +234,7 @@ enum kernel_features { KERNEL_EXP_FEATURES = 1 << 3, KERNEL_HAS_RESUME_EVT = 1 << 4, KERNEL_HAS_EXT_ADV_ADD_CMDS = 1 << 5, + KERNEL_HAS_CONTROLLER_CAP_CMD = 1 << 6, }; bool btd_has_kernel_features(uint32_t feature); diff --git a/src/advertising.c b/src/advertising.c index 428cd9562..5ed2edf44 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -49,6 +49,8 @@ struct btd_adv_manager { uint32_t supported_flags; unsigned int instance_bitmap; bool extended_add_cmds; + int8_t min_tx_power; + int8_t max_tx_power; }; #define AD_TYPE_BROADCAST 0 @@ -1701,6 +1703,49 @@ static void read_adv_features_callback(uint8_t status, uint16_t length, remove_advertising(manager, 0); } +static void read_controller_cap_complete(uint8_t status, uint16_t length, + const void *param, void *user_data) +{ + struct btd_adv_manager *manager = user_data; + const struct mgmt_rp_read_controller_cap *rp = param; + const uint8_t *ptr = rp->cap; + size_t offset = 0; + uint8_t tag_len; + uint8_t tag_type; + + if (status || !param) { + error("Failed to read advertising features: %s (0x%02x)", + mgmt_errstr(status), status); + return; + } + + if (sizeof(rp->cap_len) + rp->cap_len != length) { + error("Controller capabilities malformed, size %lu != %u", + sizeof(rp->cap_len) + rp->cap_len, length); + return; + } + + while (offset < rp->cap_len) { + tag_len = ptr[offset++]; + tag_type = ptr[offset++]; + + switch (tag_type) { + case MGMT_CAP_LE_TX_PWR: + if ((tag_len - sizeof(tag_type)) != + 2*sizeof(manager->min_tx_power)) { + error("TX power had unexpected length %d", + tag_len); + break; + } + memcpy(&manager->min_tx_power, &ptr[offset], tag_len); + memcpy(&manager->max_tx_power, &ptr[offset+1], tag_len); + } + + /* Step to the next entry */ + offset += (tag_len - sizeof(tag_type)); + } +} + static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, struct mgmt *mgmt) { @@ -1722,6 +1767,8 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, manager->supported_flags = MGMT_ADV_FLAG_LOCAL_NAME; manager->extended_add_cmds = btd_has_kernel_features(KERNEL_HAS_EXT_ADV_ADD_CMDS); + manager->min_tx_power = ADV_TX_POWER_NO_PREFERENCE; + manager->max_tx_power = ADV_TX_POWER_NO_PREFERENCE; if (!g_dbus_register_interface(btd_get_dbus_connection(), adapter_get_path(manager->adapter), @@ -1738,6 +1785,15 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, goto fail; } + /* Query controller capabilities. This will be used to display valid + * advertising tx power range to the client. + */ + if (g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL && + btd_has_kernel_features(KERNEL_HAS_CONTROLLER_CAP_CMD)) + mgmt_send(manager->mgmt, MGMT_OP_READ_CONTROLLER_CAP, + manager->mgmt_index, 0, NULL, + read_controller_cap_complete, manager, NULL); + return manager; fail: diff --git a/tools/btmgmt.c b/tools/btmgmt.c index b0b837d34..2f7cb2efc 100644 --- a/tools/btmgmt.c +++ b/tools/btmgmt.c @@ -1518,7 +1518,7 @@ static void cmd_extinfo(int argc, char **argv) static void sec_info_rsp(uint8_t status, uint16_t len, const void *param, void *user_data) { - const struct mgmt_rp_read_security_info *rp = param; + const struct mgmt_rp_read_controller_cap *rp = param; uint16_t index = PTR_TO_UINT(user_data); if (status != 0) { @@ -1533,7 +1533,7 @@ static void sec_info_rsp(uint8_t status, uint16_t len, const void *param, } print("Primary controller (hci%u)", index); - print("\tSecurity info length: %u", le16_to_cpu(rp->sec_len)); + print("\tSecurity info length: %u", le16_to_cpu(rp->cap_len)); done: pending_index--; @@ -1576,11 +1576,11 @@ static void sec_index_rsp(uint8_t status, uint16_t len, const void *param, if (rp->entry[i].type != 0x00) continue; - if (!mgmt_send(mgmt, MGMT_OP_READ_SECURITY_INFO, + if (!mgmt_send(mgmt, MGMT_OP_READ_CONTROLLER_CAP, index, 0, NULL, sec_info_rsp, UINT_TO_PTR(index), NULL)) { - error("Unable to send read_security_info cmd"); - return bt_shell_noninteractive_quit(EXIT_FAILURE); + error("Unable to send read_security_info cmd"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); } pending_index++; } @@ -1602,7 +1602,7 @@ static void cmd_secinfo(int argc, char **argv) return; } - if (!mgmt_send(mgmt, MGMT_OP_READ_SECURITY_INFO, mgmt_index, 0, NULL, + if (!mgmt_send(mgmt, MGMT_OP_READ_CONTROLLER_CAP, mgmt_index, 0, NULL, sec_info_rsp, UINT_TO_PTR(mgmt_index), NULL)) { error("Unable to send read_security_info cmd"); From patchwork Thu Oct 29 21:23:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314385 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6090CC4741F for ; Thu, 29 Oct 2020 21:24:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 011AC20838 for ; Thu, 29 Oct 2020 21:24:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="s68fTeMa" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726598AbgJ2VYF (ORCPT ); Thu, 29 Oct 2020 17:24:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725948AbgJ2VYF (ORCPT ); Thu, 29 Oct 2020 17:24:05 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AAE71C0613CF for ; Thu, 29 Oct 2020 14:24:03 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id a184so4088367ybg.10 for ; Thu, 29 Oct 2020 14:24:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=qKOSAfxbo2WQ7eoCYPvc65pmopU6F6CL3Vl9PMf/9bg=; b=s68fTeMaWjls9cuyb2O73+E6i0w+Dx3Fh0grXjFRDPEIQrcI1xYcT0xF6RNV37j0iz X9ISzQH6KBzA7/0SZvlQa/2eRhGXtGLmMoSyNnL244Z0pvjZMzYOPjB1y07d5GBi/yzj n1lCu6PeFljn6xUVQjW7emKgDBzHIJvqcff5XwNvOfJT61e/+JxwY+dG8QDY014pn/4R 6ieVI03c5LcT10YMmvJtzAzISbK1VHHgtuspqTkJrt9Ijfvs2YbF71uOZZCqTaacnGco chLbfxhdMwA5Pe8FXliOydphJHIFXIXUOK+SEQugoDpT0D0MkaV8Z96Pel2/ZC91EGY7 Fjxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=qKOSAfxbo2WQ7eoCYPvc65pmopU6F6CL3Vl9PMf/9bg=; b=Vlfkq3Zg5Oqz6bUHb3+mAav0uMwqM6w01yg6G/8Iiesaxt+cOXLMwFewgQtEoqlT15 LFCTRLTPcPGLbKN3A12ap31bRxzEMU29WoHCF+HqeKu++wLy7TUBXpn9PY+xq9PWlgEK fEPT/nOM0NPkZ4TdWcuqU7rHcUb5VvgOTl/bbNkz9IeUh0ZEC0bTKGZS1aWrD78684a3 7DGb3USVWjn0qN3/PBbXdqYHM7C809ueVMCwnVf/7iv2FQJnXis1F4n9ZuqUpWl1P8Ty MMHKhyXljQg8P2C0Fx452a0Ioz4NZLbEmfezIkj8uQQXoQeECBPS0eAuYz41eivSvm+R 7oFw== X-Gm-Message-State: AOAM533nZ8qxW9zYapw1gPuYqThqhodaxY9wnUTBMjyYCcBns07k3lPW WKTvIn9eBIrUck8AHiSE8XIatdjZdyq83HRs35n/ X-Google-Smtp-Source: ABdhPJxzqbCSMXhotdsqw1DTmPWVdadxvszxewDwkXaPUvhv0nBL/3SD1OSimOfhShSMhnP/zL+T0JtDlFCjTyuzY2Ms Sender: "danielwinkler via sendgmr" X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a25:7306:: with SMTP id o6mr7942824ybc.310.1604006642966; Thu, 29 Oct 2020 14:24:02 -0700 (PDT) Date: Thu, 29 Oct 2020 14:23:34 -0700 In-Reply-To: <20201029212336.3283410-1-danielwinkler@google.com> Message-Id: <20201029141832.Bluez.v5.9.Ic9eec7749b769aa5bf73a0d8e9a31be83f232f1c@changeid> Mime-Version: 1.0 References: <20201029212336.3283410-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v5 09/10] client: Add SupportedCapabilities to bluetoothctl From: Daniel Winkler To: luiz.von.dentz@intel.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka , Alain Michaud Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch adds the new "SupportedCapabilities" property to the bluetoothctl "show" view. The change is tested by verifying bluetoothctl shows the desired properties. Reviewed-by: Sonny Sasaka Reviewed-by: Alain Michaud --- Changes in v5: None Changes in v4: None Changes in v3: None Changes in v2: None client/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/main.c b/client/main.c index 60f1eb86e..9403f1af6 100644 --- a/client/main.c +++ b/client/main.c @@ -941,6 +941,7 @@ static void cmd_show(int argc, char *argv[]) print_property(adapter->ad_proxy, "SupportedInstances"); print_property(adapter->ad_proxy, "SupportedIncludes"); print_property(adapter->ad_proxy, "SupportedSecondaryChannels"); + print_property(adapter->ad_proxy, "SupportedCapabilities"); } if (adapter->adv_monitor_proxy) {