LibIms_Steps.ttcn 79.5 KB
Newer Older
 *	@author 	STF 346, STF366, STF368, STF369, STF450
 *  @version    $Id$
 *	@desc		This module provides the types used by the test component 
 *              for SIP-IMS tests.
 *              This module is part of LibImsV2.
 */

module LibIms_Steps
{	
	//LibSip
	import from LibSip_SIPTypesAndValues all;
	import from LibSip_SDPTypes all;
	import from LibSip_Templates all;
	import from LibSip_Steps all;
	import from LibSip_PIXITS all;
	import from LibSip_Interface all;
	import from LibSip_XMLTypes all;
    import from LibSip_MessageBodyTypes all;
	//LibIms
	import from LibIms_Templates all;
	import from LibIms_Interface all;
	import from LibIms_PIXITS all;	
	import from LibIms_SIPTypesAndValues all;
		
	group externalfunctions {
	}//end group externalfunctions
	group parameterOperations {

        /**
         * 
         * @desc functions add new via parameter
         * @param p_message (request) SIP message to be used to prepair via header
         * @param p_userprofile user profile
         */
        function f_addNewViaParameter(in Request p_message, in integer p_userprofile) runs on ImsComponent
        {
          var integer v_intVia;
          var integer i := 0;
          if (ispresent(p_message.msgHeader.via)) {          

            v_intVia := sizeof(p_message.msgHeader.via.viaBody);
            while (i < v_intVia) {
                p_message.msgHeader.via.viaBody[v_intVia] := p_message.msgHeader.via.viaBody[v_intVia-1];
                v_intVia := v_intVia - 1;
            }
            vc_branch := c_branchCookie & f_getRndTag();
            p_message.msgHeader.via.viaBody[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile));
            vc_via := p_message.msgHeader.via;
          }
        }
        
        /**
        ** @desc functions remove own via parameter
        * @param p_message (request) SIP message to be used to prepair via header
        * @param p_userprofile user profile
        */
       function f_removeOwnViaParameter(in Response p_message) runs on ImsComponent
       {
         var integer v_intVia;
         var Via v_via := c_empty_Via;
         
         if (ispresent(p_message.msgHeader.via)) {          

           v_intVia := sizeof(p_message.msgHeader.via.viaBody)-1;
           
           for (var integer i := 0; i < v_intVia; i := i + 1)
           {
               v_via.viaBody[i] := p_message.msgHeader.via.viaBody[i+1]; 
           }
           vc_via := v_via;
         }
       }
        
        /**
        * 
        * @desc functions add new via parameter
        * @param p_message (request) SIP message to be used to prepair via header
        * @param p_userprofile user profile
        */
       function f_addNewRecordRouteAndRemoveRoutParameter(in Request p_message) runs on ImsComponent
       {
         var integer v_intRoute,v_intRecordRoute;
         var integer i := 1;
         var integer j := 0;
         var RouteBody v_route1; 
         var Route v_newRoute;
         v_newRoute.fieldName := ROUTE_E;
         if (ispresent(p_message.msgHeader.route)) {          

           v_intRoute := sizeof(p_message.msgHeader.route.routeBody);
           v_route1 := p_message.msgHeader.route.routeBody[0];
           while (i < v_intRoute) {
               v_newRoute.routeBody[i-1] := p_message.msgHeader.route.routeBody[i];
               i := i + 1;
           }
           vc_route := v_newRoute;
         }
         
         if (ispresent(p_message.msgHeader.recordRoute)) {          

           v_intRecordRoute := sizeof(p_message.msgHeader.recordRoute.routeBody);
           while (j < v_intRecordRoute) {
               p_message.msgHeader.recordRoute.routeBody[v_intRecordRoute] := p_message.msgHeader.recordRoute.routeBody[v_intRecordRoute-1];
               v_intRecordRoute := v_intRecordRoute - 1;
           }
           p_message.msgHeader.recordRoute.routeBody[0] := v_route1;
           vc_recordRoute := p_message.msgHeader.recordRoute;
         }
       }

