Loading etc/AtsNGAP/AtsNGAP_GNB_p_net.cfg_ +4 −0 Changes for etc/AtsNGAP/AtsNGAP_GNB_p_net.cfg_: 4 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 LibNGAP_Pixits.PX_TIME_ZONE := '80'O # 0x40 for GMT+1, 0x80 for GMT+2 # User plane probe (TC_NGAP_GNB_PDU_01): the UPF tunnel endpoint given to the gNB is this host on N3, and the UE pings it LibNGAP_Pixits.PX_TRANSPORT_LAYER_ADDRESS := '00001010101011100001001100001110'B # 10.174.19.14 LibNGAP_Pixits.PX_UT_PING_HOST := "10.174.19.14" LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 LibNGAP_Pixits.PX_NR_ENCRYPTION_ALGORITHMS := '1110000000000000'B Loading ttcn/AtsNGAP/NGAP_Steps.ttcn +41 −0 Changes for ttcn/AtsNGAP/NGAP_Steps.ttcn: 41 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -847,6 +847,47 @@ module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NG return true; } // End of function f_NGAP_gnb_UE_await_data_call /** * @brief Have the real UE send user plane traffic over its data call: ping PX_UT_PING_HOST. * @details Unless PX_UT_PING_HOST is empty: asks the upper tester for PING (AT+QPING on the modem, * PX_UT_PING_COUNT echo requests, PX_UT_PING_TIMEOUT s each) and waits for its result, which is * only logged. The gNB is expected to forward the echo requests as uplink G-PDUs to the UPF * tunnel endpoint of the PDU session (PX_TRANSPORT_LAYER_ADDRESS, PX_GTP_TEID); as the test * system does not handle GTP-U yet, no reply comes back, and only a capture on the test system * host (UDP port 2152) shows whether they arrived. * The UE stays in CM-CONNECTED meanwhile: no NGAP signalling is expected. * @note The verdict is set by the UT dispatcher only (NGAP_UtDispatcher): inconc if the modem could not * run the pings at all (e.g. the context of the data call is not usable by AT+QPING); lost * replies are not a failure. * @return true if the modem ran the pings. */ function f_NGAP_gnb_UE_ping() runs on gNBNGAPComponent return boolean { var UT_COMMON_CNF v_cnf; timer t_ping := int2float(PX_UT_PING_COUNT * PX_UT_PING_TIMEOUT) + 30.0; if (PX_UT_PING_HOST == "") { return false; } log(">>> f_NGAP_gnb_UE_ping: ", PX_UT_PING_HOST, ", ", PX_UT_PING_COUNT, " echo requests"); fl_UT_ApplyCommand(utPtcMtcPort, cas_UT_Req(PING, CNF_REQUIRED, { cs_Ut_Parameter_Common("HOST", PX_UT_PING_HOST), cs_Ut_Parameter_Common("COUNT", int2str(PX_UT_PING_COUNT)), cs_Ut_Parameter_Common("TIMEOUT", int2str(PX_UT_PING_TIMEOUT)) }), true); t_ping.start; alt { [] utPtcMtcPort.receive(car_UT_COMMON_CNF) -> value v_cnf { t_ping.stop; } [] t_ping.timeout { log("*** " & __SCOPE__ & ": INFO: no ping result from the upper tester ***"); return false; } } log("*** " & __SCOPE__ & ": INFO: ping ", PX_UT_PING_HOST, " result: ", v_cnf, " ***"); return v_cnf.Result; } // End of function f_NGAP_gnb_UE_ping /** * @brief Leave the real UE in a known state at the end of a test: deregistered, in flight mode. * @details Unless PX_UT_DEREGISTER_TIMEOUT is 0.0: asks the upper tester to switch the modem to flight Loading ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +4 −0 Changes for ttcn/AtsNGAP/NGAP_TCFunctions.ttcn: 4 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -179,6 +179,10 @@ module NGAP_TCFunctions { if (PICS_USE_AT_COMMANDS and v_setup) { if (not f_NGAP_gnb_UE_await_data_call()) { log("*** " & __SCOPE__ & ": INCONC: the PDU session is set up, but the UE data call is not connected. ***"); } else if (f_NGAP_gnb_UE_ping()) { // User plane probe: the echo requests must reach PX_TRANSPORT_LAYER_ADDRESS as uplink // G-PDUs (check with a capture on UDP port 2152); not checked by the test yet log("*** " & __SCOPE__ & ": INFO: user plane traffic sent by the UE ***"); } } } Loading ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +10 −0 Changes for ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn: 10 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -750,6 +750,16 @@ module LibNGAP_Pixits { * see f_NGAP_gnb_UE_Deregister. 0.0 to leave the UE as it is at the end of the test */ modulepar float PX_UT_DEREGISTER_TIMEOUT := 10.0; /** @desc Host the real UE pings over its data call once the PDU session is set up, to generate user plane traffic * (uplink G-PDUs towards PX_TRANSPORT_LAYER_ADDRESS); empty to send no traffic. See f_NGAP_gnb_UE_ping */ modulepar charstring PX_UT_PING_HOST := ""; /** @desc Number of echo requests sent by the real UE (1..10); see f_NGAP_gnb_UE_ping */ modulepar integer PX_UT_PING_COUNT := 4; /** @desc Time, in seconds, the real UE waits for each echo reply (1..255); see f_NGAP_gnb_UE_ping */ modulepar integer PX_UT_PING_TIMEOUT := 4; /** @desc Whether, after its restart (AT+CFUN=1,1), the real UE (AT commands) is set to full functionality (AT+CFUN=1) and * forced onto PX_UT_PLMN_MCC/PX_UT_PLMN_MNC (AT+COPS=1); see f_NGAP_gnb_UE_Register. * false: it is only restarted, and registers by itself on the PLMN it selects. */ Loading ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +10 −5 Changes for ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn: 10 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -1609,6 +1609,8 @@ module LibNGAP_Functions { '00000001'O, omit )))); setverdict(pass, "Sent RETRIEVE_UE_INFORMATION NAS message"); // Await UEInformationTransfer f_recv_NGAP_PDU( mw_ngap_initMsg( Loading @@ -1618,6 +1620,7 @@ module LibNGAP_Functions { PX_AMF_POINTER, ? )))); setverdict(pass) } /** Loading Loading @@ -1662,7 +1665,7 @@ module LibNGAP_Functions { m_tAI ))))); setverdict(pass); setverdict(pass, "Sent UplinkNASTransport NAS message"); } /** Loading Loading @@ -1691,6 +1694,7 @@ module LibNGAP_Functions { vc_RAN_UE_ID, ? ))); setverdict(pass, "Received UERadioCapabilityInfoIndication NAS message"); } [] N2_gNBaMF_P.check(receive(NGAP_PDU: ?)) { // continue Loading @@ -1716,7 +1720,7 @@ module LibNGAP_Functions { setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_COMPLETE"); setverdict(pass); setverdict(pass, "Received REGISTRATION_COMPLETE NAS message"); } log("<<< f_await_registration_complete"); Loading Loading @@ -1799,7 +1803,7 @@ module LibNGAP_Functions { m_tAI ))))); setverdict(pass); setverdict(pass, "Sent PDU_SESSION_ESTABLISHMENT_REQUEST NAS message"); log("<<< f_send_pdu_session_establishment_request"); } Loading Loading @@ -1828,10 +1832,10 @@ module LibNGAP_Functions { var O1_Type v_pti; if (not f_get_pdu_session_establishment_request_ids(v_psi, v_pti)) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch."); setverdict(fail); setverdict(fail, "Received PDU_SESSION_ESTABLISHMENT_REQUEST NAS message"); } else { log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_REQUEST"); setverdict(pass); setverdict(pass, "Received PDU_SESSION_ESTABLISHMENT_REQUEST NAS message"); } } Loading Loading @@ -2016,6 +2020,7 @@ module LibNGAP_Functions { } )); if (not f_NGAP_check_received_PDU(mw_ngap_initMsg(mw_n2_initialUeMessage_conformant), "INITIAL UE MESSAGE")) { log("f_send_ue_context_release_command_await_service_request_send_service_accept: Received INITIAL UE MESSAGE does not conform"); return; } vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[f_NGAP_getIEIndex(vc_recvNGAP_PDU, id_RAN_UE_NGAP_ID)].value_.rAN_UE_NGAP_ID; Loading Loading
etc/AtsNGAP/AtsNGAP_GNB_p_net.cfg_ +4 −0 Changes for etc/AtsNGAP/AtsNGAP_GNB_p_net.cfg_: 4 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 LibNGAP_Pixits.PX_TIME_ZONE := '80'O # 0x40 for GMT+1, 0x80 for GMT+2 # User plane probe (TC_NGAP_GNB_PDU_01): the UPF tunnel endpoint given to the gNB is this host on N3, and the UE pings it LibNGAP_Pixits.PX_TRANSPORT_LAYER_ADDRESS := '00001010101011100001001100001110'B # 10.174.19.14 LibNGAP_Pixits.PX_UT_PING_HOST := "10.174.19.14" LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 LibNGAP_Pixits.PX_NR_ENCRYPTION_ALGORITHMS := '1110000000000000'B Loading
ttcn/AtsNGAP/NGAP_Steps.ttcn +41 −0 Changes for ttcn/AtsNGAP/NGAP_Steps.ttcn: 41 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -847,6 +847,47 @@ module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NG return true; } // End of function f_NGAP_gnb_UE_await_data_call /** * @brief Have the real UE send user plane traffic over its data call: ping PX_UT_PING_HOST. * @details Unless PX_UT_PING_HOST is empty: asks the upper tester for PING (AT+QPING on the modem, * PX_UT_PING_COUNT echo requests, PX_UT_PING_TIMEOUT s each) and waits for its result, which is * only logged. The gNB is expected to forward the echo requests as uplink G-PDUs to the UPF * tunnel endpoint of the PDU session (PX_TRANSPORT_LAYER_ADDRESS, PX_GTP_TEID); as the test * system does not handle GTP-U yet, no reply comes back, and only a capture on the test system * host (UDP port 2152) shows whether they arrived. * The UE stays in CM-CONNECTED meanwhile: no NGAP signalling is expected. * @note The verdict is set by the UT dispatcher only (NGAP_UtDispatcher): inconc if the modem could not * run the pings at all (e.g. the context of the data call is not usable by AT+QPING); lost * replies are not a failure. * @return true if the modem ran the pings. */ function f_NGAP_gnb_UE_ping() runs on gNBNGAPComponent return boolean { var UT_COMMON_CNF v_cnf; timer t_ping := int2float(PX_UT_PING_COUNT * PX_UT_PING_TIMEOUT) + 30.0; if (PX_UT_PING_HOST == "") { return false; } log(">>> f_NGAP_gnb_UE_ping: ", PX_UT_PING_HOST, ", ", PX_UT_PING_COUNT, " echo requests"); fl_UT_ApplyCommand(utPtcMtcPort, cas_UT_Req(PING, CNF_REQUIRED, { cs_Ut_Parameter_Common("HOST", PX_UT_PING_HOST), cs_Ut_Parameter_Common("COUNT", int2str(PX_UT_PING_COUNT)), cs_Ut_Parameter_Common("TIMEOUT", int2str(PX_UT_PING_TIMEOUT)) }), true); t_ping.start; alt { [] utPtcMtcPort.receive(car_UT_COMMON_CNF) -> value v_cnf { t_ping.stop; } [] t_ping.timeout { log("*** " & __SCOPE__ & ": INFO: no ping result from the upper tester ***"); return false; } } log("*** " & __SCOPE__ & ": INFO: ping ", PX_UT_PING_HOST, " result: ", v_cnf, " ***"); return v_cnf.Result; } // End of function f_NGAP_gnb_UE_ping /** * @brief Leave the real UE in a known state at the end of a test: deregistered, in flight mode. * @details Unless PX_UT_DEREGISTER_TIMEOUT is 0.0: asks the upper tester to switch the modem to flight Loading
ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +4 −0 Changes for ttcn/AtsNGAP/NGAP_TCFunctions.ttcn: 4 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -179,6 +179,10 @@ module NGAP_TCFunctions { if (PICS_USE_AT_COMMANDS and v_setup) { if (not f_NGAP_gnb_UE_await_data_call()) { log("*** " & __SCOPE__ & ": INCONC: the PDU session is set up, but the UE data call is not connected. ***"); } else if (f_NGAP_gnb_UE_ping()) { // User plane probe: the echo requests must reach PX_TRANSPORT_LAYER_ADDRESS as uplink // G-PDUs (check with a capture on UDP port 2152); not checked by the test yet log("*** " & __SCOPE__ & ": INFO: user plane traffic sent by the UE ***"); } } } Loading
ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +10 −0 Changes for ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn: 10 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -750,6 +750,16 @@ module LibNGAP_Pixits { * see f_NGAP_gnb_UE_Deregister. 0.0 to leave the UE as it is at the end of the test */ modulepar float PX_UT_DEREGISTER_TIMEOUT := 10.0; /** @desc Host the real UE pings over its data call once the PDU session is set up, to generate user plane traffic * (uplink G-PDUs towards PX_TRANSPORT_LAYER_ADDRESS); empty to send no traffic. See f_NGAP_gnb_UE_ping */ modulepar charstring PX_UT_PING_HOST := ""; /** @desc Number of echo requests sent by the real UE (1..10); see f_NGAP_gnb_UE_ping */ modulepar integer PX_UT_PING_COUNT := 4; /** @desc Time, in seconds, the real UE waits for each echo reply (1..255); see f_NGAP_gnb_UE_ping */ modulepar integer PX_UT_PING_TIMEOUT := 4; /** @desc Whether, after its restart (AT+CFUN=1,1), the real UE (AT commands) is set to full functionality (AT+CFUN=1) and * forced onto PX_UT_PLMN_MCC/PX_UT_PLMN_MNC (AT+COPS=1); see f_NGAP_gnb_UE_Register. * false: it is only restarted, and registers by itself on the PLMN it selects. */ Loading
ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +10 −5 Changes for ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn: 10 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -1609,6 +1609,8 @@ module LibNGAP_Functions { '00000001'O, omit )))); setverdict(pass, "Sent RETRIEVE_UE_INFORMATION NAS message"); // Await UEInformationTransfer f_recv_NGAP_PDU( mw_ngap_initMsg( Loading @@ -1618,6 +1620,7 @@ module LibNGAP_Functions { PX_AMF_POINTER, ? )))); setverdict(pass) } /** Loading Loading @@ -1662,7 +1665,7 @@ module LibNGAP_Functions { m_tAI ))))); setverdict(pass); setverdict(pass, "Sent UplinkNASTransport NAS message"); } /** Loading Loading @@ -1691,6 +1694,7 @@ module LibNGAP_Functions { vc_RAN_UE_ID, ? ))); setverdict(pass, "Received UERadioCapabilityInfoIndication NAS message"); } [] N2_gNBaMF_P.check(receive(NGAP_PDU: ?)) { // continue Loading @@ -1716,7 +1720,7 @@ module LibNGAP_Functions { setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_COMPLETE"); setverdict(pass); setverdict(pass, "Received REGISTRATION_COMPLETE NAS message"); } log("<<< f_await_registration_complete"); Loading Loading @@ -1799,7 +1803,7 @@ module LibNGAP_Functions { m_tAI ))))); setverdict(pass); setverdict(pass, "Sent PDU_SESSION_ESTABLISHMENT_REQUEST NAS message"); log("<<< f_send_pdu_session_establishment_request"); } Loading Loading @@ -1828,10 +1832,10 @@ module LibNGAP_Functions { var O1_Type v_pti; if (not f_get_pdu_session_establishment_request_ids(v_psi, v_pti)) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch."); setverdict(fail); setverdict(fail, "Received PDU_SESSION_ESTABLISHMENT_REQUEST NAS message"); } else { log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_REQUEST"); setverdict(pass); setverdict(pass, "Received PDU_SESSION_ESTABLISHMENT_REQUEST NAS message"); } } Loading Loading @@ -2016,6 +2020,7 @@ module LibNGAP_Functions { } )); if (not f_NGAP_check_received_PDU(mw_ngap_initMsg(mw_n2_initialUeMessage_conformant), "INITIAL UE MESSAGE")) { log("f_send_ue_context_release_command_await_service_request_send_service_accept: Received INITIAL UE MESSAGE does not conform"); return; } vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[f_NGAP_getIEIndex(vc_recvNGAP_PDU, id_RAN_UE_NGAP_ID)].value_.rAN_UE_NGAP_ID; Loading