From patchwork Thu Oct 29 23:06:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314382 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 64F93C4741F for ; Thu, 29 Oct 2020 23:06:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F13B920791 for ; Thu, 29 Oct 2020 23:06:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vwZwlBvW" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725780AbgJ2XGc (ORCPT ); Thu, 29 Oct 2020 19:06:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33072 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725379AbgJ2XGc (ORCPT ); Thu, 29 Oct 2020 19:06:32 -0400 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DCBD4C0613CF for ; Thu, 29 Oct 2020 16:06:31 -0700 (PDT) Received: by mail-pg1-x549.google.com with SMTP id o11so1729400pgj.21 for ; Thu, 29 Oct 2020 16:06:31 -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=lcQI8c2L4RzrSzx8LBB04nbS9XIOWhnktjSc8NnfV70=; b=vwZwlBvWfdaMHKFocCheVni0/Lc4zbNeRhl8gOQPm5h1ZRP2v0Nl6wzFbF97h7xXn5 zq0Yb6TGXpwVmp8A+RPz0DyJSlrNWorjfu6+nerTxcCrrD9BkD7oAsj2Pp+GuhudAz0q zfbFehX9SA+3W3MB3hqgtkMRgB1gMR92o2+2tMWfpZDuC71x18S3H71wE5xx1e6VkqP7 Dk8dA0vflmW1sksvQryFlKl9ztfQQYgD31QlFfQlf9T0Zt1oI6iFDYp2pZ1YE0IIkR9g Quy4uvCs2TiBqbFFT29MJaVKfhHyycgbpyb0Xs2l/aACZt7YoHe+LdIMj0U73QPTxVAb DFvQ== 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=lcQI8c2L4RzrSzx8LBB04nbS9XIOWhnktjSc8NnfV70=; b=uNb+9QPtsZODGNRxK87s9yFBtHL8YWrFtWxwHLzoH+6TWbTHwNFMXASJHf5hdgzHBe wTdMTXsor8pPpWsy04TXu600sX7GpseyQYDkqr21ibHy8fLoe3bf1YX7srPuQVlrycaW 90WitU4NmR5Z/Q1Gcj2Tp0Vvrt+jmVMqSNfexf311PD4KCWfV8FOxI5kajlSkX8JOClu hsdQ0zYvbqu4x2Kw0zswynSGdaIOO6EMX8KZDnhkkuDxpjZI+W0zMQKhTWzM8mX1iqgN 6bcdIywO+UB7NwsmbjH6g1efbVLSYA/SYhCET8TxEJfi/CLu6SpPZ0V4YAl0m+OgND2C H5Mg== X-Gm-Message-State: AOAM533RzbI6yibEbK157+FmttgaDDyH3ww48BvzimJP3izgktPAK7vH PWVnA8jLZkFGyYKEq8/kU5ltiU2VEUus77K3iClp X-Google-Smtp-Source: ABdhPJxohdysptvLGCiJxo+aWLN/84PNHmNuJ1bXfkZblh3mFntBt43W0auCVC5KOwi7QtWwGwf6vMPV6SUDElQutRqG 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:868f:0:b029:155:dcd2:7320 with SMTP id d15-20020aa7868f0000b0290155dcd27320mr6500610pfo.53.1604012791461; Thu, 29 Oct 2020 16:06:31 -0700 (PDT) Date: Thu, 29 Oct 2020 16:06:13 -0700 In-Reply-To: <20201029230623.3630069-1-danielwinkler@google.com> Message-Id: <20201029160317.Bluez.v6.1.Ifaa96e71a871158e5d9d454073b2b6846eae339f@changeid> Mime-Version: 1.0 References: <20201029230623.3630069-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v6 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 v6: None 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 23:06:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314381 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, 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 70EACC4742C for ; Thu, 29 Oct 2020 23:06:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0E98920791 for ; Thu, 29 Oct 2020 23:06:36 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DKjeZSnJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725800AbgJ2XGg (ORCPT ); Thu, 29 Oct 2020 19:06:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725379AbgJ2XGg (ORCPT ); Thu, 29 Oct 2020 19:06:36 -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 11E87C0613CF for ; Thu, 29 Oct 2020 16:06:36 -0700 (PDT) Received: by mail-pf1-x44a.google.com with SMTP id u24so3331081pfh.4 for ; Thu, 29 Oct 2020 16:06:36 -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=HlqSQeD8AIpwZUKCMJZvUHiRV+aJ1Y5aA2LRmypwPzQ=; b=DKjeZSnJfFpJrNas2mh2blseyWpKigVVTTsQ01MULuwDzrKNFBHXkRTtlqAbKGYRwp w30i4gzxB6ZwSwjxo7GwjImgKNHvHVXov1AIha7lL8PHhGJVSf/SFdlkI2DHH6DUsAl4 xYUGb9Nz58h7X6dxPGZxkiaL61phSutOHLuFqMcw7jzgnqRhdf074inP+GwoSAaxg6P9 jMockRSM7SKNMF/AVaykfBSxPi/kCN6b/wq4QQGC0956LRILF/Zi88EuFn4DSaCoe5Eo eSUozQzl6wuzqhiTC/onGAiogyIkOxeuDaacfjc/WebjJOkBpVymOVDXP5kjDUgOCQMB VLHA== 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=HlqSQeD8AIpwZUKCMJZvUHiRV+aJ1Y5aA2LRmypwPzQ=; b=DECs+Sbamoh76h4LkHcskv0TL/UtY8h7Q1QIR310WYoOgwpnyvWcmJZ341QfJwa24I +3GVADSkQpKLUR+6wnOi/+Tlr1/OefTfpSK77ePYJx9XyKTr9OrdAFol/sdKHNBpC0r0 OMbvevMEbfnxFVxhL+OTh6tq8k0l9mhm3Y5qtsQeQD0wjPcT8upiDlxIFSQnxpZs2aUp jwg6agXTe/Rw7bLnF+lWi1IrG0fxpKjOH+FwRwLzMqLSKYq+WlhCdG2zK1Mhko9P7m2H uiwsoBfb7p5zOPcMsaQg5WVQzOhSopabGdDTChx0tR4GRjQePDXlpBVIheNVrV2iAG6u tHyw== X-Gm-Message-State: AOAM531gPpfOjVZYHT4Jpk1IbNgT73Q5qwz33KvHY2AdPlbEplLDhGu4 D9OlR8hOd8Pyz2IbxIhnUyXsAHu9fyx8MtaiaeqA X-Google-Smtp-Source: ABdhPJy+qVMX3O3KmJ8qMbdeEIZ8feE9MWLln1xgCchF3VrnARudVes3vM4B9ccExPSFbvpAp79hKyrpQZy0jCWz0lbf 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:a62:17cb:0:b029:163:e718:8502 with SMTP id 194-20020a6217cb0000b0290163e7188502mr6295406pfx.23.1604012795507; Thu, 29 Oct 2020 16:06:35 -0700 (PDT) Date: Thu, 29 Oct 2020 16:06:15 -0700 In-Reply-To: <20201029230623.3630069-1-danielwinkler@google.com> Message-Id: <20201029160317.Bluez.v6.3.Iabfcf7ec8ac293130a7d903ee8094414256799b3@changeid> Mime-Version: 1.0 References: <20201029230623.3630069-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v6 03/10] doc/mgmt-api: Update controller capabilities MGMT command in mgmt-api From: Daniel Winkler To: luiz.von.dentz@intel.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch changes Read Security Info MGMT to be called Read Controller Capabilities Command --- Changes in v6: None Changes in v5: None Changes in v4: - mgmt-api: Move Controller Capabilities MGMT doc into new patch - mgmt-api: Tx Power range put into single capabilities entry Changes in v3: None Changes in v2: None doc/mgmt-api.txt | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt index 7c899a8fe..1aa43d6c3 100644 --- a/doc/mgmt-api.txt +++ b/doc/mgmt-api.txt @@ -3110,19 +3110,19 @@ Set Wideband Speech Command Invalid Index -Read Security Information Command -================================= +Read Controller Capabilities Command +==================================== Command Code: 0x0048 Controller Index: Command Parameters: - Return Parameters: Security_Data_Length (2 Octets) - Security_Data (0-65535 Octets) + Return Parameters: Capabilities_Data_Length (2 Octets) + Capabilities_Data (0-65535 Octets) - This command is used to retrieve the supported security features + This command is used to retrieve the supported capabilities by the controller or the host stack. - The Security_Data_Length and Security_Data parameters provide + The Capabilities_Data_Length and Capabilities_Data parameters provide a list of security settings, features and information. It uses the same format as EIR_Data, but with the namespace defined here. @@ -3131,6 +3131,7 @@ Read Security Information Command 0x01 Flags 0x02 Max Encryption Key Size (BR/EDR) 0x03 Max Encryption Key Size (LE) + 0x04 Supported Tx Power (LE) Flags (data type 0x01) @@ -3146,6 +3147,14 @@ Read Security Information Command present, then it is unknown what the max encryption key size of the controller or host is in use. + Supported LE Tx Power (data type 0x04) + + When present, this 2-octet field provides the min and max + LE Tx power supported by the controller, respectively, as + reported by the LE Read Transmit Power HCI command. If this + field is not available, it indicates that the LE Read + Transmit Power HCI command was not available. + This command generates a Command Complete event on success or a Command Status event on failure. From patchwork Thu Oct 29 23:06:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314380 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 A4987C2D0A3 for ; Thu, 29 Oct 2020 23:06:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 41A7B20791 for ; Thu, 29 Oct 2020 23:06:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Uhqd6dBZ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725943AbgJ2XGk (ORCPT ); Thu, 29 Oct 2020 19:06:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725379AbgJ2XGk (ORCPT ); Thu, 29 Oct 2020 19:06:40 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A14CC0613CF for ; Thu, 29 Oct 2020 16:06:40 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id q16so3308326pfj.7 for ; Thu, 29 Oct 2020 16:06:40 -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=EOx3zY4sv78PXdbq3qCGZpKmBh3t/np3IO11o3dWgy0=; b=Uhqd6dBZq6Hf4V+X9j4eCYKiH+Z1xCOVIFLmZBOZAR7tDDmY1+Cl8uLM0Ka5F2Qw/3 1TahHs4im8yb50JGtKmsXrvIheUEnCSoI61yvR6WUNKkvsF4jB5WWRrmV3woUw1OhwVu FkChaWNUtB0qHyxfGaUJ05ScjUA6SRPp/qpAu7YZKm+JiypYlt3QbNt1Kh7E9i1oyVoY VQ79BlOif8oVJq+VsxzMC0y5CAGPJPmXKOV5mtk3kQjVwpzK1FA9avSlxKF6b6MxDbT9 OhVkcoCmm4jKIxzYKscWuo7+rQgRd8q0gjBqWXzwtwFgNvgz+eL57jgSRmPMMMOfGzxS komQ== 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=EOx3zY4sv78PXdbq3qCGZpKmBh3t/np3IO11o3dWgy0=; b=Bd5fJNcxa4bdrFyw7bgfhU3EUEoqxXhfHs0DPN/paANfjL91Eb6240LrjRmMvbr/U6 f8EO4zEAUrbYU54FiqiWXQWEOCNTZ5rjQ1V9m8gBhnlYZWSSEa1Ys1Q7YEXaJLrBzTcg tFPV+EwuySdfxISykOO/SXsiPjszQdFa2tPtgHI/nLHwoldNCoZTKwnJwHCFKziq0v+M cqQ95MBbnZILSWhR4uJD2sE/MYoGnpKZ4rID4oP4wxs43VKcKT8J9b2RZWjFzAt52FDZ wJRI48S5VNvRAUd/WLXs8dXEPgnve4E5sUcpy2JH31Iwy3FsZRUAhow62O/HUpjPWh12 7y0g== X-Gm-Message-State: AOAM53338foqq6g5YVct1WxxEgwbYzHO67pij/29xYKxsCiHv4wE9PCj IUpGficiU2TLw8QUj6N8GgeHo2X5Sps076I3EBLJ X-Google-Smtp-Source: ABdhPJxUhr3D2sErvjpMqpj49afJtE6mzHcLU2TTJXMXyZxuzu2fRKgTdV9LGSjFUv55zgSyRiIrExZUi2ErBFVCrrU5 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:93b6:0:b029:155:3b0b:d47a with SMTP id x22-20020aa793b60000b02901553b0bd47amr6484486pff.47.1604012799701; Thu, 29 Oct 2020 16:06:39 -0700 (PDT) Date: Thu, 29 Oct 2020 16:06:17 -0700 In-Reply-To: <20201029230623.3630069-1-danielwinkler@google.com> Message-Id: <20201029160317.Bluez.v6.5.Ic4a3667da774f5f34477d5168a68a9280657e2da@changeid> Mime-Version: 1.0 References: <20201029230623.3630069-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v6 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 v6: None 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..8443251bd 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 23:06:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314379 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 45198C2D0A3 for ; Thu, 29 Oct 2020 23:06:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D05C92076D for ; Thu, 29 Oct 2020 23:06:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qOgCOL+d" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725993AbgJ2XGq (ORCPT ); Thu, 29 Oct 2020 19:06:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33114 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725379AbgJ2XGq (ORCPT ); Thu, 29 Oct 2020 19:06:46 -0400 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AB9D2C0613CF for ; Thu, 29 Oct 2020 16:06:44 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id h20so3046028plr.9 for ; Thu, 29 Oct 2020 16:06:44 -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=g4PW5RzbK7Ij0OSBdI/okxbzAFUw1O+1dvC3Arqh7Q0=; b=qOgCOL+dFH2AnBk0T3dwC3B7ZveyCsoM8MaRz/K/ilJjEy3zMBJylQYUNfNQR0ZqLq fWZb8PzJkw5zor0xzuZbxXb3AwwVVqMj6bgEm+CGMGNdF+gOkQMi024/1ipztAfUBKZt 8NUhtDyHoBBY1yBdGSF9GuCJTZZb2iRwuXTMzceVKBLi6MOPg2GTIjTGgU9J8X4IrK2X wCYBTFXXKZ/UKI012ZvYSP6ocPZ9DliYj78l2vUA7c4eLIhYFQ7x8UojL+v1wTk3iXg+ e3o/VKWhoptLgRw0n2coK0/P6eKdGn7SOzTzBH+fHlTG0RUhjdc987WbPdcUt9mIJYNo +XEA== 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=g4PW5RzbK7Ij0OSBdI/okxbzAFUw1O+1dvC3Arqh7Q0=; b=ZQNWO5mssAO5/Wc3K3rktTrMqzdNUis2EB1rQRWNkjpRj0MTsueQlOCptBaF1vN/6/ lnvSdEsza6i2RXZGzkXhebyQpPMd6RpfEba/Abzx1m5z4/sElu1EE01c5uUDclCCxuC4 UW2UqxjR9OiA/4hDDPasnG38/1NCVS2pdcmnpGjEe+RWo4oxRnk/zTjR0M8DipCmqzzp XPLExmrD9G2nEqcEhmiulgM6hKF33vtc7vGn9hcB8VhaW5meDbqVcR7KsPLm8KHUZRxP +IgU5W8VAQWTHmJq3kIxUPQUawD5CYCVfgCcxIRVfeJAxLTJlNp24wXbGTSJ8A703L+c QmdA== X-Gm-Message-State: AOAM530/oFUna4PA72uclSh9lZafhG2BD6AcLwYHKqXMJzlzYy9aiGO/ OFvuHCnewiYQWH9Xj1PnKGQt0lwzcsB1xNxBErDq X-Google-Smtp-Source: ABdhPJxXU6QDDmPvm1OOZ1les0E8tWSQKvnQ1PbqPbZMXjNTXhCsBtAZ+VHg0L76zGh1yfmJACyY1QfFcPmKbsWSYYxX 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:a17:90a:5991:: with SMTP id l17mr125427pji.0.1604012804039; Thu, 29 Oct 2020 16:06:44 -0700 (PDT) Date: Thu, 29 Oct 2020 16:06:19 -0700 In-Reply-To: <20201029230623.3630069-1-danielwinkler@google.com> Message-Id: <20201029160317.Bluez.v6.7.I187f71748b9bd93f6bf97ec4a195216109c3ea06@changeid> Mime-Version: 1.0 References: <20201029230623.3630069-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v6 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 v6: None 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 90beb897f..cac90b01b 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -9570,6 +9570,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 e0de31098..9008b7813 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 23:06:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 314378 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 A1AA3C55178 for ; Thu, 29 Oct 2020 23:06:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 369FB2076D for ; Thu, 29 Oct 2020 23:06:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="h60+CZ1G" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726026AbgJ2XGt (ORCPT ); Thu, 29 Oct 2020 19:06:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33124 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725379AbgJ2XGs (ORCPT ); Thu, 29 Oct 2020 19:06:48 -0400 Received: from mail-qt1-x84a.google.com (mail-qt1-x84a.google.com [IPv6:2607:f8b0:4864:20::84a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14BCEC0613CF for ; Thu, 29 Oct 2020 16:06:47 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id e19so2841412qtq.17 for ; Thu, 29 Oct 2020 16:06: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=lKz2fQJlTyrs0uo8QPGYuVg2z+i8x82ZYum7zKbfLmY=; b=h60+CZ1GA8S7ghm4MOnfBRYDMtpecWq0kDjhGG32WYKiW8U6tX6eEzF3dPcd6gasJg RLWJqRMcnK6tTo2zpiG5OZ7FaqYr6Ab8+240qainQ7OnjqhBTOQ2r5gfLGnjRUtLlGq8 s+Zr9gYf5SQ7LwTjI7KQxJG2wccV3CnOHrGv7ULU4ZQaaW+6Zg3z7h1ZCaCIg10k61W6 QNEqNsk2D7l5gEqH0DqM5byXe+Cp9DZGuLMuH7cDtOkmPkDmFOHMzYfFVtM1h2H9NqY3 Ny6lKcZZcun9/fVAUVhFZ3ChAt6rw9KPcSVEHMcEN2kTOcLyV4/WjVOOWgmg+53VAqRW oMag== 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=lKz2fQJlTyrs0uo8QPGYuVg2z+i8x82ZYum7zKbfLmY=; b=qY5qPqEuQbze62TqwESKbOgLDiXi60vCvUoKzazarW05CRFmEp4lUKe4db7lmVEatz 2WBD7HRyAhODbCB0YFYTugf6iobSRYhbv6NLjhvw9Q4IzyB6X2kizm55b4D1o4yTqCU0 +/8K0Uilk+PefA/y5kGDS1HRRmZL4oV02UjlQFqbKBhiOVA5Ar1UVa6Y15xFZAo1EKex WIci7eVAo4AtpLBcwlx/CrdMrsopo3vTVEoDY+dhl4ay6hpl8jh+F7b0vILIfcOcAPdu t8QK2qvW/lH3Luezt87T4fF6hIj7BNB5c53ENdIv1TF5ibkmmhN8TsxDflEzwiYBcnOU XRVQ== X-Gm-Message-State: AOAM5304ArgO3s2UAz19DFbPsMG9IB8G3w0Yzq8slYttOklNV25SOaZy hZBlLTEFOlvWgs8xSAMYuFCWjFaeFhZTn5HE5VCU X-Google-Smtp-Source: ABdhPJxoe4Ha0Kx/MNnuNMpn6ZQYFE58/kXAJzWWGXdw3v96vjElDIIPctPITOxNDe32Uert9M+sKMhaABt2Qycu12US 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:ad4:4e73:: with SMTP id ec19mr6637357qvb.58.1604012806257; Thu, 29 Oct 2020 16:06:46 -0700 (PDT) Date: Thu, 29 Oct 2020 16:06:20 -0700 In-Reply-To: <20201029230623.3630069-1-danielwinkler@google.com> Message-Id: <20201029160317.Bluez.v6.8.I4e536cf2c9b6c5571b4b3800dfb8338fce8e4421@changeid> Mime-Version: 1.0 References: <20201029230623.3630069-1-danielwinkler@google.com> X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [Bluez PATCH v6 08/10] advertising: Expose SupportedCapabilities for advertising 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 To help our advertising clients understand the device capabilities, this patch adds a SupportedCapabilities dbus endpoint for the advertising manager. The primary reason behind this is to provide the valid LE tx power range the controller supports (populated if controller supports BT5), so a client can know the valid power range before requesting a tx power for their advertisement. I also thought it would be useful to indicate the max advertising data length and scan response length in this endpoint, since some clients will find it useful to set their advertising data (currently experimental feature) or scan response data (possible future feature) directly. This patch has been tested on Hatch (BT5 support) and Kukui (No BT5 support) chromebooks to verify that the dbus endpoint contains the correct data. Reviewed-by: Sonny Sasaka Reviewed-by: Alain Michaud --- Changes in v6: None Changes in v5: - Make SupportedCapabilities experimental Changes in v4: None Changes in v3: None Changes in v2: None src/advertising.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/advertising.c b/src/advertising.c index 9008b7813..9a0c70ff1 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -1641,12 +1641,47 @@ static gboolean get_supported_secondary(const GDBusPropertyTable *property, return TRUE; } +static gboolean get_supported_cap(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct btd_adv_manager *manager = data; + DBusMessageIter dict; + int16_t min_tx_power = manager->min_tx_power; + int16_t max_tx_power = manager->max_tx_power; + + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &dict); + + if (min_tx_power != ADV_TX_POWER_NO_PREFERENCE) + dict_append_entry(&dict, "MinTxPower", DBUS_TYPE_INT16, + &min_tx_power); + + if (max_tx_power != ADV_TX_POWER_NO_PREFERENCE) + dict_append_entry(&dict, "MaxTxPower", DBUS_TYPE_INT16, + &max_tx_power); + + dict_append_entry(&dict, "MaxAdvLen", DBUS_TYPE_BYTE, + &manager->max_adv_len); + dict_append_entry(&dict, "MaxScnRspLen", DBUS_TYPE_BYTE, + &manager->max_scan_rsp_len); + + dbus_message_iter_close_container(iter, &dict); + + return TRUE; +} + static const GDBusPropertyTable properties[] = { { "ActiveInstances", "y", get_active_instances, NULL, NULL }, { "SupportedInstances", "y", get_instances, NULL, NULL }, { "SupportedIncludes", "as", get_supported_includes, NULL, NULL }, { "SupportedSecondaryChannels", "as", get_supported_secondary, NULL, secondary_exits }, + { "SupportedCapabilities", "a{sv}", get_supported_cap, NULL, NULL, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL}, { } };