@@ -59,7 +59,7 @@ void f1u_bearer_impl::handle_sdu(byte_buffer_chain sdu)
5959 // attach the SDU
6060 msg.t_pdu = std::move (sdu);
6161
62- // attach data delivery status (if anything has changed)
62+ // piggy-back latest data delivery status (ignore if anything has changed)
6363 fill_data_delivery_status (msg);
6464
6565 if (buffering) {
@@ -107,7 +107,7 @@ void f1u_bearer_impl::handle_pdu_impl(nru_dl_message msg)
107107 }
108108 // handle polling of delivery status report
109109 if (msg.dl_user_data .report_polling ) {
110- if (send_data_delivery_status ()) {
110+ if (send_data_delivery_status (/* force = */ true )) {
111111 logger.log_debug (" Report polling flag is set. Sent data delivery status" );
112112 } else {
113113 logger.log_warning (" Report polling flag is set. No data to be sent in data delivery status" );
@@ -192,9 +192,13 @@ bool f1u_bearer_impl::fill_highest_transmitted_pdcp_sn(nru_dl_data_delivery_stat
192192 // In case the DL DATA DELIVERY STATUS frame is sent before any NR PDCP PDU is transferred to lower layers, the
193193 // information on the highest NR PDCP PDU sequence number successfully delivered in sequence to the UE and the
194194 // highest NR PDCP PDU sequence number transmitted to the lower layers may not be provided.
195- if (cur_highest_transmitted_pdcp_sn != unset_pdcp_sn) {
196- logger.log_debug (" Adding highest transmitted pdcp_sn={}" , cur_highest_transmitted_pdcp_sn);
197- status.highest_transmitted_pdcp_sn = cur_highest_transmitted_pdcp_sn;
195+ if (cur_highest_transmitted_pdcp_sn == unset_pdcp_sn) {
196+ return false ;
197+ }
198+ logger.log_debug (" Adding highest transmitted pdcp_sn={}" , cur_highest_transmitted_pdcp_sn);
199+ status.highest_transmitted_pdcp_sn = cur_highest_transmitted_pdcp_sn;
200+ if (cur_highest_transmitted_pdcp_sn != notif_highest_transmitted_pdcp_sn) {
201+ notif_highest_transmitted_pdcp_sn = cur_highest_transmitted_pdcp_sn;
198202 return true ;
199203 }
200204 return false ;
@@ -214,9 +218,13 @@ bool f1u_bearer_impl::fill_highest_delivered_pdcp_sn(nru_dl_data_delivery_status
214218 // In case the DL DATA DELIVERY STATUS frame is sent before any NR PDCP PDU is transferred to lower layers, the
215219 // information on the highest NR PDCP PDU sequence number successfully delivered in sequence to the UE and the
216220 // highest NR PDCP PDU sequence number transmitted to the lower layers may not be provided.
217- if (cur_highest_delivered_pdcp_sn != unset_pdcp_sn) {
218- logger.log_debug (" Adding highest delivered pdcp_sn={}" , cur_highest_delivered_pdcp_sn);
219- status.highest_delivered_pdcp_sn = cur_highest_delivered_pdcp_sn;
221+ if (cur_highest_delivered_pdcp_sn == unset_pdcp_sn) {
222+ return false ;
223+ }
224+ logger.log_debug (" Adding highest delivered pdcp_sn={}" , cur_highest_delivered_pdcp_sn);
225+ status.highest_delivered_pdcp_sn = cur_highest_delivered_pdcp_sn;
226+ if (cur_highest_delivered_pdcp_sn != notif_highest_delivered_pdcp_sn) {
227+ notif_highest_delivered_pdcp_sn = cur_highest_delivered_pdcp_sn;
220228 return true ;
221229 }
222230 return false ;
@@ -249,31 +257,31 @@ bool f1u_bearer_impl::fill_highest_delivered_retransmitted_pdcp_sn(nru_dl_data_d
249257 return false ;
250258}
251259
252- void f1u_bearer_impl::fill_data_delivery_status (nru_ul_message& msg)
260+ bool f1u_bearer_impl::fill_data_delivery_status (nru_ul_message& msg)
253261{
254- nru_dl_data_delivery_status status = {};
255- bool value_added = false ;
262+ nru_dl_data_delivery_status status = {};
263+ bool fresh_values = false ;
256264
257- value_added |= fill_desired_buffer_size_of_data_radio_bearer (status);
258- value_added |= fill_highest_transmitted_pdcp_sn (status);
259- value_added |= fill_highest_delivered_pdcp_sn (status);
260- value_added |= fill_highest_retransmitted_pdcp_sn (status);
261- value_added |= fill_highest_delivered_retransmitted_pdcp_sn (status);
265+ fresh_values |= fill_desired_buffer_size_of_data_radio_bearer (status);
266+ fresh_values |= fill_highest_transmitted_pdcp_sn (status);
267+ fresh_values |= fill_highest_delivered_pdcp_sn (status);
268+ fresh_values |= fill_highest_retransmitted_pdcp_sn (status);
269+ fresh_values |= fill_highest_delivered_retransmitted_pdcp_sn (status);
262270
263- if (value_added) {
264- logger.log_debug (" Adding data delivery status to NR-U message" );
265- msg.data_delivery_status = std::move (status);
266- }
271+ logger.log_debug (" Adding data delivery status to NR-U message" );
272+ msg.data_delivery_status = std::move (status);
267273
268274 // restart UL notification timer
269275 ul_notif_timer.run ();
276+
277+ return fresh_values;
270278}
271279
272- bool f1u_bearer_impl::send_data_delivery_status ()
280+ bool f1u_bearer_impl::send_data_delivery_status (bool force )
273281{
274- nru_ul_message msg = {};
275- fill_data_delivery_status (msg);
276- if (!msg. data_delivery_status . has_value () ) {
282+ nru_ul_message msg = {};
283+ bool fresh_values = fill_data_delivery_status (msg);
284+ if (!fresh_values && !force ) {
277285 return false ;
278286 }
279287 tx_pdu_notifier.on_new_pdu (std::move (msg));
@@ -282,9 +290,9 @@ bool f1u_bearer_impl::send_data_delivery_status()
282290
283291void f1u_bearer_impl::on_expired_ul_notif_timer ()
284292{
285- if (send_data_delivery_status ()) {
293+ if (send_data_delivery_status (/* force = */ false )) {
286294 logger.log_debug (" UL notification timer expired. Sent data delivery status" );
287295 } else {
288- logger.log_debug (" UL notification timer expired. No data to be sent in data delivery status" );
296+ logger.log_debug (" UL notification timer expired. No fresh data to be sent in data delivery status" );
289297 }
290298}
0 commit comments