       /**
       * 
       * @desc functions add new recordRoute parameter
       * @param p_message (request) SIP message to be used to prepair via header
       * @param p_userprofile user profile
       */
      function f_addNewRecordRouteIMS(in RecordRoute p_rr) runs on ImsComponent return template RecordRoute
      {
        template RecordRoute v_recordRoute := omit;
        var integer v_intRecordRoute;
        var integer i := 1;
        var integer j := 0;

        v_intRecordRoute := sizeof(p_rr.routeBody);
         if (v_intRecordRoute>0){
          while (j < v_intRecordRoute) {
              p_rr.routeBody[v_intRecordRoute] := p_rr.routeBody[v_intRecordRoute-1];
              v_intRecordRoute := v_intRecordRoute - 1;
          }
          p_rr.routeBody[0] := valueof(m_routeBody_currIpAddr(vc_userprofile));
          vc_recordRoute := p_rr;
          return vc_recordRoute;
         }
         else {return(v_recordRoute)}
      }

	}//end group parameterOperations
	
	 * @desc sets BYE header fields (IMS addresses)
	 *			extension of general settings from LibSip basic function
	 * @param p_cSeq_s current cSeq 
	 * @param p_to_user user_profile id of the user to send Bye
	 * @verdict 
	 */
		function f_setHeadersBYE(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
//		  vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier
//		  
//		  vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
        
		  vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
		  vc_route 		:= f_route(); 		// update the route header field depending on vc_boo_route
		  vc_recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
		
		  LibSip_Steps.f_setHeadersBYE(p_cSeq_s);
	  
		}// end f_setHeadersBYE
		
	/*
	 * 
	 * @desc sets CANCEL header fields (IMS addresses)
	 *			extension of general settings from LibSip basic function
	 * @param p_cSeq_s current cSeq 
	 * @param p_to_user user_profile id of the user to send Cancel
	 * @verdict 
	 */
		function f_setHeadersCANCEL(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
		  vc_route 		:= f_route(); 		// update the route header field depending on vc_boo_route
		  vc_recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
		
		  LibSip_Steps.f_setHeadersCANCEL(p_cSeq_s);
	  
		}// end f_setHeadersCANCEL

		 * @desc sets headers for forward request from AS in case if AS acts as Proxy
		 * @param p_proxyMode true = proxyMode, false = B2BMode
		function f_setHeadersForwardRequestFromAS (inout CSeq p_cSeq_s, boolean p_proxyMode) runs on ImsComponent
		{
			var Request v_request;
			v_request := vc_request;
			
    		if (p_proxyMode)
    		{
                vc_requestUri2 := v_request.requestLine.requestUri;
                vc_to := v_request.msgHeader.toField;
                vc_contact := v_request.msgHeader.contact;
                f_addNewViaParameter(v_request, c_userProfile_AS1);
                f_addNewRecordRouteAndRemoveRoutParameter(v_request);
    		}
    		else
			{	//B2Bmode
    			vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
                vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
			}
		}// end function f_setHeadersForwardRequest
		
		/**
		 * 
		 * @desc sets header fields for forward request from AS in case if AS acts as Proxy
		 */
		function f_setHeadersForwardResponseFromAS (inout CSeq p_cSeq_s) runs on ImsComponent
		{
			var Response v_response;
			v_response := vc_response;
			
            vc_caller_To := v_response.msgHeader.toField;
            vc_to := v_response.msgHeader.toField;
            vc_contact := v_response.msgHeader.contact;
			
			if (ispresent(v_response.msgHeader.recordRoute)) {
				vc_recordRoute:= v_response.msgHeader.recordRoute;
            f_removeOwnViaParameter(v_response);
		}// end function f_setHeadersForwardResponse

		/*
		 * 
		 * @desc sets Invite header fields (IMS addresses)
		 *			extension of general settings from LibSip basic function
		 * @param p_cSeq_s current cSeq 
		 * @param p_to_user user_profile id of the user to be invited
		 * @verdict 
		 */
		function f_setHeadersINVITE(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
rennoch's avatar
rennoch committed
		  vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier
rennoch's avatar
rennoch committed
		  vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
            
		  vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
		  if (vc_boo_route)
		  { vc_route := valueof(m_route_interface(vc_interfaceprofile))};
		  if (vc_boo_recordRoute)
		  { vc_recordRoute := valueof(m_recordRoute_currIpAddr(vc_userprofile))};
		  LibSip_Steps.f_setHeadersINVITE(p_cSeq_s);
		}// end f_setHeadersINVITE
poglitsch's avatar
poglitsch committed

		/*
		* 
		* @desc sets Invite header fields (IMS addresses)
		*			extension of general settings from LibSip basic function
		* @param p_cSeq_s current cSeq 
		* @param p_to_user user_profile id of the user to be invited
		* @verdict 
		*/
		function f_setHeadersUPDATE(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
			vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier

			vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
        
			vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
  
			if (vc_boo_route)
			{ vc_route := valueof(m_route_interface(vc_interfaceprofile))};
			if (vc_boo_recordRoute)
			{ vc_recordRoute := valueof(m_recordRoute_currIpAddr(vc_userprofile))};
	  
			LibSip_Steps.f_setHeadersUPDATE(p_cSeq_s);
		  
		}// end f_setHeadersUPDATE
rennoch's avatar
rennoch committed
    	
		 * @desc sets Message header fields (IMS addresses)
		 *			extension of general settings from LibSip basic function
		 * @param p_cSeq_s current cSeq 
		 * @param p_to_user user_profile id of the user to be invited
		 * @verdict 
		 */
		function f_setHeadersMESSAGE(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
rennoch's avatar
rennoch committed
		  vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier
rennoch's avatar
rennoch committed
		  vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
        
		  vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
  
		  LibSip_Steps.f_setHeadersMESSAGE(p_cSeq_s);
	  
		}// end f_setHeadersMESSAGE
		* @desc sets Notify header fields (IMS addresses)
rennoch's avatar
rennoch committed
		*			extension of general settings from LibSip basic function
		* @param p_cSeq_s current cSeq 
		* @param p_to_user user_profile id of the user to be invited
		* @verdict 
		*/
		function f_setHeadersNOTIFY(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
				LibSip_Steps.f_setHeadersNOTIFY(p_cSeq_s);
				
				vc_branch := c_branchCookie & f_getRndTag();
				vc_via:={
					fieldName := VIA_E,
					viaBody 	 := {valueof(m_ViaBody_virtual_XCSCF(vc_branch, vc_userprofile))}
				};
				
rennoch's avatar
rennoch committed
				vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier

				vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
        
				vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
				
				//contact header initialization for sending of NOTIFY from CSCF component
				vc_contact := valueof(m_Contact(m_SipUrl_currIpaddr_CSCF(vc_userprofile)));
rennoch's avatar
rennoch committed
	  
		}// end f_setHeadersNOTIFY

		/*
		* 
		* @desc sets Publish header fields (IMS addresses)
		*			extension of general settings from LibSip basic function
		* @param p_cSeq_s current cSeq 
		* @param p_to_user user_profile id of the user to be invited
		* @verdict 
		*/
		function f_setHeadersPUBLISH(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
				LibSip_Steps.f_setHeadersPUBLISH(p_cSeq_s);
		
				vc_branch := c_branchCookie & f_getRndTag();
				vc_via:={
					fieldName := VIA_E,
					viaBody 	 := {valueof(m_ViaBody_virtual_XCSCF(vc_branch, vc_userprofile))}
				};
		
				vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier

				vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier

				vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
		
				if (vc_boo_route)
				{ vc_route := valueof(m_route_interface(vc_interfaceprofile))};
				if (vc_boo_recordRoute)
				{ vc_recordRoute := valueof(m_recordRoute_currIpAddr(vc_userprofile))};
				
				//contact header initialization for sending of PUBLISH from CSCF component
				vc_contact := valueof(m_Contact(m_SipUrl_currIpaddr_CSCF(vc_userprofile)));
  
			}// end f_setHeadersPUBLISH
		/**
		**
		* @desc sets Subscribe header fields (IMS addresses)
		*			extension of general settings from LibSip basic function
		* @param p_cSeq_s current cSeq 
		* @param p_to_user user_profile id of the user to be invited
		* @verdict 
		*/
		function f_setHeadersSUBSCRIBE(inout CSeq p_cSeq_s, in SipUrl p_to_user) runs on ImsComponent
		{      
    			vc_to := {	fieldName := TO_E,
        			addressField :=
        			{
        				nameAddr := {
        					displayName := omit, 	 			// optional charstring
        					addrSpec :=	p_to_user	// SipUrl
        				}
        			},//end addressField
        			toParams := omit
    			};
				vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
        
				vc_requestUri :=p_to_user; // Request URI of Invite is identical with To header
  
				LibSip_Steps.f_setHeadersSUBSCRIBE(p_cSeq_s);
	  
		}// end f_setHeadersSUBSCRIBE
		
poglitsch's avatar
poglitsch committed
		 * @desc  sets headers for ReINVITE method 
		 * @param p_cSeq_s current cSeq 
poglitsch's avatar
poglitsch committed
		 * @param p_orginatingSide true in case of Re-INVITE is send from the orgination endpoint otherwise false. 
		function f_setHeadersReINVITE (inout CSeq p_cSeq_s, in boolean p_orginatingSide, in integer p_to_user) runs on ImsComponent
		  var integer v_tmp, v_i, v_j, v_nbroute;
		  var Request v_request;
		  v_request := vc_request;
		  f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via	
		
    	  vc_reqHostPort := vc_requestUri.components.sip.hostPort;

          vc_requestUri := f_initSipUrl(p_to_user);
          
poglitsch's avatar
poglitsch committed
		  if(p_orginatingSide) {
    		  vc_to := vc_caller_To;
    		  vc_from := vc_caller_From;
		  }   
		  else {
			vc_to := vc_callee_To;
			vc_from := vc_callee_From;
			
			//get route from previous ACK request
			//          Route Management
              if (ispresent(v_request.msgHeader.recordRoute))
              {
                vc_recordRoute := v_request.msgHeader.recordRoute;
                v_nbroute := sizeof(vc_recordRoute.routeBody);
                // copy and reverse the order of the routes in route header
                for (v_i:=0; v_i<=(v_nbroute - 1); v_i:=v_i+1)
                {
                  v_j:= v_nbroute - 1 - v_i;
                  vc_route.routeBody[v_j]:=vc_recordRoute.routeBody[v_i];
                }
                vc_route.fieldName := ROUTE_E;
                vc_boo_recordRoute := true;
                vc_boo_route := true;
              }
              else
              {
                vc_boo_recordRoute := false;
                vc_boo_route := false;
              }
			
		  } 
		  
		  v_tmp := str2int(vc_sdp_local.origin.session_id);
          vc_sdp_local.origin.session_id := int2str(v_tmp + 1);
          v_tmp := str2int(vc_sdp_local.origin.session_version);
          vc_sdp_local.origin.session_version := int2str(v_tmp + 1);
      
		}// end function f_setHeadersReINVITE
	 * 
	 * @desc  sets component variables related to message header fields 
	 *        when sending requests from the home I-CSCF (TS) to the visited P-CSCF (SUT)
	 *		  (message type independent: CSeq, contact, via), function uses information from 
	 *        userprofile and interfaceprofile
	 *		
	 * @param p_cSeq_s CSeq parameter
	 * @param p_method method name for cSeq header field
	 */	
 	function f_setHeadersGeneral_ICSCF(inout CSeq p_cSeq_s, in charstring p_method) runs on SipComponent
	{
	  var SemicolonParam_List v_params;

	  p_cSeq_s.fieldName := CSEQ_E;
	  p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
	  p_cSeq_s.method    := p_method ;
	  vc_cSeq := p_cSeq_s;
      
	  vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));

	  vc_branch := c_branchCookie & f_getRndTag();
	  vc_branch_ICSCF := c_branchCookie & f_getRndTag();

	  vc_via:={
		fieldName := VIA_E,
		viaBody 	 := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile)),
						 valueof(m_ViaBody_virtualUEinPCSCF(vc_branch_ICSCF, vc_userprofile))
						 }
	  };
	}// end function f_setHeadersGeneral_ICSCF
	
	/**
	 * 
	 * @desc sets header field for the next outgoing REGISTER message
	 *       from the visited P-CSCF to the home I-CSCF
	 * @param p_cSeq_s CSeq parameter to be applied
	 */
 	function f_setHeaders_REGISTER_PCSCF(inout CSeq p_cSeq_s) runs on SipComponent
	{
	  var SemicolonParam_List v_params;

	  f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via

	  vc_requestUri:=
	  {
		scheme := c_sipScheme,
        components := { sip:= {
    		userInfo := omit,
    		hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit}}},
		urlParameters := omit,
		headers := omit
	  };
      
	  vc_reqHostPort := vc_requestUri.components.sip.hostPort;
      
	  vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
	  vc_callIdReg := vc_callId;
      
	  vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
	  v_params := {{id:=c_tagId, paramValue:=f_getRndTag()}}
	  vc_from := {fieldName := FROM_E,
		addressField :=vc_to.addressField,
		fromParams := v_params
	  };
	  
	  if(not vc_firstREGISTER_sent)
	  {
	  v_params := {{id:=c_expiresId, paramValue:=c_shortRegistration}};
	  vc_contact.contactBody.contactAddresses[0].contactParams := v_params;
	  }
	  
	  vc_firstREGISTER_sent := true;//f_setHeaders_Register is called in deREGISTER function
	  
	  vc_authorization := 
	  {
		fieldName := AUTHORIZATION_E,
		body := {f_calculatecCredentials_empty(vc_userprofile)}
	  }
      
	}// end function setHeaders_REGISTER_PCSCF
		 * @desc sets REFER header fields (IMS addresses)
		 *			extension of general settings from LibSip basic function
		 * @param p_cSeq_s current cSeq 
		 * @param p_to_user user_profile id of the user to be invited
		 * @verdict 
		 */
		function f_setHeadersREFER(inout CSeq p_cSeq_s, in integer p_to_user) runs on ImsComponent
		{      
juvancic's avatar
juvancic committed
		  //vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier
juvancic's avatar
juvancic committed
		  //vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
            
		  vc_requestUri := f_initSipUrl(p_to_user); // Request URI of Invite is identical with To header
      
		  if (vc_boo_route)
		  { vc_route := valueof(m_route_interface(vc_interfaceprofile))};
		  if (vc_boo_recordRoute)
		  { vc_recordRoute := valueof(m_recordRoute_currIpAddr(vc_userprofile))};
		  
		  LibSip_Steps.f_setHeadersREFER(p_cSeq_s);
		  
		}// end f_setHeadersREFER
	     * @desc sets REFER header fields (IMS addresses)
