@@ -684,14 +684,30 @@ uint8_t ll_version_ind_send(uint16_t handle)
684684}
685685
686686#if defined(CONFIG_BT_CTLR_DATA_LENGTH )
687+ static bool ll_len_validate (uint16_t tx_octets , uint16_t tx_time )
688+ {
689+ /* validate if within HCI allowed range */
690+ if (!IN_RANGE (tx_octets , PDU_DC_PAYLOAD_SIZE_MIN ,
691+ PDU_DC_PAYLOAD_SIZE_MAX )) {
692+ return false;
693+ }
694+
695+ /* validate if within HCI allowed range */
696+ if (!IN_RANGE (tx_time , PDU_DC_PAYLOAD_TIME_MIN ,
697+ PDU_DC_PAYLOAD_TIME_MAX_CODED )) {
698+ return false;
699+ }
700+
701+ return true;
702+ }
703+
687704uint32_t ll_length_req_send (uint16_t handle , uint16_t tx_octets ,
688705 uint16_t tx_time )
689706{
690707 struct ll_conn * conn ;
691708
692709 if (IS_ENABLED (CONFIG_BT_CTLR_PARAM_CHECK ) &&
693- ((tx_octets > LL_LENGTH_OCTETS_TX_MAX ) ||
694- (tx_time > PDU_DC_PAYLOAD_TIME_MAX_CODED ))) {
710+ !ll_len_validate (tx_octets , tx_time )) {
695711 return BT_HCI_ERR_INVALID_PARAM ;
696712 }
697713
@@ -778,7 +794,10 @@ void ll_length_default_get(uint16_t *max_tx_octets, uint16_t *max_tx_time)
778794
779795uint32_t ll_length_default_set (uint16_t max_tx_octets , uint16_t max_tx_time )
780796{
781- /* TODO: parameter check (for BT 5.0 compliance) */
797+ if (IS_ENABLED (CONFIG_BT_CTLR_PARAM_CHECK ) &&
798+ !ll_len_validate (max_tx_octets , max_tx_time )) {
799+ return BT_HCI_ERR_INVALID_PARAM ;
800+ }
782801
783802 default_tx_octets = max_tx_octets ;
784803 default_tx_time = max_tx_time ;
@@ -8146,8 +8165,31 @@ uint8_t ull_dle_update_eff(struct ll_conn *conn)
81468165 return dle_changed ;
81478166}
81488167
8168+ static void ull_len_data_length_trim (uint16_t * tx_octets , uint16_t * tx_time )
8169+ {
8170+ #if defined(CONFIG_BT_CTLR_PHY_CODED )
8171+ uint16_t tx_time_max =
8172+ PDU_DC_MAX_US (LL_LENGTH_OCTETS_TX_MAX , PHY_CODED );
8173+ #else /* !CONFIG_BT_CTLR_PHY_CODED */
8174+ uint16_t tx_time_max =
8175+ PDU_DC_MAX_US (LL_LENGTH_OCTETS_TX_MAX , PHY_1M );
8176+ #endif /* !CONFIG_BT_CTLR_PHY_CODED */
8177+
8178+ /* trim to supported values */
8179+ if (* tx_octets > LL_LENGTH_OCTETS_TX_MAX ) {
8180+ * tx_octets = LL_LENGTH_OCTETS_TX_MAX ;
8181+ }
8182+
8183+ if (* tx_time > tx_time_max ) {
8184+ * tx_time = tx_time_max ;
8185+ }
8186+ }
8187+
81498188void ull_dle_local_tx_update (struct ll_conn * conn , uint16_t tx_octets , uint16_t tx_time )
81508189{
8190+ /* Trim to supported values */
8191+ ull_len_data_length_trim (& tx_octets , & tx_time );
8192+
81518193 conn -> lll .dle .default_tx_octets = tx_octets ;
81528194
81538195#if defined(CONFIG_BT_CTLR_PHY )
0 commit comments