LibIms_Steps.ttcn 66.8 KB
Newer Older
			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, inout CSeq p_cSeq_s, template REGISTER_Request p_register) runs on ImsComponent
		{
		
			//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, inout CSeq p_cSeq_s) runs on ImsComponent
		{
		
			//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));
		}			
		
	} // 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();
	 	}
		
		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,
		  template To p_to) 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
		  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(); 
            }
        }
} // module LibIms_Steps