laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36074?usp=email )
Change subject: PGW_Tests: refactor/improve several parameters to accomodate for different GTPv2C interfaces ......................................................................
PGW_Tests: refactor/improve several parameters to accomodate for different GTPv2C interfaces
So far we were only testing s5/s8 interface, but we'll want to test s2b soon. This commit is a mixture of refactorings and code improvements as a step towards testing S2b interface.
Change-Id: I22b3e18d02ca828e2ea43bde2e0a602db236cf50 --- M library/GTPv2_Templates.ttcn M pgw/PGW_Tests.ttcn 2 files changed, 94 insertions(+), 52 deletions(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved osmith: Looks good to me, but someone else must approve
diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn index 8df234a..431415a 100644 --- a/library/GTPv2_Templates.ttcn +++ b/library/GTPv2_Templates.ttcn @@ -887,13 +887,14 @@ template (value) octetstring apn, template (value) BIT3 pdn_type, template (omit) FullyQualifiedTEID_List teid_list, template (value) OCT2 chg_car, template (value) uint4_t bearer_id, + template (omit) UserLocationInfo uli := omit, template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) := ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, { createSessionRequest := { iMSI := ts_GTP2C_Imsi(imsi), mSISDN := fs_GTP2C_msisdn(msisdn), mEI := omit, - userLocationInfo := omit, + userLocationInfo := uli, servingNetwork := omit, rAT_Type := ts_GTP2C_RatType(rat_type), indication := omit, diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn index 81fea12..bd32760 100644 --- a/pgw/PGW_Tests.ttcn +++ b/pgw/PGW_Tests.ttcn @@ -98,14 +98,6 @@ port DIAMETER_Conn_PT Gx; port DIAMETER_Conn_PT Gy;
- /* TEI (Data) local side */ - var OCT4 g_teid; - /* TEI (Control) local side */ - var OCT4 g_teic; - /* TEI (Data) remote side */ - var OCT4 g_teid_remote; - /* TEI (Control) remote side */ - var OCT4 g_teic_remote; /* GTP-U IPv4 address remote sie */ var OCT4 g_gtpu4_remote; var OCT16 g_gtpu6_remote; @@ -122,6 +114,15 @@ var integer g_start_prog_count := 0; }
+type record BearerConfig { + /* EPS Bearer ID */ + uint4_t ebi optional, + /* TEI (Data) local side */ + OCT4 teid_local optional, + /* TEI (Data) remote side */ + OCT4 teid_remote optional +}; + /* configuration data for a given Session */ type record SessionPars { hexstring imsi, @@ -138,7 +139,13 @@ /* APN-AMBR */ octetstring pco optional, octetstring epco optional, + + /* TEI (Control) local side */ + OCT4 teic_local, + /* TEI (Control) remote side */ + OCT4 teic_remote optional, /* Bearer Contexts to be created */ + BearerConfig bearer optional,
charstring tun_dev_name, charstring tun_netns_name optional, @@ -148,24 +155,28 @@ }
template (value) SessionPars -t_SessionPars(hexstring imsi, charstring tundev, integer rat_type := 6, charstring apn := "internet", +t_SessionPars(hexstring imsi, charstring tundev, template (omit) hexstring msisdn := '1234'H, integer rat_type := 6, charstring apn := "internet", boolean selection_mode := false, BIT3 pdn_type := '001'B) := { imsi := imsi, - msisdn := '1234'H, + msisdn := msisdn, rat_type := rat_type, apn := apn, selection_mode := selection_mode, pdn_type := pdn_type, pco := omit, epco := omit, + teic_local := '00000000'O, + teic_remote := omit, + bearer := { + ebi := 5, + teid_local := omit, + teid_remote := omit + }, tun_dev_name := tundev, tun_netns_name := tundev, gy_validity_time := 0 }
-type record BearerConfig { - integer eps_bearer_id -}
type function void_fn() runs on PGW_Session_CT;
@@ -292,6 +303,9 @@ private function f_handler_init(void_fn fn, SessionPars pars) runs on PGW_Session_CT { g_pars := valueof(pars); + /* allocate + register TEID-C on local side */ + g_pars.teic_local := f_gtp2_allocate_teid(); + g_pars.bearer.teid_local := g_pars.teic_local; fn.apply(); }
@@ -346,8 +360,8 @@ imsi := char2oct(f_dec_TBCD(imsi_hex2oct(g_pars.imsi))); //msisdn := char2oct(f_dec_TBCD(substr(ctx_val.msisdn, 1, lengthof(ctx_val.msisdn) -1))); rat_type := int2oct(g_pars.rat_type, 1); - charging_char := char2oct(oct2str('0000'O)); // f_create_session() uses hardcoded chg_car := '0000'O - nsapi := '01'O; // f_create_session() uses hardcoded bearer_id := 1 + charging_char := char2oct(oct2str('0000'O)); // f_s5s8_create_session() uses hardcoded chg_car := '0000'O + nsapi := int2oct(g_pars.bearer.ebi, 1); select (req_type) { case (INITIAL_REQUEST) { tpl := tr_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control, @@ -550,7 +564,7 @@ /* find F-TEID of the P-GW U side */ var FullyQualifiedTEID rx_fteid; rx_fteid := valueof(f_find_teid(bctx.bearerContextIEs.fullyQualifiedTEID, 5, '0010'B)); - g_teid_remote := rx_fteid.tEID_GRE_Key; + g_pars.bearer.teid_remote := rx_fteid.tEID_GRE_Key; if (rx_fteid.v4_Flag == '1'B) { g_gtpu4_remote := rx_fteid.iPv4_Address; } @@ -559,8 +573,8 @@ }
var UECUPS_CreateTun uecups_create := { - tx_teid := oct2int(g_teid_remote), - rx_teid := oct2int(g_teid), + tx_teid := oct2int(g_pars.bearer.teid_remote), + rx_teid := oct2int(g_pars.bearer.teid_local), user_addr_type := IPV4, user_addr := '00000000'O, local_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(mp_local_hostname_u))), @@ -582,28 +596,22 @@ }
/* create a session on the PGW */ -private function f_create_session() runs on PGW_Session_CT { +private function f_create_session(template (value) FullyQualifiedTEID fteid_c_ie, + template (value) FullyQualifiedTEID fteid_u_ie, + template (omit) UserLocationInfo uli_ie := omit) runs on PGW_Session_CT { var PDU_GTPCv2 rx;
- /* allocate + register TEID-C on local side */ - g_teic := f_gtp2_allocate_teid(); - g_teid := g_teic; - - var template (value) FullyQualifiedTEID fteid_c_ie, fteid_u_ie; - fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_teic, 0, - f_inet_addr(mp_local_hostname_c), omit); - fteid_u_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPU, g_teid, 2, - f_inet_addr(mp_local_hostname_u), omit); var template (value) PDU_GTPCv2 g2c := - ts_GTP2C_CreateSessionReq(imsi := g_pars.imsi, msisdn := g_pars.msisdn, rat_type := 6, + ts_GTP2C_CreateSessionReq(imsi := g_pars.imsi, + msisdn := g_pars.msisdn, + rat_type := g_pars.rat_type, sender_fteid := fteid_c_ie, apn := f_enc_dns_hostname(g_pars.apn), - pdn_type := g_pars.pdn_type, teid_list := { fteid_u_ie }, - chg_car := '0000'O, bearer_id := 1); - /* open5gs up to 1.2.3 won't accept it without ULI, despite not mandatory */ - var template (value) TAI tai := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0001'O }; - var template (value) ECGI ecgi := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0'H, 23 }; - g2c.gtpcv2_pdu.createSessionRequest.userLocationInfo := ts_GTP2C_UserLocInfo(tai := tai, ecgi := ecgi); + pdn_type := g_pars.pdn_type, + teid_list := { fteid_u_ie }, + chg_car := '0000'O, + bearer_id := g_pars.bearer.ebi, + uli := uli_ie); g2c.gtpcv2_pdu.createSessionRequest.servingNetwork := ts_GTP2C_ServingNetwork('001'H, '01F'H);
GTP2.send(g2c); @@ -614,10 +622,10 @@ as_DIA_Gy_CCR(INITIAL_REQUEST); } alt { - [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:=Request_accepted)) -> value rx { + [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_pars.teic_local, cause:=Request_accepted)) -> value rx { /* extract TEIDs */ var CreateSessionResponse resp := rx.gtpcv2_pdu.createSessionResponse; - g_teic_remote := resp.fullyQualifiedTEID[0].tEID_GRE_Key; + g_pars.teic_remote := resp.fullyQualifiedTEID[0].tEID_GRE_Key;
/* extract allocated address[es] */ var PDN_Address_and_Prefix paa := resp.pDN_AddressAllocation.pDN_Address_and_Prefix; @@ -645,7 +653,7 @@ } } } - [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:=?)) -> value rx { + [] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_pars.teic_local, cause:=?)) -> value rx { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected CreateSessionResp(cause=", rx.gtpcv2_pdu.createSessionResponse.cause.causeValue, ")")); @@ -658,18 +666,38 @@
}
+/* create a session on the PGW on a S5/S8 interface (from SGW )*/ +private function f_s5s8_create_session() runs on PGW_Session_CT { + var template (value) FullyQualifiedTEID fteid_c_ie, fteid_u_ie; + var template (value) UserLocationInfo uli_ie; + + fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_pars.teic_local, 0, + f_inet_addr(mp_local_hostname_c), omit); + fteid_u_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPU, g_pars.bearer.teid_local, 2, + f_inet_addr(mp_local_hostname_u), omit); + + + /* open5gs up to 1.2.3 won't accept it without ULI, despite not mandatory */ + var template (value) TAI tai := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0001'O }; + var template (value) ECGI ecgi := { '0'H, '0'H, '1'H, 'F'H, '0'H, '1'H, '0'H, 23 }; + uli_ie := ts_GTP2C_UserLocInfo(tai := tai, ecgi := ecgi); + + f_create_session(fteid_c_ie, fteid_u_ie, uli_ie); + +} + /* delete the session from the PGW */ private function f_delete_session(template (omit) GTP2C_Cause tx_cause := omit, template (present) OCT4 exp_teid, template (present) GTP2C_Cause exp_cause, boolean expect_diameter := true) runs on PGW_Session_CT { var template (value) FullyQualifiedTEID fteid_c_ie - fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_teic, 0, + fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_pars.teic_local, 0, f_inet_addr(mp_local_hostname_c), omit); var template PDU_GTPCv2 g2c := - ts_GTP2C_DeleteSessionReq(d_teid := g_teic_remote, cause := tx_cause, + ts_GTP2C_DeleteSessionReq(d_teid := g_pars.teic_remote, cause := tx_cause, sender_fteid := fteid_c_ie, - teid_list := {}, bearer_id := 1); + teid_list := {}, bearer_id := g_pars.bearer.ebi);
GTP2.send(g2c); if (Gx.checkstate("Connected") and expect_diameter) { @@ -693,10 +721,10 @@ }
/* destroy tunnel in daemon */ - if (isbound(g_teid)) { + if (isbound(g_pars.bearer.teid_local)) { var UECUPS_DestroyTun uecups_destroy := { local_gtp_ep := valueof(ts_UECUPS_SockAddr(f_inet_addr(mp_local_hostname_u))), - rx_teid := oct2int(g_teid) + rx_teid := oct2int(g_pars.bearer.teid_local) }; /* FIXME: what about IPv4/IPv6 differentiation? */ f_gtp2_destroy_tunnel(uecups_destroy); @@ -803,7 +831,7 @@
/* create a session, expect it to succeed */ private function f_TC_createSession() runs on PGW_Session_CT { - f_create_session(); + f_s5s8_create_session(); setverdict(pass); } testcase TC_createSession() runs on PGW_Test_CT { @@ -816,7 +844,7 @@
/* create a session, then execute a ping command on the user plane */ private function f_TC_createSession_ping4() runs on PGW_Session_CT { - f_create_session(); + f_s5s8_create_session(); f_ping4(mp_ping_hostname); setverdict(pass); } @@ -847,8 +875,8 @@
/* create a session, then delete it again */ private function f_TC_createSession_deleteSession() runs on PGW_Session_CT { - f_create_session(); - f_delete_session(omit, g_teic, Request_accepted); + f_s5s8_create_session(); + f_delete_session(omit, g_pars.teic_local, Request_accepted); setverdict(pass); } testcase TC_createSession_deleteSession() runs on PGW_Test_CT { @@ -861,8 +889,7 @@
/* send a DeleteSessionReq for an unknown/invalid TEID */ private function f_TC_deleteSession_unknown() runs on PGW_Session_CT { - g_teic := f_gtp2_allocate_teid(); - g_teic_remote := f_rnd_octstring(4); + g_pars.teic_remote := f_rnd_octstring(4); f_delete_session(omit, '00000000'O, Context_Not_Found, false); setverdict(pass); } @@ -878,7 +905,7 @@ private function f_TC_gy_charging_cc_time() runs on PGW_Session_CT { var default d;
- f_create_session(); + f_s5s8_create_session();
/* We should receive an update even if no traffic is sent: */ as_DIA_Gy_CCR(UPDATE_REQUEST); @@ -894,7 +921,7 @@ as_DIA_Gy_CCR(UPDATE_REQUEST); f_validate_gy_cc_report(g_rx_gy, VALIDITY_TIME, (3..4), ?, ?);
- f_delete_session(omit, g_teic, Request_accepted); + f_delete_session(omit, g_pars.teic_local, Request_accepted); f_validate_gy_cc_report(g_rx_gy, FINAL, (0..1), 0, 0); setverdict(pass); }