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:
Vinayak Kariappa Chettimada 2018-10-10 18:02:20 +02:00 committed by Carles Cufí
commit a11868fea9
2 changed files with 30 additions and 20 deletions

View file

@ -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;

View file

@ -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;