Bluetooth: controller: Fix conn param req procedure response
Fix Connection Parameter Request Procedure implementation to respond with sent interval_min and interval_max so that certain peer devices dont reject the response as Invalid LL Parameters. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
08d5c5ef1d
commit
a11868fea9
2 changed files with 30 additions and 20 deletions
|
@ -1938,7 +1938,8 @@ isr_rx_conn_pkt_ctrl_rej_conn_upd(struct radio_pdu_node_rx *node_rx,
|
|||
|
||||
conn->llcp.conn_upd.win_size = 1;
|
||||
conn->llcp.conn_upd.win_offset_us = 0;
|
||||
conn->llcp.conn_upd.interval = conn->llcp_conn_param.interval;
|
||||
conn->llcp.conn_upd.interval =
|
||||
conn->llcp_conn_param.interval_max;
|
||||
conn->llcp.conn_upd.latency = conn->llcp_conn_param.latency;
|
||||
conn->llcp.conn_upd.timeout = conn->llcp_conn_param.timeout;
|
||||
/* conn->llcp.conn_upd.instant = 0; */
|
||||
|
@ -2758,7 +2759,10 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
|
|||
|
||||
/* save parameters to be used to select offset
|
||||
*/
|
||||
conn->llcp_conn_param.interval = cpr->interval_min;
|
||||
conn->llcp_conn_param.interval_min =
|
||||
cpr->interval_min;
|
||||
conn->llcp_conn_param.interval_max =
|
||||
cpr->interval_max;
|
||||
conn->llcp_conn_param.latency = cpr->latency;
|
||||
conn->llcp_conn_param.timeout = cpr->timeout;
|
||||
conn->llcp_conn_param.preferred_periodicity =
|
||||
|
@ -2775,7 +2779,7 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
|
|||
/* enqueue the conn param req, if parameters
|
||||
* changed, else respond.
|
||||
*/
|
||||
if ((conn->llcp_conn_param.interval !=
|
||||
if ((conn->llcp_conn_param.interval_max !=
|
||||
conn->conn_interval) ||
|
||||
(conn->llcp_conn_param.latency !=
|
||||
conn->latency) ||
|
||||
|
@ -2838,7 +2842,8 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
|
|||
/* resp to be generated by app, for now save
|
||||
* parameters
|
||||
*/
|
||||
conn->llcp_conn_param.interval = cpr->interval_min;
|
||||
conn->llcp_conn_param.interval_min = cpr->interval_min;
|
||||
conn->llcp_conn_param.interval_max = cpr->interval_max;
|
||||
conn->llcp_conn_param.latency = cpr->latency;
|
||||
conn->llcp_conn_param.timeout = cpr->timeout;
|
||||
conn->llcp_conn_param.preferred_periodicity =
|
||||
|
@ -2855,7 +2860,7 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
|
|||
/* enqueue the conn param req, if parameters changed,
|
||||
* else respond
|
||||
*/
|
||||
if ((conn->llcp_conn_param.interval !=
|
||||
if ((conn->llcp_conn_param.interval_max !=
|
||||
conn->conn_interval) ||
|
||||
(conn->llcp_conn_param.latency != conn->latency) ||
|
||||
(RADIO_CONN_EVENTS(conn->llcp_conn_param.timeout *
|
||||
|
@ -2921,7 +2926,8 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
|
|||
|
||||
/* save parameters to be used to select offset
|
||||
*/
|
||||
conn->llcp_conn_param.interval = cpr->interval_min;
|
||||
conn->llcp_conn_param.interval_min = cpr->interval_min;
|
||||
conn->llcp_conn_param.interval_max = cpr->interval_max;
|
||||
conn->llcp_conn_param.latency = cpr->latency;
|
||||
conn->llcp_conn_param.timeout = cpr->timeout;
|
||||
conn->llcp_conn_param.preferred_periodicity =
|
||||
|
@ -2997,7 +3003,7 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *node_rx, u8_t *rx_enqueue)
|
|||
conn->llcp.conn_upd.win_size = 1;
|
||||
conn->llcp.conn_upd.win_offset_us = 0;
|
||||
conn->llcp.conn_upd.interval =
|
||||
conn->llcp_conn_param.interval;
|
||||
conn->llcp_conn_param.interval_max;
|
||||
conn->llcp.conn_upd.latency =
|
||||
conn->llcp_conn_param.latency;
|
||||
conn->llcp.conn_upd.timeout =
|
||||
|
@ -5341,7 +5347,8 @@ static void mayfly_sched_free_win_offset_calc(void *params)
|
|||
}
|
||||
|
||||
sched_free_win_offset_calc(conn, 0, ticks_to_offset_next,
|
||||
conn->llcp_conn_param.interval, &offset_max,
|
||||
conn->llcp_conn_param.interval_max,
|
||||
&offset_max,
|
||||
(u8_t *)conn->llcp_conn_param.pdu_win_offset0);
|
||||
}
|
||||
|
||||
|
@ -5361,7 +5368,7 @@ static void mayfly_sched_win_offset_select(void *params)
|
|||
1250);
|
||||
|
||||
sched_free_win_offset_calc(conn, 1, &ticks_to_offset,
|
||||
conn->llcp_conn_param.interval,
|
||||
conn->llcp_conn_param.interval_max,
|
||||
&offset_m_max, (u8_t *)&win_offset_m[0]);
|
||||
|
||||
while (offset_index_s < OFFSET_S_MAX) {
|
||||
|
@ -7276,8 +7283,8 @@ static inline void event_conn_param_req(struct connection *conn,
|
|||
sizeof(struct pdu_data_llctrl_conn_param_req);
|
||||
pdu_ctrl_tx->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ;
|
||||
p = (void *)&pdu_ctrl_tx->llctrl.conn_param_req;
|
||||
p->interval_min = conn->llcp_conn_param.interval;
|
||||
p->interval_max = conn->llcp_conn_param.interval;
|
||||
p->interval_min = conn->llcp_conn_param.interval_min;
|
||||
p->interval_max = conn->llcp_conn_param.interval_max;
|
||||
p->latency = conn->llcp_conn_param.latency;
|
||||
p->timeout = conn->llcp_conn_param.timeout;
|
||||
p->preferred_periodicity = 0;
|
||||
|
@ -7385,13 +7392,13 @@ static inline void event_conn_param_rsp(struct connection *conn)
|
|||
conn->llcp.conn_upd.win_offset_us = 0;
|
||||
if (conn->llcp_conn_param.preferred_periodicity) {
|
||||
conn->llcp.conn_upd.interval =
|
||||
((conn->llcp_conn_param.interval /
|
||||
((conn->llcp_conn_param.interval_max /
|
||||
conn->llcp_conn_param.preferred_periodicity) +
|
||||
1) *
|
||||
conn->llcp_conn_param.preferred_periodicity;
|
||||
} else {
|
||||
conn->llcp.conn_upd.interval =
|
||||
conn->llcp_conn_param.interval;
|
||||
conn->llcp_conn_param.interval_max;
|
||||
}
|
||||
conn->llcp.conn_upd.latency = conn->llcp_conn_param.latency;
|
||||
conn->llcp.conn_upd.timeout = conn->llcp_conn_param.timeout;
|
||||
|
@ -7417,8 +7424,8 @@ static inline void event_conn_param_rsp(struct connection *conn)
|
|||
sizeof(struct pdu_data_llctrl_conn_param_rsp);
|
||||
pdu->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_CONN_PARAM_RSP;
|
||||
rsp = (void *)&pdu->llctrl.conn_param_rsp;
|
||||
rsp->interval_min = conn->llcp_conn_param.interval;
|
||||
rsp->interval_max = conn->llcp_conn_param.interval;
|
||||
rsp->interval_min = conn->llcp_conn_param.interval_min;
|
||||
rsp->interval_max = conn->llcp_conn_param.interval_max;
|
||||
rsp->latency = conn->llcp_conn_param.latency;
|
||||
rsp->timeout = conn->llcp_conn_param.timeout;
|
||||
rsp->preferred_periodicity =
|
||||
|
@ -7472,8 +7479,8 @@ static inline void event_conn_param_app_req(struct connection *conn)
|
|||
sizeof(struct pdu_data_llctrl_conn_param_req);
|
||||
pdu->llctrl.opcode = PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ;
|
||||
p = (void *) &pdu->llctrl.conn_param_req;
|
||||
p->interval_min = conn->llcp_conn_param.interval;
|
||||
p->interval_max = conn->llcp_conn_param.interval;
|
||||
p->interval_min = conn->llcp_conn_param.interval_min;
|
||||
p->interval_max = conn->llcp_conn_param.interval_max;
|
||||
p->latency = conn->llcp_conn_param.latency;
|
||||
p->timeout = conn->llcp_conn_param.timeout;
|
||||
|
||||
|
@ -9232,7 +9239,8 @@ static u32_t conn_update_req(struct connection *conn)
|
|||
BIT(BT_LE_FEAT_BIT_CONN_PARAM_REQ)))) {
|
||||
/** Perform slave intiated conn param req */
|
||||
conn->llcp_conn_param.status = 0;
|
||||
conn->llcp_conn_param.interval = conn->conn_interval;
|
||||
conn->llcp_conn_param.interval_min = conn->conn_interval;
|
||||
conn->llcp_conn_param.interval_max = conn->conn_interval;
|
||||
conn->llcp_conn_param.latency = conn->latency;
|
||||
conn->llcp_conn_param.timeout = conn->conn_interval *
|
||||
conn->supervision_reload *
|
||||
|
@ -10742,7 +10750,8 @@ u32_t ll_conn_update(u16_t handle, u8_t cmd, u8_t status, u16_t interval,
|
|||
}
|
||||
|
||||
conn->llcp_conn_param.status = 0;
|
||||
conn->llcp_conn_param.interval = interval;
|
||||
conn->llcp_conn_param.interval_min = interval;
|
||||
conn->llcp_conn_param.interval_max = interval;
|
||||
conn->llcp_conn_param.latency = latency;
|
||||
conn->llcp_conn_param.timeout = timeout;
|
||||
conn->llcp_conn_param.state = cmd;
|
||||
|
|
|
@ -210,7 +210,8 @@ struct connection {
|
|||
u8_t cmd:1;
|
||||
u8_t disabled:1;
|
||||
u8_t status;
|
||||
u16_t interval;
|
||||
u16_t interval_min;
|
||||
u16_t interval_max;
|
||||
u16_t latency;
|
||||
u16_t timeout;
|
||||
u8_t preferred_periodicity;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue