@@ -6425,7 +6425,8 @@ static void bap_sink_match_allocation(size_t i, uint8_t l, uint8_t t,
data->found = false;
}
-static bool bap_check_bis(struct bt_bap_db *ldb, struct iovec *bis_data)
+static struct bt_ltv_match bap_check_bis(struct bt_bap_db *ldb,
+ struct iovec *bis_data)
{
struct bt_ltv_match compare_data = {};
@@ -6451,21 +6452,18 @@ static bool bap_check_bis(struct bt_bap_db *ldb, struct iovec *bis_data)
&compare_data);
}
- return compare_data.found;
+ return compare_data;
}
-void bt_bap_add_bis(struct bt_bap *bap, uint8_t bis_index,
+void bt_bap_verify_bis(struct bt_bap *bap, uint8_t bis_index,
struct bt_bap_codec *codec,
struct iovec *l2_caps,
struct iovec *l3_caps,
- struct iovec *meta)
+ struct bt_bap_pac **lpac,
+ struct iovec **caps)
{
- struct bt_bap_pac *pac_source_bis;
- struct bt_bap_endpoint *ep;
- int err = 0;
- struct bt_bap_pac_qos bis_qos = {0};
- uint8_t type = 0;
struct bt_ltv_extract merge_data = {0};
+ struct bt_ltv_match match_data;
merge_data.src = l3_caps;
merge_data.result = new0(struct iovec, 1);
@@ -6481,64 +6479,14 @@ void bt_bap_add_bis(struct bt_bap *bap, uint8_t bis_index,
/* Check each BIS Codec Specific Configuration LTVs against our Codec
* Specific Capabilities and if the BIS matches create a PAC with it
*/
- if (bap_check_bis(bap->ldb, merge_data.result) == false)
- goto cleanup;
-
- DBG(bap, "Matching BIS %i", bis_index);
-
- /* Create a QoS structure based on the received BIS information to
- * specify the desired channel for this BIS/PAC
- */
- type = BAP_CHANNEL_ALLOCATION_LTV_TYPE;
- util_ltv_foreach(merge_data.result->iov_base,
- merge_data.result->iov_len, &type,
- bap_sink_get_allocation, &bis_qos.location);
-
- /* Create a remote PAC */
- pac_source_bis = bap_pac_new(bap->rdb, NULL,
- BT_BAP_BCAST_SOURCE, codec, &bis_qos,
- merge_data.result, meta);
-
- err = asprintf(&pac_source_bis->name, "%d", bis_index);
-
- if (err < 0) {
- DBG(bap, "error in asprintf");
- goto cleanup;
+ match_data = bap_check_bis(bap->ldb, merge_data.result);
+ if (match_data.found == true) {
+ *caps = merge_data.result;
+ DBG(bap, "Matching BIS %i", bis_index);
+ } else {
+ util_iov_free(merge_data.result, 1);
+ *caps = NULL;
+ *lpac = NULL;
}
- /* Add remote source endpoint */
- if (!bap->rdb->broadcast_sources)
- bap->rdb->broadcast_sources = queue_new();
- queue_push_tail(bap->rdb->broadcast_sources, pac_source_bis);
-
- queue_foreach(bap->pac_cbs, notify_pac_added, pac_source_bis);
- /* Push remote endpoint with direction sink */
- ep = bap_endpoint_new_broadcast(bap->rdb, BT_BAP_BCAST_SINK);
-
- if (ep)
- queue_push_tail(bap->remote_eps, ep);
-
-cleanup:
- util_iov_free(merge_data.result, 1);
-}
-
-void bt_bap_verify_bis(struct bt_bap *bap, uint8_t bis_index,
- struct bt_bap_codec *codec,
- struct iovec *l2_caps,
- struct iovec *l3_caps,
- struct bt_bap_pac **lpac,
- struct iovec **caps)
-{
- struct bt_ltv_extract merge_data = {0};
-
- merge_data.src = l3_caps;
- merge_data.result = new0(struct iovec, 1);
-
- /* Create a Codec Specific Configuration with LTVs at level 2 (subgroup)
- * overwritten by LTVs at level 3 (BIS)
- */
- util_ltv_foreach(l2_caps->iov_base,
- l2_caps->iov_len,
- NULL,
- bap_sink_check_level2_ltv, &merge_data);
}
@@ -251,12 +251,6 @@ bool bt_bap_pac_bcast_is_local(struct bt_bap *bap, struct bt_bap_pac *pac);
struct iovec *bt_bap_stream_get_base(struct bt_bap_stream *stream);
-void bt_bap_add_bis(struct bt_bap *bap, uint8_t bis_index,
- struct bt_bap_codec *codec,
- struct iovec *l2_caps,
- struct iovec *l3_caps,
- struct iovec *meta);
-
void bt_bap_verify_bis(struct bt_bap *bap, uint8_t bis_index,
struct bt_bap_codec *codec,
struct iovec *l2_caps,