Bluetooth: Controller: Implement Periodic Advertiser List

Implement support for Periodic Advertiser List to be used
in LE Periodic Advertising Create Sync command.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2021-09-06 11:59:23 +05:30 committed by Carles Cufí
commit bf01d55107
10 changed files with 471 additions and 21 deletions

View file

@ -707,6 +707,14 @@ static void read_supported_commands(struct net_buf *buf, struct net_buf **evt)
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
/* LE PA Create Sync, LE PA Create Sync Cancel, LE PA Terminate Sync */
rp->commands[38] |= BIT(0) | BIT(1) | BIT(2);
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST)
/* LE PA Add Device to Periodic Advertiser List,
* LE PA Remove Device from Periodic Advertiser List,
* LE Clear Periodic Advertiser List,
* LE Read Periodic Adveritiser List Size
*/
rp->commands[38] |= BIT(3) | BIT(4) | BIT(5) | BIT(6);
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST */
/* LE Set PA Receive Enable */
rp->commands[40] |= BIT(5);
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
@ -806,11 +814,6 @@ static void read_supported_commands(struct net_buf *buf, struct net_buf **evt)
rp->commands[40] |= BIT(4);
#endif /* CONFIG_BT_CTLR_DF */
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
/* LE Set Periodic Advertising Receive Enable */
rp->commands[40] |= BIT(5);
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#if defined(CONFIG_BT_HCI_RAW) && defined(CONFIG_BT_TINYCRYPT_ECC)
bt_hci_ecc_supported_commands(rp->commands);
#endif /* CONFIG_BT_HCI_RAW && CONFIG_BT_TINYCRYPT_ECC */
@ -3347,6 +3350,63 @@ static void le_per_adv_recv_enable(struct net_buf *buf, struct net_buf **evt)
ccst = hci_cmd_complete(evt, sizeof(*ccst));
ccst->status = status;
}
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST)
static void le_add_dev_to_pal(struct net_buf *buf, struct net_buf **evt)
{
struct bt_hci_cp_le_add_dev_to_per_adv_list *cmd = (void *)buf->data;
uint8_t status;
if (adv_cmds_ext_check(evt)) {
return;
}
status = ll_pal_add(&cmd->addr, cmd->sid);
*evt = cmd_complete_status(status);
}
static void le_rem_dev_from_pal(struct net_buf *buf, struct net_buf **evt)
{
struct bt_hci_cp_le_rem_dev_from_per_adv_list *cmd = (void *)buf->data;
uint8_t status;
if (adv_cmds_ext_check(evt)) {
return;
}
status = ll_pal_remove(&cmd->addr, cmd->sid);
*evt = cmd_complete_status(status);
}
static void le_clear_pal(struct net_buf *buf, struct net_buf **evt)
{
uint8_t status;
if (adv_cmds_ext_check(evt)) {
return;
}
status = ll_pal_clear();
*evt = cmd_complete_status(status);
}
static void le_read_pal_size(struct net_buf *buf, struct net_buf **evt)
{
struct bt_hci_rp_le_read_per_adv_list_size *rp;
if (adv_cmds_ext_check(evt)) {
return;
}
rp = hci_cmd_complete(evt, sizeof(*rp));
rp->status = 0x00;
rp->list_size = ll_pal_size_get();
}
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#endif /* CONFIG_BT_OBSERVER */
@ -3876,6 +3936,24 @@ static int controller_cmd_handle(uint16_t ocf, struct net_buf *cmd,
case BT_OCF(BT_HCI_OP_LE_SET_PER_ADV_RECV_ENABLE):
le_per_adv_recv_enable(cmd, evt);
break;
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST)
case BT_OCF(BT_HCI_OP_LE_ADD_DEV_TO_PER_ADV_LIST):
le_add_dev_to_pal(cmd, evt);
break;
case BT_OCF(BT_HCI_OP_LE_REM_DEV_FROM_PER_ADV_LIST):
le_rem_dev_from_pal(cmd, evt);
break;
case BT_OCF(BT_HCI_OP_LE_CLEAR_PER_ADV_LIST):
le_clear_pal(cmd, evt);
break;
case BT_OCF(BT_HCI_OP_LE_READ_PER_ADV_LIST_SIZE):
le_read_pal_size(cmd, evt);
break;
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#endif /* CONFIG_BT_OBSERVER */