@@ -301,6 +301,55 @@ TEST_F(ue_config_tester, when_du_manager_finishes_processing_ue_config_request_t
301301 ASSERT_EQ (test_payload, extracted_payload);
302302}
303303
304+ TEST_F (ue_config_tester,
305+ when_du_manager_finishes_processing_ue_config_request_with_f1u_ext_addr_then_mac_rlc_f1u_bearers_are_connected)
306+ {
307+ // Add F1-U external address to the F1-U GW.
308+ std::string f1u_ext_addr = " 5.6.7.8" ;
309+ f1u_gw.set_f1u_ext_addr (f1u_ext_addr);
310+
311+ const static std::array<uint8_t , 2 > dummy_rlc_header = {0x80 , 0x0 };
312+ byte_buffer test_payload = test_helpers::create_pdcp_pdu (
313+ pdcp_sn_size::size12bits, /* is_srb = */ false , 0 , test_rgen::uniform_int<unsigned >(3 , 100 ), 0 );
314+
315+ // Run UE Configuration Procedure to completion.
316+ f1ap_ue_context_update_response resp =
317+ configure_ue (create_f1ap_ue_context_update_request (test_ue->ue_index , {}, {drb_id_t ::drb1}));
318+
319+ // Check that the DL UP TNL Info has the correct F1-U external address.
320+ ASSERT_EQ (resp.drbs_setup .size (), 1 );
321+ ASSERT_EQ (resp.drbs_setup [0 ].dluptnl_info_list .size (), 1 );
322+ ASSERT_EQ (resp.drbs_setup [0 ].dluptnl_info_list [0 ].tp_address ,
323+ transport_layer_address::create_from_string (f1u_ext_addr));
324+
325+ srs_du::f1u_gw_bearer_dummy* bearer = f1u_gw.f1u_bearers .begin ()->second .begin ()->second ;
326+
327+ // Forward MAC Rx SDU through DRB1 (UL).
328+ // > Add dummy RLC data header.
329+ byte_buffer mac_sdu = byte_buffer::create (dummy_rlc_header).value ();
330+ // > Append data buffer.
331+ ASSERT_TRUE (mac_sdu.append (test_payload.copy ()));
332+ // > Push MAC Rx SDU through MAC logical channel.
333+ mac.last_ue_reconf_msg ->bearers_to_addmod [0 ].ul_bearer ->on_new_sdu ({mac_sdu.copy ()});
334+ // > Check arrival of F1-U Tx SDU to F1-U bearer.
335+ auto last_sdu = bearer->last_sdu ->t_pdu ->deep_copy ().value ();
336+ ASSERT_EQ (test_payload, last_sdu);
337+
338+ // Forward F1-U Rx SDU through DRB1 (DL).
339+ // > Create data buffer.
340+ nru_dl_message rx_sdu;
341+ rx_sdu.t_pdu = test_payload.copy ();
342+ // > Push F1-U Rx SDU through F1-U bearer Rx SDU notifier.
343+ bearer->du_rx .on_new_pdu (std::move (rx_sdu));
344+
345+ // > Check arrival of MAC Tx SDU to MAC logical channel.
346+ std::vector<uint8_t > mac_tx_sdu (test_payload.length () + dummy_rlc_header.size ());
347+ unsigned nwritten = mac.last_ue_reconf_msg ->bearers_to_addmod [0 ].dl_bearer ->on_new_tx_sdu (mac_tx_sdu);
348+ byte_buffer extracted_payload =
349+ byte_buffer::create (mac_tx_sdu.begin () + dummy_rlc_header.size (), mac_tx_sdu.begin () + nwritten).value ();
350+ ASSERT_EQ (test_payload, extracted_payload);
351+ }
352+
304353TEST_F (ue_config_tester, when_f1u_gw_fails_to_create_bearer_then_drb_is_included_in_failed_list)
305354{
306355 this ->f1u_gw .next_bearer_is_created = false ;
0 commit comments