pespin has uploaded this change for review.

View Change

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() {

To view, visit change 42460. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Iedf3697265b91bdda85e8d32402345ea8d58dc9f
Gerrit-Change-Number: 42460
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>