From 6088b89f0470c2368627391d5f4cae3d12462855 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Fri, 21 Jun 2024 20:40:41 +0200 Subject: asterisk: IMS: validate P-Preferred-Service in INVITE Change-Id: Iaa219d7b16965b27cd62ec27d810cb490dbc7a5a --- asterisk/IMS_ConnectionHandler.ttcn | 32 ++++++++++++++++++++++++++++++++ library/SIP_Templates.ttcn | 6 ++++++ 2 files changed, 38 insertions(+) diff --git a/asterisk/IMS_ConnectionHandler.ttcn b/asterisk/IMS_ConnectionHandler.ttcn index 4f87f95c..69e8abf4 100644 --- a/asterisk/IMS_ConnectionHandler.ttcn +++ b/asterisk/IMS_ConnectionHandler.ttcn @@ -466,6 +466,37 @@ private function f_ims_validate_INVITE_Contact(Contact rx_contact) runs on IMS_C } } +/* Validate P-Preferred-Service: GSMA FCM.01 3.2.3.3 */ +private function f_ims_validate_invite_P_Preferred_Service(PDU_SIP_Request req, + boolean exp_present := true) runs on IMS_ConnHdlr + +{ + if (not exp_present) { + if (ispresent(g_rx_sip_req.msgHeader.p_preferred_service)) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str(g_name & ": Received unexpected [rfc6050] P-Preferred-Service := ", + g_rx_sip_req.msgHeader.p_preferred_service)); + } + return; + } + + /* exp_present: */ + var template (present) P_Preferred_Service expl_tmpl := + tr_P_Preferred_Service({ "urn:urn-7:3gpp-service.ims.icsi.mmtel" }); + + if (not ispresent(g_rx_sip_req.msgHeader.p_preferred_service)) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str(g_name & ": Received no P-Access-Info vs exp := ", + expl_tmpl)); + } + if (not match(g_rx_sip_req.msgHeader.p_preferred_service, expl_tmpl)) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str(g_name & ": Received unexpected P-Preferred-Service := ", + g_rx_sip_req.msgHeader.p_preferred_service, + "\nvs exp := ", expl_tmpl)); + } +} + /* GSMA IR.92 2.2.4 Call Establishment and Termination */ private function f_ims_validate_INVITE_SDP(SDP_Message sdp) runs on IMS_ConnHdlr { @@ -1344,6 +1375,7 @@ altstep as_IMS_mo_call_accept(boolean exp_update_to_direct_rtp := false, via := g_rx_sip_req.msgHeader.via; f_ims_validate_register_P_Access_Network_info(g_rx_sip_req, exp_present := true); + f_ims_validate_invite_P_Preferred_Service(g_rx_sip_req, exp_present := true); f_ims_validate_INVITE_Contact(g_rx_sip_req.msgHeader.contact); f_ims_validate_INVITE_SDP(g_pars.subscr.cp.peer_sdp); diff --git a/library/SIP_Templates.ttcn b/library/SIP_Templates.ttcn index d0210d1a..ce5998b6 100644 --- a/library/SIP_Templates.ttcn +++ b/library/SIP_Templates.ttcn @@ -284,6 +284,12 @@ template (value) P_Associated_Uri ts_P_Associated_Uri(template (value) P_Assoc_u p_assoc_uris := p_assoc_uris } +// [RFC6050] +template (present) P_Preferred_Service tr_P_Preferred_Service(template (present) Service_ID_List p_ps := ?) := { + fieldName := P_PREFERRED_SERVICE_E, + p_ps := p_ps +} + // RFC 3262 template (value) RAck ts_RAck(template (value) integer response_num, template (value) integer seq_nr, -- cgit v1.2.3