From ee2a43b5dcf884730130345c402d87b2bce9dba1 Mon Sep 17 00:00:00 2001 From: Morten Priess Date: Mon, 7 Nov 2022 10:40:01 +0100 Subject: [PATCH] Bluetooth: controller: Reject CIS_TERMINATE when unsupported for role If a central or peripheral is not configured for ISO connected streams, reject a remote LL_CIS_TERMINATE_IND procedure, responding with an unsupported feature error (BT_HCI_ERR_UNSUPP_FEATURE). This fixes EBQ test /LL/PAC/CEN/BV-01-C. Signed-off-by: Morten Priess --- .../controller/ll_sw/ull_llcp_common.c | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c b/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c index 9cc7d082309..0cd282bb794 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c +++ b/subsys/bluetooth/controller/ll_sw/ull_llcp_common.c @@ -1118,6 +1118,15 @@ static void rp_comm_tx(struct ll_conn *conn, struct proc_ctx *ctx) ctx->rx_opcode = PDU_DATA_LLCTRL_TYPE_UNUSED; break; #endif /* CONFIG_BT_CTLR_SCA_UPDATE */ +#if !defined(CONFIG_BT_CTLR_CENTRAL_ISO) || !defined(CONFIG_BT_CTLR_PERIPHERAL_ISO) + case PROC_CIS_TERMINATE: + /* Only possible response to LL_CIS_TERMINATE is if a central or peripheral + * does not have ISO support. Then reject with error 'unsupported feature'. + */ + llcp_pdu_encode_reject_ext_ind(pdu, PDU_DATA_LLCTRL_TYPE_CIS_TERMINATE_IND, + BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL); + break; +#endif /* !CONFIG_BT_CTLR_CENTRAL_ISO || !CONFIG_BT_CTLR_PERIPHERAL_ISO */ default: /* Unknown procedure */ LL_ASSERT(0); @@ -1275,10 +1284,17 @@ static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t break; #if defined(CONFIG_BT_CTLR_CENTRAL_ISO) || defined(CONFIG_BT_CTLR_PERIPHERAL_ISO) case PROC_CIS_TERMINATE: - /* No response */ + /* Make sure role is configured for ISO, otherwise reject */ + if ((!IS_ENABLED(CONFIG_BT_CTLR_CENTRAL_ISO) && + conn->lll.role == BT_HCI_ROLE_CENTRAL) || + (!IS_ENABLED(CONFIG_BT_CTLR_PERIPHERAL_ISO) && + conn->lll.role == BT_HCI_ROLE_PERIPHERAL)) { + rp_comm_tx(conn, ctx); + /* Fall through */ + } + llcp_rr_complete(conn); ctx->state = RP_COMMON_STATE_IDLE; - break; #endif /* CONFIG_BT_CTLR_CENTRAL_ISO || CONFIG_BT_CTLR_PERIPHERAL_ISO */ #if defined(CONFIG_BT_CTLR_DATA_LENGTH)