pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42473?usp=email )
Change subject: 5gc: Introduce tests TC_ng_register_ping46(_256) ......................................................................
5gc: Introduce tests TC_ng_register_ping46(_256)
Depends: osmo-uecups.git Change-Id Ic2da7a761a8df7e006fc02ca6557a48f371e4151 Change-Id: I9cb250f07ac356b7345a570ed71590f041168ed2 --- M 5gc/C5G_Tests.ttcn M 5gc/ConnHdlr.ttcn M 5gc/expected-results.xml M deps/Makefile 4 files changed, 113 insertions(+), 31 deletions(-)
Approvals: fixeria: Looks good to me, but someone else must approve osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified pespin: Looks good to me, approved
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index 7274daf..0aa24a5 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -91,7 +91,8 @@ cn_gtpu_ip := omit, cn_gtpu_teid := omit, qos_rules := omit, - ue_ip := omit, + ue_ip4 := omit, + ue_ip6 := omit, ipv6_interface_id := omit };
@@ -399,7 +400,7 @@ f_register(); f_pdu_sess_establish(pdu_sess_type := c_PDU_SessionType_IPv4); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); f_pdu_sess_release(); f_deregister(); } @@ -433,7 +434,7 @@ f_register(); f_pdu_sess_establish(pdu_sess_type := c_PDU_SessionType_IPv6); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); f_pdu_sess_release(); f_deregister(); } @@ -465,6 +466,44 @@ } }
+private function f_TC_register_ping46() runs on ConnHdlr { + f_register(); + f_pdu_sess_establish(pdu_sess_type := c_PDU_SessionType_IPv4v6); + f_sleep(1.0); + f_ping(mp_ping_hostname); + /* Give some extra time for previous commands on all ConnHdlr finish, + * so we don't run out of PIDs in the PID table of GTPv1U_Emulation: */ + f_sleep(5.0); + f_ping(mp_ping_hostname6); + f_pdu_sess_release(); + f_deregister(); +} +testcase TC_ng_register_ping46() runs on MTC_CT { + f_init(); + f_ngap_setup(0); + + var ConnHdlrPars pars := f_init_pars(ue_idx := 0); + var ConnHdlr vc_conn; + vc_conn := f_start_handler_with_pars(refers(f_TC_register_ping46), pars); + vc_conn.done; +} +testcase TC_ng_register_ping46_256() runs on MTC_CT { + var ConnHdlr vc_conn[256]; + var integer i; + + f_init(); + f_ngap_setup(0); + + for (i := 0; i < sizeof(vc_conn); i := i + 1) { + var ConnHdlrPars pars := f_init_pars(ue_idx := i); + vc_conn[i] := f_start_handler_with_pars(refers(f_TC_register_ping46), pars); + } + + for (i := 0; i < sizeof(vc_conn); i := i + 1) { + vc_conn[i].done; + } +} + /* 3GPP TS 23.502 4.2.3.2 UE Triggered Service Request. * UE signals the active session as active, and it has UL data for it */ private function f_TC_ue_service_request_cm_idle_ul_data() runs on ConnHdlr { @@ -565,7 +604,7 @@ /* NOTE: In theory we should generate DL-originated traffic here, but since * UPF let our UL traffic pass (bug?), make use of it to generate some DL * traffic (ping reply) triggering the Paging: */ - var integer pid := f_ping4_async(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname, interval := 1, count := 1); + var integer pid := f_ping_async(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname, interval := 1, count := 1);
NGAP.receive(mw_ngap_initMsg(mw_n2_Paging(?, ?))); log("Rx Paging") @@ -666,7 +705,7 @@ f_register(exp_registration_accept := exp_registration_accept); f_pdu_sess_establish(request_type := c_RequestType_initial_emergency_request); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); f_pdu_sess_release(); f_deregister(); } @@ -733,7 +772,7 @@ exp_registration_accept := exp_registration_accept); f_pdu_sess_establish(request_type := c_RequestType_initial_emergency_request); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); f_pdu_sess_release(); f_deregister(); } @@ -752,7 +791,7 @@ f_register(); f_pdu_sess_establish(); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
var NG_NAS_UE_State nus := f_ngap_obtain_nus(g_pars.ue_pars.ran_id);
@@ -775,7 +814,8 @@ g_pars.ue_pars.sess_pars.cn_gtpu_ip := ho_xn_pars.sess_pars.cn_gtpu_ip; g_pars.ue_pars.sess_pars.cn_gtpu_teid := ho_xn_pars.sess_pars.cn_gtpu_teid; g_pars.ue_pars.sess_pars.qos_rules := ho_xn_pars.sess_pars.qos_rules; - g_pars.ue_pars.sess_pars.ue_ip := ho_xn_pars.sess_pars.ue_ip; + g_pars.ue_pars.sess_pars.ue_ip4 := ho_xn_pars.sess_pars.ue_ip4; + g_pars.ue_pars.sess_pars.ue_ip6 := ho_xn_pars.sess_pars.ue_ip6; g_pars.kset_id := ho_xn_pars.kset_id;
f_n2_path_switch(ho_xn_pars.source_amf_id); @@ -783,7 +823,7 @@ f_sleep(1.0);
f_pdu_sess_create_tun(); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
f_pdu_sess_release(); f_deregister(); @@ -815,7 +855,7 @@ f_register(); f_pdu_sess_establish(); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
var NG_NAS_UE_State nus := f_ngap_obtain_nus(g_pars.ue_pars.ran_id);
@@ -850,7 +890,8 @@ g_pars.ue_pars.pti := ho_n2_pars.pti; g_pars.ue_pars.sess_pars.id := ho_n2_pars.sess_pars.id; g_pars.ue_pars.sess_pars.qos_rules := ho_n2_pars.sess_pars.qos_rules; - g_pars.ue_pars.sess_pars.ue_ip := ho_n2_pars.sess_pars.ue_ip; + g_pars.ue_pars.sess_pars.ue_ip4 := ho_n2_pars.sess_pars.ue_ip4; + g_pars.ue_pars.sess_pars.ue_ip6 := ho_n2_pars.sess_pars.ue_ip6; g_pars.kset_id := ho_n2_pars.kset_id;
@@ -867,7 +908,7 @@ f_sleep(1.0);
f_pdu_sess_create_tun(); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
f_pdu_sess_release(); f_deregister(); @@ -899,7 +940,7 @@ f_register(); f_pdu_sess_establish(); f_sleep(1.0); - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
/* 3GPP TS 23.502 4.9.1.3.2 step 1: */ f_n2_handover_required(m_targetID_targetRANNodeID(m_targetRANNodeID(g_pars.ngran_pars[1].global_ngran_id, @@ -911,7 +952,7 @@ f_n2_handover_cancel();
/* Test UE can still use the network after HO cancel: */ - f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
f_pdu_sess_release(); f_deregister(); @@ -1012,6 +1053,9 @@ execute( TC_ng_register_ping6() ); execute( TC_ng_register_ping6_256() );
+ execute( TC_ng_register_ping46() ); + execute( TC_ng_register_ping46_256() ); + execute( TC_ue_service_request_cm_idle_ul_data() ); execute( TC_ue_service_request_cm_idle_inact_sess() ); execute( TC_ue_service_request_cm_idle_unknown_sess_active() ); @@ -1072,7 +1116,6 @@ * - 3GPP TS 23.502 Annex G (normative): Support of GERAN/UTRAN access by SMF+PGW-C: Not supported by open5gs (Gn<->N7 (to PCF) in open5gs-smfd) * * - Emergency call (PDU Sess Establish "Request Type"="Emergency Request") - * - PDU Session Type IPv4v6 * - VoLTE: * -- " If the UE requested P-CSCF discovery then the message shall also include the P-CSCF IP address(es) as determined by the SMF and as described in clause 5.16.3.4 of TS 23.50" * - Fill in PCO during PDU Sess Establish Req. diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn index cfd8c5a..a90bc64 100644 --- a/5gc/ConnHdlr.ttcn +++ b/5gc/ConnHdlr.ttcn @@ -73,7 +73,8 @@ charstring cn_gtpu_ip optional, OCT4 cn_gtpu_teid optional, QoS_RuleList qos_rules optional, - charstring ue_ip optional, + charstring ue_ip4 optional, + charstring ue_ip6 optional, octetstring ipv6_interface_id optional };
@@ -539,8 +540,8 @@ log("5GC assigned IPv6 global prefix: ", ipv6slaac_ind.ipv6_prefix, " -> ", f_inet6_ntoa(ipv6slaac_ind.ipv6_prefix & '0000000000000000'O));
/* Use the first global IPv6 address in the IPv6 prefix picked by osmo-uecups: */ - g_pars.ue_pars.sess_pars.ue_ip := f_inet6_ntoa(ipv6slaac_ind.ipv6_user_addr); - log("Using IPv6 global address: ", g_pars.ue_pars.sess_pars.ue_ip); + g_pars.ue_pars.sess_pars.ue_ip6 := f_inet6_ntoa(ipv6slaac_ind.ipv6_user_addr); + log("Using IPv6 global address: ", g_pars.ue_pars.sess_pars.ue_ip6); }
/* 3GPP TS 23.502 4.3.2.2 UE Requested PDU Session Establishment */ @@ -574,8 +575,8 @@ log("5GC assigned CN GTPU Address: ", g_pars.ue_pars.sess_pars.cn_gtpu_ip, " TEID: ", g_pars.ue_pars.sess_pars.cn_gtpu_teid); select (pdu_sess_type) { case (c_PDU_SessionType_IPv4) { - g_pars.ue_pars.sess_pars.ue_ip := f_inet_ntoa(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo); - log("5GC assigned UE IPv4 address: ", g_pars.ue_pars.sess_pars.ue_ip); + g_pars.ue_pars.sess_pars.ue_ip4 := f_inet_ntoa(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo); + log("5GC assigned UE IPv4 address: ", g_pars.ue_pars.sess_pars.ue_ip4); if (configure_userplane) { f_pdu_sess_create_tun(IPV4); } @@ -585,13 +586,28 @@ log("5GC assigned IPv6 Interface Id: ", g_pars.ue_pars.sess_pars.ipv6_interface_id); /* Use the link-local address for now: */ var octetstring ll_addr := 'FE80000000000000'O & g_pars.ue_pars.sess_pars.ipv6_interface_id; - g_pars.ue_pars.sess_pars.ue_ip := f_inet6_ntoa(ll_addr); - log("5GC assigned IPv6 link-local Address: ", g_pars.ue_pars.sess_pars.ue_ip); + g_pars.ue_pars.sess_pars.ue_ip6 := f_inet6_ntoa(ll_addr); + log("5GC assigned IPv6 link-local Address: ", g_pars.ue_pars.sess_pars.ue_ip6); if (configure_userplane) { f_pdu_sess_create_tun(IPV6); f_perform_ipv6_slaac(); } } + case (c_PDU_SessionType_IPv4v6) { + var octetstring eua_v6 := substr(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo, 0, 8); + var octetstring eua_v4 := substr(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo, 8, 4); + g_pars.ue_pars.sess_pars.ue_ip4 := f_inet_ntoa(eua_v4); + log("5GC assigned UE IPv4 address: ", g_pars.ue_pars.sess_pars.ue_ip4); + g_pars.ue_pars.sess_pars.ipv6_interface_id := eua_v6; + log("5GC assigned IPv6 Interface Id: ", g_pars.ue_pars.sess_pars.ipv6_interface_id); + var octetstring ll_addr := 'FE80000000000000'O & g_pars.ue_pars.sess_pars.ipv6_interface_id; + g_pars.ue_pars.sess_pars.ue_ip6 := f_inet6_ntoa(ll_addr); + log("5GC assigned IPv6 link-local Address: ", g_pars.ue_pars.sess_pars.ue_ip6); + if (configure_userplane) { + f_pdu_sess_create_tun(IPV4V6); + f_perform_ipv6_slaac(); + } + } case (?) { setverdict(fail, "PDU Session Type not implemented"); } @@ -1291,7 +1307,8 @@ }
g_pars.ue_pars.sess_pars.qos_rules := omit; - g_pars.ue_pars.sess_pars.ue_ip := omit; + g_pars.ue_pars.sess_pars.ue_ip4 := omit; + g_pars.ue_pars.sess_pars.ue_ip6 := omit;
nas_ul_msg := cs_NG_PDU_SESSION_RELEASE_COMPLETE(cs_NG_PDU_SessionIdV(pdu_sess_id), pti, p_Cause := cs_GMM_GSM_Cause('59'O, cause_val)); @@ -1310,7 +1327,7 @@ var template (value) UECUPS_GtpExtHdr gtp_ext_hdr; var template (value) UECUPS_CreateTun uecups_create; var template (value) UECUPS_GtpExtHdr_PduSessContainer pdu_sess_cont; - var template (value) OCT4_16n user_addr; + var template (value) OCT4_20n user_addr;
/* First of all, register the local TEID in the GTPv1U_Emulation: */ f_gtp1u_register_teid(g_pars.ue_pars.sess_pars.ran_gtpu_teid); @@ -1321,10 +1338,14 @@
select (valueof(user_addr_type)) { case (IPV4) { - user_addr := f_inet_addr(g_pars.ue_pars.sess_pars.ue_ip); + user_addr := f_inet_addr(g_pars.ue_pars.sess_pars.ue_ip4); } case (IPV6) { - user_addr := f_inet6_addr(g_pars.ue_pars.sess_pars.ue_ip); + user_addr := f_inet6_addr(g_pars.ue_pars.sess_pars.ue_ip6); + } + case (IPV4V6) { + user_addr := f_inet_addr(g_pars.ue_pars.sess_pars.ue_ip4) & + f_inet6_addr(g_pars.ue_pars.sess_pars.ue_ip6); } }
@@ -1373,21 +1394,37 @@ }
/* execute ping command and wait for result */ -function f_ping4(charstring host, integer interval := 1, integer count := 10) runs on ConnHdlr +function f_ping(charstring host, integer interval := 1, integer count := 10) runs on ConnHdlr { /* command will be filled in by f_gtp1u_ping4() below: */ var UECUPS_StartProgram sprog := f_run_prog_init(""); - f_gtp1u_ping4(sprog, host, interval, count, g_pars.ue_pars.sess_pars.ue_ip, + var charstring bind_addr; + + if (f_addr_is_ipv6(host)) { + bind_addr := g_pars.ue_pars.sess_pars.ue_ip6; + } else { + bind_addr := g_pars.ue_pars.sess_pars.ue_ip4; + } + + f_gtp1u_ping4(sprog, host, interval, count, bind_addr, redirect_output := true, redirect_output_path_prefix := f_run_prog_unique_log_path()); }
-function f_ping4_async(charstring host, integer interval := 1, integer count := 10) runs on ConnHdlr return integer +function f_ping_async(charstring host, integer interval := 1, integer count := 10) runs on ConnHdlr return integer { /* command will be filled in by f_gtp1u_ping4() below: */ var UECUPS_StartProgram sprog := f_run_prog_init(""); + var charstring bind_addr; + + if (f_addr_is_ipv6(host)) { + bind_addr := g_pars.ue_pars.sess_pars.ue_ip6; + } else { + bind_addr := g_pars.ue_pars.sess_pars.ue_ip4; + } + var integer pid := f_gtp1u_ping4_async(sprog, host, - interval, count, g_pars.ue_pars.sess_pars.ue_ip, + interval, count, bind_addr, redirect_output := true, redirect_output_path_prefix := f_run_prog_unique_log_path()); return pid; diff --git a/5gc/expected-results.xml b/5gc/expected-results.xml index 9827df5..8581cf0 100644 --- a/5gc/expected-results.xml +++ b/5gc/expected-results.xml @@ -12,6 +12,8 @@ <testcase classname='C5G_Tests' name='TC_ng_register_ping4_256' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ng_register_ping6' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ng_register_ping6_256' time='MASKED'/> + <testcase classname='C5G_Tests' name='TC_ng_register_ping46' time='MASKED'/> + <testcase classname='C5G_Tests' name='TC_ng_register_ping46_256' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ue_service_request_cm_idle_ul_data' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ue_service_request_cm_idle_inact_sess' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ue_service_request_cm_idle_unknown_sess_active' time='MASKED'/> diff --git a/deps/Makefile b/deps/Makefile index d7aeed1..61dfe48 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -124,7 +124,7 @@ titan.TestPorts.UDPasp_commit= 54176e95850654e5e8b0ffa2f1b5f35c412b949c titan.TestPorts.UNIX_DOMAIN_SOCKETasp_commit= R.2.A-13-gd34ab71 titan.TestPorts.USB_commit= a9470fdc99c82fbf988f4508c3161118c9106e28 -osmo-uecups_commit= ca90fa48b8d44e241f55b1d15c9b7c8631ac4e69 +osmo-uecups_commit= ee9b225a66c2f84bcdcaf2fc27ee73d6aeb33b8e
all: $(foreach dir,$(ALL_REPOS),$(dir)/update) clean: $(foreach dir,$(ALL_REPOS),$(dir)/clean)