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 <piotr.pryga@nordicsemi.no>
This commit is contained in:
Piotr Pryga 2022-01-08 11:42:06 +01:00 committed by Christopher Friedt
commit f6f1ab9071
4 changed files with 21 additions and 15 deletions

View file

@ -425,9 +425,6 @@ struct llcp_struct {
} cte_req; } cte_req;
#endif /* CONFIG_BT_CTLR_DF_CONN_CTE_REQ */ #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_REQ */
#if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) #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 { struct llcp_df_rsp_cfg {
uint8_t is_enabled; uint8_t is_enabled;
uint8_t cte_types; uint8_t cte_types;

View file

@ -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 */ #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 PDU_DATA_LLCTRL_TYPE_CTE_REQ: case PDU_DATA_LLCTRL_TYPE_CTE_REQ:
llcp_pdu_decode_cte_req(conn, pdu); llcp_pdu_decode_cte_req(ctx, pdu);
break; break;
#endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */ #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */
default: 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; err_code = BT_HCI_ERR_INVALID_LL_PARAM;
} }
#endif /* CONFIG_BT_PHY_UPDATE */ #endif /* CONFIG_BT_PHY_UPDATE */
if (!(conn->llcp.cte_rsp.cte_types & BIT(conn->llcp.cte_req.cte_type)) && if (!(conn->llcp.cte_rsp.cte_types & BIT(ctx->data.cte_remote_req.cte_type)) ||
conn->llcp.cte_rsp.max_cte_len < conn->llcp.cte_req.min_cte_len) { conn->llcp.cte_rsp.max_cte_len < ctx->data.cte_remote_req.min_cte_len) {
err_code = BT_HCI_ERR_UNSUPP_LL_PARAM_VAL; err_code = BT_HCI_ERR_UNSUPP_LL_PARAM_VAL;
} }
if (!err_code) { 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; ctx->rx_opcode = PDU_DATA_LLCTRL_TYPE_CTE_RSP;
} else { } else {
llcp_pdu_encode_reject_ext_ind(pdu, PDU_DATA_LLCTRL_TYPE_CTE_REQ, err_code); llcp_pdu_encode_reject_ext_ind(pdu, PDU_DATA_LLCTRL_TYPE_CTE_REQ, err_code);

View file

@ -221,6 +221,15 @@ struct proc_ctx {
uint8_t min_len:5; uint8_t min_len:5;
} cte_req; } cte_req;
#endif /* CONFIG_BT_CTLR_DF_CONN_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; } data;
struct { struct {
@ -589,8 +598,8 @@ void llcp_ntf_encode_cte_req(struct ll_conn *conn, struct pdu_data *pdu);
/* /*
* Constant Tone Response Procedure Helper * Constant Tone Response Procedure Helper
*/ */
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);
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);
#endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */ #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */
#ifdef ZTEST_UNITTEST #ifdef ZTEST_UNITTEST

View file

@ -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 */ #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_REQ */
#if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RSP) #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; ctx->data.cte_remote_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.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->ll_id = PDU_DATA_LLID_CTRL;
pdu->len = pdu->len =
@ -756,7 +756,7 @@ void llcp_pdu_encode_cte_rsp(struct ll_conn *conn, struct pdu_data *pdu)
pdu->cp = 1U; pdu->cp = 1U;
pdu->rfu = 0U; pdu->rfu = 0U;
pdu->cte_info.time = conn->llcp.cte_req.min_cte_len; pdu->cte_info.time = ctx->data.cte_remote_req.min_cte_len;
pdu->cte_info.type = conn->llcp.cte_req.cte_type; pdu->cte_info.type = ctx->data.cte_remote_req.cte_type;
} }
#endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */ #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RSP */