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);
diff --git a/library/SIP_Templates.ttcn b/library/SIP_Templates.ttcn
index d0210d1..ce5998b 100644
--- a/library/SIP_Templates.ttcn
+++ b/library/SIP_Templates.ttcn
@@ -284,6 +284,12 @@
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,