pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42460?usp=email )
Change subject: 5gc: Introduce tests TC_ng_register_ping6(_256) ......................................................................
5gc: Introduce tests TC_ng_register_ping6(_256)
Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f --- M 5gc/C5G_Tests.ttcn M 5gc/ConnHdlr.ttcn M 5gc/expected-results.xml M 5gc/open5gs/open5gs-upf.yaml M 5gc/testenv.sh 5 files changed, 109 insertions(+), 12 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/60/42460/1
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index e90369f..c58d411 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -65,6 +65,7 @@ charstring mp_apn := "internet"; charstring mp_local_gtpu_ip := "127.0.0.20"; charstring mp_ping_hostname := "10.45.0.1"; + charstring mp_ping_hostname6 := "cafe::1";
charstring mp_run_prog_log_path := "/tmp"; charstring mp_run_prog_as_user := "osmocom"; @@ -90,7 +91,8 @@ cn_gtpu_ip := omit, cn_gtpu_teid := omit, qos_rules := omit, - ue_ip := omit + ue_ip := omit, + ipv6_interface_id := omit };
template (value) UeParams ts_UeParams(integer idx) := @@ -427,6 +429,42 @@ } }
+private function f_TC_register_ping6() runs on ConnHdlr { + 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_pdu_sess_release(); + f_deregister(); +} +testcase TC_ng_register_ping6() runs on MTC_CT { + f_init(); + f_ngap_setup(0); + + var ConnHdlrPars pars := f_init_pars(ue_idx := 0); + pars.ue_pars.sess_pars.run_prog_pars.ping_hostname := mp_ping_hostname6; + var ConnHdlr vc_conn; + vc_conn := f_start_handler_with_pars(refers(f_TC_register_ping6), pars); + vc_conn.done; +} +testcase TC_ng_register_ping6_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); + pars.ue_pars.sess_pars.run_prog_pars.ping_hostname := mp_ping_hostname6; + vc_conn[i] := f_start_handler_with_pars(refers(f_TC_register_ping6), 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 { @@ -971,6 +1009,9 @@ execute( TC_ng_register_ping4() ); execute( TC_ng_register_ping4_256() );
+ execute( TC_ng_register_ping6() ); + execute( TC_ng_register_ping6_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() ); diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn index 8937465..cf56caa 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_ip optional, + octetstring ipv6_interface_id optional };
/* parameters of emulated UE */ @@ -525,6 +526,23 @@ } }
+private function f_perform_ipv6_slaac() runs on ConnHdlr +{ + var UECUPS_IPv6SLAACInd ipv6slaac_ind; + var template (value) UECUPS_IPv6SLAAC ipv6slaac; + ipv6slaac := ts_UECUPS_IPv6SLAAC( + local_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(g_pars.ue_pars.sess_pars.ran_gtpu_ip))), + rx_teid := oct2int(g_pars.ue_pars.sess_pars.ran_gtpu_teid) + ); + f_gtp1u_ipv6_slaac(ipv6slaac); + GTP1U[0].receive(UECUPS_IPv6SLAACInd:?) -> value ipv6slaac_ind; + 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); +} + /* 3GPP TS 23.502 4.3.2.2 UE Requested PDU Session Establishment */ function f_pdu_sess_establish(BIT3 request_type := c_RequestType_initial_request, BIT3 pdu_sess_type := c_PDU_SessionType_IPv4, @@ -553,12 +571,30 @@ inner_nas := f_dec_NG_NAS_DL_Message_Payload_Container(rx_nas.dl_Nas_Transport.payloadContainerType.container, rx_nas.dl_Nas_Transport.payload.payload); g_pars.ue_pars.sess_pars.qos_rules := inner_nas.pdu_Session_Establishment_Accept.authorizedQoSRules.listofQoSRules; - g_pars.ue_pars.sess_pars.ue_ip := f_inet_ntoa(inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo); 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); - log("5GC assigned UE IP address: ", g_pars.ue_pars.sess_pars.ue_ip); - - if (configure_userplane) { - f_pdu_sess_create_tun(); + 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); + if (configure_userplane) { + f_pdu_sess_create_tun(IPV4); + } + } + case (c_PDU_SessionType_IPv6) { + g_pars.ue_pars.sess_pars.ipv6_interface_id := inner_nas.pdu_Session_Establishment_Accept.pduAddress.adressInfo + 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); + if (configure_userplane) { + f_pdu_sess_create_tun(IPV6); + f_perform_ipv6_slaac(); + } + } + case (?) { + setverdict(fail, "PDU Session Type not implemented"); + } } }
@@ -1270,20 +1306,34 @@ } }
-function f_pdu_sess_create_tun() runs on ConnHdlr { +function f_pdu_sess_create_tun(template (value) UECUPS_AddrType user_addr_type := IPV4) runs on ConnHdlr { 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; + + /* First of all, register the local TEID in the GTPv1U_Emulation: */ + f_gtp1u_register_teid(g_pars.ue_pars.sess_pars.ran_gtpu_teid);
pdu_sess_cont := ts_UECUPS_GtpExtHdr_PduSessContainer(UECUPS_GtpExtHdr_PduSessContainer_Type_ul_pdu_sess_info, oct2int(g_pars.ue_pars.sess_pars.qos_rules[0].identifier)); gtp_ext_hdr := ts_UECUPS_GtpExtHdr(pdu_session_container := pdu_sess_cont);
+ select (valueof(user_addr_type)) { + case (IPV4) { + user_addr := f_inet_addr(g_pars.ue_pars.sess_pars.ue_ip); + } + case (IPV6) { + //user_addr := g_pars.ue_pars.sess_pars.ipv6_interface_id; + user_addr := f_inet6_addr(g_pars.ue_pars.sess_pars.ue_ip); + } + } + uecups_create := ts_UECUPS_CreateTun( tx_teid := oct2int(g_pars.ue_pars.sess_pars.cn_gtpu_teid), rx_teid := oct2int(g_pars.ue_pars.sess_pars.ran_gtpu_teid), - user_addr_type := IPV4, - user_addr := f_inet_addr(g_pars.ue_pars.sess_pars.ue_ip), + user_addr_type := user_addr_type, + user_addr := user_addr, local_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(g_pars.ue_pars.sess_pars.ran_gtpu_ip))), remote_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(g_pars.ue_pars.sess_pars.cn_gtpu_ip))), tun_dev_name := g_pars.ue_pars.sess_pars.run_prog_pars.tun_dev_name, diff --git a/5gc/expected-results.xml b/5gc/expected-results.xml index bc47001..9827df5 100644 --- a/5gc/expected-results.xml +++ b/5gc/expected-results.xml @@ -10,6 +10,8 @@ <testcase classname='C5G_Tests' name='TC_pdu_sess_modification' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ng_register_ping4' time='MASKED'/> <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_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/5gc/open5gs/open5gs-upf.yaml b/5gc/open5gs/open5gs-upf.yaml index c6c86d4..29c88a6 100644 --- a/5gc/open5gs/open5gs-upf.yaml +++ b/5gc/open5gs/open5gs-upf.yaml @@ -22,8 +22,8 @@ gateway: 10.45.0.1 dnn: internet dev: ogstun46 - - subnet: cafe::/64 - gateway: cafe::1 + - subnet: 2001:db8:cafe::/48 + gateway: 2001:db8:cafe::1 dnn: internet dev: ogstun46 metrics: diff --git a/5gc/testenv.sh b/5gc/testenv.sh index 25e1b71..b12a2c3 100755 --- a/5gc/testenv.sh +++ b/5gc/testenv.sh @@ -38,6 +38,10 @@ sudo ip link set ogstun4 up sudo ip link set ogstun6 up sudo ip link set ogstun46 up + + # The IPv4 route is added automatically when setting the interface addr above: + sudo ip route add "10.45.0.0/16" dev "ogstun46" || true + sudo ip -6 route add "2001:db8:cafe::/48" dev "ogstun46" || true }
del_tun() {