asterisk: IMS: validate P-Preferred-Service in INVITE
Change-Id: Iaa219d7b16965b27cd62ec27d810cb490dbc7a5a
diff --git a/asterisk/IMS_ConnectionHandler.ttcn b/asterisk/IMS_ConnectionHandler.ttcn
index 4f87f95..69e8abf 100644
--- a/asterisk/IMS_ConnectionHandler.ttcn
+++ b/asterisk/IMS_ConnectionHandler.ttcn
@@ -466,6 +466,37 @@
}
}
+/* 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 @@
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);