Bluetooth: controller: Fix endianness for length update.

Fix endianness when accessing length update parameters in PDU.

Signed-off-by: Wolfgang Puffitsch <wopu@demant.com>
This commit is contained in:
Wolfgang Puffitsch 2019-08-26 19:44:28 +02:00 committed by Alberto Escolar
commit e8e668ae9c

View file

@ -2786,14 +2786,19 @@ static inline void event_len_prep(struct ll_conn *conn)
pdu_ctrl_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_REQ; pdu_ctrl_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_REQ;
lr = &pdu_ctrl_tx->llctrl.length_req; lr = &pdu_ctrl_tx->llctrl.length_req;
lr->max_rx_octets = LL_LENGTH_OCTETS_RX_MAX; lr->max_rx_octets = sys_cpu_to_le16(LL_LENGTH_OCTETS_RX_MAX);
lr->max_tx_octets = conn->default_tx_octets; lr->max_tx_octets = sys_cpu_to_le16(conn->default_tx_octets);
#if !defined(CONFIG_BT_CTLR_PHY) #if !defined(CONFIG_BT_CTLR_PHY)
lr->max_rx_time = PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0); lr->max_rx_time =
lr->max_tx_time = PKT_US(conn->default_tx_octets, 0); sys_cpu_to_le16(PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0));
lr->max_tx_time =
sys_cpu_to_le16(PKT_US(conn->default_tx_octets, 0));
#else /* CONFIG_BT_CTLR_PHY */ #else /* CONFIG_BT_CTLR_PHY */
lr->max_rx_time = PKT_US(LL_LENGTH_OCTETS_RX_MAX, BIT(2)); lr->max_rx_time =
lr->max_tx_time = conn->default_tx_time; sys_cpu_to_le16(PKT_US(LL_LENGTH_OCTETS_RX_MAX,
BIT(2)));
lr->max_tx_time =
sys_cpu_to_le16(conn->default_tx_time);
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
ctrl_tx_enqueue(conn, tx); ctrl_tx_enqueue(conn, tx);
@ -2844,14 +2849,16 @@ static inline void event_len_prep(struct ll_conn *conn)
pdu_ctrl_rx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP; pdu_ctrl_rx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP;
lr = &pdu_ctrl_rx->llctrl.length_rsp; lr = &pdu_ctrl_rx->llctrl.length_rsp;
lr->max_rx_octets = lll->max_rx_octets; lr->max_rx_octets = sys_cpu_to_le16(lll->max_rx_octets);
lr->max_tx_octets = lll->max_tx_octets; lr->max_tx_octets = sys_cpu_to_le16(lll->max_tx_octets);
#if !defined(CONFIG_BT_CTLR_PHY) #if !defined(CONFIG_BT_CTLR_PHY)
lr->max_rx_time = PKT_US(lll->max_rx_octets, 0); lr->max_rx_time =
lr->max_tx_time = PKT_US(lll->max_tx_octets, 0); sys_cpu_to_le16(PKT_US(lll->max_rx_octets, 0));
lr->max_tx_time =
sys_cpu_to_le16(PKT_US(lll->max_tx_octets, 0));
#else /* CONFIG_BT_CTLR_PHY */ #else /* CONFIG_BT_CTLR_PHY */
lr->max_rx_time = lll->max_rx_time; lr->max_rx_time = sys_cpu_to_le16(lll->max_rx_time);
lr->max_tx_time = lll->max_tx_time; lr->max_tx_time = sys_cpu_to_le16(lll->max_tx_time);
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
/* enqueue rx node towards Thread */ /* enqueue rx node towards Thread */
@ -3717,14 +3724,16 @@ static inline void reject_ind_dle_recv(struct ll_conn *conn,
pdu_rx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP; pdu_rx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP;
lr = (void *)&pdu_rx->llctrl.length_req; lr = (void *)&pdu_rx->llctrl.length_req;
lr->max_rx_octets = conn->lll.max_rx_octets; lr->max_rx_octets = sys_cpu_to_le16(conn->lll.max_rx_octets);
lr->max_tx_octets = conn->lll.max_tx_octets; lr->max_tx_octets = sys_cpu_to_le16(conn->lll.max_tx_octets);
#if !defined(CONFIG_BT_CTLR_PHY) #if !defined(CONFIG_BT_CTLR_PHY)
lr->max_rx_time = PKT_US(conn->lll.max_rx_octets, 0); lr->max_rx_time =
lr->max_tx_time = PKT_US(conn->lll.max_tx_octets, 0); sys_cpu_to_le16(PKT_US(conn->lll.max_rx_octets, 0));
lr->max_tx_time =
sys_cpu_to_le16(PKT_US(conn->lll.max_tx_octets, 0));
#else /* CONFIG_BT_CTLR_PHY */ #else /* CONFIG_BT_CTLR_PHY */
lr->max_rx_time = conn->lll.max_rx_time; lr->max_rx_time = sys_cpu_to_le16(conn->lll.max_rx_time);
lr->max_tx_time = conn->lll.max_tx_time; lr->max_tx_time = sys_cpu_to_le16(conn->lll.max_tx_time);
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
return; return;
@ -3854,15 +3863,19 @@ static void length_resp_send(struct ll_conn *conn, struct node_tx *tx,
pdu_tx->len = offsetof(struct pdu_data_llctrl, length_rsp) + pdu_tx->len = offsetof(struct pdu_data_llctrl, length_rsp) +
sizeof(struct pdu_data_llctrl_length_rsp); sizeof(struct pdu_data_llctrl_length_rsp);
pdu_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP; pdu_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_LENGTH_RSP;
pdu_tx->llctrl.length_rsp.max_rx_octets = eff_rx_octets; pdu_tx->llctrl.length_rsp.max_rx_octets =
pdu_tx->llctrl.length_rsp.max_tx_octets = eff_tx_octets; sys_cpu_to_le16(eff_rx_octets);
pdu_tx->llctrl.length_rsp.max_tx_octets =
sys_cpu_to_le16(eff_tx_octets);
#if !defined(CONFIG_BT_CTLR_PHY) #if !defined(CONFIG_BT_CTLR_PHY)
pdu_tx->llctrl.length_rsp.max_rx_time = PKT_US(eff_rx_octets, 0); pdu_tx->llctrl.length_rsp.max_rx_time =
pdu_tx->llctrl.length_rsp.max_tx_time = PKT_US(eff_tx_octets, 0); sys_cpu_to_le16(PKT_US(eff_rx_octets, 0));
pdu_tx->llctrl.length_rsp.max_tx_time =
sys_cpu_to_le16(PKT_US(eff_tx_octets, 0));
#else /* CONFIG_BT_CTLR_PHY */ #else /* CONFIG_BT_CTLR_PHY */
pdu_tx->llctrl.length_rsp.max_rx_time = eff_rx_time; pdu_tx->llctrl.length_rsp.max_rx_time = sys_cpu_to_le16(eff_rx_time);
pdu_tx->llctrl.length_rsp.max_tx_time = eff_tx_time; pdu_tx->llctrl.length_rsp.max_tx_time = sys_cpu_to_le16(eff_tx_time);
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
ctrl_tx_enqueue(conn, tx); ctrl_tx_enqueue(conn, tx);
@ -3920,22 +3933,28 @@ static inline int length_req_rsp_recv(struct ll_conn *conn, memq_link_t *link,
(pdu_rx->llctrl.opcode == (pdu_rx->llctrl.opcode ==
PDU_DATA_LLCTRL_TYPE_LENGTH_REQ)))))) { PDU_DATA_LLCTRL_TYPE_LENGTH_REQ)))))) {
struct pdu_data_llctrl_length_req *lr; struct pdu_data_llctrl_length_req *lr;
u16_t max_rx_octets;
u16_t max_tx_octets;
u16_t max_rx_time;
u16_t max_tx_time;
lr = &pdu_rx->llctrl.length_req; lr = &pdu_rx->llctrl.length_req;
/* use the minimal of our default_tx_octets and /* use the minimal of our default_tx_octets and
* peer max_rx_octets * peer max_rx_octets
*/ */
if (lr->max_rx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) { max_rx_octets = sys_le16_to_cpu(lr->max_rx_octets);
eff_tx_octets = MIN(lr->max_rx_octets, if (max_rx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) {
eff_tx_octets = MIN(max_rx_octets,
conn->default_tx_octets); conn->default_tx_octets);
} }
/* use the minimal of our max supported and /* use the minimal of our max supported and
* peer max_tx_octets * peer max_tx_octets
*/ */
if (lr->max_tx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) { max_tx_octets = sys_le16_to_cpu(lr->max_tx_octets);
eff_rx_octets = MIN(lr->max_tx_octets, if (max_tx_octets >= PDU_DC_PAYLOAD_SIZE_MIN) {
eff_rx_octets = MIN(max_tx_octets,
LL_LENGTH_OCTETS_RX_MAX); LL_LENGTH_OCTETS_RX_MAX);
} }
@ -3943,8 +3962,9 @@ static inline int length_req_rsp_recv(struct ll_conn *conn, memq_link_t *link,
/* use the minimal of our default_tx_time and /* use the minimal of our default_tx_time and
* peer max_rx_time * peer max_rx_time
*/ */
if (lr->max_rx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) { max_rx_time = sys_le16_to_cpu(lr->max_rx_time);
eff_tx_time = MIN(lr->max_rx_time, if (max_rx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) {
eff_tx_time = MIN(max_rx_time,
conn->default_tx_time); conn->default_tx_time);
#if defined(CONFIG_BT_CTLR_PHY_CODED) #if defined(CONFIG_BT_CTLR_PHY_CODED)
eff_tx_time = MAX(eff_tx_time, 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,
/* use the minimal of our max supported and /* use the minimal of our max supported and
* peer max_tx_time * peer max_tx_time
*/ */
if (lr->max_tx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) { max_tx_time = sys_le16_to_cpu(lr->max_tx_time);
if (max_tx_time >= PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, 0)) {
#if defined(CONFIG_BT_CTLR_PHY_CODED) #if defined(CONFIG_BT_CTLR_PHY_CODED)
eff_rx_time = MIN(lr->max_tx_time, eff_rx_time = MIN(max_tx_time,
PKT_US(LL_LENGTH_OCTETS_RX_MAX, PKT_US(LL_LENGTH_OCTETS_RX_MAX,
BIT(2))); BIT(2)));
eff_rx_time = MAX(eff_rx_time, eff_rx_time = MAX(eff_rx_time,
PKT_US(PDU_DC_PAYLOAD_SIZE_MIN, PKT_US(PDU_DC_PAYLOAD_SIZE_MIN,
conn->lll.phy_rx)); conn->lll.phy_rx));
#else /* !CONFIG_BT_CTLR_PHY_CODED */ #else /* !CONFIG_BT_CTLR_PHY_CODED */
eff_rx_time = MIN(lr->max_tx_time, eff_rx_time = MIN(max_tx_time,
PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0)); PKT_US(LL_LENGTH_OCTETS_RX_MAX, 0));
#endif /* !CONFIG_BT_CTLR_PHY_CODED */ #endif /* !CONFIG_BT_CTLR_PHY_CODED */
} }
@ -4036,15 +4057,17 @@ static inline int length_req_rsp_recv(struct ll_conn *conn, memq_link_t *link,
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
/* prepare event params */ /* prepare event params */
lr->max_rx_octets = eff_rx_octets; lr->max_rx_octets = sys_cpu_to_le16(eff_rx_octets);
lr->max_tx_octets = eff_tx_octets; lr->max_tx_octets = sys_cpu_to_le16(eff_tx_octets);
#if !defined(CONFIG_BT_CTLR_PHY) #if !defined(CONFIG_BT_CTLR_PHY)
lr->max_rx_time = PKT_US(eff_rx_octets, 0); lr->max_rx_time =
lr->max_tx_time = PKT_US(eff_tx_octets, 0); sys_cpu_to_le16(PKT_US(eff_rx_octets, 0));
lr->max_tx_time =
sys_cpu_to_le16(PKT_US(eff_tx_octets, 0));
#else /* CONFIG_BT_CTLR_PHY */ #else /* CONFIG_BT_CTLR_PHY */
lr->max_rx_time = eff_rx_time; lr->max_rx_time = sys_cpu_to_le16(eff_rx_time);
lr->max_tx_time = eff_tx_time; lr->max_tx_time = sys_cpu_to_le16(eff_tx_time);
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
} }
} else { } else {