Bluetooth: controller: Rework procedure pause logic

llcp_lr_pause()/llcp_rr_pause() only pauses currently pending procedures
in their respective request machines, any future initiations are not
paused, thus they are allowed to run, when the opposite was expected.

Change the procedure pause logic into a global pause on the request
machines them self, this is essence what the per-procedure pause
flag was trying to achieve.

Add new query function llcp_?r_ispaused() to not expose the logic behind
the pause functionality.

Signed-off-by: Thomas Ebert Hansen <thoh@oticon.com>
This commit is contained in:
Thomas Ebert Hansen 2022-03-29 15:35:27 +02:00 committed by Carles Cufí
commit fefa83d5ed
10 changed files with 70 additions and 56 deletions

View file

@ -358,12 +358,14 @@ struct llcp_struct {
struct { struct {
sys_slist_t pend_proc_list; sys_slist_t pend_proc_list;
uint8_t state; uint8_t state;
uint8_t pause;
} local; } local;
/* Remote Request */ /* Remote Request */
struct { struct {
sys_slist_t pend_proc_list; sys_slist_t pend_proc_list;
uint8_t state; uint8_t state;
uint8_t pause;
uint8_t collision; uint8_t collision;
uint8_t incompat; uint8_t incompat;
uint8_t reject_opcode; uint8_t reject_opcode;

View file

@ -274,7 +274,6 @@ static struct proc_ctx *create_procedure(enum llcp_proc proc, struct llcp_mem_po
ctx->proc = proc; ctx->proc = proc;
ctx->collision = 0U; ctx->collision = 0U;
ctx->pause = 0U;
ctx->done = 0U; ctx->done = 0U;
/* Clear procedure data */ /* Clear procedure data */
@ -453,10 +452,12 @@ void ull_llcp_init(struct ll_conn *conn)
/* Reset local request fsm */ /* Reset local request fsm */
llcp_lr_init(conn); llcp_lr_init(conn);
sys_slist_init(&conn->llcp.local.pend_proc_list); sys_slist_init(&conn->llcp.local.pend_proc_list);
conn->llcp.local.pause = 0U;
/* Reset remote request fsm */ /* Reset remote request fsm */
llcp_rr_init(conn); llcp_rr_init(conn);
sys_slist_init(&conn->llcp.remote.pend_proc_list); sys_slist_init(&conn->llcp.remote.pend_proc_list);
conn->llcp.remote.pause = 0U;
conn->llcp.remote.incompat = INCOMPAT_NO_COLLISION; conn->llcp.remote.incompat = INCOMPAT_NO_COLLISION;
conn->llcp.remote.collision = 0U; conn->llcp.remote.collision = 0U;
#if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP)
@ -1248,7 +1249,6 @@ void test_int_create_proc(void)
zassert_equal(ctx->proc, PROC_VERSION_EXCHANGE, NULL); zassert_equal(ctx->proc, PROC_VERSION_EXCHANGE, NULL);
zassert_equal(ctx->collision, 0, NULL); zassert_equal(ctx->collision, 0, NULL);
zassert_equal(ctx->pause, 0, NULL);
for (int i = 0U; i < CONFIG_BT_CTLR_LLCP_LOCAL_PROC_CTX_BUF_NUM; i++) { for (int i = 0U; i < CONFIG_BT_CTLR_LLCP_LOCAL_PROC_CTX_BUF_NUM; i++) {
zassert_not_null(ctx, NULL); zassert_not_null(ctx, NULL);
@ -1258,4 +1258,20 @@ void test_int_create_proc(void)
zassert_is_null(ctx, NULL); zassert_is_null(ctx, NULL);
} }
void test_int_llcp_init(void)
{
struct ll_conn conn;
ull_cp_init();
ull_llcp_init(&conn);
memset(&conn.llcp, 0xAA, sizeof(conn.llcp));
ull_llcp_init(&conn);
zassert_equal(conn.llcp.local.pause, 0, NULL);
zassert_equal(conn.llcp.remote.pause, 0, NULL);
}
#endif #endif

View file

@ -104,7 +104,8 @@ static void lp_chmu_complete(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
static void lp_chmu_send_channel_map_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, static void lp_chmu_send_channel_map_update_ind(struct ll_conn *conn, struct proc_ctx *ctx,
uint8_t evt, void *param) uint8_t evt, void *param)
{ {
if (ctx->pause || llcp_rr_get_collision(conn) || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || llcp_rr_get_collision(conn) ||
!llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_CHMU_STATE_WAIT_TX_CHAN_MAP_IND; ctx->state = LP_CHMU_STATE_WAIT_TX_CHAN_MAP_IND;
} else { } else {
llcp_rr_set_incompat(conn, INCOMPAT_RESOLVABLE); llcp_rr_set_incompat(conn, INCOMPAT_RESOLVABLE);

View file

@ -414,7 +414,7 @@ static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
switch (ctx->proc) { switch (ctx->proc) {
#if defined(CONFIG_BT_CTLR_LE_PING) #if defined(CONFIG_BT_CTLR_LE_PING)
case PROC_LE_PING: case PROC_LE_PING:
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
lp_comm_tx(conn, ctx); lp_comm_tx(conn, ctx);
@ -423,7 +423,7 @@ static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
break; break;
#endif /* CONFIG_BT_CTLR_LE_PING */ #endif /* CONFIG_BT_CTLR_LE_PING */
case PROC_FEATURE_EXCHANGE: case PROC_FEATURE_EXCHANGE:
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
lp_comm_tx(conn, ctx); lp_comm_tx(conn, ctx);
@ -433,7 +433,7 @@ static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
break; break;
#if defined(CONFIG_BT_CTLR_MIN_USED_CHAN) && defined(CONFIG_BT_PERIPHERAL) #if defined(CONFIG_BT_CTLR_MIN_USED_CHAN) && defined(CONFIG_BT_PERIPHERAL)
case PROC_MIN_USED_CHANS: case PROC_MIN_USED_CHANS:
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
lp_comm_tx(conn, ctx); lp_comm_tx(conn, ctx);
@ -446,7 +446,7 @@ static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
* one LL_VERSION_IND PDU during a connection. * one LL_VERSION_IND PDU during a connection.
*/ */
if (!conn->llcp.vex.sent) { if (!conn->llcp.vex.sent) {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
lp_comm_tx(conn, ctx); lp_comm_tx(conn, ctx);
@ -469,7 +469,7 @@ static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
#if defined(CONFIG_BT_CTLR_DATA_LENGTH) #if defined(CONFIG_BT_CTLR_DATA_LENGTH)
case PROC_DATA_LENGTH_UPDATE: case PROC_DATA_LENGTH_UPDATE:
if (!ull_cp_remote_dle_pending(conn)) { if (!ull_cp_remote_dle_pending(conn)) {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
/* Pause data tx, to ensure we can later (on RSP rx-ack) /* Pause data tx, to ensure we can later (on RSP rx-ack)
@ -497,7 +497,7 @@ static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
#else #else
if (1) { if (1) {
#endif /* CONFIG_BT_CTLR_PHY */ #endif /* CONFIG_BT_CTLR_PHY */
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx) || if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx) ||
(llcp_rr_get_paused_cmd(conn) == PROC_CTE_REQ)) { (llcp_rr_get_paused_cmd(conn) == PROC_CTE_REQ)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
@ -529,7 +529,7 @@ static void lp_comm_st_idle(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
{ {
switch (evt) { switch (evt) {
case LP_COMMON_EVT_RUN: case LP_COMMON_EVT_RUN:
if (ctx->pause) { if (llcp_lr_ispaused(conn)) {
ctx->state = LP_COMMON_STATE_WAIT_TX; ctx->state = LP_COMMON_STATE_WAIT_TX;
} else { } else {
lp_comm_send_req(conn, ctx, evt, param); lp_comm_send_req(conn, ctx, evt, param);
@ -910,7 +910,7 @@ static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
#if defined(CONFIG_BT_CTLR_LE_PING) #if defined(CONFIG_BT_CTLR_LE_PING)
case PROC_LE_PING: case PROC_LE_PING:
/* Always respond on remote ping */ /* Always respond on remote ping */
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_COMMON_STATE_WAIT_TX; ctx->state = RP_COMMON_STATE_WAIT_TX;
} else { } else {
rp_comm_tx(conn, ctx); rp_comm_tx(conn, ctx);
@ -921,7 +921,7 @@ static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
#endif /* CONFIG_BT_CTLR_LE_PING */ #endif /* CONFIG_BT_CTLR_LE_PING */
case PROC_FEATURE_EXCHANGE: case PROC_FEATURE_EXCHANGE:
/* Always respond on remote feature exchange */ /* Always respond on remote feature exchange */
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_COMMON_STATE_WAIT_TX; ctx->state = RP_COMMON_STATE_WAIT_TX;
} else { } else {
rp_comm_tx(conn, ctx); rp_comm_tx(conn, ctx);
@ -938,7 +938,7 @@ static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
* LL_VERSION_IND PDU to the peer device. * LL_VERSION_IND PDU to the peer device.
*/ */
if (!conn->llcp.vex.sent) { if (!conn->llcp.vex.sent) {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_COMMON_STATE_WAIT_TX; ctx->state = RP_COMMON_STATE_WAIT_TX;
} else { } else {
rp_comm_tx(conn, ctx); rp_comm_tx(conn, ctx);
@ -987,7 +987,7 @@ static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
break; break;
#if defined(CONFIG_BT_CTLR_DATA_LENGTH) #if defined(CONFIG_BT_CTLR_DATA_LENGTH)
case PROC_DATA_LENGTH_UPDATE: case PROC_DATA_LENGTH_UPDATE:
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_COMMON_STATE_WAIT_TX; ctx->state = RP_COMMON_STATE_WAIT_TX;
} else { } else {
/* On RSP tx close the window for possible local req piggy-back */ /* On RSP tx close the window for possible local req piggy-back */
@ -1000,7 +1000,7 @@ static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t
#endif /* CONFIG_BT_CTLR_DATA_LENGTH */ #endif /* CONFIG_BT_CTLR_DATA_LENGTH */
#if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP)
case PROC_CTE_REQ: case PROC_CTE_REQ:
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx) || if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx) ||
(llcp_rr_get_paused_cmd(conn) == PROC_CTE_REQ)) { (llcp_rr_get_paused_cmd(conn) == PROC_CTE_REQ)) {
ctx->state = RP_COMMON_STATE_WAIT_TX; ctx->state = RP_COMMON_STATE_WAIT_TX;
} else { } else {

View file

@ -217,7 +217,8 @@ static void lp_cu_complete(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t e
static void lp_cu_send_conn_param_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void lp_cu_send_conn_param_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || llcp_rr_get_collision(conn) || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || llcp_rr_get_collision(conn) ||
!llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_CU_STATE_WAIT_TX_CONN_PARAM_REQ; ctx->state = LP_CU_STATE_WAIT_TX_CONN_PARAM_REQ;
} else { } else {
uint16_t event_counter = ull_conn_event_counter(conn); uint16_t event_counter = ull_conn_event_counter(conn);
@ -261,7 +262,7 @@ static void lp_cu_send_conn_param_req(struct ll_conn *conn, struct proc_ctx *ctx
static void lp_cu_send_conn_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void lp_cu_send_conn_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_CU_STATE_WAIT_TX_CONN_UPDATE_IND; ctx->state = LP_CU_STATE_WAIT_TX_CONN_UPDATE_IND;
} else { } else {
ctx->data.cu.win_size = 1U; ctx->data.cu.win_size = 1U;
@ -623,7 +624,7 @@ static void rp_cu_complete(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t e
static void rp_cu_send_conn_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void rp_cu_send_conn_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_CU_STATE_WAIT_TX_CONN_UPDATE_IND; ctx->state = RP_CU_STATE_WAIT_TX_CONN_UPDATE_IND;
} else { } else {
ctx->data.cu.win_size = 1U; ctx->data.cu.win_size = 1U;
@ -640,7 +641,7 @@ static void rp_cu_send_conn_update_ind(struct ll_conn *conn, struct proc_ctx *ct
static void rp_cu_send_reject_ext_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void rp_cu_send_reject_ext_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_CU_STATE_WAIT_TX_REJECT_EXT_IND; ctx->state = RP_CU_STATE_WAIT_TX_REJECT_EXT_IND;
} else { } else {
rp_cu_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_REJECT_EXT_IND); rp_cu_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_REJECT_EXT_IND);
@ -652,7 +653,7 @@ static void rp_cu_send_reject_ext_ind(struct ll_conn *conn, struct proc_ctx *ctx
static void rp_cu_send_conn_param_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void rp_cu_send_conn_param_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_CU_STATE_WAIT_TX_CONN_PARAM_RSP; ctx->state = RP_CU_STATE_WAIT_TX_CONN_PARAM_RSP;
} else { } else {
rp_cu_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_CONN_PARAM_RSP); rp_cu_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_CONN_PARAM_RSP);
@ -676,7 +677,7 @@ static void rp_cu_send_conn_param_req_ntf(struct ll_conn *conn, struct proc_ctx
static void rp_cu_send_unknown_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void rp_cu_send_unknown_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = RP_CU_STATE_WAIT_TX_UNKNOWN_RSP; ctx->state = RP_CU_STATE_WAIT_TX_UNKNOWN_RSP;
} else { } else {
rp_cu_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_UNKNOWN_RSP); rp_cu_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_UNKNOWN_RSP);

View file

@ -140,9 +140,6 @@ struct proc_ctx {
/* Instant collision */ /* Instant collision */
int collision; int collision;
/* Procedure pause */
int pause;
#if defined(LLCP_TX_CTRL_BUF_QUEUE_ENABLE) #if defined(LLCP_TX_CTRL_BUF_QUEUE_ENABLE)
/* Wait list next pointer */ /* Wait list next pointer */
sys_snode_t wait_node; sys_snode_t wait_node;
@ -441,6 +438,7 @@ void llcp_pdu_decode_terminate_ind(struct proc_ctx *ctx, struct pdu_data *pdu);
* LLCP Local Request * LLCP Local Request
*/ */
struct proc_ctx *llcp_lr_peek(struct ll_conn *conn); struct proc_ctx *llcp_lr_peek(struct ll_conn *conn);
bool llcp_lr_ispaused(struct ll_conn *conn);
void llcp_lr_pause(struct ll_conn *conn); void llcp_lr_pause(struct ll_conn *conn);
void llcp_lr_resume(struct ll_conn *conn); void llcp_lr_resume(struct ll_conn *conn);
void llcp_lr_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, struct node_tx *tx); void llcp_lr_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, struct node_tx *tx);
@ -461,6 +459,7 @@ bool llcp_rr_get_collision(struct ll_conn *conn);
void llcp_rr_set_paused_cmd(struct ll_conn *conn, enum llcp_proc); void llcp_rr_set_paused_cmd(struct ll_conn *conn, enum llcp_proc);
enum llcp_proc llcp_rr_get_paused_cmd(struct ll_conn *conn); enum llcp_proc llcp_rr_get_paused_cmd(struct ll_conn *conn);
struct proc_ctx *llcp_rr_peek(struct ll_conn *conn); struct proc_ctx *llcp_rr_peek(struct ll_conn *conn);
bool llcp_rr_ispaused(struct ll_conn *conn);
void llcp_rr_pause(struct ll_conn *conn); void llcp_rr_pause(struct ll_conn *conn);
void llcp_rr_resume(struct ll_conn *conn); void llcp_rr_resume(struct ll_conn *conn);
void llcp_rr_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, struct node_tx *tx); void llcp_rr_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, struct node_tx *tx);

View file

@ -112,24 +112,19 @@ struct proc_ctx *llcp_lr_peek(struct ll_conn *conn)
return ctx; return ctx;
} }
bool llcp_lr_ispaused(struct ll_conn *conn)
{
return conn->llcp.local.pause == 1U;
}
void llcp_lr_pause(struct ll_conn *conn) void llcp_lr_pause(struct ll_conn *conn)
{ {
struct proc_ctx *ctx; conn->llcp.local.pause = 1U;
ctx = (struct proc_ctx *)sys_slist_peek_head(&conn->llcp.local.pend_proc_list);
if (ctx) {
ctx->pause = 1;
}
} }
void llcp_lr_resume(struct ll_conn *conn) void llcp_lr_resume(struct ll_conn *conn)
{ {
struct proc_ctx *ctx; conn->llcp.local.pause = 0U;
ctx = (struct proc_ctx *)sys_slist_peek_head(&conn->llcp.local.pend_proc_list);
if (ctx) {
ctx->pause = 0;
}
} }
void llcp_lr_rx(struct ll_conn *conn, struct proc_ctx *ctx, struct node_rx_pdu *rx) void llcp_lr_rx(struct ll_conn *conn, struct proc_ctx *ctx, struct node_rx_pdu *rx)

View file

@ -439,7 +439,8 @@ static void lp_pu_complete(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t e
static void lp_pu_send_phy_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) static void lp_pu_send_phy_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param)
{ {
if (ctx->pause || llcp_rr_get_collision(conn) || !llcp_tx_alloc_peek(conn, ctx) || if (llcp_lr_ispaused(conn) || llcp_rr_get_collision(conn) ||
!llcp_tx_alloc_peek(conn, ctx) ||
(llcp_rr_get_paused_cmd(conn) == PROC_PHY_UPDATE)) { (llcp_rr_get_paused_cmd(conn) == PROC_PHY_UPDATE)) {
ctx->state = LP_PU_STATE_WAIT_TX_PHY_REQ; ctx->state = LP_PU_STATE_WAIT_TX_PHY_REQ;
} else { } else {
@ -455,7 +456,7 @@ static void lp_pu_send_phy_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8
static void lp_pu_send_phy_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void lp_pu_send_phy_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
ctx->state = LP_PU_STATE_WAIT_TX_PHY_UPDATE_IND; ctx->state = LP_PU_STATE_WAIT_TX_PHY_UPDATE_IND;
} else { } else {
ctx->data.pu.instant = ull_conn_event_counter(conn) + PHY_UPDATE_INSTANT_DELTA; ctx->data.pu.instant = ull_conn_event_counter(conn) + PHY_UPDATE_INSTANT_DELTA;
@ -855,7 +856,7 @@ static void rp_pu_complete(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t e
static void rp_pu_send_phy_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, static void rp_pu_send_phy_update_ind(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt,
void *param) void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx) || if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx) ||
(llcp_rr_get_paused_cmd(conn) == PROC_PHY_UPDATE)) { (llcp_rr_get_paused_cmd(conn) == PROC_PHY_UPDATE)) {
ctx->state = RP_PU_STATE_WAIT_TX_PHY_UPDATE_IND; ctx->state = RP_PU_STATE_WAIT_TX_PHY_UPDATE_IND;
} else { } else {
@ -871,7 +872,7 @@ static void rp_pu_send_phy_update_ind(struct ll_conn *conn, struct proc_ctx *ctx
#if defined(CONFIG_BT_PERIPHERAL) #if defined(CONFIG_BT_PERIPHERAL)
static void rp_pu_send_phy_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) static void rp_pu_send_phy_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param)
{ {
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx) || if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx) ||
(llcp_rr_get_paused_cmd(conn) == PROC_PHY_UPDATE)) { (llcp_rr_get_paused_cmd(conn) == PROC_PHY_UPDATE)) {
ctx->state = RP_PU_STATE_WAIT_TX_PHY_RSP; ctx->state = RP_PU_STATE_WAIT_TX_PHY_RSP;
} else { } else {

View file

@ -177,24 +177,19 @@ struct proc_ctx *llcp_rr_peek(struct ll_conn *conn)
return ctx; return ctx;
} }
bool llcp_rr_ispaused(struct ll_conn *conn)
{
return conn->llcp.remote.pause == 1U;
}
void llcp_rr_pause(struct ll_conn *conn) void llcp_rr_pause(struct ll_conn *conn)
{ {
struct proc_ctx *ctx; conn->llcp.remote.pause = 1U;
ctx = (struct proc_ctx *)sys_slist_peek_head(&conn->llcp.remote.pend_proc_list);
if (ctx) {
ctx->pause = 1;
}
} }
void llcp_rr_resume(struct ll_conn *conn) void llcp_rr_resume(struct ll_conn *conn)
{ {
struct proc_ctx *ctx; conn->llcp.remote.pause = 0U;
ctx = (struct proc_ctx *)sys_slist_peek_head(&conn->llcp.remote.pend_proc_list);
if (ctx) {
ctx->pause = 0;
}
} }
@ -389,7 +384,7 @@ static void rr_act_reject(struct ll_conn *conn)
LL_ASSERT(ctx != NULL); LL_ASSERT(ctx != NULL);
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
rr_set_state(conn, RR_STATE_REJECT); rr_set_state(conn, RR_STATE_REJECT);
} else { } else {
rr_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_REJECT_IND); rr_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_REJECT_IND);
@ -405,7 +400,7 @@ static void rr_act_unsupported(struct ll_conn *conn)
LL_ASSERT(ctx != NULL); LL_ASSERT(ctx != NULL);
if (ctx->pause || !llcp_tx_alloc_peek(conn, ctx)) { if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
rr_set_state(conn, RR_STATE_UNSUPPORTED); rr_set_state(conn, RR_STATE_UNSUPPORTED);
} else { } else {
rr_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_UNKNOWN_RSP); rr_tx(conn, ctx, PDU_DATA_LLCTRL_TYPE_UNKNOWN_RSP);

View file

@ -56,6 +56,7 @@ void test_api_init(void)
extern void test_int_mem_proc_ctx(void); extern void test_int_mem_proc_ctx(void);
extern void test_int_mem_tx(void); extern void test_int_mem_tx(void);
extern void test_int_create_proc(void); extern void test_int_create_proc(void);
extern void test_int_llcp_init(void);
extern void test_int_local_pending_requests(void); extern void test_int_local_pending_requests(void);
extern void test_int_remote_pending_requests(void); extern void test_int_remote_pending_requests(void);
@ -197,8 +198,11 @@ void test_int_disconnect_rem(void)
void test_main(void) void test_main(void)
{ {
ztest_test_suite(internal, ztest_unit_test(test_int_mem_proc_ctx), ztest_test_suite(internal,
ztest_unit_test(test_int_mem_tx), ztest_unit_test(test_int_create_proc), ztest_unit_test(test_int_mem_proc_ctx),
ztest_unit_test(test_int_mem_tx),
ztest_unit_test(test_int_create_proc),
ztest_unit_test(test_int_llcp_init),
ztest_unit_test(test_int_local_pending_requests), ztest_unit_test(test_int_local_pending_requests),
ztest_unit_test(test_int_remote_pending_requests), ztest_unit_test(test_int_remote_pending_requests),
ztest_unit_test(test_int_disconnect_loc), ztest_unit_test(test_int_disconnect_loc),