From patchwork Fri Dec 2 00:50:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 630388 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 A6F75C4332F for ; Fri, 2 Dec 2022 00:50:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231955AbiLBAu4 (ORCPT ); Thu, 1 Dec 2022 19:50:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41804 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231358AbiLBAuz (ORCPT ); Thu, 1 Dec 2022 19:50:55 -0500 Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DC34C727A for ; Thu, 1 Dec 2022 16:50:54 -0800 (PST) Received: by mail-pl1-x629.google.com with SMTP id 4so3291667pli.0 for ; Thu, 01 Dec 2022 16:50:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=rIuN04fzi/QvqGgsYhrpXfuUt7W+BqBRJCjrS+p5YYk=; b=AuOSfsUjbbRTE8sWYgzymwnF7TCxo/JK2hNKD0935Cq4vDBjQvzorS8nTiOdXoVUi1 WX2ob+IgQU6OuICclpfqUYr31bQkkQSKwBg+ANzl+2c7e7jLcXmAKMKF04gykKp5YrtN RW2gJ9vhJcmDDb59x6WO/OPwvJF1fUFAhBgn1F1I4mmk/vAK2yrUAJ5sZU3TBh3MOzLr vdDWH6w3jvOJqwmXjm2fu4HiZhnD0UOQJZJ66Ffsbupy7lo80JyvrnsljR9d8BKE/m82 cijd5hnfZxFG/xrVDQq7uOOvSj2lQqWNVzAQA1dxlLIwvdJa2Xjb/y7V7suKXN49q3WJ YRIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=rIuN04fzi/QvqGgsYhrpXfuUt7W+BqBRJCjrS+p5YYk=; b=DXDv9JhD1YX8fbT71g0OvgPEwGQnZ4bWxI2jVUTpENXLGa1aJXKz499F3Zia4x7Tgs H3MRZ0BIazRG5HShBY5ULdCw6DDi4YpHy0IXVGdxGjWGH0isJOBD+hfEMxbyfmhwl/oq oBVkwJqnHWPud0Z0x3cVSs0ogm82OUBPeG0fXH04vf1+ajMtKDT4LzExaoMJMyYIjnbL IPIiOn7nfSczURftE4D/pTlGiatngn1pCA9zKqmvZTYhgEFd0DLhIsvp9n5P1qECfZM3 5bRYGPW+rS7wme8Zw8WPi7Z5GzJj75+oY9YfRYM/twiB/+GDH6VY6h4iXLT55zEoPtsx BndA== X-Gm-Message-State: ANoB5plvETCahm46/BqNrHtYhewl+sIVhXlTu+L+dSlEOUExbkquaBnp IsQybQ8mkl5bhwXCYNbz9J3d4l0NWDibBw== X-Google-Smtp-Source: AA0mqf5yUlEjsnF22wdRFcfKJc1l5Pk1n9p3iyJcuVHsmEBO2BFv03WffzARxnOHnoDJNLReOcp9bw== X-Received: by 2002:a17:902:e849:b0:17a:aca0:e295 with SMTP id t9-20020a170902e84900b0017aaca0e295mr63714984plg.3.1669942253385; Thu, 01 Dec 2022 16:50:53 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:50:52 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 1/8] shared/bap: Fix not reading all instances of PAC Sinks/Sources Date: Thu, 1 Dec 2022 16:50:44 -0800 Message-Id: <20221202005051.2401504-1-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz Both PAC Sink and Source are allowed to have multiple instances: - The server wanted to support a smaller maximum transmission unit (ATT_MTU, as defined in Volume 3, Part F, Section 3.2.8 in [2]) size. Exposing all supported PAC records in a single Sink PAC characteristic would require the server to increase its supported Maximum Transmission Unit (MTU) size to a value the server considered excessive. - The server wanted to expose support for proprietary audio capabilities (such as vendor-specific audio codecs, as denoted by the Codec_ID parameter value) separately from support for non-vendor-specific audio capabilities and used separate Sink PAC characteristics to expose such support. - The server wanted to minimize the amount of data to be transferred, when sending notifications to a client that the Sink PAC characteristic value changed, by exposing the audio capabilities likely to change quicker than others in separate Sink PAC characteristics. --- src/shared/bap.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 21aa8aa6c5ca..7a24824a71fc 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -2908,10 +2908,12 @@ static void foreach_pacs_char(struct gatt_db_attribute *attr, void *user_data) DBG(bap, "Sink PAC found: handle 0x%04x", value_handle); pacs = bap_get_pacs(bap); - if (!pacs || pacs->sink) + if (!pacs) return; - pacs->sink = attr; + if (!pacs->sink) + pacs->sink = attr; + bap_read_value(bap, value_handle, read_sink_pac, bap); } @@ -2919,10 +2921,12 @@ static void foreach_pacs_char(struct gatt_db_attribute *attr, void *user_data) DBG(bap, "Source PAC found: handle 0x%04x", value_handle); pacs = bap_get_pacs(bap); - if (!pacs || pacs->source) + if (!pacs) return; - pacs->source = attr; + if (!pacs->source) + pacs->source = attr; + bap_read_value(bap, value_handle, read_source_pac, NULL); } From patchwork Fri Dec 2 00:50:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 631129 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 D5C12C4332F for ; Fri, 2 Dec 2022 00:50:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231961AbiLBAu5 (ORCPT ); Thu, 1 Dec 2022 19:50:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231962AbiLBAu4 (ORCPT ); Thu, 1 Dec 2022 19:50:56 -0500 Received: from mail-pg1-x52a.google.com (mail-pg1-x52a.google.com [IPv6:2607:f8b0:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A23B5BDCD4 for ; Thu, 1 Dec 2022 16:50:55 -0800 (PST) Received: by mail-pg1-x52a.google.com with SMTP id f3so3125276pgc.2 for ; Thu, 01 Dec 2022 16:50:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=3I4QWhGq5+m0mrFdydgsfIx9xuQMIkAkxU6vd+76M+8=; b=XlokXcFQ/Yz9y2MzWNVZKpMrzqUV8yT5Q5EXf59gB51nuiBXzHwMQWVeXewxS6bk08 NkZDFyvCslN7pSM4DSE3wAb1YpR3McUhYyLMgdHkN/ql/CYODuhUab0etqZu6+SFQFpK 4EQkTENNEtU0rx7d6yFm9nVbJTGaBJVlhQgCMcOTu5K2NHEN6k0YSq0H3Rvr56t5ysGs 3PSBo4Qxv4yNC7QbuGQxalaaCm9lXyVzkbLZ07u6+WFHy34QknE475DQ2mwdwitUa55P +VW+V0czRKg8Rh54W4YtD2/c+MjFkaoXEBLvMrjd3ppcOj54INpTaczuyus6cJ87cu/H FZEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3I4QWhGq5+m0mrFdydgsfIx9xuQMIkAkxU6vd+76M+8=; b=LpngKEHq9iB9SWuR9aJbKiN9/YE+/HOArTKcejlK4+htsnPfjdADux9XS7+A1xJWTO Lz4/WhZnEe4j0uN5jcOOuEs3zRQId1RMwboCfQBFX/BmslwQ79MHkjNdWHTl/s0TVeTK ygj/Z09QcsLtNjbK7hLOgQRBj7gU0hjOinvCQr/nA+jPPEqbeonIra/zzRm53UiEyNCu OnjAiq2nA1f4uNtXTlFlQKP7JsHb7W6TNTppQs1QW92EqpWv3Lva4TnVqK4XirxWqCPy pGzA2YFtFKDgVL+J6essImo6bDyfB0a67uaW9m3a1QphwV/279YN+Ohw99zYIOOBWAlN Sdcw== X-Gm-Message-State: ANoB5pmEXUy4MOwF0dXGn6iSkce+miRNhvyVffoxLGbgKSxA9bYdW1hm 3nNwVDq9IzGOuyo/565h7ZIJ9wC2o8z3dQ== X-Google-Smtp-Source: AA0mqf5GGe5cedKhnG226IcIQgdbF3xUa3xeE1WGJ5YdK5agK0Zk1JCSRkS9XcnKq9j1gkhw1BTeJw== X-Received: by 2002:a63:ea17:0:b0:477:9a46:f57b with SMTP id c23-20020a63ea17000000b004779a46f57bmr43620364pgi.319.1669942254544; Thu, 01 Dec 2022 16:50:54 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:50:53 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 2/8] shared/bap: Fix initiating QoS and Enable procedures as server Date: Thu, 1 Dec 2022 16:50:45 -0800 Message-Id: <20221202005051.2401504-2-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz According to Table 3.2: ASE state machine transition these procedures can only be initated by clients. --- src/shared/bap.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 7a24824a71fc..f4812a4b9f51 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -4166,14 +4166,12 @@ unsigned int bt_bap_stream_qos(struct bt_bap_stream *stream, struct bt_ascs_qos qos; struct bt_bap_req *req; - if (!bap_stream_valid(stream)) + /* Table 3.2: ASE state machine transition + * Initiating device - client Only + */ + if (!bap_stream_valid(stream) || !stream->client) return 0; - if (!stream->client) { - stream_qos(stream, data, NULL); - return 0; - } - memset(&qos, 0, sizeof(qos)); /* TODO: Figure out how to pass these values around */ @@ -4259,14 +4257,12 @@ unsigned int bt_bap_stream_enable(struct bt_bap_stream *stream, { int ret; - if (!bap_stream_valid(stream)) + /* Table 3.2: ASE state machine transition + * Initiating device - client Only + */ + if (!bap_stream_valid(stream) || !stream->client) return 0; - if (!stream->client) { - stream_enable(stream, metadata, NULL); - return 0; - } - ret = bap_stream_metadata(stream, BT_ASCS_ENABLE, metadata, func, user_data); if (!ret || !enable_links) From patchwork Fri Dec 2 00:50:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 631128 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 1D248C4332F for ; Fri, 2 Dec 2022 00:51:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232053AbiLBAvC (ORCPT ); Thu, 1 Dec 2022 19:51:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231972AbiLBAu6 (ORCPT ); Thu, 1 Dec 2022 19:50:58 -0500 Received: from mail-pg1-x52d.google.com (mail-pg1-x52d.google.com [IPv6:2607:f8b0:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C168C727A for ; Thu, 1 Dec 2022 16:50:57 -0800 (PST) Received: by mail-pg1-x52d.google.com with SMTP id h33so3098618pgm.9 for ; Thu, 01 Dec 2022 16:50:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=bUAQSZERFxp8IYQerum7wOJO5thO+VoEy0ZSZltlmNk=; b=RNSTqUSOkPYfLL1AuJGsz9/yHcID9U/weCYYBBBwZlseAot72GU1uSHTlO2eqWXHR/ zXaqJozyWqqJp4EPfF+AvC22ycVAHkpfPus8LfpHPyrot2Qk0i4ohABJljwuGH6qPIdI MIISCYGJsypE9GJJpsBEL05lYvOKVPpbZplwxKnbjnWWy6fLQOFfZ7N6axQDnWIy6Pmv NKOUJg7IDifgoF8SWHSLjvrX1idyeeArzLBXgD09yEIqMC0LxrP7T1WGyQfSsjXqs1iu 34oBca4HOZbW1daSZsX59cqN1KapGWC5+Q96XahyAFC9cZnq3dKsDXvL/H8IHNGrD2b+ 2KGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bUAQSZERFxp8IYQerum7wOJO5thO+VoEy0ZSZltlmNk=; b=w6Ga6cb603isViNpQLP9FIUnPLDAhj26N139jumrlVds59vsERRGjOF61MV7f5wLKX hPUifonxBKKQB1zjNDxsuRRvmaUkXYOm8TNJ3lCf7rQtO5oPjt2Je5YUPX1EcEjFEs4z XHcVhi8imlREm0BAJPsCL9ZBGblK5CNdoByEvJaAuQrf7ijCP82jIXNpnTgEGKHcmsZG zP++hKvr+k5/g3nV2XgKu0/awgUotfeFqjGZrorhN+JKj3BfpdL4lI4GPxRCRu8L3psC ygX3xyU2s5oa68MHQwI2yw+8E4+VB8yS4HCFld8vi9bh1TU+DtrmK+xSGtEzOYLViV4n R/ZA== X-Gm-Message-State: ANoB5plj4cWY1BD0IzORGtV5p5EgtlatG3chwYfaRt5PCAEiKLyMw4tS 8Lxtrtq4A3SMt6HqShQ57BNbnhW1vFGDig== X-Google-Smtp-Source: AA0mqf4UXbUpNAnULWJV515q6J4YoAPUCdIFSSyEd5p05VkbW4tqe9tD0if0MsBAmA3vvg3IfHSD0A== X-Received: by 2002:a63:4449:0:b0:477:a5e2:7b78 with SMTP id t9-20020a634449000000b00477a5e27b78mr41283836pgk.322.1669942255733; Thu, 01 Dec 2022 16:50:55 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:50:55 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 3/8] client/player: Add support for custom preset Date: Thu, 1 Dec 2022 16:50:46 -0800 Message-Id: <20221202005051.2401504-3-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This adds support for a custom preset which asks the user to enter its configuration: [bluetooth]# endpoint.presets 00002bc9-0000-1000-8000-00805f9b34fb custom [Codec] Enter frequency (Khz): 48 [Codec] Enter frame duration (ms): 10 [Codec] Enter channel allocation: 0x000000003 [Codec] Enter frame length: 100 [QoS] Enter Target Latency (Low, Balance, High): Low [QoS] Enter SDU Interval (us): 10000 [QoS] Enter Framing (Unframed, Framed): Unframed [QoS] Enter PHY (1M, 2M): 2M [QoS] Enter Max SDU: 200 [QoS] Enter RTN: 3 [QoS] Enter Max Transport Latency (ms): 20 [QoS] Enter Presentation Delay (us): 10000 --- client/player.c | 414 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 366 insertions(+), 48 deletions(-) diff --git a/client/player.c b/client/player.c index 51c10f8e0a23..92b2b7a47eaf 100644 --- a/client/player.c +++ b/client/player.c @@ -1231,8 +1231,7 @@ struct codec_preset { const char *name; const struct iovec data; const struct codec_qos qos; - bool is_default; - uint8_t latency; + uint8_t target_latency; }; #define SBC_PRESET(_name, _data) \ @@ -1241,13 +1240,6 @@ struct codec_preset { .data = _data, \ } -#define SBC_DEFAULT_PRESET(_name, _data) \ - { \ - .name = _name, \ - .data = _data, \ - .is_default = true, \ - } - static struct codec_preset sbc_presets[] = { /* Table 4.7: Recommended sets of SBC parameters in the SRC device * Other settings: Block length = 16, Allocation method = Loudness, @@ -1268,7 +1260,7 @@ static struct codec_preset sbc_presets[] = { CODEC_DATA(0x28, 0x15, 2, SBC_BITPOOL_HQ_MONO_44100)), SBC_PRESET("HQ_MONO_48", CODEC_DATA(0x18, 0x15, 2, SBC_BITPOOL_HQ_MONO_48000)), - SBC_DEFAULT_PRESET("HQ_STEREO_44_1", + SBC_PRESET("HQ_STEREO_44_1", CODEC_DATA(0x21, 0x15, 2, SBC_BITPOOL_HQ_JOINT_STEREO_44100)), SBC_PRESET("HQ_STEREO_48", CODEC_DATA(0x11, 0x15, 2, SBC_BITPOOL_HQ_JOINT_STEREO_48000)), @@ -1368,7 +1360,7 @@ static struct codec_preset sbc_presets[] = { .name = _name, \ .data = _data, \ .qos = _qos, \ - .latency = 0x02, \ + .target_latency = 0x02, \ } #define LC3_PRESET_HR(_name, _data, _qos) \ @@ -1376,16 +1368,7 @@ static struct codec_preset sbc_presets[] = { .name = _name, \ .data = _data, \ .qos = _qos, \ - .latency = 0x03, \ - } - -#define LC3_DEFAULT_PRESET(_name, _data, _qos) \ - { \ - .name = _name, \ - .data = _data, \ - .is_default = true, \ - .qos = _qos, \ - .latency = 0x02, \ + .target_latency = 0x03, \ } static struct codec_preset lc3_presets[] = { @@ -1399,7 +1382,7 @@ static struct codec_preset lc3_presets[] = { LC3_PRESET("16_1_1", LC3_PRESET_16KHZ(LC3_CONFIG_DURATION_7_5, 30u), LC3_7_5_UNFRAMED(30u, 2u, 8u, 40000u)), - LC3_DEFAULT_PRESET("16_2_1", + LC3_PRESET("16_2_1", LC3_PRESET_16KHZ(LC3_CONFIG_DURATION_10, 40u), LC3_10_UNFRAMED(40u, 2u, 10u, 40000u)), LC3_PRESET("24_1_1", @@ -1465,22 +1448,26 @@ static struct codec_preset lc3_presets[] = { LC3_10_UNFRAMED(155u, 23u, 60u, 40000u)), }; -#define PRESET(_uuid, _presets) \ +#define PRESET(_uuid, _presets, _default_index) \ { \ .uuid = _uuid, \ + .custom = { .name = "custom" }, \ + .default_preset = &_presets[_default_index], \ .presets = _presets, \ .num_presets = ARRAY_SIZE(_presets), \ } -static const struct preset { +static struct preset { const char *uuid; + struct codec_preset custom; + struct codec_preset *default_preset; struct codec_preset *presets; size_t num_presets; } presets[] = { - PRESET(A2DP_SOURCE_UUID, sbc_presets), - PRESET(A2DP_SINK_UUID, sbc_presets), - PRESET(PAC_SINK_UUID, lc3_presets), - PRESET(PAC_SOURCE_UUID, lc3_presets), + PRESET(A2DP_SOURCE_UUID, sbc_presets, 6), + PRESET(A2DP_SINK_UUID, sbc_presets, 6), + PRESET(PAC_SINK_UUID, lc3_presets, 3), + PRESET(PAC_SOURCE_UUID, lc3_presets, 3), }; static struct codec_preset *find_preset(const char *uuid, const char *name) @@ -1488,20 +1475,22 @@ static struct codec_preset *find_preset(const char *uuid, const char *name) size_t i; for (i = 0; i < ARRAY_SIZE(presets); i++) { - const struct preset *preset = &presets[i]; + struct preset *preset = &presets[i]; if (!strcasecmp(preset->uuid, uuid)) { size_t j; + if (!name) + return preset->default_preset; + else if (!strcmp(name, "custom")) + return &preset->custom; + for (j = 0; j < preset->num_presets; j++) { struct codec_preset *p; p = &preset->presets[j]; - if (!name) { - if (p->is_default) - return p; - } else if (!strcmp(p->name, name)) + if (!strcmp(p->name, name)) return p; } } @@ -1724,10 +1713,11 @@ done: static struct iovec *iov_append(struct iovec **iov, const void *data, size_t len) { - if (!*iov) { + if (!*iov) *iov = new0(struct iovec, 1); + + if (!((*iov)->iov_base)) (*iov)->iov_base = new0(uint8_t, UINT8_MAX); - } if (data && len) { memcpy((*iov)->iov_base + (*iov)->iov_len, data, len); @@ -1757,7 +1747,7 @@ static DBusMessage *endpoint_select_properties_reply(struct endpoint *ep, /* Copy capabilities */ iov_append(&cfg->caps, preset->data.iov_base, preset->data.iov_len); - cfg->target_latency = preset->latency; + cfg->target_latency = preset->target_latency; if (preset->qos.phy) /* Set QoS parameters */ @@ -2348,6 +2338,325 @@ fail: return bt_shell_noninteractive_quit(EXIT_FAILURE); } +static void custom_delay(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + char *endptr = NULL; + + qos->delay = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); +} + +static void custom_latency(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + char *endptr = NULL; + + qos->latency = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + bt_shell_prompt_input("QoS", "Enter Presentation Delay (us):", + custom_delay, user_data); +} + +static void custom_rtn(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + char *endptr = NULL; + + qos->rtn = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + bt_shell_prompt_input("QoS", "Enter Max Transport Latency (ms):", + custom_latency, user_data); +} + +static void custom_sdu(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + char *endptr = NULL; + + qos->sdu = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + bt_shell_prompt_input("QoS", "Enter RTN:", custom_rtn, user_data); +} + +static void custom_phy(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + + if (!strcmp(input, "1M")) + qos->phy = "1M"; + else if (!strcmp(input, "2M")) + qos->phy = "2M"; + else { + char *endptr = NULL; + uint8_t phy = strtol(input, &endptr, 0); + + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + switch (phy) { + case 0x01: + qos->phy = "1M"; + break; + case 0x02: + qos->phy = "2M"; + break; + default: + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + } + + bt_shell_prompt_input("QoS", "Enter Max SDU:", custom_sdu, user_data); +} + +static void custom_framing(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + + if (!strcasecmp(input, "Unframed")) + qos->framing = 0x00; + else if (!strcasecmp(input, "Framed")) + qos->framing = 0x01; + else { + char *endptr = NULL; + + qos->framing = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + } + + bt_shell_prompt_input("QoS", "Enter PHY (1M, 2M):", custom_phy, + user_data); +} + +static void custom_interval(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct codec_qos *qos = (void *)&p->qos; + char *endptr = NULL; + + qos->interval = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + bt_shell_prompt_input("QoS", "Enter Framing (Unframed, Framed):", + custom_framing, user_data); +} + +static void custom_target_latency(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + + if (!strcasecmp(input, "Low")) + p->target_latency = 0x01; + else if (!strcasecmp(input, "Balance")) + p->target_latency = 0x02; + else if (!strcasecmp(input, "High")) + p->target_latency = 0x02; + else { + char *endptr = NULL; + + p->target_latency = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + } + + bt_shell_prompt_input("QoS", "Enter SDU Interval (us):", + custom_interval, user_data); +} + +static void custom_length(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct iovec *iov = (void *)&p->data; + uint8_t ltv[4] = { 0x03, LC3_CONFIG_FRAME_LEN }; + uint16_t len; + char *endptr = NULL; + + len = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + ltv[2] = len; + ltv[3] = len >> 8; + + iov_append(&iov, ltv, sizeof(ltv)); + + bt_shell_prompt_input("QoS", "Enter Target Latency " + "(Low, Balance, High):", + custom_target_latency, user_data); +} + +static void custom_location(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct iovec *iov = (void *)&p->data; + uint32_t location; + char *endptr = NULL; + + location = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + /* Only add Channel Allocation if set */ + if (location) { + uint8_t ltv[6] = { 0x05, LC3_CONFIG_CHAN_ALLOC }; + + location = cpu_to_le32(location); + memcpy(<v[2], &location, sizeof(location)); + iov_append(&iov, ltv, sizeof(ltv)); + } + + bt_shell_prompt_input("Codec", "Enter frame length:", + custom_length, user_data); +} + +static uint8_t val2duration(uint32_t val) +{ + switch (val) { + case 7: + return 0x00; + case 10: + return 0x01; + default: + return 0xff; + } +} + +static void custom_duration(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct iovec *iov = (void *)&p->data; + uint8_t ltv[3] = { 0x02, LC3_CONFIG_DURATION, 0x00 }; + char *endptr = NULL; + uint32_t val; + + val = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + if (strncmp(input, "0x", 2)) + ltv[2] = val2duration(val); + else + ltv[2] = val; + + if (ltv[2] == 0xff) { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + iov_append(&iov, ltv, sizeof(ltv)); + + bt_shell_prompt_input("Codec", "Enter channel allocation:", + custom_location, user_data); +} + +static uint8_t val2freq(uint32_t val) +{ + switch (val) { + case 8: + return 0x01; + case 11: + return 0x02; + case 16: + return 0x03; + case 22: + return 0x04; + case 24: + return 0x05; + case 32: + return 0x06; + case 44: + return 0x07; + case 48: + return 0x08; + case 88: + return 0x09; + case 96: + return 0x0a; + case 174: + return 0x0b; + case 192: + return 0x0c; + case 384: + return 0x0d; + default: + return 0x00; + } +} + +static void custom_frequency(const char *input, void *user_data) +{ + struct codec_preset *p = user_data; + struct iovec *iov = (void *)&p->data; + uint8_t ltv[3] = { 0x02, LC3_CONFIG_FREQ, 0x00 }; + uint32_t val; + char *endptr = NULL; + + val = strtol(input, &endptr, 0); + if (!endptr || *endptr != '\0') { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + if (strncmp(input, "0x", 2)) + ltv[2] = val2freq(val); + else + ltv[2] = val; + + if (!ltv[2]) { + bt_shell_printf("Invalid argument: %s\n", input); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + /* Reset iov to start over the codec configuration */ + free(iov->iov_base); + iov->iov_base = NULL; + iov->iov_len = 0; + iov_append(&iov, ltv, sizeof(ltv)); + + bt_shell_prompt_input("Codec", "Enter frame duration (ms):", + custom_duration, user_data); +} + static void cmd_presets_endpoint(int argc, char *argv[]) { size_t i; @@ -2359,32 +2668,41 @@ static void cmd_presets_endpoint(int argc, char *argv[]) bt_shell_printf("Preset %s not found\n", argv[2]); return bt_shell_noninteractive_quit(EXIT_FAILURE); } - - default_preset->is_default = true; } for (i = 0; i < ARRAY_SIZE(presets); i++) { - const struct preset *preset = &presets[i]; + struct preset *preset = &presets[i]; if (!strcasecmp(preset->uuid, argv[1])) { size_t j; + struct codec_preset *p; + + if (default_preset) { + preset->default_preset = default_preset; + break; + } + + p = &preset->custom; + + bt_shell_printf("%s%s\n", p == preset->default_preset ? + "*" : "", p->name); for (j = 0; j < preset->num_presets; j++) { - struct codec_preset *p; - p = &preset->presets[j]; - if (default_preset && p != default_preset) - p->is_default = false; - - if (p->is_default) - bt_shell_printf("*%s\n", p->name); - else - bt_shell_printf("%s\n", p->name); + bt_shell_printf("%s%s\n", + p == preset->default_preset ? + "*" : "", p->name); } } } + if (default_preset && !strcmp(default_preset->name, "custom")) { + bt_shell_prompt_input("Codec", "Enter frequency (Khz):", + custom_frequency, default_preset); + return; + } + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } From patchwork Fri Dec 2 00:50:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 630387 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 9D4EBC4321E for ; Fri, 2 Dec 2022 00:51:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231975AbiLBAvA (ORCPT ); Thu, 1 Dec 2022 19:51:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41860 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231962AbiLBAu7 (ORCPT ); Thu, 1 Dec 2022 19:50:59 -0500 Received: from mail-pl1-x62d.google.com (mail-pl1-x62d.google.com [IPv6:2607:f8b0:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E4E2CBA64 for ; Thu, 1 Dec 2022 16:50:58 -0800 (PST) Received: by mail-pl1-x62d.google.com with SMTP id jl24so3243284plb.8 for ; Thu, 01 Dec 2022 16:50:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=uipxcqFe+9TjstR7zL9pYMpnpbO4FjPsAnDw9doWmUg=; b=pnbM42Z0N/Pf/yeXTkXr6AuGVFH6ku6Xl1kLlFI9G7NrdqQiwrF1zC448YTtIxMkcR gBnwFv413fxN8/cS5bdVUTVFSuf0o3yXuSezK9z4w31ywrmUY3EVH0+8DcRtpDQHsZBw nYDRkys2myeOuYUIPpgI6FoTRwBjEm3ojNAjKim+dIIvKF99Fx0/NGYdglJ+jewaKhod G9M2p05AJQsZP/kdy4kmxYhZzjRv7g30mtjB/cljnBZEfDhr2bxB3t4QvrhIaSo6EIjF yrSrxHjTHrcEpkgNXsvDv9KqzMMnwwJFR5l0AA3l/2Lhw5CBecmSJhUmK6Aq9jH2BsQc afUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uipxcqFe+9TjstR7zL9pYMpnpbO4FjPsAnDw9doWmUg=; b=mSzky75w+wynUkjpL43YvWpGb6RGQNc8+LsEWjx8xSdG772jNhNuqLogWBGfkQlQxB DoLvW/h5EdwqPF9SXeMGeZ9ZAwQvMJjskKuOS9EAtQMCUXFbgCCeDkuDBe9PYvzBFkgV EU2jfj2yfj9pJ/n5PasKmLI+02XPuALV0w+Z3E7ZOsQLcMIKfRuepex17pxfWOEtfDBr gQ06dQmVtb+cURiK5Hb5pM3DFQRqdvaHNv4ENWCs+1is8weThvydkoYgqR54aQZRRYvv Y3e07DS/N+cElkwObtdIOL8eN9GAFuu/BoirZ4rqs6/Xv+8qrn0BzMQntXtnTHmlbmqh b2MA== X-Gm-Message-State: ANoB5pkowbQJzAYyQgtbzjw9yUA5JP6fTfWXSz+xIGyy+IVUZgRTCcEw M5CJKkPn3z5nxa+YnJ13vBdFMpzrJ5SFCw== X-Google-Smtp-Source: AA0mqf7+GkbuyLWO8u72QtrTblFcbTxYZhfNJfVD+T+MBteRGFvCtMrmMPQMXXOD62bNYKydf32cbw== X-Received: by 2002:a17:902:b613:b0:188:f570:7bd6 with SMTP id b19-20020a170902b61300b00188f5707bd6mr50209892pls.97.1669942257114; Thu, 01 Dec 2022 16:50:57 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:50:56 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 4/8] bap: Fix not able to reconfigure Date: Thu, 1 Dec 2022 16:50:47 -0800 Message-Id: <20221202005051.2401504-4-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz While attempting to configure QoS setting the request id is not reset to 0 when a response is received which prevents any the QoS to be reconfigured. --- profiles/audio/bap.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 67aba3bd76d9..9cee9fd030da 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -366,6 +366,8 @@ static void qos_cb(struct bt_bap_stream *stream, uint8_t code, uint8_t reason, DBG("stream %p code 0x%02x reason 0x%02x", stream, code, reason); + ep->id = 0; + if (!ep->msg) return; From patchwork Fri Dec 2 00:50:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 630386 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 1170EC4321E for ; Fri, 2 Dec 2022 00:51:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232063AbiLBAvE (ORCPT ); Thu, 1 Dec 2022 19:51:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41904 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232037AbiLBAvB (ORCPT ); Thu, 1 Dec 2022 19:51:01 -0500 Received: from mail-pl1-x62c.google.com (mail-pl1-x62c.google.com [IPv6:2607:f8b0:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 45557BBBFD for ; Thu, 1 Dec 2022 16:50:59 -0800 (PST) Received: by mail-pl1-x62c.google.com with SMTP id g10so3236741plo.11 for ; Thu, 01 Dec 2022 16:50:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=CrUIIPrBTmjyCzYKfPEzVfSCr2e2mHMZ7ZkF84d/32s=; b=Ujb+NSoY5BmQHub7Ul+CCbZBTL8PyLpuAEitM/lwbgSGEJX9SbVSpMtYizeT8BqWOA PY32pZdTifh313p013ANLCpwckP8USWxUAR5mIa6KpkeUOiXR6335kehih9YyHHi/sD7 /CznPbjkaSqzLHQwWuAmO4315ORv7V077AsSCDlnwSvWjzgdu5m8dZb7xF40ve50E6GX FvM0uL9L+1oQD/Fuf9StOjoSlXReesGVdcFTHwCaz2/wO6s60mJiPVOqzFqggbpnLEsV voM8Hp5JDiSUDYb6QH0KxKwFTymOhBkjj2KC1bouOZYV+RiO+1ZOQK/p7BYXjHxjm5wu yQqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CrUIIPrBTmjyCzYKfPEzVfSCr2e2mHMZ7ZkF84d/32s=; b=TVPGYEXpwaZism4eOlbaTwKgG082r+Ev6nBgrGTpOTBHQ5vDbVDkKtGLtLTNB6nEdx KX0u1AC7w66xNi6UCocgfR2IHXvVa/QvDmAr1Qsf5N6VDiLwslTT5P4rNd85jwJmjd7V 8BLMVskzUuXKkvF5iZvt+QvncZBw/GlYShKDymYQLUXcM2N12Hcvv3o7KodL0qTUbfyD ZzwkeMz2QRFplJAJqrw7rCbmOMXooJRWeR0ewqEQxure9c6a7ap/PDxmA3qUn8HEsbCO OJ+oq/XkbtwV7VsAIuWAo3O2sBMK/FQ4G8oilMygu5mFVRP9rad7TypBOy4l1KehRSJk AFEQ== X-Gm-Message-State: ANoB5pl7XNii4k6qOyXfSmXEFpq1ZDJ/AjnkVT4XRHlEU0I4Nc3mFMVD 89EBfFb3mSigZ8aWKQYi9cdj9Kkt1eSxJQ== X-Google-Smtp-Source: AA0mqf6QcLcmbjJpsn7263x2GZ+EaoevRhruIrl1aL9iQaQfZ9gO0ezzN4IwIyFiCbhUlS00NKbhdQ== X-Received: by 2002:a17:903:3052:b0:189:651c:f023 with SMTP id u18-20020a170903305200b00189651cf023mr35061201pla.78.1669942258288; Thu, 01 Dec 2022 16:50:58 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:50:57 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 5/8] media: Fix crash when transport configuration changes Date: Thu, 1 Dec 2022 16:50:48 -0800 Message-Id: <20221202005051.2401504-5-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz In case of BAP the same transport may be reconfigured multiple times which means it would appears multiple times on endpoint->transports leading to a crash when disconnecting as the code would attempt to destroy the same object multiple times. --- profiles/audio/media.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/profiles/audio/media.c b/profiles/audio/media.c index c9328ab9bd6e..6947cf96392e 100644 --- a/profiles/audio/media.c +++ b/profiles/audio/media.c @@ -1057,6 +1057,8 @@ static int pac_config(struct bt_bap_stream *stream, struct iovec *cfg, path = media_transport_get_path(transport); bt_bap_stream_set_user_data(stream, (void *)path); + endpoint->transports = g_slist_append(endpoint->transports, + transport); } msg = dbus_message_new_method_call(endpoint->sender, endpoint->path, @@ -1064,7 +1066,7 @@ static int pac_config(struct bt_bap_stream *stream, struct iovec *cfg, "SetConfiguration"); if (msg == NULL) { error("Couldn't allocate D-Bus message"); - media_transport_destroy(transport); + endpoint_remove_transport(endpoint, transport); return FALSE; } @@ -1073,8 +1075,6 @@ static int pac_config(struct bt_bap_stream *stream, struct iovec *cfg, data->cb = cb; data->user_data = user_data; - endpoint->transports = g_slist_append(endpoint->transports, transport); - dbus_message_iter_init_append(msg, &iter); path = media_transport_get_path(transport); From patchwork Fri Dec 2 00:50:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 631127 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 AA950C47088 for ; Fri, 2 Dec 2022 00:51:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232117AbiLBAvF (ORCPT ); Thu, 1 Dec 2022 19:51:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41926 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232001AbiLBAvB (ORCPT ); Thu, 1 Dec 2022 19:51:01 -0500 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D3B29CBA64 for ; Thu, 1 Dec 2022 16:51:00 -0800 (PST) Received: by mail-pj1-x102f.google.com with SMTP id u15-20020a17090a3fcf00b002191825cf02so3752384pjm.2 for ; Thu, 01 Dec 2022 16:51:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=59/tZYb95zry6qHeA7hmQRRZW9XVwhOq8Y0v9+IeSrg=; b=Su5SfNYO5bYvpPLuQraerHvjIt8jwrq+7ZIFOPM31DfrPCTdJnnK8j1P3oEr9gZFHE iBOTY9rrPSNxeYgQECoxsf6Q0BIjbmlkXrXNSI0r5pv4ehNTid2g6k5sfRa3oIuaQR1D E+Z/sbhZsEm48CHHbrb6xVGkEKRlMh7EaM+Vw7smDJWC6h83j3A4IgG2HINS499oCHs2 6pK6UpAVkO5d+KVp7u+yOAgNghqV2ZqhkZDCUFCf54cR9VZC1rKo7hnJH+a+jc0hQAp8 VuN2VsSbnbQZBuMlpBbSVk2XN53jNnrRO2589FtD7CJJs0iSD2RaHp8GmghrPBjWPQa0 njsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=59/tZYb95zry6qHeA7hmQRRZW9XVwhOq8Y0v9+IeSrg=; b=c+XV9uA2dlYh8EOqdR3n87W+k1TqE97Ujpg29Pvk6AfTenwNEMYOmPqL+rRvyBhLPW 8p6bGGgcjAA4wtf3nym5gQyGBkXOe8pHDubdUK/NiUl1VaQMC3W+z29XuWScPBtrm4A2 7CBM+7WpjXTpUNxbtP+2TQOIbTScrQAyjIGfUKxVrZo9c7x805w8t4zqzQGs3ApTJkZX qLnPb9zdXcWmUygLrsLmRE/Kry7fLuaxU3SyVNdL7WPCGwxpI1OCat9TdyA/8CvHVufL qPbYj3waqm40s75FYw1/5sbMeyV0T+qCZXkfoLevtkSpS+BDTl6//DIZB/gAS3auOwzf lfYw== X-Gm-Message-State: ANoB5pmgkqpGUKf8j80mfEoTGkFjkGlqpPAtdlc6MwTgvBWsEiWNRYEI dlCfA28XFGZNuI1QLlaNv7VngdiRIoOITg== X-Google-Smtp-Source: AA0mqf5Xzond2hYJMuRnoYpty/XEpePSd3vkb+RHzQgSk925qb0gFY/8rATEr6QTIra4JHuLr17lAA== X-Received: by 2002:a17:902:8203:b0:186:e2c3:91c6 with SMTP id x3-20020a170902820300b00186e2c391c6mr19904432pln.27.1669942259630; Thu, 01 Dec 2022 16:50:59 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:50:58 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 6/8] shared/bap: Merge PAC records of the same type/codec Date: Thu, 1 Dec 2022 16:50:49 -0800 Message-Id: <20221202005051.2401504-6-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This attempts to merge PAC records which contain the same type and codec to simplify the matching with client endpoints so all capabilities and metadata are match at once instead of for each PAC record. --- src/shared/bap.c | 65 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index f4812a4b9f51..59ef81d11882 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -262,6 +262,12 @@ static bool bap_db_match(const void *data, const void *match_data) return (bdb->db == db); } +static void *iov_append(struct iovec *iov, size_t len, const void *d) +{ + iov->iov_base = realloc(iov->iov_base, iov->iov_len + len); + return util_iov_push_mem(iov, len, d); +} + unsigned int bt_bap_pac_register(bt_bap_pac_func_t added, bt_bap_pac_func_t removed, void *user_data, bt_bap_destroy_func_t destroy) @@ -2236,6 +2242,52 @@ static struct bt_ascs *bap_get_ascs(struct bt_bap *bap) return bap->rdb->ascs; } +static bool match_codec(const void *data, const void *user_data) +{ + const struct bt_bap_pac *pac = data; + const struct bt_bap_codec *codec = user_data; + + return bap_codec_equal(&pac->codec, codec); +} + +static struct bt_bap_pac *bap_pac_find(struct bt_bap_db *bdb, uint8_t type, + struct bt_bap_codec *codec) +{ + switch (type) { + case BT_BAP_SOURCE: + return queue_find(bdb->sources, match_codec, codec); + case BT_BAP_SINK: + return queue_find(bdb->sinks, match_codec, codec); + } + + return NULL; +} + +static void *ltv_merge(struct iovec *data, struct iovec *cont) +{ + uint8_t delimiter = 0; + + iov_append(data, sizeof(delimiter), &delimiter); + + return iov_append(data, cont->iov_len, cont->iov_base); +} + +static void bap_pac_merge(struct bt_bap_pac *pac, struct iovec *data, + struct iovec *metadata) +{ + /* Merge data into existing record */ + if (pac->data) + ltv_merge(pac->data, data); + else + pac->data = util_iov_dup(data, 1); + + /* Merge metadata into existing record */ + if (pac->metadata) + ltv_merge(pac->metadata, metadata); + else + pac->metadata = util_iov_dup(metadata, 1); +} + static struct bt_bap_pac *bap_pac_new(struct bt_bap_db *bdb, const char *name, uint8_t type, struct bt_bap_codec *codec, @@ -2742,14 +2794,21 @@ static void bap_parse_pacs(struct bt_bap *bap, uint8_t type, util_iov_pull_mem(&iov, meta->len); + DBG(bap, "PAC #%u: type %u codec 0x%02x cc_len %u meta_len %u", + i, type, p->codec.id, p->cc_len, meta->len); + + /* Check if there is already a PAC record for the codec */ + pac = bap_pac_find(bap->rdb, type, &p->codec); + if (pac) { + bap_pac_merge(pac, &data, &metadata); + continue; + } + pac = bap_pac_new(bap->rdb, NULL, type, &p->codec, NULL, &data, &metadata); if (!pac) continue; - DBG(bap, "PAC #%u: type %u codec 0x%02x cc_len %u meta_len %u", - i, type, p->codec.id, p->cc_len, meta->len); - queue_push_tail(queue, pac); } } From patchwork Fri Dec 2 00:50:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 630385 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 62827C4332F for ; Fri, 2 Dec 2022 00:51:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232142AbiLBAvI (ORCPT ); Thu, 1 Dec 2022 19:51:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41904 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232027AbiLBAvC (ORCPT ); Thu, 1 Dec 2022 19:51:02 -0500 Received: from mail-pf1-x436.google.com (mail-pf1-x436.google.com [IPv6:2607:f8b0:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2238BCCECA for ; Thu, 1 Dec 2022 16:51:02 -0800 (PST) Received: by mail-pf1-x436.google.com with SMTP id w129so3484438pfb.5 for ; Thu, 01 Dec 2022 16:51:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=abZSiyeyD5TDfxzaY7Wlf7GTc9GtM0cy6S/iptmDoTY=; b=Iw+D41BY4oQJ02fcPswRlHSj3iP9aazEQMRsFIc/fjy5hy0QR3sJLReICcy05XYVwf uMdtsz7CwJryDDlCy2eXUKRbzZwCZX4u9Vcpgd5+va09FymPUmBvFGR2ofC9JK71WHUy qu403dP+WOXWDQcQHbkVMWDYebjuodNiysnKMjZ2Wdiyr6Gb8aptruzUpi40rF32Mp/1 LjcGmFQ9hmSUU+D6Iw8xfIlaljcscoGwhYK+IlF64bnmZd9iIwSJvORLiKx/aOxXrb5S K34mBcjJ19xlqSEl1OBBlu8b23uMhK7zcDTrS/l56A0WoMcJT//0WJd6WTbyxpWiyVH9 37ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=abZSiyeyD5TDfxzaY7Wlf7GTc9GtM0cy6S/iptmDoTY=; b=CCbqi0BhnV4a7Stw52qm9eVAmQme/B3WYBOXcHPaJao2PtKweqBaii8s/u94IyhAI1 1U9DPw1jOeG9xvQCcON3d/ezBfFpBf+todQSY1dVhpY2T+jZPqMFLbJRquuqV9uAi1xN rABfywgPjRZZ0ckHKeV1P1B6B0NHCYzd57x9tdKyN9FNMksOZOOQhfPG9jkeNz+qeRW8 XYCyCWaOgVtIRddGfLoy1ElDN8WBpuXNRMWbrbuJGb1bytRgkh1LKvvtsIrfcxRWwgYt 9lcWAGl4dZbBLtntW/bOU1bWYmY3+DHdQWHCt92J0+HKbR9obf0GU9TkIJeL3R2kgvjN 3C9Q== X-Gm-Message-State: ANoB5ploGqVA68buoqaMA+IHDU4WW2YZGJm6xtnbo4BoI/ja0VFeuKWc lEazwsHTdpzsx3tAlreC4U5edUM+dJn+Zg== X-Google-Smtp-Source: AA0mqf4j2Ath+rezdPjChTGrQ+AQSjhY9lZpCo2BT87NebHiko1/oa6YYUCUoR32sUir6FqT2Ra53g== X-Received: by 2002:a63:eb4b:0:b0:477:a350:2172 with SMTP id b11-20020a63eb4b000000b00477a3502172mr41229624pgk.167.1669942261049; Thu, 01 Dec 2022 16:51:01 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.50.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:51:00 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 7/8] bap: Fix not waiting Endpoint.SelectProperties Date: Thu, 1 Dec 2022 16:50:50 -0800 Message-Id: <20221202005051.2401504-7-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz If there are multiple Endpoint.SelectProperties wait them to complete before attempting to proceed to configure a stream otherwise streams may not be linked properly and may end up creating multiple CIS instead. --- profiles/audio/bap.c | 58 +++++++++++++++++++++++++++++++----------- profiles/audio/media.c | 27 ++++++++------------ 2 files changed, 54 insertions(+), 31 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 9cee9fd030da..f28843ae6b38 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -83,6 +83,7 @@ struct bap_data { struct queue *snks; struct queue *streams; GIOChannel *listen_io; + int selecting; }; static struct queue *sessions; @@ -503,7 +504,8 @@ static void ep_free(void *data) bap_io_close(ep); - free(ep->caps); + util_iov_free(ep->caps, 1); + util_iov_free(ep->metadata, 1); free(ep->path); free(ep); } @@ -566,20 +568,14 @@ static struct bap_ep *ep_register(struct btd_service *service, return ep; } -static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, - struct iovec *metadata, struct bt_bap_qos *qos, - void *user_data) +static void bap_config(void *data, void *user_data) { - struct bap_ep *ep = user_data; + struct bap_ep *ep = data; - if (err) { - error("err %d", err); + DBG("ep %p caps %p metadata %p", ep, ep->caps, ep->metadata); + + if (!ep->caps) return; - } - - ep->caps = caps; - ep->metadata = metadata; - ep->qos = *qos; /* TODO: Check if stream capabilities match add support for Latency * and PHY. @@ -594,13 +590,43 @@ static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, if (!ep->stream) { DBG("Unable to config stream"); - free(ep->caps); + util_iov_free(ep->caps, 1); ep->caps = NULL; + util_iov_free(ep->metadata, 1); + ep->metadata = NULL; } bt_bap_stream_set_user_data(ep->stream, ep->path); } +static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, + struct iovec *metadata, struct bt_bap_qos *qos, + void *user_data) +{ + struct bap_ep *ep = user_data; + + if (err) { + error("err %d", err); + return; + } + + ep->caps = util_iov_dup(caps, 1); + + if (metadata && metadata->iov_base && metadata->iov_len) + ep->metadata = util_iov_dup(metadata, 1); + + ep->qos = *qos; + + DBG("selecting %d", ep->data->selecting); + ep->data->selecting--; + + if (ep->data->selecting) + return; + + queue_foreach(ep->data->srcs, bap_config, NULL); + queue_foreach(ep->data->snks, bap_config, NULL); +} + static bool pac_found(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, void *user_data) { @@ -616,8 +642,10 @@ static bool pac_found(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, } /* TODO: Cache LRU? */ - if (btd_service_is_initiator(service)) - bt_bap_select(lpac, rpac, select_cb, ep); + if (btd_service_is_initiator(service)) { + if (!bt_bap_select(lpac, rpac, select_cb, ep)) + ep->data->selecting++; + } return true; } diff --git a/profiles/audio/media.c b/profiles/audio/media.c index 6947cf96392e..fbb350889564 100644 --- a/profiles/audio/media.c +++ b/profiles/audio/media.c @@ -725,24 +725,21 @@ struct pac_select_data { void *user_data; }; -static int parse_array(DBusMessageIter *iter, struct iovec **iov) +static int parse_array(DBusMessageIter *iter, struct iovec *iov) { DBusMessageIter array; if (!iov) return 0; - if (!(*iov)) - *iov = new0(struct iovec, 1); - dbus_message_iter_recurse(iter, &array); - dbus_message_iter_get_fixed_array(&array, &(*iov)->iov_base, - (int *)&(*iov)->iov_len); + dbus_message_iter_get_fixed_array(&array, &iov->iov_base, + (int *)&iov->iov_len); return 0; } -static int parse_select_properties(DBusMessageIter *props, struct iovec **caps, - struct iovec **metadata, +static int parse_select_properties(DBusMessageIter *props, struct iovec *caps, + struct iovec *metadata, struct bt_bap_qos *qos) { const char *key; @@ -845,11 +842,6 @@ static int parse_select_properties(DBusMessageIter *props, struct iovec **caps, fail: DBG("Failed parsing %s", key); - if (*caps) { - free(*caps); - *caps = NULL; - } - return -EINVAL; } @@ -859,7 +851,7 @@ static void pac_select_cb(struct media_endpoint *endpoint, void *ret, int size, struct pac_select_data *data = user_data; DBusMessageIter *iter = ret; int err; - struct iovec *caps = NULL, *metadata = NULL; + struct iovec caps, meta; struct bt_bap_qos qos; if (!ret) { @@ -881,12 +873,15 @@ static void pac_select_cb(struct media_endpoint *endpoint, void *ret, int size, qos.cig_id = BT_ISO_QOS_CIG_UNSET; qos.cis_id = BT_ISO_QOS_CIS_UNSET; - err = parse_select_properties(iter, &caps, &metadata, &qos); + memset(&caps, 0, sizeof(caps)); + memset(&meta, 0, sizeof(meta)); + + err = parse_select_properties(iter, &caps, &meta, &qos); if (err < 0) DBG("Unable to parse properties"); done: - data->cb(data->pac, err, caps, metadata, &qos, data->user_data); + data->cb(data->pac, err, &caps, &meta, &qos, data->user_data); } static int pac_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, From patchwork Fri Dec 2 00:50:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 631126 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 966F7C3A5A7 for ; Fri, 2 Dec 2022 00:51:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231956AbiLBAvJ (ORCPT ); Thu, 1 Dec 2022 19:51:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42022 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232129AbiLBAvG (ORCPT ); Thu, 1 Dec 2022 19:51:06 -0500 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 92EB4CE425 for ; Thu, 1 Dec 2022 16:51:03 -0800 (PST) Received: by mail-pj1-x1033.google.com with SMTP id cm20so3470697pjb.1 for ; Thu, 01 Dec 2022 16:51:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=lTIhg31Aya/7h5Q6jaESOQKvoXVrtlRlWqeM8R6/glY=; b=ncaFMW4ElHkz7M7c9SyKrxjVyfVnHxBZ095rbYKDHl6GnZA7voIDhG9Fk2/xex1jib txYfJ82lef8ULyifFeF3m82J7ht6vYFbGLfYvzK4bHySFPIx8j7+XlIdltm4vht9j+P8 j2JwBxI6XM1EDvtImuz88ikBKOb6OVbtG1rFFpDfjqWHVH3qi0AWy+ZPOWu/PiuxzavE ik3iBEz3boNM4aqdGNCOu7CuCfyduQqjZyIsKax/9QTsyHexKSpkBl98r6PeF4JEMICG +ZPZ9MW1hjwMCRJ78+ZiyiQ0Y/8TFIowySt+hyCU3tBouZ4kBOlqXTtpCsq4sorLCnZ6 IB+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lTIhg31Aya/7h5Q6jaESOQKvoXVrtlRlWqeM8R6/glY=; b=Ok+NOQHN0VSOEVg0SD0imNoAlrhpomRcEadfran7AkDAzHni+t4VUfoM58ZKEJP7af X1lh2mWieejSZYdqtCAJo+N9RLUJ6ICOlmLmOcmZcXQq3XtmA/C1+mIe8zQc9giQXnCx Qt/g84lQsWe7NVfyG4Kj4JZkLDH3qwcmV57W3MQ/pL+Udb6u6ZhfGiss9fMYRPpWLytO WOAFioWx1ISLtN+N3VH5YbSGlq1E50CVW7H5DgKXUs68b8WgfmKoPS7lfnYpHM6unTSI JU6beeA8aO6FCT1WKeFlfUPOp/FLPx7LCu8K3FbeJjWgxR1ekj8zYWDUAFoAzQ9b33E1 kBXQ== X-Gm-Message-State: ANoB5pmPdQvxVcpR0k4F2LTFCYHAtrEdmwJIQaPMiYkkKE0YfGq6rw0q xX0E8zDIFkIE/bpRzrz2JjkTCeKUZT78QQ== X-Google-Smtp-Source: AA0mqf4RUCA/OVS+SuEYbQeNGV0Rj/6tZBaCB4C9G4IxoJ+gA11imlBSMfrCiDWHbok/7CyBai46Dw== X-Received: by 2002:a17:90a:9313:b0:213:2168:1c78 with SMTP id p19-20020a17090a931300b0021321681c78mr74096714pjo.72.1669942262322; Thu, 01 Dec 2022 16:51:02 -0800 (PST) Received: from lvondent-mobl4.. (c-71-56-157-77.hsd1.or.comcast.net. [71.56.157.77]) by smtp.gmail.com with ESMTPSA id f14-20020a170902684e00b0018971fba556sm4246005pln.139.2022.12.01.16.51.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Dec 2022 16:51:01 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v2 8/8] client: Move common print_* functions to its own file Date: Thu, 1 Dec 2022 16:50:51 -0800 Message-Id: <20221202005051.2401504-8-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221202005051.2401504-1-luiz.dentz@gmail.com> References: <20221202005051.2401504-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This move common print_* functions to its own file so they can be properly reused instead of duplicating the code. --- Makefile.tools | 4 +- client/main.c | 166 +---------------------------------------- client/player.c | 83 +-------------------- client/print.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++++ client/print.h | 14 ++++ 5 files changed, 213 insertions(+), 248 deletions(-) create mode 100644 client/print.c create mode 100644 client/print.h diff --git a/Makefile.tools b/Makefile.tools index 4bc355c34b9a..df4cad06589a 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -3,6 +3,7 @@ if CLIENT bin_PROGRAMS += client/bluetoothctl client_bluetoothctl_SOURCES = client/main.c \ + client/print.h client/print.c \ client/display.h client/display.c \ client/agent.h client/agent.c \ client/advertising.h \ @@ -494,7 +495,8 @@ tools_obex_server_tool_SOURCES = $(gobex_sources) $(btio_sources) \ tools_obex_server_tool_LDADD = lib/libbluetooth-internal.la \ src/libshared-glib.la $(GLIB_LIBS) -tools_bluetooth_player_SOURCES = tools/bluetooth-player.c client/player.c +tools_bluetooth_player_SOURCES = tools/bluetooth-player.c client/print.c \ + client/player.c tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \ src/libshared-glib.la \ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline diff --git a/client/main.c b/client/main.c index 2816e880f151..763f38ac7b0f 100644 --- a/client/main.c +++ b/client/main.c @@ -25,6 +25,7 @@ #include "src/shared/shell.h" #include "src/shared/util.h" #include "gdbus/gdbus.h" +#include "print.h" #include "agent.h" #include "gatt.h" #include "advertising.h" @@ -162,171 +163,6 @@ static void print_device(GDBusProxy *proxy, const char *description) address, name); } -static void print_fixed_iter(const char *label, const char *name, - DBusMessageIter *iter) -{ - dbus_bool_t *valbool; - dbus_uint32_t *valu32; - dbus_uint16_t *valu16; - dbus_int16_t *vals16; - unsigned char *byte; - int len; - - switch (dbus_message_iter_get_arg_type(iter)) { - case DBUS_TYPE_BOOLEAN: - dbus_message_iter_get_fixed_array(iter, &valbool, &len); - - if (len <= 0) - return; - - bt_shell_printf("%s%s:\n", label, name); - bt_shell_hexdump((void *)valbool, len * sizeof(*valbool)); - - break; - case DBUS_TYPE_UINT32: - dbus_message_iter_get_fixed_array(iter, &valu32, &len); - - if (len <= 0) - return; - - bt_shell_printf("%s%s:\n", label, name); - bt_shell_hexdump((void *)valu32, len * sizeof(*valu32)); - - break; - case DBUS_TYPE_UINT16: - dbus_message_iter_get_fixed_array(iter, &valu16, &len); - - if (len <= 0) - return; - - bt_shell_printf("%s%s:\n", label, name); - bt_shell_hexdump((void *)valu16, len * sizeof(*valu16)); - - break; - case DBUS_TYPE_INT16: - dbus_message_iter_get_fixed_array(iter, &vals16, &len); - - if (len <= 0) - return; - - bt_shell_printf("%s%s:\n", label, name); - bt_shell_hexdump((void *)vals16, len * sizeof(*vals16)); - - break; - case DBUS_TYPE_BYTE: - dbus_message_iter_get_fixed_array(iter, &byte, &len); - - if (len <= 0) - return; - - bt_shell_printf("%s%s:\n", label, name); - bt_shell_hexdump((void *)byte, len * sizeof(*byte)); - - break; - default: - return; - }; -} - -static void print_iter(const char *label, const char *name, - DBusMessageIter *iter) -{ - dbus_bool_t valbool; - dbus_uint32_t valu32; - dbus_uint16_t valu16; - dbus_int16_t vals16; - unsigned char byte; - const char *valstr; - DBusMessageIter subiter; - char *entry; - - if (iter == NULL) { - bt_shell_printf("%s%s is nil\n", label, name); - return; - } - - switch (dbus_message_iter_get_arg_type(iter)) { - case DBUS_TYPE_INVALID: - bt_shell_printf("%s%s is invalid\n", label, name); - break; - case DBUS_TYPE_STRING: - case DBUS_TYPE_OBJECT_PATH: - dbus_message_iter_get_basic(iter, &valstr); - bt_shell_printf("%s%s: %s\n", label, name, valstr); - break; - case DBUS_TYPE_BOOLEAN: - dbus_message_iter_get_basic(iter, &valbool); - bt_shell_printf("%s%s: %s\n", label, name, - valbool == TRUE ? "yes" : "no"); - break; - case DBUS_TYPE_UINT32: - dbus_message_iter_get_basic(iter, &valu32); - bt_shell_printf("%s%s: 0x%08x\n", label, name, valu32); - break; - case DBUS_TYPE_UINT16: - dbus_message_iter_get_basic(iter, &valu16); - bt_shell_printf("%s%s: 0x%04x\n", label, name, valu16); - break; - case DBUS_TYPE_INT16: - dbus_message_iter_get_basic(iter, &vals16); - bt_shell_printf("%s%s: %d\n", label, name, vals16); - break; - case DBUS_TYPE_BYTE: - dbus_message_iter_get_basic(iter, &byte); - bt_shell_printf("%s%s: 0x%02x (%d)\n", label, name, byte, byte); - break; - case DBUS_TYPE_VARIANT: - dbus_message_iter_recurse(iter, &subiter); - print_iter(label, name, &subiter); - break; - case DBUS_TYPE_ARRAY: - dbus_message_iter_recurse(iter, &subiter); - - if (dbus_type_is_fixed( - dbus_message_iter_get_arg_type(&subiter))) { - print_fixed_iter(label, name, &subiter); - break; - } - - while (dbus_message_iter_get_arg_type(&subiter) != - DBUS_TYPE_INVALID) { - print_iter(label, name, &subiter); - dbus_message_iter_next(&subiter); - } - break; - case DBUS_TYPE_DICT_ENTRY: - dbus_message_iter_recurse(iter, &subiter); - entry = g_strconcat(name, " Key", NULL); - print_iter(label, entry, &subiter); - g_free(entry); - - entry = g_strconcat(name, " Value", NULL); - dbus_message_iter_next(&subiter); - print_iter(label, entry, &subiter); - g_free(entry); - break; - default: - bt_shell_printf("%s%s has unsupported type\n", label, name); - break; - } -} - -static void print_property_with_label(GDBusProxy *proxy, const char *name, - const char *label) -{ - DBusMessageIter iter; - - if (g_dbus_proxy_get_property(proxy, name, &iter) == FALSE) - return; - - print_iter("\t", label ? label : name, &iter); -} - -static void print_property(GDBusProxy *proxy, const char *name) -{ - print_property_with_label(proxy, name, NULL); -} - static void print_uuid(const char *label, const char *uuid) { const char *text; diff --git a/client/player.c b/client/player.c index 92b2b7a47eaf..b857fa649a6b 100644 --- a/client/player.c +++ b/client/player.c @@ -39,6 +39,7 @@ #include "src/shared/shell.h" #include "src/shared/io.h" #include "src/shared/queue.h" +#include "print.h" #include "player.h" /* String display constants */ @@ -511,88 +512,6 @@ static char *proxy_description(GDBusProxy *proxy, const char *title, title, path); } -static void print_iter(const char *label, const char *name, - DBusMessageIter *iter) -{ - dbus_bool_t valbool; - dbus_uint32_t valu32; - dbus_uint16_t valu16; - dbus_int16_t vals16; - unsigned char byte; - const char *valstr; - DBusMessageIter subiter; - - if (iter == NULL) { - bt_shell_printf("%s%s is nil\n", label, name); - return; - } - - switch (dbus_message_iter_get_arg_type(iter)) { - case DBUS_TYPE_INVALID: - bt_shell_printf("%s%s is invalid\n", label, name); - break; - case DBUS_TYPE_STRING: - case DBUS_TYPE_OBJECT_PATH: - dbus_message_iter_get_basic(iter, &valstr); - bt_shell_printf("%s%s: %s\n", label, name, valstr); - break; - case DBUS_TYPE_BOOLEAN: - dbus_message_iter_get_basic(iter, &valbool); - bt_shell_printf("%s%s: %s\n", label, name, - valbool == TRUE ? "yes" : "no"); - break; - case DBUS_TYPE_UINT32: - dbus_message_iter_get_basic(iter, &valu32); - bt_shell_printf("%s%s: 0x%08x (%u)\n", label, name, valu32, - valu32); - break; - case DBUS_TYPE_UINT16: - dbus_message_iter_get_basic(iter, &valu16); - bt_shell_printf("%s%s: 0x%04x (%u)\n", label, name, valu16, - valu16); - break; - case DBUS_TYPE_INT16: - dbus_message_iter_get_basic(iter, &vals16); - bt_shell_printf("%s%s: %d\n", label, name, vals16); - break; - case DBUS_TYPE_BYTE: - dbus_message_iter_get_basic(iter, &byte); - bt_shell_printf("%s%s: 0x%02x (%d)\n", label, name, byte, byte); - break; - case DBUS_TYPE_VARIANT: - dbus_message_iter_recurse(iter, &subiter); - print_iter(label, name, &subiter); - break; - case DBUS_TYPE_ARRAY: - dbus_message_iter_recurse(iter, &subiter); - while (dbus_message_iter_get_arg_type(&subiter) != - DBUS_TYPE_INVALID) { - print_iter(label, name, &subiter); - dbus_message_iter_next(&subiter); - } - break; - case DBUS_TYPE_DICT_ENTRY: - dbus_message_iter_recurse(iter, &subiter); - dbus_message_iter_get_basic(&subiter, &valstr); - dbus_message_iter_next(&subiter); - print_iter(label, valstr, &subiter); - break; - default: - bt_shell_printf("%s%s has unsupported type\n", label, name); - break; - } -} - -static void print_property(GDBusProxy *proxy, const char *name) -{ - DBusMessageIter iter; - - if (g_dbus_proxy_get_property(proxy, name, &iter) == FALSE) - return; - - print_iter("\t", name, &iter); -} - static void print_media(GDBusProxy *proxy, const char *description) { char *str; diff --git a/client/print.c b/client/print.c new file mode 100644 index 000000000000..798d22c7e345 --- /dev/null +++ b/client/print.c @@ -0,0 +1,194 @@ + +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2020 Intel Corporation. All rights reserved. + * + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gdbus/gdbus.h" + +#include "src/shared/util.h" +#include "src/shared/shell.h" +#include "print.h" + +static void print_fixed_iter(const char *label, const char *name, + DBusMessageIter *iter) +{ + dbus_bool_t *valbool; + dbus_uint32_t *valu32; + dbus_uint16_t *valu16; + dbus_int16_t *vals16; + unsigned char *byte; + int len; + + switch (dbus_message_iter_get_arg_type(iter)) { + case DBUS_TYPE_BOOLEAN: + dbus_message_iter_get_fixed_array(iter, &valbool, &len); + + if (len <= 0) + return; + + bt_shell_printf("%s%s:\n", label, name); + bt_shell_hexdump((void *)valbool, len * sizeof(*valbool)); + + break; + case DBUS_TYPE_UINT32: + dbus_message_iter_get_fixed_array(iter, &valu32, &len); + + if (len <= 0) + return; + + bt_shell_printf("%s%s:\n", label, name); + bt_shell_hexdump((void *)valu32, len * sizeof(*valu32)); + + break; + case DBUS_TYPE_UINT16: + dbus_message_iter_get_fixed_array(iter, &valu16, &len); + + if (len <= 0) + return; + + bt_shell_printf("%s%s:\n", label, name); + bt_shell_hexdump((void *)valu16, len * sizeof(*valu16)); + + break; + case DBUS_TYPE_INT16: + dbus_message_iter_get_fixed_array(iter, &vals16, &len); + + if (len <= 0) + return; + + bt_shell_printf("%s%s:\n", label, name); + bt_shell_hexdump((void *)vals16, len * sizeof(*vals16)); + + break; + case DBUS_TYPE_BYTE: + dbus_message_iter_get_fixed_array(iter, &byte, &len); + + if (len <= 0) + return; + + bt_shell_printf("%s%s:\n", label, name); + bt_shell_hexdump((void *)byte, len * sizeof(*byte)); + + break; + default: + return; + }; +} + +void print_iter(const char *label, const char *name, DBusMessageIter *iter) +{ + dbus_bool_t valbool; + dbus_uint32_t valu32; + dbus_uint16_t valu16; + dbus_int16_t vals16; + unsigned char byte; + const char *valstr; + DBusMessageIter subiter; + char *entry; + + if (iter == NULL) { + bt_shell_printf("%s%s is nil\n", label, name); + return; + } + + switch (dbus_message_iter_get_arg_type(iter)) { + case DBUS_TYPE_INVALID: + bt_shell_printf("%s%s is invalid\n", label, name); + break; + case DBUS_TYPE_STRING: + case DBUS_TYPE_OBJECT_PATH: + dbus_message_iter_get_basic(iter, &valstr); + bt_shell_printf("%s%s: %s\n", label, name, valstr); + break; + case DBUS_TYPE_BOOLEAN: + dbus_message_iter_get_basic(iter, &valbool); + bt_shell_printf("%s%s: %s\n", label, name, + valbool == TRUE ? "yes" : "no"); + break; + case DBUS_TYPE_UINT32: + dbus_message_iter_get_basic(iter, &valu32); + bt_shell_printf("%s%s: 0x%08x\n", label, name, valu32); + break; + case DBUS_TYPE_UINT16: + dbus_message_iter_get_basic(iter, &valu16); + bt_shell_printf("%s%s: 0x%04x\n", label, name, valu16); + break; + case DBUS_TYPE_INT16: + dbus_message_iter_get_basic(iter, &vals16); + bt_shell_printf("%s%s: %d\n", label, name, vals16); + break; + case DBUS_TYPE_BYTE: + dbus_message_iter_get_basic(iter, &byte); + bt_shell_printf("%s%s: 0x%02x (%d)\n", label, name, byte, byte); + break; + case DBUS_TYPE_VARIANT: + dbus_message_iter_recurse(iter, &subiter); + print_iter(label, name, &subiter); + break; + case DBUS_TYPE_ARRAY: + dbus_message_iter_recurse(iter, &subiter); + + if (dbus_type_is_fixed( + dbus_message_iter_get_arg_type(&subiter))) { + print_fixed_iter(label, name, &subiter); + break; + } + + while (dbus_message_iter_get_arg_type(&subiter) != + DBUS_TYPE_INVALID) { + print_iter(label, name, &subiter); + dbus_message_iter_next(&subiter); + } + break; + case DBUS_TYPE_DICT_ENTRY: + dbus_message_iter_recurse(iter, &subiter); + entry = g_strconcat(name, " Key", NULL); + print_iter(label, entry, &subiter); + g_free(entry); + + entry = g_strconcat(name, " Value", NULL); + dbus_message_iter_next(&subiter); + print_iter(label, entry, &subiter); + g_free(entry); + break; + default: + bt_shell_printf("%s%s has unsupported type\n", label, name); + break; + } +} + +void print_property_with_label(GDBusProxy *proxy, const char *name, + const char *label) +{ + DBusMessageIter iter; + + if (g_dbus_proxy_get_property(proxy, name, &iter) == FALSE) + return; + + print_iter("\t", label ? label : name, &iter); +} + +void print_property(GDBusProxy *proxy, const char *name) +{ + print_property_with_label(proxy, name, NULL); +} diff --git a/client/print.h b/client/print.h new file mode 100644 index 000000000000..c0866d06c504 --- /dev/null +++ b/client/print.h @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2022 Intel Corporation. All rights reserved. + * + * + */ + +void print_property(GDBusProxy *proxy, const char *name); +void print_property_with_label(GDBusProxy *proxy, const char *name, + const char *label); +void print_iter(const char *label, const char *name, DBusMessageIter *iter);