Bluetooth: Controller: Fix conn param req ack/req reset

llcp.conn_param.ack was reset on tx of conn param rsp, however this
should only be done once the expected conn update ind is received
and sets the cu.ack flag to indicate cu procedure 'takes over'.

Signed-off-by: Erik Brockhoff <erbr@oticon.com>
Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Erik Brockhoff 2021-08-20 11:45:43 +02:00 committed by Anas Nashif
commit f41b3d7879
2 changed files with 9 additions and 4 deletions

View file

@ -3537,8 +3537,10 @@ static inline void event_conn_param_rsp(struct ll_conn *conn)
ctrl_tx_enqueue(conn, tx);
/* procedure request acked */
conn->llcp_conn_param.ack = conn->llcp_conn_param.req;
/* Wait for connection update to be initiated by
* peer central device
*/
conn->llcp_conn_param.state = LLCP_CPR_STATE_UPD_WAIT;
}
static inline void event_conn_param_app_req(struct ll_conn *conn)
@ -3608,6 +3610,7 @@ static inline void event_conn_param_prep(struct ll_conn *conn,
case LLCP_CPR_STATE_APP_WAIT:
case LLCP_CPR_STATE_RSP_WAIT:
case LLCP_CPR_STATE_UPD_WAIT:
case LLCP_CPR_STATE_UPD:
/* Do nothing */
break;
@ -4342,7 +4345,8 @@ static uint8_t conn_upd_recv(struct ll_conn *conn, memq_link_t *link,
#if defined(CONFIG_BT_CTLR_CONN_PARAM_REQ)
if ((conn->llcp_conn_param.req != conn->llcp_conn_param.ack) &&
(conn->llcp_conn_param.state == LLCP_CPR_STATE_RSP_WAIT)) {
((conn->llcp_conn_param.state == LLCP_CPR_STATE_RSP_WAIT) ||
(conn->llcp_conn_param.state == LLCP_CPR_STATE_UPD_WAIT))) {
conn->llcp_conn_param.ack = conn->llcp_conn_param.req;
}
#endif /* CONFIG_BT_CTLR_CONN_PARAM_REQ */

View file

@ -229,10 +229,11 @@ struct ll_conn {
LLCP_CPR_STATE_APP_REQ,
LLCP_CPR_STATE_APP_WAIT,
LLCP_CPR_STATE_RSP_WAIT,
LLCP_CPR_STATE_UPD_WAIT,
LLCP_CPR_STATE_UPD,
LLCP_CPR_STATE_OFFS_REQ,
LLCP_CPR_STATE_OFFS_RDY,
} state:3 __packed;
} state:4 __packed;
uint8_t cmd:1;
uint8_t disabled:1;
uint8_t status;