From patchwork Thu May 26 11:24:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 577000 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 62273C433F5 for ; Thu, 26 May 2022 11:25:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347093AbiEZLZF (ORCPT ); Thu, 26 May 2022 07:25:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237552AbiEZLZC (ORCPT ); Thu, 26 May 2022 07:25:02 -0400 Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 84643CF for ; Thu, 26 May 2022 04:25:01 -0700 (PDT) Received: by mail-pf1-x42e.google.com with SMTP id c14so1470729pfn.2 for ; Thu, 26 May 2022 04:25:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=SJBvj6G+GQCxUKbSubCwcRd/ln0obOikcaZZWNEA07o=; b=alb94opfuKa0czBSgKs3+KHG1ZSHM2tA86Vg9nm4CD4XzXxUeaJBBJqPmohC9TrN7F qGzIbVvQLtxMf8F9HASEq6sg3CWdkNJ5uu0Sfos3wV2z6OrN+kHRaqfmYNji9HZEXyiz QXMqpEayUBi5t+VCMCQQH+TOdiirh9dekdDbo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=SJBvj6G+GQCxUKbSubCwcRd/ln0obOikcaZZWNEA07o=; b=CQciomRe9rhZm7gTPw0njyTl3K2fZFrs2GWnn+NujfecyYI16UrcHeus94vr0Hn+mu E1JKIkBJehZMZXzqXY6LiYt+08WvgFbYgHhKEMhyIwsQHq8nFrRd9I/TCh6eI0bN7yQW 2hQZJNHNFZQerJLzRBPdkHUiEvCuGizwk4X4eprJwWP46PaHxotGaaRnUsxFlzl18Dud 0LBEXeFHmy8EyTyHRfDPnM8f3f8IWHtbwHufXRNtdQzOryoqmn4MBHm67FzmnnhekO/U pUxRI8qhet+hfgEDdXlswZnr88IX3Fv0ilk/MyyM6Cmo/hodILijx2T3NVRL71fkhBMa Tggw== X-Gm-Message-State: AOAM5333cUnaQhjeBRVlHLsGSgVY3DvJZmiecJkwEHLw3TlOiE/sfpk9 LMLNW2kpmFaItECv+FGu+CWiY8SV0ndAzg== X-Google-Smtp-Source: ABdhPJzEWhNGfNSDX685jC2sCnWt11akQ2mHs/KEKZz55IeQR1g2vXjWUzc2RS3YDddjvGiMeyRSjA== X-Received: by 2002:a65:6d0d:0:b0:3fb:1477:5191 with SMTP id bf13-20020a656d0d000000b003fb14775191mr2548410pgb.541.1653564300868; Thu, 26 May 2022 04:25:00 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id m5-20020a63f605000000b003faebbb772esm1315159pgh.25.2022.05.26.04.24.59 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:00 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang Subject: [BlueZ PATCH v6 1/8] doc: Introduce the quality report command and event Date: Thu, 26 May 2022 19:24:49 +0800 Message-Id: <20220526112456.2488536-1-josephsih@chromium.org> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Add the MGMT quality report command and event in doc/mgmt-api.txt. --- Changes in v6: - No update in this patch. The patch 3/8 is updated to resolve a patch conflict. Changes in v5: - Use Quality_Report instead of Action in mgmt-api.txt. - Modify the description of Set Quality Report Command. Changes in v4: - Use "Quality Report Event" without the prefix "Bluetooth" word. - Combine both MGMT quality report command and event changes in a single patch. Changes in v3: - Swap AOSP Bluetooth Quality Report Event and Intel Telemetry Event. - Add 5 new patches (5/9 - 9/9) to enable the quality report feature via MGMT_OP_SET_QUALITY_REPORT instead of through the experimental features. Changes in v2: - This is a new patch for adding the event in doc/mgmt-api.txt doc/mgmt-api.txt | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt index ebe56afa4..a429f0ef3 100644 --- a/doc/mgmt-api.txt +++ b/doc/mgmt-api.txt @@ -332,6 +332,7 @@ Read Controller Information Command 15 Static Address 16 PHY Configuration 17 Wideband Speech + 18 Quality Report This command generates a Command Complete event on success or a Command Status event on failure. @@ -2924,6 +2925,7 @@ Read Extended Controller Information Command 15 Static Address 16 PHY Configuration 17 Wideband Speech + 18 Quality Report The EIR_Data field contains information about class of device, local name and other values. Not all of them might be present. For @@ -3858,6 +3860,45 @@ Add Advertisement Patterns Monitor With RSSI Threshold Command Invalid Parameters +Set Quality Report Command +========================== + + Command Code: 0x0057 + Controller Index: + Command Parameters: Quality_Report (1 Octet) + Return Parameters: Current_Settings (4 Octets) + + This command is used to enable and disable the controller's quality + report feature. The allowed values for the Quality_Report command + parameter are 0x00 and 0x01. All other values will return Invalid + Parameters. + + The value 0x00 disables the Quality Report, and the value 0x01 + enables the Quality Report feature. + + This command is only available for the controllers that support + either AOSP Bluetooth quality report or Intel telemetry event. + It is supported if the supported_settings indicate support for it. + + This command requires to use a valid controller index. Otherwise, + an Invalid Index status will be returned. + + The command is sent to the controller to enable/disable the quality + report feature, and generates a Command Complete event on success. + If the controller failed to execute the action, a Failed status will + be returned. + + The quality report state is maintained by the kernel over the adapter + power cycle. When the adapter is powered off, the quality report + feature is disabled by the kernel. When the adapter is powered on, it + is enabled again by the kernel if it was enabled before. + + Possible errors: Failed + Invalid Index + Invalid Parameters + Not Supported + + Command Complete Event ====================== @@ -4978,3 +5019,22 @@ Advertisement Monitor Device Lost Event 2 LE Random This event will be sent to all management sockets. + + +Quality Report Event +==================== + + Event code: 0x0031 + Controller Index: + Event Parameters: Quality_Spec (1 Octet) + Report_Len (2 Octets) + Report (0-65535 Octets) + + This event carries the Bluetooth quality report sent by the + controller. + + Possible values for the Quality_Spec parameter: + 0 AOSP Bluetooth Quality Report Event + 1 Intel Telemetry Event + + This event will be sent to all management sockets. From patchwork Thu May 26 11:24:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576276 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2738DC433EF for ; Thu, 26 May 2022 11:25:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347092AbiEZLZG (ORCPT ); Thu, 26 May 2022 07:25:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56072 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345927AbiEZLZE (ORCPT ); Thu, 26 May 2022 07:25:04 -0400 Received: from mail-pg1-x52b.google.com (mail-pg1-x52b.google.com [IPv6:2607:f8b0:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0E7E7CF for ; Thu, 26 May 2022 04:25:04 -0700 (PDT) Received: by mail-pg1-x52b.google.com with SMTP id c22so1141715pgu.2 for ; Thu, 26 May 2022 04:25:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3TriAZF2PfVsPnINlTHwFuM9S9AZnTdcYqC1UFJFAXc=; b=M89WWL7b2E3m6buRd6RewTNCGrmubDSCSMDtW9heca052jN09flKiSuxdwMKUHxoHO X2xMTnkfHQCW6KHYxVof8JUtP1XGhHG+E9bFhQ+VRL6NfaK3HEqO7Dxqff3/6rnFQaVP TqXi9LiPIiDLbzg35+/pUjdr2UwuCaKrgUErw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3TriAZF2PfVsPnINlTHwFuM9S9AZnTdcYqC1UFJFAXc=; b=N0PgznUuHUb9eeCX6hbphNc3QkTlzpvMgIEikdXKcD45MpGdk0nErahO6mZJb7Ndn8 amBOG3fZ8irOCKaKxf8gmWByJXy8R5ZnfFsPYbU9G9D6rUkE0xxOOgKqnPK7SshEARr1 W+vp2dZ8ippm7YAxXr2WAy3OZaD+J9UiznSKCztPJrQQ6MPkVIjERP3zAXYcHRmgMQDw Gz6f8eHOFarmst/g1m/ABrR5XnpBgisn64/d+NlVhS1Ny0GF360ShtYI0onq5QQEgg38 WLYkAHJjcDMUNmNP5938A6yXg+Cam4gp7Ckk5Uo14RQh3leUxNnDObOBijc6ag4F5hk2 NOmg== X-Gm-Message-State: AOAM530I8BrDInk6+0j57jkHY/qfY+rAPgwfElSLJR+FXisTUhL5IJO5 D7ztWJFByS4GUfVQY7ruNwBQpDRbalWS1w== X-Google-Smtp-Source: ABdhPJxuweiqjemal3OlYRToT5wkfaHHdHfCsrwZJSg7DS57KuG0Jxk8ywvOeUFPtCmelHJw8q421w== X-Received: by 2002:a63:716:0:b0:3fa:1604:c9ab with SMTP id 22-20020a630716000000b003fa1604c9abmr20722914pgh.518.1653564303438; Thu, 26 May 2022 04:25:03 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id d20-20020a056a00199400b0051829b1595dsm1353114pfl.130.2022.05.26.04.25.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:03 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang Subject: [BlueZ PATCH v6 2/8] lib: Add structures and constants for quality report command and event Date: Thu, 26 May 2022 19:24:50 +0800 Message-Id: <20220526112456.2488536-2-josephsih@chromium.org> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Add the new MGMT struct and constants to lib/mgmt.h. --- (no changes since v5) Changes in v5: - Use quality_report instead of action in struct mgmt_cp_set_quality_report. - Declare "const uint8_t data[];" Changes in v4: - Combine both MGMT command and event changes in a single patch. - Fix namings of QUALITY_SPEC_AOSP and QUALITY_SPEC_INTEL. - Use "Quality Report" without the prefix "Bluetooth". Changes in v3: - Swap AOSP Bluetooth Quality Report Event and Intel Telemetry Event. Changes in v2: - This is a new patch for adding the new struct and constants. lib/mgmt.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/mgmt.h b/lib/mgmt.h index 922a24367..fd59ef6fa 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -96,6 +96,7 @@ struct mgmt_rp_read_index_list { #define MGMT_SETTING_STATIC_ADDRESS 0x00008000 #define MGMT_SETTING_PHY_CONFIGURATION 0x00010000 #define MGMT_SETTING_WIDEBAND_SPEECH 0x00020000 +#define MGMT_SETTING_QUALITY_REPORT 0x00040000 #define MGMT_OP_READ_INFO 0x0004 struct mgmt_rp_read_info { @@ -757,6 +758,14 @@ struct mgmt_cp_add_adv_patterns_monitor_rssi { struct mgmt_adv_pattern patterns[0]; } __packed; +#define MGMT_OP_SET_QUALITY_REPORT 0x0057 +struct mgmt_cp_set_quality_report { + uint8_t quality_report; +} __packed; +struct mgmt_rp_set_quality_report { + uint32_t current_settings; +} __packed; + #define MGMT_EV_CMD_COMPLETE 0x0001 struct mgmt_ev_cmd_complete { uint16_t opcode; @@ -1032,6 +1041,15 @@ struct mgmt_ev_adv_monitor_device_lost { struct mgmt_addr_info addr; } __packed; +#define MGMT_EV_QUALITY_REPORT 0x0031 +#define QUALITY_SPEC_AOSP 0x0 +#define QUALITY_SPEC_INTEL 0x1 +struct mgmt_ev_quality_report { + uint8_t quality_spec; + uint32_t data_len; + const uint8_t data[]; +} __packed; + static const char *mgmt_op[] = { "<0x0000>", "Read Version", @@ -1172,6 +1190,7 @@ static const char *mgmt_ev[] = { "Controller Resume", "Advertisement Monitor Device Found", /* 0x002f */ "Advertisement Monitor Device Lost", + "Quality Report", /* 0x0031 */ }; static const char *mgmt_status[] = { From patchwork Thu May 26 11:24:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576999 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3EEB4C433F5 for ; Thu, 26 May 2022 11:25:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347095AbiEZLZI (ORCPT ); Thu, 26 May 2022 07:25:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56102 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245265AbiEZLZH (ORCPT ); Thu, 26 May 2022 07:25:07 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D24A33615D for ; Thu, 26 May 2022 04:25:06 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id a13so1193590plh.6 for ; Thu, 26 May 2022 04:25:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GUESNDl6X0iga2wqExoggP3CT/Fg2GAGSlYdR/L7PPU=; b=AuEgW2X1oL6qxd6Yr2rJb6jbWDqK0J+gVs5/hfXDQJ2IODkOyEEccwn9ssYCTsDHEC v4X5czhGiFxVFKfldkrLWKs440E5HYzyyeu1KApmPqucUBPvyzQz/TaCeFmYkhS2TNdA V4tSoDNw/CQc46TJaUhdffuuyLFK55xR8ncQk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GUESNDl6X0iga2wqExoggP3CT/Fg2GAGSlYdR/L7PPU=; b=drTpQ4nyKA+0vQch4JFLlewVqqOzUsNl3BoNiU/lDm+yR/aUdM8rW/x3kbfxMUGgzo dwiBwNgfE9okuPBP3YgZTSdtQ8sbb/+UOTAroq0aBpatXWTwkxZZ4KuGL0mgPrLGo+WF v2plh+vJCHC4P4xwVOu+QnV1Q1GTQVOCaP3HfHkJd90ANKCO2ATLgsVgZTsC35BNgp3+ jVWJksAiPCdQRKHjQg/6vJAfqzmdq1eLxTsAayQhr807pmA1Q9ocx0vjaG9ga4QGfbf1 L2Xl7gSAUaJ8j7bdWM60JFGsnFzgc/3D+7WDEHzjDl0NvyF0tEaZEGEb8+HXfcp/2Dfl Y4WA== X-Gm-Message-State: AOAM531xR6RpFwUEY8zYg++pq/vJsN0M8glJNn8NcrCWdwlUkf+RQ9mx /SF6zt9pCW36arg4zkA35V9/UN9kyq7vNw== X-Google-Smtp-Source: ABdhPJwFZZNCKdsO2FFPbFBDy5xCusaDFGYO8bNYJwl5kI8CgkzVGYRvbZsabUNassUoldq0Irnovw== X-Received: by 2002:a17:90a:5c84:b0:1dc:9b42:f2cf with SMTP id r4-20020a17090a5c8400b001dc9b42f2cfmr2114638pji.123.1653564306183; Thu, 26 May 2022 04:25:06 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id e3-20020a17090301c300b0016188a3efb9sm1337489plh.89.2022.05.26.04.25.04 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:05 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang Subject: [BlueZ PATCH v6 3/8] adapter: remove quality report from experimental features Date: Thu, 26 May 2022 19:24:51 +0800 Message-Id: <20220526112456.2488536-3-josephsih@chromium.org> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org The quality report feature is now enabled through MGMT_OP_SET_QUALITY_REPORT instead of through the experimental features. --- Changes in v6: - Fixed a patch conflict. Changes in v5: - Move is_quality_report_supported() implementation to next patch. The function does not belong to this patch. Changes in v4: - Move forward this patch in the patch series so that this command patch is prior to the quality report event patches. Changes in v3: - This is a new patch that enables the quality report feature via MGMT_OP_SET_QUALITY_REPORT. src/adapter.c | 14 -------------- src/adapter.h | 1 - 2 files changed, 15 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index f7faaa263..2ceea6e1c 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -120,13 +120,6 @@ static const struct mgmt_exp_uuid le_simult_central_peripheral_uuid = { .str = "671b10b5-42c0-4696-9227-eb28d1b049d6" }; -/* 330859bc-7506-492d-9370-9a6f0614037f */ -static const struct mgmt_exp_uuid quality_report_uuid = { - .val = { 0x7f, 0x03, 0x14, 0x06, 0x6f, 0x9a, 0x70, 0x93, - 0x2d, 0x49, 0x06, 0x75, 0xbc, 0x59, 0x08, 0x33 }, - .str = "330859bc-7506-492d-9370-9a6f0614037f" -}; - /* 15c0a148-c273-11ea-b3de-0242ac130004 */ static const struct mgmt_exp_uuid rpa_resolution_uuid = { .val = { 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, 0xde, 0xb3, @@ -9621,12 +9614,6 @@ static void le_simult_central_peripheral_func(struct btd_adapter *adapter, (void *)le_simult_central_peripheral_uuid.val); } -static void quality_report_func(struct btd_adapter *adapter, uint8_t action) -{ - if (action) - queue_push_tail(adapter->exps, (void *)quality_report_uuid.val); -} - static void set_rpa_resolution_complete(uint8_t status, uint16_t len, const void *param, void *user_data) { @@ -9703,7 +9690,6 @@ static const struct exp_feat { EXP_FEAT(EXP_FEAT_DEBUG, &debug_uuid, exp_debug_func), EXP_FEAT(EXP_FEAT_LE_SIMULT_ROLES, &le_simult_central_peripheral_uuid, le_simult_central_peripheral_func), - EXP_FEAT(EXP_FEAT_BQR, &quality_report_uuid, quality_report_func), EXP_FEAT(EXP_FEAT_RPA_RESOLUTION, &rpa_resolution_uuid, rpa_resolution_func), EXP_FEAT(EXP_FEAT_CODEC_OFFLOAD, &codec_offload_uuid, diff --git a/src/adapter.h b/src/adapter.h index 688ed51c6..3d53a962d 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -257,7 +257,6 @@ bool btd_le_connect_before_pairing(void); enum experimental_features { EXP_FEAT_DEBUG = 1 << 0, EXP_FEAT_LE_SIMULT_ROLES = 1 << 1, - EXP_FEAT_BQR = 1 << 2, EXP_FEAT_RPA_RESOLUTION = 1 << 3, EXP_FEAT_CODEC_OFFLOAD = 1 << 4, }; From patchwork Thu May 26 11:24:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576275 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4680C433F5 for ; Thu, 26 May 2022 11:25:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347115AbiEZLZN (ORCPT ); Thu, 26 May 2022 07:25:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347111AbiEZLZL (ORCPT ); Thu, 26 May 2022 07:25:11 -0400 Received: from mail-pf1-x433.google.com (mail-pf1-x433.google.com [IPv6:2607:f8b0:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06A79CF for ; Thu, 26 May 2022 04:25:10 -0700 (PDT) Received: by mail-pf1-x433.google.com with SMTP id c65so891729pfb.1 for ; Thu, 26 May 2022 04:25:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=y1f/3FUKg2YyUYx3/MbTyB7pnNCaLCMcoES1T39wi50=; b=cS87Bm6VRCfXYolZ1Qw42BEH41hRPWRSt0+9oSShalGN/GRB6jxQmbT1o6Xs/cff+R TvG0frOj3bvUZD1c3dB1CLyP2sB3LBCuZrveOr/38+9CKKSaTlaNAQ6oo3pikQd62uDp TMRlO73E8xDEKvYQEhtF0D9v4hpRarvp80YhU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=y1f/3FUKg2YyUYx3/MbTyB7pnNCaLCMcoES1T39wi50=; b=QRDFE9xM/fqJe8mdSITYqid9OLZK6xWfuPay/7UuMvNPt+CvnIJHgVdw6Ds55jH5wY LCOIW6i/rb73rUY+D0lRTQa6JPkrb84oY501tVd3ndMNk/dlNZNQ7pJOywegGDhgUqoC q/x6+0MNRYHDxPbho25NqYxhZjmyJskod0k1pxtVOJvts9wnBdhK1XAs7+D5q5xvoguX AogqGzAXyAikeeVhcLOY6u5lURxkrPsxMZN7CPPY3NCuCWzbfv3nPk4HGP2py6HDoVKR XXFKRsOagib52E+9n1DjS06x5bsht/QOo+/G3Wy4L3f/a9Z7zljWpVMGR+oVLshqu/XH wtbg== X-Gm-Message-State: AOAM532jpEPRfT5dgkzqezokL7kiZiD+CXA7DtZJm4rVplrWH+jrz/d4 Xlz44Ly38AqAy05QrD2tcIR3RxGU6vPZEQ== X-Google-Smtp-Source: ABdhPJwjqL9/BuGH+Wmc6OFjRGMMdrGeNZSSjeNX0T4hn1mYBIB5Hbsx0Vi62aIikQoD1ZQPw3lExQ== X-Received: by 2002:a05:6a00:2148:b0:4fa:92f2:bae3 with SMTP id o8-20020a056a00214800b004fa92f2bae3mr38582997pfk.69.1653564309282; Thu, 26 May 2022 04:25:09 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id ct10-20020a056a000f8a00b005182d505389sm1165531pfb.72.2022.05.26.04.25.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:08 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang , Archie Pusaka Subject: [BlueZ PATCH v6 4/8] adapter: support AOSP MGMT_EV_QUALITY_REPORT Date: Thu, 26 May 2022 19:24:52 +0800 Message-Id: <20220526192355.BlueZ.v6.4.Ie4d1be8ced51f0aa92ee6d8eacf9666a121a1292@changeid> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch supports a new MGMT event of AOSP bluetooth quality report. Reviewed-by: Archie Pusaka --- (no changes since v5) Changes in v5: - Do not use the circular inclusion protection for src/shared/aosp.h - Move the is_quality_report_supported() implementation from previous patch to this patch. And make it static. Changes in v4: - Change QUALITY_SPEC_AOSP_BQR to QUALITY_SPEC_AOSP. Changes in v2: - The new structs and constants are moved to separate patches: * doc: Add Bluetooth quality report event * lib: Add structures and constants for quality report - The btmon decoding patches, about 500 lines of code, are ready and will be submitted immediately after these patches are accepted. - Use util_debug instead of defining a new debug function. - Remove the event printing function. - The plan about the BQR events is to further expose them to other daemons, e.g., an audio daemon to make some smart control, or to an UI daemon to display alerts to users. Makefile.am | 3 +- src/adapter.c | 48 +++++++++++++++++++++++++ src/shared/aosp.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++ src/shared/aosp.h | 54 ++++++++++++++++++++++++++++ 4 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 src/shared/aosp.c create mode 100644 src/shared/aosp.h diff --git a/Makefile.am b/Makefile.am index 0074ea3ac..e7b07d345 100644 --- a/Makefile.am +++ b/Makefile.am @@ -230,7 +230,8 @@ shared_sources = src/shared/io.h src/shared/timeout.h \ src/shared/gatt-db.h src/shared/gatt-db.c \ src/shared/gap.h src/shared/gap.c \ src/shared/log.h src/shared/log.c \ - src/shared/tty.h + src/shared/tty.h \ + src/shared/aosp.h src/shared/aosp.c if READLINE shared_sources += src/shared/shell.c src/shared/shell.h diff --git a/src/adapter.c b/src/adapter.c index 2ceea6e1c..8a8aca715 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -47,6 +47,7 @@ #include "src/shared/att.h" #include "src/shared/gatt-db.h" #include "src/shared/timeout.h" +#include "src/shared/aosp.h" #include "btio/btio.h" #include "btd.h" @@ -9195,6 +9196,28 @@ static void controller_resume_callback(uint16_t index, uint16_t length, controller_resume_notify(adapter); } +static void quality_report_callback(uint16_t index, uint16_t length, + const void *param, void *user_data) +{ + const struct mgmt_ev_quality_report *ev = param; + + if (!ev) + return; + + if (length < sizeof(*ev)) { + error("MGMT_EV_QUALITY_REPORT event too small"); + return; + } + + if (ev->quality_spec == QUALITY_SPEC_AOSP) { + if (!process_aosp_quality_report(ev)) + error("processing aosp quality report"); + } else { + error("quality report spec %u not supported.", + ev->quality_spec); + } +} + static void device_blocked_callback(uint16_t index, uint16_t length, const void *param, void *user_data) { @@ -9765,6 +9788,23 @@ static void read_exp_features(struct btd_adapter *adapter) btd_error(adapter->dev_id, "Failed to read exp features info"); } +static bool is_quality_report_supported(struct btd_adapter *adapter) +{ + return !!(adapter->supported_settings & MGMT_SETTING_QUALITY_REPORT); +} + +static void quality_report_debug(const char *str, void *user_data) +{ + const char *prefix = user_data; + + info("%s%s", prefix, str); +} + +static void quality_set_debug(struct btd_adapter *adapter) +{ + aosp_set_debug(quality_report_debug, "quality: "); +} + static void read_info_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { @@ -10003,6 +10043,11 @@ static void read_info_complete(uint8_t status, uint16_t length, controller_resume_callback, adapter, NULL); + mgmt_register(adapter->mgmt, MGMT_EV_QUALITY_REPORT, + adapter->dev_id, + quality_report_callback, + adapter, NULL); + set_dev_class(adapter); set_name(adapter, btd_adapter_get_name(adapter)); @@ -10030,6 +10075,9 @@ static void read_info_complete(uint8_t status, uint16_t length, if (btd_adapter_get_powered(adapter)) adapter_start(adapter); + if (is_quality_report_supported(adapter) && getenv("QUALITY_DEBUG")) + quality_set_debug(adapter); + return; failed: diff --git a/src/shared/aosp.c b/src/shared/aosp.c new file mode 100644 index 000000000..838babea4 --- /dev/null +++ b/src/shared/aosp.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2021 Google LLC + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include +#include +#include +#include + +#include "lib/bluetooth.h" +#include "lib/mgmt.h" + +#include "src/shared/aosp.h" +#include "src/shared/util.h" + +static struct { + aosp_debug_func_t callback; + void *data; +} aosp_debug; + +void aosp_set_debug(aosp_debug_func_t callback, void *user_data) +{ + aosp_debug.callback = callback; + aosp_debug.data = user_data; +} + +bool process_aosp_quality_report(const struct mgmt_ev_quality_report *ev) +{ + const struct aosp_bqr *edata = (struct aosp_bqr *)ev->data; + struct aosp_bqr bqr; + + if (edata->subevent_code != 0x58) { + util_debug(aosp_debug.callback, aosp_debug.data, + "error: %u not AOSP Bluetooth quality report subevent", + edata->subevent_code); + return false; + } + + if (ev->data_len < sizeof(struct aosp_bqr)) { + util_debug(aosp_debug.callback, aosp_debug.data, + "error: AOSP report size %u too small (expect >= %lu).", + ev->data_len, sizeof(struct aosp_bqr)); + return false; + } + + /* Ignore the Vendor Specific Parameter (VSP) field for now + * due to the lack of standard way of reading it. + */ + bqr.quality_report_id = edata->quality_report_id; + bqr.packet_type = edata->packet_type; + bqr.conn_handle = btohs(edata->conn_handle); + bqr.conn_role = edata->conn_role; + bqr.tx_power_level = edata->tx_power_level; + bqr.rssi = edata->rssi; + bqr.snr = edata->snr; + bqr.unused_afh_channel_count = edata->unused_afh_channel_count; + bqr.afh_select_unideal_channel_count = + edata->afh_select_unideal_channel_count; + bqr.lsto = btohs(edata->lsto); + bqr.conn_piconet_clock = btohl(edata->conn_piconet_clock); + bqr.retransmission_count = btohl(edata->retransmission_count); + bqr.no_rx_count = btohl(edata->no_rx_count); + bqr.nak_count = btohl(edata->nak_count); + bqr.last_tx_ack_timestamp = btohl(edata->last_tx_ack_timestamp); + bqr.flow_off_count = btohl(edata->flow_off_count); + bqr.last_flow_on_timestamp = btohl(edata->last_flow_on_timestamp); + bqr.buffer_overflow_bytes = btohl(edata->buffer_overflow_bytes); + bqr.buffer_underflow_bytes = btohl(edata->buffer_underflow_bytes); + + util_debug(aosp_debug.callback, aosp_debug.data, + "AOSP report of connection hanle %u received", bqr.conn_handle); + + return true; +} diff --git a/src/shared/aosp.h b/src/shared/aosp.h new file mode 100644 index 000000000..39b3adcc8 --- /dev/null +++ b/src/shared/aosp.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2021 Google LLC + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include +#include + +struct mgmt_ev_quality_report; + +struct aosp_bqr { + uint8_t subevent_code; + uint8_t quality_report_id; + uint8_t packet_type; + uint16_t conn_handle; + uint8_t conn_role; + int8_t tx_power_level; /* -30 to 20 dbm */ + int8_t rssi; /* -127 to 20 dbm */ + uint8_t snr; /* db */ + uint8_t unused_afh_channel_count; + uint8_t afh_select_unideal_channel_count; + uint16_t lsto; + uint32_t conn_piconet_clock; + uint32_t retransmission_count; + uint32_t no_rx_count; + uint32_t nak_count; + uint32_t last_tx_ack_timestamp; + uint32_t flow_off_count; + uint32_t last_flow_on_timestamp; + uint32_t buffer_overflow_bytes; + uint32_t buffer_underflow_bytes; + + uint8_t vsp[0]; /* Vendor Specific Parameter */ +} __packed; + +typedef void (*aosp_debug_func_t)(const char *str, void *user_data); +void aosp_set_debug(aosp_debug_func_t callback, void *user_data); + +bool process_aosp_quality_report(const struct mgmt_ev_quality_report *ev); From patchwork Thu May 26 11:24:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576998 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B32DC433F5 for ; Thu, 26 May 2022 11:25:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347151AbiEZLZQ (ORCPT ); Thu, 26 May 2022 07:25:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347111AbiEZLZP (ORCPT ); Thu, 26 May 2022 07:25:15 -0400 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37D975D1B5 for ; Thu, 26 May 2022 04:25:13 -0700 (PDT) Received: by mail-pj1-x1032.google.com with SMTP id cs3-20020a17090af50300b001e0808b5838so1486841pjb.1 for ; Thu, 26 May 2022 04:25:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/tNDbEI1VxRo3zt3G4LjzxFBPKmLScnIT5Vf/nmL7qc=; b=NiuGI46zDi77pQ+S6Z4upv5v3LpVZtWwb1i77VSB11poyau31seB+QD1lwSaRDetWt 1d5hqVQoWShg1P2mDb9YKe0yUavS2plvlaGYboAl4WP+AzzuH/lxitFxHGROFdGlAceJ m5V3GnkVmX5Iy0Pgch/NoH7M8UQ7PfJmVxQcY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/tNDbEI1VxRo3zt3G4LjzxFBPKmLScnIT5Vf/nmL7qc=; b=Beq/ZtkMdOplWagYv1W5VDj5J0S4uvlZrR9dCSArYSygN4KdwqBuSuG8ymGvoubasQ tOPvuDFfVIu0yqzzkSsT+OebDxqSKF7xfhszz4+C425r+fcDUCrldP0RTVBOXSR/+IG7 yP8RNGQvWttVVT5e8J9wIh99of2CPpXm43tZqbXsWllRmOUgXU1cJgs5tZGLiGrUSwmZ oQnHpGgkkt7jZRtbIWNrbUYgxTUdHxznw/vZ7RJK6+CFzbbfSDmhsPP9uud+R6XyEdJZ ZpB+ws4Fz/4VkgzQPRzScm64rPfzRx2LMfvr5j05yj22ytldGwfoa31yHKyFFKWa/er3 G/Hg== X-Gm-Message-State: AOAM530YR9EfKddhlWplfriedjU71Q4kp0ko77IU6s17O1ArFVQ9sDi0 46oOP6Hih5J/HmEGxGVfqdbfd3ebOrRNYQ== X-Google-Smtp-Source: ABdhPJxfe2jnIOb9WQ+sa5wMRbjKJkWDXteDGzhjeFQsuRkF66DxrVrxqV4kFVndvt0iBTmgxwVoUw== X-Received: by 2002:a17:90b:3806:b0:1df:99ce:d142 with SMTP id mq6-20020a17090b380600b001df99ced142mr2094344pjb.241.1653564312281; Thu, 26 May 2022 04:25:12 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id y12-20020a17090a390c00b001dbe7ccdd4dsm3428580pjb.10.2022.05.26.04.25.10 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:11 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang , Archie Pusaka Subject: [BlueZ PATCH v6 5/8] adapter: support Intel MGMT_EV_QUALITY_REPORT Date: Thu, 26 May 2022 19:24:53 +0800 Message-Id: <20220526192355.BlueZ.v6.5.Ifdf5cf89a14b4f293d868910c6cb85e802f7eb9e@changeid> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch supports a new MGMT event of Intel telemetry report. Reviewed-by: Archie Pusaka --- (no changes since v5) Changes in v5: - Remove signed-off-by for user space. - Re: "I wonder why you do not use subevent->attr as an union?" My reply: The subevent->attr is a pointer that points to the actual target attribute in either intel_acl_event or intel_sco_event (both of which are combined as a union in intel_ext_telemetry_event). In this way, we do not need to define the subevent functions for the subevents and save lots of code. - Re: "Is the cast really needed here?" My reply: Yes, it is needed. Otherwise, we got a warning: "incompatible pointer types [-Wincompatible-pointer-types]" - Declare "const uint8_t data[];" in struct mgmt_ev_quality_report for ev->data in lib/mgmt.h. - In quality_set_debug(), call intel_set_debug() and aosp_set_debug() for both specifications. - Do not use the circular inclusion protection for src/shared/intel.h Changes in v4: - Change QUALITY_SPEC_INTEL_TELEMETRY to QUALITY_SPEC_INTEL. Changes in v2: - Remove the event printing function. The btmon decoding patches are ready and will be submitted after these are accepted. Makefile.am | 3 +- src/adapter.c | 5 + src/shared/intel.c | 243 +++++++++++++++++++++++++++++++++++++++++++++ src/shared/intel.h | 150 ++++++++++++++++++++++++++++ 4 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 src/shared/intel.c create mode 100644 src/shared/intel.h diff --git a/Makefile.am b/Makefile.am index e7b07d345..f644d56a4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -231,7 +231,8 @@ shared_sources = src/shared/io.h src/shared/timeout.h \ src/shared/gap.h src/shared/gap.c \ src/shared/log.h src/shared/log.c \ src/shared/tty.h \ - src/shared/aosp.h src/shared/aosp.c + src/shared/aosp.h src/shared/aosp.c \ + src/shared/intel.h src/shared/intel.c if READLINE shared_sources += src/shared/shell.c src/shared/shell.h diff --git a/src/adapter.c b/src/adapter.c index 8a8aca715..7dbad7b43 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -48,6 +48,7 @@ #include "src/shared/gatt-db.h" #include "src/shared/timeout.h" #include "src/shared/aosp.h" +#include "src/shared/intel.h" #include "btio/btio.h" #include "btd.h" @@ -9212,6 +9213,9 @@ static void quality_report_callback(uint16_t index, uint16_t length, if (ev->quality_spec == QUALITY_SPEC_AOSP) { if (!process_aosp_quality_report(ev)) error("processing aosp quality report"); + } else if (ev->quality_spec == QUALITY_SPEC_INTEL) { + if (!process_intel_telemetry_report(ev)) + error("processing intel telemetry report"); } else { error("quality report spec %u not supported.", ev->quality_spec); @@ -9802,6 +9806,7 @@ static void quality_report_debug(const char *str, void *user_data) static void quality_set_debug(struct btd_adapter *adapter) { + intel_set_debug(quality_report_debug, "quality: "); aosp_set_debug(quality_report_debug, "quality: "); } diff --git a/src/shared/intel.c b/src/shared/intel.c new file mode 100644 index 000000000..5d7c0d0ad --- /dev/null +++ b/src/shared/intel.c @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2021 Google LLC + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include +#include +#include +#include + +#include "lib/bluetooth.h" +#include "lib/mgmt.h" + +#include "src/shared/intel.h" +#include "src/shared/util.h" + +#define COMPANY_ID_INTEL 0x0002 + +struct intel_ext_telemetry_event tev; + +static struct { + intel_debug_func_t callback; + void *data; +} intel_debug; + +/* Use offsetof to access the attributes of structures. This makes + * simple traversing and assigning values to the attributes. + */ +#define TELEM_OFFSET(a) offsetof(struct intel_ext_telemetry_event, a) +#define TELEM_ATTR(a) (((uint8_t *)&tev) + TELEM_OFFSET(a)) + +#define ACL_OFFSET(a) offsetof(struct intel_acl_event, a) +#define ACL_ATTR(a) (((uint8_t *)&tev.conn.acl) + ACL_OFFSET(a)) +#define ACL_ATTR_ARRAY(a, i) (ACL_ATTR(a) + i * sizeof(tev.conn.acl.a[0])) + +#define SCO_OFFSET(a) offsetof(struct intel_sco_event, a) +#define SCO_ATTR(a) (((uint8_t *)&tev.conn.sco) + SCO_OFFSET(a)) + +static const struct intel_ext_subevent { + uint8_t id; + uint8_t size; + uint8_t elements; + uint8_t *attr; /* address of the attribute in tev */ +} intel_ext_subevent_table[] = { + { 0x01, 1, 1, TELEM_ATTR(telemetry_ev_type) }, + + /* ACL audio link quality subevents */ + { 0x4a, 2, 1, ACL_ATTR(conn_handle) }, + { 0x4b, 4, 1, ACL_ATTR(rx_hec_error) }, + { 0x4c, 4, 1, ACL_ATTR(rx_crc_error) }, + { 0x4d, 4, 1, ACL_ATTR(packets_from_host) }, + { 0x4e, 4, 1, ACL_ATTR(tx_packets) }, + { 0x4f, 4, 1, ACL_ATTR_ARRAY(tx_packets_retry, 0) }, + { 0x50, 4, 1, ACL_ATTR_ARRAY(tx_packets_retry, 1) }, + { 0x51, 4, 1, ACL_ATTR_ARRAY(tx_packets_retry, 2) }, + { 0x52, 4, 1, ACL_ATTR_ARRAY(tx_packets_retry, 3) }, + { 0x53, 4, 1, ACL_ATTR_ARRAY(tx_packets_retry, 4) }, + { 0x54, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 0) }, + { 0x55, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 1) }, + { 0x56, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 2) }, + { 0x57, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 3) }, + { 0x58, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 4) }, + { 0x59, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 5) }, + { 0x5a, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 6) }, + { 0x5b, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 7) }, + { 0x5c, 4, 1, ACL_ATTR_ARRAY(tx_packets_by_type, 8) }, + { 0x5d, 4, 1, ACL_ATTR(rx_packets) }, + { 0x5e, 4, 1, ACL_ATTR(link_throughput) }, + { 0x5f, 4, 1, ACL_ATTR(max_packet_letency) }, + { 0x60, 4, 1, ACL_ATTR(avg_packet_letency) }, + + /* SCO/eSCO audio link quality subevents */ + { 0x6a, 2, 1, SCO_ATTR(conn_handle) }, + { 0x6b, 4, 1, SCO_ATTR(packets_from_host) }, + { 0x6c, 4, 1, SCO_ATTR(tx_packets) }, + { 0x6d, 4, 1, SCO_ATTR(rx_payload_lost) }, + { 0x6e, 4, 1, SCO_ATTR(tx_payload_lost) }, + { 0x6f, 4, 5, SCO_ATTR(rx_no_sync_error) }, + { 0x70, 4, 5, SCO_ATTR(rx_hec_error) }, + { 0x71, 4, 5, SCO_ATTR(rx_crc_error) }, + { 0x72, 4, 5, SCO_ATTR(rx_nak_error) }, + { 0x73, 4, 5, SCO_ATTR(tx_failed_wifi_coex) }, + { 0x74, 4, 5, SCO_ATTR(rx_failed_wifi_coex) }, + { 0x75, 4, 1, SCO_ATTR(samples_inserted_by_CDC) }, + { 0x76, 4, 1, SCO_ATTR(samples_dropped) }, + { 0x77, 4, 1, SCO_ATTR(mute_samples) }, + { 0x78, 4, 1, SCO_ATTR(plc_injection) }, + + /* end */ + { 0x0, 0, 0 } +}; + +bool is_manufacturer_intel(uint16_t manufacturer) +{ + return manufacturer == COMPANY_ID_INTEL; +} + +void intel_set_debug(intel_debug_func_t callback, void *user_data) +{ + intel_debug.callback = callback; + intel_debug.data = user_data; +} + +static const struct intel_tlv *process_ext_subevent( + struct intel_ext_telemetry_event *tev, + const struct intel_tlv *tlv, + const struct intel_tlv *last_tlv) +{ + const struct intel_tlv *next_tlv = NEXT_TLV(tlv); + const struct intel_ext_subevent *subevent = NULL; + int i; + + for (i = 0; intel_ext_subevent_table[i].size > 0; i++) { + if (intel_ext_subevent_table[i].id == tlv->id) { + subevent = &intel_ext_subevent_table[i]; + break; + } + } + + if (!subevent) { + util_debug(intel_debug.callback, intel_debug.data, + "error: unknown Intel telemetry subevent 0x%2.2x", + tlv->id); + return NULL; + } + + if (tlv->length != subevent->size * subevent->elements) { + util_debug(intel_debug.callback, intel_debug.data, + "error: invalid length %d of subevent 0x%2.2x", + tlv->length, tlv->id); + return NULL; + } + + if (next_tlv > last_tlv) { + util_debug(intel_debug.callback, intel_debug.data, + "error: subevent 0x%2.2x exceeds the buffer size.", + tlv->id); + return NULL; + } + + /* Assign tlv value to the corresponding attribute of acl/sco struct. */ + switch (subevent->size) { + case 1: + *subevent->attr = get_u8(tlv->value); + break; + + case 2: + *((uint16_t *)subevent->attr) = get_le16(tlv->value); + break; + + case 4: + if (subevent->elements == 1) { + *((uint32_t *)subevent->attr) = get_le32(tlv->value); + break; + } + + for (i = 0; i < subevent->elements; i++) { + /* Both acl and sco structs are __packed such that + * the addresses of array elements can be calculated. + */ + *((uint32_t *)(subevent->attr + i * subevent->size)) = + get_le32((uint32_t *)tlv->value + i); + } + break; + + default: + util_debug(intel_debug.callback, intel_debug.data, + "error: subevent id %u: size %u not supported", + subevent->id, subevent->size); + break; + + } + + switch (subevent->id) { + case EXT_EVT_TYPE: + /* Only interested in the LINK_QUALITY_REPORT type for now. */ + if (*subevent->attr != LINK_QUALITY_REPORT) + return NULL; + break; + + case ACL_CONNECTION_HANDLE: + tev->link_type = TELEMETRY_ACL_LINK; + break; + + case SCO_CONNECTION_HANDLE: + tev->link_type = TELEMETRY_SCO_LINK; + break; + + default: + break; + } + + return next_tlv; +} + +struct intel_telemetry_data { + uint16_t vendor_prefix; + uint8_t code; + uint8_t data[]; /* a number of struct intel_tlv subevents */ +} __packed; + +bool process_intel_telemetry_report(const struct mgmt_ev_quality_report *ev) +{ + struct intel_telemetry_data *telemetry = + (struct intel_telemetry_data *)ev->data; + + /* The telemetry->data points to a number of consecutive tlv.*/ + const struct intel_tlv *tlv = (const struct intel_tlv *)telemetry->data; + const struct intel_tlv *last_tlv = + (const struct intel_tlv *)(ev->data + ev->data_len); + + if (telemetry->code != 0x03) { + util_debug(intel_debug.callback, intel_debug.data, + "error: %u not Intel telemetry sub-opcode", + telemetry->code); + return false; + } + + /* Read every tlv subevent into tev. + * The decoding process terminates normally when tlv == last_tlv. + */ + memset(&tev, 0, sizeof(tev)); + while (tlv && tlv < last_tlv) + tlv = process_ext_subevent(&tev, tlv, last_tlv); + + /* If the decoding completes successfully, tlv would be non-NULL */ + return !!tlv; +} diff --git a/src/shared/intel.h b/src/shared/intel.h new file mode 100644 index 000000000..f1c5729ef --- /dev/null +++ b/src/shared/intel.h @@ -0,0 +1,150 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2021 Google LLC + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include + +struct mgmt_ev_quality_report; + +enum intel_telemetry_event_type { + SYSTEM_EXCEPTION, + FATAL_EXCEPTION, + DEBUG_EXCEPTION, + CONNECTION_EVENT, + DISCONNECTION_EVENT, + LINK_QUALITY_REPORT, +}; + +enum intel_telemetry_link_type { + TELEMETRY_UNKNOWN_LINK, + TELEMETRY_ACL_LINK, + TELEMETRY_SCO_LINK, +}; + +/* The subevent indices of the complete list of Intel telemetry subevents. */ +enum intel_subevt_list { + EXT_EVT_TYPE = 0x01, + + ACL_CONNECTION_HANDLE = 0x4a, + ACL_HEC_ERRORS, + ACL_CRC_ERRORS, + ACL_PACKETS_FROM_HOST, + ACL_TX_PACKETS_TO_AIR, + ACL_TX_PACKETS_0_RETRY, + ACL_TX_PACKETS_1_RETRY, + ACL_TX_PACKETS_2_RETRY, + ACL_TX_PACKETS_3_RETRY, + ACL_TX_PACKETS_MORE_RETRY, + ACL_TX_PACKETS_DH1, + ACL_TX_PACKETS_DH3, + ACL_TX_PACKETS_DH5, + ACL_TX_PACKETS_2DH1, + ACL_TX_PACKETS_2DH3, + ACL_TX_PACKETS_2DH5, + ACL_TX_PACKETS_3DH1, + ACL_TX_PACKETS_3DH3, + ACL_TX_PACKETS_3DH5, + ACL_RX_PACKETS, + ACL_LINK_THROUGHPUT, + ACL_MAX_PACKET_LATENCY, + ACL_AVG_PACKET_LATENCY, + + SCO_CONNECTION_HANDLE = 0x6a, + SCO_RX_PACKETS, + SCO_TX_PACKETS, + SCO_RX_PACKETS_LOST, + SCO_TX_PACKETS_LOST, + SCO_RX_NO_SYNC_ERROR, + SCO_RX_HEC_ERROR, + SCO_RX_CRC_ERROR, + SCO_RX_NAK_ERROR, + SCO_TX_FAILED_BY_WIFI, + SCO_RX_FAILED_BY_WIFI, + SCO_SAMPLES_INSERTED, + SCO_SAMPLES_DROPPED, + SCO_MUTE_SAMPLES, + SCO_PLC_INJECTION_DATA, +}; + +#define INTEL_NUM_SLOTS 5 +#define INTEL_NUM_RETRIES 5 +#define INTEL_NUM_PACKET_TYPES 9 + +/* An Intel telemetry subevent is of the TLV format. + * - id: takes 1 byte. This is the subevent id. + * - length: takes 1 byte. + * - value: takes |length| bytes. + */ +struct intel_tlv { + uint8_t id; + uint8_t length; + uint8_t value[0]; +}; + +#define TLV_SIZE(tlv) (*((const uint8_t *) tlv + 1) + 2 * sizeof(uint8_t)) +#define NEXT_TLV(tlv) ((const struct intel_tlv *)\ + ((const uint8_t *)tlv + TLV_SIZE(tlv))) + +struct intel_acl_event { + uint16_t conn_handle; + uint32_t rx_hec_error; + uint32_t rx_crc_error; + uint32_t packets_from_host; + uint32_t tx_packets; + uint32_t tx_packets_retry[INTEL_NUM_RETRIES]; + uint32_t tx_packets_by_type[INTEL_NUM_PACKET_TYPES]; + uint32_t rx_packets; + uint32_t link_throughput; + uint32_t max_packet_letency; + uint32_t avg_packet_letency; +} __packed; + +struct intel_sco_event { + uint16_t conn_handle; + uint32_t packets_from_host; + uint32_t tx_packets; + uint32_t rx_payload_lost; + uint32_t tx_payload_lost; + uint32_t rx_no_sync_error[INTEL_NUM_SLOTS]; + uint32_t rx_hec_error[INTEL_NUM_SLOTS]; + uint32_t rx_crc_error[INTEL_NUM_SLOTS]; + uint32_t rx_nak_error[INTEL_NUM_SLOTS]; + uint32_t tx_failed_wifi_coex[INTEL_NUM_SLOTS]; + uint32_t rx_failed_wifi_coex[INTEL_NUM_SLOTS]; + uint32_t samples_inserted_by_CDC; + uint32_t samples_dropped; + uint32_t mute_samples; + uint32_t plc_injection; +} __packed; + +struct intel_ext_telemetry_event { + uint8_t telemetry_ev_type; /* one in enum intel_telemetry_event_type */ + uint8_t link_type; + union { + struct intel_sco_event sco; + struct intel_acl_event acl; + } conn; +} __packed; + +typedef void (*intel_debug_func_t)(const char *str, void *user_data); + +bool is_manufacturer_intel(uint16_t manufacturer); +void intel_set_debug(intel_debug_func_t callback, void *user_data); + +bool process_intel_telemetry_report(const struct mgmt_ev_quality_report *ev); From patchwork Thu May 26 11:24:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576274 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2FEE7C433EF for ; Thu, 26 May 2022 11:25:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347150AbiEZLZT (ORCPT ); Thu, 26 May 2022 07:25:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56288 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347157AbiEZLZQ (ORCPT ); Thu, 26 May 2022 07:25:16 -0400 Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6FE2606F2 for ; Thu, 26 May 2022 04:25:15 -0700 (PDT) Received: by mail-pl1-x62b.google.com with SMTP id w3so1170949plp.13 for ; Thu, 26 May 2022 04:25:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iGlj04Mi5nngiygdPdb7T+B1GHVKoXZjOQpzbPK0PSY=; b=Aj6HPlfPIleBeN8vZn+q38/k4/SzIWN/ZdsA42R9BvyxlA6JBDAadGoaFRyvDm8HGs 8hfT1xRVB8hSm+4kQmDxyc+LyaW5EamwAiEguSWZX53W3xhnkkbKAv2EkRl7x2MjyeCF ph8idBJrFCOITK9wO0BMiAxGIp6JrZlchWIXU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=iGlj04Mi5nngiygdPdb7T+B1GHVKoXZjOQpzbPK0PSY=; b=JSJZ8K3CTVrQ2uveQofyjm8jzkYdK9H8eYeIGgT+3n/Pyq/LrZAxXJ1yFrMzUoBw8z QDdpcDc89CIQ7thDIWjFYgMz7EgqWNAhzn7RPNdOnir3eIfQqIUdV3p0CkxEYQAbB9GI UbskVa7TCdaLgQ8Zvbmaocanru07A2zmUIvFeBYR4FQ15T4/0HaN93U395DyyrCj9P1Y z3UtfshqbPgHl6wWBzt6F5aseIREl/e1vHTouYfMZtPuBg4tUd5tH1UVQAYvECCN6SgF wJJbhq20CQc9c9Qkm24pMd7btCKyznnR1WPkoi/9xbK+LFvKVjEfoMP55gmWtZcA48bs w4AQ== X-Gm-Message-State: AOAM531g9wnakAdvi1aRdYXZb7I8AhfNFqsBdBWSKodRk66b4Lr2TcQY /adu8j4et64obH8d18MHmhpj5qsBh7jfog== X-Google-Smtp-Source: ABdhPJwaRrANQ8ZvCENVaAWiktcrRO6+Ownib9BLV3vbuGmvCe1vvz+7gPrcIcoGgY14yRvgSLGHlA== X-Received: by 2002:a17:90a:ee96:b0:1e0:ce34:a1ed with SMTP id i22-20020a17090aee9600b001e0ce34a1edmr2150665pjz.26.1653564314865; Thu, 26 May 2022 04:25:14 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id p20-20020a17090a931400b001e077dca3fasm1238326pjo.40.2022.05.26.04.25.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:14 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang Subject: [BlueZ PATCH v6 6/8] tools/btmgmt: fix quality report command Date: Thu, 26 May 2022 19:24:54 +0800 Message-Id: <20220526112456.2488536-4-josephsih@chromium.org> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org The set quality report feature becomes a mgmt command and is not included in the experimental features any more. --- (no changes since v5) Changes in v5: - Use quality_report instead of action in cmd_exp_quality(). Changes in v4: - Add "quality-report" in settings_str. - Print current_settings in quality_rsp. Changes in v3: - This is a new patch that fixes the quality on/off command in btmgmt. tools/btmgmt.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tools/btmgmt.c b/tools/btmgmt.c index 8f63f12ba..bab67e63b 100644 --- a/tools/btmgmt.c +++ b/tools/btmgmt.c @@ -353,6 +353,7 @@ static const char *settings_str[] = { "static-addr", "phy-configuration", "wide-band-speech", + "quality-report", }; static const char *settings2str(uint32_t settings) @@ -1842,26 +1843,28 @@ static void cmd_exp_privacy(int argc, char **argv) } } -static void exp_quality_rsp(uint8_t status, uint16_t len, const void *param, +static void quality_rsp(uint8_t status, uint16_t len, const void *param, void *user_data) { - if (status != 0) + const struct mgmt_rp_set_quality_report *rp = param; + uint32_t current_settings; + + if (status != 0) { error("Set Quality Report feature failed: 0x%02x (%s)", status, mgmt_errstr(status)); - else - print("Quality Report feature successfully set"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + current_settings = le32_to_cpu(rp->current_settings); + print("Quality Report feature successfully set"); + print("\tcurrent settings: %s", settings2str(current_settings)); bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_exp_quality(int argc, char **argv) { - /* 330859bc-7506-492d-9370-9a6f0614037f */ - static const uint8_t uuid[16] = { - 0x7f, 0x03, 0x14, 0x06, 0x6f, 0x9a, 0x70, 0x93, - 0x2d, 0x49, 0x06, 0x75, 0xbc, 0x59, 0x08, 0x33, - }; - struct mgmt_cp_set_exp_feature cp; + struct mgmt_cp_set_quality_report cp; uint8_t val; if (mgmt_index == MGMT_INDEX_NONE) { @@ -1878,11 +1881,10 @@ static void cmd_exp_quality(int argc, char **argv) } memset(&cp, 0, sizeof(cp)); - memcpy(cp.uuid, uuid, 16); - cp.action = val; + cp.quality_report = val; - if (mgmt_send(mgmt, MGMT_OP_SET_EXP_FEATURE, mgmt_index, - sizeof(cp), &cp, exp_quality_rsp, NULL, NULL) == 0) { + if (mgmt_send(mgmt, MGMT_OP_SET_QUALITY_REPORT, mgmt_index, + sizeof(cp), &cp, quality_rsp, NULL, NULL) == 0) { error("Unable to send quality report feature cmd"); return bt_shell_noninteractive_quit(EXIT_FAILURE); } @@ -5636,10 +5638,10 @@ static const struct bt_shell_menu main_menu = { cmd_exp_debug, "Set debug feature" }, { "exp-privacy", "", cmd_exp_privacy, "Set LL privacy feature" }, - { "exp-quality", "", cmd_exp_quality, - "Set bluetooth quality report feature" }, { "exp-offload", "", cmd_exp_offload_codecs, "Toggle codec support" }, + { "quality", "", + cmd_exp_quality, "Set bluetooth quality report feature" }, { "read-sysconfig", NULL, cmd_read_sysconfig, "Read System Configuration" }, { "set-sysconfig", "<-v|-h> [options...]", From patchwork Thu May 26 11:24:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576997 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DFDA0C433FE for ; Thu, 26 May 2022 11:25:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347156AbiEZLZU (ORCPT ); Thu, 26 May 2022 07:25:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56364 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245265AbiEZLZT (ORCPT ); Thu, 26 May 2022 07:25:19 -0400 Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D9CDB5C75B for ; Thu, 26 May 2022 04:25:18 -0700 (PDT) Received: by mail-pj1-x1036.google.com with SMTP id gz24so1494665pjb.2 for ; Thu, 26 May 2022 04:25:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=RQyL9hl58hb4vBidS+w324Rh2XQfFyfi08875p0ZLPg=; b=WLXPXgIJX3xvBTUQuKVSEKPGh2wJxUPPuHbODQkDjjNNdWkUrjX5Au+GqN4FCSJTV5 Og8T10RYl390Ky/z08zRwCui5dmfGQVYb25NclFuo6jWPg0X2uHDI2VzAG0MjnhtPoau B7ULeDobUAg36D0o0zkLBT3+ED0qjXpo+3ZQs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RQyL9hl58hb4vBidS+w324Rh2XQfFyfi08875p0ZLPg=; b=KmfG75iVkgcsj/8daC8tO0++uPL0Ytmt/EX46UmM5+2d9ddNSEvTAQjKW3nHywNmlU DQwSkUikwL5MuAC06eTDhNaTCgUl/n7I8guRiYAAT/WpO7Ht37XF7naJuOFyIh1Tih1K jhNQAo3QXE1qwfO172K4nH2zW8uf059K+XC4en16Nur425srcTVoq2QXa4mgLoPahe0Q UZeebFigKMYrJLGvbYsx4/DnxiZMsDAQwQjS01tJ8VJxuoIDFYbDHtoKzQLjjDdoazt1 C7pzRloq4fZxz8L48Hu77fy+cW48+yr4uziLh3PHHrms6yVQlmENj6X3er/QQyoismXW YWuQ== X-Gm-Message-State: AOAM532k0CyVJhFgVsjyXKvIxeBgTeEB0gGS3KmX+4QMh55ZxNh+Yl8E A4pVKRYdrzMZ5JlQo21VvADVR6QOOIFJPw== X-Google-Smtp-Source: ABdhPJwSbGbxjgeSguwP3RnhyhZXrhOSdRoHX7J/CzjmarskMCPSZEfa/A9todHRLI/U+qQreHcVYA== X-Received: by 2002:a17:90a:149:b0:1df:3da1:3549 with SMTP id z9-20020a17090a014900b001df3da13549mr2131852pje.90.1653564318050; Thu, 26 May 2022 04:25:18 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id u9-20020aa78489000000b0050dc76281a4sm1233530pfn.126.2022.05.26.04.25.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:17 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang Subject: [BlueZ PATCH v6 7/8] monitor: print quality report cmd Date: Thu, 26 May 2022 19:24:55 +0800 Message-Id: <20220526112456.2488536-5-josephsih@chromium.org> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch prints the set quality command properly. --- (no changes since v4) Changes in v4: - Use get_u8() to replace *(uint8_t *). - Use mgmt_new_settings_rsp as the rsp_func in mgmt_command_table for Set Quality Report. Changes in v3: - This is a new patch that prints the set quality command. monitor/packet.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/monitor/packet.c b/monitor/packet.c index e854c1a8e..851296ee6 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -12552,6 +12552,7 @@ static const struct bitfield_data mgmt_settings_table[] = { { 15, "Static Address" }, { 16, "PHY Configuration" }, { 17, "Wideband Speech" }, + { 18, "Quality Report" }, { } }; @@ -14148,6 +14149,13 @@ static void mgmt_remove_adv_monitor_patterns_rsp(const void *data, print_field("Handle: %d", handle); } +static void mgmt_set_quality_report_cmd(const void *data, uint16_t size) +{ + uint8_t action = get_u8(data); + + print_field("Set Quality Report %u", action); +} + struct mgmt_data { uint16_t opcode; const char *str; @@ -14405,6 +14413,9 @@ static const struct mgmt_data mgmt_command_table[] = { mgmt_add_adv_monitor_patterns_rssi_cmd, 8, false, mgmt_add_adv_monitor_patterns_rsp, 2, true}, + { 0x0057, "Set Quality Report", + mgmt_set_quality_report_cmd, 1, true, + mgmt_new_settings_rsp, 4, true }, { } }; From patchwork Thu May 26 11:24:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Hwang X-Patchwork-Id: 576273 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E6B91C433F5 for ; Thu, 26 May 2022 11:25:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245265AbiEZLZX (ORCPT ); Thu, 26 May 2022 07:25:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347158AbiEZLZV (ORCPT ); Thu, 26 May 2022 07:25:21 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A7E55D1B5 for ; Thu, 26 May 2022 04:25:21 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id a13so1193590plh.6 for ; Thu, 26 May 2022 04:25:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ySQEG2VohkZ7Y1G2FbtZgKUEZ+qLmIWmonRCjlk0Uto=; b=WZIvL4ctAhiGiXT+aEnWB1MMJnGrE0Yld86+G8pb+0nm1NEb4O3vCjt/El3BMO+8mj ltwRJ7gIbwlFbXW8iTHeTSKQPOFqYBOm9acwrRrjhQRP3JOfLspTlgjunbSQxm24T6mN 7zalsqddMO5e6P9NkO4CxTZfpjK3rBMMRHqd8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ySQEG2VohkZ7Y1G2FbtZgKUEZ+qLmIWmonRCjlk0Uto=; b=PfOKQcJSLoaBtLVtpIdJPYmb7WAeqqiE8aTu/SIjoPiQeEFxDn9MAWciKcw8n1PkgI JIMpjXihzFb06Mmc9ZVa5OTLydv2M326FPoDyzrANihQRcg/1jjmVrYV2dbuHcj/KsOa XiHdnFaI7YKyv4KZxvxO+6X5d1J3jEX3QXZcW7vvxOcoKxmcJybUwEzWWXIRQZx8SNY4 55BcP6hihzXVekqJc0SsFcUdBLlYuFKEr5AGXwf6MZwmT7NNVXu+tnOVE350hYIPWPNL 3ay1rj4fUnRfspxpfKbKoamhYznGslNQPin1rTAkuti8UmsKt1ofI3kkAfUCCzEBoHZp 6Qbg== X-Gm-Message-State: AOAM530ZoQGOCiPsazzgTUw7hJlrAHlPwY1tUroyn1+exKUMj0oHqXh1 v2NgqrM67bF1Mlj8oR8txX4f957fkeXNNw== X-Google-Smtp-Source: ABdhPJybsyA7Q8lNvZxqlooDl0W2oeWcu7y657WgIXlDWqPSU8V/GPt0qixyVqRgEpSZ2olF9LPVYA== X-Received: by 2002:a17:902:8644:b0:153:9f01:2090 with SMTP id y4-20020a170902864400b001539f012090mr36565843plt.101.1653564320761; Thu, 26 May 2022 04:25:20 -0700 (PDT) Received: from localhost (174.71.80.34.bc.googleusercontent.com. [34.80.71.174]) by smtp.gmail.com with UTF8SMTPSA id f3-20020aa79d83000000b0050dc76281f0sm1220385pfq.202.2022.05.26.04.25.19 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 May 2022 04:25:20 -0700 (PDT) From: Joseph Hwang To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com, pali@kernel.org Cc: josephsih@google.com, chromeos-bluetooth-upstreaming@chromium.org, Joseph Hwang Subject: [BlueZ PATCH v6 8/8] monitor: packet: add missing decodings of MGMT commands to todo Date: Thu, 26 May 2022 19:24:56 +0800 Message-Id: <20220526112456.2488536-6-josephsih@chromium.org> X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog In-Reply-To: <20220526112456.2488536-1-josephsih@chromium.org> References: <20220526112456.2488536-1-josephsih@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch adds the missing decodings of MGMT commands to btmon --todo. --- (no changes since v4) Changes in v4: - This is a new patch that adds the missing decodings of MGMT commands. monitor/packet.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/monitor/packet.c b/monitor/packet.c index 851296ee6..c26a80110 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -15237,4 +15237,13 @@ void packet_todo(void) printf("\t%s\n", le_meta_event_table[i].str); } + + printf("MGMT commands with missing decodings:\n"); + + for (i = 0; mgmt_command_table[i].str; i++) { + if (mgmt_command_table[i].func) + continue; + + printf("\t%s\n", mgmt_command_table[i].str); + } }