poglitsch's avatar
poglitsch committed
		 *			extension of general settings from LibSip basic function
		 * @param p_cSeq_s current cSeq 
		 * @param p_uri SipUrl for request URI and To header
		 */
		function f_setHeadersREFER_conf(inout CSeq p_cSeq_s, in SipUrl p_uri) runs on ImsComponent
		{      
		  vc_to := {	
		  	fieldName := TO_E,
			addressField := {
				nameAddr := {
					displayName := omit, 	 			// optional charstring
					addrSpec :=	p_uri					// SipUrl
				}
			},//end addressField
			toParams := omit
		  };

		  vc_from := f_initFromHeader(vc_userprofile.id, f_getRndTag()); // init of vc_from using userProfile identifier
            
		  vc_requestUri := p_uri; // Request URI of Invite is identical with To header
      
		  if (vc_boo_route) { 
		  	vc_route := valueof(m_route_interface(vc_interfaceprofile))
		  };
		  if (vc_boo_recordRoute) { 
		  	vc_recordRoute := valueof(m_recordRoute_currIpAddr(vc_userprofile))
		  };
		  
		  LibSip_Steps.f_setHeadersREFER(p_cSeq_s);
		}// end f_setHeadersREFER_conf

	} // end group fieldOperations
	
	group awaitingMessage {
	}
	group sendMessage {
	/**
	* 
	* @desc  send PRACK message
	* @param p_request template of the message to be sent
	*/
	function f_SendPRACK_sdp(template MessageBody p_mb) runs on SipComponent
	{
		f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via	
		vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
		
		SIPP.send(m_PRACK_Request_sdp(
            vc_requestUri, 
            vc_callId, 
            vc_cSeq, 
            vc_from, 
            vc_to, 
            vc_via,
            vc_rAck,
            p_mb
    	)) to vc_sent_label;	  
	}

		 * 
		 * @desc sets user parameters with PIXIT values
		 * @param p_user identifies the selected user configuration and location
		 * @verdict 
		 */
		function f_init_userprofile(in integer p_user) runs on ImsComponent
		{
		LibSip_Steps.f_init_userprofile(p_user);
		
		select(p_user){
			case (c_userProfile_UE1atSUThome) { //variant c_userProfile_UE1atSUThome
			vc_userprofile.currPort := PX_IMS_TS_UE1_PORT;
			vc_userprofile.currIpaddr := PX_IMS_TS_UE1_IPADDR;	
			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;
			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_HOME_DOMAIN;	
			vc_userprofile.publUsername := PX_IMS_SUT_UE1_PUBLIC_USER;
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;	
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR;
			}
			case (c_userProfile_UE2atSUThome) { //variant c_userProfile_UE2atSUThome
			vc_userprofile.currPort := PX_IMS_TS_UE2_PORT;
			vc_userprofile.currIpaddr := PX_IMS_TS_UE2_IPADDR;	
			vc_userprofile.contactPort := PX_IMS_TS_UE2_PORT;
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE2_IPADDR;
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE2_BEARER_IPADDR;
			vc_userprofile.homeDomain := PX_IMS_SUT_UE2_HOME_DOMAIN;	
			vc_userprofile.publUsername := PX_IMS_SUT_UE2_PUBLIC_USER;
			vc_userprofile.qop := PX_IMS_SUT_UE2_QOP;
			vc_userprofile.privUsername := PX_IMS_SUT_UE2_PRIVAT_USERNAME;	
			vc_userprofile.passwd := PX_IMS_SUT_UE2_PRIVAT_PASSWD;	
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE2_REGISTRAR;
			}

			case (c_userProfile_UE3atSUThome) { //variant c_userProfile_UE3atSUThome
			vc_userprofile.currPort := PX_IMS_TS_UE3_PORT;
			vc_userprofile.currIpaddr := PX_IMS_TS_UE3_IPADDR;	
			vc_userprofile.contactPort := PX_IMS_TS_UE3_PORT;
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE3_IPADDR;
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE3_BEARER_IPADDR;
			vc_userprofile.homeDomain := PX_IMS_SUT_UE3_HOME_DOMAIN;	
			vc_userprofile.publUsername := PX_IMS_SUT_UE3_PUBLIC_USER;
			vc_userprofile.qop := PX_IMS_SUT_UE3_QOP;
			vc_userprofile.privUsername := PX_IMS_SUT_UE3_PRIVAT_USERNAME;	
			vc_userprofile.passwd := PX_IMS_SUT_UE3_PRIVAT_PASSWD;	
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE3_REGISTRAR;
			}

			case (c_userProfile_UE4atSUThome) { //variant c_userProfile_UE4atSUThome
			vc_userprofile.currPort := PX_IMS_TS_UE4_PORT;
			vc_userprofile.currIpaddr := PX_IMS_TS_UE4_IPADDR;	
			vc_userprofile.contactPort := PX_IMS_TS_UE4_PORT;
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE4_IPADDR;
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE4_BEARER_IPADDR;
			vc_userprofile.homeDomain := PX_IMS_SUT_UE4_HOME_DOMAIN;	
			vc_userprofile.publUsername := PX_IMS_SUT_UE4_PUBLIC_USER;
			vc_userprofile.qop := PX_IMS_SUT_UE4_QOP;
			vc_userprofile.privUsername := PX_IMS_SUT_UE4_PRIVAT_USERNAME;	
			vc_userprofile.passwd := PX_IMS_SUT_UE4_PRIVAT_PASSWD;	
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE4_REGISTRAR;
			}
			
			case (c_userProfile_UE1atSUTvisiting) { //variant c_userProfile_UE1atSUTvisiting - UE3 parameters
			vc_userprofile.currPort := PX_IMS_TS_UE1_PORT;
			vc_userprofile.currIpaddr := PX_IMS_TS_UE1_IPADDR;
			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE3_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE3_HOME_DOMAIN;	
			vc_userprofile.publUsername := PX_IMS_SUT_UE3_PUBLIC_USER;
			vc_userprofile.qop := PX_IMS_SUT_UE3_QOP;
			vc_userprofile.privUsername := PX_IMS_SUT_UE3_PRIVAT_USERNAME;	
			vc_userprofile.passwd := PX_IMS_SUT_UE3_PRIVAT_PASSWD;	
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE3_REGISTRAR;
//			//temporary not used and it can be deleted during validation
//			case (c_userProfile_UE1atSUTvisiting) { //variant c_userProfile_UE1atSUTvisiting
//			vc_userprofile.currPort := PX_IMS_TS_UE2_PORT;
//			vc_userprofile.currIpaddr := PX_IMS_TS_UE2_IPADDR;
//			vc_userprofile.contactPort := PX_IMS_TS_UE2_PORT;
//			vc_userprofile.contactIpaddr := PX_IMS_TS_UE2_IPADDR;
//			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE2_BEARER_IPADDR;	
//			vc_userprofile.homeDomain := PX_IMS_SUT_UE2_HOME_DOMAIN;	
//			vc_userprofile.publUsername := PX_IMS_SUT_UE2_PUBLIC_USER;
//			vc_userprofile.qop := PX_IMS_SUT_UE2_QOP;
//			vc_userprofile.privUsername := PX_IMS_SUT_UE2_PRIVAT_USERNAME;	
//			vc_userprofile.passwd := PX_IMS_SUT_UE2_PRIVAT_PASSWD;	
//			vc_userprofile.registrarDomain := PX_IMS_TS_UE2_REGISTRAR;
//			}

			case (c_userProfile_IBCFwithHomeUE)			 { 				//variant c_userProfile_IBCFwithHomeUE
			vc_userprofile.currPort := PX_IMS_TS_IBCF_PORT;				// via (Ic interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_IBCF_IPADDR;			// via
			vc_userprofile.contactPort := PX_IMS_TS_IBCF_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_IBCF_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE1_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;		// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;				// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}	

			case (c_userProfile_IBCFwithVisitingUE) { 					//variant c_userProfile_IBCFwithVisitingUE
			vc_userprofile.currPort := PX_IMS_TS_IBCF_PORT;				// via (Ic interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_IBCF_IPADDR;			// via
			vc_userprofile.contactPort := PX_IMS_TS_IBCF_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_IBCF_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;
			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE1_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;		// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;				// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}
			
			case (c_userProfile_ICSCFwithHomeUE) { 						//variant c_userProfile_ICSCFwithHomeUE - UE4 parameters
			vc_userprofile.currPort := PX_IMS_TS_ICSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_ICSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE4_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE4_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE4_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE4_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE4_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE4_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE4_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE4_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE4_REGISTRAR; 	// Authorization
			}
	
			case (c_userProfile_IBCFwithUnknownUE) { 					//variant 
			vc_userprofile.currPort := PX_IMS_TS_ICSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_ICSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_unknownUE_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}

			case (c_userProfile_PCSCFwithHomeUE) { 						//variant c_userProfile_PCSCFwithHomeUE
			vc_userprofile.currPort := PX_IMS_TS_PCSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_PCSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE1_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}
	
			case (c_userProfile_PCSCFwithVisitingUE) { 					//variant c_userProfile_PCSCFwithVisitingUE
			vc_userprofile.currPort := PX_IMS_TS_PCSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_PCSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_REGISTRAR;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE1_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}

			// another visting user in IMS (cp. TP_IMST2_MW_REG_15: different public id, same private id)
			case (c_userProfile_PCSCFwithVisitingUE2) { 				//variant
			vc_userprofile.currPort := PX_IMS_TS_PCSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_PCSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE2_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE2_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE2_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE2_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}

			// unknown visting user in IMS (cp. TP_IMST2_MW_REG_16)
			case (c_userProfile_PCSCFwithUnknownVisitingUE) { 			//variant
			vc_userprofile.currPort := PX_IMS_TS_PCSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_PCSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE2_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_unknownUE_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}

			case (c_userProfile_SCSCFwithHomeUE) { 						//variant c_userProfile_SCSCFwithHomeUE  - UE4 parameters
			vc_userprofile.currPort := PX_IMS_TS_SCSCF_PORT;			// via (Mw interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_SCSCF_IPADDR;		// via
			vc_userprofile.contactPort := PX_IMS_TS_UE4_PORT;			// contact (simulated UE)
			vc_userprofile.contactIpaddr := PX_IMS_TS_UE4_IPADDR;		// contact
			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE4_BEARER_IPADDR;	
			vc_userprofile.homeDomain := PX_IMS_SUT_UE4_HOME_DOMAIN;	// From, To (register)
			vc_userprofile.publUsername := PX_IMS_SUT_UE4_PUBLIC_USER;	// From, To (register)
			vc_userprofile.qop := PX_IMS_SUT_UE4_QOP;					// Authorization
			vc_userprofile.privUsername := PX_IMS_SUT_UE4_PRIVAT_USERNAME;	// Authorization
			vc_userprofile.passwd := PX_IMS_SUT_UE4_PRIVAT_PASSWD;			// Authorization
			vc_userprofile.registrarDomain := PX_IMS_SUT_UE4_REGISTRAR; 	// Authorization

            case (c_userProfile_SCSCFwithHomeUE_domain) { 						//variant c_userProfile_SCSCFwithHomeUE  - UE4 parameters
            vc_userprofile.currPort := PX_IMS_TS_SCSCF_PORT;			// via (Mw interface of TS)
            vc_userprofile.currIpaddr := PX_IMS_TS_SCSCF_IPADDR;		// via
            vc_userprofile.contactPort := PX_IMS_TS_UE4_PORT;			// contact (simulated UE)
            vc_userprofile.contactIpaddr := PX_IMS_TS_UE4_IPADDR;		// contact
            vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE4_BEARER_IPADDR;	
            vc_userprofile.homeDomain := PX_IMS_SUT_UE4_HOME_DOMAIN;	// From, To (register)
            vc_userprofile.publUsername := PX_IMS_SUT_UE4_PUBLIC_USER;	// From, To (register)
            vc_userprofile.qop := PX_IMS_SUT_UE4_QOP;					// Authorization
            vc_userprofile.privUsername := PX_IMS_SUT_UE4_PRIVAT_USERNAME;	// Authorization
            vc_userprofile.passwd := PX_IMS_SUT_UE4_PRIVAT_PASSWD;			// Authorization
            vc_userprofile.registrarDomain := PX_IMS_SUT_UE4_REGISTRAR; 	// Authorization
            }
            case (c_userProfile_AS1)  { 								//variant c_userProfile_AS1
            vc_userprofile.currPort := PX_IMS_TS_AS1_PORT;				// via, route(Isc interface of TS)
            vc_userprofile.currIpaddr := PX_IMS_TS_AS1_IPADDR;			// via, route
            vc_userprofile.contactPort := PX_IMS_TS_AS1_PORT;			// contact (simulated UE)
            vc_userprofile.contactIpaddr := PX_IMS_TS_AS1_IPADDR;		// contact
            vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;
            vc_userprofile.homeDomain := PX_IMS_TS_AS1_HOME_DOMAIN;		// via, routevc_userprofile.publUsername := PX_IMS_SUT_UE4_PUBLIC_USER;	// From, To (register)
            vc_userprofile.publUsername := "as1";
            vc_userprofile.qop := "";					// Authorization
            vc_userprofile.privUsername := "";	// Authorization
            vc_userprofile.passwd := "";			// Authorization
            vc_userprofile.registrarDomain := ""; 	// Authorization
			
            }
			
			case (c_userProfile_AS2)  { 								//variant c_userProfile_AS2
			vc_userprofile.currPort := PX_IMS_TS_AS2_PORT;				// via, route(Isc interface of TS)
			vc_userprofile.currIpaddr := PX_IMS_TS_AS2_IPADDR;			// via, route
			vc_userprofile.homeDomain := PX_IMS_TS_AS2_HOME_DOMAIN;		// via, route
			}
			case (c_userProfile_ECSCFwithHomeUE) { 						//variant c_userProfile_PCSCFwithHomeUE
    			vc_userprofile.currPort := PX_IMS_TS_ECSCF_PORT;			// via (Mw interface of TS)
    			vc_userprofile.currIpaddr := PX_IMS_TS_ECSCF_IPADDR;		// via
    			vc_userprofile.contactPort := PX_IMS_TS_UE1_PORT;			// contact (simulated UE)
    			vc_userprofile.contactIpaddr := PX_IMS_TS_UE1_IPADDR;		// contact
    			vc_userprofile.bearerIpaddr := PX_IMS_SUT_UE1_BEARER_IPADDR;	
    			vc_userprofile.homeDomain := PX_IMS_SUT_UE1_HOME_DOMAIN;	// From, To (register)
    			vc_userprofile.publUsername := PX_IMS_SUT_UE1_PUBLIC_USER;	// From, To (register)
    			vc_userprofile.qop := PX_IMS_SUT_UE1_QOP;					// Authorization
    			vc_userprofile.privUsername := PX_IMS_SUT_UE1_PRIVAT_USERNAME;	// Authorization
    			vc_userprofile.passwd := PX_IMS_SUT_UE1_PRIVAT_PASSWD;			// Authorization
    			vc_userprofile.registrarDomain := PX_IMS_SUT_UE1_REGISTRAR; 	// Authorization
			}
			
			}
		}

		function f_initToHeader(in integer p_user) runs on ImsComponent return To
		{
			var To p_to := c_empty_To;
			p_to := {	fieldName := TO_E,
						addressField :=
						{nameAddr := {
							displayName := omit, 	 			// optional charstring
							addrSpec :=	f_initSipUrl(p_user)	// SipUrl
						  }},//end addressField
						toParams := omit
					  };
rennoch's avatar
rennoch committed
			return(p_to);
		}


		function f_initFromHeader(in integer p_user, charstring p_tag_str) runs on ImsComponent return From
		{
			var From p_from := c_empty_From;
			p_from := {	fieldName := FROM_E,
						addressField :=
						{nameAddr := {
							displayName := omit, 	 			// optional charstring
							addrSpec :=	f_initSipUrl(p_user)	// SipUrl
						  }},//end addressField
						fromParams := {{id := c_tagId, paramValue := p_tag_str}}
					  };
			return(p_from)
		}

		function f_initSipUrl(in integer p_user) runs on ImsComponent return SipUrl
		{
			var SipUrl v_sipUrl := {	  
				scheme := c_sipScheme,  			// contains "sip"
                components := { sip:= {
                        				userInfo := omit,
                        				hostPort := {omit,omit}}},
				urlParameters := omit,
				headers := omit};
				
			var SipUrl v_urnUrl := {	  
				scheme := c_urnScheme,  			// contains "urn"
                components := { urn:= {
                        				namespaceId := "service",
                    					namespaceSpecificString := "sos"}},
				urlParameters := omit,
				headers := omit};
				
			select(p_user){
				case (c_userProfile_UE1atSUThome) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_UE1_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_UE1_HOME_DOMAIN, portField :=omit}
						}
				case (c_userProfile_UE2atSUThome) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_UE2_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_UE2_HOME_DOMAIN, portField :=omit}
				case (c_userProfile_UE3atSUThome) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_UE3_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_UE3_HOME_DOMAIN, portField :=omit}
				case (c_userProfile_UE4atSUThome) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_UE4_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_UE4_HOME_DOMAIN, portField :=omit}
				case (c_userProfile_IBCFwithHomeUE) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_IMS1UE_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_IMS1UE_HOME_DOMAIN, portField :=omit}
						}
				case (c_userProfile_ICSCFwithHomeUE) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_IMS1UE_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_IMS1UE_HOME_DOMAIN, portField :=omit}
				}
				case (c_userProfile_PCSCFwithHomeUE) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_IMS1UE_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_PCSCF_IPADDR, portField :=omit}
                case (c_userProfile_PCSCFwithVisitingUE) {
                        v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_IMS1UE_PUBLIC_USER, password:=omit};
                        v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_PCSCF_IPADDR, portField :=omit}
                }
				case (c_userProfile_SCSCFwithHomeUE) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_UE4_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_SCSCF_HOME_DOMAIN, portField :=PX_IMS_TS_SCSCF_PORT}
				}
				case (c_userProfile_SCSCFwithHomeUE_domain) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_UE4_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_SCSCF_HOME_DOMAIN, portField :=omit}
