Skip to content

Commit e8e668a

Browse files
wopu-otaescolar
authored andcommitted
Bluetooth: controller: Fix endianness for length update.
Fix endianness when accessing length update parameters in PDU. Signed-off-by: Wolfgang Puffitsch <[email protected]>
1 parent 3f89425 commit e8e668a

File tree

1 file changed

+62
-39
lines changed

1 file changed

+62
-39
lines changed

subsys/bluetooth/controller/ll_sw/ull_conn.c

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2786,14 +2786,19 @@ static inline void event_len_prep(struct ll_conn *conn)
27862786
pdu_ctrl_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_REQ;
27872787

27882788
lr = &pdu_ctrl_tx->llctrl.length_req;
2789-
lr->max_rx_octets = LL_LENGTH_OCTETS_RX_MAX;
2790-
lr->max_tx_octets = conn->default_tx_octets;
2789+
lr->max_rx_octets = sys_cpu_to_le16(LL_LENGTH_OCTETS_RX_MAX);
2790+
lr->max_tx_octets = sys_cpu_to_le16(conn->default_tx_octets);
27912791
#if !defined(CONFIG_BT_CTLR_PHY)
2792-
lr->max_rx_time = PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0);
2793-
lr->max_tx_time = PKT_US(conn->default_tx_octets, 0);
2792+
lr->max_rx_time =
2793+
sys_cpu_to_le16(PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0));
2794+
lr->max_tx_time =
2795+
sys_cpu_to_le16(PKT_US(conn->default_tx_octets, 0));
27942796
#else /* CONFIG_BT_CTLR_PHY */
2795-
lr->max_rx_time = PKT_US(LL_LENGTH_OCTETS_RX_MAX, BIT(2));
2796-
lr->max_tx_time = conn->default_tx_time;
2797+
lr->max_rx_time =
2798+
sys_cpu_to_le16(PKT_US(LL_LENGTH_OCTETS_RX_MAX,
2799+
BIT(2)));
2800+
lr->max_tx_time =
2801+
sys_cpu_to_le16(conn->default_tx_time);
27972802
#endif /* CONFIG_BT_CTLR_PHY */
27982803

27992804
ctrl_tx_enqueue(conn, tx);
@@ -2844,14 +2849,16 @@ static inline void event_len_prep(struct ll_conn *conn)
28442849
pdu_ctrl_rx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP;
28452850

28462851
lr = &pdu_ctrl_rx->llctrl.length_rsp;
2847-
lr->max_rx_octets = lll->max_rx_octets;
2848-
lr->max_tx_octets = lll->max_tx_octets;
2852+
lr->max_rx_octets = sys_cpu_to_le16(lll->max_rx_octets);
2853+
lr->max_tx_octets = sys_cpu_to_le16(lll->max_tx_octets);
28492854
#if !defined(CONFIG_BT_CTLR_PHY)
2850-
lr->max_rx_time = PKT_US(lll->max_rx_octets, 0);
2851-
lr->max_tx_time = PKT_US(lll->max_tx_octets, 0);
2855+
lr->max_rx_time =
2856+
sys_cpu_to_le16(PKT_US(lll->max_rx_octets, 0));
2857+
lr->max_tx_time =
2858+
sys_cpu_to_le16(PKT_US(lll->max_tx_octets, 0));
28522859
#else /* CONFIG_BT_CTLR_PHY */
2853-
lr->max_rx_time = lll->max_rx_time;
2854-
lr->max_tx_time = lll->max_tx_time;
2860+
lr->max_rx_time = sys_cpu_to_le16(lll->max_rx_time);
2861+
lr->max_tx_time = sys_cpu_to_le16(lll->max_tx_time);
28552862
#endif /* CONFIG_BT_CTLR_PHY */
28562863

