Skip to content

Commit 119d22a

Browse files
wopu-otnashif
authored andcommitted
Bluetooth: controller: Refactor LLCP PDU length checks
Refactor LLCP PDU length checks to avoid constructing a look-up-table. Signed-off-by: Wolfgang Puffitsch <[email protected]>
1 parent b452321 commit 119d22a

File tree

2 files changed

+28
-103
lines changed

2 files changed

+28
-103
lines changed

subsys/bluetooth/controller/ll_sw/pdu.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,9 @@ struct pdu_data_llctrl {
616616
} __packed;
617617
} __packed;
618618

619+
#define PDU_DATA_LLCTRL_LEN(type) (offsetof(struct pdu_data_llctrl, type) + \
620+
sizeof(struct pdu_data_llctrl_ ## type))
621+
619622
#if defined(CONFIG_BT_CTLR_PROFILE_ISR)
620623
struct profile {
621624
uint8_t lcur;

subsys/bluetooth/controller/ll_sw/ull_conn.c

Lines changed: 25 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -5486,66 +5486,6 @@ static inline void ctrl_tx_ack(struct ll_conn *conn, struct node_tx **tx,
54865486
}
54875487
}
54885488

5489-
static inline bool pdu_len_cmp(uint8_t opcode, uint8_t len)
5490-
{
5491-
const uint8_t ctrl_len_lut[] = {
5492-
(offsetof(struct pdu_data_llctrl, conn_update_ind) +
5493-
sizeof(struct pdu_data_llctrl_conn_update_ind)),
5494-
(offsetof(struct pdu_data_llctrl, chan_map_ind) +
5495-
sizeof(struct pdu_data_llctrl_chan_map_ind)),
5496-
(offsetof(struct pdu_data_llctrl, terminate_ind) +
5497-
sizeof(struct pdu_data_llctrl_terminate_ind)),
5498-
(offsetof(struct pdu_data_llctrl, enc_req) +
5499-
sizeof(struct pdu_data_llctrl_enc_req)),
5500-
(offsetof(struct pdu_data_llctrl, enc_rsp) +
5501-
sizeof(struct pdu_data_llctrl_enc_rsp)),
5502-
(offsetof(struct pdu_data_llctrl, start_enc_req) +
5503-
sizeof(struct pdu_data_llctrl_start_enc_req)),
5504-
(offsetof(struct pdu_data_llctrl, start_enc_rsp) +
5505-
sizeof(struct pdu_data_llctrl_start_enc_rsp)),
5506-
(offsetof(struct pdu_data_llctrl, unknown_rsp) +
5507-
sizeof(struct pdu_data_llctrl_unknown_rsp)),
5508-
(offsetof(struct pdu_data_llctrl, feature_req) +
5509-
sizeof(struct pdu_data_llctrl_feature_req)),
5510-
(offsetof(struct pdu_data_llctrl, feature_rsp) +
5511-
sizeof(struct pdu_data_llctrl_feature_rsp)),
5512-
(offsetof(struct pdu_data_llctrl, pause_enc_req) +
5513-
sizeof(struct pdu_data_llctrl_pause_enc_req)),
5514-
(offsetof(struct pdu_data_llctrl, pause_enc_rsp) +
5515-
sizeof(struct pdu_data_llctrl_pause_enc_rsp)),
5516-
(offsetof(struct pdu_data_llctrl, version_ind) +
5517-
sizeof(struct pdu_data_llctrl_version_ind)),
5518-
(offsetof(struct pdu_data_llctrl, reject_ind) +
5519-
sizeof(struct pdu_data_llctrl_reject_ind)),
5520-
(offsetof(struct pdu_data_llctrl, slave_feature_req) +
5521-
sizeof(struct pdu_data_llctrl_slave_feature_req)),
5522-
(offsetof(struct pdu_data_llctrl, conn_param_req) +
5523-
sizeof(struct pdu_data_llctrl_conn_param_req)),
5524-
(offsetof(struct pdu_data_llctrl, conn_param_rsp) +
5525-
sizeof(struct pdu_data_llctrl_conn_param_rsp)),
5526-
(offsetof(struct pdu_data_llctrl, reject_ext_ind) +
5527-
sizeof(struct pdu_data_llctrl_reject_ext_ind)),
5528-
(offsetof(struct pdu_data_llctrl, ping_req) +
5529-
sizeof(struct pdu_data_llctrl_ping_req)),
5530-
(offsetof(struct pdu_data_llctrl, ping_rsp) +
5531-
sizeof(struct pdu_data_llctrl_ping_rsp)),
5532-
(offsetof(struct pdu_data_llctrl, length_req) +
5533-
sizeof(struct pdu_data_llctrl_length_req)),
5534-
(offsetof(struct pdu_data_llctrl, length_rsp) +
5535-
sizeof(struct pdu_data_llctrl_length_rsp)),
5536-
(offsetof(struct pdu_data_llctrl, phy_req) +
5537-
sizeof(struct pdu_data_llctrl_phy_req)),
5538-
(offsetof(struct pdu_data_llctrl, phy_rsp) +
5539-
sizeof(struct pdu_data_llctrl_phy_rsp)),
5540-
(offsetof(struct pdu_data_llctrl, phy_upd_ind) +
5541-
sizeof(struct pdu_data_llctrl_phy_upd_ind)),
5542-
(offsetof(struct pdu_data_llctrl, min_used_chans_ind) +
5543-
sizeof(struct pdu_data_llctrl_min_used_chans_ind)),
5544-
};
5545-
5546-
return ctrl_len_lut[opcode] == len;
5547-
}
5548-
55495489
static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
55505490
struct pdu_data *pdu_rx, struct ll_conn *conn)
55515491
{
@@ -5574,8 +5514,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
55745514
uint8_t err;
55755515

55765516
if (!conn->lll.role ||
5577-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_CONN_UPDATE_IND,
5578-
pdu_rx->len)) {
5517+
PDU_DATA_LLCTRL_LEN(conn_update_ind) != pdu_rx->len) {
55795518
goto ull_conn_rx_unknown_rsp_send;
55805519
}
55815520

