From f6f1ab9071e06232c27df4fdec524bad916776ad Mon Sep 17 00:00:00 2001 From: Piotr Pryga Date: Sat, 8 Jan 2022 11:42:06 +0100 Subject: [PATCH] Bluetooth: Controller: Add storage for remote CTE request data There are data received from peer device with CTE request. These data are not part of local CTE request procedure and they don't belong to CTE response configuration, hence separate storage was provided. Signed-off-by: Piotr Pryga --- subsys/bluetooth/controller/ll_sw/ull_conn_types.h | 3 --- subsys/bluetooth/controller/ll_sw/ull_llcp_common.c | 8 ++++---- .../bluetooth/controller/ll_sw/ull_llcp_internal.h | 13 +++++++++++-- subsys/bluetooth/controller/ll_sw/ull_llcp_pdu.c | 12 ++++++------ 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/ull_conn_types.h b/subsys/bluetooth/controller/ll_sw/ull_conn_types.h index 52de6ce5109..115df2e9d31 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn_types.h +++ b/subsys/bluetooth/controller/ll_sw/ull_conn_types.h @@ -425,9 +425,6 @@ struct llcp_struct { } cte_req; #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_REQ */ #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) - /* TODO (ppryga): Consided move of the type of structure to ull_df_types.h or - * lll_df_types.h. To have single definition of the type and share it wish LLL. - */ struct llcp_df_rsp_cfg { uint8_t is_enabled; uint8_t cte_types; diff --git a/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c b/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c index 12dddd31ae4..b151a1b7b14 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c +++ b/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c @@ -694,7 +694,7 @@ static void rp_comm_rx_decode(struct ll_conn *conn, struct proc_ctx *ctx, struct #endif /* CONFIG_BT_CTLR_DATA_LENGTH */ #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) case PDU_DATA_LLCTRL_TYPE_CTE_REQ: - llcp_pdu_decode_cte_req(conn, pdu); + llcp_pdu_decode_cte_req(ctx, pdu); break; #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */ default: @@ -753,13 +753,13 @@ static void rp_comm_tx(struct ll_conn *conn, struct proc_ctx *ctx) err_code = BT_HCI_ERR_INVALID_LL_PARAM; } #endif /* CONFIG_BT_PHY_UPDATE */ - if (!(conn->llcp.cte_rsp.cte_types & BIT(conn->llcp.cte_req.cte_type)) && - conn->llcp.cte_rsp.max_cte_len < conn->llcp.cte_req.min_cte_len) { + if (!(conn->llcp.cte_rsp.cte_types & BIT(ctx->data.cte_remote_req.cte_type)) || + conn->llcp.cte_rsp.max_cte_len < ctx->data.cte_remote_req.min_cte_len) { err_code = BT_HCI_ERR_UNSUPP_LL_PARAM_VAL; } if (!err_code) { - llcp_pdu_encode_cte_rsp(conn, pdu); + llcp_pdu_encode_cte_rsp(ctx, pdu); ctx->rx_opcode = PDU_DATA_LLCTRL_TYPE_CTE_RSP; } else { llcp_pdu_encode_reject_ext_ind(pdu, PDU_DATA_LLCTRL_TYPE_CTE_REQ, err_code); diff --git a/subsys/bluetooth/controller/ll_sw/ull_llcp_internal.h b/subsys/bluetooth/controller/ll_sw/ull_llcp_internal.h index 951dcef294e..36960946209 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_llcp_internal.h +++ b/subsys/bluetooth/controller/ll_sw/ull_llcp_internal.h @@ -221,6 +221,15 @@ struct proc_ctx { uint8_t min_len:5; } cte_req; #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_REQ */ + +#if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) + /* Use by CTE Response Procedure */ + struct llcp_df_cte_remote_req { + uint8_t cte_type; + uint8_t min_cte_len; + } cte_remote_req; +#endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */ + } data; struct { @@ -589,8 +598,8 @@ void llcp_ntf_encode_cte_req(struct ll_conn *conn, struct pdu_data *pdu); /* * Constant Tone Response Procedure Helper */ -void llcp_pdu_decode_cte_req(struct ll_conn *conn, struct pdu_data *pdu); -void llcp_pdu_encode_cte_rsp(struct ll_conn *conn, struct pdu_data *pdu); +void llcp_pdu_decode_cte_req(struct proc_ctx *ctx, struct pdu_data *pdu); +void llcp_pdu_encode_cte_rsp(const struct proc_ctx *ctx, struct pdu_data *pdu); #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */ #ifdef ZTEST_UNITTEST diff --git a/subsys/bluetooth/controller/ll_sw/ull_llcp_pdu.c b/subsys/bluetooth/controller/ll_sw/ull_llcp_pdu.c index 1d6be39cd8d..224c4ae9b4d 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_llcp_pdu.c +++ b/subsys/bluetooth/controller/ll_sw/ull_llcp_pdu.c @@ -739,13 +739,13 @@ void llcp_ntf_encode_cte_req(struct ll_conn *conn, struct pdu_data *pdu) #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_REQ */ #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) -void llcp_pdu_decode_cte_req(struct ll_conn *conn, struct pdu_data *pdu) +void llcp_pdu_decode_cte_req(struct proc_ctx *ctx, struct pdu_data *pdu) { - conn->llcp.cte_req.min_cte_len = pdu->llctrl.cte_req.min_cte_len_req; - conn->llcp.cte_req.cte_type = pdu->llctrl.cte_req.cte_type_req; + ctx->data.cte_remote_req.min_cte_len = pdu->llctrl.cte_req.min_cte_len_req; + ctx->data.cte_remote_req.cte_type = pdu->llctrl.cte_req.cte_type_req; } -void llcp_pdu_encode_cte_rsp(struct ll_conn *conn, struct pdu_data *pdu) +void llcp_pdu_encode_cte_rsp(const struct proc_ctx *ctx, struct pdu_data *pdu) { pdu->ll_id = PDU_DATA_LLID_CTRL; pdu->len = @@ -756,7 +756,7 @@ void llcp_pdu_encode_cte_rsp(struct ll_conn *conn, struct pdu_data *pdu) pdu->cp = 1U; pdu->rfu = 0U; - pdu->cte_info.time = conn->llcp.cte_req.min_cte_len; - pdu->cte_info.type = conn->llcp.cte_req.cte_type; + pdu->cte_info.time = ctx->data.cte_remote_req.min_cte_len; + pdu->cte_info.type = ctx->data.cte_remote_req.cte_type; } #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */