Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp1395069rwb; Thu, 1 Dec 2022 17:07:08 -0800 (PST) X-Google-Smtp-Source: AA0mqf76emnkE5yXo6zrTvXlKJT6lOJHJc2QpCgdNhm/2uIf2bptYRVvPjDlnigCJgm6IBMStTxE X-Received: by 2002:a17:906:39c8:b0:7ad:79c0:5482 with SMTP id i8-20020a17090639c800b007ad79c05482mr48659990eje.730.1669943228691; Thu, 01 Dec 2022 17:07:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669943228; cv=none; d=google.com; s=arc-20160816; b=EICM/Q8fMC5mX5Xyyu14tM7QebcPlZ9Vc9gWoTDMYdRAwMl+V3sKn3Pg7OSXwcaeKA Uv5ga0n//e45rfq+3S/VK/r+lVN0sUjbeZssNhrDejNawXl6aMFVQfcxn4YBn8/1jTCi 1dlTyhGBZGeOFa0iOyfIWdSFEcSLOT8fan2TfsFP9kD3My9umokfaz8B202U9QJbE3jl UulHUNCRaen+y7RMR//0/VVq6AFypIPyDWCJoJxhDDv6zN1OiKHpeU4ksoI9kS5j91eD +uvpw5gjO6L8fdvNC7AqAzQe4zdYFodrzzm8htCqZXhiyDjnXLpH9ZMWP2awV2OwsCQR 5M0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=abZSiyeyD5TDfxzaY7Wlf7GTc9GtM0cy6S/iptmDoTY=; b=cBcEtk+Nyr53g3hvQpYCsloNjk3mM6FEeTLgP1vNt/nK9oAY0/O2oCLDrUjLNxZxLS yaEswQJzOxsH093b60LqYIMbDo3t9YbSskHFQYE3ZTu6C2/B93VkOOenbFgYWwr51BrX xqyg/mHalod7Bz2/heUpr4KWLsPvXoLdlWph1dzU3Yfv/Eh0TX/Lx9i3/mA2tqqJz7rf Iq+zGCAlEx8mz6uWYbuNdiGsmJi2bbrBlHRU/3rGn1f4xPAP1ARk5esQ8nDW/fNLV98p TG84HuBW8HH03Lehh1Ge/GUNzd80XPSXGPMWNIktB9mo3CeSy3Q2CAISWHnCN8BXa3sQ FdjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Iw+D41BY; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w18-20020aa7dcd2000000b0044ee4ec8915si1172664edu.39.2022.12.01.17.06.44; Thu, 01 Dec 2022 17:07:08 -0800 (PST) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Iw+D41BY; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232008AbiLBAvH (ORCPT + 99 others); Thu, 1 Dec 2022 19:51:07 -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-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 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net 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, -- 2.37.3