Skip to content

Commit 5cb3721

Browse files
cvinayakcarlescufi
authored andcommitted
Bluetooth: Controller: Fix HCI command parameter check failures
Fix assorted HCI command parameter check failures faced during conformance testing. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 5130db3 commit 5cb3721

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

subsys/bluetooth/controller/hci/hci.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3278,10 +3278,12 @@ static void le_per_adv_create_sync(struct net_buf *buf, struct net_buf **evt)
32783278
uint8_t status;
32793279
uint16_t skip;
32803280

3281-
if (adv_cmds_ext_check(evt)) {
3281+
if (adv_cmds_ext_check(NULL)) {
3282+
*evt = cmd_status(BT_HCI_ERR_CMD_DISALLOWED);
32823283
return;
32833284
}
32843285

3286+
32853287
skip = sys_le16_to_cpu(cmd->skip);
32863288
sync_timeout = sys_le16_to_cpu(cmd->sync_timeout);
32873289

@@ -3334,6 +3336,10 @@ static void le_per_adv_recv_enable(struct net_buf *buf, struct net_buf **evt)
33343336
uint16_t handle;
33353337
uint8_t status;
33363338

3339+
if (adv_cmds_ext_check(evt)) {
3340+
return;
3341+
}
3342+
33373343
handle = sys_le16_to_cpu(cmd->handle);
33383344

33393345
status = ll_sync_recv_enable(handle, cmd->enable);

subsys/bluetooth/controller/ll_sw/ull_adv_sync.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,12 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
511511

512512
lll_sync = adv->lll.sync;
513513
if (!lll_sync) {
514-
return BT_HCI_ERR_UNKNOWN_ADV_IDENTIFIER;
514+
return BT_HCI_ERR_CMD_DISALLOWED;
515+
}
516+
517+
/* TODO: Add Periodic Advertising ADI Support feature */
518+
if (enable > 1U) {
519+
return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
515520
}
516521

517522
sync = HDR_LLL2ULL(lll_sync);

subsys/bluetooth/controller/ll_sw/ull_central.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,11 @@ uint8_t ll_create_connection(uint16_t scan_interval, uint16_t scan_window,
7777
#endif /* !CONFIG_BT_CTLR_ADV_EXT */
7878
{
7979
struct lll_conn *conn_lll;
80-
struct ll_scan_set *scan;
8180
uint32_t conn_interval_us;
81+
uint8_t own_id_addr_type;
82+
struct ll_scan_set *scan;
8283
uint32_t ready_delay_us;
84+
uint8_t *own_id_addr;
8385
struct lll_scan *lll;
8486
struct ll_conn *conn;
8587
uint16_t max_tx_time;
@@ -93,12 +95,15 @@ uint8_t ll_create_connection(uint16_t scan_interval, uint16_t scan_window,
9395
return BT_HCI_ERR_CMD_DISALLOWED;
9496
}
9597

96-
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
97-
const uint8_t own_id_addr_type = (own_addr_type & 0x01);
98-
const uint8_t *own_id_addr;
98+
/* Check if random address has been set */
99+
own_id_addr_type = (own_addr_type & 0x01);
100+
own_id_addr = ll_addr_get(own_id_addr_type);
101+
if (own_id_addr_type && !mem_nz((void *)own_id_addr, BDADDR_SIZE)) {
102+
return BT_HCI_ERR_INVALID_PARAM;
103+
}
99104

105+
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
100106
/* Do not connect twice to the same peer */
101-
own_id_addr = ll_addr_get(own_id_addr_type);
102107
if (ull_conn_peer_connected(own_id_addr_type, own_id_addr,
103108
peer_addr_type, peer_addr)) {
104109
return BT_HCI_ERR_CONN_ALREADY_EXISTS;

subsys/bluetooth/controller/ll_sw/ull_conn.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,26 @@ uint8_t ll_version_ind_send(uint16_t handle)
547547
}
548548

549549
#if defined(CONFIG_BT_CTLR_DATA_LENGTH)
550-
uint32_t ll_length_req_send(uint16_t handle, uint16_t tx_octets, uint16_t tx_time)
550+
uint32_t ll_length_req_send(uint16_t handle, uint16_t tx_octets,
551+
uint16_t tx_time)
551552
{
552553
struct ll_conn *conn;
553554

555+
#if defined(CONFIG_BT_CTLR_PARAM_CHECK)
556+
#if defined(CONFIG_BT_CTLR_PHY_CODED)
557+
uint16_t tx_time_max =
558+
PDU_DC_MAX_US(CONFIG_BT_BUF_ACL_TX_SIZE, PHY_CODED);
559+
#else /* !CONFIG_BT_CTLR_PHY_CODED */
560+
uint16_t tx_time_max =
561+
PDU_DC_MAX_US(CONFIG_BT_BUF_ACL_TX_SIZE, PHY_1M);
562+
#endif /* !CONFIG_BT_CTLR_PHY_CODED */
563+
564+
if ((tx_octets > CONFIG_BT_BUF_ACL_TX_SIZE) ||
565+
(tx_time > tx_time_max)) {
566+
return BT_HCI_ERR_INVALID_PARAM;
567+
}
568+
#endif /* CONFIG_BT_CTLR_PARAM_CHECK */
569+
554570
conn = ll_connected_get(handle);
555571
if (!conn) {
556572
return BT_HCI_ERR_UNKNOWN_CONN_ID;

0 commit comments

Comments
 (0)