pintar's avatar
pintar committed
                case (c_userProfile_AS1) {
                        v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_IMS1UE_PUBLIC_USER, password:=omit};
                        v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_AS1_IPADDR, portField :=omit}
pintar's avatar
pintar committed
                }                
				case (c_userProfile_ECSCFwithHomeUE) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_IMS1UE_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_ECSCF_IPADDR, portField :=omit}
				case (c_userProfile_ISUP) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_TS_ISUP_PUBLIC_USER, password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_ISUP_HOME_DOMAIN, portField :=omit}
				}
				case (c_serviceProfile_EMERGENCY) {
                   		v_urnUrl.components.urn.namespaceId := PX_IMS_SUT_EMERGENCY_SERVICE_namespaceId;
                    	v_urnUrl.components.urn.namespaceSpecificString := PX_IMS_SUT_EMERGENCY_SERVICE_namespaceSpecificString;
						}
				case (c_serviceProfile_EMERGENCY_INVALID) {
                        v_urnUrl.components.urn.namespaceId := PX_IMS_SUT_EMERGENCY_SERVICE_INVALID_namespaceId;
                        v_urnUrl.components.urn.namespaceSpecificString := PX_IMS_SUT_EMERGENCY_SERVICE_INVALID_namespaceSpecificString;
						}
						
				// following setting is used for the assignment of the Path header field
				case (c_interfaceProfile_IMS_SUT_PCSCF1) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:="", password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_PCSCF1_HOME_DOMAIN, portField :=PX_IMS_SUT_PCSCF1_PORT}
						}						
						
				// following setting is used in relation to the route headers list elements
				case (c_interfaceSIPURL_IMS_SUT_PCSCF1_domain) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:="", password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_PCSCF1_HOME_DOMAIN, portField :=PX_IMS_SUT_PCSCF1_PORT}
						}						
				case (c_interfaceSIPURL_IMS_SUT_PCSCF1_ip) {
						v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:="", password:=omit};
						v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_PCSCF1_IPADDR, portField :=PX_IMS_TS_SCSCF_PORT}
						}						
                case (c_interfaceProfile_IMS_SUT_SCSCF) {
                        v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:="", password:=omit};
                        v_sipUrl.components.sip.hostPort := {host := PX_IMS_TS_SCSCF_HOME_DOMAIN, portField :=PX_IMS_SUT_PCSCF1_PORT}
                        }
				case (c_conferenceProfile_factoryURI) {
        				v_sipUrl.components.sip.userInfo := {userOrTelephoneSubscriber:=PX_IMS_SUT_CONF_FACTORY_NAME, password:=omit};
        				v_sipUrl.components.sip.hostPort := {host := PX_IMS_SUT_CONF_HOME_DOMAIN, portField := omit}
					}						
			if(p_user == c_serviceProfile_EMERGENCY or p_user == c_serviceProfile_EMERGENCY_INVALID)
				{return(v_urnUrl)}
			else
				{return(v_sipUrl)}
		 * @desc sets user parameters with PIXIT values
		 * @param p_user identifies the selected user configuration and location
		 * @verdict 
		 */
		function f_init_interfaceprofile(in integer p_interface) runs on ImsComponent
		{
			select(p_interface){
				case (c_interfaceProfile_IMS_SUT_IBCF1) { //variant c_interfaceProfile_IMS_SUT_IBCF1
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_IBCF1_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_IBCF1_IPADDR;	
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_IBCF1_HOME_DOMAIN;	
				}
				case (c_interfaceProfile_IMS_SUT_IBCF2) { //variant c_interfaceProfile_IMS_SUT_IBCF2
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_IBCF2_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_IBCF2_IPADDR;	
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_IBCF2_HOME_DOMAIN;
				}
				case (c_interfaceProfile_IMS_SUT_PCSCF1) { //variant c_interfaceProfile_IMS_SUT_PCSCF1
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_PCSCF1_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_PCSCF1_IPADDR;	
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_PCSCF1_HOME_DOMAIN;
				}
				case (c_interfaceProfile_IMS_SUT_PCSCF2) { //variant c_interfaceProfile_IMS_SUT_PCSCF2
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_PCSCF2_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_PCSCF2_IPADDR;	
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_PCSCF2_HOME_DOMAIN;
				}
				case (c_interfaceProfile_IMS_SUT_PCSCF) { //variant c_interfaceProfile_IMS_SUT_PCSCF
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_PCSCF_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_PCSCF_IPADDR;
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_PCSCF_HOME_DOMAIN;	
				}
				case (c_interfaceProfile_IMS_SUT_SCSCF) { //variant c_interfaceProfile_IMS_SUT_SCSCF
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_SCSCF_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_SCSCF_IPADDR;	
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_SCSCF_HOME_DOMAIN;				
				}
				case (c_interfaceProfile_IMS_SUT_ICSCF) { //variant c_interfaceProfile_IMS_SUT_ICSCF
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_ICSCF_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_ICSCF_IPADDR;		
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_ICSCF_HOME_DOMAIN;
				}
				case (c_interfaceProfile_IMS_SUT_MGCF) { //variant c_interfaceProfile_IMS_SUT_MGCF
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_IMGCF_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_IMGCF_IPADDR;		
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_IMGCF_HOME_DOMAIN;
				}
				case (c_interfaceProfile_IMS_SUT_AS) { //variant c_interfaceProfile_IMS_SUT_AS
				vc_interfaceprofile.SUTPort := PX_IMS_SUT_AS_PORT;
				vc_interfaceprofile.SUTIpaddr := PX_IMS_SUT_AS_IPADDR;		
				vc_interfaceprofile.SUTHomeDomain := PX_IMS_SUT_AS_HOME_DOMAIN;
				}
		}	
		
        /*
         * 
         * @desc retrieves user DomainPort value of the interface profile
         * @param p_interface identifies the selected interface
         * @return DomainPort template 
         */
        function f_get_userDomainPort (in SipUserProfile p_userProfile) runs on ImsComponent return /*template*/ HostPort
        {
                return {p_userProfile.homeDomain, p_userProfile.currPort}
        }
		 * @desc retrieves HostPort value of the interface profile
		 * @param p_interface identifies the selected interface
		 * @return HostPort template 
		 */
		function f_get_interfaceHostPort (in ImsInterfaceProfile p_interface) runs on ImsComponent return /*template*/ HostPort // STS commented out template but check why in there in first place
		{
				return {p_interface.SUTIpaddr,p_interface.SUTPort}
		}	
		
		/*
		 * 
		 * @desc retrieves DomainPort value of the interface profile
		 * @param p_interface identifies the selected interface
		 * @return DomainPort template 
		 */
		function f_get_interfaceDomainPort (in ImsInterfaceProfile p_interface) runs on ImsComponent return /*template*/ HostPort
		{
				return {p_interface.SUTHomeDomain,p_interface.SUTPort}
		}	
		
		/*
		 * @desc retrieves SipUrl of the interface profile
		 * @param p_interface identifies the selected interface
		 * @return SipUrl template 
		 */
		function f_get_interfaceNameAddr(in ImsInterfaceProfile p_interface) runs on ImsComponent return template NameAddr
		{
				return mw_SipUrl_SUTinterface(p_interface.SUTIpaddr,p_interface.SUTPort)
		}		
		
		
	}
	group registration {

		/**
		 * 
		 * @desc  registration and authentication with MD5
		 * @param p_cSeq_s		cseq parameter 
		 * @param p_auth		flag indicating if authentication is needed
		 */
		function f_Registration_IMS(inout CSeq p_cSeq_s, in boolean p_auth) runs on SipComponent
		{
			f_setHeaders_REGISTER(p_cSeq_s);
			f_SendREGISTER(m_REGISTER_Request_IMS(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, m_add_Authorization_digest(vc_authorization,{c_Integrity_protected_no}))); //LibSip
		
			//awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
			if (p_auth)
			{
			  // receiving 401 Unauthorized response.
			  // and Re-send REGISTER request with Authorization header
			  tc_ack.start(PX_SIP_TACK);
			  alt
			  {
				[] SIPP.receive	(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response
				  {
					tc_ack.stop;
					// set headers via, cseq and authorization
					f_setHeaders_2ndREGISTER(p_cSeq_s);
					f_SendREGISTER(m_REGISTER_Request_IMS(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, m_add_Authorization_digest(vc_authorization,{c_Integrity_protected_yes}))); //LibSip
	            
					// awaiting 200 OK REGISTER
					f_awaitingOkResponse(p_cSeq_s);
					f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
				  }
				[] SIPP.receive	(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s))
				  {
					tc_ack.stop;
					log ("Authorization was not requested as expected");
					setverdict(inconc)
				  }
			  }
			}
			else
			{
			  f_awaitingOkResponse(p_cSeq_s);
			  f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
			};
		}//end function f_Registration_IMS

		/**
		 * 
		 * @desc  awaiting UE1 registration (with authentication)
		 * @param p_cSeq_s		cseq parameter 
		 */
		function f_awaitingRegistration_IMS(inout CSeq p_cSeq_s) runs on ImsComponent
		var SipUrl v_passociated_url;
		var Authorization p_authorization;
		//Awaiting 1st REGISTER	
		f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);

		// 401 response
		f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401,
			vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via,
			m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization
									(PX_IMS_SUT_UE1_QOP,vc_authorization.body[0].digestResponse)))
			);

		//Awaiting 2nd REGISTER	with authorization header
		f_awaitingREGISTER(mw_REGISTER_authorizedRequest_IMS(m_Authorization_digest(mw_digestResponse((c_Integrity_protected_yes,c_Integrity_protected_ip_assoc_pending)))));

		// 200OK to complete the request
		vc_contact := vc_request.msgHeader.contact;
		vc_contact.contactBody.contactAddresses[0].contactParams := {{"expires",int2str(3600)}};
		v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec;
		f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact,f_initSipUrl(c_userProfile_SCSCFwithHomeUE),v_passociated_url));

		}//end function f_awaitingRegistration_IMS

		/**
		 * 
		 * @desc  awaiting UE1 registration (with authentication)
		 * @param p_cSeq_s		cseq parameter 
		 */
		function f_awaitingRegistration_IMS_gm(inout CSeq p_cSeq_s) runs on ImsComponent
		{
            var SipUrl v_passociated_url;
            var Authorization p_authorization;
            vc_ignore_subscribe := true;//handle SUBSCRIBE during the call
    		//Awaiting 1st REGISTER	
    		f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);
    
    		// 401 response
    		f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401,
    			vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via,
    			m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization
    									(PX_IMS_SUT_UE1_QOP,vc_authorization.body[0].digestResponse)))
    			);
    
    		//Awaiting 2nd REGISTER	with authorization header
            f_awaitingREGISTER(mw_REGISTER_authorizedRequest_wo_securityheaders_IMS);
    		//f_awaitingREGISTER(mw_REGISTER_authorizedRequest_IMS(m_Authorization_digest(mw_digestResponse((c_Integrity_protected_yes,c_Integrity_protected_ip_assoc_pending)))));
    
    		// 200OK to complete the request
    		vc_contact := vc_request.msgHeader.contact;
    		vc_contact.contactBody.contactAddresses[0].contactParams := {{"expires",int2str(3600)}};
    		v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec;
    		f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact,f_initSipUrl(c_userProfile_SCSCFwithHomeUE),v_passociated_url));
