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,