@@ -5596,8 +5535,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
55965535
uint8_t err;
55975536

55985537
if (!conn->lll.role ||
5599-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_CHAN_MAP_IND,
5600-
pdu_rx->len)) {
5538+
PDU_DATA_LLCTRL_LEN(chan_map_ind) != pdu_rx->len) {
56015539
goto ull_conn_rx_unknown_rsp_send;
56025540
}
56035541

@@ -5610,8 +5548,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
56105548
#endif /* CONFIG_BT_PERIPHERAL */
56115549

56125550
case PDU_DATA_LLCTRL_TYPE_TERMINATE_IND:
5613-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_TERMINATE_IND,
5614-
pdu_rx->len)) {
5551+
if (PDU_DATA_LLCTRL_LEN(terminate_ind) != pdu_rx->len) {
56155552
goto ull_conn_rx_unknown_rsp_send;
56165553
}
56175554

@@ -5622,7 +5559,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
56225559
#if defined(CONFIG_BT_PERIPHERAL)
56235560
case PDU_DATA_LLCTRL_TYPE_ENC_REQ:
56245561
if (!conn->lll.role ||
5625-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_ENC_REQ, pdu_rx->len)) {
5562+
PDU_DATA_LLCTRL_LEN(enc_req) != pdu_rx->len) {
56265563
goto ull_conn_rx_unknown_rsp_send;
56275564
}
56285565

@@ -5693,7 +5630,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
56935630
#if defined(CONFIG_BT_CENTRAL)
56945631
case PDU_DATA_LLCTRL_TYPE_ENC_RSP:
56955632
if (conn->lll.role ||
5696-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_ENC_RSP, pdu_rx->len)) {
5633+
PDU_DATA_LLCTRL_LEN(enc_rsp) != pdu_rx->len) {
56975634
goto ull_conn_rx_unknown_rsp_send;
56985635
}
56995636

@@ -5714,8 +5651,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
57145651
case PDU_DATA_LLCTRL_TYPE_START_ENC_REQ:
57155652
if (conn->lll.role || (conn->llcp_req == conn->llcp_ack) ||
57165653
(conn->llcp_type != LLCP_ENCRYPTION) ||
5717-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_START_ENC_REQ,
5718-
pdu_rx->len)) {
5654+
PDU_DATA_LLCTRL_LEN(start_enc_req) != pdu_rx->len) {
57195655
goto ull_conn_rx_unknown_rsp_send;
57205656
}
57215657

@@ -5729,8 +5665,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
57295665
#endif /* CONFIG_BT_CENTRAL */
57305666