rennoch's avatar
rennoch committed
            vc_DeregDone := false; 
		}//end function f_awaitingRegistration_IMS_gm


	/**
	 * 
	 * @desc remove registration
	 * @param p_cSeq_s cseq parameter
	 */	
	function f_RemoveRegistration_IMS(inout CSeq p_cSeq) runs on SipComponent
	{
	  var CommaParam_List v_challenge;
	  var Credentials v_credentials;
	  var template REGISTER_Request v_request;
	  
	  if (PX_SIP_REGISTRATION)
	  {
		f_setHeaders_deREGISTER(p_cSeq);
		v_request := m_REGISTER_Request_expires_IMS(vc_requestUri, vc_callIdReg,
		p_cSeq,  vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0");
		v_request.msgHeader.route := f_route();
		
		f_SendREGISTER(v_request);
		if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED)
		{
			// receiving 401 Unauthorized response.
			// and Re-send REGISTER request with Authorization header
			tc_ack.start(PX_SIP_TACK);
			alt
			{
			  [] SIPP.receive	(mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response
				{
				  tc_ack.stop;
				  // set headers via, cseq and authorization
				  f_setHeaders_2ndREGISTER(p_cSeq);
					v_request := m_REGISTER_Request_expires_IMS(vc_requestUri, vc_callIdReg,
					p_cSeq,  vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0");
					v_request.msgHeader.route := f_route();
				  // Re-send protected REGISTER
				  f_SendREGISTER(v_request);//LibSip
				  
				  // awaiting 200 OK REGISTER
				  f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
				}
			  [] SIPP.receive	(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq))-> value vc_response
				{
        			tc_ack.stop;
        			f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
        			log ("Authorization was not requested as expected");
				}
			}
		}
		else
		{
		  f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
		}
	  }
	} // end f_RemoveRegistration_IMS
		

	} // end group registration
	
	group preambles {
		
		/*
		 * 
		 * @desc  Sets variables and default initialization for user profile where proxy role is present
		 * @param p_userprofile	user profile of call
		 * @param p_cSeq_s 		cseq parameter
		 */
		function f_IMS_preamble_MGCF(in integer p_userprofile, inout CSeq p_cSeq_s)  runs on ImsComponent
		{
			vc_boo_recordRoute := true;
			vc_boo_route := true;
			f_init_interfaceprofile(c_interfaceProfile_IMS_SUT_MGCF);
			
			f_IMS_preamble_woRegistration(p_userprofile, p_cSeq_s);
		}
		
		/*
		 * 
		 * @desc  Sets variables and default initialization for user profile
		 * @param p_userprofile	user profile of call
		 * @param p_cSeq_s 		cseq parameter
		 */
		function f_IMS_preamble_woRegistration(in integer p_userprofile, inout CSeq p_cSeq_s)  runs on ImsComponent
		{
			// avoid deregistration in default behavior
			vc_DeregDone := true; 
			vc_boo_route := true;
   			vc_boo_recordRoute := true;
		 
			//Variables & defaults initialization
			LibSip_Steps.f_init_component(p_cSeq_s);

			//Preamble
rennoch's avatar
rennoch committed
			f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
			vc_sdp_local := valueof(m_SDP_bandwidth(valueof(m_media_dynPT(PX_SIP_SDP_dyn, PX_SIP_SDP_encoding)), vc_userprofile));
			vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
		*
		* @desc  Sets variables and default initialization for user profile and handle registration and authentication with MD5 
		* @param p_userprofile   	user profile of call
		* @param p_cSeq_s		  	cseq parameter
		* @param p_register		register template
		*/
		function f_IMS_preamble_withRegistration (in integer p_userprofile, in integer p_interface, inout CSeq p_cSeq_s, template REGISTER_Request p_register) runs on ImsComponent

            f_init_interfaceprofile(p_interface);
			//Variables & defaults initialization
			f_IMS_preamble_woRegistration(p_userprofile, p_cSeq_s);
	
			//Preamble
			f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);

			//	deregistration in case of successful registration
			vc_DeregDone := false;
						
			f_setHeaders_SUBSCRIBE(p_cSeq_s);
			f_Subscription(p_cSeq_s, m_SUBSCRIBE_Request_UE(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via, vc_contact, vc_route_REG));

		 * 
		 * @desc  Sets variables and default initialization for user profile and handle registration and authentication with MD5 
		 *			(basic registration template)
		 * @param p_userprofile   	user profile of call
		 * @param p_cSeq_s		  	cseq parameter
		function f_IMS_preamble_withRegistrationBasic (in integer p_userprofile,in integer p_interface, inout CSeq p_cSeq_s) runs on ImsComponent
            f_init_interfaceprofile(p_interface);		
			//Variables & defaults initialization
			f_IMS_preamble_woRegistration(p_userprofile, p_cSeq_s);
	
			//Preamble
   			f_Registration_IMS(p_cSeq_s, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);
			f_setHeaders_SUBSCRIBE(p_cSeq_s);
			f_Subscription(p_cSeq_s, m_SUBSCRIBE_Request_UE(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via, vc_contact, vc_route_REG));
		}		

        /*
         * 
         * @desc  Sets variables and default initialization for user profile and handle registration and authentication with MD5 
         *			(basic registration template)
         * @param p_userprofile   	user profile of call
         * @param p_cSeq_s		  	cseq parameter
         */
        function f_IMS_preamble_AS (in integer p_userprofile, in integer p_interface, inout CSeq p_cSeq_s) runs on ImsComponent
        {
            // avoid deregistration in default behavior
            vc_DeregDone := true; 
            vc_boo_route := true;
            vc_boo_recordRoute := true;
            vc_cSeq := p_cSeq_s;
	
            //Defaults
            vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
            vc_default := activate (a_altstep_AS());

            //Preamble
            f_init_interfaceprofile(p_interface);
            f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
            vc_sdp_local := valueof(m_SDP_bandwidth(valueof(m_media_dynPT(PX_SIP_SDP_dyn, PX_SIP_SDP_encoding)), vc_userprofile));
            vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
        }			
		
	} // end group preambles
	
	group postambles {
		/*
		*
		* @desc  Sets variables and default initialization for user profile and handle deregistration
		* @param p_cSeq_s		  	cseq parameter
		*/
	 	function f_IMS_postamble_withDeRegistration (CSeq p_CSeq) runs on ImsComponent {
	 		f_RemoveRegistration(p_CSeq); // TODO check if applicable for IMS
	 		
    		f_terminate_component();
	 	}
	 
        /*
        *
        * @desc  Sets variables and default initialization for user profile and handle deregistration on AS as TS
        * @param p_cSeq_s		  	cseq parameter
        */
        function f_IMS_postamble_AS_withDeRegistration (boolean p_deRegistration) runs on ImsComponent {
            
            if(p_deRegistration == true)
                {f_awaitingREGISTER_sendReply(mw_REGISTER_Request_Base,true);}
            f_terminate_component();
        }
		
		function f_SIP_postamble_IMS1_withoutRegistration () runs on ImsComponent
		{f_terminate_component()};
			
		function f_IMS_postamble_withoutDeRegistration () runs on ImsComponent
		{f_terminate_component()};
  
  		function f_SIP_postamble_IMS1_awaitDeRegistration () runs on ImsComponent
		{
			var SipUrl v_passociated_url;
			//Awaiting 1st REGISTER	
			f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);

			// 401 response
			f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401,
				vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via,
				m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization
										(PX_IMS_SUT_UE1_QOP,vc_authorization.body[0].digestResponse)))
				);

			//Awaiting 2nd REGISTER	with authorization header
			f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);//mw_REGISTER_authorizedRequest_IMS(m_Authorization_digest(mw_digestResponse(c_Integrity_protected_yes))));
