pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36108?usp=email )
Change subject: epdg: Introduce test TC_s2b_CreateSession_rejected ......................................................................
epdg: Introduce test TC_s2b_CreateSession_rejected
Related: OS#6371 Change-Id: Ide1df9e359b12094f82e54a7824c83f515aedcc3 --- M epdg/EPDG_Tests.ttcn M library/GTPv2_Templates.ttcn M mme/MME_Tests.ttcn 3 files changed, 91 insertions(+), 15 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/08/36108/1
diff --git a/epdg/EPDG_Tests.ttcn b/epdg/EPDG_Tests.ttcn index 1ff4629..8c0d7cd 100644 --- a/epdg/EPDG_Tests.ttcn +++ b/epdg/EPDG_Tests.ttcn @@ -499,24 +499,29 @@ return ts_GTP2C_APCO(apco_req.instance, proto_list_resp); }
+private function f_EPDG_ConnHdlr_parse_CreateSessionReq(PDU_GTPCv2 rx_msg) runs on EPDG_ConnHdlr { + var BearerContextIEs rx_bctx_ies; + + /* Parse TEIC and Bearer EBI and TEID and store it in g_pars */ + g_pars.teic_remote := rx_msg.gtpcv2_pdu.createSessionRequest.fullyQualifiedTEID[0].tEID_GRE_Key; + rx_bctx_ies := rx_msg.gtpcv2_pdu.createSessionRequest.bearerContextGrouped[0].bearerContextIEs; + g_pars.bearer.ebi := rx_bctx_ies.ePS_Bearer_ID.ePS_Bearer_ID_Value; + g_pars.bearer.teid_remote := rx_bctx_ies.fullyQualifiedTEID[0].tEID_GRE_Key; + + /* allocate + register TEID-C on local side */ + g_pars.teic_local := f_gtp2_allocate_teid(); + g_pars.bearer.teid_local := g_pars.teic_local; +} + /* ePDG Creates session at the PGW. PGW sends Diameter s6b AAR + AAA. */ private altstep as_GTP2C_CreateSession_success() runs on EPDG_ConnHdlr { var PDU_GTPCv2 rx_msg; - var BearerContextIEs rx_bctx_ies; var template (value) FullyQualifiedTEID fteid_c_ie, fteid_u_ie; var template (value) PDN_AddressAllocation paa; var template (value) BearerContextIEs bctx_ies;
[] GTP2.receive(tr_GTP2C_CreateSessionReq(g_pars.imsi, apco := f_exp_tr_GTP2C_APCO_in_CreateSessionReq())) -> value rx_msg { - /* Parse TEIC and Bearer EBI and TEID and store it in g_pars */ - g_pars.teic_remote := rx_msg.gtpcv2_pdu.createSessionRequest.fullyQualifiedTEID[0].tEID_GRE_Key; - rx_bctx_ies := rx_msg.gtpcv2_pdu.createSessionRequest.bearerContextGrouped[0].bearerContextIEs; - g_pars.bearer.ebi := rx_bctx_ies.ePS_Bearer_ID.ePS_Bearer_ID_Value; - g_pars.bearer.teid_remote := rx_bctx_ies.fullyQualifiedTEID[0].tEID_GRE_Key; - - /* allocate + register TEID-C on local side */ - g_pars.teic_local := f_gtp2_allocate_teid(); - g_pars.bearer.teid_local := g_pars.teic_local; + f_EPDG_ConnHdlr_parse_CreateSessionReq(rx_msg);
/* Upon rx of CreateSession, emulate PGW asking the AAA server. */ f_S6b_AA_success(); @@ -531,6 +536,7 @@ qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0), charging_id := ts_GTP2C_ChargingID(g_pars.teic_local)); GTP2.send(ts_GTP2C_CreateSessionResp(g_pars.teic_remote, rx_msg.sequenceNumber, + Request_accepted, { fteid_c_ie }, paa, { ts_GTP2C_BcGrouped(bctx_ies) }, f_GTPv2C_gen_APCO_response(rx_msg.gtpcv2_pdu.createSessionRequest.aPCO) )); @@ -541,6 +547,34 @@ } }
+/* ePDG Creates session at the PGW. PGW sends Diameter s6b AAR + AAA. */ +private altstep as_GTP2C_CreateSession_error(GTP2C_Cause resp_cause, boolean do_s6b_aar := false) runs on EPDG_ConnHdlr { + var PDU_GTPCv2 rx_msg; + var template (value) FullyQualifiedTEID fteid_c_ie, fteid_u_ie; + var template (value) PDN_AddressAllocation paa; + var template (value) BearerContextIEs bctx_ies; + + [] GTP2.receive(tr_GTP2C_CreateSessionReq(g_pars.imsi, apco := f_exp_tr_GTP2C_APCO_in_CreateSessionReq())) -> value rx_msg { + f_EPDG_ConnHdlr_parse_CreateSessionReq(rx_msg); + + /* Upon rx of CreateSession, emulate PGW asking the AAA server. */ + if (do_s6b_aar) { + f_S6b_AA_success(); + } + + fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S2b_PGW_GTPC, g_pars.teic_local, 1, + f_inet_addr(mp_s2b_local_ip), omit); + fteid_u_ie := ts_GTP2C_FTEID(FTEID_IF_S2bU_PGW_GTPU, g_pars.bearer.teid_local, 4, + f_inet_addr(mp_s2b_local_ip), omit); + GTP2.send(ts_GTP2C_CreateSessionResp(g_pars.teic_remote, rx_msg.sequenceNumber, + resp_cause)); + setverdict(pass); + } + [] GTP2.receive(PDU_GTPCv2:?) -> value rx_msg { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected GTP2C msg rx: ", rx_msg)); + } +} + /* ePDG Deletes session at the PGW. PGW sends Diameter s6b AAR + AAA. */ private altstep as_GTP2C_DeleteSession_success() runs on EPDG_ConnHdlr { var PDU_GTPCv2 rx_msg; @@ -693,6 +727,21 @@ setverdict(pass); }
+/* GSUP TunnelEPDG Tunnel Req + Resp, triggers S2b CreateSession Req + Response (rejected). */ +private function f_GSUP_EPDGTunnel_error() runs on EPDG_ConnHdlr { + var GSUP_PDU rx_gsup; + var template (value) PCO_DATA pco := ts_PCO({ ts_PCO_P_DNS_IPv4, ts_PCO_P_PCSCF_IPv4 }); + GSUP.send(ts_GSUP_EPDGTunnel_REQ(g_pars.imsi, pco)); + as_GTP2C_CreateSession_error(APN_access_denied__no_subscription); + alt { + [] GSUP.receive(tr_GSUP_EPDGTunnel_ERR(g_pars.imsi)); + [] GSUP.receive(GSUP_PDU:?) -> value rx_gsup { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected GSUP msg rx: ", rx_gsup)); + } + } + setverdict(pass); +} + /* GSUP Purge MS Req + Resp, triggers S2b DeleteSession Req + Response. */ private function f_GSUP_PurgeMS_success() runs on EPDG_ConnHdlr { var GSUP_PDU rx_gsup; @@ -774,6 +823,20 @@ setverdict(pass); }
+private function f_TC_s2b_CreateSession_rejected(charstring id) runs on EPDG_ConnHdlr { + f_GSUP_AI_success(); + f_GSUP_LU_success(); + f_GSUP_EPDGTunnel_error(); +} +testcase TC_s2b_CreateSession_rejected() runs on MTC_CT { + var EPDG_ConnHdlrPars pars := f_init_pars(); + var EPDG_ConnHdlr vc_conn; + f_init(); + vc_conn := f_start_handler(refers(f_TC_s2b_CreateSession_rejected), pars); + vc_conn.done; + setverdict(pass); +} + private function f_TC_concurrent_ues(charstring id) runs on EPDG_ConnHdlr { COORD.send(COORD_CMD_READY); COORD.receive(COORD_CMD_START); @@ -829,6 +892,7 @@ execute ( TC_authinfo_normal() ); execute ( TC_ho_lte_to_wifi() ); execute ( TC_ho_wifi_to_lte() ); + execute ( TC_s2b_CreateSession_rejected() ); execute ( TC_concurrent_ues2() ); execute ( TC_concurrent_ues100() ); } diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn index a86145d..752e85c 100644 --- a/library/GTPv2_Templates.ttcn +++ b/library/GTPv2_Templates.ttcn @@ -145,7 +145,6 @@ } }
- /* 8.4-1 */ type enumerated GTP2C_Cause { Local_Detach (2), @@ -167,7 +166,8 @@ New_PDN_type_due_to_network_preference (18), New_PDN_type_due_to_single_address_bearer_only (19), /* ... */ - Context_Not_Found (64) + Context_Not_Found (64), + APN_access_denied__no_subscription (93) } with { variant "FIELDLENGTH(8)" encode "RAW" };
/* 8.4 */ @@ -1021,13 +1021,14 @@ template (value) PDU_GTPCv2 ts_GTP2C_CreateSessionResp(template (value) OCT4 d_teid, template (value) OCT3 seq, - template (value) FullyQualifiedTEID_List fteids, - template (value) PDN_AddressAllocation addr, + template (value) GTP2C_Cause cause := Request_accepted, + template (omit) FullyQualifiedTEID_List fteids := omit, + template (omit) PDN_AddressAllocation addr := omit, template (omit) BearerContextGrouped_List bearerContextGrouped := omit, template (omit) APCO apco := omit) := ts_PDU_GTP2C(d_teid, seq, '21'O, { createSessionResponse := { - cause := ts_GTP2C_Cause(Request_accepted, '0'B), + cause := ts_GTP2C_Cause(cause, '0'B), changeReportingAction := omit, cSG_InformationReportingAction := omit, heNBInformationReporting := omit, diff --git a/mme/MME_Tests.ttcn b/mme/MME_Tests.ttcn index aa23a84..1cacbd9 100644 --- a/mme/MME_Tests.ttcn +++ b/mme/MME_Tests.ttcn @@ -831,6 +831,7 @@
GTP2.send(ts_GTP2C_CreateSessionResp(g_pars.ue_pars.s11_teic_remote, rx_msg.sequenceNumber, + Request_accepted, { s11_fteid_c_ie, s5c_fteid_c_ie }, paa, { ts_GTP2C_BcGrouped(bctx_ies) } )); setverdict(pass);