Commit 1fe11352 authored by Vinayak Kariappa Chettimada's avatar Vinayak Kariappa Chettimada Committed by Anas Nashif
Browse files

Bluetooth: controller: Add explicit opcode check in unknown rsp PDU



Add explicit opcode check when handling received unknown
response PDU.

Without this, for example, an in progress Data Length Update
procedure state was reset when receiving an unknown response
to slave initiated feature request.

Fixes #26252.

Signed-off-by: default avatarVinayak Kariappa Chettimada <vich@nordicsemi.no>
parent ec6db600
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -5873,10 +5873,14 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
			goto ull_conn_rx_unknown_rsp_send;
		}

		struct pdu_data_llctrl *llctrl = (void *)&pdu_rx->llctrl;

		if (0) {
#if defined(CONFIG_BT_CTLR_CONN_PARAM_REQ)
		} else if (conn->llcp_conn_param.ack !=
			   conn->llcp_conn_param.req) {
		} else if ((conn->llcp_conn_param.ack !=
			    conn->llcp_conn_param.req) &&
			   (llctrl->unknown_rsp.type ==
			    PDU_DATA_LLCTRL_TYPE_CONN_PARAM_REQ)) {
			struct lll_conn *lll = &conn->lll;
			struct node_rx_cu *cu;

@@ -5938,7 +5942,9 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
#endif /* CONFIG_BT_CTLR_CONN_PARAM_REQ */

#if defined(CONFIG_BT_CTLR_DATA_LENGTH)
		} else if (conn->llcp_length.req != conn->llcp_length.ack) {
		} else if ((conn->llcp_length.req != conn->llcp_length.ack) &&
			   (llctrl->unknown_rsp.type ==
			    PDU_DATA_LLCTRL_TYPE_LENGTH_REQ)) {
			/* Mark length update as unsupported */
			conn->llcp_length.disabled = 1U;

@@ -5951,8 +5957,9 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
#endif /* CONFIG_BT_CTLR_DATA_LENGTH */

#if defined(CONFIG_BT_CTLR_PHY)
		} else if (conn->llcp_phy.req !=
			   conn->llcp_phy.ack) {
		} else if ((conn->llcp_phy.req != conn->llcp_phy.ack) &&
			   (llctrl->unknown_rsp.type ==
			    PDU_DATA_LLCTRL_TYPE_PHY_REQ)) {
			struct lll_conn *lll = &conn->lll;

			/* Mark phy update as unsupported */
@@ -5983,9 +5990,6 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
#endif /* CONFIG_BT_CTLR_PHY */

		} else {
			struct pdu_data_llctrl *llctrl;

			llctrl = (void *)&pdu_rx->llctrl;
			switch (llctrl->unknown_rsp.type) {

#if defined(CONFIG_BT_CTLR_LE_PING)