pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40895?usp=email )
Change subject: 5gc: Test UE requested PDU Session Modification procedure ......................................................................
5gc: Test UE requested PDU Session Modification procedure
Change-Id: Id9ac0f0e431c4a82dfab8675c93bf3c3f05442a7 --- M 5gc/C5G_Tests.ttcn M 5gc/ConnHdlr.ttcn M 5gc/expected-results.xml M deps/Makefile M library/NGAP_Functions.ttcn M library/NG_NAS_Osmo_Templates.ttcn M library/ngap/NGAP_EncDec.cc M library/ngap/NGAP_Types.ttcn 8 files changed, 340 insertions(+), 6 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index ae8260c..fdad2d2 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -88,7 +88,7 @@ ran_gtpu_teid := ran_gtpu_teid, cn_gtpu_ip := omit, cn_gtpu_teid := omit, - qfi := omit, + qos_rules := omit, ue_ip := omit };
@@ -361,6 +361,24 @@ vc_conn.done; }
+private function f_TC_pdu_sess_modification() runs on ConnHdlr { + f_register(); + f_pdu_sess_establish(false); + f_sleep(1.0); + f_pdu_sess_modify(); + f_pdu_sess_release(); + f_deregister(); +} +testcase TC_pdu_sess_modification() 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_pdu_sess_modification), pars); + vc_conn.done; +} + private function f_TC_register_ping4() runs on ConnHdlr { f_register(); f_pdu_sess_establish(); @@ -404,9 +422,21 @@ execute( TC_periodic_registration_updating() ); execute( TC_ue_context_release_no_pdu_session() ); execute( TC_ue_context_release_with_pdu_session() ); + execute( TC_pdu_sess_modification() ); execute( TC_ng_register_ping4() ); execute( TC_ng_register_ping4_256() ); }
+/* TODO: + * - Emergency call (PDU Sess Establish "Request Type"="Emergency Request") + * - Handover from/to EPS vs 5GC + * - Handover from/to 3GPP vs non-3GPP (PDU Sess Establish "Request Type"="Existing PDU Session" and RAT Type change) + * - PDU Session Type IPv6 + * - 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. + * - "If the PDU Session being established was requested to be an always-on PDU Session, the SMF shall indicate whether the request is accepted by including an Always-on PDU Session Granted indication in the PDU Session Establishment Accept message" + */
} diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn index ebac2ae..b626cd0 100644 --- a/5gc/ConnHdlr.ttcn +++ b/5gc/ConnHdlr.ttcn @@ -72,7 +72,7 @@ OCT4 ran_gtpu_teid, charstring cn_gtpu_ip optional, OCT4 cn_gtpu_teid optional, - OCT1 qfi optional, + QoS_RuleList qos_rules optional, charstring ue_ip optional };
@@ -376,7 +376,7 @@ NGAP.receive(cr_NG_DL_NAS_TRANSPORT) -> value rx_nas; 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.qfi := inner_nas.pdu_Session_Establishment_Accept.authorizedQoSRules.listofQoSRules[0].identifier; + 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); @@ -386,6 +386,139 @@ } }
+private function f_pdu_handle_session_resource_modify_item_qos_flow_list(QosFlowAddOrModifyRequestList qos_flow_req_li) runs on ConnHdlr return QosFlowAddOrModifyResponseList +{ + var QosFlowAddOrModifyResponseList qos_flow_resp_li; + for (var integer i := 0; i < lengthof(qos_flow_req_li); i := i + 1) { + var QosFlowAddOrModifyRequestItem qos_flow_req_it := qos_flow_req_li[i]; + var QosFlowAddOrModifyResponseItem qos_flow_resp_it := valueof(m_qosFlowAddOrModifyResponseItem(qos_flow_req_it.qosFlowIdentifier)); + qos_flow_resp_li[i] := qos_flow_resp_it; + } + return qos_flow_resp_li; +} + +/* Handle a PDUSessionResourceModifyRequestTransfer contained inside NGAP PDUSessionResourceModifyRequest and return a Result for PDUSessionResourceModifyResponse */ +private function f_pdu_handle_session_resource_modify_item(PDUSessionResourceModifyItemModReq req) runs on ConnHdlr return PDUSessionResourceModifyItemModRes +{ + var PDUSessionResourceModifyItemModRes resp; + var NGAP_IEs.PDUSessionResourceModifyRequestTransfer mod_req_transf; + var NGAP_IEs.PDUSessionResourceModifyResponseTransfer mod_resp_transf; + var octetstring mod_resp_transf_enc; + var template (omit) QosFlowAddOrModifyResponseList qos_flow_resp_li := omit; + + mod_req_transf := dec_NGAP_PDUSessionResourceModifyRequestTransfer(req.pDUSessionResourceModifyRequestTransfer); + + for (var integer i := 0; i < lengthof(mod_req_transf.protocolIEs); i := i + 1) { + select(mod_req_transf.protocolIEs[i].id) { + case (id_QosFlowAddOrModifyRequestList) { + var QosFlowAddOrModifyRequestList qos_flow_req_li := mod_req_transf.protocolIEs[i].value_.qosFlowAddOrModifyRequestList; + qos_flow_resp_li := f_pdu_handle_session_resource_modify_item_qos_flow_list(qos_flow_req_li); + } + case (id_UL_NGU_UP_TNLModifyList) { + // TODO: assign the fields below, see how it's done in f_pdu_handle_session_resource_setup_item() + // g_pars.ue_pars.sess_pars.cn_gtpu_ip := ; + // g_pars.ue_pars.sess_pars.cn_gtpu_teid := ; + // TODO: Update IP+TEID in usperlane osmo-uecups if any of them changed. + } + } + } + + /* Prepare Response for it: */ + mod_resp_transf := valueof(m_pDUSessionResourceModifyResponseTransfer(p_qosFlowAddOrModifyResponseList := qos_flow_resp_li)); + mod_resp_transf_enc := enc_NGAP_PDUSessionResourceModifyResponseTransfer(mod_resp_transf); + resp := valueof(m_pDUSessionResourceModifyItemModRes(req.pDUSessionID, mod_resp_transf_enc)); + return resp; +} + +private function f_pdu_handle_session_resource_modify_list(PDUSessionResourceModifyListModReq li_cmd) runs on ConnHdlr return PDUSessionResourceModifyListModRes +{ + var PDUSessionResourceModifyListModRes li_resp; + for (var integer i := 0; i < lengthof(li_cmd); i := i + 1) { + var PDUSessionResourceModifyItemModRes it_resp; + it_resp := f_pdu_handle_session_resource_modify_item(li_cmd[i]); + li_resp[i] := it_resp; + } + return li_resp; +} + +private altstep as_ngap_handle_PDUSessionResourceModifyRequest() runs on ConnHdlr { + var NGAP_PDU rx_ngap; + var template (present) NGAP_PDU exp_ngap := + mw_ngap_initMsg(mw_n2_PDUSessionResourceModify(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + ?)); + + [] NGAP.receive(exp_ngap) -> value rx_ngap { + var PDUSessionResourceModifyRequest mod_req := rx_ngap.initiatingMessage.value_.PDUSessionResourceModifyRequest; + var PDUSessionResourceModifyListModRes resources; + + for (var integer i := 0; i < lengthof(mod_req.protocolIEs); i := i + 1) { + if (mod_req.protocolIEs[i].id != id_PDUSessionResourceModifyListModReq) { + continue; + } + var PDUSessionResourceModifyListModReq li := mod_req.protocolIEs[i].value_.pDUSessionResourceModifyListModReq; + resources := f_pdu_handle_session_resource_modify_list(li); + } + NGAP.send(m_ngap_succMsg(m_n2_PDUSessionResourceModifyResponse(g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + resources))); + } +} + +/* 3GPP TS 24.501 8.3.7 PDU session modification request, + * 3GPP TS 23.502 4.3.3.2 UE requested PDU Session Modification */ +function f_pdu_sess_modify() runs on ConnHdlr { + var template (value) NG_NAS_UL_Message_Type nas_ul_msg; + var NAS_PDU nas_pdu; + var NG_NAS_DL_Message_Type rx_nas, inner_nas; + var ProcedureTransactionIdentifier pti := f_next_pti(); + var OCT1 pdu_sess_id := int2oct(g_pars.ue_pars.sess_pars.id, 1); + + var template (value) QoS_RuleU qos_rule_u := cs_QoS_RuleU_Create( + g_pars.ue_pars.sess_pars.qos_rules[0].u.creat.flowIdentifier, + '09'O, + {cs_PacketFilter_MediaUDP('0110'B, 60350)}, + '0'B, + g_pars.ue_pars.sess_pars.qos_rules[0].u.creat.spare, + '1'B + ); + var template (value) QoS_RuleList qos_rules := { + cs_QoS_Rule(g_pars.ue_pars.sess_pars.qos_rules[0].identifier, + qos_rule_u) + }; + + /* 3GPP TS 24.501 Table 8.3.7.1. */ + nas_ul_msg := cs_NG_PDU_SESSION_MODIFICATION_REQUEST(cs_NG_PDU_SessionIdV(pdu_sess_id), pti, + p_IntegrityProtMaxDataRate := cs_IntegrityProtMaxDataRateTV('FF'O, 'FF'O), + p_QoS_Rules := cs_QoS_Rules(qos_rules, p_IEI := '7A'O)); + nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); + nas_ul_msg := cs_NG_UL_NAS_TRANSPORT(cs_PayloadContainerType(tsc_PayloadContainerESMMsg), + cs_PayloadContainerLV(nas_pdu), + p_PDU_SessionId := cs_NG_PDU_SessionIdTV(pdu_sess_id), + p_RequestType := cs_NG_Request_TypeTV('001'B), + p_DNN := cs_DNN_TLV(f_enc_dns_hostname(g_pars.ue_pars.apn))); + NGAP.send(nas_ul_msg); + as_ngap_handle_PDUSessionResourceModifyRequest(); + + /* 5G-NAS PDU Session Modify Request: This DL NAS arrives contained in NGAP PDUSessionModifyRequest handled above: */ + NGAP.receive(cr_NG_DL_NAS_TRANSPORT) -> value rx_nas; + inner_nas := f_dec_NG_NAS_DL_Message_Payload_Container(rx_nas.dl_Nas_Transport.payloadContainerType.container, + rx_nas.dl_Nas_Transport.payload.payload); + if (not match(inner_nas, cr_NG_PDU_SESSION_MODIFICATION_COMMAND(cs_NG_PDU_SessionIdV(pdu_sess_id), + pti))) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Unexpected decoded NAS Payload Container ", inner_nas)); + } + + nas_ul_msg := cs_NG_PDU_SESSION_MODIFICATION_COMPLETE(cs_NG_PDU_SessionIdV(pdu_sess_id), + pti); + nas_pdu := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg)); + nas_ul_msg := cs_NG_UL_NAS_TRANSPORT(cs_PayloadContainerType(tsc_PayloadContainerESMMsg), + cs_PayloadContainerLV(nas_pdu), + p_PDU_SessionId := cs_NG_PDU_SessionIdTV(pdu_sess_id)); + NGAP.send(nas_ul_msg); +} + function f_register() runs on ConnHdlr { var template (value) NGAP_PDU tx_pdu; var template (value) NG_NAS_UL_Message_Type nas_ul_msg; @@ -599,7 +732,7 @@ log2str("Unexpected decoded NAS Payload Container ", inner_nas)); }
- g_pars.ue_pars.sess_pars.qfi := omit; + g_pars.ue_pars.sess_pars.qos_rules := omit; g_pars.ue_pars.sess_pars.ue_ip := omit;
nas_ul_msg := cs_NG_PDU_SESSION_RELEASE_COMPLETE(cs_NG_PDU_SessionIdV(pdu_sess_id), pti, @@ -621,7 +754,7 @@ var template (value) UECUPS_GtpExtHdr_PduSessContainer pdu_sess_cont;
pdu_sess_cont := ts_UECUPS_GtpExtHdr_PduSessContainer(UECUPS_GtpExtHdr_PduSessContainer_Type_ul_pdu_sess_info, - oct2int(g_pars.ue_pars.sess_pars.qfi)); + oct2int(g_pars.ue_pars.sess_pars.qos_rules[0].identifier)); gtp_ext_hdr := ts_UECUPS_GtpExtHdr(pdu_session_container := pdu_sess_cont);
uecups_create := ts_UECUPS_CreateTun( diff --git a/5gc/expected-results.xml b/5gc/expected-results.xml index 99ded9c..852a77d 100644 --- a/5gc/expected-results.xml +++ b/5gc/expected-results.xml @@ -7,6 +7,7 @@ <testcase classname='C5G_Tests' name='TC_periodic_registration_updating' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ue_context_release_no_pdu_session' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_ue_context_release_with_pdu_session' time='MASKED'/> + <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'/> </testsuite> diff --git a/deps/Makefile b/deps/Makefile index 4dba0a1..1e5ead2 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -72,7 +72,7 @@
# Use tag names from 'git describe --tags' or commit hashes. This way we get # exact commits of deps when doing regression testing. -nas_commit= ab43cccb96db6067ffba1c763b47cb25cd61b780 +nas_commit= 60a69a44cc6bbb32d96aecc4e355128ac5f95a5e titan.Libraries.TCCUsefulFunctions_commit= R.35.B-6-gb3687da titan.ProtocolEmulations.M3UA_commit= b58f92046e48a7b1ed531e243a2319ebca53bf4c titan.ProtocolEmulations.SCCP_commit= 750a3e836831e58eae59d4757ef5d0c759f9ca5d diff --git a/library/NGAP_Functions.ttcn b/library/NGAP_Functions.ttcn index 3b19d90..d7b8893 100644 --- a/library/NGAP_Functions.ttcn +++ b/library/NGAP_Functions.ttcn @@ -31,6 +31,9 @@ case (id_UEContextRelease) { return im.value_.uEContextReleaseCommand.protocolIEs[0].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.aMF_UE_NGAP_ID; } + case (id_PDUSessionResourceModify) { + return im.value_.pDUSessionResourceModifyRequest.protocolIEs[0].value_.aMF_UE_NGAP_ID; + } case (id_PDUSessionResourceRelease) { return im.value_.pDUSessionResourceReleaseCommand.protocolIEs[0].value_.aMF_UE_NGAP_ID; } @@ -77,6 +80,9 @@ case (id_UEContextRelease) { return im.value_.uEContextReleaseCommand.protocolIEs[0].value_.uE_NGAP_IDs.uE_NGAP_ID_pair.rAN_UE_NGAP_ID; } + case (id_PDUSessionResourceModify) { + return im.value_.pDUSessionResourceModifyRequest.protocolIEs[1].value_.RAN_UE_NGAP_ID; + } case (id_PDUSessionResourceRelease) { return im.value_.pDUSessionResourceReleaseCommand.protocolIEs[1].value_.rAN_UE_NGAP_ID; } @@ -151,6 +157,19 @@ } return omit; } + case (id_PDUSessionResourceModify) { + var PDUSessionResourceModifyRequest msg := im.value_.pDUSessionResourceModifyRequest; + for (i := 0; i < lengthof(msg.protocolIEs); i := i+1) { + if (msg.protocolIEs[i].id == id_PDUSessionResourceModifyListModReq) { + var PDUSessionResourceModifyListModReq req_li := msg.protocolIEs[i].value_.pDUSessionResourceModifyListModReq; + for (j := 0; j < lengthof(req_li); j := j+1) { + return req_li[j].nAS_PDU; + /* FIXME: we should be returning req_li[j].pDUSessionResourceModifyRequestTransfer too... */ + } + } + } + return omit; + } case (id_PDUSessionResourceRelease) { var PDUSessionResourceReleaseCommand msg := im.value_.PDUSessionResourceReleaseCommand; for (i := 0; i < lengthof(msg.protocolIEs); i := i+1) { diff --git a/library/NG_NAS_Osmo_Templates.ttcn b/library/NG_NAS_Osmo_Templates.ttcn index 4f8e8cc..423a05e 100644 --- a/library/NG_NAS_Osmo_Templates.ttcn +++ b/library/NG_NAS_Osmo_Templates.ttcn @@ -151,6 +151,14 @@ maxDataRateUL := maxDataRateUL, maxDataRateDL := maxDataRateD }; +template (value) IntegrityProtMaxDataRate +cs_IntegrityProtMaxDataRateTV(template (value) O1_Type maxDataRateUL, + template (value) O1_Type maxDataRateD) := +{ + iei := '13'O, + maxDataRateUL := maxDataRateUL, + maxDataRateDL := maxDataRateD +};
/* 24.501 cl. 9.11.4.11 */ template (value) PDU_SessionType @@ -656,6 +664,103 @@ } }
+template (value) NG_NAS_UL_Message_Type +cs_NG_PDU_SESSION_MODIFICATION_REQUEST(template (value) NG_PDU_SessionId p_PDU_SessionId, + template (value) ProcedureTransactionIdentifier p_PTI, + template (omit) NG_UE_SM_Cap p_NG_UE_SM_Cap := omit, + template (omit) GMM_GSM_Cause p_Cause := omit, + template (omit) MaxNumPacketFilters p_MaxNumPacketFilters := omit, + template (omit) AlwaysOnPDUSessionReq p_AlwaysOnPDUSessionReq := omit, + template (omit) IntegrityProtMaxDataRate p_IntegrityProtMaxDataRate := omit, + template (omit) QoS_Rules p_QoS_Rules := omit, + template (omit) QoSFlowDescr p_QoSFlowDescr := omit, + template (omit) MappedEPSBearerContexts p_MappedEPSBearerContexts := omit, + template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit, + template (omit) PortManagementInfoContainer p_PortManagementInfoContainer := omit, + template (omit) IPHeaderCompressionConfig p_IPHeaderCompConfig := omit, + template (omit) EthernetHeaderCompressConfig p_EthernetHeaderCompConfig := omit, + template (omit) RequestedMBSContainer p_RequestedMBS := omit, + template (omit) ServiceLvlAAContainer p_ServiceLvlAA := omit) := { + pdu_Session_Modification_Request := { + protocolDiscriminator := tsc_EPD_GSM, /* cl. 9.2 M V 1 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.4 M V 1 */ + procedureTransactionIdentifier := p_PTI, /* cl. 9.6 M V 1 */ + messageType := tsc_MT_NG_PDUSessionModificationRequest, /* cl. 9.7 M V 1 */ + smCapability := p_NG_UE_SM_Cap, /* cl. 9.11.4.1 O TLV 3-15 IEI=28 */ + gsmCause := p_Cause, /* cl. 9.11.4.2 O TV 2 IEI=59 */ + maxNumPacketFilters := p_MaxNumPacketFilters, /* c. 9.11.4.9 O TV 3 IEI=55 */ + alwaysOnPDUSessionReq := p_AlwaysOnPDUSessionReq, /* c. 9.11.4.4 O TV 1 IEI=B */ + integrityProtMaxDataRate := p_IntegrityProtMaxDataRate, /* c. 9.11.4.7 O TV 2 IEI=13 */ + requestedQoSRules := p_QoS_Rules, /* cl. 9.11.4.13 O TLV-E 7-65538 IEI=7A */ + requestedQoSFlowDescr := p_QoSFlowDescr, /* cl. 9.11.4.12 O TLV-E 5-65538 IEI=79 */ + mappedEPSbearerContexts := p_MappedEPSBearerContexts, /* cl. 9.11.4.8 O TLV-E 7-65538 IEI=7F Dec18 */ + extdProtocolConfigurationOptions := p_ExtdPCO, /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */ + portManagementInfoContainer := p_PortManagementInfoContainer, /* cl. 9.11.4.27 O TLV-E 8-65538 IEI=7C Sep20 @sic R5s201387 Baseline Moving sic@ */ + ipHeaderCompressionConfig := p_IPHeaderCompConfig, /* cl. 9.11.4.24 O TLV 5-257 IEI=66 Sep20 @sic R5s201387 Baseline Moving sic@ */ + ethernetHeaderCompressConfig := p_EthernetHeaderCompConfig, /* cl. 9.11.4.28 O TLV 3 IEI=1F Sep20 @sic R5s201387 Baseline Moving sic@ */ + requestedMBS := p_RequestedMBS, /* cl. 9.11.4.30 O TLV-E 8-65538 IEI=70 Sep22 @sic R5s221179 Baseline Moving sic@ */ + serviceLvlAA := p_ServiceLvlAA /* cl. 9.11.2.10 O TLV-E 6-n IEI=72 Sep22 @sic R5s221179 Baseline Moving sic@ */ + } +} // End of template m_NG_PDU_SESSION_MODIFICATION_REQUEST + +/* 24.501 cl. 8.3.9 */ +template (present) NG_NAS_DL_Message_Type +cr_NG_PDU_SESSION_MODIFICATION_COMMAND(template (present) NG_PDU_SessionId p_PDU_SessionId, + template (present) ProcedureTransactionIdentifier p_PTI, + template GMM_GSM_Cause p_Cause := *, + template Session_AMBR p_Session_AMBR := *, + template GPRS_Timer p_RQTimer := *, + template AlwaysOnPDUSessionInd p_AlwaysOnPDUSessionInd := *, + template QoS_Rules p_QoS_Rules := *, + template QoSFlowDescr p_QoSFlowDescr := *, + template MappedEPSBearerContexts p_MappedEPSBearerContexts := *, + template ExtdProtocolConfigOptions p_ExtdPCO := *, + template ATSSSContainer p_ATSSSContainer := *, + template IPHeaderCompressionConfig p_IPHeaderCompConfig := *, + template PortManagementInfoContainer p_PortManagementInfoContainer := *, + template ServingPLMNRateControl p_ServingPLMNRateCtrl := *, + template EthernetHeaderCompressConfig p_EthernetHeaderCompConfig := *, + template ReceivedMBSContainer p_ReceivedMBS := *, + template ServiceLvlAAContainer p_ServiceLvlAA := *) := { + pdu_Session_Modification_Command := { + protocolDiscriminator := tsc_EPD_GSM, /* cl. 9.2 M V 1 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.4 M V 1 */ + procedureTransactionIdentifier := p_PTI, /* cl. 9.6 M V 1 */ + messageType := tsc_MT_NG_PDUSessionModificationCommand, /* cl. 9.7 M V 1 */ + gsmCause := p_Cause, /* cl. 9.11.4.2 O TV 2 IEI=59 */ + sessionAMBR := p_Session_AMBR, /* cl. 9.11.4.14 O TLV 8 IEI=2A */ + rqTimerValue := p_RQTimer, /* cl. 9.11.2.3 O TV 2 IEI=56 */ + alwaysOnPDUSessionInd := p_AlwaysOnPDUSessionInd, /* c. 9.11.4.3 O TV 1 IEI=8 */ + authorizedQoSRules := p_QoS_Rules, /* cl. 9.11.4.13 O TLV-E 7-65538 IEI=7A */ + mappedEPSContexts := p_MappedEPSBearerContexts, /* cl. 9.11.4.8 O TLV-E 7-65538 IEI=7F */ + authorizedQoSFlowDescr := p_QoSFlowDescr, /* cl. 9.11.4.12 O TLV-E 6-65538 IEI=79 */ + extdProtocolConfigurationOptions := p_ExtdPCO, /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */ + atsssContainer := p_ATSSSContainer, /* cl. 9.11.4.22 O TLV-E 3-65538 IEI=77 Sep20 @sic R5s201387 Baseline Moving sic@ */ + ipHeaderCompressionConfig := p_IPHeaderCompConfig, /* cl. 9.11.4.24 O TLV 5-257 IEI=66 Sep20 @sic R5s201387 Baseline Moving sic@ */ + portManagementInfoContainer := p_PortManagementInfoContainer, /* cl. 9.11.4.27 O TLV-E 8-65538 IEI=7C Sep20 @sic R5s201387 Baseline Moving sic@ */ + servingPLMNRateControl := p_ServingPLMNRateCtrl, /* cl. 9.11.4.20 O TLV 4 IEI=18 Sep20 @sic R5s201387 Baseline Moving sic@ */ + ethernetHeaderCompressConfig := p_EthernetHeaderCompConfig, /* cl. 9.11.4.28 O TLV 3 IEI=1F Sep20 @sic R5s201387 Baseline Moving sic@ */ + receivedMBS := p_ReceivedMBS, /* cl. 9.11.4.30 O TLV-E 8-65538 IEI=71 Sep22 @sic R5s221179 Baseline Moving sic@ */ + serviceLvlAA := p_ServiceLvlAA /* cl. 9.11.2.10 O TLV-E 6-n IEI=72 Sep22 @sic R5s221179 Baseline Moving sic@ */ + } +} + +/* 24.501 cl. 8.3.10 */ +template (value) NG_NAS_UL_Message_Type +cs_NG_PDU_SESSION_MODIFICATION_COMPLETE(template (value) NG_PDU_SessionId p_PDU_SessionId, + template (value) ProcedureTransactionIdentifier p_PTI := '00'O, + template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit, + template (omit) PortManagementInfoContainer p_PortManagementInfoContainer := omit) := { + pdu_Session_Modification_Complete := { + protocolDiscriminator := tsc_EPD_GSM, /* cl. 9.2 M V 1 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.4 M V 1 */ + procedureTransactionIdentifier := p_PTI, /* cl. 9.6 M V 1 */ + messageType := tsc_MT_NG_PDUSessionModificationComplete, /* cl. 9.7 M V 1 */ + extdProtocolConfigurationOptions := p_ExtdPCO, /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */ + portManagementInfoContainer := p_PortManagementInfoContainer /* cl. 9.11.4.27 O TLV-E 8-65538 IEI=7C Sep20 @sic R5s201387 Baseline Moving sic@ */ + } +} + /* 24.501 cl. 8.3.12 */ template (value) NG_NAS_UL_Message_Type cs_NG_PDU_SESSION_RELEASE_REQUEST(template (value) NG_PDU_SessionId p_PDU_SessionId, diff --git a/library/ngap/NGAP_EncDec.cc b/library/ngap/NGAP_EncDec.cc index ccdfe83..b81591d 100644 --- a/library/ngap/NGAP_EncDec.cc +++ b/library/ngap/NGAP_EncDec.cc @@ -69,4 +69,44 @@ return ret; }
+OCTETSTRING enc__NGAP__PDUSessionResourceModifyRequestTransfer(const NGAP__IEs::PDUSessionResourceModifyRequestTransfer &p) +{ + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + p.encode(NGAP__IEs::PDUSessionResourceModifyRequestTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return OCTETSTRING(TTCN_buf.get_len(), TTCN_buf.get_data()); +} + +NGAP__IEs::PDUSessionResourceModifyRequestTransfer dec__NGAP__PDUSessionResourceModifyRequestTransfer(const OCTETSTRING &stream) +{ + NGAP__IEs::PDUSessionResourceModifyRequestTransfer ret; + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + TTCN_buf.put_os(stream); + ret.decode(NGAP__IEs::PDUSessionResourceModifyRequestTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return ret; +} + +OCTETSTRING enc__NGAP__PDUSessionResourceModifyResponseTransfer(const NGAP__IEs::PDUSessionResourceModifyResponseTransfer &p) +{ + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + p.encode(NGAP__IEs::PDUSessionResourceModifyResponseTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return OCTETSTRING(TTCN_buf.get_len(), TTCN_buf.get_data()); +} + +NGAP__IEs::PDUSessionResourceModifyResponseTransfer dec__NGAP__PDUSessionResourceModifyResponseTransfer(const OCTETSTRING &stream) +{ + NGAP__IEs::PDUSessionResourceModifyResponseTransfer ret; + TTCN_Buffer TTCN_buf; + TTCN_buf.clear(); + TTCN_buf.put_os(stream); + ret.decode(NGAP__IEs::PDUSessionResourceModifyResponseTransfer_descr_, TTCN_buf, + TTCN_EncDec::CT_PER, PER_ALIGNED); + return ret; +} + } diff --git a/library/ngap/NGAP_Types.ttcn b/library/ngap/NGAP_Types.ttcn index dfa6586..96ccea9 100644 --- a/library/ngap/NGAP_Types.ttcn +++ b/library/ngap/NGAP_Types.ttcn @@ -11,4 +11,10 @@
external function enc_NGAP_PDUSessionResourceSetupResponseTransfer(NGAP_IEs.PDUSessionResourceSetupResponseTransfer p) return octetstring; external function dec_NGAP_PDUSessionResourceSetupResponseTransfer(in octetstring pdu) return NGAP_IEs.PDUSessionResourceSetupResponseTransfer; + + external function enc_NGAP_PDUSessionResourceModifyRequestTransfer(NGAP_IEs.PDUSessionResourceModifyRequestTransfer p) return octetstring; + external function dec_NGAP_PDUSessionResourceModifyRequestTransfer(in octetstring pdu) return NGAP_IEs.PDUSessionResourceModifyRequestTransfer; + + external function enc_NGAP_PDUSessionResourceModifyResponseTransfer(NGAP_IEs.PDUSessionResourceModifyResponseTransfer p) return octetstring; + external function dec_NGAP_PDUSessionResourceModifyResponseTransfer(in octetstring pdu) return NGAP_IEs.PDUSessionResourceModifyResponseTransfer; }