Bluetooth: ISO: Add ISO channel type
Add a enum for the ISO channel type instead of using a boolean for just bis/cis. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
parent
7f004f1b35
commit
c6b78b93d9
4 changed files with 48 additions and 23 deletions
|
@ -98,6 +98,14 @@ enum {
|
||||||
BT_ISO_DISCONNECT,
|
BT_ISO_DISCONNECT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum bt_iso_chan_type {
|
||||||
|
BT_ISO_CHAN_TYPE_NONE,
|
||||||
|
BT_ISO_CHAN_TYPE_CONNECTED,
|
||||||
|
BT_ISO_CHAN_TYPE_BROADCASTER,
|
||||||
|
BT_ISO_CHAN_TYPE_SYNC_RECEIVER
|
||||||
|
};
|
||||||
|
|
||||||
/** @brief ISO Channel structure. */
|
/** @brief ISO Channel structure. */
|
||||||
struct bt_iso_chan {
|
struct bt_iso_chan {
|
||||||
/** Channel connection reference */
|
/** Channel connection reference */
|
||||||
|
|
|
@ -2240,7 +2240,8 @@ int bt_conn_get_info(const struct bt_conn *conn, struct bt_conn_info *info)
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_BT_ISO)
|
#if defined(CONFIG_BT_ISO)
|
||||||
case BT_CONN_TYPE_ISO:
|
case BT_CONN_TYPE_ISO:
|
||||||
if (!conn->iso.is_bis) {
|
if (IS_ENABLED(CONFIG_BT_ISO_UNICAST) &&
|
||||||
|
conn->iso.type == BT_ISO_CHAN_TYPE_CONNECTED) {
|
||||||
info->le.dst = &conn->iso.acl->le.dst;
|
info->le.dst = &conn->iso.acl->le.dst;
|
||||||
info->le.src = &bt_dev.id_addr[conn->iso.acl->id];
|
info->le.src = &bt_dev.id_addr[conn->iso.acl->id];
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4,10 +4,13 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel Corporation
|
* Copyright (c) 2015 Intel Corporation
|
||||||
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <bluetooth/iso.h>
|
||||||
|
|
||||||
typedef enum __packed {
|
typedef enum __packed {
|
||||||
BT_CONN_DISCONNECTED,
|
BT_CONN_DISCONNECTED,
|
||||||
BT_CONN_DISCONNECT_COMPLETE,
|
BT_CONN_DISCONNECT_COMPLETE,
|
||||||
|
@ -125,8 +128,8 @@ struct bt_conn_iso {
|
||||||
uint8_t bis_id;
|
uint8_t bis_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** If true, this is a ISO for a BIS, else it is a ISO for a CIS */
|
/** Type of the ISO channel */
|
||||||
bool is_bis;
|
enum bt_iso_chan_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*bt_conn_tx_cb_t)(struct bt_conn *conn, void *user_data);
|
typedef void (*bt_conn_tx_cb_t)(struct bt_conn *conn, void *user_data);
|
||||||
|
|
|
@ -307,18 +307,16 @@ static int bt_iso_setup_data_path(struct bt_conn *iso)
|
||||||
out_path = &disabled_path;
|
out_path = &disabled_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iso->iso.is_bis) {
|
if (IS_ENABLED(CONFIG_BT_ISO_BROADCASTER) &&
|
||||||
/* Only set one data path for BIS as per the spec */
|
iso->iso.type == BT_ISO_CHAN_TYPE_BROADCASTER && tx_qos) {
|
||||||
if (tx_qos) {
|
dir = BT_HCI_DATAPATH_DIR_HOST_TO_CTLR;
|
||||||
dir = BT_HCI_DATAPATH_DIR_HOST_TO_CTLR;
|
return hci_le_setup_iso_data_path(iso, dir, in_path);
|
||||||
return hci_le_setup_iso_data_path(iso, dir, in_path);
|
} else if (IS_ENABLED(CONFIG_BT_ISO_SYNC_RECEIVER) &&
|
||||||
|
iso->iso.type == BT_ISO_CHAN_TYPE_SYNC_RECEIVER) {
|
||||||
} else {
|
dir = BT_HCI_DATAPATH_DIR_CTLR_TO_HOST;
|
||||||
dir = BT_HCI_DATAPATH_DIR_CTLR_TO_HOST;
|
return hci_le_setup_iso_data_path(iso, dir, out_path);
|
||||||
return hci_le_setup_iso_data_path(iso, dir, out_path);
|
} else if (IS_ENABLED(CONFIG_BT_ISO_UNICAST) &&
|
||||||
}
|
iso->iso.type == BT_ISO_CHAN_TYPE_CONNECTED) {
|
||||||
|
|
||||||
} else {
|
|
||||||
/* Setup both directions for CIS*/
|
/* Setup both directions for CIS*/
|
||||||
dir = BT_HCI_DATAPATH_DIR_HOST_TO_CTLR;
|
dir = BT_HCI_DATAPATH_DIR_HOST_TO_CTLR;
|
||||||
err = hci_le_setup_iso_data_path(iso, dir, in_path);
|
err = hci_le_setup_iso_data_path(iso, dir, in_path);
|
||||||
|
@ -328,6 +326,9 @@ static int bt_iso_setup_data_path(struct bt_conn *iso)
|
||||||
|
|
||||||
dir = BT_HCI_DATAPATH_DIR_CTLR_TO_HOST;
|
dir = BT_HCI_DATAPATH_DIR_CTLR_TO_HOST;
|
||||||
return hci_le_setup_iso_data_path(iso, dir, out_path);
|
return hci_le_setup_iso_data_path(iso, dir, out_path);
|
||||||
|
} else {
|
||||||
|
__ASSERT(false, "Invalid iso.type: %u", iso->iso.type);
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +347,8 @@ void bt_iso_connected(struct bt_conn *iso)
|
||||||
if (bt_iso_setup_data_path(iso)) {
|
if (bt_iso_setup_data_path(iso)) {
|
||||||
BT_ERR("Unable to setup data path");
|
BT_ERR("Unable to setup data path");
|
||||||
#if defined(CONFIG_BT_ISO_BROADCAST)
|
#if defined(CONFIG_BT_ISO_BROADCAST)
|
||||||
if (iso->iso.is_bis) {
|
if (iso->iso.type == BT_ISO_CHAN_TYPE_BROADCASTER ||
|
||||||
|
iso->iso.type == BT_ISO_CHAN_TYPE_SYNC_RECEIVER) {
|
||||||
struct bt_iso_big *big;
|
struct bt_iso_big *big;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -356,11 +358,14 @@ void bt_iso_connected(struct bt_conn *iso)
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
BT_ERR("Could not terminate BIG: %d", err);
|
BT_ERR("Could not terminate BIG: %d", err);
|
||||||
}
|
}
|
||||||
} else if (IS_ENABLED(CONFIG_BT_ISO_UNICAST))
|
}
|
||||||
#endif /* CONFIG_BT_ISO_BROADCAST */
|
#endif /* CONFIG_BT_ISO_BROADCAST */
|
||||||
{
|
if (IS_ENABLED(CONFIG_BT_ISO_UNICAST) &&
|
||||||
|
iso->iso.type == BT_ISO_CHAN_TYPE_CONNECTED) {
|
||||||
bt_conn_disconnect(iso,
|
bt_conn_disconnect(iso,
|
||||||
BT_HCI_ERR_REMOTE_USER_TERM_CONN);
|
BT_HCI_ERR_REMOTE_USER_TERM_CONN);
|
||||||
|
} else {
|
||||||
|
__ASSERT(false, "Invalid iso.type: %u", iso->iso.type);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -382,7 +387,10 @@ static void bt_iso_remove_data_path(struct bt_conn *iso)
|
||||||
{
|
{
|
||||||
BT_DBG("%p", iso);
|
BT_DBG("%p", iso);
|
||||||
|
|
||||||
if (iso->iso.is_bis) {
|
if ((IS_ENABLED(CONFIG_BT_ISO_BROADCASTER) &&
|
||||||
|
iso->iso.type == BT_ISO_CHAN_TYPE_BROADCASTER) ||
|
||||||
|
(IS_ENABLED(CONFIG_BT_ISO_SYNC_RECEIVER) &&
|
||||||
|
iso->iso.type == BT_ISO_CHAN_TYPE_SYNC_RECEIVER)) {
|
||||||
struct bt_iso_chan *chan;
|
struct bt_iso_chan *chan;
|
||||||
struct bt_iso_chan_io_qos *tx_qos;
|
struct bt_iso_chan_io_qos *tx_qos;
|
||||||
uint8_t dir;
|
uint8_t dir;
|
||||||
|
@ -402,7 +410,8 @@ static void bt_iso_remove_data_path(struct bt_conn *iso)
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)hci_le_remove_iso_data_path(iso, dir);
|
(void)hci_le_remove_iso_data_path(iso, dir);
|
||||||
} else {
|
} else if (IS_ENABLED(CONFIG_BT_ISO_UNICAST) &&
|
||||||
|
iso->iso.type == BT_ISO_CHAN_TYPE_CONNECTED) {
|
||||||
/* Remove both directions for CIS*/
|
/* Remove both directions for CIS*/
|
||||||
|
|
||||||
/* TODO: Check which has been setup first to avoid removing
|
/* TODO: Check which has been setup first to avoid removing
|
||||||
|
@ -412,6 +421,8 @@ static void bt_iso_remove_data_path(struct bt_conn *iso)
|
||||||
BT_HCI_DATAPATH_DIR_CTLR_TO_HOST);
|
BT_HCI_DATAPATH_DIR_CTLR_TO_HOST);
|
||||||
(void)hci_le_remove_iso_data_path(iso,
|
(void)hci_le_remove_iso_data_path(iso,
|
||||||
BT_HCI_DATAPATH_DIR_HOST_TO_CTLR);
|
BT_HCI_DATAPATH_DIR_HOST_TO_CTLR);
|
||||||
|
} else {
|
||||||
|
__ASSERT(false, "Invalid iso.type: %u", iso->iso.type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,7 +437,8 @@ static void bt_iso_chan_disconnected(struct bt_iso_chan *chan, uint8_t reason)
|
||||||
/* The peripheral does not have the concept of a CIG, so once a CIS
|
/* The peripheral does not have the concept of a CIG, so once a CIS
|
||||||
* disconnects it is completely freed by unref'ing it
|
* disconnects it is completely freed by unref'ing it
|
||||||
*/
|
*/
|
||||||
if (IS_ENABLED(CONFIG_BT_ISO_UNICAST) && !chan->iso->iso.is_bis) {
|
if (IS_ENABLED(CONFIG_BT_ISO_UNICAST) &&
|
||||||
|
chan->iso->iso.type == BT_ISO_CHAN_TYPE_CONNECTED) {
|
||||||
bt_iso_cleanup_acl(chan->iso);
|
bt_iso_cleanup_acl(chan->iso);
|
||||||
|
|
||||||
if (chan->iso->role == BT_HCI_ROLE_PERIPHERAL) {
|
if (chan->iso->role == BT_HCI_ROLE_PERIPHERAL) {
|
||||||
|
@ -1145,7 +1157,7 @@ static int cig_init_cis(struct bt_iso_cig *cig,
|
||||||
}
|
}
|
||||||
|
|
||||||
cis->iso->iso.cig_id = cig->id;
|
cis->iso->iso.cig_id = cig->id;
|
||||||
cis->iso->iso.is_bis = false;
|
cis->iso->iso.type = BT_ISO_CHAN_TYPE_CONNECTED;
|
||||||
cis->iso->iso.cis_id = cig->num_cis++;
|
cis->iso->iso.cis_id = cig->num_cis++;
|
||||||
|
|
||||||
bt_iso_chan_add(cis->iso, cis);
|
bt_iso_chan_add(cis->iso, cis);
|
||||||
|
@ -1682,7 +1694,8 @@ static int big_init_bis(struct bt_iso_big *big,
|
||||||
}
|
}
|
||||||
|
|
||||||
bis->iso->iso.big_handle = big->handle;
|
bis->iso->iso.big_handle = big->handle;
|
||||||
bis->iso->iso.is_bis = true;
|
bis->iso->iso.type = broadcaster ? BT_ISO_CHAN_TYPE_BROADCASTER
|
||||||
|
: BT_ISO_CHAN_TYPE_SYNC_RECEIVER;
|
||||||
bis->iso->iso.bis_id = bt_conn_index(bis->iso);
|
bis->iso->iso.bis_id = bt_conn_index(bis->iso);
|
||||||
|
|
||||||
bt_iso_chan_add(bis->iso, bis);
|
bt_iso_chan_add(bis->iso, bis);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue