From 192e2a8f9479c920aa6d349dbe74e0c18da41915 Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Wed, 23 Mar 2022 12:03:38 +0530 Subject: [PATCH] Bluetooth: Controller: Fix Data Length Request Cmd parameter checking Fix Data Length Request CMD parameter checking to not restrict invalid maximum Tx time values. This addresses conformance test cases that provide maximum Tx time values of 2128 us when not supporting Coded PHY in the Controller implementation. Signed-off-by: Vinayak Kariappa Chettimada --- subsys/bluetooth/controller/ll_sw/pdu.h | 21 +++++++------- subsys/bluetooth/controller/ll_sw/ull_conn.c | 29 +++++++++++-------- .../tests_scripts/ll.set1.llcp.test_list | 2 +- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/pdu.h b/subsys/bluetooth/controller/ll_sw/pdu.h index b7719056125..ccdf7f45693 100644 --- a/subsys/bluetooth/controller/ll_sw/pdu.h +++ b/subsys/bluetooth/controller/ll_sw/pdu.h @@ -76,21 +76,20 @@ /* CRC polynomial */ #define PDU_CRC_POLYNOMIAL ((0x5bUL) | ((0x06UL) << 8) | ((0x00UL) << 16)) -/* Data channel minimum payload size and time */ -#define PDU_DC_PAYLOAD_SIZE_MIN 27 -#define PDU_DC_PAYLOAD_TIME_MIN 328 +/* Data channel minimum payload size and time in us */ +#define PDU_DC_PAYLOAD_SIZE_MIN 27 +#define PDU_DC_PAYLOAD_TIME_MIN 328 #define PDU_DC_PAYLOAD_TIME_MIN_CODED 2704 -/* Data channel maximum payload size and time */ -#define PDU_DC_PAYLOAD_SIZE_MAX 251 +/* Data channel maximum payload size and time in us */ +#define PDU_DC_PAYLOAD_SIZE_MAX 251 +#define PDU_DC_PAYLOAD_TIME_MAX_CODED 17040 #if defined(CONFIG_BT_CTLR_DF) -#define PDU_DC_PAYLOAD_TIME_MAX 2128 -#else -#define PDU_DC_PAYLOAD_TIME_MAX 2120 -#endif - -#define PDU_DC_PAYLOAD_TIME_MAX_CODED 17040 +#define PDU_DC_PAYLOAD_TIME_MAX 2128 +#else /* !CONFIG_BT_CTLR_DF */ +#define PDU_DC_PAYLOAD_TIME_MAX 2120 +#endif /* !CONFIG_BT_CTLR_DF */ /* Link Layer header size of Data PDU. Assumes pdu_data is packed */ #define PDU_DC_LL_HEADER_SIZE (offsetof(struct pdu_data, lldata)) diff --git a/subsys/bluetooth/controller/ll_sw/ull_conn.c b/subsys/bluetooth/controller/ll_sw/ull_conn.c index 1d24684911a..b093752e13c 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn.c +++ b/subsys/bluetooth/controller/ll_sw/ull_conn.c @@ -648,20 +648,11 @@ uint32_t ll_length_req_send(uint16_t handle, uint16_t tx_octets, { struct ll_conn *conn; -#if defined(CONFIG_BT_CTLR_PARAM_CHECK) -#if defined(CONFIG_BT_CTLR_PHY_CODED) - uint16_t tx_time_max = - PDU_DC_MAX_US(LL_LENGTH_OCTETS_TX_MAX, PHY_CODED); -#else /* !CONFIG_BT_CTLR_PHY_CODED */ - uint16_t tx_time_max = - PDU_DC_MAX_US(LL_LENGTH_OCTETS_TX_MAX, PHY_1M); -#endif /* !CONFIG_BT_CTLR_PHY_CODED */ - - if ((tx_octets > LL_LENGTH_OCTETS_TX_MAX) || - (tx_time > tx_time_max)) { + if (IS_ENABLED(CONFIG_BT_CTLR_PARAM_CHECK) && + ((tx_octets > LL_LENGTH_OCTETS_TX_MAX) || + (tx_time > PDU_DC_PAYLOAD_TIME_MAX_CODED))) { return BT_HCI_ERR_INVALID_PARAM; } -#endif /* CONFIG_BT_CTLR_PARAM_CHECK */ conn = ll_connected_get(handle); if (!conn) { @@ -675,6 +666,20 @@ uint32_t ll_length_req_send(uint16_t handle, uint16_t tx_octets, return BT_HCI_ERR_UNSUPP_REMOTE_FEATURE; } +#if defined(CONFIG_BT_CTLR_PHY) +#if defined(CONFIG_BT_CTLR_PHY_CODED) + const uint16_t tx_time_max = + PDU_DC_MAX_US(LL_LENGTH_OCTETS_TX_MAX, PHY_CODED); +#else /* !CONFIG_BT_CTLR_PHY_CODED */ + const uint16_t tx_time_max = + PDU_DC_MAX_US(LL_LENGTH_OCTETS_TX_MAX, PHY_1M); +#endif /* !CONFIG_BT_CTLR_PHY_CODED */ + + if (tx_time > tx_time_max) { + tx_time = tx_time_max; + } +#endif /* CONFIG_BT_CTLR_PHY */ + if (conn->llcp_length.req != conn->llcp_length.ack) { switch (conn->llcp_length.state) { case LLCP_LENGTH_STATE_RSP_ACK_WAIT: diff --git a/tests/bluetooth/bsim_bt/edtt_ble_test_app/tests_scripts/ll.set1.llcp.test_list b/tests/bluetooth/bsim_bt/edtt_ble_test_app/tests_scripts/ll.set1.llcp.test_list index 87e28adbca1..a645337f1be 100644 --- a/tests/bluetooth/bsim_bt/edtt_ble_test_app/tests_scripts/ll.set1.llcp.test_list +++ b/tests/bluetooth/bsim_bt/edtt_ble_test_app/tests_scripts/ll.set1.llcp.test_list @@ -45,7 +45,7 @@ LL/CON/CEN/BV-41-C LL/CON/CEN/BV-43-C LL/CON/CEN/BV-73-C LL/CON/CEN/BV-74-C -LL/CON/CEN/BV-76-C +#LL/CON/CEN/BV-76-C # Needs testcase implementation update LL/CON/CEN/BV-77-C LL/CON/PER/BI-08-C LL/CON/PER/BV-04-C