//			f_awaitingREGISTER(mw_REGISTER_authorizedRequest_IMS(m_Authorization_digest(mw_digestResponse(c_Integrity_protected_yes))));
//			vc_contact := vc_request.msgHeader.contact;
//			vc_contact.contactBody.contactAddresses[0].contactParams := {{"expires",int2str(0)}};
			v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec;
			f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact,f_initSipUrl(c_userProfile_SCSCFwithHomeUE),v_passociated_url));

			f_terminate_component()
		};
		
  		function f_IMS_postamble_awaitDeRegistration () runs on ImsComponent
		{	
			var SipUrl v_passociated_url;
			//Awaiting 1st REGISTER
  	
			f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);

			// 401 response
			f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401,
				vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via,
				m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization
										(PX_IMS_SUT_UE1_QOP,vc_authorization.body[0].digestResponse)))
				);

			//Awaiting 2nd REGISTER	with authorization header
			f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);//mw_REGISTER_authorizedRequest_IMS(m_Authorization_digest(mw_digestResponse(c_Integrity_protected_yes))));

			// 200OK to complete the request
//			vc_contact := vc_request.msgHeader.contact;
//			vc_contact.contactBody.contactAddresses[0].contactParams := {{"expires",int2str(0)}};
			v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec;
			f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact,f_initSipUrl(c_userProfile_SCSCFwithHomeUE),v_passociated_url));
		
        function f_IMS_awaitDeRegistration () runs on ImsComponent
        {	
            var SipUrl v_passociated_url;
            //Awaiting 1st REGISTER
  	
            f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);

            // 401 response
            f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401,
                vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via,
                m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization
                                        (PX_IMS_SUT_UE1_QOP,vc_authorization.body[0].digestResponse)))
                );

            //Awaiting 2nd REGISTER	with authorization header
            f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS);//mw_REGISTER_authorizedRequest_IMS(m_Authorization_digest(mw_digestResponse(c_Integrity_protected_yes))));

            // 200OK to complete the request