57315667
case PDU_DATA_LLCTRL_TYPE_START_ENC_RSP:
5732-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_START_ENC_RSP,
5733-
pdu_rx->len)) {
5668+
if (PDU_DATA_LLCTRL_LEN(start_enc_rsp) != pdu_rx->len) {
57345669
goto ull_conn_rx_unknown_rsp_send;
57355670
}
57365671

@@ -5782,8 +5717,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
57825717
#if defined(CONFIG_BT_PERIPHERAL)
57835718
case PDU_DATA_LLCTRL_TYPE_FEATURE_REQ:
57845719
if (!conn->lll.role ||
5785-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_FEATURE_REQ,
5786-
pdu_rx->len)) {
5720+
PDU_DATA_LLCTRL_LEN(feature_req) != pdu_rx->len) {
57875721
goto ull_conn_rx_unknown_rsp_send;
57885722
}
57895723

@@ -5794,8 +5728,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
57945728
#if defined(CONFIG_BT_CENTRAL) && defined(CONFIG_BT_CTLR_SLAVE_FEAT_REQ)
57955729
case PDU_DATA_LLCTRL_TYPE_SLAVE_FEATURE_REQ:
57965730
if (conn->lll.role ||
5797-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_SLAVE_FEATURE_REQ,
5798-
pdu_rx->len)) {
5731+
PDU_DATA_LLCTRL_LEN(slave_feature_req) != pdu_rx->len) {
57995732
goto ull_conn_rx_unknown_rsp_send;
58005733
}
58015734

@@ -5807,8 +5740,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
58075740
case PDU_DATA_LLCTRL_TYPE_FEATURE_RSP:
58085741
if ((!IS_ENABLED(CONFIG_BT_CTLR_SLAVE_FEAT_REQ) &&
58095742
conn->lll.role) ||
5810-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_FEATURE_RSP,
5811-
pdu_rx->len)) {
5743+
PDU_DATA_LLCTRL_LEN(feature_rsp) != pdu_rx->len) {
58125744
goto ull_conn_rx_unknown_rsp_send;
58135745
}
58145746

@@ -5820,8 +5752,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
58205752
#if defined(CONFIG_BT_PERIPHERAL)
58215753
case PDU_DATA_LLCTRL_TYPE_PAUSE_ENC_REQ:
58225754
if (!conn->lll.role ||
5823-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PAUSE_ENC_REQ,
5824-
pdu_rx->len)) {
5755+
PDU_DATA_LLCTRL_LEN(pause_enc_req) != pdu_rx->len) {
58255756
goto ull_conn_rx_unknown_rsp_send;
58265757
}
58275758

@@ -5830,8 +5761,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
58305761
#endif /* CONFIG_BT_PERIPHERAL */
58315762

58325763
case PDU_DATA_LLCTRL_TYPE_PAUSE_ENC_RSP:
5833-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PAUSE_ENC_RSP,
5834-
pdu_rx->len)) {
5764+
if (PDU_DATA_LLCTRL_LEN(pause_enc_rsp) != pdu_rx->len) {
58355765
goto ull_conn_rx_unknown_rsp_send;
58365766
}
58375767

@@ -5840,8 +5770,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
58405770
#endif /* CONFIG_BT_CTLR_LE_ENC */
58415771

58425772
case PDU_DATA_LLCTRL_TYPE_VERSION_IND:
5843-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_VERSION_IND,
5844-
pdu_rx->len)) {
5773+
if (PDU_DATA_LLCTRL_LEN(version_ind) != pdu_rx->len) {
58455774
goto ull_conn_rx_unknown_rsp_send;
58465775
}
58475776

@@ -5850,7 +5779,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
58505779

58515780
#if defined(CONFIG_BT_CTLR_LE_ENC)
58525781
case PDU_DATA_LLCTRL_TYPE_REJECT_IND:
5853-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_REJECT_IND, pdu_rx->len)) {
5782+
if (PDU_DATA_LLCTRL_LEN(reject_ind) != pdu_rx->len) {
58545783
goto ull_conn_rx_unknown_rsp_send;
58555784
}
58565785

@@ -5860,8 +5789,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
58605789

58615790
#if defined(CONFIG_BT_CTLR_CONN_PARAM_REQ)
58625791
case PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ:
5863-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ,
5864-
pdu_rx->len)) {
5792+
if (PDU_DATA_LLCTRL_LEN(conn_param_req) != pdu_rx->len) {
58655793
goto ull_conn_rx_unknown_rsp_send;
58665794
}
58675795

@@ -6114,8 +6042,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
61146042
#if defined(CONFIG_BT_CENTRAL)
61156043
case PDU_DATA_LLCTRL_TYPE_CONN_PARAM_RSP:
61166044
if (conn->lll.role ||
6117-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_CONN_PARAM_RSP,
6118-
pdu_rx->len)) {
6045+
PDU_DATA_LLCTRL_LEN(conn_param_rsp) != pdu_rx->len) {
61196046
goto ull_conn_rx_unknown_rsp_send;
61206047
}
61216048