28572864
/* enqueue rx node towards Thread */
@@ -3717,14 +3724,16 @@ static inline void reject_ind_dle_recv(struct ll_conn *conn,
37173724
pdu_rx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP;
37183725

37193726
lr = (void *)&pdu_rx->llctrl.length_req;
3720-
lr->max_rx_octets = conn->lll.max_rx_octets;
3721-
lr->max_tx_octets = conn->lll.max_tx_octets;
3727+
lr->max_rx_octets = sys_cpu_to_le16(conn->lll.max_rx_octets);
3728+
lr->max_tx_octets = sys_cpu_to_le16(conn->lll.max_tx_octets);
37223729
#if !defined(CONFIG_BT_CTLR_PHY)
3723-
lr->max_rx_time = PKT_US(conn->lll.max_rx_octets, 0);
3724-
lr->max_tx_time = PKT_US(conn->lll.max_tx_octets, 0);
3730+
lr->max_rx_time =
3731+
sys_cpu_to_le16(PKT_US(conn->lll.max_rx_octets, 0));
3732+
lr->max_tx_time =
3733+
sys_cpu_to_le16(PKT_US(conn->lll.max_tx_octets, 0));
37253734
#else /* CONFIG_BT_CTLR_PHY */
3726-
lr->max_rx_time = conn->lll.max_rx_time;
3727-
lr->max_tx_time = conn->lll.max_tx_time;
3735+
lr->max_rx_time = sys_cpu_to_le16(conn->lll.max_rx_time);
3736+
lr->max_tx_time = sys_cpu_to_le16(conn->lll.max_tx_time);
37283737
#endif /* CONFIG_BT_CTLR_PHY */
37293738

37303739
return;
@@ -3854,15 +3863,19 @@ static void length_resp_send(struct ll_conn *conn, struct node_tx *tx,
38543863
pdu_tx->len = offsetof(struct pdu_data_llctrl, length_rsp) +
38553864
sizeof(struct pdu_data_llctrl_length_rsp);
38563865
pdu_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP;
3857-
pdu_tx->llctrl.length_rsp.max_rx_octets = eff_rx_octets;
3858-
pdu_tx->llctrl.length_rsp.max_tx_octets = eff_tx_octets;
3866+
pdu_tx->llctrl.length_rsp.max_rx_octets =
3867+
sys_cpu_to_le16(eff_rx_octets);
3868+
pdu_tx->llctrl.length_rsp.max_tx_octets =
3869+
sys_cpu_to_le16(eff_tx_octets);
38593870

38603871
#if !defined(CONFIG_BT_CTLR_PHY)
3861-
pdu_tx->llctrl.length_rsp.max_rx_time = PKT_US(eff_rx_octets, 0);
3862-
pdu_tx->llctrl.length_rsp.max_tx_time = PKT_US(eff_tx_octets, 0);
3872+
pdu_tx->llctrl.length_rsp.max_rx_time =
3873+
sys_cpu_to_le16(PKT_US(eff_rx_octets, 0));
3874+
pdu_tx->llctrl.length_rsp.max_tx_time =
3875+
sys_cpu_to_le16(PKT_US(eff_tx_octets, 0));
38633876
#else /* CONFIG_BT_CTLR_PHY */
3864-
pdu_tx->llctrl.length_rsp.max_rx_time = eff_rx_time;
3865-
pdu_tx->llctrl.length_rsp.max_tx_time = eff_tx_time;
3877+
pdu_tx->llctrl.length_rsp.max_rx_time = sys_cpu_to_le16(eff_rx_time);
3878+
pdu_tx->llctrl.length_rsp.max_tx_time = sys_cpu_to_le16(eff_tx_time);
38663879
#endif /* CONFIG_BT_CTLR_PHY */
38673880

38683881
ctrl_tx_enqueue(conn, tx);
@@ -3920,31 +3933,38 @@ static inline int length_req_rsp_recv(struct ll_conn *conn, memq_link_t *link,
39203933
(pdu_rx->llctrl.opcode ==
39213934
PDU_DATA_LLCTRL_TYPE_LENGTH_REQ)))))) {
39223935
struct pdu_data_llctrl_length_req *lr;
3936+
u16_t max_rx_octets;
3937+
u16_t max_tx_octets;
3938+
u16_t max_rx_time;
3939+
u16_t max_tx_time;
39233940

39243941
lr = &pdu_rx->llctrl.length_req;
39253942

39263943
/* use the minimal of our default_tx_octets and
39273944
* peer max_rx_octets
39283945
*/
3929-
if (lr->max_rx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) {
3930-
eff_tx_octets = MIN(lr->max_rx_octets,
3946+
max_rx_octets = sys_le16_to_cpu(lr->max_rx_octets);
3947+
if (max_rx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) {
3948+
eff_tx_octets = MIN(max_rx_octets,
39313949
conn->default_tx_octets);
39323950
}
39333951

39343952
/* use the minimal of our max supported and
39353953
* peer max_tx_octets
39363954
*/
3937-
if (lr->max_tx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) {
3938-
eff_rx_octets = MIN(lr->max_tx_octets,
3955+
max_tx_octets = sys_le16_to_cpu(lr->max_tx_octets);
3956+
if (max_tx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) {
3957+
eff_rx_octets = MIN(max_tx_octets,
39393958
LL_LENGTH_OCTETS_RX_MAX);
39403959
}
39413960

39423961
#if defined(CONFIG_BT_CTLR_PHY)
39433962
/* use the minimal of our default_tx_time and
39443963
* peer max_rx_time
39453964
*/
3946-
if (lr->max_rx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) {
3947-
eff_tx_time = MIN(lr->max_rx_time,
3965+
max_rx_time = sys_le16_to_cpu(lr->max_rx_time);
3966+
if (max_rx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) {
3967+
eff_tx_time = MIN(max_rx_time,
39483968
conn->default_tx_time);
39493969
#if defined(CONFIG_BT_CTLR_PHY_CODED)
39503970
eff_tx_time = MAX(eff_tx_time,
@@ -3956,16 +3976,17 @@ static inline int length_req_rsp_recv(struct ll_conn *conn, memq_link_t *link,
39563976
/* use the minimal of our max supported and
39573977
* peer max_tx_time
39583978
*/
3959-
if (lr->max_tx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) {
3979+
max_tx_time = sys_le16_to_cpu(lr->max_tx_time);
3980+
if (max_tx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) {
39603981
#if defined(CONFIG_BT_CTLR_PHY_CODED)
3961-
eff_rx_time = MIN(lr->max_tx_time,
3982+
eff_rx_time = MIN(max_tx_time,
39623983
PKT_US(LL_LENGTH_OCTETS_RX_MAX,
39633984
BIT(2)));
39643985
eff_rx_time = MAX(eff_rx_time,
39653986
PKT_US(PDU_DC_PAYLOAD_SIZE_MIN,
39663987
conn->lll.phy_rx));
39673988
#else /* !CONFIG_BT_CTLR_PHY_CODED */
3968-
eff_rx_time = MIN(lr->max_tx_time,
3989+
eff_rx_time = MIN(max_tx_time,
39693990
PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0));
39703991
#endif /* !CONFIG_BT_CTLR_PHY_CODED */
39713992
}
@@ -4036,15 +4057,17 @@ static inline int length_req_rsp_recv(struct ll_conn *conn, memq_link_t *link,
40364057
#endif /* CONFIG_BT_CTLR_PHY */
40374058

40384059
/* prepare event params */
4039-
lr->max_rx_octets = eff_rx_octets;
4040-
lr->max_tx_octets = eff_tx_octets;
4060+
lr->max_rx_octets = sys_cpu_to_le16(eff_rx_octets);
4061+
lr->max_tx_octets = sys_cpu_to_le16(eff_tx_octets);
40414062

40424063
#if !defined(CONFIG_BT_CTLR_PHY)
4043-
lr->max_rx_time = PKT_US(eff_rx_octets, 0);
4044-
lr->max_tx_time = PKT_US(eff_tx_octets, 0);
4064+
lr->max_rx_time =
4065+
sys_cpu_to_le16(PKT_US(eff_rx_octets, 0));
4066+
lr->max_tx_time =
4067+
sys_cpu_to_le16(PKT_US(eff_tx_octets, 0));
40454068
#else /* CONFIG_BT_CTLR_PHY */
4046-
lr->max_rx_time = eff_rx_time;
4047-
lr->max_tx_time = eff_tx_time;
4069+
lr->max_rx_time = sys_cpu_to_le16(eff_rx_time);
4070+
lr->max_tx_time = sys_cpu_to_le16(eff_tx_time);
40484071
#endif /* CONFIG_BT_CTLR_PHY */
40494072
}
40504073
} else {

0 commit comments

Comments
 (0)