//          vc_contact := vc_request.msgHeader.contact;
//          vc_contact.contactBody.contactAddresses[0].contactParams := {{"expires",int2str(0)}};
            v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec;
            f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact,f_initSipUrl(c_userProfile_SCSCFwithHomeUE),v_passociated_url));
        };

		function f_SIP_postamble_UE1_withoutRegistration () runs on ImsComponent
		{f_terminate_component()};
			
		function f_SIP_postamble_UE2_withoutRegistration () runs on ImsComponent
		{f_terminate_component()};
		
		/**
		 * 
		 * @desc sends BYE and awaits response
		 * @param p_CallId parameter for outgoing BYE
		 * @param p_cSeq parameter for outgoing BYE
		 * @param p_from parameter for outgoing BYE
		 * @param p_to parameter for outgoing BYE
		 * @param p_reqHostPort parameter for outgoing BYE
		 */
		function f_terminateCall_IMS(SipUrl p_requestUri, CallId p_CallId, inout CSeq p_cSeq, From p_from,
		  template To p_to) runs on ImsComponent
		{
          LibSip_Steps.f_setHeadersBYE(p_cSeq);
		  // Sending of a BYE request to release the call and expect a final response
		  f_SendBYE(m_BYE_Request_IMS(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, vc_route));
      
		  tc_resp.start(PX_SIP_TRESP);
		  alt
		  {
			[] SIPP.receive	(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq))
			  {
				repeat;
			  }
			[] SIPP.receive	(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq))
			  {
				tc_resp.stop;
			  }
			// timeout should be handled in default_alt_step
		  }
		} // end function f_terminateCall
		
		
		/**
		 * 
		 * @desc  sends BYE and awaits response
		 * @param p_CallId parameter for outgoing BYE
		 * @param p_cSeq parameter for outgoing BYE
		 * @param p_from parameter for outgoing BYE
		 * @param p_to parameter for outgoing BYE
		 * @param p_reqHostPort parameter for outgoing BYE
		 */
		function f_terminateCall_UE(SipUrl p_requestUri, CallId p_CallId, inout CSeq p_cSeq, From p_from,
garciay's avatar
garciay committed
		  template To p_to, template RecordRoute p_recordRoute := omit) runs on ImsComponent
poglitsch's avatar
poglitsch committed
		  LibSip_Steps.f_setHeadersBYE(p_cSeq);
		  // Sending of a BYE request to release the call and expect a final response