@@ -6188,8 +6115,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
61886115
#endif /* CONFIG_BT_CTLR_CONN_PARAM_REQ */
61896116

61906117
case PDU_DATA_LLCTRL_TYPE_REJECT_EXT_IND:
6191-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_REJECT_EXT_IND,
6192-
pdu_rx->len)) {
6118+
if (PDU_DATA_LLCTRL_LEN(reject_ext_ind) != pdu_rx->len) {
61936119
goto ull_conn_rx_unknown_rsp_send;
61946120
}
61956121

@@ -6198,15 +6124,15 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
61986124

61996125
#if defined(CONFIG_BT_CTLR_LE_PING)
62006126
case PDU_DATA_LLCTRL_TYPE_PING_REQ:
6201-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PING_REQ, pdu_rx->len)) {
6127+
if (PDU_DATA_LLCTRL_LEN(ping_req) != pdu_rx->len) {
62026128
goto ull_conn_rx_unknown_rsp_send;
62036129
}
62046130

62056131
nack = ping_resp_send(conn, *rx);
62066132
break;
62076133

62086134
case PDU_DATA_LLCTRL_TYPE_PING_RSP:
6209-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PING_RSP, pdu_rx->len)) {
6135+
if (PDU_DATA_LLCTRL_LEN(ping_rsp) != pdu_rx->len) {
62106136
goto ull_conn_rx_unknown_rsp_send;
62116137
}
62126138

@@ -6220,8 +6146,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
62206146
#endif /* CONFIG_BT_CTLR_LE_PING */
62216147

62226148
case PDU_DATA_LLCTRL_TYPE_UNKNOWN_RSP:
6223-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_UNKNOWN_RSP,
6224-
pdu_rx->len)) {
6149+
if (PDU_DATA_LLCTRL_LEN(unknown_rsp) != pdu_rx->len) {
62256150
goto ull_conn_rx_unknown_rsp_send;
62266151
}
62276152

@@ -6370,8 +6295,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
63706295
#if defined(CONFIG_BT_CTLR_DATA_LENGTH)
63716296
case PDU_DATA_LLCTRL_TYPE_LENGTH_RSP:
63726297
case PDU_DATA_LLCTRL_TYPE_LENGTH_REQ:
6373-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_LENGTH_REQ,
6374-
pdu_rx->len)) {
6298+
if (PDU_DATA_LLCTRL_LEN(length_req) != pdu_rx->len) {
63756299
goto ull_conn_rx_unknown_rsp_send;
63766300
}
63776301

@@ -6381,7 +6305,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
63816305

63826306
#if defined(CONFIG_BT_CTLR_PHY)
63836307
case PDU_DATA_LLCTRL_TYPE_PHY_REQ:
6384-
if (!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PHY_REQ, pdu_rx->len)) {
6308+
if (PDU_DATA_LLCTRL_LEN(phy_req) != pdu_rx->len) {
63856309
goto ull_conn_rx_unknown_rsp_send;
63866310
}
63876311

@@ -6469,7 +6393,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
64696393
#if defined(CONFIG_BT_CENTRAL)
64706394
case PDU_DATA_LLCTRL_TYPE_PHY_RSP:
64716395
if (conn->lll.role ||
6472-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PHY_RSP, pdu_rx->len)) {
6396+
PDU_DATA_LLCTRL_LEN(phy_rsp) != pdu_rx->len) {
64736397
goto ull_conn_rx_unknown_rsp_send;
64746398
}
64756399

@@ -6508,8 +6432,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
65086432
uint8_t err;
65096433

65106434
if (!conn->lll.role ||
6511-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_PHY_UPD_IND,
6512-
pdu_rx->len)) {
6435+
PDU_DATA_LLCTRL_LEN(phy_upd_ind) != pdu_rx->len) {
65136436
goto ull_conn_rx_unknown_rsp_send;
65146437
}
65156438

@@ -6526,8 +6449,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
65266449
#if defined(CONFIG_BT_CENTRAL)
65276450
case PDU_DATA_LLCTRL_TYPE_MIN_USED_CHAN_IND:
65286451
if (conn->lll.role ||
6529-
!pdu_len_cmp(PDU_DATA_LLCTRL_TYPE_MIN_USED_CHAN_IND,
6530-
pdu_rx->len)) {
6452+
PDU_DATA_LLCTRL_LEN(min_used_chans_ind) != pdu_rx->len) {
65316453
goto ull_conn_rx_unknown_rsp_send;
65326454
}
65336455

0 commit comments

Comments
 (0)