From patchwork Wed Sep 16 23:25:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 252724 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=-9.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT 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 018B1C43461 for ; Wed, 16 Sep 2020 23:25:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BE44B22207 for ; Wed, 16 Sep 2020 23:25:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="uwbghoe4" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726718AbgIPXZ5 (ORCPT ); Wed, 16 Sep 2020 19:25:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60166 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726084AbgIPXZy (ORCPT ); Wed, 16 Sep 2020 19:25:54 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A2B4C06174A for ; Wed, 16 Sep 2020 16:25:54 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id a13so201676qvl.6 for ; Wed, 16 Sep 2020 16:25:54 -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=+huwA4s3GAFhv45nHY4OvTaynBIxEfkWAWQB5QE2L54=; b=uwbghoe4ssspaSoLZHEcVPdKVJc3GC7g1/QIREF/6902DhbhPNUn3bqEfJvLn/RzPE Nhc4eT2WcHSlXATu1DbUD6rUWOX1K62UpRXVMQonKqMCIHhrDOwy+AEuXM1Gd/Dr+k6S D0L6SMAUd4eviI6EzdNQxtoTRaeIkLaFBI26vLaGC4cFqYVCbgNJxEWecm3aFHJvm1wp /HI3amMOSurMbOCXBlQGG4XIOAR9k1Ui3UtQd+CZbHYe/9/SujX4+ramnNZbTBottv1w tKGz0kinQ3pQuBmJAFqnLS2Ig7++ar3xbRo3CN/0p1KlCWpPr9UcKZFLcPT7avmtOgze 0OqQ== 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=+huwA4s3GAFhv45nHY4OvTaynBIxEfkWAWQB5QE2L54=; b=i1Z6f9Pj2OQbNupj6RgP/yEdsDTCH4xoiBJnHy/ufcn2ecqx0yJx26HC+E9Ez574Rg HzAzGMcKyBtjyLwX6tXdQL9cqF2RZUD+1utgLz1Gkbhx1R30OuD/m6VaM2k8KGOqHj7Y ZDFGLD/y2ssgpKDDzQVP49xoZ2ULgREBLGZLezwWF/XMiHtByyCZw3bt4G+vwcxfNolL TSXXKpDmx1x9dtq+kJtmHLnwUtf2ZcCvvdBFDrPul/x+GgTcA4nf+cGuS8DRf5JCIbM/ 2owf5bz1FWU+winCMjnbZHp4u35M4rQcQeTX1hOD71otCfAxA/foFk2MBoCgM1OFG7VV M+xA== X-Gm-Message-State: AOAM533oJnOUEsFuzKSQ7stJsOMcuiSOlrSebEb4pTP3i0jCmjlVzIrB z6u8jJd7Emfw7YHPSQj9wJ2OMFuhg81YAW2+6sst X-Google-Smtp-Source: ABdhPJwtDxkV5u7l6zrBENrrmQ6NvJBaNyScwtPPsc57GvJrU9AcqdvzPCeZfAKwaDYDSifsU8N6/Ba5GKvOkJKmpvW8 X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a0c:8246:: with SMTP id h64mr9715968qva.54.1600298753081; Wed, 16 Sep 2020 16:25:53 -0700 (PDT) Date: Wed, 16 Sep 2020 16:25:33 -0700 In-Reply-To: <20200916232542.1584854-1-danielwinkler@google.com> Message-Id: <20200916162155.Bluez.1.I50d9faa25e9da6e71d77c83c7d47a5b135e88799@changeid> Mime-Version: 1.0 References: <20200916232542.1584854-1-danielwinkler@google.com> X-Mailer: git-send-email 2.28.0.618.gf4bc123cb7-goog Subject: [Bluez PATCH 01/10] advertising: Detect if extended advertising mgmt commands are supported From: Daniel Winkler To: luiz.dentz@gmail.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka 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 call MGMT_OP_READ_COMMANDS when our manager is created and check if the new commands are available. This will then 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 --- src/advertising.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/advertising.c b/src/advertising.c index e5f25948d..172a83907 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -57,6 +57,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 @@ -1407,6 +1408,51 @@ static void read_adv_features_callback(uint8_t status, uint16_t length, remove_advertising(manager, 0); } +static void read_commands_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_commands *rp = param; + uint16_t num_commands, num_events; + size_t expected_len; + int i; + + if (status != MGMT_STATUS_SUCCESS) { + error("Failed to read supported commands: %s (0x%02x)", + mgmt_errstr(status), status); + return; + } + + if (length < sizeof(*rp)) { + error("Wrong size of read commands response"); + return; + } + + num_commands = btohs(rp->num_commands); + num_events = btohs(rp->num_events); + + expected_len = sizeof(*rp) + num_commands * sizeof(uint16_t) + + num_events * sizeof(uint16_t); + + if (length < expected_len) { + error("Too small reply for supported commands: (%u != %zu)", + length, expected_len); + return; + } + + for (i = 0; i < num_commands; i++) { + uint16_t op = get_le16(rp->opcodes + i); + + switch (op) { + case MGMT_OP_ADD_EXT_ADV_PARAMS: + manager->extended_add_cmds = true; + break; + default: + break; + } + } +} + static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, struct mgmt *mgmt) { @@ -1426,6 +1472,7 @@ 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 = false; if (!g_dbus_register_interface(btd_get_dbus_connection(), adapter_get_path(manager->adapter), @@ -1442,6 +1489,13 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, goto fail; } + /* Determine if kernel supports extended advertising add command. We + * don't care if this request fails, as we will fall back to legacy + * add_advertising by default + */ + mgmt_send(manager->mgmt, MGMT_OP_READ_COMMANDS, MGMT_INDEX_NONE, 0, + NULL, read_commands_complete, manager, NULL); + return manager; fail: From patchwork Wed Sep 16 23:25:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 252723 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=-9.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT 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 8B973C433E2 for ; Wed, 16 Sep 2020 23:26:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3E08B2220B for ; Wed, 16 Sep 2020 23:26:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="OlVd74Vn" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726788AbgIPX0B (ORCPT ); Wed, 16 Sep 2020 19:26:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60186 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726731AbgIPX0A (ORCPT ); Wed, 16 Sep 2020 19:26:00 -0400 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8C24AC06174A for ; Wed, 16 Sep 2020 16:26:00 -0700 (PDT) Received: by mail-qk1-x749.google.com with SMTP id r128so99049qkc.9 for ; Wed, 16 Sep 2020 16:26:00 -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=3Gv2h6Y33PNU5maObWHRnY34pFguxERvrCFOTuDaK1I=; b=OlVd74VnuAOjp0KkIozGsSyIwRgXhHSHBQ3Ru+dKUxnl1XvGpZppbQmdpNCn9Zpkyb 57hRTgzG/uws5apQjfgq6H0X5pMlBPSJQjZx2zOU80evDN+P4esfYI1VO3SzojX8Tn5O K4LigxjDz6CGEtj7kztPVUElFrVyggwJ0MTMlUYaoqXLByRyoBtLJfw9bGO3UU04uNBA 7UEXy3e2XND9DsCtg/5DakHbjqHhiKfnUibnD+McM4rGzpXRbltRrcraefZFJ48SaS7N Fd4upvA5tAd20VxKn1duFRhNYCWx/h0/VpnP/Tfajhxjwij+/ElG57RomCll3cjyMv29 Dkqg== 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=3Gv2h6Y33PNU5maObWHRnY34pFguxERvrCFOTuDaK1I=; b=ZnxqfaOJTu0+f92Kn4dzRbubRj90OmUzjZ0tHV9ROsUrBGTOS7y+nJYn8X8ozCwham 9bbBhBeAFNInY7/P1QgJkMC8JV4RHlvgz0c1m4sN6Nb410+4ckgRINVsKHjEIdxh409c QYPnLSmRCQe4a8nhDYXOhfMo8k+o9SBeHBPvgfBtN+Ey7moMrXsgCaB7iGdyAXrNpEEu lumxcD3/1MzT7lZzpDBiNZ7iIQ5Ibe5PxDCWngoZMEbxRG8b4zIljFgFecD1d4jw8pgi ITrMj7AN/Br+60v2u5jCfdKVicxGzxQ5JkVTqxvxFJIUjpQNo79om+9ppfmewuvPHaH/ osmg== X-Gm-Message-State: AOAM532M8ez+cHKEE+G5wgzyIIYd1lqIUwZO6uYSJJsHT5nwVO1linJb 5SzAwfz/Cemxj+EpM/IKYufGroXxrgzaG26HXk+Q X-Google-Smtp-Source: ABdhPJy2cLkZ+qaqTzd2UONEmYJuM5szArdjhG3kchEo9ONpeVZCVd7vR8/hqmrsE9jP1S+nN0/jPmKaN4mTcGc2lGdT X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a0c:8c4c:: with SMTP id o12mr8977581qvb.46.1600298759734; Wed, 16 Sep 2020 16:25:59 -0700 (PDT) Date: Wed, 16 Sep 2020 16:25:36 -0700 In-Reply-To: <20200916232542.1584854-1-danielwinkler@google.com> Message-Id: <20200916162155.Bluez.4.Ia7689bc6f45cf6b8e13a95cd1da4f96fbfc3ac14@changeid> Mime-Version: 1.0 References: <20200916232542.1584854-1-danielwinkler@google.com> X-Mailer: git-send-email 2.28.0.618.gf4bc123cb7-goog Subject: [Bluez PATCH 04/10] advertising: Catch tx power selected event and handle it From: Daniel Winkler To: luiz.dentz@gmail.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org The new Tx Power Selected MGMT event will alert bluetoothd that an advertising instance has been assigned a tx power. This is intended to be used to then update the client of their instance's tx power. Towards this goal, this patch does the following: - When adv manager is created, register a handler for tx selected event - On callback, identify the relevant advertising instance, and call for a property set with the new value. If the client exposes this method, it will be called with the new value selected by the controller. To test, I modified the example-advertisement python script to implement the Set dbus method, and verified that it is called after advertisement registration on a device with extended advertising. Reviewed-by: Sonny Sasaka --- lib/mgmt.h | 6 ++++++ src/advertising.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/mgmt.h b/lib/mgmt.h index 9874be004..97f8dd9b4 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -1002,6 +1002,12 @@ struct mgmt_ev_controller_resume { uint8_t wake_reason; } __packed; +#define MGMT_EV_ADV_TX_POWER_SELECTED 0x002f +struct mgmt_ev_adv_tx_power_selected { + uint8_t instance; + int8_t tx_power; +} __packed; + static const char *mgmt_op[] = { "<0x0000>", "Read Version", diff --git a/src/advertising.c b/src/advertising.c index 008ce0073..0269c9224 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -113,6 +113,17 @@ static bool match_client(const void *a, const void *b) return true; } +static bool match_client_by_instance(const void *a, const void *b) +{ + const struct btd_adv_client *client = a; + const uint8_t *instance = b; + + if (client && client->instance == *instance) + return true; + + return false; +} + static void client_free(void *data) { struct btd_adv_client *client = data; @@ -1673,6 +1684,22 @@ static void read_adv_features_callback(uint8_t status, uint16_t length, remove_advertising(manager, 0); } +static void tx_power_selected(uint16_t index, uint16_t length, + const void *param, void *user_data) +{ + const struct mgmt_ev_adv_tx_power_selected *ev = param; + struct btd_adv_client *client; + struct btd_adv_manager *manager = user_data; + dbus_int16_t tx_power = ev->tx_power; + + client = queue_find(manager->clients, match_client_by_instance, + &ev->instance); + + if (client) + g_dbus_proxy_set_property_basic(client->proxy, "TxPower", + DBUS_TYPE_INT16, &tx_power, NULL, NULL, NULL); +} + static void read_commands_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { @@ -1716,6 +1743,11 @@ static void read_commands_complete(uint8_t status, uint16_t length, break; } } + + if (manager->extended_add_cmds) + mgmt_register(manager->mgmt, MGMT_EV_ADV_TX_POWER_SELECTED, + manager->mgmt_index, tx_power_selected, + manager, NULL); } static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, From patchwork Wed Sep 16 23:25:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 252722 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=-9.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT 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 EAC17C433E2 for ; Wed, 16 Sep 2020 23:26:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9CD242220B for ; Wed, 16 Sep 2020 23:26:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="ZrQUzovl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726373AbgIPX0F (ORCPT ); Wed, 16 Sep 2020 19:26:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726764AbgIPX0C (ORCPT ); Wed, 16 Sep 2020 19:26:02 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 61FB2C06174A for ; Wed, 16 Sep 2020 16:26:02 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id v3so386271yba.12 for ; Wed, 16 Sep 2020 16:26:02 -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=RDn4qmzaK+DPbn7H086U+3kMev3mJs6C/TacCte6F1o=; b=ZrQUzovlfLclHjijnf3c0MwYzd7EtyV1jNyxR97xAwpM1zKcq5it0WwVwUtVoJWy7z 9ep4Ds97ODBev9BUViAomluXpjLP2Lxgf6DiIQ4BM74rp791inS5F9UiJFjMSWql7zkA C2SIgSFHjHPyYixcdOvjuGbA64IAkclxir89T0hMz/qahu8PDHj/2sereroYi2t8+02q +mA5PSRgktoyQzl6nKISOodxWGyrkYFlNQeBDe1bUC32r9oKlybxC4ryUeHXs6QNUha6 502M0jwfUStjmHCzVwf3yha/xRojV1Dgc37YbcUKy1GqLNpPakHN9UaOEkkWEIG3h/QK ahkg== 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=RDn4qmzaK+DPbn7H086U+3kMev3mJs6C/TacCte6F1o=; b=AJLxK6B1kqxCKsc3Hn+F1sRpN8CW95NQFvMAYqb+8jrK9l0d1ymGO/gGJCVQeSaZEb zV2dTi+bTP7+OZf0iHtGL1KzXRdGLvIWgbPk49toq6PSfJG9qugAZdQ/pcGG9sMiHR26 nhWOwvzIQXBKn3/VTnc5axp8v3w/Obh+hwCYngSNrBgnzBGwNa/Uk38YRNBX7DmJukqQ 6NFtmhy858tZXgSOjtuSjbIUToI9DvaIzpufPDfee11aRx413u+JB2gElFs3Qlnw8U+X 7B7qGmB8UUgK0VsT53eIS/ACK4PfgvgW4S+4nMi9oqmT8N+0a/M6KtlDPfS38H7Py0bq v83A== X-Gm-Message-State: AOAM531G+crXUrsvA5gOT3GtZROli7yNS12FLEg8euj2XMHD2T7YBl64 KucNqXw/OQF1TJ+L+LbPFp93bKi/0pb6KIrhnLBq X-Google-Smtp-Source: ABdhPJxYBlMUSl2gGaVuCpcMYKztsQYUb9Ky1V8qms2lZouU442XpUqu67XjDaxG2BCMJZw/xTlCctN/RbMseeu1P7Va X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a25:3585:: with SMTP id c127mr8325177yba.374.1600298761623; Wed, 16 Sep 2020 16:26:01 -0700 (PDT) Date: Wed, 16 Sep 2020 16:25:37 -0700 In-Reply-To: <20200916232542.1584854-1-danielwinkler@google.com> Message-Id: <20200916162155.Bluez.5.I187f71748b9bd93f6bf97ec4a195216109c3ea06@changeid> Mime-Version: 1.0 References: <20200916232542.1584854-1-danielwinkler@google.com> X-Mailer: git-send-email 2.28.0.618.gf4bc123cb7-goog Subject: [Bluez PATCH 05/10] advertising: Query LE TX range at manager initialization From: Daniel Winkler To: luiz.dentz@gmail.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka 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 --- lib/mgmt.h | 8 +++++++ src/advertising.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/lib/mgmt.h b/lib/mgmt.h index 97f8dd9b4..dbabb513f 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -744,6 +744,14 @@ struct mgmt_rp_add_ext_adv_data { uint8_t instance; } __packed; +#define MGMT_CAP_LE_TX_PWR_MIN 0x0001 +#define MGMT_CAP_LE_TX_PWR_MAX 0x0002 + +#define MGMT_OP_READ_CONTROLLER_CAP 0x0056 +struct mgmt_rp_read_controller_cap { + uint8_t capabilities[0]; /* mgmt_tlv */ +} __packed; + #define MGMT_EV_CMD_COMPLETE 0x0001 struct mgmt_ev_cmd_complete { uint16_t opcode; diff --git a/src/advertising.c b/src/advertising.c index 0269c9224..02aa11934 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -58,6 +58,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 @@ -1750,6 +1752,54 @@ static void read_commands_complete(uint8_t status, uint16_t length, manager, NULL); } +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 uint8_t *ptr = param; + uint16_t offset = 0; + + /* Both capabilities we care about are stored as int8_t. If we later + * want to track other types, this structure will need to change + */ + const struct { + struct mgmt_tlv entry; + int8_t value; + } __packed * cap; + + while (offset < length) { + /* Since TLV entries can have variable length, offset tracks how + * far into the member we are, so that cap is always pointing + * to the beginning of a valid struct + */ + cap = (void *)&ptr[offset]; + switch (cap->entry.type) { + case MGMT_CAP_LE_TX_PWR_MIN: + if (cap->entry.length != + sizeof(manager->min_tx_power)) { + error("TX power had unexpected length %d", + cap->entry.length); + break; + } + memcpy(&manager->min_tx_power, &cap->value, + cap->entry.length); + break; + case MGMT_CAP_LE_TX_PWR_MAX: + if (cap->entry.length != + sizeof(manager->min_tx_power)) { + error("TX power had unexpected length %d", + cap->entry.length); + break; + } + memcpy(&manager->max_tx_power, &cap->value, + cap->entry.length); + break; + } + + offset += sizeof(cap->entry) + cap->entry.length; + } +} + static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, struct mgmt *mgmt) { @@ -1770,6 +1820,8 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, manager->clients = queue_new(); manager->supported_flags = MGMT_ADV_FLAG_LOCAL_NAME; manager->extended_add_cmds = false; + 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), @@ -1793,6 +1845,13 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter, mgmt_send(manager->mgmt, MGMT_OP_READ_COMMANDS, MGMT_INDEX_NONE, 0, NULL, read_commands_complete, manager, NULL); + /* Query controller capabilities. This will be used to display valid + * advertising tx power range to the client. + */ + mgmt_send(manager->mgmt, MGMT_OP_READ_CONTROLLER_CAP, + manager->mgmt_index, 0, NULL, + read_controller_cap_complete, manager, NULL); + return manager; fail: From patchwork Wed Sep 16 23:25:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 252721 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=-9.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT 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 D90BEC43461 for ; Wed, 16 Sep 2020 23:26:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 93C7C22208 for ; Wed, 16 Sep 2020 23:26:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="VW18xMOT" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726869AbgIPX0I (ORCPT ); Wed, 16 Sep 2020 19:26:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726839AbgIPX0G (ORCPT ); Wed, 16 Sep 2020 19:26:06 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4EEECC06174A for ; Wed, 16 Sep 2020 16:26:06 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id k14so181141qvw.20 for ; Wed, 16 Sep 2020 16:26:06 -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=E+m79sGOPfqC1NVoAVBQ73IS8QIMVn3x2pbxmIfIMJk=; b=VW18xMOTg2HToPZhkvfx/Eztw/EyvSeYj/TGQvKYaQeWKdNZ4ggf5GPWpS0K8XGomr jRurrCIiwLQV8sE7q88M+plybJ2YvsWNNN8p9jLwHY9xnSmHhCMGffWYecjDH4F5Ixuf 5LiWuD/YNatkZPOalPRqywjgzNJnX4iXykTYo1GcTjDv99F1F50xWx1nUy+tHuUhriIK TVV+iw77AphPRVhq8D1K1vjxj6Q6JxZhf40ATQOdkPoWiG6kdvR50o1EQqGPaxs5Qbl4 3NpioeE2UhZbEq5MwDyTfmIZvECb6vVOKvkPW/uruZYduZ40zq2Ya+zC1zea9Hu5fV/0 2rSw== 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=E+m79sGOPfqC1NVoAVBQ73IS8QIMVn3x2pbxmIfIMJk=; b=pL2j+3OHfphjSuPIuKHxApFg3rW5aS6EK3GRcAM+nTFx9ZXE0B7fg+s4mR8QA2Eqj4 VkV50opuILAHbkTRXyxwcAJ8EaZeXxPX7H9tIiyA82kn6Qut+2oMFIYfEjAaaaJRUicb +bPm0fhkStG18x68iUYmV4HhVbP5TCLjZP2K4nz2S8NJd5kE4l/dFZBeRAxe8lJ9ogOZ Cc0dcIjTjsTQH6HBuXAKSqfjqZZgnfddE7NIDC6D379afYXArLjvsCqgnnGUJMpkHr/p yRkv3ENgiE6cHJ87r2UOA4uk4H6eIrOMx/eoJ2tqZwxT9ADCYk/moEsLC0NkBzr3q3D/ Bgsg== X-Gm-Message-State: AOAM530iktbXcU5rUbXs0/sYHY6a8yHUfRlwoTbgvFnfIJ7vzPx9JsbS wl0F5amCDW4MS6vOquJaAeMDm3yE/1DqTWBHOJtc X-Google-Smtp-Source: ABdhPJyTltNPH911TT2GP8+ZXBABtzTTh3lKKRDKpPP0t5fn88hR/viqqV3rNxXakZa/jVP0DVmHrEPRAkgwU3kcdUKz X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a0c:f2c1:: with SMTP id c1mr17616086qvm.30.1600298765472; Wed, 16 Sep 2020 16:26:05 -0700 (PDT) Date: Wed, 16 Sep 2020 16:25:39 -0700 In-Reply-To: <20200916232542.1584854-1-danielwinkler@google.com> Message-Id: <20200916162155.Bluez.7.Ic9eec7749b769aa5bf73a0d8e9a31be83f232f1c@changeid> Mime-Version: 1.0 References: <20200916232542.1584854-1-danielwinkler@google.com> X-Mailer: git-send-email 2.28.0.618.gf4bc123cb7-goog Subject: [Bluez PATCH 07/10] client: Add SupportedCapabilities to bluetoothctl From: Daniel Winkler To: luiz.dentz@gmail.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka 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 --- client/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/main.c b/client/main.c index 2b0243308..cb8ef54ad 100644 --- a/client/main.c +++ b/client/main.c @@ -954,6 +954,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) { From patchwork Wed Sep 16 23:25:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Winkler X-Patchwork-Id: 252720 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=-9.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT 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 9DEC2C43461 for ; Wed, 16 Sep 2020 23:26:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3AC752220B for ; Wed, 16 Sep 2020 23:26:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="pN44wtdd" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726912AbgIPX0L (ORCPT ); Wed, 16 Sep 2020 19:26:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726839AbgIPX0K (ORCPT ); Wed, 16 Sep 2020 19:26:10 -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 13C7CC06174A for ; Wed, 16 Sep 2020 16:26:10 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id y6so389473ybi.11 for ; Wed, 16 Sep 2020 16:26:10 -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=UdDPzO9OECkeo70fdtQdo6JOo5V7BHm0lOgDeLw00GE=; b=pN44wtddLVSWcWAfpjNRZ/C2EljFnOW8pU69igLU/NLa9aym0SV+Rem6pzEKPje3OJ xpdwI7soeGun/PR4AhLKidwOG2zqZZqwfPxAxbsv4xv86yQ2ahmv/Be9XwXwogaBkFf+ D3CyBPvvtYodl+wCVTbemhsMqqhOZJSYtbAf5RnAkCPi4rGHFyMvefSy5ZGhVkOgHj1A C/yGQ04AduvUdXPFEexAinn0wZX6XfK8SD3Es6x7X7DmJwsL2kSIfyN0GflWBkBzdN7I X5to0ES4z2N/NIQoJtNxT80OQ7K8cPc4kMDJISnXtQmj5ydXFbS54WMO/X+7TqgFhFV+ Es2w== 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=UdDPzO9OECkeo70fdtQdo6JOo5V7BHm0lOgDeLw00GE=; b=GQlN2pDRiBrzSCZDcuRjGS+r0OGyqOK90MQajJVPRDBfjTjdo6mWyauvxWqmMNb+R0 XuwvITPpYudRNPraOgicOwBYavgnn3qLRYvEIVKifSdADFPIdcf6exm5VIleVcCTaoQn MLIwCmzTcV2inf8RDpo8rEm19IGhHObk10uOYlb77IoRvRvnSdEvfK/xUPEgnlzbkH9z uz7i1t3eQkkTYQpSpYIF15wtSaDNAa5PrdBcRdbgTyHms9KJU6eI/MNiOeabr3M+kN8T aYBD5JElCJ2os7FbCIHXrXtYa9/+8GKyOkq//W8YA5p2AiuT/ORvj4WyQbl5W2F3i6fu QyUA== X-Gm-Message-State: AOAM530TMItIwYQZtG7XdkwzRlmVSWcWPIf8SWh0mZ0xiRqyesXXUUuM tbJ0i47RYJTEBmwE+3xoUZo8f2xNdOd9MCXvqQSz X-Google-Smtp-Source: ABdhPJwVp1Y4v4huZ5Sz8BrFVkxmSlUInExt6o5RL0MqZ/4kJRxO+Azk05BT459om59z5PThbW7tjyEnvU77BuMW1lcq X-Received: from danielwinkler-linux.mtv.corp.google.com ([2620:15c:202:201:f693:9fff:fef4:4e59]) (user=danielwinkler job=sendgmr) by 2002:a25:a305:: with SMTP id d5mr11744783ybi.180.1600298769343; Wed, 16 Sep 2020 16:26:09 -0700 (PDT) Date: Wed, 16 Sep 2020 16:25:41 -0700 In-Reply-To: <20200916232542.1584854-1-danielwinkler@google.com> Message-Id: <20200916162155.Bluez.9.Ifaa96e71a871158e5d9d454073b2b6846eae339f@changeid> Mime-Version: 1.0 References: <20200916232542.1584854-1-danielwinkler@google.com> X-Mailer: git-send-email 2.28.0.618.gf4bc123cb7-goog Subject: [Bluez PATCH 09/10] doc/advertising-api: update API with new interface From: Daniel Winkler To: luiz.dentz@gmail.com Cc: linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, Daniel Winkler , Sonny Sasaka 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 --- doc/advertising-api.txt | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/doc/advertising-api.txt b/doc/advertising-api.txt index b0565eab2..3215a52f7 100644 --- a/doc/advertising-api.txt +++ b/doc/advertising-api.txt @@ -138,6 +138,33 @@ Properties string Type "2M" "Coded" + uint32 MinInterval + + Minimum advertising interval to be used by the + advertising set, in .625 millisecond slots. + Time = N * .625 ms, where N has range + [0x000020, 0xFFFFFF]. If the provided MinInterval is + larger than the provided MaxInterval, the registration + will return failure. + + uint32 MaxInterval + + Maximum advertising interval to be used by the + advertising set, in .625 millisecond slots. + Time = N * .625 ms, where N has range + [0x000020, 0xFFFFFF]. If the provided MinInterval is + larger than the provided MaxInterval, the registration + will return failure. + + int16 TxPower + + 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 +236,26 @@ Properties byte ActiveInstances Possible values: "1M" "2M" "Coded" + + dict SupportedCapabilities + + 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)