garciay's avatar
garciay committed
		  if(ispresent(p_recordRoute)) {
		    var Route v_route := { ROUTE_E, valueof(p_recordRoute.routeBody)};
		  	f_SendBYE(m_BYE_Request_UE(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, v_route));
		  } else {
		  	f_SendBYE(m_BYE_Request_UE(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, vc_route));
		  }
		  
		  tc_resp.start(PX_SIP_TRESP);
		  alt
		  {
			[] SIPP.receive	(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq))
			  {
				repeat;
			  }
			[] SIPP.receive	(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq))
			  {
				tc_resp.stop;
			  }
			// timeout should be handled in default_alt_step
		  }
		} // end function f_terminateCall_UE
		
		
        /**
         * 
         * @desc  sends BYE and awaits response and De-registration
         * @param p_CallId parameter for outgoing BYE
         * @param p_cSeq parameter for outgoing BYE
         * @param p_from parameter for outgoing BYE
         * @param p_to parameter for outgoing BYE
         * @param p_reqHostPort parameter for outgoing BYE
         */
        function f_terminateCall_UE_withDeReg(SipUrl p_requestUri, CallId p_CallId, inout CSeq p_cSeq, From p_from,
          template To p_to) runs on ImsComponent
        {
          LibSip_Steps.f_setHeadersBYE(p_cSeq);
          // Sending of a BYE request to release the call and expect a final response
          f_SendBYE(m_BYE_Request_UE(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, vc_route));
      
          tc_resp.start(PX_SIP_TRESP);
          alt
          {
            [] SIPP.receive	(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq))
              {
                repeat;
              }
            [] SIPP.receive	(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq))
              {
                tc_resp.stop;
              }
            // timeout should be handled in default_alt_step
          };
          action("Please de-register");          
          f_IMS_awaitDeRegistration();
          //f_terminate_component();
        } // end function f_terminateCall_UE_withDeReg
		
        altstep a_clearRegistration_IMSuser() runs on ImsComponent
rennoch's avatar
rennoch committed
        {
            var Response v_response;
            var Request v_request;
		 
            [] any timer.timeout 
            {
                setverdict(fail); 
                all timer.stop; 
                //TODO check how to solve release of call 
                //f_SendCANCEL(m_CANCEL_Request(vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_reqHostPort, vc_via )); // difference between registration state or transaction state
                vc_callId := vc_callIdReg;
                action("Please de-register");          
                f_IMS_awaitDeRegistration();
                f_componentStop(); 
            }
            // allow repeated INVITEs
            [vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base)
            {
              repeat
            }
		
            // allow repeated BYEs after ack of the first BYE
            [vc_ignore_bye] SIPP.receive (mw_BYE_Request_Base(?))
            {
              repeat
            }
            [] SIPP.receive (mw_ACK_Request_Base(?))
            {
                repeat
            }
            // allow 100 replies
            [] SIPP.receive(mw_Response_Base(c_statusLine100,?, ?))
              {
                repeat
              }
			  
            //	ignore 181 if flag is set (following TS 183004 §4.5.2.1)		  
            [vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181,vc_callId, vc_cSeq))-> value v_response sender vc_sent_label
              { 
                f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response); 
                repeat;
              } 
	  
            // according to SIP chap.8.1.3.2
            [] SIPP.receive(mw_Response_Base(c_statusLine183,vc_callId, vc_cSeq))
              { 
                repeat;
              } 

            // ignore 484 if flag is set
            [vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484,vc_callId, vc_cSeq))
                {
                  repeat
                }
		
            [vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx,vc_callId, ?))-> value v_response sender vc_sent_label
              { 
                f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response); 
                f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
                repeat
              }			
		
            [vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?))
              { 
                repeat
              }
	
            [] SIPP.receive(mw_INFO_Request_Base(vc_callId))->value v_request sender vc_sent_label
              { 
                f_setHeadersOnReceiptOfRequest(v_request); 
                f_send200OK();
                repeat
              }
		  
            // awaiting of Notify
            [] SIPP.receive(mw_NOTIFY_Request_Base(vc_callId))->value v_request sender vc_sent_label
              { 
                f_setHeadersOnReceiptOfRequest(v_request); 
                f_send200OK();
                repeat
              }
            // awaiting of subscribe from UE
            [vc_ignore_subscribe] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
              {
                f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
                f_send200OK();
                repeat;
              }
		  
            //awaiting of subscribe on proxy
            [] SIPP.receive(mw_SUBSCRIBE_Request_Base)->value v_request sender vc_sent_label
              { 
                f_setHeadersOnReceiptOfRequest(v_request); 
                f_sendResponse(m_Response_Contact(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact));
                //f_setHeadersGeneral(vc_cSeq, "NOTIFY"); // cseq, contact, branch, via
                //f_SendNOTIFY(m_NOTIFY_Request_contact(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_contact));
                log(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec);
                f_SendNOTIFY(m_NOTIFY_Request_contact(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact));		
                f_awaitingOkResponse(vc_cSeq);
                repeat
              }            
            // unexpected BYE is acknowledged to avoid retransmissions
            [] SIPP.receive(mw_BYE_Request_Base(?))-> value v_request sender vc_sent_label
              {
                setverdict(fail);
                f_setHeadersOnReceiptOfRequest(v_request); 
                f_send200OK();
                action("Please de-register");          
                f_IMS_awaitDeRegistration();
                f_componentStop(); 
                }			  
			  
            // unexpected CANCEL is acknowledged to avoid retransmissions
            [] SIPP.receive(mw_CANCEL_Request_Base(?))-> value v_request sender vc_sent_label
              {
                setverdict(fail);
                f_setHeadersOnReceiptOfRequest(v_request);
                //Answer to the CANCEL
                f_send200OK();
                action("Please de-register");          
                f_IMS_awaitDeRegistration();
                f_componentStop(); 
                }
            // catch 4xx response
            [] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?))-> value v_response sender vc_sent_label
            { 
                setverdict(fail);
                f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response); 
                LibSip_Steps.f_setHeadersACK();
                f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
                action("Please de-register");          
                f_IMS_awaitDeRegistration();
                f_componentStop(); 
            }
            // catch 5xx response
            [] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?))-> value v_response sender vc_sent_label
            { 
                setverdict(fail);
                f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response); 
                LibSip_Steps.f_setHeadersACK();
                f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
                action("Please de-register");          
                f_IMS_awaitDeRegistration();
                f_componentStop(); 
            }	
            // catch invalid REGISTER	  
            [] SIPP.receive(mw_REGISTER_Request_Base)-> value v_request sender vc_sent_label
            {
                setverdict(fail); 
                f_componentStop(); 
            }
            // any	  
            [] SIPP.receive
            {
                setverdict(fail); 
                all timer.stop; 
//              f_setHeadersCANCEL(vc_cSeq);
//              f_SendCANCEL(m_CANCEL_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_via )); // difference between registration state or transaction state
                action("Please de-register");          
                f_IMS_awaitDeRegistration();
                f_componentStop(); 
            }
        }

        /**
         * 
         * @desc main default altstep to handle unexpected messages and timeout
         * @verdict fail for all unexpected branches
         */	
        altstep a_altstep_AS() runs on SipComponent
        {
            var Response v_response;
            var Request v_request;
 
            [] any timer.timeout 
            {
                setverdict(fail); 
                all timer.stop; 
            }
        
            // allow repeated INVITEs
            [vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base)
            {
              repeat
            }
            //handle REGISTER requests	  
            [] SIPP.receive(mw_REGISTER_Request_Base)-> value v_request sender vc_sent_label
            {
                f_setHeadersOnReceiptOfREGISTER(v_request);
                //vc_contact := vc_request.msgHeader.contact;
                f_sendResponse(m_Response_Contact(c_statusLine200,vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via, vc_contact));
                repeat;
            } 
  
                // according to SIP chap.8.1.3.2
            [] SIPP.receive(mw_Response_Base(c_statusLine183,vc_callId, vc_cSeq))
              { 
                repeat;
              }			  
			  
            // unexpected CANCEL is acknowledged to avoid retransmissions
            [] SIPP.receive(mw_CANCEL_Request_Base(?))-> value v_request sender vc_sent_label
              {
                setverdict(fail);
                f_setHeadersOnReceiptOfRequest(v_request);
                f_send200OK(); 

            // unexpected BYE is acknowledged to avoid retransmissions
            [] SIPP.receive(mw_BYE_Request_Base(?))-> value v_request sender vc_sent_label
              {
                setverdict(fail);
                f_setHeadersOnReceiptOfRequest(v_request); 
                f_send200OK();
              }
  
            [] SIPP.receive(mw_Response_Base(? ,vc_callId, vc_cSeq))-> value vc_response
              { 
                log("Response matched in DEFAULT!!!");
                setverdict(fail);
                repeat;
              }
            // any	  
            [] SIPP.receive
            {
                setverdict(fail); 
                all timer.stop; 
            }
        }
} // module LibIms_Steps