Compare Revisions

The credentials to download the source code are:
 Username: svnusers
 Password: svnusers

Ignore whitespace Rev 631 → Rev 632

/trunk/XSDAUX.ttcn
File deleted
/trunk/ttcn/LibSip_Interface.ttcn
1,188 → 1,208
/*
* @author STF 346, STF366, STF368, STF369, STF450
/**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module provides the types used by the test component
* @desc This module provides the types used by the test component
* for SIP-IMS tests. Module become from STF306 and STF334-336
* This module is part of LibSipV2.
* This module is part of LibSipV3.
*/
module LibSip_Interface {
// LibCommon
import from LibCommon_Sync all;
import from LibCommon_AbstractData all;
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
// LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_XMLTypes all;
 
module LibSip_Interface
{
//LibCommon
import from LibCommon_Sync all;
import from LibCommon_AbstractData all;
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
//LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_XMLTypes all;
import from LibSip_PIXITS all;
import from LibSip_PIXITS all;
 
group AdressTypes
{
type record address4SIP
{
//HostPort
charstring host optional, // hostname, IPv4 or IPv6
integer portField optional // represented as an integer
} with { encode "SIPCodec" }
group AdressTypes {
type record Address4SIP {
// HostPort
charstring host optional,
// hostname, IPv4 or IPv6
integer portField
optional // represented as an integer
} with {
encode "LibSip V3";
}
 
type address4SIP address;
type Address4SIP address;
 
}// end group AdressTypes
 
type port SipPort message {
inout Request,
REGISTER_Request,
INVITE_Request,
OPTIONS_Request,
BYE_Request,
CANCEL_Request,
ACK_Request,
PRACK_Request,
NOTIFY_Request,
SUBSCRIBE_Request,
PUBLISH_Request,
UPDATE_Request,
REFER_Request,
MESSAGE_Request,
INFO_Request,
Response,
Raw } with { extension "address" };
signature s_SIP_conversation (in charstring text, out boolean answer);
signature s_SIP_ringing (in charstring text, out boolean answer);
signature s_SIP_announcementA (in charstring text, out boolean answer);
signature s_SIP_announcementB (in charstring text, out boolean answer);
signature s_SIP_announcement (in charstring text, out boolean answer);
signature s_SIP_voiceMessage (in charstring text, out boolean answer);
signature s_SIP_mediastopped (in charstring text, out boolean answer);
type port operatorPort procedure {inout s_SIP_conversation; inout s_SIP_ringing; inout s_SIP_announcementA; inout s_SIP_announcementB; inout s_SIP_announcement; inout s_SIP_voiceMessage; inout s_SIP_mediastopped};
// Solution for building error problem. (Important for validation)
//type component ImsComponent extends SipComponent need to be located in LibIms_Interface and not in LibSip_Interface module
//With this solution TAU compiler error.
// type component ImsComponent extends SipComponent
// {
// // general variables
// var ImsInterfaceProfile vc_interfaceprofile
// } // end ImsComponent
} // end group AdressTypes
 
type component SipComponent
{
//port
port SipPort SIPP;
// used for communication with the operator
port operatorPort opPort;
type port SipPort message {
inout Request, REGISTER_Request, INVITE_Request, OPTIONS_Request, BYE_Request, CANCEL_Request, ACK_Request, PRACK_Request, NOTIFY_Request, SUBSCRIBE_Request, PUBLISH_Request, UPDATE_Request, REFER_Request, MESSAGE_Request, INFO_Request, Response, Raw;
}
with {
extension "address";
}
 
// current address to send TCP/UDP messages
var SipUserProfile vc_userprofile; // PIXIT userinformation
var address vc_sent_label;//removed because this value is predefined and used to open socket := {host := PX_SIP_SUT_IPADDR, portField := PX_SIP_SUT_PORT};
signature s_SIP_conversation(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_ringing(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_announcementA(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_announcementB(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_announcement(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_voiceMessage(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_mediastopped(
in charstring p_text,
out boolean p_answer
) ;
type port OperatorPort procedure {
inout s_SIP_conversation;
inout s_SIP_ringing;
inout s_SIP_announcementA;
inout s_SIP_announcementB;
inout s_SIP_announcement;
inout s_SIP_voiceMessage;
inout s_SIP_mediastopped;
}
 
// last incoming message
var Response vc_response; // last incoming response message
var boolean vc_boo_response := false; // to check if response received or not
var Request vc_request; // last incoming request message
var boolean vc_boo_request := false; // to check if request received or not
var Request vc_requestFor407; // last INVITE request to be authorized if 407/401 received from Proxy
// Solution for building error problem. (Important for validation)
// type component ImsComponent extends SipComponent need to be located in LibIms_Interface and not in LibSip_Interface module
// With this solution TAU compiler error.
// type component ImsComponent extends SipComponent
// {
// // general variables
// var ImsInterfaceProfile vc_interfaceprofile
// } // end ImsComponent
type component SipComponent extends SelfSyncComp {
// port
port SipPort SIPP;
// used for communication with the operator
port OperatorPort opPort;
 
var SipUrl vc_requestUri := c_empty_RequestUri;
var SipUrl vc_requestUri2 := c_empty_RequestUri;//MRO
var charstring vc_branch := "";
var charstring vc_branch_ICSCF := "";
var charstring vc_branch_SCSCF := "";
// current address to send TCP/UDP messages
var SipUserProfile vc_userprofile; // PIXIT userinformation
var address vc_sent_label; // removed because this value is predefined and used to open socket := {host := PX_SIP_SUT_IPADDR, portField := PX_SIP_SUT_PORT};
// last incoming message
var Response vc_response; // last incoming response message
var boolean vc_boo_response := false; // to check if response received or not
var Request vc_request; // last incoming request message
var boolean vc_boo_request := false; // to check if request received or not
var Request vc_requestFor407; // last INVITE request to be authorized if 407/401 received from Proxy
var SipUrl vc_requestUri := c_empty_RequestUri;
var SipUrl vc_requestUri2 := c_empty_RequestUri; // MRO
var charstring vc_branch := "";
var charstring vc_branch_ICSCF := "";
var charstring vc_branch_SCSCF := "";
 
// SIP message header fields (for building next message)
var CallId vc_callId := c_empty_CallId;
var CallId vc_callIdReg := c_empty_CallId;
var From vc_from := c_empty_From;
var To vc_to := c_empty_To;
var To vc_cancel_To := c_empty_To; // used for next CANCEL
var Via vc_via := c_empty_Via;
var Via vc_via_REG := c_empty_Via; // via used in last REGISTER
var ContentType vc_contentType:= c_empty_ContentType;//MRO
var template RecordRoute vc_recordRoute; // value of RecordRoute header
var boolean vc_boo_recordRoute := false; // boolean indicates valid recordRoute
var template Route vc_route; // value of Route header
var template Route vc_route_REG; // value of Route header from registration ServiceRoute header for initial Requests
var boolean vc_boo_route := false; // boolean indicates valid Route
// SIP message header fields (for building next message)
var template(omit) CallId vc_callId := c_empty_CallId;
var template(omit) CallId vc_callIdReg := c_empty_CallId;
var template(omit) CallId vc_callIdSub := c_empty_CallId;
var From vc_from := c_empty_From;
var To vc_to := c_empty_To;
var To vc_cancel_To := c_empty_To; // used for next CANCEL
var Via vc_via := c_empty_Via;
var Via vc_via_REG := c_empty_Via; // via used in last REGISTER
var ContentType vc_contentType := c_empty_ContentType; // MRO
var template(omit) RecordRoute vc_recordRoute; // value of RecordRoute header
var boolean vc_boo_recordRoute := false; // boolean indicates valid recordRoute
var template(omit) Route vc_route; // value of Route header
var template(omit) Route vc_route_REG; // value of Route header from registration ServiceRoute header for initial Requests
var
UrnUriComponents
vc_reqUrnUri := {
namespaceId := "",
namespaceSpecificString := ""
};
var boolean vc_boo_route := false; // boolean indicates valid Route
var template(omit) Contact vc_contact; // value of Contact header
var CSeq vc_cSeq := c_empty_cSeq; // value of CSeq header
var template(value)
RAck
vc_rAck := {
fieldName := RACK_E,
responseNum := 1,
seqNumber := 1,
method := "INVITE"
}; // value of RAck header
 
var Contact vc_contact; // value of Contact header
var CSeq vc_cSeq := c_empty_cSeq; // value of CSeq header
var RAck vc_rAck := { fieldName := RACK_E, responseNum := 1, seqNumber := 1, method := "INVITE"}; // value of RAck header
var HostPort vc_reqHostPort := {host:=PX_SIP_SUT_IPADDR, portField:=PX_SIP_SUT_PORT}; // address to send request
var UrnUriComponents vc_reqUrnUri := {namespaceId:="", namespaceSpecificString:=""};
var Privacy vc_privacy;
var HistoryInfo_List vc_historyInfoList := {}; // value of history list according to RFC4244
var SipUrl vc_confURI; // conference URI according to TS124147 ch. 5.3.1.3.2
var SDP_Message vc_sdp_remote; // incoming SDP offers
var SDP_Message vc_sdp_local; // SDP values to be sent
var XmlBody vc_xml_remote; // incoming XML value
var template XmlBody vc_xml_local; //SDP values to be sent
var CSeq vc_iut_CSeq := c_empty_cSeq; // value of last CSeq header used by the IUT in request
// To/From header-fields to be used if the callee will release the session
var To vc_callee_To := c_empty_To;
var From vc_callee_From := c_empty_From;
// To/From header-fields to be used if the caller will release the session
var To vc_caller_To := c_empty_To;
var From vc_caller_From := c_empty_From;
var Authorization vc_authorization;
// variables for storing default references
var default vc_default;
var default vc_def_catchSyncStop;
// general timers
timer tc_T1 := PX_SIP_T1;
timer tc_Tf := PX_SIP_TF;
timer tc_wait := PX_SIP_TWAIT;
timer tc_ack := PX_SIP_TACK;
timer tc_resp := PX_SIP_TRESP;
timer tc_noAct := PX_SIP_TNOACT; // time for SUT to get idle state
// timer TRept;
// timer TSync := PX_SIP_TSYNC;
timer tc_guard := PX_SIP_TGUARD;//MRO
timer tc_tDelay := 32.0;
// address to send request
var HostPort vc_reqHostPort := {//STF471 removed PIXIT assignment, should be performed in specific ATS
host := "127.0.0.1", // former PX_SIP_SUT_IPADDR value
portField := 5060 //former PX_SIP_SUT_PORT value
};
var template(omit) Privacy vc_privacy;
var HistoryInfo_List vc_historyInfoList := {}; // value of history list according to RFC4244
var SipUrl vc_confURI; // conference URI according to TS124147 ch. 5.3.1.3.2
var SDP_Message vc_sdp_remote; // incoming SDP offers
var SDP_Message vc_sdp_local; // SDP values to be sent
var XmlBody vc_xml_remote; // incoming XML value
var template XmlBody vc_xml_local; // SDP values to be sent
var template(omit) CSeq vc_iut_CSeq := c_empty_cSeq; // value of last CSeq header used by the IUT in request
// To/From header-fields to be used if the callee will release the session
var To vc_callee_To := c_empty_To;
var From vc_callee_From := c_empty_From;
// To/From header-fields to be used if the caller will release the session
var To vc_caller_To := c_empty_To;
var From vc_caller_From := c_empty_From;
var Authorization vc_authorization;
 
var float vc_tcRESP := PX_SIP_TRESP; // standard value for TRESP (may be modified in particular tests)
// indicators set/used parameter status or state handling in default
var boolean vc_sdp_remote_is_valid := false; // true if there is a value in v_SDP_remote
var boolean vc_history_is_valid := false; // true if there is a HistoryList in response message
var boolean vc_send_SDP := false; // send SDP in the next outgoing message
var boolean vc_ignore_bye := false; // enable ignore of repeated bye in default
var boolean vc_ignore_invite := false; // enable ignore invite in default
var boolean vc_ignore_subscribe := false; // enable ignore subscribe in default
var boolean vc_ignore181 := false; // enable ignore of 181 in default
var boolean vc_ignore484 := false; // enable ignore of 484 in default
var boolean vc_ignore4xx := false; // enable ignore of 4xx in default
var boolean vc_ignore200OKinv := false; // enable ignore of 200OKinv in default
var boolean vc_ignore_notify := false; // enable ignore of notify in default
var boolean vc_supported_100rel := false; // true if the received invite contains 100rel
var boolean vc_supported_precondition:= false; // true if the received invite contains precondition
var boolean vc_MESSAGEreceived := false; // true if MESSAGE received during altstep
var boolean vc_first_recv := false; // true after receipt of first incomming SIP message
var boolean vc_firstREGISTER_sent := false; // true after sent of first REGISTER message
var boolean vc_DeregDone := false; // true after first DeREGISTRATION trail (avoid loop)
var boolean vc_interface_isc := false; // true if isc interface is in use
var boolean v_white_space := false;//MRO
// variables for storing default references
var default vc_default;
var default vc_def_catchSyncStop;
 
// ETS address
var address v_ets_label := { host := PX_SIP_TS1_IPADDR, portField := PX_SIP_TS1_PORT};
// general timers
timer tc_T1 := 0.5;//STF471 default value, should be set in specific ATS, former PX_SIP_T1
timer tc_Tf := 32.0;//STF471 default value, should be set in specific ATS, former PX_SIP_TF
timer tc_wait := PX_SIP_TWAIT;
timer tc_ack := PX_SIP_TACK;
timer tc_resp := PX_SIP_TRESP;
timer tc_noAct := PX_SIP_TNOACT; // time for SUT to get idle state
// timer TRept;
// timer TSync := 10.0; //STF471 default value, should be set in specific ATS, former PX_SIP_TSYNC
timer tc_guard := 120.0; //STF471 default value, should be set in specific ATS, former PX_SIP_TGUARD
timer tc_tDelay := 32.0;
 
// parts needed for Client/SelfSyncComp type compatibility
var StringStack v_stateStack := c_initStringStack;
port SyncPort syncSendPort;
port SyncPort syncPort;
timer tc_sync := PX_TSYNC_TIME_LIMIT;
// // used for communication with the operator
// port operatorPort_SIP opPort;
var float vc_tcRESP := PX_SIP_TRESP; // standard value for TRESP (may be modified in particular tests)
// indicators set/used parameter status or state handling in default
var boolean vc_sdp_remote_is_valid := false; // true if there is a value in v_SDP_remote
var boolean vc_history_is_valid := false; // true if there is a HistoryList in response message
var boolean vc_send_SDP := false; // send SDP in the next outgoing message
var boolean vc_ignore_bye := false; // enable ignore of repeated bye in default
var boolean vc_ignore_invite := false; // enable ignore invite in default
var boolean vc_ignore_subscribe := false; // enable ignore subscribe in default
var boolean vc_ignore181 := false; // enable ignore of 181 in default
var boolean vc_ignore484 := false; // enable ignore of 484 in default
var boolean vc_ignore4xx := false; // enable ignore of 4xx in default
var boolean vc_ignore200OKinv := false; // enable ignore of 200OKinv in default
var boolean vc_ignore_notify := false; // enable ignore of notify in default
var boolean vc_supported_100rel := false; // true if the received invite contains 100rel
var boolean vc_supported_precondition := false; // true if the received invite contains precondition
var boolean vc_MESSAGEreceived := false; // true if MESSAGE received during altstep
var boolean vc_first_recv := false; // true after receipt of first incomming SIP message
var boolean vc_firstREGISTER_sent := false; // true after sent of first REGISTER message
var boolean vc_DeregDone := false; // true after first DeREGISTRATION trail (avoid loop)
var boolean vc_interface_isc := false; // true if isc interface is in use
var boolean vc_white_space := false; // MRO
var boolean vc_subscribed := false;
// ETS address
var address vc_ets_label; //This value should be initialized in specific ATS
 
} // end SipComponent
// // used for communication with the operator
// port OperatorPort_SIP opPort;
} // end SipComponent
} // end module LibSip_Interface
/trunk/ttcn/LibSip_Library.ttcn
0,0 → 1,23
/**
* @author STF471
* @version $Id: LibSip_Steps.ttcn 614 2014-07-07 10:01:14Z tepelmann $
* @desc This module provides all modules of the LibSip as public imports.
* Importing this module will automatically import all here listed modules,
* no other LibSip_xxx module import needed in this case.
* This module is part of LibSipV3.
*/
module LibSip_Library {
public import from LibSip_Interface all;
public import from LibSip_MessageBodyTypes all;
public import from LibSip_PIXITS all;
public import from LibSip_SDPTypes all;
public import from LibSip_SimpleMsgSummaryTypes all;
public import from LibSip_SMSFunctions all;
public import from LibSip_SMSTemplates all;
public import from LibSip_SMSTypesAndValues all;
public import from LibSip_Steps all;
public import from LibSip_Templates all;
public import from LibSip_XMLTypes all;
}
/trunk/ttcn/LibSip_MessageBodyTypes.ttcn
1,52 → 1,60
/******************************************************************************/
// $Date: 2013-04-08 08:18:17 +0000 (Mo, 08 Apr 2013) $
// $Author: seka $
// $Rev: 8470 $
/******************************************************************************/
/*
* This module is part of LibSipV2.
*/
 
module LibSip_MessageBodyTypes
{
import from LibSip_SDPTypes all;
import from LibSip_SimpleMsgSummaryTypes all;
import from LibSip_XMLTypes all;
// type charstring XmlBody;
 
group MIMETypes {
type union MIME_Encapsulated_Parts {
SDP_Message sdpMessageBody,
XmlBody xmlBody // if there is XML body
// XMLMessage xmlMessage // if there is XML message (with header and body)
};
 
type record MIME_Encapsulated_Part {
charstring content_type,
charstring content_disposition optional,
MIME_Encapsulated_Parts mime_encapsulated_part
};
 
type record MIME_Message {
charstring boundary, // len:
MimeEncapsulatedList mimeEncapsulatedList
};
 
type record of MIME_Encapsulated_Part MimeEncapsulatedList;
 
} // group MIMETypes
 
type union MessageBody {
SDP_Message sdpMessageBody, // if there is only SDP part
// XMLMessage xmlMessage, // if there is XML message (with header and body)
XmlBody xmlBody, // if there is XML body
MIME_Message mimeMessageBody, // if there is SDP and encapsulated ISUP part
charstring sipfrag, // if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2)
charstring textplain, // if content type is text/plain (for testing long messages)
SimpleMsgSummary simpleMsgSummary, // RFC 3842
octetstring smsMessage // encoded SMS message 3GPP 23.040, 24.011
};
 
 
}
/******************************************************************************
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id: LibSip_MessageBodyTypes.ttcn 622 2014-07-10 14:50:54Z nikolajev $
* @desc This module provides the types used for alternative SIP message
* body variants and combinations.
* This module is part of LibSipV3.
*/
 
module LibSip_MessageBodyTypes {
import from LibSip_SDPTypes all;
import from LibSip_SimpleMsgSummaryTypes all;
import from LibSip_XMLTypes all;
 
/*
* Simple body types that can be used instead of the more detailed XML and SDP
* without codec support
* */
//type charstring XmlBody;
//type charstring SDP_Message;
 
group MIMETypes {
type union MIME_Encapsulated_Parts {
SDP_Message sdpMessageBody,
XmlBody xmlBody // if there is XML body
}
 
type record MIME_Encapsulated_Part {
charstring content_type,
charstring content_disposition optional,
MIME_Encapsulated_Parts mime_encapsulated_part
}
 
type record MIME_Message {
charstring boundary,
// len:
MimeEncapsulatedList mimeEncapsulatedList
}
 
type record of MIME_Encapsulated_Part MimeEncapsulatedList;
 
 
} // group MIMETypes
 
type union MessageBody {
SDP_Message sdpMessageBody,
// if there is only SDP part
// XMLMessage xmlMessage, // if there is XML message (with header and body)
XmlBody xmlBody,
// if there is XML body
MIME_Message mimeMessageBody,
// if there is SDP and encapsulated ISUP part
charstring sipfrag,
// if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2)
charstring textplain,
// if content type is text/plain (for testing long messages)
SimpleMsgSummary simpleMsgSummary,
// RFC 3842
octetstring smsMessage // encoded SMS message 3GPP 23.040, 24.011
}
}
/trunk/ttcn/LibSip_PIXITS.ttcn
1,355 → 1,137
/*
* @author STF 346, STF366, STF368, STF369, STF450
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-IMS tests. Module become from STF306 and STF334-336
* This module is part of LibSipV2.
* NOTE: PIXITS in folowing groups can be ignored if this information
* is provided in other modules of the ATS that uses this SIP library
* - Ports_and_addresses_of_the_SUT
* - PortsAndAddressesOfTheTS1
* - PortsAndAddressesOfTheTS2
* - PortsAndAddressesOfTheTS3
* - ParametersForHTTP_Authentication
/**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module provides module parameters used within the SIP
* protocol for timers, SDP formats etc.
* This module is part of LibSipV3.
*/
module LibSip_PIXITS {
// LibCommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
 
module LibSip_PIXITS //MRO
{
//LibCommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
// ____________________________ PIXIT-S_______________________________
group SIP_PIXITparameters {
group SDPParameter {
 
// _____________________________ PIXIT-S_______________________________
group SIP_PIXITparameters{
group SDPParameter {
/**
* @desc charstring for SDP user name
*/
modulepar charstring PX_SIP_SDP_USER_NAME := "voicesession";
 
/** @desc charstring for SDP dynamic port
*/
modulepar charstring PX_SIP_SDP_dyn := "0";
/**
* @desc charstring for SDP session identifier
*/
modulepar charstring PX_SIP_SDP_SESSION_ID := "30000";
 
/** @desc charstring for SDP bandwidth modifier
*/
modulepar charstring PX_SIP_SDP_b_modifier := "AS";
/**
* @desc charstring for SDP dynamic port
*/
modulepar charstring PX_SIP_SDP_DYN := "0";
 
/** @desc integer for SDP bandwidth value
*/
modulepar integer PX_SIP_SDP_b_bandwidth := 64;
/**
* @desc charstring for SDP bandwidth modifier
*/
modulepar charstring PX_SIP_SDP_B_MODIFIER := "AS";
 
/** @desc charstring for SDP media attribute encoding supported by the IUT
*/
modulepar charstring PX_SIP_SDP_encoding := "PCMU/8000";
/**
* @desc integer for SDP bandwidth value
*/
modulepar integer PX_SIP_SDP_B_BANDWIDTH := 64;
 
/** @desc charstring for SDP media attribute encoding unavailable by the IUT
*/
modulepar charstring PX_SIP_SDP_encoding_unavail := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
/**
* @desc charstring for SDP media attribute encoding supported by the IUT
*/
modulepar charstring PX_SIP_SDP_ENCODING := "PCMU";
 
/** @desc charstring for SDP media attribute encoding unsupported by the IUT
*/
modulepar charstring PX_SIP_SDP_encoding_unsup := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
/**
* @desc charstring for SDP media attribute encoding clockrate supported by the IUT
*/
modulepar charstring PX_SIP_SDP_CLOCKRATE := "8000";
 
/** @desc charstring for SDP media T.38 transport (used in TC2101_IS___AU__09)
*/
modulepar charstring PX_SIP_SDP_transport := "udptl";
} //group SDP Parameter
group ISUPinterworkingParameters{
/** @desc charstring for Used CPC language
*/
modulepar charstring PX_SIP_ISUP_LANGUAGE := "English";
/** @desc charstring for Used CPC language
*/
modulepar charstring PX_SIP_ISUP_CPC_VALUE := "prison";
} // goup PSTNParameters
} // group SDP Parameter
group XMLCOnfiguration{
/**
* @desc boolean for MessageBody length calculation based on encvalue operation result
*/
modulepar boolean PX_MB_LENGTH_FROM_ENCVAL := true;
/**
* @desc boolean for MessageBody length calculation to be performed by external function
*/
modulepar boolean PX_USE_FX_FOR_XML_LENGTH := false;
}
 
group SupportedOptions{
/** @desc boolean for True if 100rel mechanism is supported in SIP
*/
modulepar boolean PX_SIP_100rel := false;
group SupportedOptions {
 
/** @desc boolean for True if precondition mechanism is supported in SIP
*/
modulepar boolean PX_SIP_precondition := false;
/**
* @desc charstring for Used Transport in upper case "UDP"/"TCP"
*/
modulepar charstring PX_SIP_TRANSPORT := "UDP";
 
/** @desc boolean for True if UDP Transport is used by the IUT to run campaign
*/
modulepar boolean PX_SIP_UDP := true;
 
/** @desc charstring for Used Transport in upper case "UDP"/"TCP"
*/
modulepar charstring PX_SIP_TRANSPORT := "UDP";
}// group SupportedOptions{
} // group SupportedOptions{
 
// PIXITS in group Ports_and_addresses_of_the_SUT can be ignored if this information is provided in other modules of the ATS that uses this SIP library
group Ports_and_addresses_of_the_SUT{
group RegistrationParameters {
 
/** @desc integer for SUT port number to exchange SIP messages
*/
modulepar integer PX_SIP_SUT_PORT := 5060;
/**
* @desc boolean for the SIP user if it have to register itself before executing a test case
*/
modulepar boolean PX_SIP_REGISTRATION := false;
 
/** @desc charstring for SUT IP address to exchange SIP messages
*/
modulepar charstring PX_SIP_SUT_IPADDR := "172.27.16.115";
/**
* @desc charstring for PX_AUTH_ALGORITHM security algorithm Possible values: MD5 or AKAv1-MD5
*/
modulepar charstring PX_AUTH_ALGORITHM := "AKAv1-MD5";
 
/** @desc charstring for SUT domain
*/
modulepar charstring PX_SIP_SUT_HOME_DOMAIN := "172.27.16.115";
 
/** @desc charstring for unknown SUT domain
*/
modulepar charstring PX_SIP_SUT_HOME_DOMAIN_UNKNOWN := "172.88.88.88";
} // group Registration parameters
group SwitchToEnableAuthentication {
/**
* @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages
*/
modulepar boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
 
}
/**
* @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages
*/
modulepar boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
 
// PIXITS in group PortsAndAddressesOfTheTS1 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
group PortsAndAddressesOfTheTS1 {
// Ports and addresses of the TS1 (tester), first access
/** @desc integer for port number used by the TS1 to exchange SIP messages
*/
modulepar integer PX_SIP_TS1_PORT := 5060;
 
/** @desc charstring for IP address used by the TS1 to exchange SIP messages
*/
modulepar charstring PX_SIP_TS1_IPADDR := "172.27.1.218";
} // group SwitchToEnableAuthentication
 
/** @desc charstring for identity of the tester local domain
*/
modulepar charstring PX_SIP_TS1_LOCAL_DOMAIN := "172.27.1.218";
group SIP_Timers {
/**
* @desc float for TWait default value for waiting an operator action
*/
modulepar float PX_SIP_TWAIT := 30.0;
 
/** @desc charstring for identity of the tester local user
*/
modulepar charstring PX_SIP_TS1_LOCAL_USER := "2910";
/**
* @desc float for TAck default value for waiting an acknowledgement
*/
modulepar float PX_SIP_TACK := 8.0;
 
/** @desc charstring for identity of the user with active call diversion service
*/
modulepar charstring PX_SIP_TS1_LOCAL_USER_DIV := "2907";
/**
* @desc float for TResp default value for waiting for a response from the IUT
*/
modulepar float PX_SIP_TRESP := 15.0;
 
/** @desc charstring for identity of the tester local user (format "+"cc+ndc+sn)
*/
modulepar charstring PX_SIP_TS1_LOCAL_USER_FULL := "+ 33492941111";
/**
* @desc float for TNoAct default value for waiting no message from the IUT Value given for PX_TNOACT should be less than value of SHORT_REGISTRATION constant (which is currently "3" (seconds))
*/
modulepar float PX_SIP_TNOACT := 1.0;
 
/** @desc integer for port number used by the TS to exchange media streams
*/
modulepar integer PX_SIP_TS1_BEARER_PORT := 52000;
} // group SIP_Timers
 
/** @desc charstring for port number used by the TS to exchange media streams
*/
modulepar integer PX_SIP_TS1_BEARER_PORT2 := 62000;
group MimePart {
/**
* @desc charstring for delimiter value used in mime multipart message to separate message body parts
*/
modulepar charstring PX_SIP_MIME_BOUNDARY := "boundary1";
 
/** @desc charstring for IP address used by the TS to exchange media streams
*/
modulepar charstring PX_SIP_TS1_BEARER_IPADDR := "172.27.1.218";
}// group PortsAndAddressesOfTheTS
} // group MimePart
 
// PIXITS in group PortsAndAddressesOfTheTS2 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
group PortsAndAddressesOfTheTS2 {
// Ports and addresses of the TS2 (tester), second access
 
/** @desc integer for port number used by the TS2 to exchange SIP messages
*/
modulepar integer PX_SIP_TS2_PORT := 5060;
 
/** @desc charstring for IP address used by the TS2 to exchange SIP messages
*/
modulepar charstring PX_SIP_TS2_IPADDR := "172.27.1.219";
 
/** @desc charstring for identity of the tester local domain
*/
modulepar charstring PX_SIP_TS2_LOCAL_DOMAIN := "172.27.1.219";
 
/** @desc charstring for identity of the tester local user
*/
modulepar charstring PX_SIP_TS2_LOCAL_USER := "2911";
/** @desc charstring for identity of the user with active call diversion service
*/
modulepar charstring PX_SIP_TS2_LOCAL_USER_DIV := "2011";
 
/** @desc charstring for identity of the tester local user (format "+"cc+ndc+sn)
*/
modulepar charstring PX_SIP_TS2_LOCAL_USER_FULL := "+ 33 4 92941111";
 
/** @desc integer for port number used by the TS to exchange media streams
*/
modulepar integer PX_SIP_TS2_BEARER_PORT := 53000;
 
/** @desc integer for port number used by the TS to exchange media streams
*/
modulepar integer PX_SIP_TS2_BEARER_PORT2 := 63000;
 
/** @desc charstring for IP address used by the TS to exchange media streams
*/
modulepar charstring PX_SIP_TS2_BEARER_IPADDR := "172.27.1.218";
}//group PortsAndAddressesOfTheTS2
// PIXITS in group PortsAndAddressesOfTheTS3 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
group PortsAndAddressesOfTheTS3 {
// Ports and addresses of the TS3 (tester), second access
/** @desc integer for Port number used by the TS3 to exchange SIP messages
*/
modulepar integer PX_SIP_TS3_PORT := 5060;
 
/** @desc charstring for IP address used by the TS3 to exchange SIP messages
*/
modulepar charstring PX_SIP_TS3_IPADDR := "172.27.1.220";
 
/** @desc charstring for identity of the tester local domain
*/
modulepar charstring PX_SIP_TS3_LOCAL_DOMAIN := "172.27.1.220";
 
/** @desc charstring for identity of the tester local user
*/
modulepar charstring PX_SIP_TS3_LOCAL_USER := "2012";
 
} //group PortsAndAddressesOfTheTS3
 
group RegistrationParameters {
/** @desc boolean for the SIP user if it have to register itself before executing a test case
*/
modulepar boolean PX_SIP_REGISTRATION := false;
 
/** @desc integer for the minimun SIP user registration expires-value
*/
modulepar integer PX_SIP_REGISTRATION_exp_min := 3600;
 
/** @desc charstring for REGISTRAR domain
*/
modulepar charstring PX_SIP_SUT_REGISTRAR_DOMAIN := "172.27.16.115";
/** @desc charstring for PX_AUTH_ALGORITHM security algorithm
* Possible values: MD5 or AKAv1-MD5
*/
modulepar charstring PX_AUTH_ALGORITHM := "AKAv1-MD5";
}// group Registration parameters
group ReleaseCause{
/** @desc integer for Release cause to be used in BYE and in Failure messages
*/
modulepar integer PX_SIP_BYE_CAUSE := 16;
}//group ReleaseCause
 
group RTPStreamControlAndCheck{
/** @desc boolean for True, if conversation check is implemented.
*/
modulepar boolean PX_SIP_CheckConversation := false;
 
/** @desc boolean for True, if DTMF check is implemented.
*/
modulepar boolean PX_SIP_CheckDTMF := false;
 
/** @desc boolean for True, if Announcement sending is implemented.
*/
modulepar boolean PX_SIP_SendAnnouncement := false;
 
/** @desc boolean for True, if ringing check is implemented.
*/
modulepar boolean PX_SIP_CheckRinging := false;
}//group RTPStreamControlAndCheck
group SwitchToEnableAuthentication {
/** @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages
*/
modulepar boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
/** @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages
*/
modulepar boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
}//group SwitchToEnableAuthentication
group NofifyAndSubscribe {
modulepar{
/** @desc boolean for option controlling if notification is enabled/disabled after registration procedure
*/
boolean PX_SIP_NOTIFICATION := true;
/** @desc boolean for option controlling if subscription is enabled/disabled after registration procedure
*/
boolean PX_SIP_SUBSCRIPTION := true;
}
}
 
// PIXITS in group ParametersForHTTP_Authentication can be ignored if this information is provided in other modules of the ATS that uses this SIP library
group ParametersForHTTP_Authentication {
 
/** @desc charstring for RFC 2617 clause 3-2-1 qop options:
* Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
* value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
*/
modulepar charstring PX_SIP_SUT_UE1_QOP := "auth";
 
/** @desc charstring for RFC 2617 clause 3-2-2 username:
* The name of user in the specified realm
*/
modulepar charstring PX_SIP_SUT_UE1_USERNAME := "abcd";
 
/** @desc charstring for RFC 2617 clause 3-2-2-2 passwd: A known shared secret, the password of user of the specified username
*/
modulepar charstring PX_SIP_SUT_UE1_PASSWD := "1234";
 
/** @desc charstring for RFC 2617 3-2-1 qop options:
* Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
* value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
*/
modulepar charstring PX_SIP_SUT_UE2_QOP := "auth";
/** @desc charstring for RFC 2617 clause 3-2-2 username:
* The name of user in the specified realm
*/
modulepar charstring PX_SIP_SUT_UE2_USERNAME := "abcd";
 
/** @desc charstring for RFC 2617 clause 3-2-2-2 passwd: A known shared secret, the password of user of the specified username
*/
modulepar charstring PX_SIP_SUT_UE2_PASSWD := "1234";
}//group ParametersForHTTP_Authentication
 
group SIP_Timers {
/** @desc float for T1 RTT estimate (500 ms)
*/
modulepar float PX_SIP_T1 := 0.5;
 
/** @desc float for T2 Maximum retransmit interval for non-INVITE requests and INVITE response (4000 ms)
*/
modulepar float PX_T2 := 4.0;
 
/** @desc float for T4 Maximum duration a message will remain in the network
*/
modulepar float PX_T4 := 1.0;
 
/** @desc float for TDELAY default value for timeout on outgoing SIP request (ie 64*T1)
*/
modulepar float PX_SIP_TF := 32.0;
 
/** @desc float for TWait default value for waiting an operator action
*/
modulepar float PX_SIP_TWAIT := 30.0;
 
/** @desc float for TAck default value for waiting an acknowledgement
*/
modulepar float PX_SIP_TACK := 8.0;
 
/** @desc float for TResp default value for waiting for a response from the IUT
*/
modulepar float PX_SIP_TRESP := 15.0;
 
/** @desc float for TNoAct default value for waiting no message from the IUT
* Value given for PX_TNOACT should be less than value of
* SHORT_REGISTRATION constant (which is currently "3" (seconds))
*/
modulepar float PX_SIP_TNOACT := 1.0;
 
/** @desc float for TSYNC default value to synchronise ptc
*/
modulepar float PX_SIP_TSYNC := 10.0;
 
/** @desc float for TGUARD default value for an extra long timer to limit test execution
*/
modulepar float PX_SIP_TGUARD := 120.0;
 
/** @desc float for TRespRetention minimum time that a Proxy will wait before sending a final response
*/
modulepar float PX_TRespRetention := 1.0;
}//group SIP_Timers
} //group SIP_PIXITparameters
} // group SIP_PIXITparameters
} // end module LibSip_PIXITS
/trunk/ttcn/LibSip_SDPTypes.ttcn
1,324 → 1,391
/**
* @author STF 346, STF366, STF368, STF369, STF450
* @version $Id$
* @desc This module defines message, attribute, structured and simple
* SDP types as well constants used by LipSip constructs. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* This module is part of LibSipV2.
* @remark Adding of new attributes types is ok;
* Adding of new optional attributes in @see SDP_attribute type
* is ok;
* Existing attribute types shall not be changed or removed -
* change requests shall be made to http://t-ort.etsi.org
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module defines message, attribute, structured and simple
* SDP types as well constants used by LipSip constructs. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* This module is part of LibSipV3.
* @remark Adding of new attributes types is ok; Adding of new optional attributes in @see SDP_attribute type is ok; Existing attribute types shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
*/
module LibSip_SDPTypes {
import from LibSip_SIPTypesAndValues all;
group Constants {
group SimpleConstants {
// SDP net_type
const charstring c_in := "IN";
 
module LibSip_SDPTypes
{
group Constants
{
group SimpleConstants
{
// SDP net_type
const charstring c_in := "IN";
// SDP addr_type
const charstring c_ip4 := "IP4";
const charstring c_ip6 := "IP6";
 
// SDP addr_type
const charstring c_ip4 := "IP4";
const charstring c_ip6 := "IP6";
// SDP_media_desc: media
const charstring c_audio := "audio";
const charstring c_image := "image";
const charstring c_video := "video";
const charstring c_text := "text";
const charstring c_msrp := "msrp";
 
// SDP_media_desc: media
const charstring c_audio := "audio";
const charstring c_image := "image";
const charstring c_video := "video";
const charstring c_text := "text";
const charstring c_msrp := "msrp";
// SDP_media_desc: transport
const charstring c_rtpAvp := "RTP/AVP";
const charstring c_rtpAvpf := "RTP/AVPF";
const charstring c_msrpTcp := "TCP/MSRP";
const charstring c_udptl := "Udptl";
 
// SDP_media_desc: transport
const charstring c_rtpAvp := "RTP/AVP";
const charstring c_rtpAvpf := "RTP/AVPF";
const charstring c_msrpTcp := "TCP/MSRP";
const charstring c_udptl := "Udptl";
 
// SDP_attribute_list constants:
const charstring c_local := "local";
const charstring c_mandatory := "mandatory";
const charstring c_optional := "optional";
const charstring c_none := "none";
const charstring c_qos := "qos";
const charstring c_remote := "remote";
const charstring c_sendrecv := "sendrecv";
const charstring c_sendonly := "sendonly";
const charstring c_inactive := "inactive";
const charstring c_send := "send";
const charstring c_recv := "recv";
const charstring c_e2e := "e2e";
// SDP_attribute_list constants:
const charstring c_local := "local";
const charstring c_mandatory := "mandatory";
const charstring c_optional := "optional";
const charstring c_none := "none";
const charstring c_qos := "qos";
const charstring c_remote := "remote";
const charstring c_sendrecv := "sendrecv";
const charstring c_sendonly := "sendonly";
const charstring c_inactive := "inactive";
const charstring c_send := "send";
const charstring c_recv := "recv";
const charstring c_e2e := "e2e";
}
}
}
group Types
{
group SubTypes
{
group AttributeTypes
{
type record SDP_attribute_cat {
charstring attr_value
}
group Types {
group SubTypes {
group AttributeTypes {
type record SDP_attribute_cat {
charstring attr_value
}
 
type record SDP_attribute_keywds {
charstring attr_value
}
type record SDP_attribute_keywds {
charstring attr_value
}
 
type record SDP_attribute_tool {
charstring attr_value
}
type record SDP_attribute_tool {
charstring attr_value
}
 
type record SDP_attribute_ptime {
charstring attr_value
}
type record SDP_attribute_ptime {
charstring attr_value
}
 
type record SDP_attribute_recvonly {
}
type record SDP_attribute_recvonly {
}
 
type record SDP_attribute_sendrecv {
}
type record SDP_attribute_sendrecv {
}
 
type record SDP_attribute_sendonly {
}
type record SDP_attribute_sendonly {
}
 
type record SDP_attribute_inactive {
}
type record SDP_attribute_inactive {
}
 
type record SDP_attribute_orient {
charstring attr_value
}
type record SDP_attribute_orient {
charstring attr_value
}
 
type record SDP_attribute_type {
charstring attr_value
}
type record SDP_attribute_type {
charstring attr_value
}
 
type record SDP_attribute_charset {
charstring attr_value
}
type record SDP_attribute_charset {
charstring attr_value
}
 
type record SDP_attribute_sdplang {
charstring attr_value
}
type record SDP_attribute_sdplang {
charstring attr_value
}
 
type record SDP_attribute_lang {
charstring attr_value
}
type record SDP_attribute_lang {
charstring attr_value
}
 
type record SDP_attribute_framerate {
charstring attr_value
}
type record SDP_attribute_framerate {
charstring attr_value
}
 
type record SDP_attribute_quality {
charstring attr_value
}
type record SDP_attribute_quality {
charstring attr_value
}
 
type record SDP_attribute_fmtp {
charstring attr_value
}
type union SDP_attribute_fmtp_format_specific_params {
SemicolonParam_List paramList,
charstring unstructured
}
 
type record SDP_attribute_curr {
charstring preconditionType,
charstring statusType,
charstring direction
}
type record SDP_attribute_fmtp {
charstring format,
SDP_attribute_fmtp_format_specific_params params
}
 
type record SDP_attribute_des {
charstring preconditionType,
charstring strength,
charstring statusType,
charstring direction
}
type record SDP_attribute_curr {
charstring preconditionType,
charstring statusType,
charstring direction
}
 
type record SDP_attribute_conf {
charstring preconditionType,
charstring statusType,
charstring direction
}
type record SDP_attribute_des {
charstring preconditionType,
charstring strength,
charstring statusType,
charstring direction
}
 
type record SDP_attribute_rtpmap {
charstring attr_value
}
type record SDP_attribute_conf {
charstring preconditionType,
charstring statusType,
charstring direction
}
 
type record SDP_attribute_rtcp {
charstring attr_value
}
type record SDP_attribute_msrp {
charstring attr_value
}
type record SDP_attribute_rtpmap_codec {
charstring encoding,
charstring clockrate,
charstring parameters optional
}
 
type record SDP_attribute_unknown {
charstring name,
charstring attr_value optional
}
type record SDP_attribute_rtpmap {
charstring payload_type,
SDP_attribute_rtpmap_codec codec
}
 
type record SDP_attribute_rtcp {
integer portnumber,
SDP_connection connection optional
}
 
type union SDP_attribute {
SDP_attribute_cat cat,
SDP_attribute_keywds keywds,
SDP_attribute_tool tool,
SDP_attribute_ptime ptime,
SDP_attribute_recvonly recvonly,
SDP_attribute_sendrecv sendrecv,
SDP_attribute_sendonly sendonly,
SDP_attribute_inactive inactive,
SDP_attribute_orient orient,
SDP_attribute_type sdp_type,
SDP_attribute_charset charset,
SDP_attribute_sdplang sdplang,
SDP_attribute_lang lang,
SDP_attribute_framerate framerate,
SDP_attribute_quality quality,
SDP_attribute_fmtp fmtp,
SDP_attribute_curr curr,
SDP_attribute_des des,
SDP_attribute_conf conf,
SDP_attribute_rtpmap rtpmap,
SDP_attribute_rtcp rtcp,
SDP_attribute_msrp msrp,
type record SDP_attribute_msrp {
charstring attr_value
}
 
//* unknown has to be the last else encoding/decoding won't work!
SDP_attribute_unknown unknown
type record SDP_attribute_unknown {
charstring name,
charstring attr_value optional
}
 
type record SDP_attribute_maxptime {
charstring attr_value
}
 
type record SDP_attribute_tcap {
integer trpr_cap_num,
Charstring_List proto_list
}
 
type record SDP_attribute_pcfg {
integer config_number,
Charstring_List pot_cfg_list optional
}
 
type record SDP_attribute_acfg {
integer config_number,
Charstring_List sel_cfg_list optional
}
 
type record SDP_attribute_ecn_capable_rtp {
Charstring_List init_list,
Charstring_List parm_list optional
}
 
type record SDP_attribute_rtcp_fb {
charstring rtcp_fb_pt,
charstring rtcp_fb_val
}
 
type record SDP_attribute_rtcp_xr {
Charstring_List xr_format_list optional
}
 
type record SDP_attribute_rtcp_rsize {
}
 
type record SDP_attribute_3ge2ae {
charstring indicator
}
 
type record SDP_attribute_crypto {
charstring tag,
charstring crypto_suite,
charstring key_params,
Charstring_List session_params optional
}
 
type union SDP_attribute {
SDP_attribute_cat cat,
SDP_attribute_keywds keywds,
SDP_attribute_tool tool,
SDP_attribute_ptime ptime,
SDP_attribute_recvonly recvonly,
SDP_attribute_sendrecv sendrecv,
SDP_attribute_sendonly sendonly,
SDP_attribute_inactive inactive,
SDP_attribute_orient orient,
SDP_attribute_type sdp_type,
SDP_attribute_charset charset,
SDP_attribute_sdplang sdplang,
SDP_attribute_lang lang,
SDP_attribute_framerate framerate,
SDP_attribute_quality quality,
SDP_attribute_fmtp fmtp,
SDP_attribute_curr curr,
SDP_attribute_des des,
SDP_attribute_conf conf,
SDP_attribute_rtpmap rtpmap,
SDP_attribute_rtcp rtcp,
SDP_attribute_msrp msrp,
SDP_attribute_maxptime maxptime,
SDP_attribute_tcap tcap,
SDP_attribute_pcfg pcfg,
SDP_attribute_acfg acfg,
SDP_attribute_ecn_capable_rtp ecn_capable_rtp,
SDP_attribute_rtcp_fb rtcp_fb,
SDP_attribute_rtcp_xr rtcp_xr,
SDP_attribute_rtcp_rsize rtcp_rsize,
SDP_attribute_3ge2ae e2ae,
SDP_attribute_crypto crypto,
//* unknown has to be the last else encoding/decoding won't work!
SDP_attribute_unknown unknown
}
 
} //* group AttributeTypes
 
type set of SDP_attribute SDP_attribute_list;
 
type record SDP_bandwidth {
charstring modifier,
integer bandwidth
}
} //* group AttributeTypes
 
type set of SDP_attribute SDP_attribute_list;
type set of SDP_bandwidth SDP_bandwidth_list;
 
type record SDP_bandwidth {
charstring modifier,
integer bandwidth
}
type record SDP_connection {
charstring net_type,
charstring addr_type,
SDP_conn_addr conn_addr
}
 
type set of SDP_bandwidth SDP_bandwidth_list;
type record SDP_conn_addr {
charstring addr,
integer ttl optional,
integer num_of_addr optional
}
 
type record SDP_connection {
charstring net_type,
charstring addr_type,
SDP_conn_addr conn_addr
}
type set of SDP_connection SDP_connection_list;
 
type record SDP_conn_addr {
charstring addr,
integer ttl optional,
integer num_of_addr optional
}
type record SDP_contact {
charstring addr_or_phone,
charstring disp_name optional
}
 
type set of SDP_connection SDP_connection_list;
type SDP_contact SDP_contact_tel;
 
type record SDP_contact {
charstring addr_or_phone,
charstring disp_name optional
}
type SDP_contact SDP_contact_email;
 
type SDP_contact SDP_contact_tel;
type set of SDP_contact_email SDP_email_list;
 
type SDP_contact SDP_contact_email;
type record of charstring SDP_fmt_list;
 
type set of SDP_contact_email SDP_email_list;
type record SDP_key {
charstring method,
charstring key optional
}
 
type record of charstring SDP_fmt_list ;
type record SDP_media_desc {
SDP_media_field media_field,
charstring information optional,
SDP_connection_list connections optional,
SDP_bandwidth_list bandwidth optional,
SDP_key key optional,
SDP_attribute_list attributes optional
}
 
type record SDP_key {
charstring method,
charstring key optional
}
type set of SDP_media_desc SDP_media_desc_list;
 
type record SDP_media_desc {
SDP_media_field media_field,
charstring information optional,
SDP_connection_list connections optional,
SDP_bandwidth_list bandwidth optional,
SDP_key key optional,
SDP_attribute_list attributes optional
}
type record SDP_media_port {
integer port_number,
integer num_of_ports optional
}
 
type set of SDP_media_desc SDP_media_desc_list;
type record SDP_media_field {
charstring media,
SDP_media_port ports,
charstring transport,
SDP_fmt_list fmts
}
 
type record SDP_media_port {
integer port_number,
integer num_of_ports optional
}
type record SDP_time {
SDP_time_field time_field,
SDP_repeat_list time_repeat optional
}
 
type record SDP_media_field {
charstring media,
SDP_media_port ports,
charstring transport,
SDP_fmt_list fmts
}
type record SDP_time_field {
charstring start_time,
//* field is numeric strings that may not fit into 32-bit signed int
charstring
stop_time //* field is numeric strings that may not fit into 32-bit signed int
}
 
type record SDP_time{
SDP_time_field time_field,
SDP_repeat_list time_repeat optional
}
type record SDP_repeat {
SDP_typed_time repeat_interval,
SDP_typed_time active,
SDP_typed_time_list offsets
}
 
type record SDP_time_field{
charstring start_time, //* field is numeric strings that may not fit into 32-bit signed int
charstring stop_time //* field is numeric strings that may not fit into 32-bit signed int
}
type set of SDP_repeat SDP_repeat_list;
 
type record SDP_repeat{
SDP_typed_time repeat_interval,
SDP_typed_time active,
SDP_typed_time_list offsets
}
type record SDP_typed_time {
integer time,
charstring unit optional
}
 
type set of SDP_repeat SDP_repeat_list;
type set of SDP_typed_time SDP_typed_time_list;
 
type record SDP_typed_time{
integer time,
charstring unit optional
}
type set of SDP_time SDP_time_list;
 
type set of SDP_typed_time SDP_typed_time_list;
type record SDP_timezone {
charstring adjustment_time,
SDP_typed_time offset
}
 
type set of SDP_time SDP_time_list;
type set of SDP_timezone SDP_timezone_list;
 
type record SDP_timezone{
charstring adjustment_time,
SDP_typed_time offset
}
type record SDP_Origin {
charstring user_name,
charstring session_id,
//* field is numeric strings that may not fit into 32-bit signed int
charstring session_version,
//* field is numeric strings that may not fit into 32-bit signed int
charstring net_type,
charstring addr_type,
charstring addr
}
 
type set of SDP_timezone SDP_timezone_list;
type set of SDP_contact_tel SDP_phone_list;
 
type record SDP_Origin{
charstring user_name,
charstring session_id,//* field is numeric strings that may not fit into 32-bit signed int
charstring session_version, //* field is numeric strings that may not fit into 32-bit signed int
charstring net_type,
charstring addr_type,
charstring addr
}
} //* group SubTypes
 
type set of SDP_contact_tel SDP_phone_list;
} //* group SubTypes
 
group MessageTypes {
type record SDP_Message {
integer protocol_version,
SDP_Origin origin,
charstring session_name,
charstring information optional,
charstring uri optional,
SDP_email_list emails optional,
SDP_phone_list phone_numbers optional,
SDP_connection connection optional,
SDP_bandwidth_list bandwidth optional,
SDP_time_list times,
SDP_timezone_list timezone_adjustments optional,
SDP_key key optional,
SDP_attribute_list attributes optional,
SDP_media_desc_list media_list optional
}
with {
encode "SDPCodec";
}
 
group MessageTypes
{
type record SDP_Message{
integer protocol_version,
SDP_Origin origin,
charstring session_name,
charstring information optional,
charstring uri optional,
SDP_email_list emails optional,
SDP_phone_list phone_numbers optional,
SDP_connection connection optional,
SDP_bandwidth_list bandwidth optional,
SDP_time_list times,
SDP_timezone_list timezone_adjustments optional,
SDP_key key optional,
SDP_attribute_list attributes optional,
SDP_media_desc_list media_list optional
} with { encode "SDPCodec" }
} // group MessageTypes
} // group Types
} // group MessageTypes
 
} // group Types
} // end module LibSip_SDPTypes
/trunk/ttcn/LibSip_SIPTypesAndValues.ttcn
1,1923 → 1,1941
/**
* @author STF 346, STF366, STF368, STF369, STF450
* @version $Id$
* @desc This module defines message, header, structured and simple SIP
* types as well constants used by LipSip constructs. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* This module is part of LibSipV2.
* @remark Adding of new message and header types is ok;
* Adding of new optional header fields in @see MessageHeader type
* is ok but should be done at same time as dummy template updates;
* Existing message or header types shall not be changed or removed -
* change requests shall be made to http://t-ort.etsi.org
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module defines message, header, structured and simple SIP
* types as well constants used by LipSip constructs. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* This module is part of LibSipV3.
* @remark Adding of new message and header types is ok; Adding of new optional header fields in
* @see MessageHeader type is ok but should be done at same time as dummy template updates; Existing message or header types shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
*/
module LibSip_SIPTypesAndValues {
import from LibSip_MessageBodyTypes all;
import from LibSip_PIXITS all;
 
module LibSip_SIPTypesAndValues
{
import from LibSip_MessageBodyTypes all;
group Constants {
group SimpleConstants {
// SIP name protocol plus version
const charstring c_sipNameVersion := "SIP/2.0";
 
group Constants
{
group SimpleConstants
{
// SIP name protocol plus version
const charstring c_sipNameVersion := "SIP/2.0";
// SIP name protocol
const charstring c_sipName := "SIP";
// SIP version
const charstring c_sipVersion := "2.0";
// SIP scheme
const charstring c_sipScheme := "sip";
// TEL scheme
const charstring c_telScheme := "tel";
// URN schema
const charstring c_urnScheme := "urn";
// SIP name protocol
const charstring c_sipName := "SIP";
 
// TAG_ID
const charstring c_tagId := "tag";
// BRANCH_ID
const charstring c_branchId := "branch";
// BRANCH_COOKIE
const charstring c_branchCookie := "z9hG4bK";
// EXPIRES_ID
const charstring c_expiresId := "expires";
// MADDR_ID
const charstring c_maddrId := "maddr";
// METHOD_ID
const charstring c_methodId := "method";
// RECEIVED_ID
const charstring c_receivedId := "received";
// TTL_ID
const charstring c_ttlId := "ttl";
// USER_ID
const charstring c_userId := "user";
// SDP name application
const charstring c_sdpAplication := "application/sdp";
// XML name application
const charstring c_xmlAplication := "application/xml";
// XML name application
const charstring c_xmlreginfoAplication := "application/reginfo+xml";
// SIP version
const charstring c_sipVersion := "2.0";
 
// MIME name application
const charstring c_mimeMultipart := "multipart/mixed";
// SIP scheme
const charstring c_sipScheme := "sip";
 
// IMS 3GPP name application
const charstring c_ims3gppAplication := "application/3gpp-ims+xml";
// TEL scheme
const charstring c_telScheme := "tel";
 
// IMS 3GPP name CW application
const charstring c_ims3gppCwApplication := "application/vnd.3gpp.cw+xml";
// URN schema
const charstring c_urnScheme := "urn";
 
// IMS ETSI name MCID application
const charstring c_imsEtsiMcidApplication := "application/vnd.etsi.mcid+xml";
// TAG_ID
const charstring c_tagId := "tag";
 
// IMS ETSI name CUG application
const charstring c_imsEtsiCugApplication := "application/vnd.etsi.cug+xml";
// BRANCH_ID
const charstring c_branchId := "branch";
 
// IMS ETSI name Simservs application(TIP/TIR, ACR, CDIV, OIP/OIR, CUG)
const charstring c_imsEtsiSimservsApplication := "application/vnd.etsi.simservs+xml";
// OCTET-STREAM name application
const charstring c_octetAplication := "application/octet-stream";
// BRANCH_COOKIE
const charstring c_branchCookie := "z9hG4bK";
 
// PLAIN-TEXT name application
const charstring c_plainText := "text/plain";
// EXPIRES_ID
const charstring c_expiresId := "expires";
 
//text content of 1300 bytes for messages with message body
const charstring c_longMessageContent_1300Bytes :=//"Hello!";
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
oct2char('0D'O) & oct2char('0A'O); // CRLF
// MADDR_ID
const charstring c_maddrId := "maddr";
 
// Default SIP port number : 5060
const integer c_defaultSipPort := 5060;
// Default SIP protocol : UDP
const charstring c_defaultSipProt := "UDP";
// Fixed IP multicast address
const charstring c_mcastSipIpaddr := "224.0.1.75";
// Short delta-second used in expires parameter to acknowledge a registration
const charstring c_shortRegistration := "3600";
// METHOD_ID
const charstring c_methodId := "method";
 
// ([RFC3891]Sec 6.1)
const charstring c_earlyFlag := "early-only";
// RECEIVED_ID
const charstring c_receivedId := "received";
 
// option tag replaces ([RFC3261])
const charstring c_replaces := "replaces";
// option tag 100rel (reliable provisional response [RFC3262])
const charstring c_tag100rel := "100rel";
// option tag from-change ([RFC4916])
const charstring c_tagFromChange := "from-change";
// option tag precondition (ch.11 [RFC3312])
const charstring c_tagPrecond := "precondition";
// TTL_ID
const charstring c_ttlId := "ttl";
 
// due to problem with TAU compiler because hardcoded return statement constant is created
const HostPort c_hostport_dummy := {host:="", portField:=c_defaultSipPort};
// USER_ID
const charstring c_userId := "user";
 
// CLIP/CLIR information
const PrivacyValue c_privacy_none := "none";
const PrivacyValue c_privacy_id := "id";
const PrivacyValue c_privacy_header := "header";
const PrivacyValue c_privacy_user := "user";
const PrivacyValue c_privacy_critical := "critical";
const PrivacyValue c_privacy_session := "session";
// SDP name application
const charstring c_sdpApplication := "application/sdp";
 
// @ (at) sign
const charstring c_AT := "@";
//MRO
const charstring c_SP := oct2char('20'O);
const charstring c_SLASH := oct2char('2F'O);
const charstring c_LT := oct2char('3C'O);
const charstring c_GT := oct2char('3E'O);
// XML name application
const charstring c_xmlApplication := "application/xml";
 
// * (wildchard) sign
const charstring c_WILDCARD := "*";
// XML name application
const charstring c_xmlreginfoApplication := "application/reginfo+xml";
 
const integer c_CRlen := 2; // length of new line (0d0a)
// XML name resource-list
const charstring c_xmlresourcelistApplication := "application/resource-lists+xml";
 
const GenericParam c_Integrity_protected_yes := {"integrity-protected","yes"}
const GenericParam c_Integrity_protected_no := {"integrity-protected","no"}
const GenericParam c_Integrity_protected_ip_assoc_pending := {"integrity-protected","ip-assoc-pending"}
// MIME name application
const charstring c_mimeMultipart := "multipart/mixed;boundary=""" & PX_SIP_MIME_BOUNDARY & """";
 
// IMS 3GPP name application
const charstring c_ims3gppApplication := "application/3gpp-ims+xml";
 
} //end group SimpleConstants
// IMS 3GPP name CW application
const charstring c_ims3gppCwApplication := "application/vnd.3gpp.cw+xml";
 
group AuthorizationConstants {
// IMS ETSI name MCID application
const charstring c_imsEtsiMcidApplication := "application/vnd.etsi.mcid+xml";
 
const charstring c_ik := "";
const charstring c_ck := "";
const charstring c_nonce := "";
const charstring c_nonce_value := "0edff6c521cc3f407f2d9e01cf6ed82b";
// IMS ETSI name CUG application
const charstring c_imsEtsiCugApplication := "application/vnd.etsi.cug+xml";
 
} //end group AuthorizationConstants
// IMS ETSI name Simservs application(TIP/TIR, ACR, CDIV, OIP/OIR, CUG)
const charstring c_imsEtsiSimservsApplication := "application/vnd.etsi.simservs+xml";
 
group PChargingVectorConstants {
// OCTET-STREAM name application
const charstring c_octetApplication := "application/octet-stream";
 
const charstring c_icid := "icid-value";
const charstring c_icid_value := "123abc";
const charstring c_icid_generated_at := "icid-generated-at";
const charstring c_orig_ioi := "orig-ioi";
const charstring c_term_ioi := "term-ioi";
const charstring c_access_network_charging_info := "access-network-charging-info";
// PLAIN-TEXT name application
const charstring c_plainText := "text/plain";
 
} //end group PChargingVectorConstants
// SIP fragment message
const charstring c_sipfragMessage := "message/sipfrag";
 
group HeaderFieldConstants {
// text content of 1300 bytes for messages with message body
const charstring c_longMessageContent_1300Bytes :=
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" &
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & oct2char('0D'O) & oct2char('0A'O);
// CRLF
// Default SIP port number : 5060
const integer c_defaultSipPort := 5060;
 
const CallId c_empty_CallId :=
{
fieldName := CALL_ID_E,
callid := ""
};
// Default SIP protocol : UDP
const charstring c_defaultSipProt := "UDP";
 
const ContentType c_empty_ContentType :=
{
fieldName := CONTENT_TYPE_E,
mediaType := ""
};
// Fixed IP multicast address
const charstring c_mcastSipIpaddr := "224.0.1.75";
 
const CSeq c_empty_cSeq := {
fieldName := CSEQ_E,
seqNumber:=0,
method:="EMPTY" };
// Short delta-second used in expires parameter to acknowledge a registration
const charstring c_shortRegistration := "3600";
 
const From c_empty_From := {
fieldName := FROM_E,
addressField := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit ,
hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort}
}
},
urlParameters := omit,
headers := omit
}
}
},
fromParams := omit
};
// ([RFC3891 ] Sec 6.1)
const charstring c_earlyFlag := "early-only";
 
const MaxForwards c_maxForwards70 := {fieldName:=MAX_FORWARDS_E, forwards:=70}
// option tag replaces ([RFC3261 ] )
const charstring c_replaces := "replaces";
 
const SipUrl c_empty_RequestUri :=
{
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit ,
hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort}
}
},
urlParameters := omit,
headers := omit
};
// option tag 100rel (reliable provisional response [RFC3262 ] )
const charstring c_tag100rel := "100rel";
 
const SipUrl c_unavailableUri :=
{
scheme := c_sipScheme,
components := {
sip := {
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort}
}
},
urlParameters := omit,
headers := omit
};
// option tag from-change ([RFC4916 ] )
const charstring c_tagFromChange := "from-change";
 
const To c_empty_To :=
{ // value of To header
fieldName := TO_E,
addressField := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit ,
hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort}
}
},
urlParameters := omit,
headers := omit
}
// option tag precondition (ch.11 [RFC3312 ] )
const charstring c_tagPrecond := "precondition";
 
// due to problem with TAU compiler because hardcoded return statement constant is created
const HostPort c_hostport_dummy := {
host := "",
portField := c_defaultSipPort
};
 
// CLIP/CLIR information
const PrivacyValue c_privacy_none := "none";
const PrivacyValue c_privacy_id := "id";
const PrivacyValue c_privacy_header := "header";
const PrivacyValue c_privacy_user := "user";
const PrivacyValue c_privacy_critical := "critical";
const PrivacyValue c_privacy_session := "session";
 
//
const charstring c_AT := "@";
// MRO
const charstring c_SP := oct2char('20'O);
const charstring c_SLASH := oct2char('2F'O);
const charstring c_LT := oct2char('3C'O);
const charstring c_GT := oct2char('3E'O);
 
// * (wildchard) sign
const charstring c_WILDCARD := "*";
 
const integer c_CRlen := 2;
// length of new line (0d0a)
const GenericParam c_Integrity_protected_yes := {"integrity-protected", {tokenOrHost := "yes"}};
const GenericParam c_Integrity_protected_no := {"integrity-protected", {tokenOrHost := "no"}};
const GenericParam c_Integrity_protected_ip_assoc_pending := {"integrity-protected", {tokenOrHost := "ip-assoc-pending"}};
 
const charstring c_algorithm := "MD5";
 
} // end group SimpleConstants
 
group AuthorizationConstants {
 
const charstring c_ik := "";
const charstring c_ck := "";
const charstring c_nonce := "";
const charstring c_nonce_value := "0edff6c521cc3f407f2d9e01cf6ed82b";
 
 
} // end group AuthorizationConstants
 
group PChargingVectorConstants {
 
const charstring c_icid := "icid-value";
const charstring c_icid_value := "123abc";
const charstring c_icid_generated_at := "icid-generated-at";
const charstring c_orig_ioi := "orig-ioi";
const charstring c_term_ioi := "term-ioi";
const charstring c_access_network_charging_info := "access-network-charging-info";
 
 
} // end group PChargingVectorConstants
 
group HeaderFieldConstants {
 
const CallId c_empty_CallId := {
fieldName := CALL_ID_E,
callid := ""
};
 
const ContentType c_empty_ContentType := {
fieldName := CONTENT_TYPE_E,
mediaType := ""
};
 
const CSeq c_empty_cSeq := {
fieldName := CSEQ_E,
seqNumber := 0,
method := "EMPTY"
};
 
const From c_empty_From := {
fieldName := FROM_E,
addressField := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := "127.0.0.1",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
}
}
},
fromParams := omit
};
 
const MaxForwards c_maxForwards70 := {
fieldName := MAX_FORWARDS_E,
forwards := 70
};
 
const SipUrl c_empty_RequestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := "127.0.0.1",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
};
 
const SipUrl c_unavailableUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "unavailable",
password := omit
},
hostPort := {
host := "anonymous.invalid",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
};
 
const To c_empty_To := {
// value of To header
fieldName := TO_E,
addressField := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := "127.0.0.1",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
}
}
},
toParams := omit
};
 
const Via c_empty_Via := {
fieldName := VIA_E,
viaBody := {
{
sentProtocol := {
protocolName := c_sipName,
protocolVersion := c_sipVersion,
transport := c_defaultSipProt
},
sentBy := {
host := "127.0.0.1",
portField := c_defaultSipPort
},
viaParams := omit
}
}
};
 
 
}
},
toParams := omit
};
 
const Via c_empty_Via := {
fieldName := VIA_E,
viaBody :={
{sentProtocol := {
protocolName := c_sipName,
protocolVersion := c_sipVersion,
transport := c_defaultSipProt
},
sentBy := {host:="127.0.0.1", portField:=c_defaultSipPort},
viaParams:= omit
 
group UserProfileConstants {
// number of user profile from 1-10 for SIP profile
const integer c_userProfile_SIP1_home := 1;
const integer c_userProfile_SIP2_home := 2;
 
 
} // end group UserProfileConstants
 
group StatusLines {
const StatusLine c_statusLine100 := {c_sipNameVersion, 100, "Trying"};
const StatusLine c_statusLine180 := {c_sipNameVersion, 180, "Ringing"};
const StatusLine c_statusLine181 := {c_sipNameVersion, 181, "Call Is Being Forwarded"};
const StatusLine c_statusLine182 := {c_sipNameVersion, 182, "Queued"};
const StatusLine c_statusLine183 := {c_sipNameVersion, 183, "Session Progress"};
 
const StatusLine c_statusLine200 := {c_sipNameVersion, 200, "OK"};
const StatusLine c_statusLine202 := {c_sipNameVersion, 202, "Accepted"};
 
const StatusLine c_statusLine300 := {c_sipNameVersion, 300, "Multiple Choices"};
const StatusLine c_statusLine301 := {c_sipNameVersion, 301, "Moved Permanently"};
const StatusLine c_statusLine302 := {c_sipNameVersion, 302, "Moved Temporarily"};
const StatusLine c_statusLine305 := {c_sipNameVersion, 305, "Use Proxy"};
const StatusLine c_statusLine380 := {c_sipNameVersion, 380, "Alternative Service"};
 
const StatusLine c_statusLine400 := {c_sipNameVersion, 400, "Bad Request"};
const StatusLine c_statusLine401 := {c_sipNameVersion, 401, "Unauthorized"};
const StatusLine c_statusLine402 := {c_sipNameVersion, 402, "Payment Required"};
const StatusLine c_statusLine403 := {c_sipNameVersion, 403, "Forbidden"};
const StatusLine c_statusLine404 := {c_sipNameVersion, 404, "Not Found"};
const StatusLine c_statusLine405 := {c_sipNameVersion, 405, "Method Not Allowed"};
const StatusLine c_statusLine406 := {c_sipNameVersion, 406, "Not Acceptable"};
const StatusLine c_statusLine407 := {c_sipNameVersion, 407, "Proxy Authentication Required"};
const StatusLine c_statusLine408 := {c_sipNameVersion, 408, "Request Timeout"};
const StatusLine c_statusLine410 := {c_sipNameVersion, 410, "Gone"};
const StatusLine c_statusLine413 := {c_sipNameVersion, 413, "Request Entity Too Large"};
const StatusLine c_statusLine414 := {c_sipNameVersion, 414, "Request-URI Too Long"};
const StatusLine c_statusLine415 := {c_sipNameVersion, 415, "Unsupported Media Type"};
const StatusLine c_statusLine416 := {c_sipNameVersion, 416, "Unsupported URI Scheme"};
const StatusLine c_statusLine420 := {c_sipNameVersion, 420, "Bad Extension"};
const StatusLine c_statusLine421 := {c_sipNameVersion, 421, "Extension Required"};
const StatusLine c_statusLine422 := {c_sipNameVersion, 422, "Session Interval Too Small"};
const StatusLine c_statusLine423 := {c_sipNameVersion, 423, "Interval Too Brief"};
const StatusLine c_statusLine433 := {c_sipNameVersion, 433, "Anonymity Disallowed"};
const StatusLine c_statusLine480 := {c_sipNameVersion, 480, "Temporarily Unavailable"};
const StatusLine c_statusLine481 := {c_sipNameVersion, 481, "Call/Transaction Does Not Exist"};
const StatusLine c_statusLine482 := {c_sipNameVersion, 482, "Loop Detected"};
const StatusLine c_statusLine483 := {c_sipNameVersion, 483, "Too Many Hops"};
const StatusLine c_statusLine484 := {c_sipNameVersion, 484, "Address Incomplete"};
const StatusLine c_statusLine485 := {c_sipNameVersion, 485, "Ambiguous"};
const StatusLine c_statusLine486 := {c_sipNameVersion, 486, "Busy Here"};
const StatusLine c_statusLine487 := {c_sipNameVersion, 487, "Request Terminated"};
const StatusLine c_statusLine488 := {c_sipNameVersion, 488, "Not Acceptable Here"};
const StatusLine c_statusLine493 := {c_sipNameVersion, 493, "Undecipherable"};
const StatusLine c_statusLine500 := {c_sipNameVersion, 500, "Server Internal Error"};
const StatusLine c_statusLine501 := {c_sipNameVersion, 501, "Not implemented"};
const StatusLine c_statusLine502 := {c_sipNameVersion, 502, "Bad Gateway"};
const StatusLine c_statusLine503 := {c_sipNameVersion, 503, "Service Unavailable"};
const StatusLine c_statusLine504 := {c_sipNameVersion, 504, "Server Time-out"};
const StatusLine c_statusLine505 := {c_sipNameVersion, 505, "Version Not Supported"};
const StatusLine c_statusLine513 := {c_sipNameVersion, 513, "Message Too Large"};
const StatusLine c_statusLine580 := {c_sipNameVersion, 580, "Precondition Failure"};
const StatusLine c_statusLine600 := {c_sipNameVersion, 600, "Busy Everywhere"};
const StatusLine c_statusLine603 := {c_sipNameVersion, 603, "Decline"};
const StatusLine c_statusLine604 := {c_sipNameVersion, 604, "Does Not Exist Anywhere"};
const StatusLine c_statusLine606 := {c_sipNameVersion, 606, "Not Acceptable"};
 
 
} // end StatusLines
 
group SIPSyncPointNames {
const charstring c_Ringing := "Ringing";
const charstring c_uPlane := "uPlane";
const charstring c_sync1 := "sync1";
const charstring c_sync2 := "sync2";
const charstring c_sync3 := "sync3";
const charstring c_sync4 := "sync4";
const charstring c_uPlaneStop := "uPlaneStop";
const charstring c_annoucA := "announcementA";
const charstring c_annoucB := "announcementB";
const charstring c_annouc := "announcement";
const charstring c_voicem := "voiceMessage";
}
}};
 
 
}
} // end group Constants
 
group Types {
group SubTypes {
// Subtypes
group TokenTypes // TokensTypes
{
// [20 ]
type enumerated FieldName {
ACCEPT_E,
ACCEPT_ENCODING_E,
ACCEPT_LANGUAGE_E,
ALERT_INFO_E,
ALLOW_E,
AUTHENTICATION_INFO_E,
AUTHORIZATION_E,
CALL_ID_E,
CALL_INFO_E,
CONTACT_E,
CONTENT_DISPOSITION_E,
CONTENT_ENCODING_E,
CONTENT_LANGUAGE_E,
CONTENT_LENGTH_E,
CONTENT_TYPE_E,
CSEQ_E,
DATE_E,
ERROR_INFO_E,
EXPIRES_E,
FROM_E,
IN_REPLY_TO_E,
MAX_FORWARDS_E,
MIME_VERSION_E,
MIN_EXPIRES_E,
ORGANIZATION_E,
PRIORITY_E,
PROXY_AUTHENTICATE_E,
PROXY_AUTHORIZATION_E,
PROXY_REQUIRE_E,
RECORD_ROUTE_E,
REPLY_TO_E,
REQUIRE_E,
RETRY_AFTER_E,
ROUTE_E,
SERVER_E,
SUBJECT_E,
SUPPORTED_E,
TIMESTAMP_E,
TO_E,
UNSUPPORTED_E,
USER_AGENT_E,
VIA_E,
WARNING_E,
WWW_AUTHENTICATE_E,
// [3262/7.1 ]
RACK_E,
RSEQ_E,
// [3265/7.2 ]
ALLOW_EVENTS_E,
EVENT_E,
SUBSCRIPTION_STATE_E,
// [3313 ]
P_MEDIA_AUTHORIZATION_E,
// [3323 ]
PRIVACY_E,
// [3325 ]
P_ASSERTED_ID_E,
P_PREFERRED_ID_E,
P_PREFERRED_SERVICE_E,
// [3326 ]
REASON_E,
// [3515 ] - REFER method
REFER_TO_E,
// [4488 ] - REFER method
REFER_SUB_E,
// [3891 ]
REPLACES_E,
// [3892 ] - REFER method
REFERRED_BY_E,
// [4244 ]
HISTORY_INFO_E,
// [3313 ]
P_MEDIA_AUTH_E,
// [3327 ]
PATH_E,
// [3329 ]
SECURITY_CLIENT_E,
SECURITY_SERVER_E,
SECURITY_VERIFY_E,
// [3455 ]
P_ACCESS_NETWORK_INFO_E,
P_ASSOCIATED_URI_E,
P_CALLED_PARTY_E,
P_CHARGING_FUNCTION_ADDRESSES_E,
P_CHARGING_VECTOR_E,
P_VISITED_NETWORK_E,
// [3608 ]
SERVICE_ROUTE_E,
// [3841 ]
ACCEPT_CONTACT_E,
REQUEST_DISPOSITION_E,
// [4028 ]
MIN_SE_E,
SESSION_EXPIRES_E,
P_ASSERTED_SERVICE_E,
// [5009 ]
P_EARLY_MEDIA_E,
// http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07
// Transporting User to User Call Control Information in SIP for ISDN Interworking
USER_TO_USER_E,
// [6442 ] /*
// @sic R5-133151 update of header fields sic@ */
GEOLOCATION_E,
GEOLOCATION_ROUTING_E,
SESSION_ID_E,
SIP_ETAG_E,
SIP_IF_MATCH_E,
FEATURE_CAPS_E
}
 
group UserProfileConstants
{
// number of user profile from 1-10 for SIP profile
const integer c_userProfile_SIP1_home := 1;
const integer c_userProfile_SIP2_home := 2;
// [7.1 ]
type enumerated Method {
ACK_E,
BYE_E,
CANCEL_E,
INVITE_E,
OPTIONS_E,
REGISTER_E,
PRACK_E // Note: this element is not defined in [5 ]
,
SUBSCRIBE_E,
NOTIFY_E // [3265 ]
,
PUBLISH_E // [3903/12 ]
,
REFER_E // [3515 ]
,
UPDATE_E // [3311 ]
,
MESSAGE_E // [3428 ]
,
INFO_E // [2976 ]
,
UNKNOWN_METHOD_E
}
 
} //end group UserProfileConstants
type union GenValue {
charstring tokenOrHost,
charstring quotedString
}
 
group StatusLines
{
const StatusLine c_statusLine100 := {c_sipNameVersion, 100, "Trying"};
const StatusLine c_statusLine180 := {c_sipNameVersion, 180, "Ringing"};
const StatusLine c_statusLine181 := {c_sipNameVersion, 181, "Call Is Being Forwarded"};
const StatusLine c_statusLine182 := {c_sipNameVersion, 182, "Queued"};
const StatusLine c_statusLine183 := {c_sipNameVersion, 183, "Session Progress"};
// [20.1, 20.3, 20.4, 20.7, 20.9, 20.10, 20.11, 20.18, 20.20, 20.27, 20.28, 20.30, 20.31,
// 20.33, 20.34, 20.39, 20.42, 20.44 ]
type record GenericParam {
charstring id,
GenValue paramValue optional
}
 
const StatusLine c_statusLine200 := {c_sipNameVersion, 200, "OK"};
const StatusLine c_statusLine202 := {c_sipNameVersion, 202, "Accepted"};
// [? ]
type set of GenericParam SemicolonParam_List;
 
const StatusLine c_statusLine300 := {c_sipNameVersion, 300, "Multiple Choices"};
const StatusLine c_statusLine301 := {c_sipNameVersion, 301, "Moved Permanently"};
const StatusLine c_statusLine302 := {c_sipNameVersion, 302, "Moved Temporarily"};
const StatusLine c_statusLine305 := {c_sipNameVersion, 305, "Use Proxy"};
const StatusLine c_statusLine380 := {c_sipNameVersion, 380, "Alternative Service"};
// [? ]
type set of GenericParam AmpersandParam_List;
 
const StatusLine c_statusLine400 := {c_sipNameVersion, 400, "Bad Request"};
const StatusLine c_statusLine401 := {c_sipNameVersion, 401, "Unauthorized"};
const StatusLine c_statusLine402 := {c_sipNameVersion, 402, "Payment Required"};
const StatusLine c_statusLine403 := {c_sipNameVersion, 403, "Forbidden"};
const StatusLine c_statusLine404 := {c_sipNameVersion, 404, "Not Found"};
const StatusLine c_statusLine405 := {c_sipNameVersion, 405, "Method Not Allowed"};
const StatusLine c_statusLine406 := {c_sipNameVersion, 406, "Not Acceptable"};
const StatusLine c_statusLine407 := {c_sipNameVersion, 407, "Proxy Authentication Required"};
const StatusLine c_statusLine408 := {c_sipNameVersion, 408, "Request Timeout"};
const StatusLine c_statusLine410 := {c_sipNameVersion, 410, "Gone"};
const StatusLine c_statusLine413 := {c_sipNameVersion, 413, "Request Entity Too Large"};
const StatusLine c_statusLine414 := {c_sipNameVersion, 414, "Request-URI Too Long"};
const StatusLine c_statusLine415 := {c_sipNameVersion, 415, "Unsupported Media Type"};
const StatusLine c_statusLine416 := {c_sipNameVersion, 416, "Unsupported URI Scheme"};
const StatusLine c_statusLine420 := {c_sipNameVersion, 420, "Bad Extension"};
const StatusLine c_statusLine421 := {c_sipNameVersion, 421, "Extension Required"};
const StatusLine c_statusLine422 := {c_sipNameVersion, 422, "Session Interval Too Small"};
const StatusLine c_statusLine423 := {c_sipNameVersion, 423, "Interval Too Brief"};
const StatusLine c_statusLine433 := {c_sipNameVersion, 433, "Anonymity Disallowed"};
const StatusLine c_statusLine480 := {c_sipNameVersion, 480, "Temporarily Unavailable"};
const StatusLine c_statusLine481 := {c_sipNameVersion, 481, "Call/Transaction Does Not Exist"};
const StatusLine c_statusLine482 := {c_sipNameVersion, 482, "Loop Detected"};
const StatusLine c_statusLine483 := {c_sipNameVersion, 483, "Too Many Hops"};
const StatusLine c_statusLine484 := {c_sipNameVersion, 484, "Address Incomplete"};
const StatusLine c_statusLine485 := {c_sipNameVersion, 485, "Ambiguous"};
const StatusLine c_statusLine486 := {c_sipNameVersion, 486, "Busy Here"};
const StatusLine c_statusLine487 := {c_sipNameVersion, 487, "Request Terminated"};
const StatusLine c_statusLine488 := {c_sipNameVersion, 488, "Not Acceptable Here"};
const StatusLine c_statusLine493 := {c_sipNameVersion, 493, "Undecipherable"};
const StatusLine c_statusLine500 := {c_sipNameVersion, 500, "Server Internal Error"};
const StatusLine c_statusLine501 := {c_sipNameVersion, 501, "Not implemented"};
const StatusLine c_statusLine502 := {c_sipNameVersion, 502, "Bad Gateway"};
const StatusLine c_statusLine503 := {c_sipNameVersion, 503, "Service Unavailable"};
const StatusLine c_statusLine504 := {c_sipNameVersion, 504, "Server Time-out"};
const StatusLine c_statusLine505 := {c_sipNameVersion, 505, "Version Not Supported"};
const StatusLine c_statusLine513 := {c_sipNameVersion, 513, "Message Too Large"};
const StatusLine c_statusLine580 := {c_sipNameVersion, 580, "Precondition Failure"};
const StatusLine c_statusLine600 := {c_sipNameVersion, 600, "Busy Everywhere"};
const StatusLine c_statusLine603 := {c_sipNameVersion, 603, "Decline"};
const StatusLine c_statusLine604 := {c_sipNameVersion, 604, "Does Not Exist Anywhere"};
const StatusLine c_statusLine606 := {c_sipNameVersion, 606, "Not Acceptable"};
// [? ]
type set of GenericParam CommaParam_List;
 
} //end StatusLines
type set length (1..infinity) of charstring Charstring_List;
 
group SIPSyncPointNames {
const charstring c_Ringing := "Ringing";
const charstring c_uPlane := "uPlane";
const charstring c_sync1 := "sync1";
const charstring c_sync2 := "sync2";
const charstring c_sync3 := "sync3";
const charstring c_sync4 := "sync4";
const charstring c_uPlaneStop := "uPlaneStop";
const charstring c_annoucA := "announcementA";
const charstring c_annoucB := "announcementB";
const charstring c_annouc := "announcement";
const charstring c_voicem := "voiceMessage";
}
// [20.10, 20.20, 20.30, 20.31, 20.34, 20.39, 20.42, 20.43 ]
type record HostPort {
charstring host optional,
// hostname, IPv4 or IPv6
integer portField
optional // represented as an integer
}
 
} //end group Constants
// [20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ]
/**
* @desc identifier for user or telephone subscriber
* @member userOrTelephoneSubscriber provides the username or a phone name identifying the subscriber
* @member password related password information
*/
type record UserInfo {
charstring userOrTelephoneSubscriber,
charstring password optional
}
 
group Types {
group SubTypes{// Subtypes
group TokenTypes // TokensTypes
{
// [20]
type enumerated FieldName
{
ACCEPT_E,
ACCEPT_ENCODING_E,
ACCEPT_LANGUAGE_E,
ALERT_INFO_E,
ALLOW_E,
AUTHENTICATION_INFO_E,
AUTHORIZATION_E,
CALL_ID_E,
CALL_INFO_E,
CONTACT_E,
CONTENT_DISPOSITION_E,
CONTENT_ENCODING_E,
CONTENT_LANGUAGE_E,
CONTENT_LENGTH_E,
CONTENT_TYPE_E,
CSEQ_E,
DATE_E,
ERROR_INFO_E,
EXPIRES_E,
FROM_E,
IN_REPLY_TO_E,
MAX_FORWARDS_E,
MIME_VERSION_E,
MIN_EXPIRES_E,
ORGANIZATION_E,
PRIORITY_E,
PROXY_AUTHENTICATE_E,
PROXY_AUTHORIZATION_E,
PROXY_REQUIRE_E,
RECORD_ROUTE_E,
REPLY_TO_E,
REQUIRE_E,
RETRY_AFTER_E,
ROUTE_E,
SERVER_E,
SUBJECT_E,
SUPPORTED_E,
TIMESTAMP_E,
TO_E,
UNSUPPORTED_E,
USER_AGENT_E,
VIA_E,
WARNING_E,
WWW_AUTHENTICATE_E,
// [3262/7.1]
RACK_E,
RSEQ_E,
// [19.1.1 ;used in: 20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ]
/**
* @desc Uniform Resource Identifier (URI)
* @member scheme distinguishes call types, e.g. voice, fax etc. or related address scheme, e.g. tel, sip
* @member userInfo Contains user information (also in non-SIP URLs) with optional parameter as passwords
* @member hostPort Hostname or IP address information and port identifier of the target
* @member urlParameters Contains either SIP or TEL URL parameters, separated by semicolons, e.g. transport=tcp or user=phone
* @member headers Additional information added after the parameters, e.g. priority=urgent
*/
type record SipUriComponents {
// sip-uri acc. to RFC 3261 cl. 19.1
UserInfo userInfo optional,
HostPort hostPort
}
 
// [3265/7.2]
ALLOW_EVENTS_E,
EVENT_E,
SUBSCRIPTION_STATE_E,
type record TelUriComponents {
// tel-uri acc. to RFC 3966
charstring subscriber
}
 
// [3313]
P_MEDIA_AUTHORIZATION_E,
type record UrnUriComponents {
// urn-uri acc. to RFC 2141
charstring namespaceId,
// e.g. "service" as acc. to RFC 5031
charstring
namespaceSpecificString // e.g. "sos"
}
 
// [3323]
PRIVACY_E,
type union UriComponents {
SipUriComponents sip,
// scheme: "sip" or sips"
TelUriComponents tel,
// scheme: "tel"
UrnUriComponents urn,
// scheme: "urn"
charstring
other // scheme: none of the above schemes
}
 
// [3325]
P_ASSERTED_ID_E,
P_PREFERRED_ID_E,
P_PREFERRED_SERVICE_E,
type record SipUrl {
charstring scheme,
// e.g "sip" or "tel"
UriComponents components,
// corresponding to the scheme
SemicolonParam_List urlParameters optional,
AmpersandParam_List headers optional
}
 
// [3326]
REASON_E,
// [20.1, RFC2616 14.1 ]
type record AcceptBody {
charstring mediaRange,
SemicolonParam_List acceptParam optional
}
 
// [3515] - REFER method
REFER_TO_E,
// [20.1, RFC2616 14.1 ]
type set of AcceptBody AcceptBody_List;
 
// [4488] - REFER method
REFER_SUB_E,
// [20.4 ]
type record AlertInfoBody {
charstring url,
// any URI
SemicolonParam_List genericParams optional
}
 
// [3891]
REPLACES_E,
// [20.4 ]
type set of AlertInfoBody AlertInfoBody_List;
 
// [3892] - REFER method
REFERRED_BY_E,
// [20.8 ]
type charstring CallidString;
// token ["
// [20.8 ]
type set of CallidString CallidString_List;
 
// [4244]
HISTORY_INFO_E,
// [20.9 ]
type record CallInfoBody {
charstring url,
// any URI
SemicolonParam_List infoParams optional
}
 
// [3313]
P_MEDIA_AUTH_E,
// [20.9 ]
type set of CallInfoBody CallInfoBody_List;
 
// [3327]
PATH_E,
// [20.27, 20.44, .......10.32, 10.48; RFC2616 14.33, 14.47; RFC2617 1.2 ]
type union Challenge {
CommaParam_List digestCln,
OtherAuth otherChallenge
}
 
// [3329]
SECURITY_CLIENT_E,
SECURITY_SERVER_E,
SECURITY_VERIFY_E,
// [20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ]
type record NameAddr {
charstring displayName optional,
SipUrl addrSpec
}
 
// [3455]
P_ACCESS_NETWORK_INFO_E,
P_ASSOCIATED_URI_E,
P_CALLED_PARTY_E,
P_CHARGING_FUNCTION_ADDRESSES_E,
P_CHARGING_VECTOR_E,
P_VISITED_NETWORK_E,
// [20.10, 20.20, 20.31, 20.39 ]
type union Addr_Union {
NameAddr nameAddr,
SipUrl
addrSpecUnion // STS: "Union" added to filed name to avoid dangerous name equivalence with 2nd NameAddr field
}
 
// [3608]
SERVICE_ROUTE_E,
// [20.10 ]
type record ContactAddress {
Addr_Union addressField,
SemicolonParam_List contactParams optional
}
 
// [3841]
ACCEPT_CONTACT_E,
REQUEST_DISPOSITION_E,
// [20.10 ]
type set of ContactAddress ContactAddress_List;
// 1 or more elements
// [20.10 ]
type union ContactBody {
charstring wildcard,
ContactAddress_List contactAddresses
}
 
// [4028]
MIN_SE_E,
SESSION_EXPIRES_E,
// [20.2, 20.12; RFC2616 14.3, 14.11 ]
type charstring ContentCoding;
 
P_ASSERTED_SERVICE_E,
// [20.2, 20.12; RFC2616 14.3, 14.11 ]
type set of ContentCoding ContentCoding_List;
 
//[5009]
P_EARLY_MEDIA_E,
// [20.7, 20.28; RFC2616 14.35 RFC2617 1.2 ]
type union Credentials {
CommaParam_List digestResponse,
OtherAuth otherResponse
}
 
//http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07
//Transporting User to User Call Control Information in SIP for ISDN Interworking
USER_TO_USER_E,
//[6442] /* @sic R5-133151 update of header fields sic@ */
GEOLOCATION_E,
GEOLOCATION_ROUTING_E,
SESSION_ID_E,
SIP_ETAG_E,
SIP_IF_MATCH_E
}
// [7.1]
type enumerated Method {
ACK_E,
BYE_E,
CANCEL_E,
INVITE_E,
OPTIONS_E,
REGISTER_E,
PRACK_E, // Note: this element is not defined in [5]
SUBSCRIBE_E, NOTIFY_E, // [3265]
PUBLISH_E, // [3903/12]
REFER_E, // [3515]
UPDATE_E, // [3311]
MESSAGE_E, // [3428]
INFO_E, // [2976]
UNKNOWN_METHOD_E
}
// allow multiple Authorization headers due to RFC3261 ch. 20.7 and 20.28
type record of Credentials CredentialsList;
 
// [20.1, 20.3, 20.4, 20.7, 20.9, 20.10, 20.11, 20.18, 20.20, 20.27, 20.28, 20.30, 20.31,
// 20.33, 20.34, 20.39, 20.42, 20.44]
type record GenericParam
{
charstring id,
charstring paramValue optional
}
// [?]
type set of GenericParam SemicolonParam_List;
// [?]
type set of GenericParam AmpersandParam_List;
// [?]
type set of GenericParam CommaParam_List;
// [20.10, 20.20, 20.30, 20.31, 20.34, 20.39, 20.42, 20.43]
type record HostPort
{
charstring host optional, // hostname, IPv4 or IPv6
integer portField optional // represented as an integer
}
// [20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
/**
*
* @desc identifier for user or telephone subscriber
* @member userOrTelephoneSubscriber provides the username or a phone name identifying the subscriber
* @member password related password information
*
*/
type record UserInfo
{
charstring userOrTelephoneSubscriber,
charstring password optional
}
// [19.1.1 ;used in: 20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
// [20.19, 20.23, 20.33 ]
type charstring DeltaSec;
// an external operation can handle this field
// [20.18 ]
type record ErrorInfoBody {
charstring uri,
// any URI
SemicolonParam_List genericParams optional
}
 
// [20.18 ]
type set of ErrorInfoBody ErrorInfoBody_List;
 
/**
*
* @desc Uniform Resource Identifier (URI)
* @member scheme distinguishes call types, e.g. voice, fax etc. or related address scheme, e.g. tel, sip
* @member userInfo Contains user information (also in non-SIP URLs) with optional parameter as passwords
* @member hostPort Hostname or IP address information and port identifier of the target
* @member urlParameters Contains either SIP or TEL URL parameters, separated by semicolons, e.g. transport=tcp or user=phone
* @member headers Additional information added after the parameters, e.g. priority=urgent
*/
// [20.3 RFC2616 14.4 ]
type record LanguageBody {
charstring languageRange,
SemicolonParam_List acceptParam optional
}
 
type record SipUriComponents { // sip-uri acc. to RFC 3261 cl. 19.1
UserInfo userInfo optional,
HostPort hostPort
}
// [20.3 RFC2616 14.4 ]
type set of LanguageBody LanguageBody_List;
 
type record TelUriComponents { // tel-uri acc. to RFC 3966
charstring subscriber
}
type record UrnUriComponents { // urn-uri acc. to RFC 2141
charstring namespaceId, // e.g. "service" as acc. to RFC 5031
charstring namespaceSpecificString // e.g. "sos"
}
type union UriComponents {
SipUriComponents sip, // scheme: "sip" or sips"
TelUriComponents tel, // scheme: "tel"
UrnUriComponents urn, // scheme: "urn"
charstring other // scheme: none of the above schemes
}
type record SipUrl
{
charstring scheme, // e.g "sip" or "tel"
UriComponents components, // corresponding to the scheme
SemicolonParam_List urlParameters optional,
AmpersandParam_List headers optional
}
// [20.13; RFC2616 14.12 ]
type charstring LanguageTag;
 
// [20.1, RFC2616 14.1]
type record AcceptBody
{
charstring mediaRange,
SemicolonParam_List acceptParam optional
}
// [20.1, RFC2616 14.1]
type set of AcceptBody AcceptBody_List;
// [20.4]
type record AlertInfoBody
{
charstring url, // any URI
SemicolonParam_List genericParams optional
}
// [20.4]
type set of AlertInfoBody AlertInfoBody_List;
// [20.8]
type charstring CallidString; // token ["@" token]
// [20.8]
type set of CallidString CallidString_List;
// [20.9]
type record CallInfoBody
{
charstring url, // any URI
SemicolonParam_List infoParams optional
}
// [20.9]
type set of CallInfoBody CallInfoBody_List;
// [20.27, 20.44, .......10.32, 10.48; RFC2616 14.33, 14.47; RFC2617 1.2]
type union Challenge
{
CommaParam_List digestCln,
OtherAuth otherChallenge
}
// [20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
type record NameAddr
{
charstring displayName optional,
SipUrl addrSpec
}
// [20.10, 20.20, 20.31, 20.39]
type union Addr_Union
{
NameAddr nameAddr,
SipUrl addrSpecUnion // STS: "Union" added to filed name to avoid dangerous name equivalence with 2nd NameAddr field
}
// [20.10]
type record ContactAddress
{
Addr_Union addressField,
SemicolonParam_List contactParams optional
}
// [20.10]
type set of ContactAddress ContactAddress_List; // 1 or more elements
// [20.10]
type union ContactBody
{
charstring wildcard,
ContactAddress_List contactAddresses
}
// [20.2, 20.12; RFC2616 14.3, 14.11]
type charstring ContentCoding;
// [20.2, 20.12; RFC2616 14.3, 14.11]
type set of ContentCoding ContentCoding_List;
// [20.7, 20.28; RFC2616 14.35 RFC2617 1.2]
type union Credentials
{
CommaParam_List digestResponse,
OtherAuth otherResponse
}
// allow multiple Authorization headers due to RFC3261 ch. 20.7 and 20.28
type record of Credentials CredentialsList;
// [20.19, 20.23, 20.33]
type charstring DeltaSec; // an external operation can handle this field
// [20.18]
type record ErrorInfoBody
{
charstring uri, // any URI
SemicolonParam_List genericParams optional
}
// [20.18]
type set of ErrorInfoBody ErrorInfoBody_List;
// [20.3 RFC2616 14.4]
type record LanguageBody
{
charstring languageRange,
SemicolonParam_List acceptParam optional
}
// [20.3 RFC2616 14.4]
type set of LanguageBody LanguageBody_List;
// [20.13; RFC2616 14.12]
type charstring LanguageTag;
// [20.13; RFC2616 14.12]
type set of LanguageTag LanguageTag_List;
// [20.5]
type set of charstring Method_List;
// [20.29, 20.32, 20.37, 20.40]
type charstring OptionTag;
// [20.29, 20.32, 20.37, 20.40]
type set of OptionTag OptionTag_List;
// [20.7, 20.27, 20.28, 20.44 ; RFC2616 14.33, 14.47; RFC2617 1.2]
type record OtherAuth
{
charstring authScheme,
CommaParam_List authParams
}
type record Payload
{
integer payloadlength,
charstring payloadvalue
}
// [20.30,20.34]
type record RouteBody
{
NameAddr nameAddr,
SemicolonParam_List rrParam optional
}
// [20.30,20.34]
type record of RouteBody RouteBody_List;
// [20.42]
type record SentProtocol
{
charstring protocolName,
charstring protocolVersion,
charstring transport
}
// [20.35, 20.41; RFC2616 14.43]
type charstring ServerVal;
// [20.35, 20.41; RFC2616 14.43]
type set of ServerVal ServerVal_List;
// [20.38]
type record TimeValue
{
integer majorDigit, // represented as an integer
integer minorDigit optional // represented as an integer
}
// [20.42]
type record ViaBody
{
SentProtocol sentProtocol,
HostPort sentBy,
SemicolonParam_List viaParams optional
}
// [20.42]
type record of ViaBody ViaBody_List;
// [20.43]
type union WarnAgent
{
HostPort hostPort,
charstring pseudonym
}
// [20.43]
type record WarningValue
{
integer warnCode, // represented as an integer
WarnAgent warnAgent,
charstring warnText
}
// [20.43]
type set of WarningValue WarningValue_List;
// [20.13; RFC2616 14.12 ]
type set of LanguageTag LanguageTag_List;
 
type Addr_Union PAssertedIDValue;
type record of PAssertedIDValue PAssertedIDValue_List;
// [20.5 ]
type set of charstring Method_List;
 
type charstring PAssertedServiceValue;
 
type Addr_Union PPreferredIDValue;
type record of PPreferredIDValue PPreferredIDValue_List;
// [20.29, 20.32, 20.37, 20.40 ]
type charstring OptionTag;
 
type charstring PrivacyValue;
type record of PrivacyValue PrivacyValue_List;
// [20.29, 20.32, 20.37, 20.40 ]
type set of OptionTag OptionTag_List;
 
} // end group TokensType
group HeaderFieldTypes // Header Fields
{
group CommonHeaderFieldTypes
{
// [20.1, RFC2616 14.1]
type record Accept
{
FieldName fieldName (ACCEPT_E),
AcceptBody_List acceptArgs optional
}
// [20.2, RFC2616 14.3]
type record AcceptEncoding
{
FieldName fieldName (ACCEPT_ENCODING_E),
ContentCoding_List contentCoding optional
}
// [20.3, RFC2616 14.4]
type record AcceptLanguage
{
FieldName fieldName (ACCEPT_LANGUAGE_E),
LanguageBody_List languageBody optional
}
// [20.4]
type record AlertInfo
{
FieldName fieldName (ALERT_INFO_E),
AlertInfoBody_List alertInfoBody optional
}
// [20.5]
type record Allow
{
FieldName fieldName (ALLOW_E),
Method_List methods optional
}
// [20.6]
type record AuthenticationInfo
{
FieldName fieldName (AUTHENTICATION_INFO_E),
CommaParam_List ainfo
}
// [20.7 RFC2617 3.2.2]
type record Authorization
{
FieldName fieldName (AUTHORIZATION_E),
CredentialsList body // changed from Credentials to allow multiple Authorization headers
}
// [20.8]
type record CallId
{
FieldName fieldName (CALL_ID_E),
CallidString callid
}
// [20.9]
type record CallInfo
{
FieldName fieldName (CALL_INFO_E),
CallInfoBody_List callInfoBody optional
}
// [20.10]
type record Contact
{
FieldName fieldName (CONTACT_E),
ContactBody contactBody
}
// [20.11]
type record ContentDisposition
{
FieldName fieldName (CONTENT_DISPOSITION_E),
charstring dispositionType,
SemicolonParam_List dispositionParams optional
}
// [20.12 RFC2616 14.11]
type record ContentEncoding
{
FieldName fieldName (CONTENT_ENCODING_E),
ContentCoding_List contentCoding
}
// [20.13 RFC2616 14.12]
type record ContentLanguage
{
FieldName fieldName (CONTENT_LANGUAGE_E),
LanguageTag_List languageTag
}
// [20.14]
type record ContentLength
{
FieldName fieldName (CONTENT_LENGTH_E),
integer len // this field is represented as an integer
}
// [20.15]
type record ContentType
{
FieldName fieldName (CONTENT_TYPE_E),
charstring mediaType
}
// [20.16]
type record CSeq
{
FieldName fieldName (CSEQ_E),
integer seqNumber, // this field is represented as an integer
charstring method
}
// [20.17]
type record Date
{
FieldName fieldName (DATE_E),
charstring sipDate
}
// [20.18]
type record ErrorInfo
{
FieldName fieldName (ERROR_INFO_E),
ErrorInfoBody_List errorInfo optional
}
// [20.19]
type record Expires
{
FieldName fieldName (EXPIRES_E),
DeltaSec deltaSec
}
// [20.20]
type record From
{
FieldName fieldName (FROM_E),
Addr_Union addressField,
SemicolonParam_List fromParams optional
}
// [20.21]
type record InReplyTo
{
FieldName fieldName (IN_REPLY_TO_E),
CallidString_List callids
}
// [20.22]
type record MaxForwards
{
FieldName fieldName (MAX_FORWARDS_E),
integer forwards // this field is represented as an integer
}
// [20.23]
type record MinExpires
{
FieldName fieldName (MIN_EXPIRES_E),
DeltaSec deltaSec
}
// [20.24 RFC2616 19.4.1]
type record MimeVersion
{
FieldName fieldName (MIME_VERSION_E),
integer majorNumber, // this field is represented as an integer
integer minorNumber // this field is represented as an integer
}
// [20.25]
type record Organization
{
FieldName fieldName (ORGANIZATION_E),
charstring organization
}
// [20.26]
type record Priority
{
FieldName fieldName (PRIORITY_E),
charstring priorityValue
}
// [20.27 RFC2616 14.33 RFC2617 1.2]
type record ProxyAuthenticate
{
FieldName fieldName (PROXY_AUTHENTICATE_E),
Challenge challenge
}
// [20.28 RFC2616 14.35 RFC2617 1.2]
type record ProxyAuthorization
{
FieldName fieldName (PROXY_AUTHORIZATION_E),
CredentialsList credentials // changed from Credentials to allow multiple Authorization headers
}
// [20.29]
type record ProxyRequire
{
FieldName fieldName (PROXY_REQUIRE_E),
OptionTag_List optionsTags
}
// [20.30]
type record RecordRoute
{
FieldName fieldName (RECORD_ROUTE_E),
RouteBody_List routeBody
}
// [20.31]
type record ReplyTo
{
FieldName fieldName (REPLY_TO_E),
Addr_Union addressField,
SemicolonParam_List replyToParams optional
}
// [20.32]
type record Require
{
FieldName fieldName (REQUIRE_E),
OptionTag_List optionsTags
}
// [20.33]
type record RetryAfter
{
FieldName fieldName (RETRY_AFTER_E),
DeltaSec deltaSec,
charstring comment optional,
SemicolonParam_List retryParams optional
}
// [20.34]
type record Route
{
FieldName fieldName (ROUTE_E),
RouteBody_List routeBody
}
// [20.35 RFC2616 14.38]
type record Server
{
FieldName fieldName (SERVER_E),
ServerVal_List serverBody
}
// [20.36]
type record Subject
{
FieldName fieldName (SUBJECT_E),
charstring summary
}
// [20.37]
type record Supported
{
FieldName fieldName (SUPPORTED_E),
OptionTag_List optionsTags optional
}
// [20.38]
type record Timestamp
{
FieldName fieldName (TIMESTAMP_E),
TimeValue timeValue optional,
TimeValue delay optional
}
// [20.39]
type record To
{
FieldName fieldName (TO_E),
Addr_Union addressField,
SemicolonParam_List toParams optional
}
// [20.40]
type record Unsupported
{
FieldName fieldName (UNSUPPORTED_E),
OptionTag_List optionsTags
}
// Undefined header field
type record UndefinedHeader
{
charstring headerName,
charstring headerValue
}
type set of UndefinedHeader UndefinedHeader_List;
// [20.41 RFC2616 14.43]
type record UserAgent
{
FieldName fieldName (USER_AGENT_E),
ServerVal_List userAgentBody
}
// [20.42]
type record Via
{
FieldName fieldName (VIA_E),
ViaBody_List viaBody
}
// [20.43]
type record Warning
{
FieldName fieldName (WARNING_E),
WarningValue_List warningValue
}
// [20.44 RFC2616 14.47 RFC2617 1.2]
type record WwwAuthenticate
{
FieldName fieldName (WWW_AUTHENTICATE_E),
Challenge challenge
}
}//end group CommonHeaderFieldTypes
group RFC3262HeaderFieldTypes
{
// [3262/7.1]
type record RSeq {
FieldName fieldName(RSEQ_E),
integer responseNum
}
 
// [3262/7.2]
type record RAck {
FieldName fieldName(RACK_E),
integer responseNum,
integer seqNumber,
charstring method
}
}//end group RFC3262HeaderFieldTypes
// [20.7, 20.27, 20.28, 20.44 ; RFC2616 14.33, 14.47; RFC2617 1.2 ]
type record OtherAuth {
charstring authScheme,
CommaParam_List authParams
}
 
group RFC3265HeaderFieldTypes
{
// [3265/7.2]
type record AllowEvents {
FieldName fieldName(ALLOW_EVENTS_E),
EventType_List eventTypes
}
type record Payload {
integer payloadlength,
charstring payloadvalue
}
 
type set of EventType EventType_List;
type charstring EventType;
// [20.30,20.34 ]
type record RouteBody {
NameAddr nameAddr,
SemicolonParam_List rrParam optional
}
 
// [3265/7.2]
type record Event {
FieldName fieldName(EVENT_E),
EventType eventType,
SemicolonParam_List eventParams optional
}
// [20.30,20.34 ]
type record of RouteBody RouteBody_List;
 
// [3265/7.2]
type record SubscriptionState {
FieldName fieldName(SUBSCRIPTION_STATE_E),
SubState subState,
SemicolonParam_List substateParams optional
}
// [20.42 ]
type record SentProtocol {
charstring protocolName,
charstring protocolVersion,
charstring transport
}
 
type charstring SubState;
}//end group RFC3265HeaderFieldTypes
// [20.35, 20.41; RFC2616 14.43 ]
type charstring ServerVal;
 
group RFC3313HeaderFieldTypes
{
// [3313/5]
type record PMediaAuthorization {
FieldName fieldName(P_MEDIA_AUTHORIZATION_E),
PMediaAuthorization_List pMediaAuthorizations
}
// [20.35, 20.41; RFC2616 14.43 ]
type set of ServerVal ServerVal_List;
 
type charstring PMediaAuthValue; //HEXDIG "0"-"9", "A"-"F"
// [20.38 ]
type record TimeValue {
integer majorDigit,
// represented as an integer
integer minorDigit
optional // represented as an integer
}
 
type record of PMediaAuthValue PMediaAuthorization_List;
// [20.42 ]
type record ViaBody {
SentProtocol sentProtocol,
HostPort sentBy,
SemicolonParam_List viaParams optional
}
 
}//end group RFC3265HeaderFieldTypes
// [20.42 ]
type record of ViaBody ViaBody_List;
 
group RFC3323HeaderFieldTypes
{
// [3323]
type record Privacy {
FieldName fieldName(PRIVACY_E),
PrivacyValue_List privValueList
}
}//end group RFC3323HeaderFieldTypes
// [20.43 ]
type union WarnAgent {
HostPort hostPort,
charstring pseudonym
}
 
group RFC3325HeaderFieldTypes
{
// [3325]
type record PAssertedID {
FieldName fieldName(P_ASSERTED_ID_E),
PAssertedIDValue_List pAssertedIDValueList
}
// [20.43 ]
type record WarningValue {
integer warnCode,
// represented as an integer
WarnAgent warnAgent,
charstring warnText
}
 
// [3325]
type record PPreferredID {
FieldName fieldName(P_PREFERRED_ID_E),
PPreferredIDValue_List pPreferredIDValueList
}
// draft-drage-sipping-service-identification-01 (July 2007)
type record PPreferredService {
FieldName fieldName (P_PREFERRED_SERVICE_E),
charstring serviceId
}
// [20.43 ]
type set of WarningValue WarningValue_List;
 
}//end group RFC3325HeaderFieldTypes
type Addr_Union PAssertedIDValue;
 
group RFC3326HeaderFieldTypes
{
//[3326]
type record of ReasonValue ReasonValues;
type record of PAssertedIDValue PAssertedIDValue_List;
 
type record ReasonValue {
charstring token,
SemicolonParam_List reasonParams optional
}
type charstring PAssertedServiceValue;
 
type record Reason {
FieldName fieldName(REASON_E),
ReasonValues reasonValues
}
}//end group RFC3326HeaderFieldTypes
type Addr_Union PPreferredIDValue;
 
group RFC3327HeaderFieldTypes
{
// [3327]
type record Path {
FieldName fieldName(PATH_E),
PathValues pathValues
}
type record of PPreferredIDValue PPreferredIDValue_List;
 
type record of PathValue PathValues;
type charstring PrivacyValue;
 
type record PathValue {
NameAddr nameAddr,
SemicolonParam_List rrParam optional
}
}//end group RFC3515HeaderFieldTypes
type record of PrivacyValue PrivacyValue_List;
 
type set of FcValue FcValue_List;
type record FcValue {
charstring wildcard(c_WILDCARD),
SemicolonParam_List fcParams optional
}
 
group RFC4488HeaderFieldTypes
{
// [4488]
type record ReferSub {
FieldName fieldName(REFER_SUB_E),
boolean referSubValue,
SemicolonParam_List referSubParams optional
}
}//end group RFC4488HeaderFieldTypes
 
group RFC3329HeaderFieldTypes
{
// [RFC3329/2.2]
type record SecurityMechanism {
charstring mechName,
SemicolonParam_List mechParams optional
}
} // end group TokensType
 
type set of SecurityMechanism SecurityMechanism_List;
 
type record SecurityClient {
FieldName fieldName(SECURITY_CLIENT_E),
SecurityMechanism_List securityMech
}
group HeaderFieldTypes // Header Fields
{
group CommonHeaderFieldTypes {
// [20.1, RFC2616 14.1 ]
type record Accept {
FieldName fieldName (ACCEPT_E) ,
AcceptBody_List acceptArgs optional
}
 
type record SecurityServer {
FieldName fieldName(SECURITY_SERVER_E),
SecurityMechanism_List securityMech
}
// [20.2, RFC2616 14.3 ]
type record AcceptEncoding {
FieldName fieldName (ACCEPT_ENCODING_E) ,
ContentCoding_List contentCoding optional
}
 
type record SecurityVerify {
FieldName fieldName(SECURITY_VERIFY_E),
SecurityMechanism_List securityMech
}
}//end group RFC3329HeaderFieldTypes
// [20.3, RFC2616 14.4 ]
type record AcceptLanguage {
FieldName fieldName (ACCEPT_LANGUAGE_E) ,
LanguageBody_List languageBody optional
}
 
group RFC3455HeaderFieldTypes
{
type record of NameAddrParam NameAddrParam_List;
// [20.4 ]
type record AlertInfo {
FieldName fieldName (ALERT_INFO_E) ,
AlertInfoBody_List alertInfoBody optional
}
 
type record NameAddrParam {
NameAddr nameAddr,
SemicolonParam_List genericParams optional
}
//[3455/5.1]
type record PAssociatedURI {
FieldName fieldName(P_ASSOCIATED_URI_E),
NameAddrParam_List nameAddrList
}
//[3455/5.2]
type record PCalledPartyID {
FieldName fieldName(P_CALLED_PARTY_E),
NameAddrParam nameAddParams
}
// [20.5 ]
type record Allow {
FieldName fieldName (ALLOW_E) ,
Method_List methods optional
}
 
type record of VnetworkSpec VnetworkSpec_List;
// [20.6 ]
type record AuthenticationInfo {
FieldName fieldName (AUTHENTICATION_INFO_E) ,
CommaParam_List ainfo
}
 
type record VnetworkSpec {
charstring vNetworkSpecToken,
SemicolonParam_List genericParams optional
}
// [20.7 RFC2617 3.2.2 ]
type record Authorization {
FieldName fieldName (AUTHORIZATION_E) ,
CredentialsList
body // changed from Credentials to allow multiple Authorization headers
}
 
//[3455/5.3]
type record PVisitedNetworkID {
FieldName fieldName(P_VISITED_NETWORK_E),
VnetworkSpec_List vNetWorkSpec
}
// [20.8 ]
type record CallId {
FieldName fieldName (CALL_ID_E) ,
CallidString callid
}
 
//[3455/5.4]
type record PAccessNetworkInfo {
FieldName fieldName(P_ACCESS_NETWORK_INFO_E),
charstring accessType,
SemicolonParam_List genericParams optional
}
// [20.9 ]
type record CallInfo {
FieldName fieldName (CALL_INFO_E) ,
CallInfoBody_List callInfoBody optional
}
 
//[3455/5.5]
type record PChargingFunctionAddresses {
FieldName fieldName(P_CHARGING_FUNCTION_ADDRESSES_E),
SemicolonParam_List chargeAddrParams optional
}
// [20.10 ]
type record Contact {
FieldName fieldName (CONTACT_E) ,
ContactBody contactBody
}
 
//[3455/5.6]
type record PChargingVector {
FieldName fieldName(P_CHARGING_VECTOR_E),
SemicolonParam_List chargeParams optional
}
}//end group RFC33455HeaderFieldTypes
// [20.11 ]
type record ContentDisposition {
FieldName fieldName (CONTENT_DISPOSITION_E) ,
charstring dispositionType,
SemicolonParam_List dispositionParams optional
}
 
group RFC3515HeaderFieldTypes
{
// [3515]
type record ReferTo {
FieldName fieldName(REFER_TO_E),
NameAddr nameAddr,
SemicolonParam_List referToParams optional
}
}//end group RFC3515HeaderFieldTypes
// [20.12 RFC2616 14.11 ]
type record ContentEncoding {
FieldName fieldName (CONTENT_ENCODING_E) ,
ContentCoding_List contentCoding
}
 
group RFC3608HeaderFieldTypes
{
// [3608]
type record ServiceRoute {
FieldName fieldName(SERVICE_ROUTE_E),
RouteBody_List routeBody
}
}//end group RFC33608HeaderFieldTypes
// [20.13 RFC2616 14.12 ]
type record ContentLanguage {
FieldName fieldName (CONTENT_LANGUAGE_E) ,
LanguageTag_List languageTag
}
 
// [20.14 ]
type record ContentLength {
FieldName fieldName (CONTENT_LENGTH_E) ,
integer
len // this field is represented as an integer
}
 
group RFC3841HeaderFieldTypes
{
// [3841]
type record AcceptContact {
FieldName fieldName(ACCEPT_CONTACT_E),
AcRcValue_List acValues
}
// [20.15 ]
type record ContentType {
FieldName fieldName (CONTENT_TYPE_E) ,
charstring mediaType
}
 
type set of AcRcValue AcRcValue_List;
// [20.16 ]
type record CSeq {
FieldName fieldName (CSEQ_E) ,
integer seqNumber,
// this field is represented as an integer
charstring method
}
 
type record AcRcValue {
charstring wildcard(c_WILDCARD),
SemicolonParam_List acRcParams optional
}
// [RFC 3841]
type charstring Directive;
type set of Directive Directive_List;
type record RequestDisposition {
FieldName fieldName (REQUEST_DISPOSITION_E),
Directive_List directives
}
// [20.17 ]
type record Date {
FieldName fieldName (DATE_E) ,
charstring sipDate
}
 
}// end group RFC3841HeaderFieldTypes
// [20.18 ]
type record ErrorInfo {
FieldName fieldName (ERROR_INFO_E) ,
ErrorInfoBody_List errorInfo optional
}
 
group RFC3891HeaderFieldTypes
{
// [3891]
type record Replaces
{
FieldName fieldName (REPLACES_E),
SemicolonParam_List replacesParams
}
}// end group RFC3891HeaderFieldTypes
group RFC3892HeaderFieldTypes
{
// [3892]
type record ReferredBy {
FieldName fieldName(REFERRED_BY_E),
NameAddr nameAddr,
SemicolonParam_List referredbyIdParams optional
}
}//end group RFC3892HeaderFieldTypes
// [20.19 ]
type record Expires {
FieldName fieldName (EXPIRES_E) ,
DeltaSec deltaSec
}
 
group RFC4028HeaderFieldTypes
{
// [4028]
type record MinSE {
FieldName fieldName(MIN_SE_E),
DeltaSec deltaSec,
SemicolonParam_List minSeParam optional
}
// [4028]
type record SessionExpires {
FieldName fieldName(SESSION_EXPIRES_E),
DeltaSec deltaSec,
SemicolonParam_List seParam optional
}
}//end group RFC4028HeaderFieldTypes
//[6809]
type record FeatureCaps {
FieldName fieldName(FEATURE_CAPS_E),
FcValue_List fcValues
}
 
group RFC4244HeaderFieldTypes
{
// [4244]
type record HistoryInfo {
FieldName fieldName(HISTORY_INFO_E),
HistoryInfo_List historyInfoList
}
// [20.20 ]
type record From {
FieldName fieldName (FROM_E) ,
Addr_Union addressField,
SemicolonParam_List fromParams optional
}
 
type record of HistoryInfoEntry HistoryInfo_List;
// [20.21 ]
type record InReplyTo {
FieldName fieldName (IN_REPLY_TO_E) ,
CallidString_List callids
}
 
// [20.22 ]
type record MaxForwards {
FieldName fieldName (MAX_FORWARDS_E) ,
integer
forwards // this field is represented as an integer
}
 
type record of charstring StringList;
// [20.23 ]
type record MinExpires {
FieldName fieldName (MIN_EXPIRES_E) ,
DeltaSec deltaSec
}
 
type record HistoryInfoEntry {
NameAddr nameAddr,
StringList hiIndex optional,
SemicolonParam_List hiExtention optional
}
}//end group RFC4244HeaderFieldTypes
// [20.24 RFC2616 19.4.1 ]
type record MimeVersion {
FieldName fieldName (MIME_VERSION_E) ,
integer majorNumber,
// this field is represented as an integer
integer
minorNumber // this field is represented as an integer
}
 
group RFC5009PEarlyMediaHeader
{
// [5009]
type record PEarlyMedia {
FieldName fieldName(P_EARLY_MEDIA_E),
EM_List em_param
}
type record of charstring EM_List;
}//end group RFC5009PEarlyMediaHeader
// [20.25 ]
type record Organization {
FieldName fieldName (ORGANIZATION_E) ,
charstring organization
}
 
//http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07, expires 16.Aug.2009
//Transporting User to User Call Control Information in SIP for ISDN Interworking
//type definition of SIP header mechanism
group UserToUser_PreliminaryRFCDraft
{
type record UserToUser{
FieldName fieldName (USER_TO_USER_E),
charstring uuiData length(256), /*length limitation due to ISDN, max of allowed 128 hex digits are represented by 256 characters*/
GenericParam uuiParam
}
// [20.26 ]
type record Priority {
FieldName fieldName (PRIORITY_E) ,
charstring priorityValue
}
 
}//end group UserToUser_PreliminaryRFCDraft
// [20.27 RFC2616 14.33 RFC2617 1.2 ]
type record ProxyAuthenticate {
FieldName fieldName (PROXY_AUTHENTICATE_E) ,
Challenge challenge
}
 
type record PAssertedService {
FieldName fieldName(P_ASSERTED_SERVICE_E),
PAssertedServiceValue pAssertedServiceValue
}
// [20.28 RFC2616 14.35 RFC2617 1.2 ]
type record ProxyAuthorization {
FieldName fieldName (PROXY_AUTHORIZATION_E) ,
CredentialsList
credentials // changed from Credentials to allow multiple Authorization headers
}
 
group RFC6442GeolocationConveyance
{ /* @sic R5-133151 update of header fields sic@ */
// [6442]
type record Geolocation { // RFC6442 clause 4.1
FieldName fieldName(GEOLOCATION_E),
SipUrl addrSpec,
SemicolonParam_List geolocParam optional
}
type enumerated GeolocationRoutingState
{GEOLOCATION_ROUTING_YES_E,
GEOLOCATION_ROUTING_NO_E,
GEOLOCATION_ROUTING_OTHER_E
};
type record GeolocationRouting { // RFC6442 clause 4.2
FieldName fieldName(GEOLOCATION_ROUTING_E),
GeolocationRoutingState state,
GenericParam genericValue optional
}
}//end group RFC6442GeolocationConveyance
// [20.29 ]
type record ProxyRequire {
FieldName fieldName (PROXY_REQUIRE_E) ,
OptionTag_List optionsTags
}
 
type charstring SessIdString length(32);
// [20.30 ]
type record RecordRoute {
FieldName fieldName (RECORD_ROUTE_E) ,
RouteBody_List routeBody
}
 
type record SessionId {
FieldName fieldName (SESSION_ID_E),
SessIdString sessid,
GenericParam sessidParam optional
}
// [20.31 ]
type record ReplyTo {
FieldName fieldName (REPLY_TO_E) ,
Addr_Union addressField,
SemicolonParam_List replyToParams optional
}
 
type charstring EntityTag;
// [20.32 ]
type record Require {
FieldName fieldName (REQUIRE_E) ,
OptionTag_List optionsTags
}
 
type record SIP_ETag {
FieldName fieldName (SIP_ETAG_E),
EntityTag entityTag
}
// [20.33 ]
type record RetryAfter {
FieldName fieldName (RETRY_AFTER_E) ,
DeltaSec deltaSec,
charstring comment optional,
SemicolonParam_List retryParams optional
}
 
type record SIP_If_Match {
FieldName fieldName (SIP_IF_MATCH_E),
EntityTag entityTag
}
// [20.34 ]
type record Route {
FieldName fieldName (ROUTE_E) ,
RouteBody_List routeBody
}
 
} // end group HeaderFieldTypes
group MessageHeaderTypes
{
// Message-Header for all SIP requests and responses [20]
type set MessageHeader
{
Accept accept optional,
AcceptContact acceptContact optional,
AcceptEncoding acceptEncoding optional,
AcceptLanguage acceptLanguage optional,
AlertInfo alertInfo optional,
Allow allow optional,
AllowEvents allowEvents optional, // 3265/7.2
AuthenticationInfo authenticationInfo optional, // only in responses
Authorization authorization optional, // only in requests
CallId callId optional, // optional only in Invalid test cases mandatory otherwise
CallInfo callInfo optional,
Contact contact optional, // optional in response and all requests except INVITE where mandatory
ContentDisposition contentDisposition optional,
ContentEncoding contentEncoding optional,
ContentLanguage contentLanguage optional,
ContentLength contentLength optional, // optional in responses and all requests except ACK where mandatory
ContentType contentType optional,
CSeq cSeq optional, // optional only in Invalid test cases mandatory otherwise
Date date optional,
ErrorInfo errorInfo optional, // only in responses
Event event optional, // 3265/7.2
Expires expires optional,
From fromField,
Geolocation geolocation optional, // 6442
GeolocationRouting geolocationRouting optional, // 6442 @sic R5-133151 update of header fields sic@
HistoryInfo historyInfo optional, // 4244
InReplyTo inReplyTo optional, // only in requests
MaxForwards maxForwards optional, // mandatory in requests not required in responses!
MimeVersion mimeVersion optional,
MinExpires minExpires optional, // only in responses
MinSE minSE optional, // 4028
Organization organization optional,
PAccessNetworkInfo pAccessNetworkInfo optional, // 3455
PAssertedID pAssertedID optional, // 3325
PAssertedService pAssertedService optional,
PAssociatedURI pAssociatedURI optional, // 3455
Path path optional, // 3327
PCalledPartyID pCalledPartyID optional, // 3455
PChargingFunctionAddresses pChargingFunctionAddresses optional, // 3455
PChargingVector pChargingVector optional, // 3455
PEarlyMedia pEarlyMedia optional, // 5009
PMediaAuthorization pMediaAuthorization optional, // 3313
PPreferredID pPreferredID optional, // 3325
PPreferredService pPreferredService optional, // draft-drage-sipping-service-identification-01 (July 2007)
Priority priority optional, // only in requests
Privacy privacy optional, // 3323
ProxyAuthenticate proxyAuthenticate optional, // only in responses
ProxyAuthorization proxyAuthorization optional, // only in requests
ProxyRequire proxyRequire optional, // only in requests
PVisitedNetworkID pVisitedNetworkID optional, // 3455
RAck rAck optional, // 3262/7.1
RSeq rSeq optional, // 3262/7.1
Reason reason optional, // 3326
RecordRoute recordRoute optional,
RequestDisposition requestDisposition optional, // 3841
ReferredBy referredBy optional, // 3892 - REFER method
ReferTo referTo optional, // 3515 - REFER method
ReferSub referSub optional, // 4488 - REFER method
Replaces replaces optional, // 3891
ReplyTo replyTo optional, // optional in responses and INVITE requests
Require require optional,
RetryAfter retryAfter optional, // only in responses
Route route optional, // only in requests
SecurityClient securityClient optional, // 3329
SecurityServer securityServer optional, // 3329
SecurityVerify securityVerify optional, // 3329
Server server optional, // only in responses
ServiceRoute serviceRoute optional, // 3608
SessionExpires sessionExpires optional, // 4028
SessionId sessionId optional,
SIP_ETag sipETag optional,
SIP_If_Match sipIfMatch optional,
Subject subject optional, // only in requests
SubscriptionState subscriptionState optional, // 3265/7.2
Supported supported optional,
Timestamp timestamp optional,
To toField,
Unsupported unsupported optional, // only in responses
UserToUser userToUser optional,
UserAgent userAgent optional,
Via via,
Warning warning optional, // only in responses
WwwAuthenticate wwwAuthenticate optional, // only in responses
UndefinedHeader_List undefinedHeader_List optional
}
} // end group MessageHeaderTypes
group StartLineTypes
{
// Request-Line [7.1]
type record RequestLine
{
Method method,
SipUrl requestUri,
charstring sipVersion
}
// Status-Line [7.2]
type record StatusLine
{
charstring sipVersion,
integer statusCode,
charstring reasonPhrase
}
} // end group StartLineTypes
group otherTypes{
type record SipUserProfile
{
/** @desc integer for the userprofile identifier
*/
integer id,
// [20.35 RFC2616 14.38 ]
type record Server {
FieldName fieldName (SERVER_E) ,
ServerVal_List serverBody
}
 
/** @desc integer for Port number to exchange SIP messages
*/
integer currPort,
// [20.36 ]
type record Subject {
FieldName fieldName (SUBJECT_E) ,
charstring summary
}
 
/** @desc charstring for IP address to exchange SIP messages
*/
charstring currIpaddr,
// [20.37 ]
type record Supported {
FieldName fieldName (SUPPORTED_E) ,
OptionTag_List optionsTags optional
}
 
/** @desc integer for Port number to exchange SIP messages
*/
integer contactPort,
// [20.38 ]
type record Timestamp {
FieldName fieldName (TIMESTAMP_E) ,
TimeValue timeValue optional,
TimeValue delay optional
}
 
/** @desc charstring for IP address to exchange SIP messages
*/
charstring contactIpaddr,
// [20.39 ]
type record To {
FieldName fieldName (TO_E) ,
Addr_Union addressField,
SemicolonParam_List toParams optional
}
 
/** @desc charstring for IP address used by the TS to exchange media streams
*/
charstring bearerIpaddr,
// [20.40 ]
type record Unsupported {
FieldName fieldName (UNSUPPORTED_E) ,
OptionTag_List optionsTags
}
 
/** @desc charstring for identity of the tester local domain
*/
charstring homeDomain,
// Undefined header field
type record UndefinedHeader {
charstring headerName,
charstring headerValue
}
 
/** @desc charstring for identity of the tester local user
*/
charstring publUsername,
type set of UndefinedHeader UndefinedHeader_List;
 
/** @desc charstring for RFC 2617 3.2.1 qop options:
* Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
* value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
*/
charstring qop,
// [20.41 RFC2616 14.43 ]
type record UserAgent {
FieldName fieldName (USER_AGENT_E) ,
ServerVal_List userAgentBody
}
 
/** @desc charstring for RFC 2617 3.2.2 username for authentication
* The name of user in the specified realm
*/
charstring privUsername,
// [20.42 ]
type record Via {
FieldName fieldName (VIA_E) ,
ViaBody_List viaBody
}
 
/** @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
*/
charstring passwd,
// [20.43 ]
type record Warning {
FieldName fieldName (WARNING_E) ,
WarningValue_List warningValue
}
 
/** @desc charstring for registrar domain for authentication and request line
*/
charstring registrarDomain
// [20.44 RFC2616 14.47 RFC2617 1.2 ]
type record WwwAuthenticate {
FieldName fieldName (WWW_AUTHENTICATE_E) ,
Challenge challenge
}
 
}
} // end group otherTypes
}// end group Subtypes
} // end group CommonHeaderFieldTypes
group RFC3262HeaderFieldTypes {
// [3262/7.1 ]
type record RSeq {
FieldName fieldName (RSEQ_E) ,
integer responseNum
}
 
// [3262/7.2 ]
type record RAck {
FieldName fieldName (RACK_E) ,
integer responseNum,
integer seqNumber,
charstring method
}
 
group MSGtypes{
group RequestTypes
{
// [7.1]
} // end group RFC3262HeaderFieldTypes
 
/**
*
* @desc generic type of a SIP request message
* @member statusLine contains a method name, a Request-URI, and the protocol version
* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
* @member messageBody depends on the request method, includes e.g. SDP message.
* @member payload contains the whole message as it has been received in its text format
*/
type record Request
{
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
// Note: the introduction of the following specific types is to enable better means for logging
// on the other side the generic type is useful for functions dealing with multiple SIP message types
type record REGISTER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
group RFC3265HeaderFieldTypes {
// [3265/7.2 ]
type record AllowEvents {
FieldName fieldName (ALLOW_EVENTS_E) ,
EventType_List eventTypes
}
 
type record INVITE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
type set of EventType EventType_List;
type charstring EventType;
 
type record OPTIONS_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
// [3265/7.2 ]
type record Event {
FieldName fieldName (EVENT_E) ,
EventType eventType,
SemicolonParam_List eventParams optional
}
 
type record BYE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
// [3265/7.2 ]
type record SubscriptionState {
FieldName fieldName (SUBSCRIPTION_STATE_E) ,
SubState subState,
SemicolonParam_List substateParams optional
}
 
type record CANCEL_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
type charstring SubState;
 
type record ACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
} // end group RFC3265HeaderFieldTypes
 
// [3262/7.1]
type record PRACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
group RFC3313HeaderFieldTypes {
// [3313/5 ]
type record PMediaAuthorization {
FieldName fieldName (P_MEDIA_AUTHORIZATION_E) ,
PMediaAuthorization_List pMediaAuthorizations
}
 
// [3265/7.1]
type record NOTIFY_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
type charstring PMediaAuthValue;
// HEXDIG "0"-"9", "A"-"F"
type record of PMediaAuthValue PMediaAuthorization_List;
 
// [3265/7.1]
type record SUBSCRIBE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
 
// [3903/11.1]
type record PUBLISH_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
} // end group RFC3265HeaderFieldTypes
 
// [3311/7]
type record UPDATE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
group RFC3323HeaderFieldTypes {
// [3323 ]
type record Privacy {
FieldName fieldName (PRIVACY_E) ,
PrivacyValue_List privValueList
}
 
//
type record REFER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
} // end group RFC3323HeaderFieldTypes
 
//
type record MESSAGE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
group RFC3325HeaderFieldTypes {
// [3325 ]
type record PAssertedID {
FieldName fieldName (P_ASSERTED_ID_E) ,
PAssertedIDValue_List pAssertedIDValueList
}
 
//
type record INFO_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
// [3325 ]
type record PPreferredID {
FieldName fieldName (P_PREFERRED_ID_E) ,
PPreferredIDValue_List pPreferredIDValueList
}
// draft-drage-sipping-service-identification-01 (July 2007)
type record PPreferredService {
FieldName fieldName (P_PREFERRED_SERVICE_E) ,
charstring serviceId
}
 
type union RequestUnion {
REGISTER_Request Register,
INVITE_Request Invite,
OPTIONS_Request Options,
BYE_Request Bye,
CANCEL_Request Cancel,
ACK_Request Ack,
PRACK_Request Prack,
NOTIFY_Request Notify,
SUBSCRIBE_Request Subscribe,
PUBLISH_Request Publish,
UPDATE_Request Update,
REFER_Request Refer,
MESSAGE_Request Message
} with { encode "SIPCodec"}
 
} //with { encode "SIPCodec" }// end group RequestTypes
group ResponseTypes
{
// [7.2]
} // end group RFC3325HeaderFieldTypes
 
/**
*
* @desc generic type of a SIP response message
* @member statusLine consists of the protocol version followed by a numeric Status-Code and its associated textual phrase
* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
* @member messageBody depends on the response method, includes e.g. SDP message.
* @member payload contains the whole message as it has been received in its text format
*/
type record Response
{
StatusLine statusLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
group RFC3326HeaderFieldTypes {
// [3326 ]
type record of ReasonValue ReasonValues;
 
} //with { encode "SIPCodec" }// end group ResponseTypes
// This MSG type is defined for sending synctactic variations, ans syntactically
// erroneous messages, and receving messages failed parsing.
group SyntacticTypes
{
type charstring Raw;
} // end group SyntacticTypes
// This type is defined for particular SIP message body types like SDP
type record ReasonValue {
charstring token,
SemicolonParam_List reasonParams optional
}
 
}// end group MSGTypes
}// end group Types
type record Reason {
FieldName fieldName (REASON_E) ,
ReasonValues reasonValues
}
 
} with {encode "LibSip V2"} // end module LibSip_TypesAndValues
} // end group RFC3326HeaderFieldTypes
 
group RFC3327HeaderFieldTypes {
// [3327 ]
type record Path {
FieldName fieldName (PATH_E) ,
PathValues pathValues
}
 
type record of PathValue PathValues;
 
type record PathValue {
NameAddr nameAddr,
SemicolonParam_List rrParam optional
}
 
} // end group RFC3515HeaderFieldTypes
 
 
group RFC4488HeaderFieldTypes {
// [4488 ]
type record ReferSub {
FieldName fieldName (REFER_SUB_E) ,
boolean referSubValue,
SemicolonParam_List referSubParams optional
}
 
} // end group RFC4488HeaderFieldTypes
 
group RFC3329HeaderFieldTypes {
// [RFC3329/2.2 ]
type record SecurityMechanism {
charstring mechName,
SemicolonParam_List mechParams optional
}
 
type set of SecurityMechanism SecurityMechanism_List;
 
type record SecurityClient {
FieldName fieldName (SECURITY_CLIENT_E) ,
SecurityMechanism_List securityMech
}
 
type record SecurityServer {
FieldName fieldName (SECURITY_SERVER_E) ,
SecurityMechanism_List securityMech
}
 
type record SecurityVerify {
FieldName fieldName (SECURITY_VERIFY_E) ,
SecurityMechanism_List securityMech
}
 
} // end group RFC3329HeaderFieldTypes
 
group RFC3455HeaderFieldTypes {
type record of NameAddrParam NameAddrParam_List;
 
type record NameAddrParam {
NameAddr nameAddr,
SemicolonParam_List genericParams optional
}
// [3455/5.1 ]
type record PAssociatedURI {
FieldName fieldName (P_ASSOCIATED_URI_E) ,
NameAddrParam_List nameAddrList
}
// [3455/5.2 ]
type record PCalledPartyID {
FieldName fieldName (P_CALLED_PARTY_E) ,
NameAddrParam nameAddParams
}
 
type record of VnetworkSpec VnetworkSpec_List;
 
type record VnetworkSpec {
charstring vNetworkSpecToken,
SemicolonParam_List genericParams optional
}
 
// [3455/5.3 ]
type record PVisitedNetworkID {
FieldName fieldName (P_VISITED_NETWORK_E) ,
VnetworkSpec_List vNetWorkSpec
}
 
// [3455/5.4 ]
type record PAccessNetworkInfo {
FieldName fieldName (P_ACCESS_NETWORK_INFO_E) ,
charstring accessType,
SemicolonParam_List genericParams optional
}
 
// [3455/5.5 ]
type record PChargingFunctionAddresses {
FieldName fieldName (P_CHARGING_FUNCTION_ADDRESSES_E) ,
SemicolonParam_List chargeAddrParams optional
}
 
// [3455/5.6 ]
type record PChargingVector {
FieldName fieldName (P_CHARGING_VECTOR_E) ,
charstring icidValue,
SemicolonParam_List chargeParams optional
}
 
} // end group RFC33455HeaderFieldTypes
 
group RFC3515HeaderFieldTypes {
// [3515 ]
type record ReferTo {
FieldName fieldName (REFER_TO_E) ,
NameAddr nameAddr,
SemicolonParam_List referToParams optional
}
 
} // end group RFC3515HeaderFieldTypes
 
group RFC3608HeaderFieldTypes {
// [3608 ]
type record ServiceRoute {
FieldName fieldName (SERVICE_ROUTE_E) ,
RouteBody_List routeBody
}
 
} // end group RFC33608HeaderFieldTypes
 
 
group RFC3841HeaderFieldTypes {
// [3841 ]
type record AcceptContact {
FieldName fieldName (ACCEPT_CONTACT_E) ,
AcRcValue_List acValues
}
 
type set of AcRcValue AcRcValue_List;
 
type record AcRcValue {
charstring wildcard (c_WILDCARD) ,
SemicolonParam_List acRcParams optional
}
// [RFC 3841 ]
type charstring Directive;
type set of Directive Directive_List;
type record RequestDisposition {
FieldName fieldName (REQUEST_DISPOSITION_E) ,
Directive_List directives
}
 
 
} // end group RFC3841HeaderFieldTypes
 
group RFC3891HeaderFieldTypes {
// [3891 ]
type record Replaces {
FieldName fieldName (REPLACES_E) ,
CallidString callid,
SemicolonParam_List replacesParams optional
}
 
} // end group RFC3891HeaderFieldTypes
 
group RFC3892HeaderFieldTypes {
// [3892 ]
type record ReferredBy {
FieldName fieldName (REFERRED_BY_E) ,
NameAddr nameAddr,
SemicolonParam_List referredbyIdParams optional
}
 
} // end group RFC3892HeaderFieldTypes
 
group RFC4028HeaderFieldTypes {
// [4028 ]
type record MinSE {
FieldName fieldName (MIN_SE_E) ,
DeltaSec deltaSec,
SemicolonParam_List minSeParam optional
}
// [4028 ]
type record SessionExpires {
FieldName fieldName (SESSION_EXPIRES_E) ,
DeltaSec deltaSec,
SemicolonParam_List seParam optional
}
 
} // end group RFC4028HeaderFieldTypes
 
group RFC4244HeaderFieldTypes {
// [4244 ]
type record HistoryInfo {
FieldName fieldName (HISTORY_INFO_E) ,
HistoryInfo_List historyInfoList
}
 
type record of HistoryInfoEntry HistoryInfo_List;
 
type record of integer IntegerList;
 
type record HistoryInfoEntry {
NameAddr nameAddr,
IntegerList hiIndex optional,
SemicolonParam_List hiExtention optional
}
 
type record of charstring StringList;
 
} // end group RFC4244HeaderFieldTypes
 
group RFC5009PEarlyMediaHeader {
// [5009 ]
type record PEarlyMedia {
FieldName fieldName (P_EARLY_MEDIA_E) ,
EM_List em_param
}
type record of charstring EM_List;
 
} // end group RFC5009PEarlyMediaHeader
 
// http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07, expires 16.Aug.2009
// Transporting User to User Call Control Information in SIP for ISDN Interworking
// type definition of SIP header mechanism
group UserToUser_PreliminaryRFCDraft {
type record UserToUser {
FieldName fieldName (USER_TO_USER_E) ,
charstring uuiData length(256),
/*length limitation due to ISDN, max of allowed 128 hex digits are represented by 256 characters*/
GenericParam uuiParam
}
 
 
} // end group UserToUser_PreliminaryRFCDraft
 
type record PAssertedService {
FieldName fieldName (P_ASSERTED_SERVICE_E) ,
PAssertedServiceValue pAssertedServiceValue
}
 
group RFC6442GeolocationConveyance {
/* @sic R5-133151 update of header fields sic@ */
// [6442 ]
type record Geolocation {
// RFC6442 clause 4.1
FieldName fieldName (GEOLOCATION_E) ,
SipUrl addrSpec,
SemicolonParam_List geolocParam optional
}
type enumerated GeolocationRoutingState {
GEOLOCATION_ROUTING_YES_E, GEOLOCATION_ROUTING_NO_E, GEOLOCATION_ROUTING_OTHER_E
}
type record GeolocationRouting {
// RFC6442 clause 4.2
FieldName fieldName (GEOLOCATION_ROUTING_E) ,
GeolocationRoutingState state,
GenericParam genericValue optional
}
 
} // end group RFC6442GeolocationConveyance
 
type charstring SessIdString length(32);
 
type record SessionId {
FieldName fieldName (SESSION_ID_E) ,
SessIdString sessid,
GenericParam sessidParam optional
}
 
type charstring EntityTag;
 
type record SIP_ETag {
FieldName fieldName (SIP_ETAG_E) ,
EntityTag entityTag
}
 
type record SIP_If_Match {
FieldName fieldName (SIP_IF_MATCH_E) ,
EntityTag entityTag
}
 
 
} // end group HeaderFieldTypes
 
group MessageHeaderTypes {
 
// Message-Header for all SIP requests and responses [20 ]
type set MessageHeader {
Accept accept optional,
AcceptContact acceptContact optional,
AcceptEncoding acceptEncoding optional,
AcceptLanguage acceptLanguage optional,
AlertInfo alertInfo optional,
Allow allow optional,
AllowEvents allowEvents optional,
// 3265/7.2
AuthenticationInfo authenticationInfo optional,
// only in responses
Authorization authorization optional,
// only in requests
CallId callId optional,
// optional only in Invalid test cases mandatory otherwise
CallInfo callInfo optional,
Contact contact optional,
// optional in response and all requests except INVITE where mandatory
ContentDisposition contentDisposition optional,
ContentEncoding contentEncoding optional,
ContentLanguage contentLanguage optional,
ContentLength contentLength optional,
// optional in responses and all requests except ACK where mandatory
ContentType contentType optional,
CSeq cSeq optional,
// optional only in Invalid test cases mandatory otherwise
Date date optional,
ErrorInfo errorInfo optional,
// only in responses
Event event optional,
// 3265/7.2
Expires expires optional,
From fromField,
Geolocation geolocation optional,
// 6442
GeolocationRouting geolocationRouting optional,
// 6442
// @sic R5-133151 update of header fields sic@
HistoryInfo historyInfo optional,
// 4244
InReplyTo inReplyTo optional,
// only in requests
MaxForwards maxForwards optional,
// mandatory in requests not required in responses!
MimeVersion mimeVersion optional,
MinExpires minExpires optional,
// only in responses
MinSE minSE optional,
// 4028
Organization organization optional,
PAccessNetworkInfo pAccessNetworkInfo optional,
// 3455
PAssertedID pAssertedID optional,
// 3325
PAssertedService pAssertedService optional,
PAssociatedURI pAssociatedURI optional,
// 3455
Path path optional,
// 3327
PCalledPartyID pCalledPartyID optional,
// 3455
PChargingFunctionAddresses pChargingFunctionAddresses optional,
// 3455
PChargingVector pChargingVector optional,
// 3455
PEarlyMedia pEarlyMedia optional,
// 5009
PMediaAuthorization pMediaAuthorization optional,
// 3313
PPreferredID pPreferredID optional,
// 3325
PPreferredService pPreferredService optional,
// draft-drage-sipping-service-identification-01 (July 2007)
Priority priority optional,
// only in requests
Privacy privacy optional,
// 3323
ProxyAuthenticate proxyAuthenticate optional,
// only in responses
ProxyAuthorization proxyAuthorization optional,
// only in requests
ProxyRequire proxyRequire optional,
// only in requests
PVisitedNetworkID pVisitedNetworkID optional,
// 3455
RAck rAck optional,
// 3262/7.1
RSeq rSeq optional,
// 3262/7.1
Reason reason optional,
// 3326
RecordRoute recordRoute optional,
RequestDisposition requestDisposition optional,
// 3841
ReferredBy referredBy optional,
// 3892 - REFER method
ReferTo referTo optional,
// 3515 - REFER method
ReferSub referSub optional,
// 4488 - REFER method
Replaces replaces optional,
// 3891
ReplyTo replyTo optional,
// optional in responses and INVITE requests
Require require optional,
RetryAfter retryAfter optional,
// only in responses
Route route optional,
// only in requests
SecurityClient securityClient optional,
// 3329
SecurityServer securityServer optional,
// 3329
SecurityVerify securityVerify optional,
// 3329
Server server optional,
// only in responses
ServiceRoute serviceRoute optional,
// 3608
SessionExpires sessionExpires optional,
// 4028
SessionId sessionId optional,
SIP_ETag sipETag optional,
SIP_If_Match sipIfMatch optional,
Subject subject optional,
// only in requests
SubscriptionState subscriptionState optional,
// 3265/7.2
Supported supported optional,
Timestamp timestamp optional,
To toField,
Unsupported unsupported optional,
// only in responses
UserToUser userToUser optional,
UserAgent userAgent optional,
Via via,
Warning warning optional,
// only in responses
WwwAuthenticate wwwAuthenticate optional,
// only in responses
UndefinedHeader_List undefinedHeader_List optional
}
 
 
} // end group MessageHeaderTypes
 
group StartLineTypes {
// Request-Line [7.1 ]
type record RequestLine {
Method method,
SipUrl requestUri,
charstring sipVersion
}
 
// Status-Line [7.2 ]
type record StatusLine {
charstring sipVersion,
integer statusCode,
charstring reasonPhrase
}
 
 
} // end group StartLineTypes
 
 
group otherTypes {
 
type record SipUserProfile {
/**
* @desc integer for the userprofile identifier
*/
integer id,
/**
* @desc integer for Port number to exchange SIP messages
*/
integer currPort,
/**
* @desc charstring for IP address to exchange SIP messages
*/
charstring currIpaddr,
/**
* @desc integer for Port number to exchange SIP messages
*/
integer contactPort,
/**
* @desc charstring for IP address to exchange SIP messages
*/
charstring contactIpaddr,
/**
* @desc charstring for IP address used by the TS to exchange media streams
*/
charstring bearerIpaddr,
/**
* @desc charstring for identity of the tester local domain
*/
charstring homeDomain,
/**
* @desc charstring for identity of the tester local user
*/
charstring publUsername,
/**
* @desc charstring for RFC 2617 3.2.1 qop options: Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
*/
charstring qop,
/**
* @desc charstring for RFC 2617 3.2.2 username for authentication The name of user in the specified realm
*/
charstring privUsername,
/**
* @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
*/
charstring passwd,
/**
* @desc charstring for registrar domain for authentication and request line
*/
charstring registrarDomain
}
 
 
 
} // end group otherTypes
 
 
} // end group Subtypes
 
 
 
group MSGtypes {
 
group RequestTypes {
// [7.1 ]
/**
* @desc generic type of a SIP request message
* @member statusLine contains a method name, a Request-URI, and the protocol version
* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
* @member messageBody depends on the request method, includes e.g. SDP message.
* @member payload contains the whole message as it has been received in its text format
*/
type record Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
// Note: the introduction of the following specific types is to enable better means for logging
// on the other side the generic type is useful for functions dealing with multiple SIP message types
type record REGISTER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record INVITE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record OPTIONS_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record BYE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record CANCEL_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record ACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
// [3262/7.1 ]
type record PRACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
// [3265/7.1 ]
type record NOTIFY_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
// [3265/7.1 ]
type record SUBSCRIBE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
// [3903/11.1 ]
type record PUBLISH_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
// [3311/7 ]
type record UPDATE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record REFER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record MESSAGE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type record INFO_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
type union RequestUnion {
REGISTER_Request Register,
INVITE_Request Invite,
OPTIONS_Request Options,
BYE_Request Bye,
CANCEL_Request Cancel,
ACK_Request Ack,
PRACK_Request Prack,
NOTIFY_Request Notify,
SUBSCRIBE_Request Subscribe,
PUBLISH_Request Publish,
UPDATE_Request Update,
REFER_Request Refer,
MESSAGE_Request Message
}
 
} // end group RequestTypes
 
group ResponseTypes {
// [7.2 ]
/**
* @desc generic type of a SIP response message
* @member statusLine consists of the protocol version followed by a numeric Status-Code and its associated textual phrase
* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
* @member messageBody depends on the response method, includes e.g. SDP message.
* @member payload contains the whole message as it has been received in its text format
*/
type record Response {
StatusLine statusLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
 
} // end group ResponseTypes
 
// This MSG type is defined for sending synctactic variations, ans syntactically
// erroneous messages, and receving messages failed parsing.
group SyntacticTypes {
type charstring Raw;
 
} // end group SyntacticTypes
 
 
// This type is defined for particular SIP message body types like SDP
} // end group MSGTypes
 
} // end group Types
}
with {
encode "LibSip V3";
} // end module LibSip_TypesAndValues
/trunk/ttcn/LibSip_SMSFunctions.ttcn3
1,52 → 1,48
/*
* @author STF 435
/**
* @author STF 435, 471
* @version $Id$
* @desc This module provides the functions used by the test component
* for SIP-SMS over IMS as specified in 3GPP 24.341 tests.
* This module is part of LibSipV2.
* @desc This module provides the functions used by the test component
* for SIP-SMS over IMS as specified in 3GPP 24-341 tests.
* This module is part of LibSipV3.
*/
module LibSip_SMSFunctions {
import from LibSip_SMSTypesAndValues all;
function f_IA5_2oct(charstring p_ASCII_String)
return octetstring
{
 
function f_IA5_2oct(
charstring p_ASCII_String
) return octetstring {
var integer i;
var integer k;
var integer j;
var integer v_Length := lengthof(p_ASCII_String);
var integer v_Temp;
var octetstring v_Noctets :=''O;
var bitstring v_TempBitSrc := ''B;
var bitstring v_TempBitDes := ''B;
if ((v_Length<=0) or (v_Length>160) or (((v_Length *7) mod 8) != 0))
{
log("Invalid value of input string length.");
var integer v_Temp;
var octetstring v_Noctets := ''O;
var bitstring v_TempBitSrc := ''B;
var bitstring v_TempBitDes := ''B;
 
if ((v_Length <= 0) or (v_Length > 160) or (((v_Length * 7) mod 8) != 0)) {
log("*** " & __SCOPE__ & "INFO: Invalid value of input string length ***");
}
for(i:=0; i<v_Length; i:=i+1)
{
 
for (i := 0; i < v_Length; i := i + 1) {
v_Temp := char2int(p_ASCII_String[i]);
v_TempBitSrc := int2bit(v_Temp, 8);
for(k:=1; k<=7; k:=k+1)
{
v_TempBitDes := v_TempBitSrc[8-k] & v_TempBitDes;
if(((7*i+k) mod 8) == 0)
{
v_TempBitSrc := int2bit(v_Temp, 8);
 
for (j := 1; j <= 7; j := j + 1) {
 
v_TempBitDes := v_TempBitSrc[8 - j] & v_TempBitDes;
 
if (((7 * i + j) mod 8) == 0) {
 
v_Noctets := v_Noctets & bit2oct(v_TempBitDes);
v_TempBitDes := ''B;
}
}
}
 
return v_Noctets;
} // f_IA5_2oct
external function fx_GetSC_TimeStamp(integer p_TimeZone) return TP_ServiceCentreTimeStamp_Type;
 
external function fx_GetSC_TimeStamp(
integer p_TimeZone
) return TP_ServiceCentreTimeStamp_Type;
} // End of module LibSip_SMSFunctions
/trunk/ttcn/LibSip_SMSTemplates.ttcn3
1,395 → 1,304
/*
* @author STF 435
/**
* @author STF 435, STF 471
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-SMS over IMS as specified in 3GPP 24.341 tests.
* This module is part of LibSipV2.
* @desc This module provides the types used by the test component
* for SIP-SMS over IMS as specified in 3GPP 24-341 tests.
* This module is part of LibSipV3.
*/
module LibSip_SMSTemplates {
import from LibCommon_DataStrings all;
import from LibSip_SMSTypesAndValues all;
import from LibSip_SMSFunctions all;
 
group SMS_Templates_Group {
 
/* Non-SMS Type Constraints */
template (present) TypeOfNumberingPlan cr_TypeOfNumberingPlanAny :=
{
extBit := ?,
typeOfNumber := ?,
numberingPlanId := ?
};
template (value) TypeOfNumberingPlan cs_TypeOfNumberingPlan :=
{
extBit := '1'B,
typeOfNumber := '001'B, // international number
numberingPlanId := '0001'B // ISDN/telephony numbering plan (Rec. E.164/E.163)
};
template (present) TypeOfNumberingPlan cr_TypeOfNumberingPlan :=
{
extBit := ?,
typeOfNumber := ?,
numberingPlanId := ?
};
template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlanAny := {
extBit := ?,
typeOfNumber := ?,
numberingPlanId := ?
}
 
template(value) TypeOfNumberingPlan m_TypeOfNumberingPlan := {
extBit := '1'B,
typeOfNumber := '001'B, // international number
numberingPlanId :=
'0001'B // ISDN/telephony numbering plan (Rec. E.164/E.163)
}
 
template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlan := mw_TypeOfNumberingPlanAny;
 
/* End Non-SMS Type Constraints */
template (omit) RP_OriginatorAddress_dl cs_RP_OriginatorAddress_dl :=
{
spare := omit,
iei := omit,
iel := '06'O, // 6 semi-octets
typeOfNumberingPlan := cs_TypeOfNumberingPlan,
digits := '001122'O
};
template (omit) RP_OriginatorAddress_ul cr_RP_OriginatorAddress_ul :=
{
spare := omit,
iei := omit,
iel := '00'O
};
template RP_DestinationAddress_ul cr_RP_DestinationAddress_ul :=
{
spare := omit,
iei := omit,
iel := ?,
typeOfNumberingPlan := cr_TypeOfNumberingPlan,
digits := ?
};
template (omit) RP_DestinationAddress_dl cs_RP_DestinationAddress_dl :=
{
spare := omit,
iei := omit,
iel := '00'O
};
template (omit) RP_UserData cs_RP_UserData_DELIVER (octetstring p_Digits) :=
{
spare := omit,
iei := omit,
iel := int2oct ((153 + lengthof (p_Digits)), 1),
tP_PDU := {SMS_DELIVER := cs_SMS_DELIVER (p_Digits)}
};
template (omit) RP_UserData cs_RP_UserData_SUBMIT_REPORT :=
{
spare := '0'B,
iei := tsc_IEI_RP_UserData,
iel := '0A'O, // the TPDU data length is 10 octets
tP_PDU := {SMS_SUBMIT_REPORT := cs_SMS_SUBMIT_REPORT}
};
template (omit) RP_UserData cs_RP_UserData_STATUS_REPORT
(TP_MessageReference_Type p_MessageRef,
TP_Address_Type p_RecipientAddress,
TP_ServiceCentreTimeStamp_Type p_SCTP
) :=
{
spare := '0'B,
iei := tsc_IEI_RP_UserData,
iel := '0A'O, // the TPDU data length is 10 octets
tP_PDU := {SMS_STATUS_REPORT := cs_SMS_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)}
};
/*
template RP_UserData cr_RP_UserData (TP_PDU_Type p_TP_PDU) :=
{
spare := omit,
iei := omit,
iel := ?,
tP_PDU := p_TP_PDU
};
*/
template RP_UserData cr_RP_UserData_SUBMIT :=
{
spare := omit,
iei := omit,
iel := ?,
tP_PDU := {SMS_SUBMIT := cr_SMS_SUBMIT_VPF_REF}
};
template RP_UserData cr_RP_UserData_DELIVER_REPORT :=
{
spare := '0'B,
iei := tsc_IEI_RP_UserData,
iel := ?,
tP_PDU := {SMS_DELIVER_REPORT := cr_SMS_DELIVER_REPORT}
};
template(value) RP_OriginatorAddress_dl m_RP_OriginatorAddress_dl := {
spare := omit,
iei := omit,
iel := '06'O, // 6 semi-octets
typeOfNumberingPlan := m_TypeOfNumberingPlan,
digits := '001122'O
}
 
template(present) RP_OriginatorAddress_ul mw_RP_OriginatorAddress_ul := {
spare := omit,
iei := omit,
iel := '00'O
}
 
template(present) RP_DestinationAddress_ul mw_RP_DestinationAddress_ul := {
spare := omit,
iei := omit,
iel := ?,
typeOfNumberingPlan := mw_TypeOfNumberingPlan,
digits := ?
}
template(omit) RP_DestinationAddress_dl m_RP_DestinationAddress_dl := {
spare := omit,
iei := omit,
iel := '00'O
}
 
template(omit) RP_UserData m_RP_UserData_DELIVER(
octetstring p_Digits
) := {
spare := omit,
iei := omit,
iel := int2oct((153 + lengthof(p_Digits)), 1),
tP_PDU := {SMS_DELIVER := m_SMS_DELIVER(p_Digits)}
}
 
template(value) RP_UserData m_RP_UserData_SUBMIT_REPORT := {
spare := '0'B,
iei := c_IEI_RP_UserData,
iel := '0A'O, // the TPDU data length is 10 octets
tP_PDU := {SMS_SUBMIT_REPORT := m_SMS_SUBMIT_REPORT}
}
template(value) RP_UserData m_RP_UserData_STATUS_REPORT(
template(value) TP_MessageReference_Type p_MessageRef,
template(value) TP_Address_Type p_RecipientAddress,
template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
) modifies m_RP_UserData_SUBMIT_REPORT := {
tP_PDU := {SMS_STATUS_REPORT := m_SMS_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)}
}
 
template(present) RP_UserData mw_RP_UserData_SUBMIT := {
spare := omit,
iei := omit,
iel := ?,
tP_PDU := {SMS_SUBMIT := mw_SMS_SUBMIT_VPF_REF}
}
 
template(present) RP_UserData mw_RP_UserData_DELIVER_REPORT := {
spare := '0'B,
iei := c_IEI_RP_UserData,
iel := ?,
tP_PDU := {SMS_DELIVER_REPORT := mw_SMS_DELIVER_REPORT}
}
 
/* End SM-RP Type Constraints */
/* SM-RP PDU Constraints */
template (value) RP_DATA_dl_Type cs_RP_DATA_dl_DELIVER (octetstring p_Digits) :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_DATA_dl,
rP_MessageReference := '00'O,
rP_OriginatorAddress := cs_RP_OriginatorAddress_dl,
rP_DestinationAddress := cs_RP_DestinationAddress_dl,
rP_UserData := cs_RP_UserData_DELIVER(p_Digits)
};
template (value) RP_DATA_dl_Type cs_RP_DATA_dl_STATUS_REPORT (
TP_MessageReference_Type p_MessageRef,
TP_Address_Type p_RecipientAddress,
TP_ServiceCentreTimeStamp_Type p_SCTP
) :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_DATA_dl,
rP_MessageReference := '00'O,
rP_OriginatorAddress := cs_RP_OriginatorAddress_dl,
rP_DestinationAddress := cs_RP_DestinationAddress_dl,
rP_UserData := cs_RP_UserData_STATUS_REPORT (p_MessageRef, p_RecipientAddress, p_SCTP)
};
template (present) RP_DATA_ul_Type cr_RP_DATA_ul_SUBMIT :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_DATA_ul,
rP_MessageReference := ?,
rP_OriginatorAddress := cr_RP_OriginatorAddress_ul,
rP_DestinationAddress := cr_RP_DestinationAddress_ul,
rP_UserData := cr_RP_UserData_SUBMIT
};
template (value) RP_ACK_Type cs_RP_ACK_SUBMIT_REPORT (Oct1 p_msgReference := '00'O):=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_ACK_dl,
rP_MessageReference := p_msgReference,
rP_UserData := cs_RP_UserData_SUBMIT_REPORT
};
template (present) RP_ACK_Type cr_RP_ACK_DELIVER_REPORT :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_ACK_ul,
rP_MessageReference := ?,
rP_UserData := cr_RP_UserData_DELIVER_REPORT
};
template(value) RP_DATA_dl_Type m_RP_DATA_dl_base := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_DATA_dl,
rP_MessageReference := '00'O,
rP_OriginatorAddress := m_RP_OriginatorAddress_dl,
rP_DestinationAddress := m_RP_DestinationAddress_dl,
rP_UserData := m_RP_UserData_DELIVER('0000'O)
}
 
template(value) RP_DATA_dl_Type m_RP_DATA_dl_DELIVER(
octetstring p_Digits
) modifies m_RP_DATA_dl_base := {rP_UserData := m_RP_UserData_DELIVER(p_Digits)}
 
template(value) RP_DATA_dl_Type m_RP_DATA_dl_STATUS_REPORT(
template(value) TP_MessageReference_Type p_MessageRef,
template(value) TP_Address_Type p_RecipientAddress,
template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
) modifies m_RP_DATA_dl_base := {
rP_UserData := m_RP_UserData_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)
}
 
 
template(present) RP_DATA_ul_Type mw_RP_DATA_ul_SUBMIT := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_DATA_ul,
rP_MessageReference := ?,
rP_OriginatorAddress := mw_RP_OriginatorAddress_ul,
rP_DestinationAddress := mw_RP_DestinationAddress_ul,
rP_UserData := mw_RP_UserData_SUBMIT
}
 
template(value) RP_ACK_Type m_RP_ACK_SUBMIT_REPORT(
template(value) Oct1 p_msgReference := '00'O
) := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_ACK_dl,
rP_MessageReference := p_msgReference,
rP_UserData := m_RP_UserData_SUBMIT_REPORT
}
 
template(present) RP_ACK_Type mw_RP_ACK_DELIVER_REPORT := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_ACK_ul,
rP_MessageReference := ?,
rP_UserData := mw_RP_UserData_DELIVER_REPORT
}
 
/* End SM-RP PDU Constraints */
/* SM-TP Type Constraints */
template (value) TP_ProtocolIdentifier_Type cr_TP_ProtocolIdentifier :=
{
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
};
template (value) TP_ProtocolIdentifier_Type cs_TP_ProtocolIdentifier :=
{
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
};
template (value) TP_DataCodingScheme_Type cs_TP_DataCodingScheme :=
{
codingGroup := '0000'B,
codeValue := '0000'B
};
template TP_Address_Type cr_TP_AddressAny :=
{
iel := ?,
typeOfNumberingPlan := cr_TypeOfNumberingPlanAny,
digits := *
};
template (value) TP_Address_Type cs_TP_Address (octetstring p_Digits) :=
{
iel := int2oct(2 * lengthof(p_Digits), 1),
// length is number of useful semi-octets
// as p_digits is declared as octetstring the number must be even
typeOfNumberingPlan := cs_TypeOfNumberingPlan,
digits := p_Digits
};
template (value) TP_ParameterIndicator_Type cs_TP_ParameterIndicator :=
{
extBit1 := '0'B,
spare4 := '0000'B,
tP_UDL := '0'B,
tP_DCS := '0'B,
tP_PID := '1'B
};
template(value) TP_ProtocolIdentifier_Type mw_TP_ProtocolIdentifier := {
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
}
 
template(value) TP_ProtocolIdentifier_Type m_TP_ProtocolIdentifier := {
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
}
 
template(value) TP_DataCodingScheme_Type m_TP_DataCodingScheme := {
codingGroup := '0000'B,
codeValue := '0000'B
}
 
template(present) TP_Address_Type mw_TP_AddressAny := {
iel := ?,
typeOfNumberingPlan := mw_TypeOfNumberingPlanAny,
digits := *
}
 
template(value) TP_Address_Type m_TP_Address(
octetstring p_Digits
) := {
iel := int2oct(2 * lengthof(p_Digits), 1),
// length is number of useful semi-octets
// as p_digits is declared as octetstring the number must be even
typeOfNumberingPlan := m_TypeOfNumberingPlan,
digits := p_Digits
}
 
template(value) TP_ParameterIndicator_Type m_TP_ParameterIndicator := {
extBit1 := '0'B,
spare4 := '0000'B,
tP_UDL := '0'B,
tP_DCS := '0'B,
tP_PID := '1'B
}
 
/* End SM-TP Type Constraints */
/* SM-TP PDU Constraints */
template (value) SMS_DELIVER_Type cs_SMS_DELIVER (octetstring p_Digits) :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportIndication := '1'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_DELIVER,
tP_OriginatingAddress := cs_TP_Address (p_Digits),
tP_ProtocolIdentifier := cs_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := cs_TP_DataCodingScheme,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_UserDataLength := int2oct(160,1),
tP_UserData := f_IA5_2oct(tsc_Fox)
};
template SMS_DELIVER_REPORT_Type cr_SMS_DELIVER_REPORT :=
{
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := tsc_MT_SMS_DELIVER_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := ?,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := *,
tP_UserDataLength := *,
tP_UserData := *
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '??'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := *,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_NP :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '00'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := omit,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_REF :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '10'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := ?,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_ENH :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '01'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := ?,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_ABS :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '11'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := ?,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template (value) SMS_SUBMIT_REPORT_Type cs_SMS_SUBMIT_REPORT :=
{
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := cs_TP_ParameterIndicator,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_ProtocolIdentifier := cs_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
};
template (value) SMS_STATUS_REPORT_Type cs_SMS_STATUS_REPORT (
TP_MessageReference_Type p_MessageRef,
TP_Address_Type p_RA,
TP_ServiceCentreTimeStamp_Type p_SCTP
):=
{
// TS 34.229-1 clause A.7.5
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportQualifier := '0'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_STATUS_REPORT,
tP_MessageReference := p_MessageRef,
tP_RecipientAddress := p_RA,
tP_ServiceCentreTimeStamp := p_SCTP,
tP_DischargeTime := '00000000000000'H,
tP_Status := {
reserved := '0'B,
status := '0000000'B
},
tP_ParameterIndicator := cs_TP_ParameterIndicator,
tP_ProtocolIdentifier := cs_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
};
/* End SM-TP PDU Constraints */
template(value) SMS_DELIVER_Type m_SMS_DELIVER(
octetstring p_Digits
) := {
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportIndication := '1'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := c_MT_SMS_DELIVER,
tP_OriginatingAddress := m_TP_Address(p_Digits),
tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := m_TP_DataCodingScheme,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_UserDataLength := int2oct(160, 1),
tP_UserData := f_IA5_2oct(c_Fox)
}
 
template(present) SMS_DELIVER_REPORT_Type mw_SMS_DELIVER_REPORT := {
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := c_MT_SMS_DELIVER_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := ?,
tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := *,
tP_UserDataLength := *,
tP_UserData := *
}
 
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT := {
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '??'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := c_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := mw_TP_AddressAny,
tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := *,
tP_UserDataLength := int2oct(160, 1),
tP_UserData :=
? // any data will do: 140 octets
}
 
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_NP modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '00'B,
tP_ValidityPeriod := omit
}
 
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_REF modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '10'B,
tP_ValidityPeriod := ?
}
 
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ENH modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '01'B,
tP_ValidityPeriod := ?
}
 
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ABS modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '11'B,
tP_ValidityPeriod := ?
}
 
template(value) SMS_SUBMIT_REPORT_Type m_SMS_SUBMIT_REPORT := {
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := c_MT_SMS_SUBMIT_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := m_TP_ParameterIndicator,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
}
 
template(value) SMS_STATUS_REPORT_Type m_SMS_STATUS_REPORT(
template(value) TP_MessageReference_Type p_MessageRef,
template(value) TP_Address_Type p_RA,
template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
) := {
// TS 34.229-1 clause A.7.5
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportQualifier := '0'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := c_MT_SMS_STATUS_REPORT,
tP_MessageReference := p_MessageRef,
tP_RecipientAddress := p_RA,
tP_ServiceCentreTimeStamp := p_SCTP,
tP_DischargeTime := '00000000000000'H,
tP_Status := {
reserved := '0'B,
status := '0000000'B
},
tP_ParameterIndicator := m_TP_ParameterIndicator,
tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
}
 
 
 
 
 
/* End SM-TP PDU Constraints */
} // group SMS_Templates_Group
 
} // End of module LibSip_SMSTypesAndValues
/trunk/ttcn/LibSip_SMSTypesAndValues.ttcn
1,328 → 1,485
/******************************************************************************/
// $Date: 2009-11-25 18:40:50 +0100 (Mi, 25 Nov 2009) $
// $Author: STF160 $
// $Rev: 2184 $
/******************************************************************************/
/*
* This module contains the type definitions for SMS messages as specified in
* 3GPP 24.011 and 3GPP 23.040 Rel 8 and 9.
* SMS over IMS is specified in 3GPP 24.341.
* This module is part of LibSipV2.
/******************************************************************************
* @author STF 435, STF471
* @version $Id$
* @desc This module contains the type definitions for SMS messages as specified in
* 3GPP 24-011 and 3GPP 23-040 Rel 8 and 9.
* SMS over IMS is specified in 3GPP 24-341.
* This module is part of LibSipV3.
*/
 
 
module LibSip_SMSTypesAndValues {
import from LibCommon_DataStrings all;
 
group SMS_Declarations {
const RP_MessageTypeIndicator_Type tsc_MT_RP_DATA_ul := '000'B; /* RP_DATA_ul */
const RP_MessageTypeIndicator_Type tsc_MT_RP_DATA_dl := '001'B; /* RP_DATA_dl */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ACK_ul := '010'B; /* RP_ACK_ul */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ACK_dl := '011'B; /* RP_ACK_dl */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ERROR_ul := '100'B; /* RP_ERROR_ul */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ERROR_dl := '101'B; /* RP_ERROR_dl */
const RP_MessageTypeIndicator_Type tsc_MT_RP_SMMA := '110'B; /* RP_SMMA */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_DELIVER := '00'B; /* SMS DELIVER */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_DELIVER_REPORT := '00'B; /* SMS DELIVER REPORT */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_STATUS_REPORT := '10'B; /* SMS STATUS REPORT */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_COMMAND := '10'B; /* SMS COMMAND */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_SUBMIT := '01'B; /* SMS SUBMIT, SMS SUBMIT REPORT */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_SUBMIT_REPORT := '01'B; /* SMS SUBMIT, SMS SUBMIT REPORT */
const Bit7 tsc_IEI_RP_UserData := '1000001'B; /* 24.011 cl. 8.2.5.3 */
const charstring tsc_Fox := "The quick brown fox jumps over the lazy dog's back. Kaufen Sie Ihrer Frau vier bequeme Pelze. - 0123456789 - THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'S BACK.";
type record TypeOfNumberingPlan { /* 24.008 cl. 10.5.4.7, 10.5.4.9, 10.5.4.13 */
Bit1 extBit, /* Extension Bit */
Bit3 typeOfNumber, /* Type Of Number */
Bit4 numberingPlanId /* Numbering Plan Identification */
};
 
const RP_MessageTypeIndicator_Type c_MT_RP_DATA_ul := '000'B;
/* RP_DATA_ul */
const RP_MessageTypeIndicator_Type c_MT_RP_DATA_dl := '001'B;
/* RP_DATA_dl */
const RP_MessageTypeIndicator_Type c_MT_RP_ACK_ul := '010'B;
/* RP_ACK_ul */
const RP_MessageTypeIndicator_Type c_MT_RP_ACK_dl := '011'B;
/* RP_ACK_dl */
const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_ul := '100'B;
/* RP_ERROR_ul */
const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_dl := '101'B;
/* RP_ERROR_dl */
const RP_MessageTypeIndicator_Type c_MT_RP_SMMA := '110'B;
/* RP_SMMA */
const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER := '00'B;
/* SMS DELIVER */
const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER_REPORT := '00'B;
/* SMS DELIVER REPORT */
const TP_MessageTypeIndicator_Type c_MT_SMS_STATUS_REPORT := '10'B;
/* SMS STATUS REPORT */
const TP_MessageTypeIndicator_Type c_MT_SMS_COMMAND := '10'B;
/* SMS COMMAND */
const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT := '01'B;
/* SMS SUBMIT, SMS SUBMIT REPORT */
const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT_REPORT := '01'B;
/* SMS SUBMIT, SMS SUBMIT REPORT */
const Bit7 c_IEI_RP_UserData := '1000001'B;
/* 24.011 cl. 8.2.5.3 */
const charstring c_Fox := "The quick brown fox jumps over the lazy dog's back. Kaufen Sie Ihrer Frau vier bequeme Pelze. - 0123456789 - THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'S BACK.";
 
 
 
type record TypeOfNumberingPlan {
/* 24.008 cl. 10.5.4.7, 10.5.4.9, 10.5.4.13 */
Bit1 extBit,
/* Extension Bit */
Bit3 typeOfNumber,
/* Type Of Number */
Bit4 numberingPlanId /* Numbering Plan Identification */
}
/* SM-RP Type Declarations */
type Bit3 RP_MessageTypeIndicator_Type; /* 24.011 cl. 8.2.2 */
type Oct1 RP_MessageReference_Type; /* 24.011 cl. 8.2.3 */
type record RP_OriginatorAddress_dl { /* 24.011 cl. 8.2.5.1 */
Bit1 spare optional, /* 0 */
Bit7 iei optional, /* 0101 1110 */
Oct1 iel, /* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan, /* */
octetstring digits length(1..10)
};
type record RP_OriginatorAddress_ul { /* 24.011 cl. 8.2.5.1 */
Bit1 spare optional, /* 0 */
Bit7 iei optional, /* 0101 1110 */
Oct1 iel /* 0 */
};
type record RP_DestinationAddress_ul { /* 24.011 cl. 8.2.5.2 */
Bit1 spare optional, /* 0 */
Bit7 iei optional, /* 0101 1110 */
Oct1 iel, /* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan, /* */
octetstring digits length(1..10)
};
type record RP_DestinationAddress_dl { /* 24.011 cl. 8.2.5.2 */
Bit1 spare optional, /* 0 */
Bit7 iei optional, /* 0101 1110 */
Oct1 iel /* 0 */
};
type record RP_UserData { /* 24.011 cl. 8.2.5.3 */
Bit1 spare optional, /* 0, present in case of TLV; omit in case of LV */
Bit7 iei optional, /* 1000001, present in case of TLV; omit in case of LV */
Oct1 iel, /* */
TP_PDU_Type tP_PDU /* <= 232 octets */
};
type record RP_Cause { /* 24.011 cl. 8.2.5.4 */
Bit1 spare optional, /* present in case of TLV; omit in case of LV */
Bit7 iei optional, /* present in case of TLV; omit in case of LV */
Oct1 iel, /* 2 or 3 */
Bit1 extBit1, /* 0 */
Bit7 causeValue1, /* Table 8.4/3GPP TS 24.011 */
Bit1 extBit2, /* 0 */
Bit7 causeValue2, /* Table 8.4/3GPP TS 24.011 */
Oct1 diagnostic optional /* Parameters included in the return error from MAP */
};
type Bit3 RP_MessageTypeIndicator_Type;
/* 24.011 cl. 8.2.2 */
type Oct1 RP_MessageReference_Type;
/* 24.011 cl. 8.2.3 */
type record RP_OriginatorAddress_dl {
/* 24.011 cl. 8.2.5.1 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel,
/* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
/* */
octetstring digits length(1 .. 10)
}
 
type record RP_OriginatorAddress_ul {
/* 24.011 cl. 8.2.5.1 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel /* 0 */
}
 
type record RP_DestinationAddress_ul {
/* 24.011 cl. 8.2.5.2 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel,
/* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
/* */
octetstring digits length(1 .. 10)
}
type record RP_DestinationAddress_dl {
/* 24.011 cl. 8.2.5.2 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel /* 0 */
}
 
type record RP_UserData {
/* 24.011 cl. 8.2.5.3 */
Bit1 spare optional,
/* 0, present in case of TLV; omit in case of LV */
Bit7 iei optional,
/* 1000001, present in case of TLV; omit in case of LV */
Oct1 iel,
/* */
TP_PDU_Type tP_PDU /* <= 232 octets */
}
 
type record RP_Cause {
/* 24.011 cl. 8.2.5.4 */
Bit1 spare optional,
/* present in case of TLV; omit in case of LV */
Bit7 iei optional,
/* present in case of TLV; omit in case of LV */
Oct1 iel,
/* 2 or 3 */
Bit1 extBit1,
/* 0 */
Bit7 causeValue1,
/* Table 8.4/3GPP TS 24.011 */
Bit1 extBit2,
/* 0 */
Bit7 causeValue2,
/* Table 8.4/3GPP TS 24.011 */
Oct1 diagnostic optional /* Parameters included in the return error from MAP */
}
 
/* End SM-RP Type Declarations */
/* SM-RP PDU Declarations */
type record RP_DATA_dl_Type { /* 24.011 cl. 7.3.1.1
type record RP_DATA_dl_Type {
/* 24.011 cl. 7.3.1.1
Direction: n -> ue */
Bit5 spare5, /* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, /* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference, /* cl. 8.2.3 M LV 1 */
RP_OriginatorAddress_dl rP_OriginatorAddress, /* cl. 8.2.5.1 M LV 1-12 octets */
RP_DestinationAddress_dl rP_DestinationAddress, /* cl. 8.2.5.2 M LV 1 */
RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
};
type record RP_DATA_ul_Type { /* 24.011 cl. 7.3.1.2
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_OriginatorAddress_dl rP_OriginatorAddress,
/* cl. 8.2.5.1 M LV 1-12 octets */
RP_DestinationAddress_dl rP_DestinationAddress,
/* cl. 8.2.5.2 M LV 1 */
RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
}
 
type record RP_DATA_ul_Type {
/* 24.011 cl. 7.3.1.2
Direction: ue -> n */
Bit5 spare5, /* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, /* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference, /* cl. 8.2.3 M LV 1 */
RP_OriginatorAddress_ul rP_OriginatorAddress, /* cl. 8.2.5.1 M LV 1 */
RP_DestinationAddress_ul rP_DestinationAddress, /* cl. 8.2.5.2 M LV 1 */
RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
};
type record RP_SMMA_Type { /* 24.011 cl. 7.3.2
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_OriginatorAddress_ul rP_OriginatorAddress,
/* cl. 8.2.5.1 M LV 1 */
RP_DestinationAddress_ul rP_DestinationAddress,
/* cl. 8.2.5.2 M LV 1 */
RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
}
 
type record RP_SMMA_Type {
/* 24.011 cl. 7.3.2
Direction: ue -> n */
Bit5 spare5, /* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, /* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference /* cl. 8.2.3 M LV 1 */
};
type record RP_ACK_Type { /* 24.011 cl. 7.3.3
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference /* cl. 8.2.3 M LV 1 */
}
 
type record RP_ACK_Type {
/* 24.011 cl. 7.3.3
Direction: ue <-> n */
Bit5 spare5, /* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, /* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference, /* cl. 8.2.3 M LV 1 */
RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
};
type record RP_ERROR_Type { /* 24.011 cl. 7.3.4
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
}
 
type record RP_ERROR_Type {
/* 24.011 cl. 7.3.4
Direction: ue <-> n */
Bit5 spare5, /* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, /* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference, /* cl. 8.2.3 M LV 1 */
RP_Cause rP_Cause, /* cl. 8.2.5.4 M LV 2-3 */
RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
};
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_Cause rP_Cause,
/* cl. 8.2.5.4 M LV 2-3 */
RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
}
 
type union RP_PDU_Type {
RP_DATA_dl_Type RP_DATA_dl,
RP_DATA_ul_Type RP_DATA_ul,
RP_SMMA_Type RP_SMMA,
RP_ACK_Type RP_ACK,
RP_ERROR_Type RP_ERROR
};
RP_DATA_dl_Type RP_DATA_dl,
RP_DATA_ul_Type RP_DATA_ul,
RP_SMMA_Type RP_SMMA,
RP_ACK_Type RP_ACK,
RP_ERROR_Type RP_ERROR
}
 
/* End SM-RP PDU Declarations */
/* SM-TP Type Declarations */
type record TP_Address_Type { /* 23.040 cl. 9.1.2.5 */
Oct1 iel, /* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
octetstring digits length(0..10) optional
};
type Bit2 TP_MessageTypeIndicator_Type; /* 23.040 cl. 9.2.3.1 */
type Oct1 TP_MessageReference_Type; /* 23.040 cl. 9.2.3.6 */
type Oct1 TP_UserDataLength_Type; /* 23.040 cl. 9.2.3.16 */
type record TP_ProtocolIdentifier_Type { /* 23.040 cl. 9.2.3.9 */
Bit2 pidType, /* */
Bit1 interworking, /* */
Bit5 pidValue /* */
};
type record TP_DataCodingScheme_Type { /* 23.040 cl. 9.2.3.10 + 23.040 cl. 4 */
Bit4 codingGroup, /* */
Bit4 codeValue /* */
};
type hexstring TP_ServiceCentreTimeStamp_Type length (14); /* 23.040 cl. 9.2.3.11 */
type Oct1 TP_ValidityPeriodRelative_Type; /* 23.040 cl. 9.2.3.12.1 */
type hexstring TP_ValidityPeriodAbsolute_Type length (14); /* 23.040 cl. 9.2.3.12.2 */
type record TP_ValidityPeriodEnhanced_Type { /* 23.040 cl. 9.2.3.12.3 */
Bit1 extBit, /* */
Bit1 singleShot, /* */
Bit3 spare3, /* */
Bit3 validityPeriodFormat, /* */
Oct6 validityPeriod /* */
};
type union TP_ValidityPeriod_Type { /* 23.040 cl. 9.2.3.3 */
TP_ValidityPeriodRelative_Type TP_ValidityPeriodRelative, /* Relative format */
TP_ValidityPeriodAbsolute_Type TP_ValidityPeriodAbsolute, /* Absolute format */
TP_ValidityPeriodEnhanced_Type TP_ValidityPeriodEnhanced /* Enhanced format */
};
type record TP_Status_Type { /* 23.040 cl. 9.2.3.15 */
Bit1 reserved, /* */
Bit7 status /* */
};
type Bit8 TP_Command_Type; /* 23.040 cl. 9.2.3.19 */
type record TP_ParameterIndicator_Type { /* 23.040 cl. 9.2.3.27 */
Bit1 extBit1, /* */
Bit4 spare4, /* */
Bit1 tP_UDL, /* */
Bit1 tP_DCS, /* */
Bit1 tP_PID /* */
};
type record TP_Address_Type {
/* 23.040 cl. 9.1.2.5 */
Oct1 iel,
/* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
octetstring digits length(0 .. 10) optional
}
 
type Bit2 TP_MessageTypeIndicator_Type;
/* 23.040 cl. 9.2.3.1 */
type Oct1 TP_MessageReference_Type;
/* 23.040 cl. 9.2.3.6 */
type Oct1 TP_UserDataLength_Type;
/* 23.040 cl. 9.2.3.16 */
type record TP_ProtocolIdentifier_Type {
/* 23.040 cl. 9.2.3.9 */
Bit2 pidType,
/* */
Bit1 interworking,
/* */
Bit5 pidValue /* */
}
 
type record TP_DataCodingScheme_Type {
/* 23.040 cl. 9.2.3.10 + 23.040 cl. 4 */
Bit4 codingGroup,
/* */
Bit4 codeValue /* */
}
 
type hexstring TP_ServiceCentreTimeStamp_Type length(14);
/* 23.040 cl. 9.2.3.11 */
type Oct1 TP_ValidityPeriodRelative_Type;
/* 23.040 cl. 9.2.3.12.1 */
type hexstring TP_ValidityPeriodAbsolute_Type length(14);
/* 23.040 cl. 9.2.3.12.2 */
type record TP_ValidityPeriodEnhanced_Type {
/* 23.040 cl. 9.2.3.12.3 */
Bit1 extBit,
/* */
Bit1 singleShot,
/* */
Bit3 spare3,
/* */
Bit3 validityPeriodFormat,
/* */
Oct6 validityPeriod /* */
}
 
type union TP_ValidityPeriod_Type {
/* 23.040 cl. 9.2.3.3 */
TP_ValidityPeriodRelative_Type TP_ValidityPeriodRelative,
/* Relative format */
TP_ValidityPeriodAbsolute_Type TP_ValidityPeriodAbsolute,
/* Absolute format */
TP_ValidityPeriodEnhanced_Type TP_ValidityPeriodEnhanced /* Enhanced format */
}
 
type record TP_Status_Type {
/* 23.040 cl. 9.2.3.15 */
Bit1 reserved,
/* */
Bit7 status /* */
}
 
type Bit8 TP_Command_Type;
/* 23.040 cl. 9.2.3.19 */
type record TP_ParameterIndicator_Type {
/* 23.040 cl. 9.2.3.27 */
Bit1 extBit1,
/* */
Bit4 spare4,
/* */
Bit1 tP_UDL,
/* */
Bit1 tP_DCS,
/* */
Bit1 tP_PID /* */
}
 
/* End SM-TP Type Declarations */
/* SM-TP PDU Declarations */
type record SMS_DELIVER_Type { /* 23.040 cl. 9.2.2.1
type record SMS_DELIVER_Type {
/* 23.040 cl. 9.2.2.1
Direction: n -> ue */
Bit1 tP_ReplyPath, /* 23.040 cl. 9.2.3.17 */
Bit1 tP_UserDataHeaderIndicator, /* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportIndication, /* 23.040 cl. 9.2.3.4 */
Bit2 spare2, /* */
Bit1 tP_MoreMessagesToSend, /* 23.040 cl. 9.2.3.2 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, /* 23.040 cl. 9.2.3.1 */
TP_Address_Type tP_OriginatingAddress, /* 23.040 cl. 9.1.2.5 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier, /* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type, /* 23.040 cl. 9.2.3.10 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp, /* 23.040 cl. 9.2.3.11 */
TP_UserDataLength_Type tP_UserDataLength, /* 23.040 cl. 9.2.3.16, derived from SUBMIT */
octetstring tP_UserData length (0..140) optional /* 23.040 cl. 9.2.3.24, derived from SUBMIT */
};
type record SMS_DELIVER_REPORT_Type { /* 23.040 cl. 9.2.2.1a
Bit1 tP_ReplyPath,
/* 23.040 cl. 9.2.3.17 */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportIndication,
/* 23.040 cl. 9.2.3.4 */
Bit2 spare2,
/* */
Bit1 tP_MoreMessagesToSend,
/* 23.040 cl. 9.2.3.2 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_Address_Type tP_OriginatingAddress,
/* 23.040 cl. 9.1.2.5 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type,
/* 23.040 cl. 9.2.3.10 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
/* 23.040 cl. 9.2.3.11 */
TP_UserDataLength_Type tP_UserDataLength,
/* 23.040 cl. 9.2.3.16, derived from SUBMIT */
octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24, derived from SUBMIT */
}
 
type record SMS_DELIVER_REPORT_Type {
/* 23.040 cl. 9.2.2.1a
Direction: ue -> n */
Bit1 spare1, /* */
Bit1 tP_UserDataHeaderIndicator, /* 23.040 cl. 9.2.3.23 */
Bit4 spare4, /* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, /* 23.040 cl. 9.2.3.1 */
Oct1 tP_FailureCause optional, /* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
TP_ParameterIndicator_Type tP_ParameterIndicator, /* 23.040 cl. 9.2.3.27 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional, /* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional, /* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional, /* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length (0..159) optional /* 23.040 cl. 9.2.3.24 */
};
type record SMS_SUBMIT_Type { /* 23.040 cl. 9.2.2.2
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit4 spare4,
/* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
Oct1 tP_FailureCause optional,
/* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
TP_ParameterIndicator_Type tP_ParameterIndicator,
/* 23.040 cl. 9.2.3.27 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
/* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 159) optional /* 23.040 cl. 9.2.3.24 */
}
 
type record SMS_SUBMIT_Type {
/* 23.040 cl. 9.2.2.2
Direction: ue -> n */
Bit1 tP_ReplyPath, /* 23.040 cl. 9.2.3.17 */
Bit1 tP_UserDataHeaderIndicator, /* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportRequest, /* 23.040 cl. 9.2.3.5 */
Bit2 tP_ValidityPeriodFormat, /* 23.040 cl. 9.2.3.3 */
Bit1 tP_RejectDuplicates, /* 23.040 cl. 9.2.3.25 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, /* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference, /* 23.040 cl. 9.2.3.6 */
TP_Address_Type tP_DestinationAddress, /* 23.040 cl. 9.1.2.5 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier, /* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type, /* 23.040 cl. 9.2.3.10 */
// one of the subsequent ValidityPeriod solutions has be removed
TP_ValidityPeriod_Type tP_ValidityPeriod optional, /* 23.040 cl. 9.2.3.12 */
// TP_ValidityPeriodRelative_Type tP_ValidityPeriodRelative optional, /* 23.040 cl. 9.2.3.12.1 */
// TP_ValidityPeriodAbsolute_Type tP_ValidityPeriodAbsolute optional, /* 23.040 cl. 9.2.3.12.2 */
// TP_ValidityPeriodEnhanced_Type tP_ValidityPeriodEnhanced optional, /* 23.040 cl. 9.2.3.12.3 */
TP_UserDataLength_Type tP_UserDataLength, /* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length (0..140) optional /* 23.040 cl. 9.2.3.24 */
};
type record SMS_SUBMIT_REPORT_Type { /* 23.040 cl. 9.2.2.2a
Bit1 tP_ReplyPath,
/* 23.040 cl. 9.2.3.17 */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportRequest,
/* 23.040 cl. 9.2.3.5 */
Bit2 tP_ValidityPeriodFormat,
/* 23.040 cl. 9.2.3.3 */
Bit1 tP_RejectDuplicates,
/* 23.040 cl. 9.2.3.25 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference,
/* 23.040 cl. 9.2.3.6 */
TP_Address_Type tP_DestinationAddress,
/* 23.040 cl. 9.1.2.5 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type,
/* 23.040 cl. 9.2.3.10 */
// one of the subsequent ValidityPeriod solutions has be removed
TP_ValidityPeriod_Type tP_ValidityPeriod optional,
/* 23.040 cl. 9.2.3.12 */
// TP_ValidityPeriodRelative_Type tP_ValidityPeriodRelative optional, /* 23.040 cl. 9.2.3.12.1 */
// TP_ValidityPeriodAbsolute_Type tP_ValidityPeriodAbsolute optional, /* 23.040 cl. 9.2.3.12.2 */
// TP_ValidityPeriodEnhanced_Type tP_ValidityPeriodEnhanced optional, /* 23.040 cl. 9.2.3.12.3 */
TP_UserDataLength_Type tP_UserDataLength,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24 */
}
type record SMS_SUBMIT_REPORT_Type {
/* 23.040 cl. 9.2.2.2a
Direction: n -> ue */
Bit1 spare1, /* */
Bit1 tP_UserDataHeaderIndicator, /* 23.040 cl. 9.2.3.23 */
Bit4 spare4, /* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, /* 23.040 cl. 9.2.3.1 */
Oct1 tP_FailureCause optional, /* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
TP_ParameterIndicator_Type tP_ParameterIndicator, /* 23.040 cl. 9.2.3.27 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp, /* 23.040 cl. 9.2.3.11 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional, /* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional, /* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional, /* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length (0..152) optional /* 23.040 cl. 9.2.3.24 */
};
type record SMS_STATUS_REPORT_Type { /* 23.040 cl. 9.2.2.3
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit4 spare4,
/* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
Oct1 tP_FailureCause optional,
/* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
TP_ParameterIndicator_Type tP_ParameterIndicator,
/* 23.040 cl. 9.2.3.27 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
/* 23.040 cl. 9.2.3.11 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
/* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 152) optional /* 23.040 cl. 9.2.3.24 */
}
 
type record SMS_STATUS_REPORT_Type {
/* 23.040 cl. 9.2.2.3
Direction: n -> ue */
Bit1 spare1, /* */
Bit1 tP_UserDataHeaderIndicator, /* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportQualifier, /* 23.040 cl. 9.2.3.26 */
Bit2 spare2, /* */
Bit1 tP_MoreMessagesToSend, /* 23.040 cl. 9.2.3.2 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, /* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference, /* 23.040 cl. 9.2.3.6 */
TP_Address_Type tP_RecipientAddress, /* 23.040 cl. 9.1.2.5 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp, /* 23.040 cl. 9.2.3.11 */
TP_ServiceCentreTimeStamp_Type tP_DischargeTime, /* 23.040 cl. 9.2.3.12 */
TP_Status_Type tP_Status, /* 23.040 cl. 9.2.3.15 */
TP_ParameterIndicator_Type tP_ParameterIndicator optional, /* 23.040 cl. 9.2.3.27 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional, /* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional, /* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional, /* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length (0..143) optional /* 23.040 cl. 9.2.3.24 */
};
type record SMS_COMMAND_Type { /* 23.040 cl. 9.2.2.4
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportQualifier,
/* 23.040 cl. 9.2.3.26 */
Bit2 spare2,
/* */
Bit1 tP_MoreMessagesToSend,
/* 23.040 cl. 9.2.3.2 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference,
/* 23.040 cl. 9.2.3.6 */
TP_Address_Type tP_RecipientAddress,
/* 23.040 cl. 9.1.2.5 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
/* 23.040 cl. 9.2.3.11 */
TP_ServiceCentreTimeStamp_Type tP_DischargeTime,
/* 23.040 cl. 9.2.3.12 */
TP_Status_Type tP_Status,
/* 23.040 cl. 9.2.3.15 */
TP_ParameterIndicator_Type tP_ParameterIndicator optional,
/* 23.040 cl. 9.2.3.27 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
/* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 143) optional /* 23.040 cl. 9.2.3.24 */
}
 
type record SMS_COMMAND_Type {
/* 23.040 cl. 9.2.2.4
Direction: ue -> n */
Bit1 spare1, /* */
Bit1 tP_UserDataHeaderIndicator, /* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatRptReq, /* Table 8.4/3GPP TS 24.011 */
Bit3 spare3, /* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, /* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference, /* 23.040 cl. 9.2.3.6 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier, /* 23.040 cl. 9.2.3.9 */
TP_Command_Type tP_CommandType, /* 23.040 cl. 9.2.3.19 */
TP_MessageReference_Type tP_MessageNumber, /* 23.040 cl. 9.2.3.18 */
TP_Address_Type tP_DestinationAddress, /* 23.040 cl. 9.1.2.5 */
TP_UserDataLength_Type tP_CommandDataLength, /* 23.040 cl. 9.2.3.20 (number of octets) */
octetstring tP_CommandData length (0..156) optional /* 23.040 cl. 9.2.3.21 */
};
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatRptReq,
/* Table 8.4/3GPP TS 24.011 */
Bit3 spare3,
/* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference,
/* 23.040 cl. 9.2.3.6 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
/* 23.040 cl. 9.2.3.9 */
TP_Command_Type tP_CommandType,
/* 23.040 cl. 9.2.3.19 */
TP_MessageReference_Type tP_MessageNumber,
/* 23.040 cl. 9.2.3.18 */
TP_Address_Type tP_DestinationAddress,
/* 23.040 cl. 9.1.2.5 */
TP_UserDataLength_Type tP_CommandDataLength,
/* 23.040 cl. 9.2.3.20 (number of octets) */
octetstring tP_CommandData length(0 .. 156) optional /* 23.040 cl. 9.2.3.21 */
}
 
type union TP_PDU_Type {
SMS_DELIVER_Type SMS_DELIVER,
SMS_DELIVER_REPORT_Type SMS_DELIVER_REPORT,
SMS_SUBMIT_Type SMS_SUBMIT,
SMS_SUBMIT_REPORT_Type SMS_SUBMIT_REPORT,
SMS_STATUS_REPORT_Type SMS_STATUS_REPORT,
SMS_COMMAND_Type SMS_COMMAND
};
/* End SM-TP PDU Declarations */
} with { encode "SMS Types"} // group SMS_Declarations
SMS_DELIVER_Type SMS_DELIVER,
SMS_DELIVER_REPORT_Type SMS_DELIVER_REPORT,
SMS_SUBMIT_Type SMS_SUBMIT,
SMS_SUBMIT_REPORT_Type SMS_SUBMIT_REPORT,
SMS_STATUS_REPORT_Type SMS_STATUS_REPORT,
SMS_COMMAND_Type SMS_COMMAND
}
 
 
 
/* End SM-TP PDU Declarations */
}
with {
encode "SMS Types";
} // group SMS_Declarations
} // End of module LibSip_SMSTypesAndValues
/trunk/ttcn/LibSip_SimpleMsgSummaryTypes.ttcn
1,59 → 1,57
/**
* @author STF 406
* @version $Id: LibSip_SimpleMsgSummaryTypes.ttcn 488 2010-11-08 10:17:19Z pintar $
* @desc This module provides the SMS type system for SIP tests.
* This module is part of LibSipV2.
*/
module LibSip_SimpleMsgSummaryTypes { // RFC 3842
group SMSConstants{
* @author STF 406, 471
* @version $Id: LibSip_SimpleMsgSummaryTypes.ttcn 488 2010-11-08 10:17:19Z pintar $
* @desc This module provides the SMS type system for SIP tests.
* This module is part of LibSipV3.
*/
module LibSip_SimpleMsgSummaryTypes {
// RFC 3842
group SMSConstants {
 
// IMS ETSI name MWI application
const charstring c_imsEtsiMwiApplication := "application/simple-message-summary";
// msg_status line := "Message-Waiting"
const charstring c_messageWaiting := "Message-Waiting";
// msg_status line := "Message-Account"
const charstring c_messageAccount := "Message-Account";
// msg_summary line := "Voice-Message"
const charstring c_voiceMessage := "Voice-Message";
 
// msg_status line := "Message-Waiting"
const charstring c_messageWaiting := "Message-Waiting";
 
// msg_status line := "Message-Account"
const charstring c_messageAccount := "Message-Account";
 
// msg_summary line := "Voice-Message"
const charstring c_voiceMessage := "Voice-Message";
 
}
group SMSTypes{
//TODO add (SMS sms) into type union MessageBody{ in module LibSIPTypesAndValues
type record SimpleMsgSummary { //Simple_message_summary
 
group SMSTypes {
type record SimpleMsgSummary {
// Simple_message_summary
Msg_status_line msg_status_line,
Msg_account msg_account optional,
Msg_summary_line_list msg_summary_line_list optional,
Opt_msg_headers opt_msg_headers optional
Opt_msg_headers opt_msg_headers optional
}
 
type record Msg_status_line {
charstring msg_type,
charstring msg_status
}
 
type record Msg_account {
charstring msg_type_account,
charstring account_URI
}
 
type set of Msg_summary_line Msg_summary_line_list;
 
type record Msg_summary_line {
charstring msg_context_class,
charstring msgs,
charstring urgent_msgs optional
}
 
type set of charstring Opt_msg_headers;
//type integer msgcount length(1); //msgs and urgent_msgs can be dividet into subtypes
 
 
// type integer msgcount length(1); //msgs and urgent_msgs can be dividet into subtypes
}
 
}
/trunk/ttcn/LibSip_Steps.ttcn
1,4515 → 1,4902
/*
* @author STF 346, STF366, STF368, STF369, STF450
* @version $Id$
* @desc This module provides the types used by the test component
/**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module provides the functions, altsteps and external functions used
* for SIP-IMS tests.
* This module is part of LibSipV2.
*/
* This module is part of LibSipV3.
*/
module LibSip_Steps {
// LibCommon
import from LibCommon_Sync all;
import from LibCommon_VerdictControl all;
// LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_Templates all;
import from LibSip_Interface all;
import from LibSip_PIXITS all;
import from LibSip_XMLTypes all;
 
module LibSip_Steps //MRO
{
//LibCommon
import from LibCommon_Sync all ;
import from LibCommon_VerdictControl all ;
//LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_Templates all;
import from LibSip_Interface all;
import from LibSip_PIXITS all;
import from LibSip_XMLTypes all;
group externalfunctions {
 
group externalfunctions {
//Return random charstring
external function fx_rndStr() return charstring;
// Return the equivalent string in lower case
external function fx_putInLowercase(charstring par_string) return charstring;
external function fx_getIpAddr(charstring host_name) return charstring;
/**
* @desc External function to return random charstring
*/
external function fx_rndStr(
) return charstring;
/**
* @desc External function to return the equivalent string in lower case
*/
external function fx_putInLowercase(
charstring p_string
) return charstring;
 
// External function to generate a digest response.
// References:
// * RFC 2617 HTTP Authentication: Basic and Digest Access
// Authentication, and
// * RFC 1321 The MD5 Message-Digest Algorithm
// See RFC 2617, chapter 5 Sample implementation, for example usage, as
// the signature of calculateDigestResponse is according to the example
// given in the RFC.
//
external function fx_calculateDigestResponse(
charstring nonce,
charstring cnonce,
charstring user,
charstring realm,
charstring passwd,
charstring alg,
charstring nonceCount,
charstring method,
charstring qop,
charstring URI,
charstring HEntity) return charstring;
/**
* @desc External function to get IP address.
*/
external function fx_getIpAddr(
charstring p_host_name
) return charstring;
 
}
/**
* @desc External function to generate a digest response.
* @reference RFC 2617 HTTP Authentication: Basic and Digest Access Authentication, and RFC 1321 The MD5 Message-Digest Algorithm
* @see RFC 2617, chapter 5 Sample implementation, for example usage, as the signature of calculateDigestResponse is according to the example given in the RFC.
*/
external function fx_calculateDigestResponse(
charstring p_nonce,
charstring p_cnonce,
charstring p_user,
charstring p_realm,
charstring p_passwd,
charstring p_alg,
charstring p_nonceCount,
charstring p_method,
charstring p_qop,
charstring p_URI,
charstring p_HEntity
) return charstring;
 
group ParameterOperations {
}
 
/**
*
* @desc function to generate a 32 bits random number as a charstring for tag field
* (used as e.g.: tag in from-header field, or branch parameter in via header)
* @return random value with at least 32 bits of randomness
*
*/
function f_getRndTag() return charstring
{
var charstring tag_value;
//tag_value is initialized with a random value with at least 32 bits of randomness
// 4294967296 is a 32 bits integer
tag_value := fx_rndStr()&fx_rndStr();
return(tag_value);
}
group ParameterOperations {
 
/**
*
* @desc Function to prepare credentials for request that has an empty
* entity body such as a REGISTER message.
* @param p_userprofile to get important parameters
* @return Credentials field
*/
function f_calculatecCredentials_empty(in SipUserProfile p_userprofile, in boolean p_algorithm:=false) return Credentials
{
var template Credentials v_result;
var charstring v_nonce := "";
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm := p_userprofile.registrarDomain;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
var charstring v_response := "";
// Construct credentials for an Authorization field of a request.
if (not p_algorithm) {
v_result :=
{
digestResponse :=
{
{ id := "username", paramValue := v_username },
{ id := "realm", paramValue := v_realm },
{ id := "uri", paramValue := v_uri },
{ id := "nonce=""""", paramValue := omit }, // already enclosed to " characters
{ id := "response=""""", paramValue := omit } // already enclosed to " characters
}};
} else {
v_result :=
{
digestResponse :=
{
{ id := "username", paramValue := v_username },
{ id := "realm", paramValue := v_realm },
{ id := "uri", paramValue := v_uri },
{ id := "nonce=""""", paramValue := omit }, // already enclosed to " characters
{ id := "response=""""", paramValue := omit }, // already enclosed to " characters
{ id := "algorithm", paramValue := PX_AUTH_ALGORITHM } // already enclosed to " characters
}};
}
return valueof(v_result);
}
/**
* @desc function to generate a 32 bits random number as a charstring for tag field (used as e.g.: tag in from-header field, or branch parameter in via header)
* @return random value with at least 32 bits of randomness
*/
function f_getRndTag(
) return charstring {
var charstring v_tag_value;
// tag_value is initialized with a random value with at least 32 bits of randomness
// 4294967296 is a 32 bits integer
v_tag_value := fx_rndStr() & fx_rndStr();
return (v_tag_value);
}
 
/**
* @desc Function to prepare credentials for request that has an empty entity body such as a REGISTER message.
* @param p_userprofile to get important parameters
* @param p_algorithm Algorthm to be used. Default: omit
* @return Credentials field
*/
function f_calculatecCredentials_empty(
in SipUserProfile p_userprofile,
in boolean p_algorithm := false
) return Credentials {
var Credentials v_result;
 
/**
*
* @desc Function to calculate credentials for request that has an empty
* entity body such as a REGISTER message.
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentials(in SipUserProfile p_userprofile, in charstring p_method,
in CommaParam_List p_challenge) return Credentials
{
var template Credentials v_result;
var charstring v_nonce := "";
// Use a fixed client nonce.
var charstring v_cnonce := "1317265";
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm;
// RFC 2617 3.2.2.2 passwd:
// A known shared secret, the password of user of the specified
// username.
var charstring v_passwd := p_userprofile.passwd;
var charstring v_algorithm;
// Use a fixed nonce count.
const charstring c_nonceCount := "00000002";
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm := p_userprofile.registrarDomain;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
var CommaParam_List v_digestResponse := {};
// Construct credentials for an Authorization field of a request.
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := v_username }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := "" }
}); // already enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "response",
paramValue := { quotedString := "" }
}); // already enclosed to " characters
 
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
// MD5 hash of empty entity body.
const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
// extract nonce, realm, algorithm, and opaque from challenge
v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
// calculate a digest response for the Authorize header
v_response := fx_calculateDigestResponse(
v_nonce,
v_cnonce,
v_username,
v_realm,
v_passwd,
v_algorithm,
c_nonceCount,
p_method,
v_qop,
v_uri,
c_hEntity);
// Construct credentials for an Authorization field of a request.
v_result :=
{
digestResponse :=
{
{ id := "username", paramValue := v_username },
{ id := "realm", paramValue := v_realm },
{ id := "nonce", paramValue := v_nonce },
{ id := "uri", paramValue := v_uri },
{ id := "response", paramValue := v_response },
{ id := "algorithm="&v_algorithm, paramValue := omit }, // algorithm is not enclosed to " characters
{ id := "cnonce", paramValue := v_cnonce },
{ id := "opaque", paramValue := v_opaque }, // already enclosed to " characters
{ id := "qop="&v_qop, paramValue := omit },//qop
{ id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
}
};
return valueof(v_result);
}
if (p_algorithm) {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := PX_AUTH_ALGORITHM }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
 
/**
*
* @desc Function to calculate credentials for request that has an empty
* entity body such as a REGISTER message. NO RESPONSE value to cause an error!
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentials_wo_response(in SipUserProfile p_userprofile, in charstring p_method,
in CommaParam_List p_challenge) return Credentials
{
var Credentials v_result;
var charstring v_nonce := "";
// Use a fixed client nonce.
var charstring v_cnonce := "1317265";
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm;
// RFC 2617 3.2.2.2 passwd:
// A known shared secret, the password of user of the specified
// username.
var charstring v_passwd := p_userprofile.passwd;
var charstring v_algorithm;
// Use a fixed nonce count.
const charstring c_nonceCount := "00000002";
return v_result;
}
 
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
// MD5 hash of empty entity body.
const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
// extract nonce, realm, algorithm, and opaque from challenge
v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
// calculate a digest response for the Authorize header
v_response := fx_calculateDigestResponse(
v_nonce,
v_cnonce,
v_username,
v_realm,
v_passwd,
v_algorithm,
c_nonceCount,
p_method,
v_qop,
v_uri,
c_hEntity);
// Construct credentials for an Authorization field of a request.
v_result :=
{
digestResponse :=
{
{ id := "username", paramValue := v_username },
{ id := "realm", paramValue := v_realm },
{ id := "nonce", paramValue := v_nonce },
{ id := "uri", paramValue := v_uri },
// { id := "response", paramValue := v_response }, // not included to cause an error
{ id := "algorithm="&v_algorithm, paramValue := omit }, // algorithm is not enclosed to " characters
{ id := "cnonce", paramValue := v_cnonce },
{ id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
{ id := "qop="&v_qop, paramValue := omit },//qop
{ id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
}
};
return v_result;
}
/**
*
* @desc Function to calculate credentials for response 401 - WWW-Authorization
* @param p_qop of the peer UE (alternatively )
* @param p_authorization parameter from 1st REGISTER request
* @return Credentials field
* @verdict
*/
function f_calculatecChallenge_forWWWAuthorizationBody(in charstring p_qop, in Authorization p_authorization) return Challenge
{
var CommaParam_List v_challenge;
if (ischosen(p_authorization.body[0].digestResponse))
{v_challenge := p_authorization.body[0].digestResponse}
else {v_challenge := p_authorization.body[0].otherResponse.authParams};
return (f_calculatecChallenge_forWWWAuthorization(p_qop,v_challenge));
}
/**
*
* @desc Function to calculate credentials for response 401 - WWW-Authorization
* @param p_qop of the peer UE (alternatively )
* @param p_challenge parameter from 1st REGISTER request
* @return Credentials field
* @verdict
*/
function f_calculatecChallenge_forWWWAuthorization(in charstring p_qop, in CommaParam_List p_challenge) return Challenge
{
var Challenge v_result;
 
var charstring v_realm;
var charstring v_qop := p_qop;
/**
* @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message.
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentials(
in SipUserProfile p_userprofile,
in charstring p_method,
in CommaParam_List p_challenge
) return Credentials {
var Credentials v_result;
var charstring v_nonce := "";
var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
 
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
// Construct credentials for an Authorization field of a request.
v_result :=
{
digestCln :=
{
{ id := "realm", paramValue := v_realm },
{ id := "nonce", paramValue := "0edff6c521cc3f407f2d9e01cf6ed82b"},
{ id := "algorithm", paramValue := PX_AUTH_ALGORITHM/*TODO To be removed c_algorithm*/ }, // algorithm is not enclosed with " characters
{ id := "ck", paramValue := "00112233445566778899aabbccddeeff" },
{ id := "ik", paramValue := "ffeeddccbbaa99887766554433221100" }, // already enclosed to " characters
{ id := "qop="""&v_qop&"""", paramValue := omit }//qop
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm;
 
}
};
return v_result;
}
/**
*
* @desc Function to calculate credentials for request that has an empty
* entity body such as a REGISTER message and at the end put different private name
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentialsAndChangeUserName(in SipUserProfile p_userprofile, in charstring p_method,
in CommaParam_List p_challenge) return Credentials
{
var Credentials v_result;
var charstring v_nonce := "";
// Use a fixed client nonce.
var charstring v_cnonce := "1317265";
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm;
// RFC 2617 3.2.2.2 passwd:
// A known shared secret, the password of user of the specified
// username.
var charstring v_passwd := p_userprofile.passwd;
var charstring v_algorithm;
// Use a fixed nonce count.
const charstring c_nonceCount := "00000002";
// RFC 2617 3.2.2.2 passwd:
// A known shared secret, the password of user of the specified
// username.
var charstring v_passwd := p_userprofile.passwd;
var charstring v_algorithm;
 
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
// MD5 hash of empty entity body.
const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
// extract nonce, realm, algorithm, and opaque from challenge
v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
// calculate a digest response for the Authorize header
v_response := fx_calculateDigestResponse(
v_nonce,
v_cnonce,
v_username,
v_realm,
v_passwd,
v_algorithm,
c_nonceCount,
p_method,
v_qop,
v_uri,
c_hEntity);
// Construct credentials for an Authorization field of a request.
v_result :=
{
digestResponse :=
{
{ id := "username", paramValue := "DifferentToPrivateUser"},
{ id := "realm", paramValue := v_realm },
{ id := "nonce", paramValue := v_nonce },
{ id := "uri", paramValue := v_uri },
{ id := "response", paramValue := v_response },
{ id := "algorithm="&v_algorithm, paramValue := omit }, // algorithm is not enclosed to " characters
{ id := "cnonce", paramValue := v_cnonce },
{ id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
{ id := "qop="&v_qop, paramValue := omit },//qop
{ id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
}
};
return v_result;
}
// a new pseudo-random cnonce value is used every time
// that assumes it is only used once
const charstring cl_nonceCount := "00000001";
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
 
/**
*
* @desc Function to check if param related to id from CommanParam_List exist
* containing challenge.
* @param p_challenge parameter from 4xx response
* @param p_id name of parameter("nonce", "realm", "ck", "ik"...)
* @return parameter p_id value
*/
function f_checkParamValueFromChallengeIfPresent(in CommaParam_List p_challenge, in charstring p_id) return boolean
{
var boolean v_result := false;
var integer v_len := sizeof(p_challenge);
var charstring v_id := fx_putInLowercase(p_id);
for (var integer i := 0; i < v_len; i := i + 1)
{
if (fx_putInLowercase(p_challenge[i].id) == v_id)
{
v_result := true;
}
}
return v_result;
}
/**
*
* @desc Function to check if tag is present in SemicolonParam_List
* @param p_param_l SemicolonParam_List
* @return boolean true if tag is present
*/
function f_checkTagPresent(SemicolonParam_List p_param_l) runs on SipComponent return boolean {
var integer v_numberOfParams;
var integer i := 0;
// MD5 hash of empty entity body.
const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
var CommaParam_List v_digestResponse := {};
 
v_numberOfParams := sizeof (p_param_l);
while (i < v_numberOfParams) {
if (fx_putInLowercase(p_param_l[i].id) == c_tagId) {
return (true);
}
i := i + 1;
}
return (false);
}
 
/**
*
* @desc Function to extract paramValue related to id from CommanParam_List
* containing challenge.
* @param p_challenge parameter from 4xx response
* @param p_id name of parameter("nonce", "realm",...)
* @return parameter p_id value
*/
function f_extractParamValueFromChallenge(in CommaParam_List p_challenge, in charstring p_id) return charstring
{
var charstring v_result := "";
var integer v_len := sizeof(p_challenge);
var charstring v_id := fx_putInLowercase(p_id);
for (var integer i := 0; i < v_len; i := i + 1)
{
if (fx_putInLowercase(p_challenge[i].id) == v_id)
{
v_result := p_challenge[i].paramValue;
}
}
// extract nonce, realm, algorithm, and opaque from challenge
v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
 
if (v_result == "")
{
if(match(p_id,"algorithm"))
{
v_result := "MD5"
}
else if(match(p_id,"opaque"))
{
v_result := ""
}
else
{
var charstring v_tmpchar := "Cannot acquire value from credentials.";
log ("Cannot acquire value from credentials.");
setverdict(inconc);
stop;
}
}
return v_result;
}
}//end group ParameterOperations
// calculate a digest response for the Authorize header
v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
 
group FieldOperations {
// Construct credentials for an Authorization field of a request.
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := v_username }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := v_nonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "response",
paramValue := { quotedString := v_response }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := "md5" }
}); // algorithm is not enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "cnonce",
paramValue := { quotedString := v_cnonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "qop",
paramValue := { tokenOrHost := v_qop }
}); // qop
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nc",
paramValue := { tokenOrHost := cl_nonceCount }
}); // nonceCount
if (v_opaque != "") {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "opaque",
paramValue := { quotedString := v_opaque }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
 
/**
*
* @desc function adds "Tag"-parameter in "To"-headerfield
* @param p_to To header field that should get a Tag parameter
*
*/
function f_addTagInTo(inout To p_to) runs on SipComponent
{
f_addParameterTagIfNotPresent(c_tagId, f_getRndTag(), p_to);
}
return v_result;
}
 
/**
*
* @desc addition of a single parameter in the via header field
* @param p_parameter_name name of parameter to be added
* @param p_parameter_value value of parameter to be added
* @param p_viaBody the via parameter to be extended
* @verdict
*/
function f_addParameterIfNotPresent(
in charstring p_parameter_name,
in charstring p_parameter_value,
inout ViaBody p_viaBody)
{
if (ispresent (p_viaBody.viaParams)) {
return;
}
p_viaBody.viaParams := {
{
p_parameter_name,
p_parameter_value
}
};
}
/**
*
* @desc function to addd a parameter to the "To" header field (if there is not any parameter)
* @param p_parameter_name name of the parameter to be added
* @param p_parameter_value value of the paramter to be added
* @param p_to "To" header field to be extended
* @verdict
*/
function f_addParameterTagIfNotPresent(
in charstring p_parameter_name,
in charstring p_parameter_value,
inout To p_to)
{
if (ispresent (p_to.toParams)) {
return;
}
p_to.toParams := {
{
p_parameter_name,
p_parameter_value
}
};
}
/**
* @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message. NO RESPONSE value to cause an error!
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentials_wo_response(
in SipUserProfile p_userprofile,
in charstring p_method,
in CommaParam_List p_challenge
) return Credentials {
var Credentials v_result;
var charstring v_nonce := "";
var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
 
/**
*
* @desc function compares the IP address of two hosts
* @param p_host1 hostname
* @param p_host2 hostname
* @return boolean value that is true if the IP addresses are identical
* @verdict
*/
function f_equivalentHostAddr(in charstring p_host1, in charstring p_host2) return boolean
{
//A DNS server may be used
return(fx_getIpAddr(p_host1) == fx_getIpAddr(p_host2));
}
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm;
 
// RFC 2617 3.2.2.2 passwd:
// A known shared secret, the password of user of the specified
// username.
var charstring v_passwd := p_userprofile.passwd;
var charstring v_algorithm;
 
/**
*
* @desc function checks if Require contains Precondition
* @param p_message (request or response) SIP message to be analysed
* @return true if p_id parameter exist
*/
function f_checkRequirePrecondition(in Request p_message)
{
if (ispresent(p_message.msgHeader.require))
{
var boolean v_precondition_found:=false;
for (var integer v_i:=0; v_i<sizeof(p_message.msgHeader.require.optionsTags); v_i:=v_i+1){
if (match(p_message.msgHeader.require.optionsTags[v_i],c_tagPrecond)) {
v_precondition_found:=true;
}
}
if (not(v_precondition_found)){
setverdict(fail);
log("FAIL: precondition not found in Require options list!");
}
}
else
{
setverdict(fail);
log("FAIL: Require options is not present!");
}
}
 
/**
*
* @desc function checks if P-Charging-Vector contains a particular parameter
* @param p_message (request or response) SIP message to be analysed
* @param p_id name of parameter
* @return true if p_id parameter exist
*/
function f_checkPChargingVectorHeaderParamId(in Request p_message, charstring p_id) return boolean
{
var integer v_chargeParamsLen;
if (ispresent(p_message.msgHeader.pChargingVector)) {
for (var integer i:=0; i<sizeof(p_message.msgHeader.pChargingVector.chargeParams); i:=i+1)
{if(p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id)
{return (true)}
};
}
return (false)
}
// a new pseudo-random cnonce value is used every time
// that assumes it is only used once
const charstring cl_nonceCount := "00000001";
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
 
/**
*
* @desc function checks if P-Charging-Vector contains a particular parameter
* @param p_message (request or response) SIP message to be analysed
* @param p_id name of parameter
* @return true if p_id parameter exist
*/
function f_checkPChargingVectorHeaderParamIdResponse(in Response p_message, charstring p_id) return boolean
{
var integer v_chargeParamsLen;
if (ispresent(p_message.msgHeader.pChargingVector)) {
for (var integer i:=0; i<sizeof(p_message.msgHeader.pChargingVector.chargeParams); i:=i+1)
{if(p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id)
{return (true)}
};
}
return (false)
}
// MD5 hash of empty entity body.
const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
var CommaParam_List v_digestResponse := {};
 
/**
*
* @desc function returns the Host/Port of a given Contact header field
* @param p_contact contact header field to be analysed
* @return Host/Port record from the contact header field
*/
function f_getContactUri(in ContactAddress p_contact) runs on SipComponent return SipUrl
{
var SipUrl v_SipUrl;
if (ischosen(p_contact.addressField.nameAddr))
{
v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
}
else
{
v_SipUrl := p_contact.addressField.addrSpecUnion;
}
return(v_SipUrl);
} // end f_getContactUri
// extract nonce, realm, algorithm, and opaque from challenge
v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
 
/**
*
* @desc function returns the Host/Port of a given Contact header field
* @param p_contact contact header field to be analysed
* @return Host/Port record from the contact header field
*/
function f_getContactAddr(in ContactAddress p_contact) runs on SipComponent return HostPort
{
var HostPort v_locAddr;
var SipUrl v_SipUrl;
if (ischosen(p_contact.addressField.nameAddr))
{
v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
}
else
{
v_SipUrl := p_contact.addressField.addrSpecUnion;
}
v_locAddr.host := v_SipUrl.components.sip.hostPort.host;
if (ispresent(v_SipUrl.components.sip.hostPort.portField))
{
v_locAddr.portField := v_SipUrl.components.sip.hostPort.portField;
}
else
{
v_locAddr.portField := c_defaultSipPort;
}
return(v_locAddr);
} // end f_getContactAddr
// calculate a digest response for the Authorize header
v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
 
/**
*
* @desc function checks if History-Info-Header of the p_message contains a particular URI
* @param p_message (request or response) SIP message to be analysed
* @param p_URI name of parameter
* @return true if p_URI parameter exist
*/
function f_checkHeaderInfoURI(in Response p_message, SipUrl p_URI) return boolean
{
var integer v_chargeParamsLen;
if (ispresent(p_message.msgHeader.historyInfo)) {
for (var integer i:=0; i<sizeof(p_message.msgHeader.historyInfo.historyInfoList); i:=i+1)
{if(p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI)
{return (true)}
};
}
return (false)
}
/**
*
* @desc function returns the Userinfo from a given To header field
* @param p_to To header field to be analysed
* @return Userinfo from the To header field as a charstring
*/
function f_getUserfromTo(in To p_to) runs on SipComponent return charstring
{
var SipUrl v_SipUrl;
if (ischosen(p_to.addressField.nameAddr))
{
v_SipUrl := p_to.addressField.nameAddr.addrSpec;
}
else
{
v_SipUrl := p_to.addressField.addrSpecUnion;
}
return(v_SipUrl.components.sip.userInfo.userOrTelephoneSubscriber);
} // end f_getUserfromTo
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := v_username }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := v_nonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := "md5" }
}); // algorithm is not enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "cnonce",
paramValue := { quotedString := v_cnonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "qop",
paramValue := { tokenOrHost := v_qop }
}); // qop
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nc",
paramValue := { tokenOrHost := cl_nonceCount }
}); // nonceCount
if (v_opaque == "") {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "opaque",
paramValue := { quotedString := v_opaque }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
 
/**
*
* @desc function to generate a 32 bits random number as a charstring for tag field
* @param p_cSeq_s CSeq parameter used to modify the tag field value
* @return tag value
*/
function f_getRndCallId(inout CSeq p_cSeq_s) return charstring
{
var charstring v_tag_value;
v_tag_value := fx_rndStr()&fx_rndStr();
//v_tag_value is initialized with a random value with at least 32 bits of randomness
// 4294967296 is a 32 bits integer
//v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber );
return(v_tag_value);
}
return v_result;
}
 
/**
*
* @desc function give access to the top element of the Path header field.
* @param p_Request SIP message to be analysed
* @return NameAddr (e.g. <sip:p.home.com>) or omit
*/
function f_getPathHeaderTop(inout Request p_Request) return template NameAddr
{
if (ispresent(p_Request.msgHeader.path)) {
if (sizeof(p_Request.msgHeader.path.pathValues)>0) {
return(p_Request.msgHeader.path.pathValues[0].nameAddr)}
};
return(omit)
}
/**
* @desc Function to calculate credentials for response 401 - WWW-Authorization
* @param p_qop of the peer UE (alternatively )
* @param p_authorization parameter from 1st REGISTER request
* @return Credentials field
* @verdict
*/
function f_calculatecChallenge_forWWWAuthorizationBody(
in charstring p_qop,
in Authorization p_authorization
) return Challenge {
var CommaParam_List v_challenge;
 
/**
*
* @desc function updates first element of a Via headerfield list
* @param p_viaBody_List address list of a Via header field
* @param p_source_address address to be inserted in the top element
*/
function f_getViaReplyAddr(inout ViaBody_List p_viaBody_List, inout address4SIP p_source_address)
runs on SipComponent
{
var ViaBody v_viaBody;
var HostPort v_locAddr;
// The address to send message shall be updated after getting information
// in the Via header fied and according to 18.2.2
v_viaBody := p_viaBody_List[0];
// received parameter has to be addded to the via hader field
// Be careful it could be an Host name and not an IP Address
if (ischosen(p_authorization.body[0].digestResponse)) {
v_challenge := p_authorization.body[0].digestResponse;
}
else {
v_challenge := p_authorization.body[0].otherResponse.authParams;
}
 
// TODO produce an error because of unkown host exception
//if (not f_equivalentHostAddr(valueof (v_viaBody.sentBy.host),
// valueof (p_source_address.host))) {
f_addParameterIfNotPresent(
c_receivedId,
valueof (p_source_address.host),
v_viaBody);
//}
if (ispresent(v_viaBody.sentBy.portField))
{
p_source_address.portField := valueof(v_viaBody.sentBy.portField);
}
else
{
p_source_address.portField := c_defaultSipPort;
}
}
/**
*
* @desc functions give access to an element of the Route header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of Route record element to be retrieved
* @return HostPort value of the Route element or omit
*/
function f_getRouteHeaderElementAddressFromRequest(in Request p_message, in integer p_index) return HostPort
{
if (ispresent(p_message.msgHeader.route)) {
if (sizeof(p_message.msgHeader.route.routeBody)>p_index) {
return(p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort)}
};
setverdict(fail);
return(c_hostport_dummy)
}
return (f_calculatecChallenge_forWWWAuthorization(p_qop, v_challenge));
}
 
/**
*
* @desc functions give access to an element of the Record-Route header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of recordRoute record element to be retrieved
* @return HostPort value of the Record-Route element or omit
*/
function f_getRecordRouteHeaderElementAddressFromRequest(in Request p_message, in integer p_index) return HostPort
{
if (ispresent(p_message.msgHeader.recordRoute)) {
if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort)}
};
setverdict(fail);
return(c_hostport_dummy)
}
/**
*
* @desc functions give access to an element of the Record-Route header field (record).
* @param p_message (response) SIP message to be analysed
* @param p_index index of recordRoute record element to be retrieved
* @return HostPort value of the Record-Route element or omit
*/
function f_getRecordRouteHeaderElementAddressFromResponse(in Response p_message, in integer p_index) return HostPort
{
if (ispresent(p_message.msgHeader.recordRoute)) {
if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort)}
};
setverdict(fail);
return(c_hostport_dummy)
}
/**
*
* @desc functions give access to an element of the Via header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of via record element to be retrieved
* @return HostPort value of the Via element or omit
*/
function f_getViaHeaderElementHostPort(in Request p_message, in integer p_index) return HostPort
{
if (sizeof(p_message.msgHeader.via.viaBody)>p_index) {
return(p_message.msgHeader.via.viaBody[p_index].sentBy)}
setverdict(fail);
return(c_hostport_dummy)
}
/**
*
* @desc functions give access to an element of the Via header field (record).
* @param p_message (response) SIP message to be analysed
* @param p_index index of via record element to be retrieved
* @return HostPort value of the Via element or omit
*/ function f_getViaHeaderElementHostPortResponse(in Response p_message, in integer p_index) return HostPort
{
if (sizeof(p_message.msgHeader.via.viaBody)>p_index) {
return(p_message.msgHeader.via.viaBody[p_index].sentBy)}
setverdict(fail);
return(c_hostport_dummy)
}
/**
*
* @desc function checks indicators if topology hiding (TH) has been applied:
* - second element in via-header record has tokenized-by parameter
* @param p_Request SIP message to be analysed
* @return boolean value (true indicate TH, false otherwise)
*/
function f_topologyHiding(inout Request p_request) runs on SipComponent return boolean
{ var GenericParam v_viaParameter;
if (sizeof(p_request.msgHeader.via.viaBody)<2)
{return(false)};
v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0]; // second element
if (not v_viaParameter.id == "tokenized-by")
{return(false)};
return(true)
}
/**
* @desc Function to calculate credentials for response 401 - WWW-Authorization
* @param p_qop of the peer UE (alternatively )
* @param p_challenge parameter from 1st REGISTER request
* @return Credentials field
* @verdict
*/
function f_calculatecChallenge_forWWWAuthorization(
in charstring p_qop,
in CommaParam_List p_challenge
) return Challenge {
var Challenge v_result;
 
/**
*
* @desc function checks indicators if topology hiding (TH) has been applied:
* - any element in via-header record has tokenized-by parameter
* @param Response SIP message to be analysed
* @return boolean value (true indicate TH, false otherwise)
*/
function f_topologyHidingResponse(inout Response p_response) runs on SipComponent return boolean
{
var GenericParam v_viaParameter;
log(p_response.msgHeader);
for (var integer v_i := 0; v_i < sizeof(p_response.msgHeader.via.viaBody); v_i := v_i + 1) {
v_viaParameter := p_response.msgHeader.via.viaBody[v_i].viaParams[0]; // first parameter
var charstring v_realm;
 
if (not v_viaParameter.id == "tokenized-by")
{return(false)}
}
return(true);
}
var charstring v_qop := p_qop;
 
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
 
group SetHeaders {
// Construct credentials for an Authorization field of a request.
v_result := {
digestCln := {
{
id := "realm",
paramValue := { quotedString := v_realm }
},
{
id := "nonce",
paramValue := { quotedString := "0edff6c521cc3f407f2d9e01cf6ed82b" }
},
{
id := "algorithm",
paramValue := { tokenOrHost := PX_AUTH_ALGORITHM }
}, // algorithm is not enclosed with " characters
{
id := "ck",
paramValue := { quotedString := "00112233445566778899aabbccddeeff" }
},
{
id := "ik",
paramValue := { quotedString := "ffeeddccbbaa99887766554433221100" }
}, // already enclosed to " characters
{
/**
* This directive is optional, but is made so only for backward compatibility with RFC 2069
* it SHOULD be used by all implementations compliant with this version of the Digest scheme
*/
id := "qop",
paramValue := { tokenOrHost := v_qop }
} // qop
}
};
 
return v_result;
}
 
/**
*
* @desc function for setting of component variables related to message header fields
* (message type independent: CSeq, contact, via), function uses information from userprofile
*
* @param p_cSeq_s CSeq parameter
* @param p_method method name for cSeq header field
*/
function f_setHeadersGeneral(inout CSeq p_cSeq_s, in charstring p_method) runs on SipComponent
{
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)));
/**
* @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message and at the end put different private name
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentialsAndChangeUserName(
in SipUserProfile p_userprofile,
in charstring p_method,
in CommaParam_List p_challenge
) return Credentials {
var Credentials v_result;
var charstring v_nonce := "";
var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
 
vc_branch := c_branchCookie & f_getRndTag();
vc_via:={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
}// end function f_setHeadersGeneral
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm;
 
// RFC 2617 3.2.2.2 passwd:
// A known shared secret, the password of user of the specified
// username.
var charstring v_passwd := p_userprofile.passwd;
var charstring v_algorithm;
 
/**
*
* @desc function for setting of component variables related to message header fields
* (message type independent: CSeq, contact, via), function uses information from userprofile
*
* @param p_cSeq_s CSeq parameter
* @param p_method method name for cSeq header field
*/
function f_setHeadersACK() runs on SipComponent
{
// vc_requestUri.hostPort := vc_reqHostPort;
if(vc_response.statusLine.statusCode >= 200 and vc_response.statusLine.statusCode <= 299 ) //ref. RFC3261 8.1.1.7 Via
{
vc_branch := c_branchCookie & f_getRndTag();
}
vc_via:={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
}// end function f_setHeadersGeneral
/**
*
* @desc setting of general and basic Bye header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersBYE(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "BYE"); // cseq, contact, branch, via
 
//vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
// a new pseudo-random cnonce value is used every time
// that assumes it is only used once
const charstring cl_nonceCount := "00000001";
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
 
f_addTagInTo(vc_to);
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersBYE
/**
*
* @desc setting of general and basic CANCEL header fields
* @param p_cSeq_s
*/
function f_setHeadersCANCEL(inout CSeq p_cSeq_s) runs on SipComponent
{
// MD5 hash of empty entity body.
const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
var CommaParam_List v_digestResponse := {};
 
p_cSeq_s.method := "CANCEL";
//vc_branch := c_branchCookie & f_getRndTag(); // STF 406: CANCEL and ACK should have the same branch as the INVITE
vc_via:={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
}// end function f_setHeadersCANCEL
 
/**
*
* @desc function sets header field for the next outgoing REGISTER message
* @param p_cSeq_s CSeq parameter to be applied
*/
function f_setHeaders_REGISTER(inout CSeq p_cSeq_s, boolean p_emergency:=false) runs on SipComponent
{
var SemicolonParam_List v_params;
// extract nonce, realm, algorithm, and opaque from challenge
v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
 
f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
// calculate a digest response for the Authorize header
v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
 
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; //remember callId for de-registration
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
vc_cancel_To := vc_to;
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)
{
if (p_emergency) {
v_params := { { "sos", omit } };
vc_contact.contactBody.contactAddresses[0].addressField.addrSpecUnion.urlParameters := v_params;
} else {
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)}
}
vc_via_REG := vc_via;
}// end function setHeaders_REGISTER
// Construct credentials for an Authorization field of a request.
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := "DifferentToPrivateUser" }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := v_nonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "response",
paramValue := { quotedString := v_response }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := "md5" }
}); // algorithm is not enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "cnonce",
paramValue := { quotedString := v_cnonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "qop",
paramValue := { tokenOrHost := v_qop }
}); // qop
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nc",
paramValue := { tokenOrHost := cl_nonceCount }
});
if (v_opaque != "") {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "opaque",
paramValue := { quotedString := "" }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
 
/**
*
* @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
* @verdict
*/
function f_setHeaders_2ndREGISTER(inout CSeq p_cSeq_s) runs on SipComponent
{
var CommaParam_List v_challenge;
//Increment CSeq sequence number
p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
vc_cSeq := p_cSeq_s;
vc_requestUri:=
{
scheme := c_sipScheme,
components := {sip:={
userInfo := omit,
hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit}}},
urlParameters := omit,
headers := omit
};
//new branch tag due to different branch tag in new REGISTER method
vc_branch := c_branchCookie & f_getRndTag();
return v_result;
}
 
vc_via_REG :={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
// Extract challenge and calculate credentials for a response.
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
// Prepair right answer
vc_authorization :=
{
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)}
}
}// end function f_setHeaders_2ndREGISTER
 
/**
*
* @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
* NO response in Authorization header to cause an error
* @verdict
*/
function f_setHeaders_2ndREGISTER_wo_response() runs on SipComponent
{
var CommaParam_List v_challenge;
vc_branch := c_branchCookie & f_getRndTag();
/**
* @desc Function to check if param related to id from CommanParam_List exist containing challenge.
* @param p_challenge parameter from 4xx response
* @param p_id name of parameter("nonce", "realm", "ck", "ik"...)
* @return parameter p_id value
*/
function f_checkParamValueFromChallengeIfPresent(
in CommaParam_List p_challenge,
in charstring p_id
) return boolean {
var boolean v_result := false;
var integer v_len := lengthof(p_challenge);
var charstring v_id := fx_putInLowercase(p_id);
var integer i;
for (i := 0; i < v_len; i := i + 1) {
if (fx_putInLowercase(p_challenge[i].id) == v_id) {
v_result := true;
}
}
 
vc_via_REG :={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
if(ischosen(vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge))
// Extract challenge and calculate credentials for a response.
{
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
}
else
{
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
}
// Increment CSeq sequence number
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
// Prepair right answer
vc_authorization :=
{
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)}
}
}// end function f_setHeaders_2ndREGISTER_wo_response
return v_result;
}
 
/**
*
* @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER
* @verdict
*/
function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName() runs on SipComponent
{
var CommaParam_List v_challenge;
vc_branch := c_branchCookie & f_getRndTag();
vc_requestUri:=
{
scheme := c_sipScheme,
components := {sip:={
userInfo := omit,
hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit}}},
urlParameters := omit,
headers := omit
};
/**
* @desc Function to check if tag is present in SemicolonParam_List
* @param p_param_l SemicolonParam_List
* @return boolean true if tag is present
*/
function f_checkTagPresent(
SemicolonParam_List p_param_l
) runs on SipComponent
return boolean {
var integer v_numberOfParams;
var integer i := 0;
 
vc_via_REG :={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
// Extract challenge and calculate credentials for a response.
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
// Increment CSeq sequence number
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
// Prepair right answer
vc_authorization :=
{
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)}
}
}// end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName
v_numberOfParams := lengthof(p_param_l);
while (i < v_numberOfParams) {
if (fx_putInLowercase(p_param_l[i].id) == c_tagId) {
return (true);
}
i := i + 1;
}
return (false);
}
 
/**
* @desc Function to remove a parameter from SemicolonParam_List
* @param p_param_l SemicolonParam_List
* @return SemicolonParam_List new parameter list
*/
function f_removeParameter(
SemicolonParam_List p_param_l,
charstring p_id
) runs on SipComponent
return SemicolonParam_List {
var integer v_numberOfParams;
var integer i := 0;
var integer j := 0;
var SemicolonParam_List v_newParamList;
 
/**
*
* @desc function sets header fields for the next outgoing REGISTER (de-registration)
* @param p_cSeq_s cSeq to be used
* @verdict
*/
function f_setHeaders_deREGISTER(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_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
};
vc_via_REG :={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
//set of empty authorization header to avoid setting of different values of nonce count and response
vc_authorization :=
{
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_empty(vc_userprofile)}
v_numberOfParams := lengthof(p_param_l);
while (i < v_numberOfParams) {
if (not fx_putInLowercase(p_param_l[i].id) == p_id) {
v_newParamList[j] := p_param_l[i];
j := j + 1;
}
i := i + 1;
}
return v_newParamList;
}
//TODO: delete 2nd solution of deregistration when other is working
vc_contact.contactBody.contactAddresses[0].contactParams := {{"expires","0"}};
// TODO: 1st solution of deRegistration: Cancelation of Registration due to RFC3665/2.4
// vc_contact :=
// {
// fieldName := CONTACT_E,
// contactBody := {wildcard := "*" }
// };
 
/**
* @desc Function to add a parameter to SemicolonParam_List
* @param p_param_l SemicolonParam_List
* @return SemicolonParam_List new parameter list
*/
function f_addParameter(
SemicolonParam_List p_param_l,
GenericParam p_genparam
)
return SemicolonParam_List {
var SemicolonParam_List v_newParamList := p_param_l;
var integer v_numberOfParams := lengthof(p_param_l);
v_newParamList[v_numberOfParams] := p_genparam;
return v_newParamList;
}
 
/**
* @desc Function to extract paramValue related to id from CommanParam_List containing challenge.
* @param p_challenge parameter from 4xx response
* @param p_id name of parameter("nonce", "realm",...)
* @return parameter p_id value
*/
function f_extractParamValueFromChallenge(
in CommaParam_List p_challenge,
in charstring p_id
) return charstring {
var charstring v_result := "";
var integer v_len := lengthof(p_challenge);
var charstring v_id := fx_putInLowercase(p_id);
var integer i;
var charstring v_tmpchar;
 
} // end function f_setHeaders_deREGISTER
for (i := 0; i < v_len; i := i + 1) {
if (fx_putInLowercase(p_challenge[i].id) == v_id) {
if (isvalue(p_challenge[i].paramValue)) {
if(ischosen(p_challenge[i].paramValue.quotedString)) {
v_result := valueof(p_challenge[i].paramValue.quotedString);
} else {
v_result := valueof(p_challenge[i].paramValue.tokenOrHost);
}
}
}
}
 
if (v_result == "") {
if (match(p_id, "algorithm")) {
v_result := "MD5";
}
else if (match(p_id, "opaque")) {
v_result := "";
}
else {
v_tmpchar := "Cannot acquire value from credentials.";
log("*** " & __SCOPE__ &": INFO: Cannot acquire value from credentials ***");
setverdict(inconc);
stop;
}
}
 
/**
*
* @desc setting of general and basic Invite header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersINVITE(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via
return v_result;
}
 
vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
/**
* @desc Return the updated component variable of via header
* @return component variable of via header
*/
function f_updateViaHeaderAS(
in Via p_via
) runs on SipComponent
return Via {
var Via v_via;
var ViaBody_List v_viaBody_List := p_via.viaBody;
var integer v_size_via := lengthof(v_viaBody_List);
var integer v_size_via_updated := v_size_via + 1;
var ViaBody_List v_viaBody_List_updated;
var integer i;
vc_branch := c_branchCookie & f_getRndTag();
v_viaBody_List_updated[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile));
// p_viaBody_List_updated[0 ] := vc_request.msgHeader.route.routeBody[0 ] ;
for (i := 1; i < v_size_via_updated; i := i + 1) {
v_viaBody_List_updated[i] := v_viaBody_List[i - 1];
}
v_via.fieldName := p_via.fieldName;
v_via.viaBody := v_viaBody_List_updated;
return (v_via);
}
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
/**
* @desc Return the updated component variable of route header
* @return component variable of route header
*/
function f_updateRouteHeaderAS(
in Route p_route
) runs on SipComponent
return Route {
var Route v_route;
var RouteBody_List v_routeBody_List := p_route.routeBody;
var integer v_size_route := lengthof(v_routeBody_List);
var integer v_size_route_updated := v_size_route - 1;
var RouteBody_List v_routeBody_List_updated;
var integer i;
 
if (ischosen(vc_requestUri.components.sip)) { // sip/sips call
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} else if (ischosen(vc_requestUri.components.urn)) { // Emergency call
vc_reqUrnUri := vc_requestUri.components.urn;
} else {
log ("f_setHeadersINVITE: unsupported field: ", vc_requestUri);
setverdict(fail);
}
}// end function f_setHeadersINVITE
/**
*
* @desc setting of general and basic Update header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersUPDATE(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "UPDATE"); // cseq, contact, branch, via
for (i := 0; i < v_size_route_updated; i := i + 1) {
v_routeBody_List_updated[i] := v_routeBody_List[i + 1];
}
v_route.fieldName := p_route.fieldName;
v_route.routeBody := v_routeBody_List_updated;
return (v_route);
}
 
vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
/**
* @desc Return the updated component variable of record route header
* @return component variable of record route header
*/
function f_updateRecordRouteHeaderAS(
in template(value) RecordRoute p_recordRoute
) runs on SipComponent
return RecordRoute {
var
RecordRoute
v_recordRoute :=
valueof(
m_recordRoute_currIpAddr_params(
vc_userprofile,
{
{
"lr",
omit
}
}
)
);
var integer v_size_recordRoute := 0;
var integer i;
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersUPDATE
if (isvalue(p_recordRoute)) {
v_size_recordRoute := lengthof(valueof(p_recordRoute).routeBody);
}
for (i := 1; i < v_size_recordRoute + 1; i := i + 1) {
v_recordRoute.routeBody[i] := valueof(p_recordRoute).routeBody[i - 1];
}
 
/**
*
* @desc setting of general and basic Message header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersMESSAGE(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via
return (v_recordRoute);
}
 
vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersMESSAGE
 
/**
*
* @desc setting of general and basic Notify header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersNOTIFY(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersNOTIFY
} // end group ParameterOperations
 
/**
*
* @desc setting of general and basic Publish header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersPUBLISH(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "PUBLISH"); // cseq, contact, branch, via
//after SUBSCRIBE message callid shall be same
//vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
group FieldOperations {
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersPUBLISH
/**
* @desc function adds "Tag"-parameter in "To"-headerfield
* @param p_to To header field that should get a Tag parameter
*/
function f_addTagInTo(
inout To p_to
) runs on SipComponent {
f_addParameterTagIfNotPresent(c_tagId, { tokenOrHost := f_getRndTag() }, p_to);
}
 
/**
*
* @desc function sets header field for the next outgoing SUBSCRIBE message
* @param p_cSeq_s CSeq parameter to be applied
*/
function f_setHeaders_SUBSCRIBE(inout CSeq p_cSeq_s) runs on SipComponent
{
var SemicolonParam_List v_params;
f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
vc_requestUri:=valueof(m_SipUrl_currDomain(vc_userprofile));
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_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
vc_cancel_To := vc_to;
v_params := {{id := c_tagId, paramValue := f_getRndTag()}};
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
}// end function setHeaders_SUBSCRIBE
/**
*
* @desc setting of general and basic Subscribe header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersSUBSCRIBE(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
/**
* @desc addition of a single parameter in the via header field
* @param p_parameter_name name of parameter to be added
* @param p_parameter_value value of parameter to be added
* @param p_viaBody the via parameter to be extended
* @verdict
*/
function f_addParameterIfNotPresent(
in charstring p_parameter_name,
in GenValue p_parameter_value,
inout ViaBody p_viaBody
) {
if (isvalue(p_viaBody.viaParams)) {
return;
}
p_viaBody.viaParams := {
{
p_parameter_name,
p_parameter_value
}
};
}
 
vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
/**
* @desc function to addd a parameter to the "To" header field (if there is not any parameter)
* @param p_parameter_name name of the parameter to be added
* @param p_parameter_value value of the paramter to be added
* @param p_to "To" header field to be extended
* @verdict
*/
function f_addParameterTagIfNotPresent(
in charstring p_parameter_name,
in GenValue p_parameter_value,
inout To p_to
) {
if (isvalue(p_to.toParams)) {
return;
}
p_to.toParams := {
{
p_parameter_name,
p_parameter_value
}
};
}
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersMESSAGE
/**
*
* @desc setting of general and basic REFER header fields
* in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersREFER(inout CSeq p_cSeq_s) runs on SipComponent
{
f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via
/**
* @desc function compares the IP address of two hosts
* @param p_host1 hostname
* @param p_host2 hostname
* @return boolean value that is true if the IP addresses are identical
* @verdict
*/
function f_equivalentHostAddr(
in charstring p_host1,
in charstring p_host2
) return boolean {
// A DNS server may be used
return (fx_getIpAddr(p_host1) == fx_getIpAddr(p_host2));
}
 
//vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}// end function f_setHeadersREFER
/**
* @desc function checks if Require contains Precondition
* @param p_message (request or response) SIP message to be analysed
* @return true if p_id parameter exist
*/
function f_checkRequirePrecondition(
in Request p_message
) {
var boolean v_precondition_found;
var integer i;
if (isvalue(p_message.msgHeader.require)) {
v_precondition_found := false;
for (i := 0; i < lengthof(p_message.msgHeader.require.optionsTags); i := i + 1) {
if (match(p_message.msgHeader.require.optionsTags[i], c_tagPrecond)) {
v_precondition_found := true;
}
}
if (not (v_precondition_found)) {
setverdict(fail);
log("*** " & __SCOPE__ & ": FAIL: precondition not found in Require options list! ***");
}
}
else {
setverdict(fail);
log("*** " & __SCOPE__ & ": FAIL: Require options is not present! ***");
}
}
 
/**
*
* @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer
* @param p_Request REGISTER that has been received
*/
function f_setHeadersOnReceiptOfREGISTER(Request p_Request)
runs on SipComponent {
/**
* @desc function checks if P-Charging-Vector contains a particular parameter
* @param p_message (request or response) SIP message to be analysed
* @param p_id name of parameter
* @return true if p_id parameter exist
*/
function f_checkPChargingVectorHeaderParamId(
in Request p_message,
charstring p_id
) return boolean {
var integer i;
 
f_setHeadersOnReceiptOfRequest(p_Request);
vc_callId := p_Request.msgHeader.callId;
vc_caller_From := vc_from;
f_addTagInTo(vc_to);
vc_caller_To := vc_to;
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
if (ispresent(p_Request.msgHeader.contact) and (not ischosen(p_Request.msgHeader.contact.contactBody.wildcard))) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams};
vc_callee_From := {fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams};
if (isvalue(p_message.msgHeader.pChargingVector)) {
for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) {
if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) {
return (true);
}
}
}
return (false);
}
 
if (ispresent(p_Request.msgHeader.authorization)) {
vc_authorization := p_Request.msgHeader.authorization;
};
} // end f_setHeadersOnReceiptOfREGISTER
/**
* @desc function checks if P-Charging-Vector contains a particular parameter
* @param p_message (request or response) SIP message to be analysed
* @param p_id name of parameter
* @return true if p_id parameter exist
*/
function f_checkPChargingVectorHeaderParamIdResponse(
in Response p_message,
charstring p_id
) return boolean {
var integer i;
 
/**
*
* @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer
* @param p_Request SUBSCRIBE that has been received
*/
function f_setHeadersOnReceiptOfSUBSCRIBE(Request p_Request)
runs on SipComponent {
if (isvalue(p_message.msgHeader.pChargingVector)) {
for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) {
if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) {
return true;
}
}
}
return (false);
}
 
f_setHeadersOnReceiptOfRequest(p_Request);
vc_callId := p_Request.msgHeader.callId;
vc_caller_From := vc_from;
f_addTagInTo(vc_to);
vc_caller_To := vc_to;
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
if (ispresent(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams};
vc_callee_From := {fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams};
} // end f_setHeadersOnReceiptOfSUBSCRIBE
function f_setHeadersOnReceiptOfREFER(Request p_Request)
runs on SipComponent {
/**
* @desc function returns the Host/Port of a given Contact header field
* @param p_contact contact header field to be analysed
* @return Host/Port record from the contact header field
*/
function f_getContactUri(
in ContactAddress p_contact
) runs on SipComponent
return SipUrl {
var SipUrl v_SipUrl;
 
f_setHeadersOnReceiptOfRequest(p_Request);
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
if (ispresent(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
if (ischosen(p_contact.addressField.nameAddr)) {
v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
}
else {
v_SipUrl := p_contact.addressField.addrSpecUnion;
}
 
return (v_SipUrl);
} // end f_getContactUri
 
/**
* @desc function returns the Host/Port of a given Contact header field
* @param p_contact contact header field to be analysed
* @return Host/Port record from the contact header field
*/
function f_getContactAddr(
in ContactAddress p_contact
) runs on SipComponent
return HostPort {
var HostPort v_locAddr;
var SipUrl v_SipUrl;
 
if (ischosen(p_contact.addressField.nameAddr)) {
v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
}
else {
v_SipUrl := p_contact.addressField.addrSpecUnion;
}
 
v_locAddr.host := v_SipUrl.components.sip.hostPort.host;
 
if (isvalue(v_SipUrl.components.sip.hostPort.portField)) {
v_locAddr.portField := v_SipUrl.components.sip.hostPort.portField;
}
else {
v_locAddr.portField := c_defaultSipPort;
}
 
return (v_locAddr);
} // end f_getContactAddr
 
/**
* @desc function checks if History-Info-Header of the p_message contains a particular URI
* @param p_message (request or response) SIP message to be analysed
* @param p_URI name of parameter
* @return true if p_URI parameter exist
*/
function f_checkHeaderInfoURI(
in Response p_message,
SipUrl p_URI
) return boolean {
var integer i;
 
if (isvalue(p_message.msgHeader.historyInfo)) {
for (i := 0; i < lengthof(p_message.msgHeader.historyInfo.historyInfoList); i := i + 1) {
if (p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI) {
return (true);
}
}
}
return (false);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams};
vc_callee_From := {fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams};
} // end f_setHeadersOnReceiptOfSUBSCRIBE
/**
*
* @desc function reads all necessary headers from
* the received INVITE message and generate the tag for the answer
* @param p_Request received INVITE message
* @verdict
*/
function f_setHeadersOnReceiptOfINVITE(Request p_Request) runs on SipComponent {
 
f_setHeadersOnReceiptOfRequest(p_Request);
/**
* @desc function returns the Userinfo from a given To header field
* @param p_to To header field to be analysed
* @return Userinfo from the To header field as a charstring
*/
function f_getUserfromTo(
in To p_to
) runs on SipComponent
return charstring {
var SipUrl v_SipUrl;
 
vc_callId := p_Request.msgHeader.callId;
if (ischosen(p_to.addressField.nameAddr)) {
v_SipUrl := p_to.addressField.nameAddr.addrSpec;
}
else {
v_SipUrl := p_to.addressField.addrSpecUnion;
}
 
vc_requestUri2 := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
f_addTagInTo(vc_to);
vc_caller_From := vc_from;
vc_caller_To := vc_to;
if (ispresent(p_Request.msgHeader.contact)) {
vc_reqHostPort :=
f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
};
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams};
vc_callee_From := {fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams};
if (ispresent(p_Request.msgHeader.privacy)) {
vc_privacy := p_Request.msgHeader.privacy;
};
if (ispresent(p_Request.messageBody)) {
//cleaning of attributes before assignment
if (ispresent(vc_sdp_remote.media_list))
{
var integer v_length := sizeof(vc_sdp_remote.media_list);
for (var integer i:=0; i<v_length; i:=i+1)
{
if (ispresent(vc_sdp_remote.media_list[i].attributes))
{
vc_sdp_remote.media_list[i].attributes := omit ;
}
};
}
// save SDP if present
if ( ischosen(p_Request.messageBody.sdpMessageBody))
{
vc_sdp_remote := p_Request.messageBody.sdpMessageBody;
vc_sdp_remote_is_valid := true;
f_prepare_SDP_answer();
};
// save XML if present
if ( ischosen(p_Request.messageBody.xmlBody))
{
vc_xml_remote := p_Request.messageBody.xmlBody;
}
return (v_SipUrl.components.sip.userInfo.userOrTelephoneSubscriber);
} // end f_getUserfromTo
 
if ( ischosen(p_Request.messageBody.mimeMessageBody))
{
for (var integer j:=0; j<sizeof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j:=j+1){
if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_sdpAplication))
{
vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
vc_sdp_remote_is_valid := true;
f_prepare_SDP_answer();
};
if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_xmlAplication))
{
vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
};
}
}
};
if (ispresent(p_Request.msgHeader.supported.optionsTags)) {
for (var integer i := sizeof(p_Request.msgHeader.supported.optionsTags); i>0; i:=i-1)
{
if (p_Request.msgHeader.supported.optionsTags[i-1]=="100rel")
{ vc_supported_100rel := true };
if (p_Request.msgHeader.supported.optionsTags[i-1]=="precondition")
{ vc_supported_precondition := true }
}
};
} // end f_setHeadersOnReceiptOfINVITE
/**
* @desc function to generate a 32 bits random number as a charstring for tag field
* @param p_cSeq_s CSeq parameter used to modify the tag field value
* @return tag value
*/
function f_getRndCallId(
) return charstring {
var charstring v_tag_value := fx_rndStr() & fx_rndStr();
// v_tag_value is initialized with a random value with at least 32 bits of randomness
// 4294967296 is a 32 bits integer
// v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber );
return (v_tag_value);
}
 
/**
*
* @desc function reads header field of a received BYE message
* @param p_Request received BYE
*/
function f_setHeadersOnReceiptOfBYE(Request p_BYE_Request)
runs on SipComponent
{
f_setHeadersOnReceiptOfRequest(p_BYE_Request);
vc_callId := p_BYE_Request.msgHeader.callId;
/**
* @desc function give access to the top element of the Path header field.
* @param p_Request SIP message to be analysed
* @return NameAddr (e.g. <sip:p.home.com>) or omit
*/
function f_getPathHeaderTop(
inout Request p_Request
) return template(omit) NameAddr {
if (isvalue(p_Request.msgHeader.path)) {
if (lengthof(p_Request.msgHeader.path.pathValues) > 0) {
return (p_Request.msgHeader.path.pathValues[0].nameAddr);
}
}
return (omit);
}
 
} // end f_setHeadersOnReceiptOfBYE
/**
* @desc function updates first element of a Via headerfield list
* @param p_viaBody_List address list of a Via header field
* @param p_source_address address to be inserted in the top element
*/
function f_getViaReplyAddr(
inout ViaBody_List p_viaBody_List,
inout Address4SIP p_source_address
) runs on SipComponent {
var ViaBody v_viaBody;
// The address to send message shall be updated after getting information
// in the Via header fied and according to 18.2.2
v_viaBody := p_viaBody_List[0];
 
/**
*
* @desc function reads header field from an incoming Request message
* @param p_Request received Request message
*/
function f_setHeadersOnReceiptOfRequest(Request p_Request) runs on SipComponent {
vc_request := p_Request;
vc_callId := p_Request.msgHeader.callId;
vc_cSeq := p_Request.msgHeader.cSeq;
vc_iut_CSeq := p_Request.msgHeader.cSeq;
vc_from := p_Request.msgHeader.fromField;
vc_caller_From := p_Request.msgHeader.fromField;
vc_to := p_Request.msgHeader.toField;
vc_caller_To := p_Request.msgHeader.toField;
vc_via := p_Request.msgHeader.via;
// update sent_label according to received via header field
f_getViaReplyAddr(vc_via.viaBody, vc_sent_label);
// Catch route
vc_boo_recordRoute:=false;
//add tag field into To header if tag is not present
if (not(ispresent(p_Request.msgHeader.toField.toParams)))
{
vc_to.toParams := {{id := c_tagId, paramValue := f_getRndTag()}};
vc_caller_To := vc_to;
}
if (ispresent(p_Request.msgHeader.recordRoute))
{
vc_boo_recordRoute:=true;
vc_recordRoute := p_Request.msgHeader.recordRoute;
}
if (ispresent(p_Request.msgHeader.route))
{
//used in case when route header is received (isc interface)
vc_route := p_Request.msgHeader.route;
}
} // end f_setHeadersOnReceiptOfRequest
// received parameter has to be addded to the via hader field
// Be careful it could be an Host name and not an IP Address
// One of the reasons this error can occur is if no DNS server is available.
// As a workaround, it is possible to adapt the configuration on the local machine the test
// suite is running on (e.g. under Windows the following file could be configured:
// C:\WINDOWS\system32\drivers\etc\hosts).
// Check if host address can be rosolved
if (not f_equivalentHostAddr(valueof(v_viaBody.sentBy.host), valueof(p_source_address.host))) {
f_addParameterIfNotPresent(c_receivedId, { tokenOrHost := valueof(p_source_address.host) }, v_viaBody);
}
if (isvalue(v_viaBody.sentBy.portField)) {
p_source_address.portField := valueof(v_viaBody.sentBy.portField);
}
else {
p_source_address.portField := c_defaultSipPort;
}
}
 
/**
*
* @desc functions reads header fields from an incoming Response message
* @param p_cSeq
* @param p_response received response message
* @verdict
*/
function f_setHeadersOnReceiptOfResponse(inout CSeq p_cSeq, Response p_response) runs on SipComponent
{
var integer v_i, v_j, v_nbroute;
var Contact v_contact; //only for local purpose
vc_response := p_response;
//vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq
vc_to :=p_response.msgHeader.toField;
vc_from :=p_response.msgHeader.fromField;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
if (ispresent(p_response.msgHeader.contact))
{
v_contact := p_response.msgHeader.contact;
if (ischosen(v_contact.contactBody.contactAddresses))
{
vc_reqHostPort := f_getContactAddr(v_contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(v_contact.contactBody.contactAddresses[0]);
}
}
else
{
if (ischosen(vc_to.addressField.nameAddr))
{
if (ischosen(vc_to.addressField.nameAddr.addrSpec.components.sip))
{
vc_reqHostPort := vc_to.addressField.nameAddr.addrSpec.components.sip.hostPort;
vc_requestUri := vc_to.addressField.nameAddr.addrSpec;
}
}
else
{
if (ischosen(vc_to.addressField.addrSpecUnion.components.sip)) { // sip/sips call
vc_reqHostPort := vc_to.addressField.addrSpecUnion.components.sip.hostPort;
} else if (ischosen(vc_to.addressField.addrSpecUnion.components.urn)) { // Emergency call
vc_reqUrnUri := vc_to.addressField.addrSpecUnion.components.urn;
} else {
log ("f_setHeadersOnReceiptOfResponse: unsupported field: ", vc_to);
setverdict(fail);
}
vc_requestUri := vc_to.addressField.addrSpecUnion;
}
}
vc_callee_To:={fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams};
vc_callee_From:= {fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams};
vc_via:= p_response.msgHeader.via;
// Route Management
if (ispresent(p_response.msgHeader.recordRoute))
{
vc_recordRoute := p_response.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;
};
/**
* @desc functions give access to an element of the Route header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of Route record element to be retrieved
* @return HostPort value of the Route element or omit
*/
function f_getRouteHeaderElementAddressFromRequest(
in Request p_message,
in integer p_index
) return HostPort {
if (isvalue(p_message.msgHeader.route)) {
if (lengthof(p_message.msgHeader.route.routeBody) > p_index) {
return (p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
}
}
setverdict(fail);
return (c_hostport_dummy);
}
 
/**
* @desc functions give access to an element of the Record-Route header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of recordRoute record element to be retrieved
* @return HostPort value of the Record-Route element or omit
*/
function f_getRecordRouteHeaderElementAddressFromRequest(
in Request p_message,
in integer p_index
) return HostPort {
if (isvalue(p_message.msgHeader.recordRoute)) {
if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) {
return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
}
}
setverdict(fail);
return (c_hostport_dummy);
}
 
// extentions due to new fields in PRACK and UPDATE messages
if (ispresent(p_response.msgHeader.rSeq)) {
vc_rAck :=
{ fieldName := RACK_E,
responseNum := valueof(p_response.msgHeader.rSeq.responseNum),
seqNumber := valueof(p_response.msgHeader.cSeq.seqNumber),
method := valueof(p_response.msgHeader.cSeq.method)
};
};
/**
* @desc functions give access to an element of the Record-Route header field (record).
* @param p_message (response) SIP message to be analysed
* @param p_index index of recordRoute record element to be retrieved
* @return HostPort value of the Record-Route element or omit
*/
function f_getRecordRouteHeaderElementAddressFromResponse(
in Response p_message,
in integer p_index
) return HostPort {
if (isvalue(p_message.msgHeader.recordRoute)) {
if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) {
return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
}
}
setverdict(fail);
return (c_hostport_dummy);
}
 
// extentions due to new HistoryInfo fields 180 or 200OK messages
if (ispresent(p_response.msgHeader.historyInfo)) {
vc_historyInfoList := valueof(p_response.msgHeader.historyInfo.historyInfoList);
vc_history_is_valid := true
}
else {vc_history_is_valid := false};
/**
* @desc functions give access to an element of the Via header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of via record element to be retrieved
* @return HostPort value of the Via element or omit
*/
function f_getViaHeaderElementHostPort(
in Request p_message,
in integer p_index
) return HostPort {
 
//sdpMessageBody answer
if (ispresent(p_response.messageBody)) {
if ( ischosen(p_response.messageBody.sdpMessageBody))
{
vc_sdp_remote := p_response.messageBody.sdpMessageBody;
vc_sdp_remote_is_valid := true;
}
if (lengthof(p_message.msgHeader.via.viaBody) > p_index) {
return (p_message.msgHeader.via.viaBody[p_index].sentBy);
}
setverdict(fail);
return (c_hostport_dummy);
}
 
if ( ischosen(p_response.messageBody.xmlBody))
{
vc_xml_remote := p_response.messageBody.xmlBody;
}
/**
* @desc functions give access to an element of the Via header field (record).
* @param p_message (response) SIP message to be analysed
* @param p_index index of via record element to be retrieved
* @return HostPort value of the Via element or omit
*/
function f_getViaHeaderElementHostPortResponse(
in Response p_message,
in integer p_index
) return HostPort {
 
if ( ischosen(p_response.messageBody.mimeMessageBody))
{
for (var integer j:=0; j<sizeof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j:=j+1){
if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_sdpAplication))
{
vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
};
if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_xmlAplication))
{
vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
};
}
}
};
if (lengthof(p_message.msgHeader.via.viaBody) > p_index) {
return (p_message.msgHeader.via.viaBody[p_index].sentBy);
}
setverdict(fail);
return (c_hostport_dummy);
}
 
}// end function f_setHeadersOnReceiptOfResponse
/**
* @desc function checks indicators if topology hiding (TH) has been applied: - second element in via-header record has tokenized-by parameter
* @param p_Request SIP message to be analysed
* @return boolean value (true indicate TH, false otherwise)
*/
function f_topologyHiding(
inout Request p_request
) runs on SipComponent
return boolean {
var GenericParam v_viaParameter;
if (lengthof(p_request.msgHeader.via.viaBody) <2 ) {
return (false);
}
v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0];
// second element
if (not v_viaParameter.id == "tokenized-by") {
return (false);
}
return (true);
}
 
/**
*
* @desc functions reads ServiceRoute header field from an incoming 200 Response message in registration
* @param p_cSeq
* @param p_response received response message
*/
function f_getServiceRouteMapIntoRouteInRegistration(inout CSeq p_cSeq, Response p_response) runs on SipComponent
{
var integer v_i, v_j, v_nbroute;
var ServiceRoute v_serviceRoute;
// Route Management
if (ispresent(p_response.msgHeader.serviceRoute))
{
v_serviceRoute := p_response.msgHeader.serviceRoute;
v_nbroute := sizeof(v_serviceRoute.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]:=v_serviceRoute.routeBody[v_i];
}
vc_route.fieldName := ROUTE_E;
vc_route_REG := vc_route;
vc_boo_route := true;
}
/**
* @desc function checks indicators if topology hiding (TH) has been applied: - any element in via-header record has tokenized-by parameter
* @param Response SIP message to be analysed
* @return boolean value (true indicate TH, false otherwise)
*/
function f_topologyHidingResponse(
inout Response p_response
) runs on SipComponent
return boolean {
var GenericParam v_viaParameter;
var integer i;
 
}// end function f_getServiceRouteMapIntoRouteInRegistration
for (i := 0; i < lengthof(p_response.msgHeader.via.viaBody); i := i + 1) {
 
/**
*
* @desc functions reads Route header field from an incoming Request message and generate RecordRoute
* @param p_cSeq
* @param p_request received request message
*/
function f_getRouteMapIntoRecordRoute(inout CSeq p_cSeq, Request p_request) runs on SipComponent
{
var integer v_i, v_j, v_nbroute;
var Route v_route;
// Route Management
if (ispresent(p_request.msgHeader.route))
{
v_route := p_request.msgHeader.route;
v_nbroute := sizeof(v_route.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_recordRoute.routeBody[v_j]:=v_route.routeBody[v_i];
}
vc_recordRoute.fieldName := RECORD_ROUTE_E;
vc_boo_recordRoute := true;
}
v_viaParameter := p_response.msgHeader.via.viaBody[i].viaParams[0]; // first parameter
if (not v_viaParameter.id == "tokenized-by") {
return (false);
}
}
return (true);
}
 
}// end function f_getRouteMapIntoRecordRoute
 
 
} // end group SetHeaders
} // end group FieldOperations
group SetHeaders {
 
group SDPOperations{
/**
* @desc check if message body include SDP attribute (2nd parameter)
* for any media
*
*/
function f_check_attribute(in SDP_Message p_sdp, in template SDP_attribute p_attribute) runs on SipComponent return boolean {
if (ispresent(p_sdp.media_list)) {
for (var integer j:=0; j<sizeof(p_sdp.media_list); j:=j+1){
if (ispresent(p_sdp.media_list[j].attributes)) {
for (var integer i:=0; i<sizeof(p_sdp.media_list[j].attributes); i:=i+1){
if (match(p_sdp.media_list[j].attributes[i],p_attribute))
{return(true);};
};
}
};
}
if (ispresent(p_sdp.attributes)) {
for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){
if (match(p_sdp.attributes[j],p_attribute)) {return(true);};
};
}
return(false);
}
/**
* @desc check if message body include SDP (session level) attribute (2nd parameter)
* for any media
*
*/
function f_check_session_attribute(in SDP_Message p_sdp, in template SDP_attribute p_attribute) runs on SipComponent return boolean {
if (ispresent(p_sdp.attributes)) {
for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){
if (match(p_sdp.attributes[j],p_attribute)) {return(true);};
 
/**
* @desc function for setting of component variables related to message header fields (message type independent: CSeq, contact, via), function uses information from userprofile
* @param p_cSeq_s CSeq parameter
* @param p_method method name for cSeq header field
*/
function f_setHeadersGeneral(
inout CSeq p_cSeq_s,
in charstring p_method
) runs on SipComponent {
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_via := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
}
return(false);
}
/**
*
* @desc identify an SDP direction attribute (session or first media attribute) in a SDP message and return its answer value
* @param p_sdp the SDP message that has been received
* @param p_attribute incoming SDP attribute that need to be used for the SDP direction (answer)
* @return the new attribute (to be send out) derived from the incoming SDP value
* @verdict
*/
function f_get_attribute_answer(in SDP_Message p_sdp, in template SDP_attribute p_attribute) runs on SipComponent return SDP_attribute {
} // end function f_setHeadersGeneral
 
var template SDP_attribute v_attribute := p_attribute;
// check if the selected attribute is included in the SDP offer (session attributes)
if (ispresent(p_sdp.attributes)) {
for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){
if (match(p_sdp.attributes[j],p_attribute)) {v_attribute := p_sdp.attributes[j];};
};
}
 
// check if the selected attribute is included in the SDP offer (any of the media attributes)
else {if (ispresent(p_sdp.media_list)) {
for (var integer j:=0; j<sizeof(p_sdp.media_list); j:=j+1){
if (ispresent(p_sdp.media_list[j].attributes)) {
for (var integer i:=0; i<sizeof(p_sdp.media_list[j].attributes); i:=i+1){
if (match(p_sdp.media_list[j].attributes[i],p_attribute))
{v_attribute := p_sdp.media_list[j].attributes[i];};
};
}
};
}};
select (valueof(v_attribute))
{
case (mw_attribute_sendonly) {return(valueof(m_attribute_recvonly));}
case (mw_attribute_sendrecv) {return(valueof(m_attribute_sendrecv));}//MRO
case (mw_attribute_inactive) {return(valueof(m_attribute_inactive));}//MRO
case (mw_attribute_recvonly) {return(valueof(m_attribute_sendonly));}//MRO
}
return(valueof(m_attribute_sendrecv));//the default return value in case of missing attribute offer
}
 
/**
* @desc check if message body include SDP bandwidth (2nd parameter)
* either for the session or a media description
*/
function f_check_bandwidth(in SDP_Message loc_sdp, in template SDP_bandwidth loc_bandw) runs on SipComponent return boolean {
if (ispresent(loc_sdp.bandwidth)) {
for (var integer j:=0; j<sizeof(loc_sdp.bandwidth); j:=j+1){
if (match(loc_sdp.bandwidth[j],loc_bandw)) {return(true);};
};
};
if (ispresent(loc_sdp.media_list)) {
for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
if (ispresent(loc_sdp.media_list[j].bandwidth)) {
for(var integer i:=0; i< sizeof(loc_sdp.media_list[j].bandwidth); i:=i+1) {
if (match(loc_sdp.media_list[j].bandwidth[i],loc_bandw)) {
return(true);};
}
}
};
};
return(false);
}
/**
* @desc function for setting of component variables related to message header fields (message type independent: CSeq, contact, via), function uses information from userprofile
* @param p_cSeq_s CSeq parameter
* @param p_method method name for cSeq header field
*/
function f_setHeadersACK(
) runs on SipComponent {
// vc_requestUri.hostPort := vc_reqHostPort;
if (vc_response.statusLine.statusCode >= 200 and vc_response.statusLine.statusCode <= 299)
// ref. RFC3261 8.1.1.7 Via
{
vc_branch := c_branchCookie & f_getRndTag();
}
vc_via := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
} // end function f_setHeadersGeneral
 
/**
* @desc check if message body include SDP media (2nd parameter)
*
*/
function f_check_media(in SDP_Message loc_sdp, in template SDP_media_desc loc_media) runs on SipComponent return boolean {
if (ispresent(loc_sdp.media_list)) {
for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
if (match(loc_sdp.media_list[j].media_field.transport,loc_media.media_field.transport) and
match(loc_sdp.media_list[j].media_field.fmts,loc_media.media_field.fmts))
{return(true);};
};
}
return(false);
}
/**
* @desc
* check if message body include precondition mechanism (a=des and
* a=curr) retrun true, else false
* @param loc_sdp SDP message
*/
function f_check_precondition(in SDP_Message loc_sdp) runs on SipComponent return boolean {
if (f_check_attribute(loc_sdp, mw_attribute_des) or
f_check_attribute(loc_sdp, mw_attribute_curr))
{return(true);}
return(false);
}
/**
* @desc setting of general and basic Bye header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersBYE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "BYE"); // cseq, contact, branch, via
// vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
f_addTagInTo(vc_to);
 
/**
* @desc check if message body include SDP media direction return true, else false
*
*/
function f_check_media_direction(in SDP_Message loc_sdp) runs on SipComponent return boolean {
if (f_check_attribute(loc_sdp, mw_attribute_sendonly) or
f_check_attribute(loc_sdp, mw_attribute_recvonly) or
f_check_attribute(loc_sdp, mw_attribute_sendrecv) or
f_check_attribute(loc_sdp, mw_attribute_inactive))
{return(true);}
return(false);
}
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
/**
* @desc copy media/attribute lines from remote to local SDP variable
*
*/
function f_check_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
return boolean
{
var SDP_media_desc v_media := f_prepare_media(loc_sdp,loc_codec);
log("log0");
if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media)
{ log("log1"); return false };
if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport)
{ log("log2"); return false };
if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts)
{ log("remote:",vc_sdp_remote.media_list[0].media_field.fmts,"expect:",v_media.media_field.fmts); return false };
return true
}
/**
* @desc replace the first curr media attribute with the given value.
* @param p_sdp SDP message to modify
* @param p_curr new curr attribute
*/
function f_replace_curr_attribute(inout SDP_Message p_sdp, in SDP_attribute_curr p_curr) {
if(ispresent(p_sdp.media_list)) {
var integer mn := sizeof(p_sdp.media_list[0].attributes);
for(var integer i := 0; i<=mn; i := i+1) {
if(ischosen(p_sdp.media_list[0].attributes[i].curr)){
p_sdp.media_list[0].attributes[i].curr := p_curr;
i:=mn;
}
}
}
}
/**
* @desc append new media attribute to the first media description.
* @param p_sdp SDP message to modify
* @param p_att SDP attribute to appand
*/
function f_append_media_attribute(inout SDP_Message p_sdp, in SDP_attribute p_att) {
if(ispresent(p_sdp.media_list)) {
var integer mn := sizeof(p_sdp.media_list[0].attributes);
p_sdp.media_list[0].attributes[mn] := p_att;
}
}
/**
* @desc append new media to the existing media list in SDP
*
*/
function f_append_media(inout SDP_Message loc_SDP, in template SDP_media_desc loc_media)
{
var integer mn := sizeof(loc_SDP.media_list);
loc_SDP.media_list[mn] := valueof(loc_media);
}
/**
* @desc repare media/attribute lines
*
*/
function f_prepare_media(integer loc_sdp, integer loc_codec) runs on SipComponent
return SDP_media_desc
{
var charstring v_codecs[32] := {
"PCMU/8000", "GSM/8000", "G723/8000", "DVI4/8000",
"DVI4/16000", "LPC/8000", "PCMA/8000", "G722/8000",
"L16/44100/2", "L16/44100", "QCELP/8000", "CN/8000",
"MPA/90000", "G728/8000", "DVI4/11025", "DVI4/22050",
"G729/8000", "G726-40/8000", "G726-32/8000", "G726-24/8000",
"G726-16/8000", "G726D/8000", "G726E/8000", "GSM-EFR/8000",
"CelB/90000", "JPEG/90000", "Nv/90000", "H261/90000",
"MPV/90000", "MP2T/90000", "H263/90000", "H263-1998/90000"
}
var SDP_media_desc v_media :=
{
media_field := {
media := "audio",
ports := {
port_number := 10000,
num_of_ports:=omit },
transport := "RTP/AVP",
fmts := { "0" }
}, //m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
};
if (32<loc_codec or loc_codec<1) {
log("Unexpected SDP variant");
setverdict(inconc);
return (v_media)}
vc_caller_From := vc_from;
 
if (loc_sdp == 1) {}
else if (loc_sdp == 2) {
v_media.media_field.fmts := {PX_SIP_SDP_dyn}; //{ "98", "0" };
v_media.attributes := {{
rtpmap := { attr_value := PX_SIP_SDP_dyn & " " & v_codecs[loc_codec-1] } // PX_SIP_SDP_dyn := 98
}}
} else if (loc_sdp == 3) {
v_media.media_field.fmts := { "8" }
} else if (loc_sdp == 4) {
v_media.media_field.fmts := { "99", "8" };
v_media.attributes := {{
rtpmap := { attr_value := "99 " & v_codecs[loc_codec-1] }
}}
} else if (loc_sdp == 5) {
v_media.media_field.media := "image";
v_media.media_field.transport := "udptl";
v_media.media_field.fmts := { "t38" }
} else if (loc_sdp == 6) {
v_media.media_field.media := "image";
v_media.media_field.transport := "tcptl";
v_media.media_field.fmts := { "t38" }
} else {
log("Unexpected SDP variant"); setverdict(inconc)
};
return (v_media);
}
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersBYE
 
/**
* @desc repare media/attribute lines
*
*/
function f_prepare_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
{
/**
* @desc setting of general and basic CANCEL header fields
* @param p_cSeq_s
*/
function f_setHeadersCANCEL(
inout CSeq p_cSeq_s
) runs on SipComponent {
 
vc_sdp_local.media_list := {f_prepare_media(loc_sdp,loc_codec)};
}
/**
*
* @desc function that copy media/attribute lines from remote to local SDP variable
*/
function f_prepare_SDP_answer() runs on SipComponent
{
var integer mn, cn := 0, i, j, k :=0;
var charstring v_PT, v_rtpmap := "";
var SDP_attribute_list v_mediaAttributes := {};
//increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
// if more than one codec, select the firs one
mn:= sizeof(vc_sdp_remote.media_list);
for (i :=0; i < mn; i := i+1)
{
//for every single media
if (ispresent(vc_sdp_remote.media_list[i].attributes))
{
cn := sizeof(vc_sdp_remote.media_list[i].attributes);
};
if (sizeof(vc_sdp_remote.media_list[i].media_field.fmts)>0)
{
// select the first one
v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0];
vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
for (j :=0; j<cn; j:=j+1)
{
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap))
{
if (v_PT == regexp(vc_sdp_remote.media_list[i].attributes[j].rtpmap.attr_value, "[ \t]#(0,)([\d]+)*", 0))
{
v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].
rtpmap.attr_value;
v_mediaAttributes[k] := {rtpmap := {attr_value := v_rtpmap}};
k := k+1;
} // else line is not copied
}
else
{
// simple copy of attribute
v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j];
k := k+1;
}
}
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
if (ispresent(vc_sdp_local.media_list[i].attributes))
p_cSeq_s.method := "CANCEL";
// vc_branch := c_branchCookie & f_getRndTag(); // STF 406: CANCEL and ACK should have the same branch as the INVITE
vc_via := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
} // end function f_setHeadersCANCEL
 
/**
* @desc function sets header field for the next outgoing REGISTER message
* @param p_cSeq_s CSeq parameter to be applied
* @param p_emergency Set to true in case of emergency
*/
function f_setHeaders_REGISTER(
inout CSeq p_cSeq_s,
boolean p_emergency := false
) 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() & c_AT & vc_userprofile.currIpaddr
};
vc_callIdReg := vc_callId; // remember callId for de-registration
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
vc_cancel_To := vc_to;
v_params := f_addParameter(v_params,
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
});
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
 
if (not vc_firstREGISTER_sent) {
if (p_emergency) {
v_params := {
{
"sos",
omit
}
};
vc_contact.contactBody.contactAddresses[0].addressField.addrSpecUnion.urlParameters := v_params;
}
else {
v_params := {
{
id := c_expiresId,
paramValue := {
tokenOrHost := 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)}
};
 
vc_via_REG := vc_via;
} // end function setHeaders_REGISTER
 
/**
* @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
* @verdict
*/
function f_setHeaders_2ndREGISTER(
inout CSeq p_cSeq_s
) runs on SipComponent {
var CommaParam_List v_challenge;
 
// Increment CSeq sequence number
p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
vc_cSeq := p_cSeq_s;
 
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
 
// new branch tag due to different branch tag in new REGISTER method
vc_branch := c_branchCookie & f_getRndTag();
 
vc_via_REG := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
 
// Extract challenge and calculate credentials for a response.
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
 
 
// Prepair right answer
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)}
};
} // end function f_setHeaders_2ndREGISTER
 
/**
* @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER NO response in Authorization header to cause an error
* @verdict
*/
function f_setHeaders_2ndREGISTER_wo_response(
) runs on SipComponent {
var CommaParam_List v_challenge;
 
vc_branch := c_branchCookie & f_getRndTag();
 
vc_via_REG := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
 
if (ischosen(vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge))
// Extract challenge and calculate credentials for a response.
{
cn := sizeof(vc_sdp_local.media_list[i].attributes);
for (j :=0; j<cn; j:=j+1)
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
}
else {
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
}
 
// Increment CSeq sequence number
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
 
// Prepair right answer
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)}
};
} // end function f_setHeaders_2ndREGISTER_wo_response
 
/**
* @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER
* @verdict
*/
function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName(
) runs on SipComponent {
var CommaParam_List v_challenge;
 
vc_branch := c_branchCookie & f_getRndTag();
 
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
 
vc_via_REG := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
 
// Extract challenge and calculate credentials for a response.
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
 
// Increment CSeq sequence number
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
 
// Prepair right answer
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)}
};
} // end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName
 
 
/**
* @desc function sets header fields for the next outgoing REGISTER (de-registration)
* @param p_cSeq_s cSeq to be used
* @verdict
*/
function f_setHeaders_deREGISTER(
inout CSeq p_cSeq_s
) runs on SipComponent {
var SemicolonParam_List v_params := {};
 
f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
// reset authorization header to not use nonce from registration (otherwise we have to increase nc)
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_empty(vc_userprofile)}
};
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
v_params := f_addParameter(v_params,
{
// simplified handling of status attributes (copy/keep status from peer):
// a) copy/keep SDP_attribute_curr (invert tags if applicable)
if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr))
{
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local")
{vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote"};
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote")
{vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local"};
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send")
{vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv"};
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv")
{vc_sdp_local.media_list[i].attributes[j].curr.direction := "send"};
}
// b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)
else if (ischosen(vc_sdp_local.media_list[i].attributes[j].des))
{
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local")
{vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote"};
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote")
{vc_sdp_local.media_list[i].attributes[j].des.statusType := "local"};
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send")
{vc_sdp_local.media_list[i].attributes[j].des.direction := "recv"};
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv")
{vc_sdp_local.media_list[i].attributes[j].des.direction := "send"};
}
// c) simplification: assume no SDP_attribute_conf
else if (ischosen(vc_sdp_local.media_list[i].attributes[j].conf))
{
// todo: handle SDP_attribute_conf
}
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
});
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
 
vc_contact := {
fieldName := CONTACT_E,
contactBody := {wildcard := "*"}
};
} // end function f_setHeaders_deREGISTER
 
 
/**
* @desc setting of general and basic Invite header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersINVITE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
vc_caller_From := vc_from;
 
if (ischosen(vc_requestUri.components.sip)) {
// sip/sips call
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}
else if (ischosen(vc_requestUri.components.urn)) {
// Emergency call
vc_reqUrnUri := vc_requestUri.components.urn;
}
else {
log("*** " & __SCOPE__ &": INFO:f_setHeadersINVITE: unsupported field: ", vc_requestUri," ***");
setverdict(fail);
}
}
 
/**
* @desc setting of general and basic Update header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersUPDATE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "UPDATE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
vc_caller_From := vc_from;
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersUPDATE
 
/**
* @desc setting of general and basic Message header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersMESSAGE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
vc_caller_From := vc_from;
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersMESSAGE
 
/**
* @desc setting of general and basic Notify header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersNOTIFY(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersNOTIFY
 
/**
* @desc setting of general and basic Publish header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersPUBLISH(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "PUBLISH"); // cseq, contact, branch, via
// after SUBSCRIBE message callid shall be same
// vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
vc_caller_From := vc_from;
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersPUBLISH
 
/**
* @desc function sets header field for the next outgoing SUBSCRIBE message
* @param p_cSeq_s CSeq parameter to be applied
*/
function f_setHeaders_SUBSCRIBE(
inout CSeq p_cSeq_s
) runs on SipComponent {
var SemicolonParam_List v_params := {};
 
f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
vc_requestUri := valueof(m_SipUrl_currDomain(vc_userprofile));
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
 
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
 
// store callId from Subscribe message
vc_callIdSub := vc_callId;
 
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
vc_cancel_To := vc_to;
v_params := f_addParameter(v_params,
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
});
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
} // end function setHeaders_SUBSCRIBE
 
/**
* @desc setting of general and basic Subscribe header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersSUBSCRIBE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
 
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
vc_caller_From := vc_from;
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersMESSAGE
 
/**
* @desc setting of general and basic REFER header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersREFER(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via
// vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
 
vc_caller_From := vc_from;
 
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersREFER
 
/**
* @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer
* @param p_Request REGISTER that has been received
*/
function f_setHeadersOnReceiptOfREGISTER(
Request p_Request
) runs on SipComponent {
 
f_setHeadersOnReceiptOfRequest(p_Request);
 
vc_callId := p_Request.msgHeader.callId;
vc_caller_From := vc_from;
f_addTagInTo(vc_to);
vc_caller_To := vc_to;
vc_requestUri := p_Request.requestLine.requestUri;
 
vc_cancel_To := p_Request.msgHeader.toField;
 
if (isvalue(p_Request.msgHeader.contact) and (not ischosen(p_Request.msgHeader.contact.contactBody.wildcard))) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
 
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
 
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
 
if (isvalue(p_Request.msgHeader.authorization)) {
vc_authorization := valueof(p_Request.msgHeader.authorization);
}
} // end f_setHeadersOnReceiptOfREGISTER
 
/**
* @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer
* @param p_Request SUBSCRIBE that has been received
*/
function f_setHeadersOnReceiptOfSUBSCRIBE(
Request p_Request
) runs on SipComponent {
 
f_setHeadersOnReceiptOfRequest(p_Request);
 
vc_callId := p_Request.msgHeader.callId;
vc_caller_From := vc_from;
f_addTagInTo(vc_to);
vc_caller_To := vc_to;
vc_requestUri := p_Request.requestLine.requestUri;
 
vc_cancel_To := p_Request.msgHeader.toField;
 
if (isvalue(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
 
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
 
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
} // end f_setHeadersOnReceiptOfSUBSCRIBE
 
function f_setHeadersOnReceiptOfREFER(
Request p_Request
) runs on SipComponent {
 
f_setHeadersOnReceiptOfRequest(p_Request);
 
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
 
if (isvalue(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
 
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
 
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
} // end f_setHeadersOnReceiptOfREFER
 
/**
* @desc function reads all necessary headers from the received INVITE message and generate the tag for the answer
* @param p_Request received INVITE message
* @verdict
*/
function f_setHeadersOnReceiptOfINVITE(
Request p_Request
) runs on SipComponent {
var integer i, j;
var integer v_length;
f_setHeadersOnReceiptOfRequest(p_Request);
 
vc_callId := p_Request.msgHeader.callId;
 
vc_requestUri2 := p_Request.requestLine.requestUri;
 
vc_cancel_To := p_Request.msgHeader.toField;
f_addTagInTo(vc_to);
vc_caller_From := vc_from;
vc_caller_To := vc_to;
 
if (isvalue(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
 
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
 
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
 
if (isvalue(p_Request.msgHeader.privacy)) {
vc_privacy := p_Request.msgHeader.privacy;
}
 
if (isvalue(p_Request.messageBody)) {
// cleaning of attributes before assignment
if (isvalue(vc_sdp_remote.media_list)) {
v_length := lengthof(vc_sdp_remote.media_list);
for (i := 0; i < v_length; i := i + 1) {
if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
vc_sdp_remote.media_list[i].attributes := omit;
}
}
}
 
// save SDP if present
if (ischosen(p_Request.messageBody.sdpMessageBody)) {
vc_sdp_remote := p_Request.messageBody.sdpMessageBody;
vc_sdp_remote_is_valid := true;
f_prepare_SDP_answer();
}
 
// save XML if present
if (ischosen(p_Request.messageBody.xmlBody)) {
vc_xml_remote := p_Request.messageBody.xmlBody;
}
 
if (ischosen(p_Request.messageBody.mimeMessageBody)) {
 
for (j := 0; j < lengthof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) {
if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) {
vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
vc_sdp_remote_is_valid := true;
f_prepare_SDP_answer();
}
if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) {
vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
}
}
}
}
 
if (isvalue(p_Request.msgHeader.supported.optionsTags)) {
for (i := lengthof(p_Request.msgHeader.supported.optionsTags); i > 0; i := i - 1) {
if (p_Request.msgHeader.supported.optionsTags[i - 1] == "100rel") {
vc_supported_100rel := true;
}
if (p_Request.msgHeader.supported.optionsTags[i - 1] == "precondition") {
vc_supported_precondition := true;
}
}
}
} // end f_setHeadersOnReceiptOfINVITE
 
/**
* @desc function reads header field of a received BYE message
* @param p_Request received BYE
*/
function f_setHeadersOnReceiptOfBYE(
Request p_BYE_Request
) runs on SipComponent {
 
f_setHeadersOnReceiptOfRequest(p_BYE_Request);
vc_callId := p_BYE_Request.msgHeader.callId;
} // end f_setHeadersOnReceiptOfBYE
 
/**
* @desc function reads header field from an incoming Request message
* @param p_Request received Request message
*/
function f_setHeadersOnReceiptOfRequest(
Request p_Request
) runs on SipComponent {
vc_request := p_Request;
vc_callId := p_Request.msgHeader.callId;
vc_cSeq := valueof(p_Request.msgHeader.cSeq); // CSeq is mandatory
vc_iut_CSeq := p_Request.msgHeader.cSeq;
vc_from := p_Request.msgHeader.fromField;
vc_caller_From := p_Request.msgHeader.fromField;
vc_to := p_Request.msgHeader.toField;
vc_caller_To := p_Request.msgHeader.toField;
vc_via := p_Request.msgHeader.via;
// update sent_label according to received via header field
f_getViaReplyAddr(vc_via.viaBody, vc_sent_label);
 
// Catch route
vc_boo_recordRoute := false;
 
// add tag field into To header if tag is not present
if (not (isvalue(p_Request.msgHeader.toField.toParams))) {
vc_to.toParams := {
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
}
};
vc_caller_To := vc_to;
}
if (isvalue(p_Request.msgHeader.recordRoute)) {
vc_boo_recordRoute := true;
vc_recordRoute := p_Request.msgHeader.recordRoute;
}
} // end f_setHeadersOnReceiptOfRequest
 
/**
* @desc functions reads header fields from an incoming Response message
* @param p_cSeq
* @param p_response received response message
* @verdict
*/
function f_setHeadersOnReceiptOfResponse(
Response p_response
) runs on SipComponent {
var integer i, j, v_nbroute;
var template(omit) Contact v_contact;
// only for local purpose
vc_response := p_response;
// vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq
vc_to := p_response.msgHeader.toField;
vc_from := p_response.msgHeader.fromField;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
 
if (isvalue(p_response.msgHeader.contact)) {
v_contact := p_response.msgHeader.contact;
if (ischosen(v_contact.contactBody.contactAddresses)) {
vc_reqHostPort := f_getContactAddr(valueof(v_contact.contactBody.contactAddresses[0]));
vc_requestUri := f_getContactUri(valueof(v_contact.contactBody.contactAddresses[0]));
}
}
else {
if (ischosen(vc_to.addressField.addrSpecUnion.components.sip)) {
// sip/sips call
vc_reqHostPort := vc_to.addressField.addrSpecUnion.components.sip.hostPort;
}
else if (ischosen(vc_to.addressField.addrSpecUnion.components.urn)) {
// Emergency call
vc_reqUrnUri := vc_to.addressField.addrSpecUnion.components.urn;
}
else {
log("*** f_setHeadersOnReceiptOfResponse: INFO: unsupported field: ", vc_to, " ***");
setverdict(fail);
}
vc_requestUri := vc_to.addressField.addrSpecUnion;
}
 
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
}
}
// add handling of prenegotiation, change ports if required etc.
//if prenegotiation...
}
 
/**
* @desc reject SDP offer by setting media ports to 0
*
*/
function f_reject_SDP_offer() runs on SipComponent
{
var integer mn, i;
f_copy_SDP(); // TO BE DONE with more details!
//increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
// if more than one codec, select the firs one
mn:= sizeof(vc_sdp_local.media_list);
for (i :=0; i < mn; i := i+1)
{
vc_sdp_local.media_list[i].media_field.ports := {0, omit};
vc_sdp_local.media_list[i].attributes := omit; //{};
};
}
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
 
/**
*
* @desc copies SDP message elements from remote to local component variable:
* - bandwidth
* - session version (will be incremented)
* - media list
* modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
* @param p_medianum list position number of the media (if value 0 identifies first media list element)
* @param p_direction the new direction attribute to be included in the media entry
* @verdict
*/
function f_SIP_modMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
{
var boolean v_set_direction; // flag indicates if direction attribute has been modified
var integer v_mn := 0; // length of media list (number of entries)
var integer v_cn := 0; // number of attributes of a media entry
var integer i, j, k := 0;
var SDP_attribute_list v_mediaAttributes := {}; // collect the media attributes (to be assigned at end of function)
f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
// increment session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
// if more than one codec, select the first one
v_mn:= sizeof(vc_sdp_local.media_list);
vc_via := p_response.msgHeader.via;
 
if (p_medianum == 0) //specific media requested
{
p_medianum := 1; // start checking from first media
};
if (p_medianum > 0) //specific media requested
{
if (not(p_medianum > v_mn))
{v_mn := p_medianum}
};
// handling of media list elements
for (i :=0; i < v_mn; i := i+1)
{
v_cn := 0; // initialize the number of attributes of the media list entry
if (ispresent(vc_sdp_local.media_list)) //media_list is optional
{
// log("vc_sdp_local.media_list[i] ",vc_sdp_local.media_list[i]);
if (ispresent(vc_sdp_local.media_list[i].attributes))
{
v_cn := sizeof(vc_sdp_local.media_list[i].attributes);
};
v_set_direction := false;
//if (sizeof(vc_sdp_local.media_list[i].media_field.fmts)>1)
// select the first one
for (j :=0; j<v_cn; j:=j+1)
{
if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly)
or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly)
or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive)
or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv))
{
v_mediaAttributes[k] := valueof(p_direction);
v_set_direction := true;
}
else // non-direction attributes will be copied
{
v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
k := k+1;
}
}
if (not v_set_direction)
{ v_mediaAttributes[k] := valueof(p_direction)};
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
// }
}
}
// add handling of prenegotiation, change ports if required etc.
//if prenegotiation...
}
/**
* @desc modify session and media attributes direction
*
*/
function f_SIP_modSessionDirection(template SDP_attribute p_direction) runs on SipComponent
{
var boolean v_set_direction := false;
var integer v_mn:= 0, i:=0;
if (ispresent(vc_sdp_local.attributes))
{ v_mn:= sizeof(vc_sdp_local.attributes);
for (i :=0; i < v_mn; i := i+1)
{//for every single attribute (that is not omit)
if (ischosen(vc_sdp_local.attributes[i].recvonly)
or ischosen(vc_sdp_local.attributes[i].sendonly)
or ischosen(vc_sdp_local.attributes[i].inactive)
or ischosen(vc_sdp_local.attributes[i].sendrecv))
{
vc_sdp_local.attributes[i] := valueof(p_direction);
v_set_direction := true;
}
}
if (not v_set_direction) // if not sent before
{
vc_sdp_local.attributes[v_mn] := valueof(p_direction);
};
}
else
{vc_sdp_local.attributes[0] := valueof(p_direction)};
}
/**
* @desc c
*
*/
// Route Management
if (isvalue(p_response.msgHeader.recordRoute)) {
vc_recordRoute := p_response.msgHeader.recordRoute;
v_nbroute := lengthof(vc_recordRoute.routeBody);
// copy and reverse the order of the routes in route header
for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
j := v_nbroute - 1 - i;
vc_route.routeBody[j] := vc_recordRoute.routeBody[i];
}
vc_route.fieldName := ROUTE_E;
vc_boo_recordRoute := true;
vc_boo_route := true;
}
else {
vc_boo_recordRoute := false;
vc_boo_route := false;
}
 
 
/*
*
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
log(vc_request.messageBody.sdpMessageBody);log(p_direction_in);
if (not (ispresent(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in)
)))
{log("than branch of if");
if (
match(valueof(p_direction_in),valueof(mw_attribute_sendrecv)) and
not(f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
}
else {setverdict(fail);};}
else {setverdict(pass);log("attribute found in message body");};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
// extentions due to new fields in PRACK and UPDATE messages
if (isvalue(p_response.msgHeader.rSeq)) {
vc_rAck := {
fieldName := RACK_E,
responseNum := valueof(p_response.msgHeader.rSeq).responseNum,
seqNumber := valueof(p_response.msgHeader.cSeq).seqNumber,
method := valueof(p_response.msgHeader.cSeq).method
};
}
 
/*
*
// extentions due to new HistoryInfo fields 180 or 200OK messages
if (isvalue(p_response.msgHeader.historyInfo)) {
vc_historyInfoList := valueof(p_response.msgHeader.historyInfo).historyInfoList;
vc_history_is_valid := true;
}
else {
vc_history_is_valid := false;
}
 
// sdpMessageBody answer
if (isvalue(p_response.messageBody)) {
if (ischosen(p_response.messageBody.sdpMessageBody)) {
vc_sdp_remote := p_response.messageBody.sdpMessageBody;
vc_sdp_remote_is_valid := true;
}
 
if (ischosen(p_response.messageBody.xmlBody)) {
vc_xml_remote := p_response.messageBody.xmlBody;
}
 
if (ischosen(p_response.messageBody.mimeMessageBody)) {
 
for (j := 0; j < lengthof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) {
if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) {
vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
}
if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) {
vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
}
}
}
}
} // end function f_setHeadersOnReceiptOfResponse
 
/**
* @desc functions reads ServiceRoute header field from an incoming 200 Response message in registration
* @param p_cSeq
* @param p_response received response message
*/
function f_getServiceRouteMapIntoRouteInRegistration(
Response p_response
) runs on SipComponent {
var integer i, j, v_nbroute;
var template(omit) ServiceRoute v_serviceRoute;
 
// Route Management
if (isvalue(p_response.msgHeader.serviceRoute)) {
v_serviceRoute := p_response.msgHeader.serviceRoute;
v_nbroute := lengthof(v_serviceRoute.routeBody);
// copy and reverse the order of the routes in route header
for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
j := v_nbroute - 1 - i;
vc_route.routeBody[j] := v_serviceRoute.routeBody[i];
}
vc_route.fieldName := ROUTE_E;
vc_route_REG := vc_route;
vc_boo_route := true;
}
} // end function f_getServiceRouteMapIntoRouteInRegistration
 
/**
* @desc functions reads Route header field from an incoming Request message and generate RecordRoute
* @param p_cSeq
* @param p_request received request message
*/
function f_getRouteMapIntoRecordRoute(
Request p_request
) runs on SipComponent {
var integer i, j, v_nbroute;
var template(omit) Route v_route;
 
// Route Management
if (isvalue(p_request.msgHeader.route)) {
v_route := p_request.msgHeader.route;
v_nbroute := lengthof(v_route.routeBody);
// copy and reverse the order of the routes in route header
for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
j := v_nbroute - 1 - i;
vc_recordRoute.routeBody[j] := v_route.routeBody[i];
}
vc_recordRoute.fieldName := RECORD_ROUTE_E;
 
vc_boo_recordRoute := true;
}
} // end function f_getRouteMapIntoRecordRoute
 
 
} // end group SetHeaders
 
 
 
} // end group FieldOperations
 
group SDPOperations {
 
/**
* @desc check if message body include SDP attribute (2nd parameter) for any media
*/
function f_check_attribute(
in SDP_Message p_sdp,
in template SDP_attribute p_attribute
) runs on SipComponent
return boolean {
var integer i, j;
 
if (isvalue(p_sdp.media_list)) {
for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) {
if (isvalue(p_sdp.media_list[j].attributes)) {
for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) {
if (match(p_sdp.media_list[j].attributes[i], p_attribute)) {
return (true);
}
}
}
}
}
if (isvalue(p_sdp.attributes)) {
for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
if (match(p_sdp.attributes[j], p_attribute)) {
return (true);
}
}
}
 
return (false);
}
 
/**
* @desc check if message body include SDP (session level) attribute (2nd parameter) for any media
*/
function f_check_session_attribute(
in SDP_Message p_sdp,
in template SDP_attribute p_attribute
) runs on SipComponent
return boolean {
var integer j;
 
if (isvalue(p_sdp.attributes)) {
for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
if (match(p_sdp.attributes[j], p_attribute)) {
return (true);
}
}
}
 
return (false);
}
 
/**
* @desc identify an SDP direction attribute (session or first media attribute) in a SDP message and return its answer value
* @param p_sdp the SDP message that has been received
* @param p_attribute incoming SDP attribute that need to be used for the SDP direction (answer)
* @return the new attribute (to be send out) derived from the incoming SDP value
* @verdict
*/
function f_get_attribute_answer(
in SDP_Message p_sdp,
in template SDP_attribute p_attribute
) runs on SipComponent
return SDP_attribute {
var integer i, j;
var template SDP_attribute v_attribute := p_attribute;
 
// check if the selected attribute is included in the SDP offer (session attributes)
if (isvalue(p_sdp.attributes)) {
for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
if (match(p_sdp.attributes[j], p_attribute)) {
v_attribute := p_sdp.attributes[j];
}
}
}
else
// check if the selected attribute is included in the SDP offer (any of the media attributes)
{
if (isvalue(p_sdp.media_list)) {
for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) {
if (isvalue(p_sdp.media_list[j].attributes)) {
for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) {
if (match(p_sdp.media_list[j].attributes[i], p_attribute)) {
v_attribute := p_sdp.media_list[j].attributes[i];
}
}
}
}
}
}
 
select (valueof(v_attribute)) {
case (mw_attribute_sendonly) {
return (valueof(m_attribute_recvonly));
}
case (mw_attribute_sendrecv) {
return (valueof(m_attribute_sendrecv));
} // MRO
case (mw_attribute_inactive) {
return (valueof(m_attribute_inactive));
} // MRO
case (mw_attribute_recvonly) {
return (valueof(m_attribute_sendonly));
} // MRO
}
return (valueof(m_attribute_sendrecv)); // the default return value in case of missing attribute offer
}
 
/**
* @desc check if message body include SDP bandwidth (2nd parameter) either for the session or a media description
*/
function f_check_bandwidth(
in SDP_Message p_loc_sdp,
in template SDP_bandwidth p_loc_bandw
) runs on SipComponent
return boolean {
var integer i, j;
if (isvalue(p_loc_sdp.bandwidth)) {
for (j := 0; j < lengthof(p_loc_sdp.bandwidth); j := j + 1) {
if (match(p_loc_sdp.bandwidth[j], p_loc_bandw)) {
return (true);
}
}
}
if (isvalue(p_loc_sdp.media_list)) {
for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) {
if (isvalue(p_loc_sdp.media_list[j].bandwidth)) {
for (i := 0; i < lengthof(p_loc_sdp.media_list[j].bandwidth); i := i + 1) {
if (match(p_loc_sdp.media_list[j].bandwidth[i], p_loc_bandw)) {
return (true);
}
}
}
}
}
 
return (false);
}
 
/**
* @desc check if message body include SDP media (2nd parameter)
*/
function f_check_media(
in SDP_Message p_loc_sdp,
in template(present) SDP_media_desc p_loc_media
) runs on SipComponent
return boolean {
var integer j;
if (isvalue(p_loc_sdp.media_list)) {
for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) {
if (match(p_loc_sdp.media_list[j].media_field.transport, p_loc_media.media_field.transport) and match(p_loc_sdp.media_list[j].media_field.fmts, p_loc_media.media_field.fmts)) {
return (true);
}
}
}
return (false);
}
 
/**
* @desc check if message body include precondition mechanism (a=des and a=curr) retrun true, else false
* @param loc_sdp SDP message
*/
function f_check_precondition(
in SDP_Message p_loc_sdp
) runs on SipComponent
return boolean {
if (f_check_attribute(p_loc_sdp, mw_attribute_des) or f_check_attribute(p_loc_sdp, mw_attribute_curr)) {
return (true);
}
 
return (false);
}
 
 
/**
* @desc check if message body include SDP media direction return true, else false
*/
function f_check_media_direction(
in SDP_Message p_loc_sdp
) runs on SipComponent
return boolean {
 
if (f_check_attribute(p_loc_sdp, mw_attribute_sendonly) or f_check_attribute(p_loc_sdp, mw_attribute_recvonly) or f_check_attribute(p_loc_sdp, mw_attribute_sendrecv) or f_check_attribute(p_loc_sdp, mw_attribute_inactive)) {
return (true);
}
 
return (false);
}
 
/**
* @desc copy media/attribute lines from remote to local SDP variable
*/
function f_check_SDP(
integer p_loc_sdp,
integer p_loc_codec
) runs on SipComponent
return boolean {
var SDP_media_desc v_media := f_prepare_media(p_loc_sdp, p_loc_codec);
if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media) {
return false;
}
if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport) {
return false;
}
if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts) {
return false;
}
 
return true;
}
 
/**
* @desc replace the first curr media attribute with the given value.
* @param p_sdp SDP message to modify
* @param p_curr new curr attribute
*/
function f_replace_curr_attribute(
inout SDP_Message p_sdp,
in SDP_attribute_curr p_curr
) {
var integer i;
var integer v_mn;
if (isvalue(p_sdp.media_list)) {
v_mn := lengthof(p_sdp.media_list[0].attributes);
for (i := 0; i < v_mn; i := i + 1) {
if (ischosen(p_sdp.media_list[0].attributes[i].curr)) {
p_sdp.media_list[0].attributes[i].curr := p_curr;
i := v_mn;
}
}
}
}
 
/**
* @desc append new media attribute to the first media description.
* @param p_sdp SDP message to modify
* @param p_att SDP attribute to appand
*/
function f_append_media_attribute(
inout SDP_Message p_sdp,
in SDP_attribute p_att
) {
var integer v_mn;
if (isvalue(p_sdp.media_list)) {
v_mn := lengthof(p_sdp.media_list[0].attributes);
p_sdp.media_list[0].attributes[v_mn] := p_att;
}
}
 
 
/**
* @desc append new media to the existing media list in SDP
*/
function f_append_media(
inout SDP_Message p_loc_SDP,
template(value) SDP_media_desc p_loc_media
) {
var integer v_mn := lengthof(p_loc_SDP.media_list);
p_loc_SDP.media_list[v_mn] := valueof(p_loc_media);
}
 
/**
* @desc repare media/attribute lines
*/
function f_prepare_media(
integer p_loc_sdp,
integer p_loc_codec
) runs on SipComponent
return SDP_media_desc {
var SDP_attribute_rtpmap_codec v_codecs[32] := {
{"PCMU", "8000", omit}, {"GSM", "8000", omit}, {"G723", "8000", omit}, {"DVI4", "8000", omit},
{"DVI4", "16000", omit}, {"LPC", "8000", omit}, {"PCMA", "8000", omit}, {"G722", "8000", omit},
{"L16", "44100", "2"}, {"L16", "44100", omit}, {"QCELP", "8000", omit}, {"CN","8000", omit},
{"MPA", "90000", omit}, {"G728", "8000", omit}, {"DVI4", "11025", omit}, {"DVI4", "22050", omit},
{"G729", "8000", omit}, {"G726-40", "8000", omit}, {"G726-32", "8000", omit}, {"G726-24", "8000", omit},
{"G726-16", "8000", omit}, {"G726D", "8000", omit}, {"G726E", "8000", omit}, {"GSM-EFR", "8000", omit},
{"CelB", "90000", omit}, {"JPEG", "90000", omit}, {"Nv", "90000", omit}, {"H261", "90000", omit},
{"MPV", "90000", omit}, {"MP2T" ,"90000", omit}, {"H263", "90000", omit}, {"H263-1998", "90000", omit}};
var SDP_media_desc v_media := {
media_field := {
media := "audio",
ports := {
port_number := 10000,
num_of_ports := omit
},
transport := "RTP/AVP",
fmts := {"0"}
}, // m=audio
// 8500
// RTP/AVP
// 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
};
 
if (32 < p_loc_codec or p_loc_codec < 1) {
log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***");
setverdict(inconc);
return (v_media);
}
 
if (p_loc_sdp == 1) {
}
else if (p_loc_sdp == 2) {
v_media.media_field.fmts := {PX_SIP_SDP_DYN}; // { "98", "0" };
v_media.attributes := {
{
rtpmap := {
payload_type := PX_SIP_SDP_DYN,
codec := v_codecs[p_loc_codec - 1]
}
}
};
}
else if (p_loc_sdp == 3) {
v_media.media_field.fmts := {"8"};
}
else if (p_loc_sdp == 4) {
v_media.media_field.fmts := {"99", "8"};
v_media.attributes := {
{
rtpmap := {
payload_type := "99",
codec := v_codecs[p_loc_codec - 1]
}
}
};
}
else if (p_loc_sdp == 5) {
v_media.media_field.media := "image";
v_media.media_field.transport := "udptl";
v_media.media_field.fmts := {"t38"};
}
else if (p_loc_sdp == 6) {
v_media.media_field.media := "image";
v_media.media_field.transport := "tcptl";
v_media.media_field.fmts := {"t38"};
}
else {
log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***");
setverdict(inconc);
}
 
return (v_media);
}
 
/**
* @desc repare media/attribute lines
*/
function f_prepare_SDP(
integer p_loc_sdp,
integer p_loc_codec
) runs on SipComponent {
 
vc_sdp_local.media_list := {f_prepare_media(p_loc_sdp, p_loc_codec)};
}
 
/**
* @desc function that copy media/attribute lines from remote to local SDP variable
*/
function f_prepare_SDP_answer(
) runs on SipComponent {
var integer v_mn, v_cn := 0, i, j, k := 0;
var charstring v_PT;
var SDP_attribute_rtpmap_codec v_rtpmap := { "", "", omit};
var SDP_attribute_list v_mediaAttributes := {};
// increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1);
// if more than one codec, select the firs one
v_mn := lengthof(vc_sdp_remote.media_list);
for (i := 0; i < v_mn; i := i + 1) {
// for every single media
if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_remote.media_list[i].attributes);
}
if (lengthof(vc_sdp_remote.media_list[i].media_field.fmts) > 0) {
// select the first one
v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0];
vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
for (j := 0; j < v_cn; j := j + 1) {
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap)) {
if (v_PT == vc_sdp_remote.media_list[i].attributes[j].rtpmap.payload_type) {
v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].rtpmap.codec;
v_mediaAttributes[k] := {rtpmap := {v_PT, v_rtpmap}};
k := k + 1;
} // else line is not copied
}
else {
// simple copy of attribute
v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j];
k := k + 1;
}
}
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
 
if (isvalue(vc_sdp_local.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_local.media_list[i].attributes);
for (j := 0; j < v_cn; j := j + 1) {
// simplified handling of status attributes (copy/keep status from peer):
// a) copy/keep SDP_attribute_curr (invert tags if applicable)
if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr)) {
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local") {
vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote";
}
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote") {
vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local";
}
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send") {
vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv";
}
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv") {
vc_sdp_local.media_list[i].attributes[j].curr.direction := "send";
}
}
else
if (
// b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)
ischosen(vc_sdp_local.media_list[i].attributes[j].des)
) {
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local") {
vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote";
}
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote") {
vc_sdp_local.media_list[i].attributes[j].des.statusType := "local";
}
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send") {
vc_sdp_local.media_list[i].attributes[j].des.direction := "recv";
}
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv") {
vc_sdp_local.media_list[i].attributes[j].des.direction := "send";
}
}
else
if (
// c) simplification: assume no SDP_attribute_conf
ischosen(vc_sdp_local.media_list[i].attributes[j].conf)
) {
// handle SDP_attribute_conf
}
}
}
}
}
// add handling of prenegotiation, change ports if required etc.
// if prenegotiation...
}
 
/**
* @desc reject SDP offer by setting media ports to 0
*/
function f_reject_SDP_offer(
) runs on SipComponent {
var integer mn, i;
f_copy_SDP(); // TO BE DONE with more details!
// increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1);
// if more than one codec, select the firs one
mn := lengthof(vc_sdp_local.media_list);
for (i := 0; i < mn; i := i + 1) {
vc_sdp_local.media_list[i].media_field.ports := {0, omit};
vc_sdp_local.media_list[i].attributes := omit; // {};
}
}
 
/**
* @desc copies SDP message elements from remote to local component variable: - bandwidth - session version (will be incremented) - media list modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
* @param p_medianum list position number of the media (if value 0 identifies first media list element)
* @param p_direction the new direction attribute to be included in the media entry
* @verdict
*/
function f_SIP_modMediaDirection(
integer p_medianum,
template(value) SDP_attribute p_direction
) runs on SipComponent {
var boolean v_set_direction;
 
// flag indicates if direction attribute has been modified
var integer v_mn := 0;
 
// length of media list (number of entries)
var integer v_cn := 0;
 
// number of attributes of a media entry
var integer i, j, k := 0;
var SDP_attribute_list v_mediaAttributes := {};
// collect the media attributes (to be assigned at end of function)
f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
// increment session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1);
 
// if more than one codec, select the first one
v_mn := lengthof(vc_sdp_local.media_list);
 
if (p_medianum == 0)
// specific media requested
{
p_medianum := 1; // start checking from first media
}
if (p_medianum > 0)
// specific media requested
{
if (not (p_medianum > v_mn)) {
v_mn := p_medianum;
}
}
 
// handling of media list elements
for (i := 0; i < v_mn; i := i + 1) {
v_cn := 0; // initialize the number of attributes of the media list entry
if (isvalue(vc_sdp_local.media_list))
// media_list is optional
{
// log("vc_sdp_local.media_list[i ] ",vc_sdp_local.media_list[i ] );
if (isvalue(vc_sdp_local.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_local.media_list[i].attributes);
}
 
v_set_direction := false;
 
// if (lengthof(vc_sdp_local.media_list[i ] .media_field.fmts)>1)
// select the first one
for (j := 0; j < v_cn; j := j + 1) {
if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv)) {
v_mediaAttributes[k] := valueof(p_direction);
v_set_direction := true;
}
else
// non-direction attributes will be copied
{
v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
}
k := k + 1;
}
 
if (not v_set_direction) {
v_mediaAttributes[k] := valueof(p_direction);
}
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
// }
}
}
// add handling of prenegotiation, change ports if required etc.
// if prenegotiation...
}
 
/**
* @desc modify session and media attributes direction
*/
function f_SIP_modSessionDirection(
template(value) SDP_attribute p_direction
) runs on SipComponent {
var boolean v_set_direction := false;
var integer v_mn := 0, i := 0;
 
if (isvalue(vc_sdp_local.attributes)) {
v_mn := lengthof(vc_sdp_local.attributes);
 
for (i := 0; i < v_mn; i := i + 1) {
// for every single attribute (that is not omit)
if (ischosen(vc_sdp_local.attributes[i].recvonly) or ischosen(vc_sdp_local.attributes[i].sendonly) or ischosen(vc_sdp_local.attributes[i].inactive) or ischosen(vc_sdp_local.attributes[i].sendrecv)) {
vc_sdp_local.attributes[i] := valueof(p_direction);
v_set_direction := true;
}
}
if (not v_set_direction)
// if not sent before
{
vc_sdp_local.attributes[v_mn] := valueof(p_direction);
}
}
else {
vc_sdp_local.attributes[0] := valueof(p_direction);
}
}
 
/**
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirection(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {
setverdict(fail);
}
}
else {
setverdict(pass);
log("*** " &__SCOPE__& ": INFO: attribute found in message body ***");
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
 
/*
*
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
log(vc_response.messageBody.sdpMessageBody);log(p_direction_in);
if (not (ispresent(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)
)))
{log("than branch of if");
if (
match(valueof(p_direction_in),valueof(mw_attribute_sendrecv)) and
not(f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirection(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {setverdict(fail);};}
else {setverdict(pass);log("attribute found in message body");};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
else {
setverdict(fail);
}
}
else {
setverdict(pass);
log("*** " &__SCOPE__& ": INFO: attribute found in message body ***");
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
 
/*
*
* @desc check (from remote) and set (local) the session attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirectionSession(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (ispresent(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in)
)))
{if (
match(valueof(mw_attribute_sendrecv),valueof(p_direction_in)) and
not(f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirectionSession(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {setverdict(fail);};};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
else {
setverdict(fail);
}
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
 
/*
*
/*
*
* @desc check (from remote) and set (local) the session attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirectionSession(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (ispresent(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)
)))
{if (
match(valueof(mw_attribute_sendrecv),valueof(p_direction_in)) and
not(f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirectionSession(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {setverdict(fail);};};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
else {
setverdict(fail);
}
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
 
 
/*
*
* @desc check (from remote) and set (local)the session/media attribute lines on directions
* @param p_direction_in attribute to be check
* @param p_direction_out attrubyte to be
* @return
* @verdict
*/
function f_SIP_checkSDPrespDirection(template SDP_attribute p_direction_in) runs on SipComponent
{
// check incoming SDP attribute
if (not (ispresent(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)))
{setverdict(fail);};
}
/*
*
* @desc check (from remote) and set (local)the session/media attribute lines on directions
* @param p_direction_in attribute to be check
* @param p_direction_out attrubyte to be
* @return
* @verdict
*/
function f_SIP_checkSDPrespDirection(
template SDP_attribute p_direction_in
) runs on SipComponent {
// check incoming SDP attribute
if (not (isvalue(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in))) {
setverdict(fail);
}
}
 
/**
* @desc check media/attribute lines from remote
*
*/
function f_SIP_checkMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
return boolean
{
var integer v_mn, v_cn := 0, i, j;
var boolean v_result := false;
//increase session version
vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
// if more than one codec, select the firs one
v_mn:= sizeof(vc_sdp_remote.media_list);
if (p_medianum == 0) //specific media requested
{
p_medianum := 1; // start checking from first media
};
if (p_medianum > 0) //specific media requested
{
if (p_medianum > v_mn) {return false}
else {v_mn := p_medianum}
};
for (i :=p_medianum-1; i < v_mn; i := i+1)
{
//for every single media
if (ispresent(vc_sdp_remote.media_list[i].attributes))
{
v_cn := sizeof(vc_sdp_remote.media_list[i].attributes);
log (v_cn);
};
if (sizeof(vc_sdp_remote.media_list[i].attributes)>0)
{
// select the first one
log(vc_sdp_remote.media_list[i].attributes);
for (j :=0; j<sizeof(vc_sdp_remote.media_list[i].attributes); j:=j+1)
{
log(vc_sdp_remote.media_list[i].attributes[j]);
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly)
or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly)
or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive)
or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv))
{
if (match(vc_sdp_remote.media_list[i].attributes[j],p_direction))
{ v_result := true; }
else { return false; }
}
/**
* @desc check media/attribute lines from remote
*/
function f_SIP_checkMediaDirection(
integer p_medianum,
template SDP_attribute p_direction
) runs on SipComponent
return boolean {
var integer v_mn, v_cn := 0, i, j;
var boolean v_result := false;
// increase session version
vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1);
// if more than one codec, select the firs one
v_mn := lengthof(vc_sdp_remote.media_list);
if (p_medianum == 0)
// specific media requested
{
p_medianum := 1; // start checking from first media
}
if (p_medianum > 0)
// specific media requested
{
if (p_medianum > v_mn) {
return false;
}
else {
v_mn := p_medianum;
}
}
for (i := p_medianum - 1; i < v_mn; i := i + 1) {
// for every single media
if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_remote.media_list[i].attributes);
}
if (lengthof(vc_sdp_remote.media_list[i].attributes) > 0) {
// select the first one
for (j := 0; j < lengthof(vc_sdp_remote.media_list[i].attributes); j := j + 1) {
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv)) {
if (match(vc_sdp_remote.media_list[i].attributes[j], p_direction)) {
v_result := true;
}
else {
return false;
}
}
}
}
}
return v_result;
}
 
//v_result := true; // TODO This is a shortcut since direction attributes are not decoded
}
}
}
return v_result
}
/**
* @desc copy media/attribute lines from remote to local SDP variable
*/
function f_copy_SDP(
) runs on SipComponent {
if (isvalue(vc_sdp_remote.connection)) {
vc_sdp_local.connection := vc_sdp_remote.connection;
}
else {
vc_sdp_local.connection := omit;
}
 
/**
* @desc copy media/attribute lines from remote to local SDP variable
*
*/
function f_copy_SDP() runs on SipComponent
{
if (ispresent(vc_sdp_remote.connection))
{vc_sdp_local.connection := vc_sdp_remote.connection}
else {vc_sdp_local.connection := omit};
vc_sdp_local.origin := vc_sdp_remote.origin;
vc_sdp_local.session_name := vc_sdp_remote.session_name;
if (ispresent(vc_sdp_remote.bandwidth))
{vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth}
else {vc_sdp_local.bandwidth := {}};
if (ispresent(vc_sdp_remote.media_list))
{
// // cleaning of media before assignment
// if (ispresent(vc_sdp_local.media_list))
// {
// for (var integer i:=0; i<sizeof(vc_sdp_local.media_list); i:=i+1)
// {
// vc_sdp_local.media_list[i] := omit ;
// }
// };
vc_sdp_local.media_list := vc_sdp_remote.media_list;
}
}
}//end group SDPOperations
vc_sdp_local.origin := vc_sdp_remote.origin;
vc_sdp_local.session_name := vc_sdp_remote.session_name;
 
group AwaitingMessage {
/**
*
* @desc Function for time delay
*/
function f_awaitingDelayTimer(float p_delay) runs on SipComponent
{
tc_tDelay.start(p_delay);
alt
{
[] tc_tDelay.timeout
{
setverdict (pass);
}
}
} //end f_awaitingDelayTimer
/**
*
* @desc Function waiting for any MSG -request/response
*/
function f_awaitingAnyPassOnTimeout() runs on SipComponent
{
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive //TAU error if expect (*)
{
tc_wait.stop;
vc_boo_response:=true;
vc_boo_request:=true;
//setverdict(pass)
}
[] tc_wait.timeout
{
vc_boo_response:=false;
vc_boo_request:=false;
//setverdict (pass)
}
}
} //end f_awaitingResponsePassOnTimeout
if (isvalue(vc_sdp_remote.bandwidth)) {
vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth;
}
else {
vc_sdp_local.bandwidth := {};
}
 
/**
*
* @desc Function waiting for no MSG -request/response
*/
function f_awaitingNonePassOnTimeout() runs on SipComponent
{
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] tc_wait.timeout
{
setverdict (pass);
}
}
} //end f_awaitingResponsePassOnTimeout
/**
*
* @desc function awaits REGISTER
* @param p_register expected REGISTER request
*/
function f_awaitingREGISTER(in template REGISTER_Request p_register) runs on SipComponent
{
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_register)-> value v_request sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfREGISTER(v_request);
}
[] tc_wait.timeout
{
setverdict (fail);
f_componentStop();
if (isvalue(vc_sdp_remote.media_list)) {
// // cleaning of media before assignment
// if (isvalue(vc_sdp_local.media_list))
// {
// for (var integer i:=0; i<lengthof(vc_sdp_local.media_list); i:=i+1)
// {
// vc_sdp_local.media_list[i ] := omit ;
// }
// };
vc_sdp_local.media_list := vc_sdp_remote.media_list;
}
}
}
/**
*
* @desc function awaits SUBSCRIBE
* @param p_register expected SUBSCRIBE request
*/
function f_awaitingSUBSCRIBE(in template SUBSCRIBE_Request p_subscribe) runs on SipComponent
{
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_subscribe)-> value v_request sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
{
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
//f_send200OK();
}
 
 
} // end group SDPOperations
 
group AwaitingMessage {
 
/**
* @desc Function for time delay
*/
function f_awaitingDelayTimer(
float p_delay
) runs on SipComponent {
tc_tDelay.start(p_delay);
alt {
[] tc_tDelay.timeout {
setverdict(pass);
}
}
}
}
/**
*
* @desc function awaits REGISTER and sends a 200 OK response
* @param p_reply flag used to avoid the 200OK response sending
*/
function f_awaitingREGISTER_sendReply(in template REGISTER_Request p_register, in boolean p_reply) runs on SipComponent
{
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_register)-> value v_request sender vc_sent_label
{
tc_wait.stop;
vc_request := v_request;
f_setHeadersOnReceiptOfREGISTER(v_request);
//Answer to the Request
if (p_reply) {f_send200OK();};
}
} // end f_awaitingDelayTimer
 
[] tc_wait.timeout
{
setverdict (fail);
f_componentStop();
}
}
}
/**
* @desc Function waiting for any MSG -request/response
*/
function f_awaitingAnyPassOnTimeout(
) runs on SipComponent {
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive
{
tc_wait.stop;
vc_boo_response := true;
vc_boo_request := true;
// setverdict(pass)
}
[] tc_wait.timeout {
vc_boo_response := false;
vc_boo_request := false;
// setverdict (pass)
}
}
} // end f_awaitingResponsePassOnTimeout
 
/**
*
* @desc Function waiting for a 200 OK response
* @param p_cSeq_s current cSeq expectation
*/
function f_awaitingOkResponse(inout CSeq p_cSeq_s) runs on SipComponent
{
/**
* @desc Function waiting for no MSG -request/response
*/
function f_awaitingNonePassOnTimeout(
) runs on SipComponent {
tc_wait.start(PX_SIP_TWAIT);
alt {
[] tc_wait.timeout {
setverdict(pass);
}
}
} // end f_awaitingNonePassOnTimeout
 
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
setverdict(pass)
}
}
} //end awaitingOkResponse
/**
* @desc function awaits REGISTER
* @param p_register expected REGISTER request
*/
function f_awaitingREGISTER(
in template(present) REGISTER_Request p_register := ?
) runs on SipComponent {
var Request v_request;
 
/**
*
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponse(in template Response p_Response) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (p_Response) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
//setverdict(pass)
}
}
} //end f_awaitingResponse
/**
*
* @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx
* @param p_Response expected response message
*/
function f_awaitingResponseSendACK(in template Response p_Response) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
alt {
[] SIPP.receive (p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
LibSip_Steps.f_setHeadersACK();
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
setverdict(pass);
}
}
} //end f_awaitingResponse
/**
*
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponsePassOnTimeout(in template Response p_Response) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (p_Response) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
vc_boo_response:=true;
//setverdict(pass)
}
[] tc_resp.timeout
{
vc_boo_response:=false;
//setverdict (pass)
}
}
} //end f_awaitingResponsePassOnTimeout
/**
* @desc await INFO request
* reply with 200 OK
*/
function f_awaitingINFO_sendReply(in template INFO_Request p_info) runs on SipComponent
{
var INFO_Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_info)-> value v_request sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_request);
//Answer to the INFO
f_send200OK();
}
}
} // end of f_awaitingINFO_sendReply
/**
*
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE(template INVITE_Request p_request) runs on SipComponent
{
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv:= true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[vc_interface_isc]SIPP.receive (mw_INVITE_Request_Base) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
//clear session - send 486 and await ACK
f_sendResponse(m_Response_Base(c_statusLine486,vc_callId,vc_cSeq,vc_caller_From,vc_caller_To,vc_via));
f_awaitingACK(mw_ACK_Request_Base(?));
//await 486 which go towards and send ACK
f_awaitingResponse(mw_Response_Base(c_statusLine486,?,?));
f_SendACK(m_ACK_Request_Base(vc_requestUri,vc_callId,vc_cSeq,vc_from,vc_to,vc_via));
syncPort.send(m_syncClientStop);
stop
}
}
} //end f_awaitingINVITE
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_register) -> value v_request sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfREGISTER(v_request);
}
[] tc_wait.timeout {
setverdict(fail);
f_componentStop();
}
}
}
 
/**
*
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_No100Response(template INVITE_Request p_request) runs on SipComponent
{
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv:= true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
//SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
}
} //end f_awaitingInviteRequest
/**
* @desc function awaits SUBSCRIBE
* @param p_register expected SUBSCRIBE request
*/
function f_awaitingSUBSCRIBE(
in template(present) SUBSCRIBE_Request p_subscribe := ?
) runs on SipComponent {
var Request v_request;
 
/**
*
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_PassOnTimeout(template INVITE_Request p_request) runs on SipComponent
{
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv:= true; // communication has started
vc_boo_request := true;
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[]tc_wait.timeout
{
vc_boo_request := false;
}
}
} //end f_awaitingInviteRequest
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
// f_send200OK();
}
}
}
 
/**
*
* @desc function awaiting ACK request
*/
function f_awaitingACK(in template ACK_Request p_ACK) runs on SipComponent
{
var Request v_ACK_Request;
tc_ack.start(PX_SIP_TACK);
alt
{
[] SIPP.receive(p_ACK) -> value v_ACK_Request
{
f_setHeadersOnReceiptOfRequest(v_ACK_Request);
tc_ack.stop;
}
}
} //end f_awaitingAckRequest
/**
* @desc function awaits REGISTER and sends a 200 OK response
* @param p_reply flag used to avoid the 200OK response sending
*/
function f_awaitingREGISTER_sendReply(
in template(present) REGISTER_Request p_register := ?,
in boolean p_reply
) runs on SipComponent {
var Request v_request;
 
/**
*
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE(in template BYE_Request p_BYE) runs on SipComponent
{
var BYE_Request v_BYE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_BYE) -> value v_BYE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_bye:= true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
//f_send200OK();
}
}
} // end f_awaitingBYE
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_register) -> value v_request sender vc_sent_label {
tc_wait.stop;
vc_request := v_request;
f_setHeadersOnReceiptOfREGISTER(v_request);
// Answer to the Request
if (p_reply) {
f_send200OK();
}
}
[] tc_wait.timeout {
setverdict(fail);
f_componentStop();
}
}
}
 
/**
*
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE_sendReply
(in template BYE_Request p_BYE) runs on SipComponent
{
var BYE_Request v_BYE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_BYE) -> value v_BYE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_bye:= true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
f_send200OK();
}
}
} // end f_awaitingBYE_sendReply
/**
*
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE_sendReply_PassOnTimeout(in template BYE_Request p_BYE) runs on SipComponent
{
var BYE_Request v_BYE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_BYE) -> value v_BYE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_bye:= true;
vc_boo_request := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
f_send200OK();
}
[] tc_wait.timeout
{
vc_boo_request := false;
}
}
} // end f_awaitingBYE_sendReply_PassOnTimeout
 
/**
*
* @desc function awaiting CANCEL
* @param p_CANCEL expected CANCEL
*/
function f_awaitingCANCEL(in template CANCEL_Request p_CANCEL) runs on SipComponent
{
var CANCEL_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_CANCEL) -> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end f_awaitingCANCEL
/**
* @desc await MESSAGE request
*/
function f_awaitingMESSAGE(in template MESSAGE_Request p_MSG) runs on SipComponent
{
var MESSAGE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
[] SIPP.receive(mw_MESSAGE_Request_Base)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
log("Received MESSAGE not as expected!");
setverdict (fail);
}
}
} // end of f_awaitingMESSAGE
/**
* @desc await MESSAGE request
* reply with 200 OK
*/
function f_awaitingMESSAGE_sendReply() runs on SipComponent
{
var MESSAGE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(mw_MESSAGE_Request_Base)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
//Answer to the MESSAGE
f_send200OK();
}
}
} // end of f_awaitingMESSAGE_sendReply
/**
* @desc Function waiting for a 200 OK response
* @param p_cSeq_s current cSeq expectation
*/
function f_awaitingOkResponse(
inout CSeq p_cSeq_s
) runs on SipComponent {
 
/**
* @desc await MESSAGE request
*/
function f_awaitingMESSAGE_sendReply_PassOnTimeout(in template MESSAGE_Request p_MSG) runs on SipComponent
{
var MESSAGE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
//Answer to the MESSAGE
//f_send200OK();
vc_boo_request := true;
f_send200OK();
//setverdict (pass);
}
[] tc_wait.timeout
{
vc_boo_request := false;
//setverdict (pass);
}
}
} // end of f_awaitingMESSAGE_PassOnTimeout
/**
* @desc await NOTIFY request
*/
function f_awaitingNOTIFY(in template NOTIFY_Request p_MSG) runs on SipComponent
{
var NOTIFY_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_getRouteMapIntoRecordRoute(vc_cSeq, v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
setverdict(pass);
}
}
} // end awaitingOkResponse
 
/**
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponse(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
a_awaitingResponse(p_Response);
} // end f_awaitingResponse
 
altstep a_awaitingResponse(
in template(present) Response p_Response := ?
) runs on SipComponent {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// setverdict(pass)
}
} // end f_awaitingResponse
 
/**
* @desc Function waiting for a response, repeat if 100 Trying is received
* @param p_Response expected response message
*/
function f_awaitingResponseIgnore100Trying(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
alt {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// setverdict(pass)
}
[] SIPP.receive(mw_Response_Base(c_statusLine100, vc_callId, vc_cSeq)) -> value vc_response {
repeat;
}
}
} // end f_awaitingResponseIgnore100Trying
 
/**
* @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx
* @param p_Response expected response message
*/
function f_awaitingResponseSendACK(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
alt {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
LibSip_Steps.f_setHeadersACK();
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
setverdict(pass);
}
}
} // end f_awaitingResponse
 
/**
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponsePassOnTimeout(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
alt {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
vc_boo_response := true;
// setverdict(pass)
}
[] tc_resp.timeout {
vc_boo_response := false;
// setverdict (pass)
}
}
} // end f_awaitingResponsePassOnTimeout
 
/**
* @desc Function waiting for a 200 OK response
* @param p_cSeq_s current cSeq expectation
*/
function f_awaitingOkResponseAndNOTIFY_sendReply(
inout CSeq p_cSeq_s,
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
 
var boolean v_received_OK := false;
var boolean v_received_NOTIFY := false;
var NOTIFY_Request v_MSG;
tc_resp.start;
tc_wait.start(PX_SIP_TWAIT);
 
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
vc_subscribed := true;
f_setHeadersOnReceiptOfResponse(vc_response);
v_received_OK := true;
setverdict(pass);
if (not (v_received_NOTIFY)) {
repeat;
}
}
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
v_received_NOTIFY := true;
if (not (v_received_OK)) {
repeat;
}
}
}
} // end f_awaitingOkResponseAndNOTIFY_sendReply
 
/**
* @desc await INFO request reply with 200 OK
*/
function f_awaitingINFO_sendReply(
in template(value) INFO_Request p_info
) runs on SipComponent {
var INFO_Request v_request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_info) -> value v_request sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_request);
// Answer to the INFO
f_send200OK();
}
}
} // end of f_awaitingINFO_sendReply
 
/**
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE(
template(present) INVITE_Request p_request := ?
) runs on SipComponent {
var INVITE_Request v_INVITE_Request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv := true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[vc_interface_isc] SIPP.receive(mw_INVITE_Request_Base) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
// clear session - send 486 and await ACK
f_sendResponse(m_Response_Base(c_statusLine486, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
f_awaitingACK(mw_ACK_Request_Base(?));
// await 486 which go towards and send ACK
f_awaitingResponse(mw_Response_Base(c_statusLine486, ?, ?));
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
syncPort.send(m_syncClientStop);
stop;
}
}
} // end f_awaitingINVITE
 
/**
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_No100Response(
template(present) INVITE_Request p_request := ?
) runs on SipComponent {
var INVITE_Request v_INVITE_Request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv := true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
// SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
}
} // end f_awaitingInviteRequest
 
/**
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_PassOnTimeout(
template(present) INVITE_Request p_request := ?
) runs on SipComponent {
var INVITE_Request v_INVITE_Request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv := true; // communication has started
vc_boo_request := true;
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[] tc_wait.timeout {
vc_boo_request := false;
}
}
} // end f_awaitingInviteRequest
 
/**
* @desc function awaiting ACK request
*/
function f_awaitingACK(
in template(present) ACK_Request p_ACK := ?
) runs on SipComponent {
f_awaitingACK_setHeaders(p_ACK, false);
} // end f_awaitingACK
 
/**
* @desc function awaiting ACK request
*/
function f_awaitingACK_setHeaders(
in template(present) ACK_Request p_ACK := ?,
in boolean p_setHeaders
) runs on SipComponent {
var Request v_ACK_Request;
tc_ack.start;
 
alt {
[] SIPP.receive(p_ACK) -> value v_ACK_Request {
tc_ack.stop;
if (p_setHeaders) {
f_setHeadersOnReceiptOfRequest(v_ACK_Request);
}
}
}
} // end f_awaitingACK_setHeaders
 
/**
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE(
in template(present) BYE_Request p_BYE := ?
) runs on SipComponent {
var BYE_Request v_BYE_Request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_bye := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
// f_send200OK();
}
}
} // end f_awaitingBYE
 
/**
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE_sendReply(
in template(present) BYE_Request p_BYE := ?
) runs on SipComponent {
var BYE_Request v_BYE_Request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_bye := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
f_send200OK();
}
}
} // end f_awaitingBYE_sendReply
 
/**
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE_sendReply_PassOnTimeout(
in template(present) BYE_Request p_BYE := ?
) runs on SipComponent {
var BYE_Request v_BYE_Request;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_bye := true;
vc_boo_request := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
f_send200OK();
}
[] tc_wait.timeout {
vc_boo_request := false;
}
}
} // end f_awaitingBYE_sendReply_PassOnTimeout
 
/**
* @desc function awaiting CANCEL
* @param p_CANCEL expected CANCEL
*/
function f_awaitingCANCEL(
in template(present) CANCEL_Request p_CANCEL := ?
) runs on SipComponent {
var CANCEL_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end f_awaitingCANCEL
/**
* @desc await MESSAGE request
*/
function f_awaitingMESSAGE(
in template(present) MESSAGE_Request p_MSG := ?
) runs on SipComponent {
var MESSAGE_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
[] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
log("*** " &__SCOPE__& ": INFO: Received MESSAGE not as expected! ***");
setverdict(fail);
}
}
} // end of f_awaitingMESSAGE
 
/**
* @desc await MESSAGE request reply with 200 OK
*/
function f_awaitingMESSAGE_sendReply(
) runs on SipComponent {
var MESSAGE_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the MESSAGE
f_send200OK();
}
}
} // end of f_awaitingMESSAGE_sendReply
 
/**
* @desc await MESSAGE request
*/
function f_awaitingMESSAGE_sendReply_PassOnTimeout(
in template(present) MESSAGE_Request p_MSG := ?
) runs on SipComponent {
var MESSAGE_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the MESSAGE
// f_send200OK();
vc_boo_request := true;
f_send200OK();
// setverdict (pass);
}
[] tc_wait.timeout {
vc_boo_request := false;
// setverdict (pass);
}
}
} // end of f_awaitingMESSAGE_PassOnTimeout
 
/**
* @desc await NOTIFY request
*/
function f_awaitingNOTIFY(
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var NOTIFY_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingNOTIFY
 
/**
* @desc await NOTIFY request reply with 200 OK
*/
function f_awaitingNOTIFY_sendReply(
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var NOTIFY_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
}
}
} // end of f_awaitingNOTIFY_sendReply
 
function f_awaitingNOTIFY_sendReply_postamble(
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var NOTIFY_Request v_MSG;
 
tc_wait.start(5.0);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
}
[] tc_wait.timeout {
// do nothing as receiving the Notify in de-registration is not part of the test body
}
}
} // end of f_awaitingNOTIFY_sendReply_postamble
 
/**
* @desc await PRACK request reply with 200 OK
*/
function f_awaitingPRACK_sendReply(
in template(present) PRACK_Request p_MSG := ?
) runs on SipComponent {
var PRACK_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the PRACK
if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) {
f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local)));
}
else {
f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute()));
}
}
}
} // end of f_awaitingPRACK_sendReply
 
function f_awaitingPRACK(
in template(present) PRACK_Request p_MSG := ?
) runs on SipComponent {
var PRACK_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingPRACK
 
/**
* @desc await PUBLISH request reply with 200 OK
*/
function f_awaitingPUBLISH_sendReply(
in template(present) PUBLISH_Request p_MSG := ?
) runs on SipComponent {
var PUBLISH_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the PUBLISH
f_send200OK();
}
}
} // end of f_awaitingPUBLISH_sendReply
 
/**
* @desc await UPDATE request
*/
function f_awaitingUPDATE(
in template(present) UPDATE_Request p_MSG := ?
) runs on SipComponent {
var UPDATE_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingUPDATE
 
/**
* @desc await UPDATE request reply with 200 OK
*/
function f_awaitingUPDATE_sendReply(
in template(present) UPDATE_Request p_MSG := ?
) runs on SipComponent {
var UPDATE_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the UPDATE
if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) {
f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local)));
}
else {
f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute()));
}
}
}
} // end of f_awaitingUPDATE_sendReply
 
 
/**
* @desc await REFER request
*/
function f_awaitingREFER(
in template(present) REFER_Request p_MSG := ?
) runs on SipComponent {
var REFER_Request v_MSG;
 
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfREFER(v_MSG);
}
}
} // end of f_awaitingUPDATE
 
 
 
} // end AwaitingMessage
 
group SendMessage {
 
/**
* @desc send ACK message, update the route and recordRoute header fields depending on boolean flags
* @param p_request template of the message to be sent
*/
function f_SendACK(
template(value) ACK_Request p_request
) runs on SipComponent {
// p_request.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
// n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
SIPP.send(p_request) to vc_sent_label;
}
} // end of f_awaitingNOTIFY
/**
* @desc await NOTIFY request
* reply with 200 OK
*/
function f_awaitingNOTIFY_sendReply(in template NOTIFY_Request p_MSG) runs on SipComponent
{
var NOTIFY_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_getRouteMapIntoRecordRoute(vc_cSeq, v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
//Answer to the NOTIFY
f_send200OK();
}
}
} // end of f_awaitingNOTIFY_sendReply
 
/**
* @desc await PRACK request
* reply with 200 OK
*/
function f_awaitingPRACK_sendReply(in template PRACK_Request p_MSG) runs on SipComponent
{
var PRACK_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
//Answer to the PRACK
f_send200OK();
}
}
} // end of f_awaitingPRACK_sendReply
/**
* @desc await PUBLISH request
* reply with 200 OK
*/
function f_awaitingPUBLISH_sendReply(in template PUBLISH_Request p_MSG) runs on SipComponent
{
var PUBLISH_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
//Answer to the PUBLISH
f_send200OK();
}
}
} // end of f_awaitingPUBLISH_sendReply
/**
* @desc await UPDATE request
*/
function f_awaitingUPDATE(in template UPDATE_Request p_MSG) runs on SipComponent
{
var UPDATE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingUPDATE
/**
* @desc await UPDATE request
* reply with 200 OK
*/
function f_awaitingUPDATE_sendReply(in template UPDATE_Request p_MSG) runs on SipComponent
{
var UPDATE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
//Answer to the UPDATE
f_send200OK();
}
}
/**
* @desc send BYE message, update the route and recordRoute header fields depending on boolean flags
* @param p_request template of the message to be sent
*/
function f_SendBYE(
template(value) BYE_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
} // end of f_awaitingUPDATE_sendReply
/**
* @desc await REFER request
*/
function f_awaitingREFER(in template REFER_Request p_MSG) runs on SipComponent
{
var REFER_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfREFER(v_MSG);
}
}
} // end of f_awaitingUPDATE
} // end AwaitingMessage
/**
* @desc send CANCEL message
* @param p_request template of the message to be sent
*/
function f_SendCANCEL(
template(value) CANCEL_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
group SendMessage {
/**
* @desc send INFO message
* @param p_request template of the message to be sent
*/
function f_SendINFO(
template(value) INFO_Request p_request
) runs on SipComponent {
f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via
SIPP.send(p_request) to vc_sent_label;
}
 
/**
*
* @desc send ACK message, update the route and recordRoute header fields depending on boolean flags
* @param p_request template of the message to be sent
*/
function f_SendACK(template ACK_Request p_request) runs on SipComponent
{
//p_request.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
// n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send BYE message, update the route and recordRoute header fields depending on boolean flags
* @param p_request template of the message to be sent
*/
function f_SendBYE(template BYE_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send CANCEL message
* @param p_request template of the message to be sent
*/
function f_SendCANCEL(template CANCEL_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send INFO message
* @param p_request template of the message to be sent
*/
function f_SendINFO(template INFO_Request p_request) runs on SipComponent
{
f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send INVITE message
* @param p_request template of the message to be sent
*/
function f_SendINVITE(template INVITE_Request p_request) runs on SipComponent
{
vc_requestFor407 := valueof(p_request);
SIPP.send(p_request) to vc_sent_label;
vc_request := valueof(p_request);
if(PX_SIP_INVITE_AUTHENTICATION_ENABLED) {a_altstep_401or407();};
}
/**
* @desc send INVITE message
* @param p_request template of the message to be sent
*/
function f_SendINVITE(
template(value) INVITE_Request p_request
) runs on SipComponent {
vc_requestFor407 := valueof(p_request);
SIPP.send(p_request) to vc_sent_label;
vc_request := vc_requestFor407;
if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) {
a_altstep_401or407();
}
}
 
/**
*
* @desc send PRACK message
* @param p_request template of the message to be sent
*/
function f_SendPRACK() runs on SipComponent
{
vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via
SIPP.send(m_PRACK_Request_Base(
vc_requestUri,
vc_callId,
vc_cSeq,
vc_from,
vc_to,
vc_via,
vc_rAck
)) to vc_sent_label;
}
/**
* @desc send PRACK message
* @param p_request template of the message to be sent
*/
function f_SendPRACK(
) runs on SipComponent {
var integer responseNum := 1;
var PRACK_Request prackReq;
if (isvalue(vc_response.msgHeader.rSeq) and
isvalue(vc_response.msgHeader.rSeq.responseNum)){
responseNum := vc_response.msgHeader.rSeq.responseNum;
}
vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via
prackReq := m_PRACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_rAck);
if (isvalue(vc_response.msgHeader.recordRoute)){
prackReq.msgHeader.route := f_route();
}
SIPP.send(prackReq) to vc_sent_label;
}
 
/**
*
* @desc send PUBLISH message
* @param p_request template of the message to be sent
*/
function f_SendPUBLISH(template PUBLISH_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send REGISTER message
* @param p_request template of the message to be sent
*/
function f_SendREGISTER(template REGISTER_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send SUBSCRIBE message
* @param p_request template of the message to be sent
*/
function f_SendSUBSCRIBE(template SUBSCRIBE_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send UPDATE message
* @param p_request template of the message to be sent
*/
function f_SendUPDATE(template UPDATE_Request p_request) runs on SipComponent
{
f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via
p_request.msgHeader.cSeq := vc_cSeq;
p_request.msgHeader.contact := vc_contact;
p_request.msgHeader.via := vc_via;
vc_requestFor407 := valueof(p_request);
SIPP.send(p_request) to vc_sent_label;
if(PX_SIP_INVITE_AUTHENTICATION_ENABLED) {a_altstep_401or407();};
}
/**
*
* @desc function send MESSAGE message
* @param p_request template of the message to be sent
*/
function f_SendMESSAGE(template MESSAGE_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc function send NOTIFY message
* @param p_request template of the notify to be sent
*/
function f_SendNOTIFY(template NOTIFY_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send REFER message
* @param p_request template of the message to be sent
*/
function f_SendREFER(template REFER_Request p_request) runs on SipComponent
{
SIPP.send(p_request) to vc_sent_label;
}
/**
*
* @desc send 200 OK
*/
function f_send200OK() runs on SipComponent
{
f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
}
/**
*
* @desc send response
* @param p_request template of the message to be sent
*/
function f_sendResponse(template Response p_response) runs on SipComponent
{
//p_response.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route//TODO check if route header is needed in responses
p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
SIPP.send(p_response) to vc_sent_label;
}
/**
* @desc send PUBLISH message
* @param p_request template of the message to be sent
*/
function f_SendPUBLISH(
template(value) PUBLISH_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
} // end SendMessage
/**
* @desc send REGISTER message
* @param p_request template of the message to be sent
*/
function f_SendREGISTER(
template(value) REGISTER_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
group GlobalSteps {
/**
*
* @desc component initialization
* @param p_cSeq_s cSeq value to be assigned to the component variable
*/
function f_init_component(inout CSeq p_cSeq_s) runs on SipComponent
{
//Variables
vc_cSeq := p_cSeq_s;
//Defaults
vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
vc_default := activate (a_clearRegistration());
}
/**
*
* @desc component termination
*/
function f_terminate_component() runs on SipComponent
{
log("component terminated - forced!");
deactivate;
stop;
}
/**
* @desc send SUBSCRIBE message
* @param p_request template of the message to be sent
*/
function f_SendSUBSCRIBE(
template(value) SUBSCRIBE_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
/**
*
* @desc component termination
*/
function f_componentStop() runs on SipComponent
{
syncPort.send(m_syncClientStop);
SIPP.clear;
stop;
}
/**
* @desc send UPDATE message
* @param p_request template of the message to be sent
*/
function f_SendUPDATE(
template(value) UPDATE_Request p_request
) runs on SipComponent {
f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via
p_request.msgHeader.cSeq := vc_cSeq;
p_request.msgHeader.contact := vc_contact;
p_request.msgHeader.via := vc_via;
vc_requestFor407 := valueof(p_request);
SIPP.send(p_request) to vc_sent_label;
if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) {
a_altstep_401or407();
}
}
 
/**
*
* @desc setting of user parameters with PIXIT values
* @param p_user identifies the selected user configuration and location
*/
function f_init_userprofile(in integer p_user) runs on SipComponent
{
vc_userprofile.id := p_user;
select(p_user){
case (c_userProfile_SIP1_home) { //variant c_userProfile_SIP1_home
vc_userprofile.currPort := PX_SIP_TS1_PORT;
vc_userprofile.currIpaddr := PX_SIP_TS1_IPADDR;
vc_userprofile.contactPort := PX_SIP_TS1_PORT;
vc_userprofile.contactIpaddr := PX_SIP_TS1_IPADDR;
vc_userprofile.bearerIpaddr := PX_SIP_TS1_BEARER_IPADDR;
vc_userprofile.homeDomain := PX_SIP_TS1_LOCAL_DOMAIN;
vc_userprofile.publUsername := PX_SIP_TS1_LOCAL_USER;
vc_userprofile.qop := PX_SIP_SUT_UE1_QOP;
vc_userprofile.privUsername := PX_SIP_SUT_UE1_USERNAME;
vc_userprofile.passwd := PX_SIP_SUT_UE1_PASSWD;
vc_userprofile.registrarDomain := PX_SIP_SUT_REGISTRAR_DOMAIN;
}
case (c_userProfile_SIP2_home) { //variant c_userProfile_SIP2_home
vc_userprofile.currPort := PX_SIP_TS2_PORT;
vc_userprofile.currIpaddr := PX_SIP_TS2_IPADDR;
vc_userprofile.contactPort := PX_SIP_TS2_PORT;
vc_userprofile.contactIpaddr := PX_SIP_TS2_IPADDR;
vc_userprofile.bearerIpaddr := PX_SIP_TS2_BEARER_IPADDR;
vc_userprofile.homeDomain := PX_SIP_TS2_LOCAL_DOMAIN;
vc_userprofile.publUsername := PX_SIP_TS2_LOCAL_USER;
vc_userprofile.qop := PX_SIP_SUT_UE2_QOP;
vc_userprofile.privUsername := PX_SIP_SUT_UE2_USERNAME;
vc_userprofile.passwd := PX_SIP_SUT_UE2_PASSWD;
vc_userprofile.registrarDomain := PX_SIP_SUT_REGISTRAR_DOMAIN;
}
}
}
/**
* @desc function send MESSAGE message
* @param p_request template of the message to be sent
*/
function f_SendMESSAGE(
template(value) MESSAGE_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
/**
*
* @desc function waits for particular time that allows the SUT to return to idle state
*/
function f_awaitSUTidle() runs on SipComponent
{
vc_ignore4xx := true; // allow 4xx in default
tc_noAct.start;
alt {
[] tc_noAct.timeout{}
}
}
/**
*
* @desc function waits for particular time before next expected message
*/
function f_wait(float p_time) runs on SipComponent
{
tc_noAct.start(p_time);
alt {
[] tc_noAct.timeout{}
}
}
/**
*
* @desc function cause termination of a PTC
* @param p_syncPoint dummy parameter (copied from the common lib)
*/
function f_check2Null(in charstring p_syncPoint) runs on SipComponent
{
//!= pass does not work, because in case of "none" execution shall continue
if (getverdict == inconc or getverdict == fail){
log("**** f_check2Null: Verdict evaluated to fail or inconc. Stopping test execution now ");
f_selfOrClientSyncAndVerdict (p_syncPoint, e_error) ;
}//end if
}
/*
*
/**
* @desc function send NOTIFY message
* @param p_request template of the notify to be sent
*/
function f_SendNOTIFY(
template(value) NOTIFY_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
/**
* @desc send REFER message
* @param p_request template of the message to be sent
*/
function f_SendREFER(
template(value) REFER_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
 
/**
* @desc send 200 OK
*/
function f_send200OK(
) runs on SipComponent {
f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
}
 
/**
* @desc send response
* @param p_request template of the message to be sent
*/
function f_sendResponse(
template(value) Response p_response
) runs on SipComponent {
p_response.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
SIPP.send(p_response) to vc_sent_label;
}
 
 
 
} // end SendMessage
 
group GlobalSteps {
/**
* @desc component initialization
* @param p_cSeq_s cSeq value to be assigned to the component variable
*/
function f_init_component(
inout CSeq p_cSeq_s
) runs on SipComponent {
// Variables
vc_cSeq := p_cSeq_s;
 
// Defaults
vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
vc_default := activate(a_clearRegistration());
}
 
/**
* @desc component termination
*/
function f_terminate_component(
) runs on SipComponent {
log("*** " &__SCOPE__& ": INFO: component terminated - forced! ***");
deactivate;
stop;
}
 
/**
* @desc component termination
*/
function f_componentStop(
) runs on SipComponent {
syncPort.send(m_syncClientStop);
SIPP.clear;
stop;
}
 
/**
* @desc function waits for particular time that allows the SUT to return to idle state
*/
function f_awaitSUTidle(
) runs on SipComponent {
vc_ignore4xx := true; // allow 4xx in default
tc_noAct.start;
alt {
[] tc_noAct.timeout {
}
}
}
 
/**
* @desc function waits for particular time before next expected message
*/
function f_wait(
float p_time
) runs on SipComponent {
tc_noAct.start(p_time);
alt {
[] tc_noAct.timeout {
}
}
}
 
/**
* @desc function cause termination of a PTC
* @param p_syncPoint dummy parameter (copied from the common lib)
*/
function f_check2Null(
in charstring p_syncPoint
) runs on SipComponent {
// != pass does not work, because in case of "none" execution shall continue
if (getverdict == inconc or getverdict == fail) {
log("*** f_check2Null: INFO: Verdict evaluated to fail or inconc. Stopping test execution now ***");
f_selfOrClientSyncAndVerdict(p_syncPoint, e_error);
} // end if
}
 
/*
*
* @desc original copied from older LibCommon_VerdictControl
*/
function f_getVerdict()
return FncRetCode {
var FncRetCode v_ret := e_error;
if (getverdict == pass or getverdict == none) {
v_ret := e_success;
}
return v_ret;
}
}// end group GlobalSteps
function f_getVerdict(
) return FncRetCode {
var FncRetCode v_ret := e_error;
if (getverdict == pass or getverdict == none) {
v_ret := e_success;
}
return v_ret;
}
 
group Registration {
/**
*
* @desc registration and authentication with MD5
* @param p_cSeq_s cseq parameter
* @param p_register register template
* @param p_auth flag indicating if authentication is needed
*/
function f_Registration(inout CSeq p_cSeq_s, out template REGISTER_Request p_register, in boolean p_auth, boolean p_emergency:=false) runs on SipComponent
{
if (PX_SIP_REGISTRATION)
{
f_setHeaders_REGISTER(p_cSeq_s, p_emergency); //TODO need if p_register not set
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
f_SendREGISTER(p_register); //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_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(p_cSeq_s, vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq_s);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
// Re-send protected REGISTER
f_SendREGISTER(p_register);//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)) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
log ("Authorization was not requested as expected");
}
}
}
else
{
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
}
 
};
}//end function f_Registration
/**
*
* @desc registration and authentication with MD5
* @param p_cSeq_s cseq parameter
* @param p_register register template
* @param p_auth flag indicating if authentication is needed
*/
function f_Registration_withTemplate(inout CSeq p_cSeq_s, inout template REGISTER_Request p_register, in boolean p_auth) runs on SipComponent
{
if (PX_SIP_REGISTRATION)
{
//f_setHeaders_REGISTER(p_cSeq_s); TODO need if p_register not set
//p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
f_SendREGISTER(p_register); //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_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(p_cSeq_s, vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq_s);
//p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
// Re-send protected REGISTER
p_register.requestLine.requestUri := vc_requestUri;
p_register.msgHeader.cSeq := vc_cSeq;
p_register.msgHeader.via := vc_via_REG;
p_register.msgHeader.authorization := vc_authorization;
f_SendREGISTER(p_register);//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)) -> value vc_response
{
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
log ("Authorization was not requested as expected");
}
}
}
else
{
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
}
 
};
}//end function f_Registration_withTemplate
} // end group GlobalSteps
 
group Registration {
 
/**
*
* @desc remove registration
* @param p_cSeq_s cseq parameter
*/
function f_RemoveRegistration(inout CSeq p_cSeq) runs on SipComponent
{
var CommaParam_List v_challenge;
var Credentials v_credentials;
var template REGISTER_Request v_request;
//
if(vc_DeregDone)
{
f_componentStop();
}
else {vc_DeregDone := true;}
if (PX_SIP_REGISTRATION)
{
f_setHeaders_deREGISTER(p_cSeq);
//TODO: 1st option
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg,
p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0");
//TODO@ 2nd option
// v_request := m_REGISTER_Request_Base(vc_requestUri, vc_callIdReg,
// p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
//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_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response
{
tc_resp.stop;
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq);
// TODO: 1st option
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg,
p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0");
// TODO: 2nd option
// v_request := m_REGISTER_Request_Base(vc_requestUri, vc_callIdReg,
// p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
//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_resp.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
/**
* @desc registration and authentication with MD5
* @param p_cSeq_s cseq parameter
* @param p_register register template
* @param p_auth flag indicating if authentication is needed
* @param p_emergency Set to true in case of emergency call
*/
function f_Registration(
inout CSeq p_cSeq_s,
out template(value) REGISTER_Request p_register,
in boolean p_auth,
in boolean p_emergency := false
) runs on SipComponent {
if (PX_SIP_REGISTRATION) {
f_setHeaders_REGISTER(p_cSeq_s, p_emergency);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
f_SendREGISTER(p_register); // 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_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq_s);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
// Re-send protected REGISTER
f_SendREGISTER(p_register); // LibSip
// awaiting 200 OK REGISTER
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***");
}
}
}
else {
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
}
} // end function f_Registration
 
/**
*
* @desc remove registration without authorization
* @param p_cSeq_s cseq parameter
*/
function f_RemoveRegistration_wo_authorization(inout CSeq p_cSeq) runs on SipComponent
{
var SemicolonParam_List tmp_params;
if (PX_SIP_REGISTRATION)
{
f_setHeaders_deREGISTER(p_cSeq);
f_SendREGISTER(m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq,
vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0" ));
f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
}
} // end f_RemoveRegistration_wo_authorization
/**
* @desc registration and authentication with MD5
* @param p_cSeq_s cseq parameter
* @param p_register register template
* @param p_auth flag indicating if authentication is needed
*/
function f_Registration_withTemplate(
inout CSeq p_cSeq_s,
inout template(value) REGISTER_Request p_register,
in boolean p_auth
) runs on SipComponent {
if (PX_SIP_REGISTRATION) {
if(not isbound(p_register)){
f_setHeaders_REGISTER(p_cSeq_s);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
}
f_SendREGISTER(p_register); // 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_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq_s);
// p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact,
// vc_authorization);
// Re-send protected REGISTER
p_register.requestLine.requestUri := vc_requestUri;
p_register.msgHeader.cSeq := vc_cSeq;
p_register.msgHeader.via := vc_via_REG;
p_register.msgHeader.authorization := vc_authorization;
f_SendREGISTER(p_register); // LibSip
// awaiting 200 OK REGISTER
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***");
}
}
}
else {
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
}
} // end function f_Registration_withTemplate
 
}//end group Registration
 
group Subscription {
/**
*
* @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
*/
function f_Subscription(inout CSeq p_cSeq_s,template SUBSCRIBE_Request p_subscribe) runs on SipComponent
{
if (PX_SIP_SUBSCRIPTION)
{
//f_setHeaders_SUBSCRIBE(p_cSeq_s);
//send SUBSCRIBE
f_SendSUBSCRIBE(p_subscribe);
// awaiting 200 OK SUBSCRIBE
f_awaitingOkResponse(p_cSeq_s);
//await NOTIFY and send reply 200 OK
f_awaitingNOTIFY_sendReply(mw_NOTIFY_Request_Base(vc_callId));
}
}//end function f_Subscription
/**
* @desc remove registration
* @param p_cSeq_s cseq parameter
*/
function f_RemoveRegistration(
inout CSeq p_cSeq
) runs on SipComponent {
var template(value) REGISTER_Request v_request;
var boolean v_receivedNotify := false;
 
/**
*
* @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
* @param p_notify notify template
*/
function f_SubscriptionWithNotification(inout CSeq p_cSeq_s, template SUBSCRIBE_Request p_subscribe, template NOTIFY_Request p_notify) runs on SipComponent
{
if (PX_SIP_SUBSCRIPTION)
{
f_setHeaders_SUBSCRIBE(p_cSeq_s);
//send SUBSCRIBE
f_SendSUBSCRIBE(p_subscribe);
// awaiting 200 OK SUBSCRIBE
f_awaitingOkResponse(p_cSeq_s);
}
if(PX_SIP_NOTIFICATION)
{
//await NOTIFY and send reply 200 OK
f_awaitingNOTIFY_sendReply(p_notify);
}
}//end function f_Subscription
//
if (vc_DeregDone) {
f_componentStop();
}
else {
vc_DeregDone := true;
}
 
/**
*
* @desc UE await subscrbe, send on 200 OK; possibility to handle also other SUBSCRIBE methods where event is different than reg
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
*/
function f_awaitingSubscription(inout CSeq p_cSeq_s, template SUBSCRIBE_Request p_subscribe) runs on SipComponent
{
var Request v_request;
tc_wait.start(2.0);//awaiting of all SUBSCRIBES
alt
{
[] SIPP.receive(p_subscribe)-> value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
if (PX_SIP_REGISTRATION) {
f_setHeaders_deREGISTER(p_cSeq);
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0");
 
f_SendREGISTER(v_request);
if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED) {
// receiving 401 Unauthorized response.
// and Re-send REGISTER request with Authorization header
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq);
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, 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_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// log ("Authorization was not requested as expected");
}
[] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) {
}
}
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
else {
tc_resp.start;
alt {
[] a_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) {
}
[] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) {
}
}
}
[] tc_wait.timeout
{
setverdict(pass);
 
// await NOTIFY and send reply 200 OK
if (vc_subscribed and v_receivedNotify == false) {
f_awaitingNOTIFY_sendReply_postamble(mw_NOTIFY_Request_Base(vc_callIdReg));
}
}
// TODO check how to solve sending of NOTIFY on SUBSCRIBE
}//end function f_awaitingSubscription
} // end f_RemoveRegistration
 
}//end group Subscription
/**
* @desc remove registration without authorization
* @param p_cSeq_s cseq parameter
*/
function f_RemoveRegistration_wo_authorization(
inout CSeq p_cSeq
) runs on SipComponent {
if (PX_SIP_REGISTRATION) {
f_setHeaders_deREGISTER(p_cSeq);
f_SendREGISTER(m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0"));
f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
}
} // end f_RemoveRegistration_wo_authorization
 
group Preambles {
/**
*
* @desc Set variables and default initialization for user profile
* @param p_userprofile user profile of call
* @param p_cSeq_s cseq parameter
*/
function f_SIP_preamble_woREG(in integer p_userprofile, inout CSeq p_cSeq_s) runs on SipComponent
{
//varables and altsteps
f_init_component(p_cSeq_s);
 
//Preamble
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));
}
/**
*
* @desc Set 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_SIP_preamble_withREG(in integer p_userprofile, inout CSeq p_cSeq_s, template REGISTER_Request p_register) runs on SipComponent
{
//preamble
f_SIP_preamble_woREG(p_userprofile, p_cSeq_s);
//Registration, Awaiting
f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);
}
}// end group Preambles
 
group Postambles {
} // end group Registration
 
/**
*
* @desc function send BYE and awaits reponse
* @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(SipUrl p_requestUri, CallId p_CallId, inout CSeq p_cSeq, From p_from,
template To p_to) runs on SipComponent
{
// Sending of a BYE request to release the call and expect a final response
f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, PX_SIP_BYE_CAUSE));
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;
}
}
} // end function f_terminateCall
group Subscription {
 
function f_cancelCall(template CANCEL_Request p_request)
runs on SipComponent
{
// This function is called to bring back the IUT in idle condition
// in case of errors or unexpected behaviour.
// Sending of a CANCEL request with the same Cseq
f_setHeadersCANCEL(vc_cSeq);
f_SendCANCEL(p_request);
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq))
{
tc_resp.stop;
}
}
}
/**
* @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
*/
function f_Subscription(
inout CSeq p_cSeq_s,
template(value) SUBSCRIBE_Request p_subscribe
) runs on SipComponent {
// send SUBSCRIBE
f_SendSUBSCRIBE(p_subscribe);
// awaiting 200 OK SUBSCRIBE
// await NOTIFY and send reply 200 OK
f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, mw_NOTIFY_Request_Base(vc_callId));
} // end function f_Subscription
 
function f_cancelCall_await487(template CANCEL_Request p_request)
runs on SipComponent
{
// This function is called to bring back the IUT in idle condition
// in case of errors or unexpected behaviour.
// Sending of a CANCEL request with the same Cseq
f_cancelCall(p_request);
// set method on INVITE
vc_cSeq.method := "INVITE";
//await on 487 response and send ACK
f_awaitingResponse(mw_Response_Base(c_statusLine487, vc_callId, vc_cSeq));
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
}
/**
* @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
* @param p_notify notify template
*/
function f_SubscriptionWithNotification(
inout CSeq p_cSeq_s,
template(value) SUBSCRIBE_Request p_subscribe,
template(present) NOTIFY_Request p_notify := ?
) runs on SipComponent {
f_setHeaders_SUBSCRIBE(p_cSeq_s);
// send SUBSCRIBE
f_SendSUBSCRIBE(p_subscribe);
// awaiting 200 OK SUBSCRIBE
// await NOTIFY and send reply 200 OK
f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, p_notify);
} // end function f_SubscriptionWithNotification
 
function f_awaitCancelCall_send487(template CANCEL_Request p_request)
runs on SipComponent
{
f_awaitingCANCEL(p_request);
f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via));
// set method on INVITE
vc_cSeq.method := "INVITE";
//send 487 response and await ACK
f_sendResponse(m_Response_Base(c_statusLine487, vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via));
// await ACK
f_awaitingACK(mw_ACK_Request_Base(vc_callId));
}
/**
* @desc UE await subscrbe, send on 200 OK; possibility to handle also other SUBSCRIBE methods where event is different than reg
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
*/
function f_awaitingSubscription(
template(present) SUBSCRIBE_Request p_subscribe := ?
) runs on SipComponent {
var Request v_request;
 
} // end group Postambles
tc_wait.start(2.0); // awaiting of all SUBSCRIBES
alt {
[] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
}
[] tc_wait.timeout {
setverdict(pass);
}
}
} // end function f_awaitingSubscription
 
group SipChecks
{
 
 
/*
* @desc check the presence of conversation at SIP side
*
*/
function f_check_Conversation() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if conversation at SIP port";
if (PX_SIP_CheckConversation) {
opPort.call(s_SIP_conversation:{v_question, -})
{[] opPort.getreply(s_SIP_conversation:{-, true}) {}
[] opPort.getreply(s_SIP_conversation:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
} // end group Subscription
 
f_selfOrClientSyncAndVerdict(c_uPlane, f_getVerdict()); // Note: implemented in test bodies
return
} // end of f_check_Conversation
group Preambles {
 
/*
* @desc check the presence of conversation at SIP side
*
*/
function f_check_Ringing() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if ringing at SIP port";
if (PX_SIP_CheckRinging) {
opPort.call(s_SIP_ringing:{v_question, -})
{[] opPort.getreply(s_SIP_ringing:{-, true}) {}
[] opPort.getreply(s_SIP_ringing:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
/**
* @desc Set variables and default initialization for user profile
* @param p_userprofile user profile of call
* @param p_cSeq_s cseq parameter
*/
function f_SIP_preamble_woREG(
inout CSeq p_cSeq_s
) runs on SipComponent {
// varables and altsteps
f_init_component(p_cSeq_s);
 
f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict());
return
} // end of f_check_Ringing
// Preamble
//NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile));
}
 
/*
* @desc check the announcement at SIP side (UE A)
*
*/
function f_check_AnnouncementUE_A() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if announcement at UE A";
if (PX_SIP_CheckConversation) {
opPort.call(s_SIP_announcementA:{v_question, -})
{[] opPort.getreply(s_SIP_announcementA:{-, true}) {}
[] opPort.getreply(s_SIP_announcementA:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
/**
* @desc Set 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_SIP_preamble_withREG(
inout CSeq p_cSeq_s,
template(value) REGISTER_Request p_register
) runs on SipComponent {
// preamble
f_SIP_preamble_woREG(p_cSeq_s);
 
f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict());
return
} // end of f_check_AnnouncementUE_A
// Registration, Awaiting
f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);
}
 
/*
* @desc check the announcement at SIP side (UE B)
*
*/
function f_check_AnnouncementUE_B() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if announcement at UE B";
if (PX_SIP_CheckConversation) {
opPort.call(s_SIP_announcementB:{v_question, -})
{[] opPort.getreply(s_SIP_announcementB:{-, true}) {}
[] opPort.getreply(s_SIP_announcementB:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
 
f_selfOrClientSyncAndVerdict(c_annoucB, f_getVerdict());
return
} // end of f_check_AnnouncementUE_B
 
/*
* @desc check the announcement at SIP side
*
*/
function f_check_Announcement() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if announcement at SIP side";
if (PX_SIP_CheckConversation) {
opPort.call(s_SIP_announcement:{v_question, -})
{[] opPort.getreply(s_SIP_announcement:{-, true}) {}
[] opPort.getreply(s_SIP_announcement:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
} // end group Preambles
 
f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict());
return
} // end of f_check_Announcement
group Postambles {
 
/*
* @desc check the Voice message at SIP side
*
*/
function f_check_VoiceMessage() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if voice message at SIP side";
if (PX_SIP_CheckConversation) {
opPort.call(s_SIP_voiceMessage:{v_question, -})
{[] opPort.getreply(s_SIP_voiceMessage:{-, true}) {}
[] opPort.getreply(s_SIP_voiceMessage:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
/**
* @desc function send BYE and awaits reponse
* @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
* @param p_byeCause parameter for Release cause to be used
* in BYE and in Failure messages, former PX_SIP_BYE_CAUSE
*/
function f_terminateCall(
SipUrl p_requestUri,
CallId p_CallId,
inout CSeq p_cSeq,
From p_from,
template(value) To p_to,
integer p_byeCause
) runs on SipComponent {
// Sending of a BYE request to release the call and expect a final response
f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, p_to, vc_via, p_byeCause));
 
f_selfOrClientSyncAndVerdict(c_voicem, f_getVerdict());
return
} // end of f_check_Announcement
/*
* @desc check the stop of media stream
*
*/
function f_check_MediaStopped() runs on SipComponent
{
var boolean v_result;
var charstring v_question := "confirm if media stream stopped";
if (PX_SIP_CheckConversation) {
opPort.call(s_SIP_mediastopped:{v_question, -})
{[] opPort.getreply(s_SIP_mediastopped:{-, true}) {}
[] opPort.getreply(s_SIP_mediastopped:{-, false})
{all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;}
}
}
tc_resp.start;
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;
}
}
} // end function f_terminateCall
 
f_selfOrClientSyncAndVerdict(c_uPlaneStop, f_getVerdict());
return
} // end of f_check_MediaStopped
function f_cancelCall(
template(value) CANCEL_Request p_request
) runs on SipComponent {
// This function is called to bring back the IUT in idle condition
// in case of errors or unexpected behaviour.
// Sending of a CANCEL request with the same Cseq
f_setHeadersCANCEL(vc_cSeq);
f_SendCANCEL(p_request);
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq)) {
tc_resp.stop;
}
}
}
 
}
function f_cancelCall_await487(
template(value) CANCEL_Request p_request
) runs on SipComponent {
// This function is called to bring back the IUT in idle condition
// in case of errors or unexpected behaviour.
// Sending of a CANCEL request with the same Cseq
f_cancelCall(p_request);
// set method on INVITE
vc_cSeq.method := "INVITE";
 
group DefaultsTestStep
{
/**
* @desc This default handles receiving of the sync server
* STOP message and calls the RT HUT postamble. (copy from common lib)
*/
altstep a_Sip_catchSyncStop() runs on SipComponent
{
[] syncPort.receive(m_syncServerStop)
{
tc_sync.stop ;
log("**** a_Sip_catchSyncStop: Test component received STOP signal from MTC - going to IDLE state **** ");
//TODO complete postamble
syncPort.send(m_syncClientStop);
//in case if deregistration was not done
//f_RemoveRegistration(vc_cSeq);
f_terminate_component();
log("**** a_Sip_catchSyncStop: TEST COMPONENT NOW STOPPING ITSELF! **** ") ;
setverdict(inconc);
stop ;
}
}
// await on 487 response and send ACK
f_awaitingResponse(mw_Response_Base(c_statusLine487, vc_callId, vc_cSeq));
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
}
 
/**
*
* @desc main default altstep to handle unexpected messages and timeout
* @verdict fail for all unexpected branches
*/
altstep a_clearRegistration() runs on SipComponent
{
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;
f_RemoveRegistration(vc_cSeq);
}
function f_awaitCancelCall_send487(
template(present) CANCEL_Request p_request := ?
) runs on SipComponent {
f_awaitingCANCEL(p_request);
f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
 
// 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;
}
// set method on INVITE
vc_cSeq.method := "INVITE";
 
// 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, valueof(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);
if (ischosen(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr)) {
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));
} else {
log(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.addrSpecUnion);
f_SendNOTIFY(m_NOTIFY_Request_contact(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.addrSpecUnion, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact));
}
f_awaitingOkResponse(vc_cSeq);
repeat
}
//awaiting of PRACK message
[] SIPP.receive(mw_PRACK_Request_Base(vc_callId))->value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
repeat
}
// send 487 response and await ACK
f_sendResponse(m_Response_Base(c_statusLine487, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
// await ACK
f_awaitingACK(mw_ACK_Request_Base(vc_callId));
}
 
// 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();
f_RemoveRegistration(vc_cSeq);
}
// 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();
f_RemoveRegistration(vc_cSeq);
}
// catch 4xx response
[] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?))-> value v_response sender vc_sent_label
{
setverdict(fail);
if(v_response.msgHeader.cSeq.method == "INVITE"){
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))};
f_RemoveRegistration(vc_cSeq);
}
// catch 5xx response
[] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?))-> value v_response sender vc_sent_label
{
setverdict(fail);
if(v_response.msgHeader.cSeq.method == "INVITE"){
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))};
f_RemoveRegistration(vc_cSeq);
}
// 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
f_RemoveRegistration(vc_cSeq);
}
}
/**
*
* @desc altstep handle authentication for INVITE message
*/
altstep a_altstep_401or407() runs on SipComponent {
[] any port.check (receive) {
var CommaParam_List v_challenge;
var Credentials v_Credentials;
var Response v_Response;
var Request v_Request := valueof (vc_requestFor407);
tc_resp.start (PX_SIP_TRESP);
alt {
[] SIPP.receive (mw_Response_Base((c_statusLine401,c_statusLine407),
vc_callId,
vc_cSeq)) -> value v_Response {
tc_resp.stop;
// get tag from To header if available
vc_to := v_Response.msgHeader.toField;
if (vc_cSeq.method == "INVITE"){
// send ACK
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
}
// resent the INVITE message with Proxyauthorization header include
// Extract challenge and calculate credentials for a response.
if (ischosen (v_Response
.msgHeader
.proxyAuthenticate
.challenge
.otherChallenge // instead of digestCln (changed by axr to comply to alcatel)
)) {
v_challenge :=
v_Response
.msgHeader
.proxyAuthenticate
.challenge
.otherChallenge.authParams;
v_Credentials :=
f_calculatecCredentials(vc_userprofile,
vc_requestFor407.msgHeader.cSeq.method,
v_challenge);
} else {
log ("No scheme in Proxy Authenticate header!!");
setverdict (inconc);
stop;
}
altstep a_receiveCANCELorNothing(
in template(present) CANCEL_Request p_CANCEL := ?
) runs on SipComponent {
var CANCEL_Request v_MSG;
[] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label {
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the CANCEL
f_send200OK();
}
}
 
vc_branch := c_branchCookie & f_getRndTag();
vc_via := {
fieldName := VIA_E,
viaBody := {
valueof (m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
altstep a_awaitNotify(
in template(present) NOTIFY_Request p_MSG := ?,
inout boolean p_receivedNotify
) runs on SipComponent {
var NOTIFY_Request v_MSG;
[vc_subscribed] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
p_receivedNotify := true;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
repeat;
}
}
 
v_Request.msgHeader.via := vc_via;
// Increment CSeq sequence number of and add the credentials
// to the original saved INVITE message.
vc_cSeq.method := vc_requestFor407.msgHeader.cSeq.method;
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
v_Request.msgHeader.cSeq.seqNumber :=
vc_cSeq.seqNumber;
v_Request.msgHeader.proxyAuthorization.fieldName :=
PROXY_AUTHORIZATION_E;
v_Request.msgHeader.proxyAuthorization.credentials :=
{v_Credentials};
// Re-send the saved INVITE with Authorization header
// included.
SIPP.send (v_Request) to vc_sent_label;
}
}
}
}
} // end of group DefaultsTestStep
 
 
} // end group Postambles
 
group SipChecks {
 
 
/**
* @desc check the presence of conversation at SIP side
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_Conversation(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if conversation at SIP port";
 
if (p_checkConversation) {
opPort
.call(
s_SIP_conversation:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_conversation:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_conversation:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_uPlane, f_getVerdict()); // Note: implemented in test bodies
return;
} // end of f_check_Conversation
 
/**
* @desc check the presence of conversation at SIP side
* @param p_checkRinging boolean to perform check if ringing check is implemented.
* former PX_SIP_CHECK_RINGING
*/
function f_check_Ringing(
boolean p_checkRinging := false
) runs on SipComponent {
var charstring v_question := "confirm if ringing at SIP port";
 
if (p_checkRinging) {
opPort
.call(
s_SIP_ringing:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_ringing:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_ringing:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict());
return;
} // end of f_check_Ringing
 
/**
* @desc check the announcement at SIP side (UE A)
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_AnnouncementUE_A(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if announcement at UE A";
 
if (p_checkConversation) {
opPort
.call(
s_SIP_announcementA:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_announcementA:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_announcementA:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict());
return;
} // end of f_check_AnnouncementUE_A
 
/**
* @desc check the announcement at SIP side (UE B)
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_AnnouncementUE_B(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if announcement at UE B";
 
if (p_checkConversation) {
opPort
.call(
s_SIP_announcementB:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_announcementB:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_announcementB:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_annoucB, f_getVerdict());
return;
} // end of f_check_AnnouncementUE_B
 
/**
* @desc check the announcement at SIP side
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_Announcement(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if announcement at SIP side";
 
if (p_checkConversation) {
opPort
.call(
s_SIP_announcement:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_announcement:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_announcement:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict());
return;
} // end of f_check_Announcement
 
/**
* @desc check the Voice message at SIP side
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_VoiceMessage(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if voice message at SIP side";
 
if (p_checkConversation) {
opPort
.call(
s_SIP_voiceMessage:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_voiceMessage:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_voiceMessage:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_voicem, f_getVerdict());
return;
} // end of f_check_Announcement
 
/**
* @desc check the stop of media stream
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_MediaStopped(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if media stream stopped";
 
if (p_checkConversation) {
opPort
.call(
s_SIP_mediastopped:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_mediastopped:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_mediastopped:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
 
f_selfOrClientSyncAndVerdict(c_uPlaneStop, f_getVerdict());
return;
} // end of f_check_MediaStopped
 
}
 
group DefaultsTestStep {
 
 
/**
* @desc This default handles receiving of the sync server STOP message and calls the RT HUT postamble. (copy from common lib)
*/
altstep a_Sip_catchSyncStop(
) runs on SipComponent {
[] syncPort.receive(m_syncServerStop) {
tc_sync.stop;
log("*** a_Sip_catchSyncStop: INFO: Test component received STOP signal from MTC - going to IDLE state *** ");
syncPort.send(m_syncClientStop);
// in case if deregistration was not done
// f_RemoveRegistration(vc_cSeq);
f_terminate_component();
log("*** a_Sip_catchSyncStop: INFO: TEST COMPONENT NOW STOPPING ITSELF! *** ");
setverdict(inconc);
stop;
}
}
 
 
/**
* @desc main default altstep to handle unexpected messages and timeout
* @verdict fail for all unexpected branches
*/
altstep a_clearRegistration(
) runs on SipComponent {
var Response v_response;
var Request v_request;
var CSeq v_cSeq;
[] any timer.timeout {
setverdict(fail);
all timer.stop;
// 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;
f_RemoveRegistration(vc_cSeq);
}
// 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 {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
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 {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
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));
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();
f_RemoveRegistration(vc_cSeq);
}
// 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();
f_RemoveRegistration(vc_cSeq);
}
// catch 4xx response
[] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label {
setverdict(fail);
if (v_response.msgHeader.cSeq.method == "INVITE") {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
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));
}
f_RemoveRegistration(vc_cSeq);
}
// catch 5xx response
[] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?)) -> value v_response sender vc_sent_label {
setverdict(fail);
if (v_response.msgHeader.cSeq.method == "INVITE") {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
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));
}
f_RemoveRegistration(vc_cSeq);
}
// 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
f_RemoveRegistration(vc_cSeq);
}
}
 
/**
* @desc altstep handle authentication for INVITE message
*/
altstep a_altstep_401or407(
) runs on SipComponent {
var CommaParam_List v_challenge;
var Credentials v_Credentials;
var Response v_Response;
var Request v_Request := vc_requestFor407;
[] any port.check(receive) {
 
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base((c_statusLine401, c_statusLine407), vc_callId, vc_cSeq)) -> value v_Response {
tc_resp.stop;
// get tag from To header if available
vc_to := v_Response.msgHeader.toField;
if (vc_cSeq.method == "INVITE") {
// send ACK
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
}
// resent the INVITE message with Proxyauthorization header include
// Extract challenge and calculate credentials for a response.
if (
ischosen(
v_Response.msgHeader.proxyAuthenticate.challenge
.otherChallenge // instead of digestCln (changed by axr to comply to alcatel)
)
) {
v_challenge := v_Response.msgHeader.proxyAuthenticate.challenge.otherChallenge.authParams;
v_Credentials := f_calculatecCredentials(vc_userprofile, vc_requestFor407.msgHeader.cSeq.method, v_challenge);
}
else {
log("*** " &__SCOPE__& ": INFO: No scheme in Proxy Authenticate header!!! ***");
setverdict(inconc);
stop;
}
 
vc_branch := c_branchCookie & f_getRndTag();
vc_via := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
 
v_Request.msgHeader.via := vc_via;
// Increment CSeq sequence number of and add the credentials
// to the original saved INVITE message.
vc_cSeq.method := vc_requestFor407.msgHeader.cSeq.method;
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
v_Request.msgHeader.cSeq.seqNumber := vc_cSeq.seqNumber;
v_Request.msgHeader.proxyAuthorization.fieldName := PROXY_AUTHORIZATION_E;
v_Request.msgHeader.proxyAuthorization.credentials := {v_Credentials};
 
// Re-send the saved INVITE with Authorization header
// included.
SIPP.send(v_Request) to vc_sent_label;
}
}
}
}
 
} // end of group DefaultsTestStep
} // end module LibSip_Steps
/trunk/ttcn/LibSip_Templates.ttcn
1,3766 → 1,4607
/*
* @author STF 346, STF366, STF368, STF369, STF450
* @version $Id$
* @desc This module defines SIP Templates for message, header, and
* structured types. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions.
* This module is part of LibSipV2.
* @remark Any additions to the templates shall follow the design rules
* and always modify base templates only;
* Existing templates shall not be changed or removed -
* change requests shall be made to http://t-ort.etsi.org
/**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module defines SIP Templates for message, header, and
* structured types. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions.
* This module is part of LibSipV3.
* @remark Any additions to the templates shall follow the design rules and always modify base templates only; Existing templates shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
*/
module LibSip_Templates {
// LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_Interface all;
import from LibSip_PIXITS all;
import from LibSip_XMLTypes all;
import from LibSip_SimpleMsgSummaryTypes all;
import from LibSip_MessageBodyTypes all;
 
module LibSip_Templates
{
//LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_Interface all;
import from LibSip_PIXITS all;
import from LibSip_XMLTypes all;
import from LibSip_SimpleMsgSummaryTypes all;
import from LibSip_MessageBodyTypes all;
import from NoTargetNamespace language "XSD" all
with {
extension "File:../xsd/Ims3gpp.xsd"
extension "File:../xsd/Ims3gpp.xsd";
}
 
import from urn_ietf_params_xml_ns_conference_info language "XSD" all
with {
extension "File:../xsd/CONF.xsd"
extension "File:../xsd/CONF.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all
with {
extension "File:../xsd/PSTN.xsd"
extension "File:../xsd/PSTN.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all
with {
extension "File:../xsd/SupplementaryServices.xsd"
extension "File:../xsd/SupplementaryServices.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all
with {
extension "File:../xsd/MCID.xsd"
extension "File:../xsd/MCID.xsd";
}
 
import from urn_ietf_params_xml_ns_resource_lists language "XSD" all
with {
extension "File:../xsd/ResourceList.xsd"
extension "File:../xsd/ResourceList.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all
with {
extension "File:../xsd/CDIVN.xsd"
extension "File:../xsd/CDIVN.xsd";
}
 
import from urn_3gpp_ns_cw_1_0 language "XSD" all
with {
extension "File:../xsd/cw.xsd"
with {
extension "File:../xsd/cw.xsd";
}
group ModuleParameters {
modulepar boolean MB_LENGTH_FROM_ENCVAL:=false; //* to get length of message body from ecoded value
modulepar boolean USE_FX_FOR_XML_LENGTH:=false; //* To use external functions for calculation of XML message/body length
}//* group ModuleParameters
group SubFields
{
 
template Addr_Union m_AddrUnion_NameAddr(template NameAddr p_nameAddr) :=
{
nameAddr := p_nameAddr
}
group SubFields {
 
template Addr_Union m_AddrUnion_DisplayAndSipUrl(template charstring p_displayName, template SipUrl p_addrSpec) :=
{
nameAddr := m_CallingAddr(p_displayName, p_addrSpec)
}
template NameAddr m_CallingAddr(template charstring p_displayName, template SipUrl p_addrSpec) :=
{
displayName := p_displayName,
addrSpec := p_addrSpec
}
template(value) Addr_Union m_AddrUnion_NameAddr(template(value) NameAddr p_nameAddr) := {nameAddr := p_nameAddr}
 
template CommaParam_List mw_digestResponse(template GenericParam p_genericParam) :=
superset(p_genericParam); //* c_Integrity_protected_yes
template(value) Addr_Union m_AddrUnion_DisplayAndSipUrl(
template(value) charstring p_displayName,
template(value) SipUrl p_addrSpec
) := {
nameAddr := m_CallingAddr(p_displayName, p_addrSpec)
}
 
template SemicolonParam_List m_cpc :=
{{"cpc",PX_SIP_ISUP_CPC_VALUE}};
template(value) NameAddr m_NameAddr(
template(omit) charstring p_displayName := omit,
template(value) SipUrl p_addrSpec
) := {
displayName := p_displayName,
addrSpec := p_addrSpec
}
 
template SemicolonParam_List m_ReasonParams
(template charstring p_cause, template charstring p_text) :=
{m_Cause(p_cause),m_Text(p_text)};
template ReasonValue m_ReasonValue
(template charstring p_cause, template charstring p_text) :=
{
token := "Q.850",
reasonParams := m_ReasonParams(p_cause,p_text)
};
template(value) NameAddr m_CallingAddr(
template(value) charstring p_displayName,
template(value) SipUrl p_addrSpec
) := m_NameAddr(p_displayName, p_addrSpec);
 
template ReasonValue m_ReasonValueSIP
(template charstring p_cause, template charstring p_text) :=
{
token := "SIP",
reasonParams := m_ReasonParams(p_cause,p_text)
};
template RouteBody mw_routeBody (template SipUrl p_sipurl):=
{
nameAddr :=
{
displayName := *,
addrSpec := p_sipurl
},
rrParam := *
}
template(present) NameAddr mw_NameAddr(
template charstring p_displayName,
template(present) SipUrl p_addrSpec := ?
) := {
displayName := p_displayName,
addrSpec := p_addrSpec
}
 
template SentProtocol m_SentProtocol (charstring p_protocol) :=
{protocolName := c_sipName,
protocolVersion:= c_sipVersion,
transport:= p_protocol};
template(present) CommaParam_List mw_digestResponse(
template(present) GenericParam p_genericParam := ?
) := superset(p_genericParam);
//* c_Integrity_protected_yes
/**
* @desc send template for parameter list with CPC set to a specific value
* @param p_ISUP_CPC_value CPC parameter value
* former PX_SIP_ISUP_CPC_VALUE
*/
template(value) SemicolonParam_List m_cpc(
template(value) charstring p_ISUP_CPC_value := "prison"
) := {
{
"cpc",
{tokenOrHost := p_ISUP_CPC_value}
}
}
 
template SipUrl m_SipUrl_currDomain(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.homeDomain, //* hostname, IPv4 or IPv6 as a charstring
portField := omit //* p_userprofile.currPort //* optional integer
}}},
urlParameters := omit,
headers := omit
}
template(value) SemicolonParam_List m_ReasonParams(
template(omit) GenValue p_cause := omit,
template(value) GenValue p_text
) := {
m_Cause(p_cause), m_Text(p_text)
}
 
template SipUrl m_SipUrl_contactIpaddr(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField := p_userprofile.contactPort //* optional integer
}}},
urlParameters := omit,
headers := omit
}
template(present) SemicolonParam_List mw_ReasonParams(
template GenValue p_cause,
template GenValue p_text
) := {
mw_Cause_base(p_cause), mw_Text(p_text)
}
 
template SipUrl m_SipUrl_contactIpaddrAndCpc(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername & "; cpc=" & PX_SIP_ISUP_CPC_VALUE,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField := p_userprofile.contactPort //* optional integer
}}},
urlParameters := omit,
headers := omit
}
template(value) ReasonValue m_ReasonValue_Base := {
token := "",
reasonParams := omit
}
 
template SipUrl m_SipUrl_currIpaddr(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField := p_userprofile.currPort //* optional integer
}}},
urlParameters := omit,
headers := omit
}
template SipUrl m_SipUrl_Anonymous := //* SIP-URL with a calles party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := //* optional
{
userOrTelephoneSubscriber := "Anonymous",//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := "Anonymous.invalid", //* hostname, IPv4 or IPv6 as a charstring
portField := omit //* optional integer
}}},
urlParameters := omit,
headers := omit
};
template SipUrl m_TelUrl_publUser(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_telScheme, //* contains "tel"
components := {tel:={
subscriber := p_userprofile.publUsername//* charstring
}},
urlParameters := omit,
headers := omit
}
template SipUrl mw_TelUrl :=
{
scheme := c_telScheme,
components := {tel:={
subscriber := ?}},
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl :=
{
scheme := c_sipScheme,
components := {sip:={
userInfo := *,
hostPort := ?}},
urlParameters := *,
headers := *
};
template SipUrl mw_TelSip_unavailableInvalidUri := (mw_TelSip_unavailableInvalidUri1,mw_TelSip_unavailableInvalidUri2);
template(present) ReasonValue mw_ReasonValue_Base := {
token := ?,
reasonParams := *
}
 
template SipUrl mw_TelSip_unavailableInvalidUri1 :=
{
scheme := c_sipScheme,
components := {sip:={
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort}
}},
urlParameters := omit,
headers := omit
};
template SipUrl mw_TelSip_unavailableInvalidUri2 :=
{
scheme := c_telScheme,
components := {tel:={
subscriber := "unavailable"
}},
urlParameters := omit,
headers := omit
};
template SipUrl mw_TelSip_unavailableUri (charstring p_host):= (mw_TelSip_unavailableUri1 (p_host),mw_TelSip_unavailableUri2 (p_host));
template(value) ReasonValue m_ReasonValue_param(
template(value) GenValue p_cause,
template(value) GenValue p_text
) modifies m_ReasonValue_Base := {
reasonParams := m_ReasonParams(p_cause, p_text)
}
 
template SipUrl mw_TelSip_unavailableUri1 (charstring p_host):=
{
scheme := (c_telScheme),
components := {tel:={
subscriber := "unavailable"}},
urlParameters := omit,
headers := omit
};
template SipUrl mw_TelSip_unavailableUri2 (charstring p_host):=
{
scheme := (c_sipScheme),
components := {sip:={
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:=p_host, portField:=c_defaultSipPort}}},
urlParameters := omit,
headers := omit
};
template(present) ReasonValue mw_ReasonValue_param(
template GenValue p_cause,
template GenValue p_text
) modifies mw_ReasonValue_Base := {
reasonParams := mw_ReasonParams(p_cause, p_text)
}
 
template SipUrl mw_SipUrl_Number(charstring p_number) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := ?}},
urlParameters := *,
headers := *
};
template(value) ReasonValue m_ReasonValue(
template(value) GenValue p_cause,
template(value) GenValue p_text
) modifies m_ReasonValue_param := {
token := "Q.850"
}
 
template SipUrl mw_TelSipUrl_Number(template charstring p_number) := (mw_TelSipUrl_Number1(p_number),mw_TelSipUrl_Number2(p_number));
template SipUrl mw_TelSipUrl_Number1(template charstring p_number) := //* SIP-URL with a calling party number
{
scheme := (c_sipScheme), //* contains "sip" or "tel"
components := {
sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*}, //* nat or int format
hostPort := ?}
},
urlParameters := *,
headers := *
};
template SipUrl mw_TelSipUrl_Number2(template charstring p_number) := //* SIP-URL with a calling party number
{
scheme := (c_telScheme), //* contains "sip" or "tel"
components := {
tel:={
subscriber:= p_number}
},
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl_Host(template charstring p_host) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= *,
hostPort := {host:=p_host, portField:=*}}},
urlParameters := *,
headers := *
};
template(present) ReasonValue mw_ReasonValue(
template GenValue p_cause,
template GenValue p_text
) modifies mw_ReasonValue_param := {
token := "Q.850"
}
 
template SipUrl mw_SipUrl_NumberHost(charstring p_number, charstring p_host) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*}}},
template(value) ReasonValue m_ReasonValueSIP(
template(value) GenValue p_cause,
template(value) GenValue p_text
) modifies m_ReasonValue_param := {
token := "SIP"
}
 
template(present) ReasonValue mw_ReasonValueSIP(
template GenValue p_cause,
template GenValue p_text
) modifies mw_ReasonValue_param := {
token := "SIP"
}
 
template(present) RouteBody mw_routeBody(
template(present) SipUrl p_sipurl := ?
) := {
nameAddr := mw_NameAddr(*, p_sipurl),
rrParam := *
}
 
template(value) SentProtocol m_SentProtocol(
template(value) charstring p_protocol
) := {
protocolName := c_sipName,
protocolVersion := c_sipVersion,
transport := p_protocol
}
 
template(value) SipUrl m_BasicSipUrl := {
scheme := (c_sipScheme),
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "", //* charstring
password :=
omit //* optional charstring
},
hostPort := {
host := omit, //* hostname, IPv4 or IPv6 as a charstring
portField :=
omit //* p_userprofile.currPort - optional integer
}
}
},
urlParameters := omit,
headers := omit
}
 
template(value) SipUrl m_SipUrl_currDomain_Base(
template(value) SipUserProfile p_userprofile
) modifies m_BasicSipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := p_userprofile.publUsername
}
}
}
}
 
template(value) SipUrl m_SipUrl_currDomain(
template(value) SipUserProfile p_userprofile
) modifies m_SipUrl_currDomain_Base := {
components := {
sip := {
hostPort := {
host :=
p_userprofile
.homeDomain //* hostname, IPv4 or IPv6 as a charstring
}
}
}
}
 
template(value) SipUrl m_SipUrl_contactIpaddr(
template(value) SipUserProfile p_userprofile
) modifies m_SipUrl_currDomain_Base := {
components := {
sip := {
hostPort := {
host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField :=
p_userprofile
.contactPort //* optional integer
}
}
}
}
/**
* @desc send template with SIP userinfo
* @param p_userprofile SIP user profile values
* @param p_ISUP_CPC_value CPC parameter value
* former PX_SIP_ISUP_CPC_VALUE
*/
template(value) SipUrl m_SipUrl_contactIpaddrAndCpc(
template(value) SipUserProfile p_userprofile,
template(value) charstring p_ISUP_CPC_value := "prison"
) modifies m_SipUrl_contactIpaddr := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber :=
p_userprofile.publUsername & "; cpc=" &
p_ISUP_CPC_value
}
}
}
}
 
template(value) SipUrl m_SipUrl_currIpaddr(
template(value) SipUserProfile p_userprofile
) modifies m_SipUrl_currDomain_Base := {
components := {
sip := {
hostPort := {
host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField :=
p_userprofile
.currPort //* optional integer
}
}
}
}
 
template(value) SipUrl m_SipUrl_Anonymous modifies m_BasicSipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber :=
"Anonymous" //* charstring
},
hostPort := {
host :=
"Anonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring
}
}
}
}
 
template(value) SipUrl m_SipUrl_NumberHostHeader(
template(value) charstring p_number,
template(value) charstring p_host,
template(omit) AmpersandParam_List p_urlParameters := omit
) modifies m_BasicSipUrl := {
components := {
sip := {
userInfo := {userOrTelephoneSubscriber := p_number},
hostPort := {host := p_host}
}
},
urlParameters := p_urlParameters
}
 
template(value) SipUrl m_SipUrl_NumberHostParam(
template(value) charstring p_number,
template(value) charstring p_host,
template(omit) AmpersandParam_List p_urlParameters := omit
) modifies m_SipUrl_NumberHostHeader := {
components := {sip := {hostPort := {portField := c_defaultSipPort}}}
}
 
template(value) SipUrl m_SipUrl_NumberHostParam_woPort(
template(value) charstring p_number,
template(value) charstring p_host,
template(omit) AmpersandParam_List p_urlParameters := omit
) modifies m_SipUrl_NumberHostParam := {
components := {sip := {hostPort := {portField := omit}}}
}
 
template(present) SipUrl m_BasicTelUrl := {
scheme := (c_telScheme),
components := {tel := {subscriber := ""}},
urlParameters := omit,
headers := omit
}
 
template(value) SipUrl m_TelUrl_publUser(
template(value) SipUserProfile p_userprofile
) modifies m_BasicTelUrl := {
components := {
tel := {
subscriber :=
p_userprofile
.publUsername //* charstring
}
}
}
 
template(present) SipUrl mw_TelUrl := {
scheme := c_telScheme,
components := {tel := {subscriber := ?}},
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl_NumberHostParam(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*}}},
urlParameters := p_urlParameters,
headers := *
};
template SipUrl m_SipUrl_NumberHostHeader(charstring p_number, charstring p_host, template AmpersandParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=omit}}},
urlParameters := omit,
headers := p_urlParameters
};
template SipUrl mw_SipUrl_NumberHostHeader(charstring p_number, charstring p_host, template AmpersandParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*}}},
urlParameters := *,
headers := p_urlParameters
};
template SipUrl m_SipUrl_NumberHostParam(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=c_defaultSipPort}}},
urlParameters := p_urlParameters,
headers := omit
};
template SipUrl m_SipUrl_NumberHostParam_woPort(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=omit}}},
urlParameters := p_urlParameters,
headers := omit
};
template SipUrl mw_SipUrl_Anonymous := //* SIP-URL with a calles party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := //* optional
{
userOrTelephoneSubscriber := pattern "[a,A][n,N][o,O][n,N][y,Y][m,M][o,O][u,U][s,s]",//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := pattern "[a,A]nonymous.invalid", //* hostname, IPv4 or IPv6 as a charstring
portField := * //* optional integer
}}},
urlParameters := *,
headers := *
};
}
 
template SipUrl mw_SipUrl_urlParam(template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo:= *,
hostPort := ?}},
urlParameters := p_urlParameters,
headers := *
};
template ContactAddress mw_ContactAddress :=
{
addressField := ?,
contactParams := *
};
template(present) SipUrl mw_SipUrl := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := ?,
password := *
},
hostPort := {
host := *,
portField := *
}
}
},
urlParameters := *,
headers := *
}
 
template HostPort mw_hostPort(template charstring p_host, template integer p_portField) :=
{
host := p_host,
portField := p_portField
};
template StatusLine mw_statusLine1xx := {sipVersion := c_sipNameVersion, statusCode := (100..199), reasonPhrase := ?};
template StatusLine mw_statusLine4xx := {sipVersion := c_sipNameVersion, statusCode := (400..499), reasonPhrase := ?};
template StatusLine mw_statusLine5xx := {sipVersion := c_sipNameVersion, statusCode := (500..599), reasonPhrase := ?};
template StatusLine mw_statusLineFinal := {sipVersion := c_sipNameVersion, statusCode := (200..699), reasonPhrase := ?};
template(present) SipUrl mw_TelSip_unavailableInvalidUri := (mw_TelSip_unavailableInvalidUri1, mw_TelSip_unavailableInvalidUri2);
 
template NameAddr mw_NameAddr_DispName_User_Host(template charstring p_dn, template charstring p_user, template charstring p_host) :=
{
displayName := p_dn,
addrSpec :=
{
scheme := c_sipScheme, //* contains "sip"
components := { sip := {
userInfo := {userOrTelephoneSubscriber :=p_user, password := *},
hostPort :=
{
host := p_host, //* hostname, IPv4 or IPv6 as a charstring
portField := * //* optional integer
}}
template(present) SipUrl mw_TelSip_unavailableInvalidUri1 modifies mw_SipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "unavailable"
},
hostPort := {
host := "anonymous.invalid",
portField := c_defaultSipPort
}
}
}
}
template(present) SipUrl mw_TelSip_unavailableInvalidUri2 modifies mw_TelUrl := {
components := {tel := {subscriber := "unavailable"}}
}
 
template(present) SipUrl mw_TelSip_unavailableUri(
template(value) charstring p_host
) := (mw_TelSip_unavailableUri1, mw_TelSip_unavailableUri2(p_host));
 
template(present) SipUrl mw_TelSip_unavailableUri1 modifies mw_TelUrl := {
components := {tel := {subscriber := "unavailable"}}
}
 
template(present) SipUrl mw_TelSip_unavailableUri2(
template(value) charstring p_host
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "unavailable"
},
hostPort := {
host := p_host,
portField := c_defaultSipPort
}
}
}
}
 
template(present) SipUrl mw_SipUrl_Number(
template(present) charstring p_number := ?
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := {userOrTelephoneSubscriber := p_number},
hostPort := ?
}
}
}
 
template(present) SipUrl mw_TelSipUrl_Number(
template(present) charstring p_number := ?
) := (mw_SipUrl_Number(p_number), mw_TelSipUrl_Number2(p_number));
 
template(present) SipUrl mw_TelSipUrl_Number1(
template(present) charstring p_number := ?
) := mw_SipUrl_Number(p_number);
 
template(present) SipUrl mw_TelSipUrl_Number2(
template(present) charstring p_number := ?
) modifies mw_TelUrl := {
components := {
tel := {
subscriber := p_number
}
}
}
 
template(present) SipUrl mw_SipUrl_Host(
template charstring p_host
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := *,
hostPort := {host := p_host}
}
}
}
 
template(present) SipUrl mw_SipUrl_User_Host(
template(present) charstring p_user := ?,
template charstring p_host
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := {userOrTelephoneSubscriber := p_user},
hostPort := {
host :=
p_host //* hostname, IPv4 or IPv6 as a charstring
}
}
},
urlParameters := {m_UserPhone}
}
 
template(present) SipUrl mw_SipUrl_Anonymous modifies mw_SipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := pattern "[a,A][n,N][o,O][n,N][y,Y][m,M][o,O][u,U][s,s]" //* charstring
},
hostPort := {
host :=
pattern
"[a,A]nonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring
}
}
}
}
 
template(present) SipUrl mw_SipUrl_urlParam(
template SemicolonParam_List p_urlParameters
) modifies mw_SipUrl := {
urlParameters := p_urlParameters
}
 
template(present) ContactAddress mw_ContactAddress := {
addressField := ?,
contactParams := *
}
 
template(present) HostPort mw_hostPort(
template charstring p_host,
template integer p_portField
) := {
host := p_host,
portField := p_portField
}
 
template(present) StatusLine mw_statusLine_any := {
sipVersion := c_sipNameVersion,
statusCode := ?,
reasonPhrase := ?
}
 
template(present) StatusLine mw_statusLine(
in template(present) integer p_statusCode := ?,
in template(present) charstring p_reasonPhrase := ?
) modifies mw_statusLine_any := {
statusCode := p_statusCode,
reasonPhrase := p_reasonPhrase
}
 
template(present) StatusLine mw_statusLine1xx modifies mw_statusLine_any := {statusCode := (100 .. 199)}
template(present) StatusLine mw_statusLine2xx modifies mw_statusLine_any := {statusCode := (200 .. 299)}
template(present) StatusLine mw_statusLine3xx modifies mw_statusLine_any := {statusCode := (300 .. 399)}
 
template(present) StatusLine mw_statusLine4xx modifies mw_statusLine_any := {statusCode := (400 .. 499)}
 
template(present) StatusLine mw_statusLine5xx modifies mw_statusLine_any := {statusCode := (500 .. 599)}
template(present) StatusLine mw_statusLine6xx modifies mw_statusLine_any := {statusCode := (600 .. 699)}
 
template(present) StatusLine mw_statusLineFinal modifies mw_statusLine_any := {statusCode := (200 .. 699)}
 
template(present) NameAddr mw_NameAddr_DispName_User_Host(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
displayName := p_dn,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := p_user,
password := *
},
hostPort := {
host := p_host, //* hostname, IPv4 or IPv6 as a charstring
portField :=
* //* optional integer
}
}
},
urlParameters := {m_UserPhone},
headers := *
}
}
template Addr_Union mw_AddrUnion_Nameaddr(template charstring p_dn, template charstring p_user, template charstring p_host):=
{
nameAddr:=mw_NameAddr_DispName_User_Host(p_dn,p_user,p_host)
}
template SipUrl mw_SipUrl_User_Host(template charstring p_user, template charstring p_host) :=
{
scheme := c_sipScheme, //* contains "sip"
components := {sip:={
userInfo := {userOrTelephoneSubscriber :=p_user, password := *},
hostPort :=
{
host := p_host, //* hostname, IPv4 or IPv6 as a charstring
portField := * //* optional integer
}}},
urlParameters := {m_UserPhone},
headers := *
}
template Addr_Union mw_AddrUnion_SipUrl(template charstring p_user, template charstring p_host):=
{
addrSpecUnion:=mw_SipUrl_User_Host(p_user,p_host)
}
urlParameters := {m_UserPhone},
headers := *
}
}
 
} //* end group Subfields
template(present) Addr_Union mw_AddrUnion_Nameaddr(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
nameAddr := mw_NameAddr_DispName_User_Host(p_dn, p_user, p_host)
}
 
template(present) Addr_Union mw_AddrUnion_SipUrl(
template(present) charstring p_user := ?,
template charstring p_host
) := {
addrSpecUnion := mw_SipUrl_User_Host(p_user, p_host)
}
 
 
} //* end group Subfields
 
group HeaderFieldTemplates {
template(value) LibSip_SIPTypesAndValues.Allow m_Allow(
template(value) Method_List p_methods
) := {
fieldName := ALLOW_E,
methods := p_methods
}
 
group HeaderFieldTemplates {
template LibSip_SIPTypesAndValues.Allow m_Allow (template Method_List p_methods) := {
fieldName := ALLOW_E,
methods := p_methods
}
template LibSip_SIPTypesAndValues.Allow mw_Allow (charstring p_method) := {
fieldName := ALLOW_E,
methods := superset(p_method)
}
template(present) LibSip_SIPTypesAndValues.Allow mw_Allow(
template(value) charstring p_method
) := {
fieldName := ALLOW_E,
methods := superset(p_method)
}
 
template GenericParam m_Cause (template charstring p_cause):=
{id:="cause", paramValue:=p_cause}
template GenericParam mw_Cause (template charstring p_cause):=
// {id:=?, paramValue:= p_cause}
{id:=?, paramValue:= pattern "*{p_cause}*"} // TODO - Expression does not work for all TTCN tools
template(value) GenericParam m_Cause(
template(omit) GenValue p_cause := omit
) := {
id := "cause",
paramValue := p_cause
}
 
template Authorization m_Authorization (template Credentials p_Credentials):=
{
fieldName := AUTHORIZATION_E,
body := {p_Credentials}
}
template Authorization m_Authorization_digest (template CommaParam_List p_CommaParam_List):=
{
fieldName := AUTHORIZATION_E,
body := {{digestResponse := p_CommaParam_List}}
}
template(present) GenericParam mw_Cause_base(
template GenValue p_cause
) := {
id := "cause",
paramValue := p_cause
}
 
template Authorization m_add_Authorization_digest (in Authorization p_auth, template CommaParam_List p_CommaParam_List):=
{
fieldName := AUTHORIZATION_E,
body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse,valueof(p_CommaParam_List))}}
}
template(present) GenericParam mw_Cause(
template(value) charstring p_cause
) := {
id := ?,
paramValue := { tokenOrHost := pattern "*{p_cause}*" }
}
 
template Authorization m_Authorization_other :=
{
fieldName := AUTHORIZATION_E,
body := {{otherResponse := ?}}
}
template(value) Authorization m_Authorization(
template(value) Credentials p_credentials
) := {
fieldName := AUTHORIZATION_E,
body := {p_credentials}
}
 
template Contact m_Contact(template SipUrl p_sipUrl) :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := { addrSpecUnion := p_sipUrl},
contactParams := omit
}
}
} //* end contactBody
}//* end m_Contact
template(value) Authorization m_Authorization_digest(
template(value) CommaParam_List p_commaParam_List
) := {
fieldName := AUTHORIZATION_E,
body := {{digestResponse := p_commaParam_List}}
}
 
template Contact m_Contact_profile(in SipUserProfile p_userprofile) :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := { addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := omit
}
}
} //* end contactBody
}//* end m_Contact
template(present) Authorization mw_Authorization_digest(
template(present) CommaParam_List p_commaParam_List := ?
) := {
fieldName := AUTHORIZATION_E,
body := {{digestResponse := p_commaParam_List}}
}
 
template(value) Authorization m_add_Authorization_digest(
template(value) Authorization p_auth,
template(value) CommaParam_List p_commaParam_List
) := {
fieldName := AUTHORIZATION_E,
body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse, p_commaParam_List)}}
}
 
template Contact m_Contact_profile_expires(in SipUserProfile p_userprofile, in charstring p_expires) :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := { addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := {{"expires",p_expires}}
}
}
} //* end contactBody
}//* end m_Contact
template From m_From(template NameAddr p_nameAddr, charstring p_tag_str) :=
{
fieldName := FROM_E,
addressField :=
{nameAddr := p_nameAddr},//* end addressField
fromParams := {{id := c_tagId, paramValue := p_tag_str}}
};
template From m_From_Anonymous(charstring p_tag_str) :=
{
fieldName := FROM_E,
addressField :=
{nameAddr := {
displayName := "Anonymous", //* optional charstring
addrSpec := m_SipUrl_Anonymous //* SipUrl
}},//* end addressField
fromParams := {{id := c_tagId, paramValue := p_tag_str}}
};
template From m_From_SipUrl(template SipUrl p_sipUrl) :=
{
fieldName := FROM_E,
addressField :=
{nameAddr := {
displayName := omit, //* optional charstring
addrSpec := p_sipUrl //* SipUrl
}},//* end addressField
fromParams := omit
};
template Event m_Event_refer :=
{
fieldName := EVENT_E,
eventType := "refer",
eventParams := omit
};
template(present) Authorization mw_Authorization_other := {
fieldName := AUTHORIZATION_E,
body := {{otherResponse := ?}}
}
 
template Event m_Event_conference :=
{
fieldName := EVENT_E,
eventType := "conference",
eventParams := omit
};
template(value) Contact m_Contact(
template(value) SipUrl p_sipUrl
) := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {addrSpecUnion := p_sipUrl},
contactParams := omit
}
}
} //* end contactBody
} //* end m_Contact
 
template Event m_Event_presence :=
{
fieldName := EVENT_E,
eventType := "presence",
eventParams := omit
};
template(value) Contact m_Contact_profile(
template(value) SipUserProfile p_userprofile
) := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := omit
}
}
} //* end
//* contactBody
} //* end m_Contact
 
template Event m_Event_reg :=
{
fieldName := EVENT_E,
eventType := "reg",
eventParams := omit
};
template Event m_Event_cdiv :=
{
 
template(value) Contact m_Contact_profile_expires(
template(value) SipUserProfile p_userprofile,
template(value) GenValue p_expires
) := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := {
{
"expires",
p_expires
}
}
}
}
} //* end contactBody
} //* end m_Contact
 
template(value) From m_From(
template(value) NameAddr p_nameAddr,
template(value) GenValue p_tag_str
) := {
fieldName := FROM_E,
addressField := {nameAddr := p_nameAddr}, //* end addressField
fromParams := {
{
id := c_tagId,
paramValue := p_tag_str
}
}
}
 
template(value) From m_From_Anonymous(
template(value) GenValue p_tag_str
) := {
fieldName := FROM_E,
addressField := {
nameAddr :=
m_NameAddr(
"Anonymous",
//* optional charstring
m_SipUrl_Anonymous //* SipUrl
)
}, //* end addressField
fromParams := {
{
id := c_tagId,
paramValue := p_tag_str
}
}
}
 
template(value) From m_From_SipUrl(
template(value) SipUrl p_sipUrl
) := {
fieldName := FROM_E,
addressField := {
nameAddr :=
m_NameAddr(
omit,
//* optional charstring
p_sipUrl //* SipUrl
)
}, //* end addressField
fromParams := omit
}
 
template(value) Event m_Event_base := {
fieldName := EVENT_E,
eventType := "comm-div-info",
eventType := "",
eventParams := omit
};
template Event m_Event_mcid :=
{
fieldName := EVENT_E,
eventType := "comm-div-info",
eventParams := omit
};
}
 
template Expires m_Expires_600000 :=
{
fieldName := EXPIRES_E,
deltaSec := "600000"
};
template(value) Event m_Event_refer modifies m_Event_base := {eventType := "refer"}
 
template Expires m_Expires (charstring p_deltaSec):=
{
fieldName := EXPIRES_E,
deltaSec := p_deltaSec
};
template(value) Event m_Event_conference modifies m_Event_base := {eventType := "conference"}
 
template(value) Event m_Event_presence modifies m_Event_base := {eventType := "presence"}
 
template PAssertedID m_PAssertedID(template Addr_Union p_pAssertedIDValue) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
};
template(value) Event m_Event_reg modifies m_Event_base := {eventType := "reg"}
 
template HistoryInfo mw_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) :=
{
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
};
template(value) Event m_Event_cdiv modifies m_Event_base := {eventType := "comm-div-info"}
 
template HistoryInfoEntry mw_HistoryInfoEntry(template SipUrl p_Url, template StringList p_index, template SemicolonParam_List p_paramlist) :=
{
nameAddr := {displayName:=*, addrSpec:= p_Url},
hiIndex := p_index,
hiExtention := p_paramlist
}
template HistoryInfo m_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) :=
{
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
};
template HistoryInfoEntry m_HistoryInfoEntry(template SipUrl p_Url, template StringList p_index, template SemicolonParam_List p_paramlist) :=
{
nameAddr := {displayName:=omit, addrSpec:= p_Url},
hiIndex := p_index,
hiExtention := p_paramlist
}
template PAssertedID m_PAssertedID_2x(template Addr_Union p_pAssertedIDValue1, template Addr_Union p_pAssertedIDValue2) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue1, p_pAssertedIDValue2}
};
template PAssertedID mw_PAssertedID(template PAssertedIDValue p_pAssertedIDValue) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
};
template(value) Event m_Event_mcid := m_Event_cdiv;
 
template PAssertedIDValue mw_PAssertedIDValue(template SipUrl p_SipUrl) :=
{
nameAddr :={displayName := *, addrSpec:=p_SipUrl}
};
template PPreferredID m_PPreferredID(template Addr_Union p_pPreferredIDValue) :=
{
fieldName := P_PREFERRED_ID_E,
pPreferredIDValueList := {p_pPreferredIDValue}
};
template(value) Expires m_Expires_base := {
fieldName := EXPIRES_E,
deltaSec := ""
}
 
template Privacy m_Privacy(PrivacyValue p_privacy) :=
{
fieldName := PRIVACY_E,
privValueList := {p_privacy}
};
template RAck m_RAck(integer p_responseNum, integer p_seqNumber, charstring p_method) :=
{
fieldName := RACK_E,
responseNum := p_responseNum,
seqNumber := p_seqNumber,
method := p_method
};
template(value) Expires m_Expires_600000 modifies m_Expires_base := {deltaSec := "600000"}
 
template Reason m_Reason(integer p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(p_cause),"dummy")}
};
template(value) Expires m_Expires(
template(value) charstring p_deltaSec
) modifies m_Expires_base := {
deltaSec := p_deltaSec
}
 
template Reason m_Reason21 :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(21),"call reject")}
};
template(present) Expires mw_Expires(
template(present) charstring p_deltaSec := ?
) := {
fieldName := EXPIRES_E,
deltaSec := p_deltaSec
}
 
template RecordRoute m_recordRoute_currIpAddr (in SipUserProfile p_userprofile):=
{
fieldName := RECORD_ROUTE_E,
routeBody := {{nameAddr := {displayName := omit,
addrSpec := {scheme := c_sipScheme, //* contains "sip"
components := { sip := {
userInfo := omit,
hostPort := {host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort}}},
urlParameters := {{id:="lr", paramValue := omit}},
headers := omit}
},
rrParam := omit}
}};
template(value) HistoryInfo m_HistoryInfo(
template(value) HistoryInfo_List p_HistoryInfo_List
) := {
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
}
 
template RouteBody m_routeBody_currIpAddr (in SipUserProfile p_userprofile):=
{
template(present) HistoryInfo mw_HistoryInfo(
template(present) HistoryInfo_List p_HistoryInfo_List := ?
) := {
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
}
 
template(value) HistoryInfoEntry m_HistoryInfoEntry(
template(value) SipUrl p_Url,
template(omit) IntegerList p_index := omit,
template(omit) SemicolonParam_List p_paramlist := omit
) := {
nameAddr := m_NameAddr(omit, p_Url),
hiIndex := p_index,
hiExtention := p_paramlist
}
 
template(present) HistoryInfoEntry mw_HistoryInfoEntry(
template(present) SipUrl p_Url := ?,
template IntegerList p_index,
template SemicolonParam_List p_paramlist
) := {
nameAddr := mw_NameAddr(*, p_Url),
hiIndex := p_index,
hiExtention := p_paramlist
}
 
template(value) PAssertedID m_PAssertedID(
template(value) Addr_Union p_pAssertedIDValue
) := {
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
}
 
template(value) PAssertedID m_PAssertedID_2x(
template(value) Addr_Union p_pAssertedIDValue,
template(value) Addr_Union p_pAssertedIDValue2
) modifies m_PAssertedID := {
pAssertedIDValueList := {p_pAssertedIDValue, p_pAssertedIDValue2}
}
 
template(present) PAssertedID mw_PAssertedID(
template(present) PAssertedIDValue p_pAssertedIDValue := ?
) := {
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
}
 
template(present) PAssertedIDValue mw_PAssertedIDValue(
template(present) SipUrl p_SipUrl := ?
) := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
displayName := *,
addrSpec := p_SipUrl
}
}
 
template(value) PPreferredID m_PPreferredID(
template(value) Addr_Union p_pPreferredIDValue
) := {
fieldName := P_PREFERRED_ID_E,
pPreferredIDValueList := {p_pPreferredIDValue}
}
 
template(value) Privacy m_Privacy(
template(value) PrivacyValue p_privacy
) := {
fieldName := PRIVACY_E,
privValueList := {p_privacy}
}
 
template(present) Privacy mw_Privacy_Base(
template(present) charstring p_value := ?
) := {
fieldName := PRIVACY_E,
privValueList := {*, p_value, *}
}
 
template(present) Privacy mw_Privacy_id := mw_Privacy_Base("id");
 
template(present) Privacy mw_Privacy_user := mw_Privacy_Base("user");
 
template(value) RAck m_RAck(
integer p_responseNum,
integer p_seqNumber,
charstring p_method
) := {
fieldName := RACK_E,
responseNum := p_responseNum,
seqNumber := p_seqNumber,
method := p_method
}
 
template(value) Reason m_Reason(
template(value) integer p_cause
) := {
fieldName := REASON_E,
reasonValues := {m_ReasonValue({tokenOrHost := int2str(valueof(p_cause))}, { tokenOrHost := "dummy"})}
}
 
template(value) Reason m_Reason21 := {
fieldName := REASON_E,
reasonValues := {m_ReasonValue({tokenOrHost := int2str(21)}, { tokenOrHost := "call reject"})}
}
 
template(present) Reason mw_Reason_Base := {
fieldName := REASON_E,
reasonValues := {}
}
 
template(present) Reason mw_Reason(
template(value) GenValue p_cause
) modifies mw_Reason_Base := {
reasonValues := {mw_ReasonValue(p_cause, ?)}
}
 
template(present) Reason mw_ReasonSIP(
template(value) GenValue p_cause
) modifies mw_Reason_Base := {
reasonValues := {mw_ReasonValueSIP(p_cause, ?)}
}
 
template(value) RecordRoute m_recordRoute_currIpAddr(
template(value) SipUserProfile p_userprofile
) := {
fieldName := RECORD_ROUTE_E,
routeBody := {
{
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := omit,
hostPort := {
host := p_userprofile.currIpaddr,
portField := p_userprofile.currPort
}
}
},
urlParameters := omit,
headers := omit
}
},
rrParam := omit
}
}
}
 
template(value) RecordRoute m_recordRoute_currIpAddr_params(
template(value) SipUserProfile p_userprofile,
template(value) SemicolonParam_List p_urlParameters
) := {
fieldName := RECORD_ROUTE_E,
routeBody := {
{
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := omit,
hostPort := {
host := p_userprofile.currIpaddr,
portField := p_userprofile.currPort
}
}
},
urlParameters := p_urlParameters,
headers := omit
}
},
rrParam := omit
}
}
}
 
template(value) RouteBody m_routeBody_currIpAddr(
template(value) SipUserProfile p_userprofile
) := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := omit,
hostPort := {host:=p_userprofile.homeDomain, portField:= p_userprofile.currPort}
hostPort := {
host := p_userprofile.homeDomain,
portField := p_userprofile.currPort
}
}
},
urlParameters := {{id:="lr", paramValue := omit}},
urlParameters := omit,
headers := omit
}
},
rrParam := omit
};
template ReferredBy m_ReferredBy_SipUrl(template SipUrl p_sipUrl) :=
{
fieldName := REFERRED_BY_E,
nameAddr :={displayName := omit, addrSpec:=p_sipUrl},
referredbyIdParams := omit
}
}
 
template ReferTo m_ReferTo_SipUrl(template SipUrl p_sipUrl, charstring p_method) :=
{
fieldName := REFER_TO_E,
nameAddr :={displayName := omit, addrSpec:=p_sipUrl},
referToParams := {{id:="method",paramValue :=p_method}}
}
template(value) ReferredBy m_ReferredBy_SipUrl(
template(value) SipUrl p_sipUrl
) := {
fieldName := REFERRED_BY_E,
nameAddr :=
m_NameAddr(
// STF471 {displayName
omit,
// := omit,
p_sipUrl // addrSpec:=p_sipUrl}
),
referredbyIdParams := omit
}
 
template ReferSub m_ReferSub(in boolean p_value) :=
{
fieldName := REFER_SUB_E,
referSubValue :=p_value,
referSubParams := omit
}
template(value) ReferTo m_ReferTo_SipUrl(
template(value) SipUrl p_sipUrl,
template(value) GenValue p_method
) := {
fieldName := REFER_TO_E,
nameAddr :=
m_NameAddr(
// STF471 {displayName
omit,
// := omit,
p_sipUrl // addrSpec:=p_sipUrl}
),
referToParams := {
{
id := "method",
paramValue := p_method
}
}
}
 
template Replaces m_Replaces(
charstring p_callId,
charstring p_toTag,
charstring p_fromTag
) := {
fieldName := REPLACES_E,
replacesParams := {
{id := p_callId, paramValue := omit},
{id := "to-tag", paramValue := p_toTag},
{id := "from-tag", paramValue := p_fromTag}
}
}
template(value) ReferSub m_ReferSub(
template(value) boolean p_value
) := {
fieldName := REFER_SUB_E,
referSubValue := p_value,
referSubParams := omit
}
 
template Require m_Require_replaces :=
{
fieldName := REQUIRE_E,
optionsTags := {c_replaces}
};
template(value) Replaces m_Replaces(
template(value) charstring p_callId,
template(value) GenValue p_toTag,
template(value) GenValue p_fromTag
) := {
fieldName := REPLACES_E,
callid := p_callId,
replacesParams := {
{
id := "to-tag",
paramValue := p_toTag
},
{
id := "from-tag",
paramValue := p_fromTag
}
}
}
 
template Require m_Require_empty :=
{
fieldName := REQUIRE_E,
optionsTags := {""}
};
template Require m_Require_100rel :=
{
fieldName := REQUIRE_E,
optionsTags := {c_tag100rel}
};
template Require m_Require_prec :=
{
fieldName := REQUIRE_E,
optionsTags := {c_tagPrecond}
}
template SubscriptionState m_SubscriptionState_active :=
{
fieldName := SUBSCRIPTION_STATE_E,
subState := "active",
substateParams := {{id:="expires",paramValue:="60000"}}
}
template Supported m_Supported_fromChange :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tagFromChange}
}
template Supported m_Supported_prec :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tagPrecond}
}
template Supported m_Supported_100rel :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tag100rel}
}
template Supported m_Supported_100rel_prec :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tag100rel, c_tagPrecond}
}
template(value) Require m_Require_empty := {
fieldName := REQUIRE_E,
optionsTags := {""}
}
 
template GenericParam m_Text (template charstring p_text):=
{id:="text", paramValue:=p_text}
template GenericParam m_UserPhone :=
{
id := "user",
paramValue := "phone"
}
template GenericParam m_UserToUserEncodingHex :=
{
id := "encoding",
paramValue := "hex"
template(value) Require m_Require_replaces modifies m_Require_empty := {optionsTags := {c_replaces}}
 
template(value) Require m_Require_100rel modifies m_Require_empty := {optionsTags := {c_tag100rel}}
 
template(value) Require m_Require_prec modifies m_Require_empty := {optionsTags := {c_tagPrecond}}
 
template(value) SubscriptionState m_SubscriptionState_active := {
fieldName := SUBSCRIPTION_STATE_E,
subState := "active",
substateParams := {
{
id := "expires",
paramValue := {tokenOrHost := "60000"}
}
}
}
template UserToUser m_UserToUserData(template charstring p_U2UData):=
{
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := m_UserToUserEncodingHex
 
template(value) Supported m_Supported_empty := {
fieldName := SUPPORTED_E,
optionsTags := {""}
}
template To m_To(template SipUrl p_sipUrl) :=
{
fieldName := TO_E,
addressField :=
{nameAddr := {
displayName := "ETSI Tester", //* optional charstring
addrSpec := p_sipUrl //* SipUrl
}},//* end addressField
toParams := omit
};
 
template To m_To_SipUrl(SipUrl p_sipUrl) :=
{
fieldName := TO_E,
addressField :=
{nameAddr := {
displayName := omit, //* optional charstring
addrSpec := p_sipUrl //* SipUrl
}},//* end addressField
toParams := omit
};
template(value) Supported m_Supported_fromChange modifies m_Supported_empty := {optionsTags := {c_tagFromChange}}
 
template To mw_To_NameAddr_SipUrl(template charstring p_dn, template charstring p_user, template charstring p_host) :=
{
fieldName := TO_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn,p_user,p_host),mw_AddrUnion_SipUrl(p_user,p_host)),
toParams := *
}
template(value) Supported m_Supported_prec modifies m_Supported_empty := {optionsTags := {c_tagPrecond}}
 
template To mw_To(template SipUrl p_sipUrl) := {
fieldName := TO_E,
addressField := { nameAddr := {displayName := *, addrSpec := p_sipUrl}},
toParams:= *
}
template(value) Supported m_Supported_100rel modifies m_Supported_empty := {optionsTags := {c_tag100rel}}
 
template From mw_From(template SipUrl p_sipUrl) := {
fieldName := FROM_E,
addressField := { nameAddr := {displayName := *, addrSpec := p_sipUrl}},
fromParams:= *
}
template(value) Supported m_Supported_100rel_prec modifies m_Supported_empty := {optionsTags := {c_tag100rel, c_tagPrecond}}
 
template From mw_From_NameAddr_SipUrl(template charstring p_dn, template charstring p_user, template charstring p_host) :=
{
fieldName := FROM_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn,p_user,p_host),mw_AddrUnion_SipUrl(p_user,p_host)),
fromParams := *
}
template ViaBody m_ViaBody_currIpaddr(charstring branch_val,in SipUserProfile p_userprofile) :=
{
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy:={host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort},
viaParams:={{id :=c_branchId,paramValue :=branch_val}}
}
template ViaBody mw_ViaBody_interface(template HostPort p_hostport) :=
{
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy:={host:=p_hostport.host, portField:= p_hostport.portField},
viaParams:=*
}
template(value) GenericParam m_Text(
template(value) GenValue p_text
) := {
id := "text",
paramValue := p_text
}
 
template Via mw_Via(template ViaBody p_viabody) :=
{
fieldName := VIA_E,
viaBody:= superset(p_viabody)
}
template CallId mw_CallId_any :=
{
fieldName := CALL_ID_E,
callid := ?
}
template(present) GenericParam mw_Text(
template GenValue p_text
) := {
id := "text",
paramValue := p_text
}
 
template Privacy mw_Privacy_id :=
{
fieldName := PRIVACY_E,
privValueList := {*,"id",*}
};
template(value) GenericParam m_UserPhone := {
id := "user",
paramValue := { quotedString := "phone" }
}
 
template Privacy mw_Privacy(template charstring p_value) :=
{
fieldName := PRIVACY_E,
privValueList := {*,p_value,*}
};
template(value) GenericParam m_UserToUserEncodingHex := {
id := "encoding",
paramValue := { quotedString := "hex" }
}
 
template Privacy mw_Privacy_user :=
{
fieldName := PRIVACY_E,
privValueList := {*,"user",*}
};
template Reason mw_Reason(template charstring p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(p_cause,?)}
};
template(value) UserToUser m_UserToUserData(
template(value) UserToUser.uuiData p_U2UData
) := {
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := m_UserToUserEncodingHex
}
 
template Reason mw_ReasonSIP(template charstring p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValueSIP(p_cause,?)}
};
template Require mw_Require_not_100rel :=
{
fieldName := REQUIRE_E,
optionsTags := superset(complement(c_tag100rel))
};
template Require mw_require_100rel :=
{
fieldName := REQUIRE_E,
optionsTags := superset(c_tag100rel)
};
template(value) To m_To(
template(value) SipUrl p_sipUrl
) := {
fieldName := TO_E,
addressField := {
nameAddr :=
m_NameAddr(
"ETSI Tester",
//* optional charstring
p_sipUrl //* SipUrl
)
}, //* end addressField
toParams := omit
}
 
template RecordRoute mw_recordroute (template RouteBody p_routeBody):=
{
fieldName := RECORD_ROUTE_E,
routeBody := superset(p_routeBody)
};
template Route mw_route (template RouteBody_List p_routeBody):=
{
fieldName := ROUTE_E,
routeBody := p_routeBody
};
template StatusLine mw_statusLine(template integer p_statusCode) :=
{
sipVersion:=c_sipNameVersion,
statusCode:=p_statusCode,
reasonPhrase:=?
};
template Supported mw_Supported_100rel_prec :=
{
fieldName:=SUPPORTED_E,
optionsTags:= superset(c_tag100rel, c_tagPrecond)
}
template Supported mw_Supported_100rel :=
{
fieldName:=SUPPORTED_E,
optionsTags:= superset(c_tag100rel)
}
template(value) To m_To_SipUrl(
template(value) SipUrl p_sipUrl
) modifies m_To := {
addressField := {
nameAddr := {
displayName :=
omit //* optional charstring
}
} //* end addressField
}
 
template Supported mw_Supported_fromChange :=
{
fieldName:=SUPPORTED_E,
optionsTags:= superset(c_tagFromChange)
}
template UserToUser mw_UserToUserData(template charstring p_U2UData):=
{
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := ?
}
template Contact mw_Contact_conference :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := {
nameAddr := {
displayName := *,
addrSpec := {
scheme := ?,
components := ?,
urlParameters := {{"isfocus",*},*},
headers := *
}
template(present) To mw_To_NameAddr_SipUrl(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
fieldName := TO_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)),
toParams := *
}
 
template(present) To mw_To(
template(present) SipUrl p_sipUrl := ?
) := {
fieldName := TO_E,
addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)},
toParams := *
}
 
template(present) From mw_From(
template(present) SipUrl p_sipUrl := ?
) := {
fieldName := FROM_E,
addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)},
fromParams := *
}
 
template(present) From mw_From_NameAddr_SipUrl(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
fieldName := FROM_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)),
fromParams := *
}
template(value) ViaBody m_ViaBody_currIpaddr(
template(value) charstring p_branch_val,
template(value) SipUserProfile p_userprofile
) := {
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy := {
host := p_userprofile.currIpaddr,
portField := p_userprofile.currPort
},
viaParams := {
{
id := c_branchId,
paramValue := {
tokenOrHost := p_branch_val
}
},
contactParams := *
}
}
}
}
template AlertInfo m_AlertInfo(charstring p_urn) := {
fieldName := ALERT_INFO_E,
alertInfoBody := {{p_urn, omit}}
}
template AlertInfo mw_AlertInfo(template charstring p_urn) := {
fieldName := ALERT_INFO_E,
alertInfoBody := superset({p_urn, omit})
}
} //* end of group HeaderFieldTemplates
}
}
}
 
template(present) ViaBody mw_ViaBody_interface(
template(present) HostPort p_hostport := ?
) := {
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy := {
host := p_hostport.host,
portField := p_hostport.portField
},
viaParams := *
}
 
group MessageTemplates {
group dummy_templates {
group dummy_parameter_send {
template(present) Via mw_Via(
template(present) ViaBody p_viabody := ?
) := {
fieldName := VIA_E,
viaBody := {*, p_viabody, *} // superset(p_viabody)
}
 
template RequestLine m_requestLine_dummy(Method p_method) :=
{
method := p_method,
requestUri := c_unavailableUri,
sipVersion := c_sipNameVersion
}
template(present) CallId mw_CallId_any := {
fieldName := CALL_ID_E,
callid := ?
}
 
template MessageHeader m_msgHeader_dummy :=
{
accept := omit,
acceptContact := omit,
acceptEncoding := omit,
acceptLanguage := omit,
alertInfo := omit,
allow := omit,
allowEvents := omit, //* RFC3265
authenticationInfo := omit,
authorization := omit,
callId := c_empty_CallId,
callInfo := omit,
contact := omit,
contentDisposition := omit,
contentEncoding := omit,
contentLanguage := omit,
contentLength := {fieldName := CONTENT_LENGTH_E, len:= 0},
contentType := omit, //* if message body present m, else not present
cSeq := c_empty_cSeq,
date := omit,
errorInfo := omit,
event := omit, //* RFC3265
expires := omit,
fromField := c_empty_From,
geolocation := omit,
geolocationRouting := omit,
historyInfo := omit, //* RFC4244
inReplyTo := omit,
maxForwards := c_maxForwards70,
mimeVersion := omit,
minExpires := omit,
minSE := omit, //* RFC4028
organization := omit,
pAccessNetworkInfo := omit, //* RFC3455
pAssertedID := omit,
pAssertedService := omit,
pAssociatedURI := omit,
path := omit, //* RFC3327
pCalledPartyID := omit, //* RFC3455
pChargingFunctionAddresses := omit, //* RFC3455
pChargingVector := omit, //* RFC3455
pEarlyMedia := omit, //* RFC5009
pMediaAuthorization := omit, //* RFC3313
pPreferredID := omit,
pPreferredService := omit,
priority := omit,
privacy := omit,
proxyAuthenticate := omit,
proxyAuthorization := omit,
proxyRequire := omit,
pVisitedNetworkID := omit, //* RFC3455
rAck := omit,
rSeq := omit,
reason := omit,
recordRoute := omit,
requestDisposition := omit,
referredBy := omit, //* RFC3892 - REFER method
referTo := omit, //* RFC3515 - REFER method
referSub := omit, //* RFC4488 - REFER method
replaces := omit, //* RFC3891
replyTo := omit,
require := omit,
retryAfter := omit,
route := omit,
securityClient := omit, //* RFC3329
securityServer := omit, //* RFC3329
securityVerify := omit, //* RFC3329
server := omit,
serviceRoute := omit, //* RFC3608
sessionExpires := omit, //* RFC4028
sessionId := omit,
sipETag := omit,
sipIfMatch := omit,
subject := omit,
subscriptionState := omit, //* RFC3265
supported := omit,
timestamp := omit,
toField := c_empty_To,
unsupported := omit,
userToUser := omit,
userAgent := omit,
via := c_empty_Via,
warning := omit,
wwwAuthenticate := omit,
undefinedHeader_List := omit
}
} //* group dummy_parameter_send
group dummy_parameter_receive {
template(present) Require mw_Require_Base := {
fieldName := REQUIRE_E,
optionsTags := {}
}
 
template RequestLine mw_requestLine_dummy(Method p_method) :=
{
method := p_method,
requestUri := ?,
sipVersion := c_sipNameVersion
}
template(present) Require mw_Require_not_100rel modifies mw_Require_Base := {optionsTags := superset(complement(c_tag100rel))}
 
template MessageHeader mw_msgHeader_dummy :=
{
accept := *,
acceptContact := *,
acceptEncoding := *,
acceptLanguage := *,
alertInfo := *,
allow := *,
allowEvents := *, //* RFC3265
authenticationInfo := *,
authorization := *,
callId := ?,
callInfo := *,
contact := *,
contentDisposition := *,
contentEncoding := *,
contentLanguage := *,
contentLength := ?,
contentType := *,
cSeq := ?,
date := *,
errorInfo := *,
event := *, //* RFC3265
expires := *,
fromField := ?,
geolocation := *,
geolocationRouting := *,
historyInfo := *, //* RFC4244
inReplyTo := *,
maxForwards := *,
mimeVersion := *,
minExpires := *,
minSE := *, //* RFC4028
organization := *,
pAccessNetworkInfo := *, //* RFC3455
pAssertedID := *,
pAssertedService := *,
pAssociatedURI := *,
path := *, //* RFC3327
pCalledPartyID := *, //* RFC3455
pChargingFunctionAddresses := *, //* RFC3455
pChargingVector := *, //* RFC3455
pEarlyMedia := *, //* RFC5009
pMediaAuthorization := *, //* RFC3313
pPreferredID := *,
pPreferredService := *,
priority := *,
privacy := *,
proxyAuthenticate := *,
proxyAuthorization := *,
proxyRequire := *,
pVisitedNetworkID := *, //* RFC3455
rAck := *,
rSeq := *,
reason := *,
recordRoute := *,
requestDisposition := *,
referredBy := *, //* RFC3892 - REFER method
referTo := *, //* RFC3515 - REFER method
referSub := *, //* RFC4488 - REFER method
replaces := *, //* RFC 3891
replyTo := *,
require := *,
retryAfter := *,
route := *,
securityClient := *, //* RFC3329
securityServer := *, //* RFC3329
securityVerify := *, //* RFC3329
server := *,
serviceRoute := *, //* RFC3608
sessionExpires := *, //* RFC4028
sessionId := *,
sipETag := *,
sipIfMatch := *,
subject := *,
subscriptionState := *, //* RFC3265
supported := *,
timestamp := *,
toField := ?,
unsupported := *,
userToUser := *,
userAgent := *,
via := ?,
warning := *,
wwwAuthenticate := *,
undefinedHeader_List := *
}
}//* end group dummy_parameter_receive
group dummy_request_templates_send {
template(present) Require mw_require_100rel modifies mw_Require_Base := {optionsTags := superset(c_tag100rel)}
 
template ACK_Request m_ACK_Dummy :=
{
requestLine := m_requestLine_dummy(ACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) RecordRoute mw_recordroute(
template(present) RouteBody p_routeBody := ?
) := {
fieldName := RECORD_ROUTE_E,
routeBody := {*, p_routeBody, *} // superset(p_routeBody)
}
 
template BYE_Request m_BYE_Dummy :=
{
requestLine := m_requestLine_dummy(BYE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) Route mw_route(
template(present) RouteBody_List p_routeBody := ?
) := {
fieldName := ROUTE_E,
routeBody := p_routeBody
}
 
template CANCEL_Request m_CANCEL_Dummy :=
{
requestLine := m_requestLine_dummy(CANCEL_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) Supported mw_Supported_Base := {
fieldName := SUPPORTED_E,
optionsTags := {}
}
 
template INFO_Request m_INFO_Dummy :=
{
requestLine := m_requestLine_dummy(INFO_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) Supported mw_Supported_100rel_prec modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel, c_tagPrecond)}
 
template INVITE_Request m_INVITE_Dummy :=
{
requestLine := m_requestLine_dummy(INVITE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) Supported mw_Supported_100rel modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel)}
 
template MESSAGE_Request m_MESSAGE_Dummy :=
{
requestLine := m_requestLine_dummy(MESSAGE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) Supported mw_Supported_fromChange modifies mw_Supported_Base := {optionsTags := superset(c_tagFromChange)}
 
template NOTIFY_Request m_NOTIFY_Dummy :=
{
requestLine := m_requestLine_dummy(NOTIFY_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template OPTIONS_Request m_OPTIONS_Dummy :=
{
requestLine := m_requestLine_dummy(OPTIONS_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) UserToUser mw_UserToUserData(
template(present) UserToUser.uuiData p_U2UData := ?
) := {
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := ?
}
 
template PRACK_Request m_PRACK_Dummy :=
{
requestLine := m_requestLine_dummy(PRACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) Contact mw_Contact_conference := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {
nameAddr := {
displayName := *,
addrSpec := {
scheme := ?,
components := ?,
urlParameters := {
{
"isfocus",
*
},
*
},
headers := *
}
}
},
contactParams := *
}
}
}
}
 
template PUBLISH_Request m_PUBLISH_Dummy :=
{
requestLine := m_requestLine_dummy(PUBLISH_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) AlertInfo m_AlertInfo_Base := {
fieldName := ALERT_INFO_E,
alertInfoBody := {}
}
 
template REGISTER_Request m_REGISTER_Dummy :=
{
requestLine := m_requestLine_dummy(REGISTER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) AlertInfo m_AlertInfo(
template(value) charstring p_urn
) modifies m_AlertInfo_Base := {
alertInfoBody := {
{
p_urn,
omit
}
}
}
 
template REFER_Request m_REFER_Dummy :=
{
requestLine := m_requestLine_dummy(REFER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(present) AlertInfo mw_AlertInfo(
template(present) charstring p_urn := ?
) modifies m_AlertInfo_Base := {
alertInfoBody :=
superset(
{
p_urn,
omit
}
)
}
 
template SUBSCRIBE_Request m_SUBSCRIBE_Dummy :=
{
requestLine := m_requestLine_dummy(SUBSCRIBE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template UPDATE_Request m_UPDATE_Dummy :=
{
requestLine := m_requestLine_dummy(UPDATE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
}//* end group dummy_request_templates_send
group dummy_request_templates_receive{
} //* end of group HeaderFieldTemplates
 
template ACK_Request mw_ACK_Dummy :=
{
requestLine := mw_requestLine_dummy(ACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template BYE_Request mw_BYE_Dummy :=
{
requestLine := mw_requestLine_dummy(BYE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
group MessageTemplates {
 
template CANCEL_Request mw_CANCEL_Dummy :=
{
requestLine := mw_requestLine_dummy(CANCEL_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
group dummy_templates {
 
template INFO_Request mw_INFO_Dummy :=
{
requestLine := mw_requestLine_dummy(INFO_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
group dummy_parameter_send {
 
template INVITE_Request mw_INVITE_Dummy :=
{
requestLine := mw_requestLine_dummy(INVITE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(value) RequestLine m_requestLine_dummy(
template(value) Method p_method
) := {
method := p_method,
requestUri := c_unavailableUri,
sipVersion := c_sipNameVersion
}
 
template MESSAGE_Request mw_MESSAGE_Dummy :=
{
requestLine := mw_requestLine_dummy(MESSAGE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template OPTIONS_Request mw_OPTIONS_Dummy :=
{
requestLine := mw_requestLine_dummy(OPTIONS_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(value) MessageHeader m_msgHeader_dummy := {
accept := omit,
acceptContact := omit,
acceptEncoding := omit,
acceptLanguage := omit,
alertInfo := omit,
allow := omit,
allowEvents := omit, //* RFC3265
authenticationInfo := omit,
authorization := omit,
callId := c_empty_CallId,
callInfo := omit,
contact := omit,
contentDisposition := omit,
contentEncoding := omit,
contentLanguage := omit,
contentLength := {
fieldName := CONTENT_LENGTH_E,
len := 0
},
contentType := omit, //* if message body present m,
//* else not present
cSeq := c_empty_cSeq,
date := omit,
errorInfo := omit,
event := omit, //* RFC3265
expires := omit,
fromField := c_empty_From,
geolocation := omit,
geolocationRouting := omit,
historyInfo := omit, //* RFC4244
inReplyTo := omit,
maxForwards := c_maxForwards70,
mimeVersion := omit,
minExpires := omit,
minSE := omit, //* RFC4028
organization := omit,
pAccessNetworkInfo := omit, //* RFC3455
pAssertedID := omit,
pAssertedService := omit,
pAssociatedURI := omit,
path := omit, //* RFC3327
pCalledPartyID := omit, //* RFC3455
pChargingFunctionAddresses := omit, //* RFC3455
pChargingVector := omit, //* RFC3455
pEarlyMedia := omit, //* RFC5009
pMediaAuthorization := omit, //* RFC3313
pPreferredID := omit,
pPreferredService := omit,
priority := omit,
privacy := omit,
proxyAuthenticate := omit,
proxyAuthorization := omit,
proxyRequire := omit,
pVisitedNetworkID := omit, //* RFC3455
rAck := omit,
rSeq := omit,
reason := omit,
recordRoute := omit,
requestDisposition := omit,
referredBy := omit, //* RFC3892 - REFER method
referTo := omit, //* RFC3515 - REFER method
referSub := omit, //* RFC4488 - REFER method
replaces := omit, //* RFC3891
replyTo := omit,
require := omit,
retryAfter := omit,
route := omit,
securityClient := omit, //* RFC3329
securityServer := omit, //* RFC3329
securityVerify := omit, //* RFC3329
server := omit,
serviceRoute := omit, //* RFC3608
sessionExpires := omit, //* RFC4028
sessionId := omit,
sipETag := omit,
sipIfMatch := omit,
subject := omit,
subscriptionState := omit, //* RFC3265
supported := omit,
timestamp := omit,
toField := c_empty_To,
unsupported := omit,
userToUser := omit,
userAgent := omit,
via := c_empty_Via,
warning := omit,
wwwAuthenticate := omit,
undefinedHeader_List := omit
}
 
template NOTIFY_Request mw_NOTIFY_Dummy :=
{
requestLine := mw_requestLine_dummy(NOTIFY_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template PRACK_Request mw_PRACK_Dummy :=
{
requestLine := mw_requestLine_dummy(PRACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
} //* group dummy_parameter_send
 
template PUBLISH_Request mw_PUBLISH_Dummy :=
{
requestLine := mw_requestLine_dummy(PUBLISH_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
group dummy_parameter_receive {
 
template REFER_Request mw_REFER_Dummy :=
{
requestLine := mw_requestLine_dummy(REFER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) RequestLine mw_requestLine_dummy(
Method p_method
) := {
method := p_method,
requestUri := ?,
sipVersion := c_sipNameVersion
}
 
template REGISTER_Request mw_REGISTER_Dummy :=
{
requestLine := mw_requestLine_dummy(REGISTER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) MessageHeader mw_msgHeader_dummy := {
accept := *,
acceptContact := *,
acceptEncoding := *,
acceptLanguage := *,
alertInfo := *,
allow := *,
allowEvents := *, //* RFC3265
authenticationInfo := *,
authorization := *,
callId := ?,
callInfo := *,
contact := *,
contentDisposition := *,
contentEncoding := *,
contentLanguage := *,
contentLength := ?,
contentType := *,
cSeq := ?,
date := *,
errorInfo := *,
event := *, //* RFC3265
expires := *,
fromField := ?,
geolocation := *,
geolocationRouting := *,
historyInfo := *, //* RFC4244
inReplyTo := *,
maxForwards := *,
mimeVersion := *,
minExpires := *,
minSE := *, //* RFC4028
organization := *,
pAccessNetworkInfo := *, //* RFC3455
pAssertedID := *,
pAssertedService := *,
pAssociatedURI := *,
path := *, //* RFC3327
pCalledPartyID := *, //* RFC3455
pChargingFunctionAddresses := *, //* RFC3455
pChargingVector := *, //* RFC3455
pEarlyMedia := *, //* RFC5009
pMediaAuthorization := *, //* RFC3313
pPreferredID := *,
pPreferredService := *,
priority := *,
privacy := *,
proxyAuthenticate := *,
proxyAuthorization := *,
proxyRequire := *,
pVisitedNetworkID := *, //* RFC3455
rAck := *,
rSeq := *,
reason := *,
recordRoute := *,
requestDisposition := *,
referredBy := *, //* RFC3892 - REFER method
referTo := *, //* RFC3515 - REFER method
referSub := *, //* RFC4488 - REFER method
replaces := *, //* RFC 3891
replyTo := *,
require := *,
retryAfter := *,
route := *,
securityClient := *, //* RFC3329
securityServer := *, //* RFC3329
securityVerify := *, //* RFC3329
server := *,
serviceRoute := *, //* RFC3608
sessionExpires := *, //* RFC4028
sessionId := *,
sipETag := *,
sipIfMatch := *,
subject := *,
subscriptionState := *, //* RFC3265
supported := *,
timestamp := *,
toField := ?,
unsupported := *,
userToUser := *,
userAgent := *,
via := ?,
warning := *,
wwwAuthenticate := *,
undefinedHeader_List := *
}
 
template SUBSCRIBE_Request mw_SUBSCRIBE_Dummy :=
{
requestLine := mw_requestLine_dummy(SUBSCRIBE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template UPDATE_Request mw_UPDATE_Dummy :=
{
requestLine := mw_requestLine_dummy(UPDATE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
}//* end group dummy_request_templates_receive
group dummy_response_templates_send{
template Response m_Response_Dummy :=
{
statusLine := c_statusLine100,
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
} //* group dummy_response_templates_send
group dummy_response_templates_receive{
template Response mw_Response_Dummy :=
{
statusLine := ?,
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
} //* group dummy_response_templates_receive
}
} //* end group dummy_parameter_receive
 
group base_templates{
group request_send {
template ACK_Request m_ACK_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_ACK_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "ACK"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template BYE_Request m_BYE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via) modifies m_BYE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template CANCEL_Request m_CANCEL_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via) modifies m_CANCEL_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
group dummy_request_templates_send {
 
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template INFO_Request m_INFO_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via) modifies m_INFO_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template INVITE_Request m_INVITE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact) modifies m_INVITE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) ACK_Request m_ACK_Dummy := {
requestLine := m_requestLine_dummy(ACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template MESSAGE_Request m_MESSAGE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, Via p_via) modifies m_MESSAGE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) BYE_Request m_BYE_Dummy := {
requestLine := m_requestLine_dummy(BYE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template NOTIFY_Request m_NOTIFY_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_NOTIFY_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "NOTIFY"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) CANCEL_Request m_CANCEL_Dummy := {
requestLine := m_requestLine_dummy(CANCEL_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template OPTIONS_Request m_OPTIONS_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_OPTIONS_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "OPTIONS"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template PRACK_Request m_PRACK_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, RAck p_RAck)
modifies m_PRACK_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "PRACK"},
fromField := p_from,
rAck := p_RAck,
toField := p_to,
via := p_via
},
messageBody := omit
}
template PUBLISH_Request m_PUBLISH_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Event p_event, template RAck p_RAck, template MessageBody p_mb)
modifies m_PUBLISH_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_plainText/*c_sdpAplication*/},
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "PUBLISH"},
event := p_event,
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
template(value) INFO_Request m_INFO_Dummy := {
requestLine := m_requestLine_dummy(INFO_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template REFER_Request m_REFER_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, Contact p_contact,
From p_from, template To p_to, Via p_via, template ReferTo p_referTo, template ReferredBy p_referredBy)
modifies m_REFER_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contact := p_contact,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "REFER"},
fromField := p_from,
referTo := p_referTo,
referredBy := p_referredBy,
toField := p_to,
via := p_via
}
}
template REFER_Request m_REFER_Request_replaces (
SipUrl p_requestUri,
CallId p_callId,
CSeq p_cSeq,
Contact p_contact,
From p_from,
template To p_to,
Via p_via,
template ReferTo p_referTo,
template ReferredBy p_referredBy,
template Replaces p_replaces,
template Require p_require
) modifies m_REFER_Request_Base := {
msgHeader :=
{
replaces := p_replaces,
require := p_require
}
}
template REGISTER_Request m_REGISTER_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact, template Authorization p_authorization) modifies m_REGISTER_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
authorization := p_authorization,
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
supported := {
fieldName := SUPPORTED_E, optionsTags := {"path"}
},
via := p_via
}
}
template(value) INVITE_Request m_INVITE_Dummy := {
requestLine := m_requestLine_dummy(INVITE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template SUBSCRIBE_Request m_SUBSCRIBE_Request_Base (SipUrl p_requestUri, CallId p_callId,
CSeq p_cSeq, From p_from, To p_to, Via p_via) modifies m_SUBSCRIBE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "SUBSCRIBE"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) MESSAGE_Request m_MESSAGE_Dummy := {
requestLine := m_requestLine_dummy(MESSAGE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template UPDATE_Request m_UPDATE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact, template MessageBody p_mb) modifies m_UPDATE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contact := p_contact,
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication},
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "UPDATE"},
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
} //* end of group message_send
template(value) NOTIFY_Request m_NOTIFY_Dummy := {
requestLine := m_requestLine_dummy(NOTIFY_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
group request_receive {
template ACK_Request mw_ACK_Request_Base (template CallId p_callId) modifies mw_ACK_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template BYE_Request mw_BYE_Request_Base(template CallId p_callId) modifies mw_BYE_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template CANCEL_Request mw_CANCEL_Request_Base (template CallId p_callId) modifies mw_CANCEL_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template INFO_Request mw_INFO_Request_Base(template CallId p_callId) modifies mw_INFO_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template(value) OPTIONS_Request m_OPTIONS_Dummy := {
requestLine := m_requestLine_dummy(OPTIONS_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy :=
{
requestLine :=
{
method := INVITE_E
}
}
template(value) PRACK_Request m_PRACK_Dummy := {
requestLine := m_requestLine_dummy(PRACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy :=
{
msgHeader :=
{
contact := *
}
}
template(value) PUBLISH_Request m_PUBLISH_Dummy := {
requestLine := m_requestLine_dummy(PUBLISH_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template NOTIFY_Request mw_NOTIFY_Request_Base (template CallId p_callId) modifies mw_NOTIFY_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template OPTIONS_Request mw_OPTIONS_Request_Base (template CallId p_callId) modifies mw_OPTIONS_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
template(value) REGISTER_Request m_REGISTER_Dummy := {
requestLine := m_requestLine_dummy(REGISTER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template(value) REFER_Request m_REFER_Dummy := {
requestLine := m_requestLine_dummy(REFER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template(value) SUBSCRIBE_Request m_SUBSCRIBE_Dummy := {
requestLine := m_requestLine_dummy(SUBSCRIBE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template(value) UPDATE_Request m_UPDATE_Dummy := {
requestLine := m_requestLine_dummy(UPDATE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
 
} //* end group dummy_request_templates_send
group dummy_request_templates_receive {
 
template(present) ACK_Request mw_ACK_Dummy := {
requestLine := mw_requestLine_dummy(ACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) BYE_Request mw_BYE_Dummy := {
requestLine := mw_requestLine_dummy(BYE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) CANCEL_Request mw_CANCEL_Dummy := {
requestLine := mw_requestLine_dummy(CANCEL_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) INFO_Request mw_INFO_Dummy := {
requestLine := mw_requestLine_dummy(INFO_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) INVITE_Request mw_INVITE_Dummy := {
requestLine := mw_requestLine_dummy(INVITE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) MESSAGE_Request mw_MESSAGE_Dummy := {
requestLine := mw_requestLine_dummy(MESSAGE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) OPTIONS_Request mw_OPTIONS_Dummy := {
requestLine := mw_requestLine_dummy(OPTIONS_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) NOTIFY_Request mw_NOTIFY_Dummy := {
requestLine := mw_requestLine_dummy(NOTIFY_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) PRACK_Request mw_PRACK_Dummy := {
requestLine := mw_requestLine_dummy(PRACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) PUBLISH_Request mw_PUBLISH_Dummy := {
requestLine := mw_requestLine_dummy(PUBLISH_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) REFER_Request mw_REFER_Dummy := {
requestLine := mw_requestLine_dummy(REFER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) REGISTER_Request mw_REGISTER_Dummy := {
requestLine := mw_requestLine_dummy(REGISTER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Dummy := {
requestLine := mw_requestLine_dummy(SUBSCRIBE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template(present) UPDATE_Request mw_UPDATE_Dummy := {
requestLine := mw_requestLine_dummy(UPDATE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
} //* end group dummy_request_templates_receive
 
group dummy_response_templates_send {
 
template(value) Response m_Response_Dummy := {
statusLine := c_statusLine100,
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
 
} //* group dummy_response_templates_send
 
group dummy_response_templates_receive {
 
template(present) Response mw_Response_Dummy := {
statusLine := ?,
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
 
} //* group dummy_response_templates_receive
}
template PRACK_Request mw_PRACK_Request_Base(template CallId p_callId) modifies mw_PRACK_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template PUBLISH_Request mw_PUBLISH_Request_Base(template CallId p_callId) modifies mw_PUBLISH_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
 
template REFER_Request mw_REFER_Request_Base (template CallId p_callId) modifies mw_REFER_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template REFER_Request
mw_REFER_Request(template CallId p_callId, SipUrl p_requestUri,
SipUrl p_referredBy)
modifies mw_REFER_Request_Base := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := {displayName := *, addrSpec := p_referredBy},
referredbyIdParams := *
}
}
}
template INVITE_Request mw_INVITE_Request(template Require p_require,
SipUrl p_referredBy) modifies mw_INVITE_Request_Base := {
msgHeader := {
require := p_require,
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := {displayName := *, addrSpec := p_referredBy},
referredbyIdParams := *
}
}
}
template REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy :=
{
requestLine :=
{
method := REGISTER_E
}
}
group base_templates {
 
template SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy :=
{
requestLine :=
{
method := SUBSCRIBE_E
}
}
template(value) CSeq m_cSeq(
template(value) integer p_seqNumber,
template(value) charstring p_method
) := {
fieldName := CSEQ_E,
seqNumber := p_seqNumber,
method := p_method
}
 
template UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template(value) ContentLength m_contentLength(
template(value) integer p_len
) := {
fieldName := CONTENT_LENGTH_E,
len := p_len
}
 
} //* end group request_receive
group response_send {
template(value) ContentType m_contentType(
template(value) charstring p_mediaType
) := {
fieldName := CONTENT_TYPE_E,
mediaType := p_mediaType
}
 
template Response m_Response_Base (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_Response_Dummy:=
{
statusLine := p_statusLine,
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
maxForwards := omit,
toField := p_to,
via := p_via
},
messageBody := omit,
payload := omit
}
template(present) ContentType mw_contentType(
in template(present) charstring p_mediaType := ?
) := {
fieldName := CONTENT_TYPE_E,
mediaType := p_mediaType
}
 
group request_send {
 
} //* end group response_send
template(value) ACK_Request m_ACK_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_ACK_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "ACK"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "ACK"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
group response_receive {
template(value) ACK_Request m_ACK_Request_withRecordRoute(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Route p_route
) modifies m_ACK_Request_Base := {
msgHeader := {
route := p_route,
contentLength := m_contentLength(0)
}
}
 
template Response mw_Response_Base (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq) modifies mw_Response_Dummy:=
{
statusLine := p_statusLine,
msgHeader :=
{
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
} //* end group message_receive
template(value) BYE_Request m_BYE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_BYE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
} //* end group full_templates
template(value) CANCEL_Request m_CANCEL_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_CANCEL_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
group modified_templates {
group request_send {
template ACK_Request m_ACK_Request_route (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route)
modifies m_ACK_Request_Base
:=
{
msgHeader :=
{
route := p_route
}
}
template(value) INFO_Request m_INFO_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_INFO_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template ACK_Request m_ACK_Request_sdp (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via,template MessageBody p_mb)
modifies m_ACK_Request_Base
:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication}
},
messageBody := p_mb
}
template BYE_Request m_BYE_Request_cause
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, Via p_via, integer p_cause)
modifies m_BYE_Request_Base
:=
{
msgHeader :=
{
reason := m_Reason(p_cause) //* PIXIT value
}
}
template INVITE_Request m_INVITE_Request_sdp
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via, Contact p_contact, template MessageBody p_mb)
modifies m_INVITE_Request_Base
:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication}
},
messageBody := p_mb
}
template INVITE_Request m_INVITE_Request_ResourceList
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via, Contact p_contact, template MessageBody p_mb)
modifies m_INVITE_Request_Base
:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/resource-lists+xml"},
contentDisposition := {
fieldName := CONTENT_DISPOSITION_E,
dispositionType := "recipient-list",
dispositionParams := omit
},
require := {
fieldName := REQUIRE_E,
optionsTags := {"recipient-list-invite"}
}
},
messageBody := p_mb
}
template(value) INVITE_Request m_INVITE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact
) modifies m_INVITE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template REGISTER_Request m_REGISTER_Request_expires
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact,
template Authorization p_authorization, charstring p_expires)
modifies m_REGISTER_Request_Base
:=
{
msgHeader :=
{
authorization := p_authorization,
expires := {
fieldName := EXPIRES_E,
deltaSec := p_expires }
}
}
template NOTIFY_Request m_NOTIFY_Request_contact (
SipUrl p_requestUri,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
Contact p_contact
) modifies m_NOTIFY_Request_Base
:=
{
msgHeader :=
{
contact := p_contact,
event := m_Event_reg,
subscriptionState := m_SubscriptionState_active
}
}
template NOTIFY_Request m_NOTIFY_Request_sipfrag (
SipUrl p_requestUri,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
charstring p_state,
charstring p_sipfrag
) modifies m_NOTIFY_Request_Base := {
requestLine :=
{
method := NOTIFY_E,
requestUri :=
{ scheme := ?,
components := {sip:={userInfo := *,
hostPort:= p_requestUri.components.sip.hostPort}}
}
},
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= lengthof(p_sipfrag)},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := "message/sipfrag"},
subscriptionState := {
fieldName := SUBSCRIPTION_STATE_E,
subState := p_state,
substateParams := omit
},
event := m_Event_refer
},
messageBody := {
sipfrag := p_sipfrag
}
}
template(value) MESSAGE_Request m_MESSAGE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_MESSAGE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
} //* end group request_send
template(value) NOTIFY_Request m_NOTIFY_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_NOTIFY_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "NOTIFY"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "NOTIFY"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template(value) OPTIONS_Request m_OPTIONS_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_OPTIONS_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "OPTIONS"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "OPTIONS"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
group request_receive {
template BYE_Request mw_BYE_Request_Reason(template CallId p_callId, template charstring p_cause) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
reason := mw_Reason(p_cause)
}
}
template(value) PRACK_Request m_PRACK_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) RAck p_RAck
) modifies m_PRACK_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "PRACK"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "PRACK"},
fromField := p_from,
rAck := p_RAck,
toField := p_to,
via := p_via
},
messageBody := omit
}
 
template BYE_Request mw_BYE_Request_ReasonSIP(template CallId p_callId, template charstring p_cause) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
reason := mw_ReasonSIP(p_cause)
}
}
template(value) PUBLISH_Request m_PUBLISH_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Event p_event := omit,
template(omit) RAck p_RAck := omit,
template(value) MessageBody p_mb
) modifies m_PUBLISH_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_plainText), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// c_plainText/*c_sdp*/},
cSeq := m_cSeq(p_cSeq.seqNumber, "PUBLISH"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "PUBLISH"},
event := p_event,
rAck := p_RAck,
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
 
template BYE_Request mw_BYE_Request_headerfieldlist
(
template CallId p_callId,
template SipUrl p_requestUri,
template To p_to,
template From p_from,
template CSeq p_cSeq,
template Route p_route,
template RecordRoute p_recordRoute,
template Reason p_reason
) modifies mw_BYE_Request_Base :=
{ requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
toField := p_to,
fromField := p_from,
cSeq := p_cSeq,
route := p_route,
recordRoute := p_recordRoute,
reason := p_reason
}
}
template BYE_Request mw_BYE_Request_UserToUser(template CallId p_callId) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
userToUser := ?
}
}
template(value) REFER_Request m_REFER_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(omit) Contact p_contact := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) ReferTo p_referTo := omit,
template(omit) ReferredBy p_referredBy := omit
) modifies m_REFER_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contact := p_contact,
cSeq := m_cSeq(p_cSeq.seqNumber, "REFER"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "REFER"},
fromField := p_from,
referTo := p_referTo,
referredBy := p_referredBy,
toField := p_to,
via := p_via
}
}
 
template(value) REFER_Request m_REFER_Request_replaces(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(omit) Contact p_contact := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) ReferTo p_referTo,
template(value) ReferredBy p_referredBy,
template(value) Replaces p_replaces,
template(omit) Require p_require := omit
) modifies m_REFER_Request_Base := {
msgHeader := {
replaces := p_replaces,
require := p_require
}
}
 
template INVITE_Request mw_INVITE_Request_RequestURI (template SipUrl p_sipUrl) modifies mw_INVITE_Dummy :=
{
requestLine :=
{
requestUri := p_sipUrl,
sipVersion := c_sipNameVersion
}
}
template(value) REGISTER_Request m_REGISTER_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(omit) Authorization p_authorization := omit
) modifies m_REGISTER_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
authorization := p_authorization,
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
supported := {
fieldName := SUPPORTED_E,
optionsTags := {"path"}
},
via := p_via
}
}
 
template INFO_Request mw_INFO_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INFO_Request_Base :=
{
messageBody := p_mb
}
template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_SUBSCRIBE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "SUBSCRIBE"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template INVITE_Request mw_INVITE_Request_expires modifies mw_INVITE_Request_Base
:=
{
msgHeader := {expires := ?}
}
template INVITE_Request mw_INVITE_Request_callid(CallId p_callid) modifies mw_INVITE_Request_Base
:=
{
msgHeader := {callId := p_callid}
}
template INVITE_Request mw_INVITE_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INVITE_Request_Base :=
{
msgHeader := {callId := p_callId},
messageBody := p_mb
}
template(value) UPDATE_Request m_UPDATE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(value) MessageBody p_mb
) modifies m_UPDATE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contact := p_contact,
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// c_sdp},
cSeq := m_cSeq(p_cSeq.seqNumber, "UPDATE"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "UPDATE"},
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
 
template INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo (template CallId p_callId)
modifies mw_INVITE_Request_Base
:=
{
msgHeader := { pAccessNetworkInfo := omit}
}
template INVITE_Request mw_INVITE_Request_PaccessNetworkInfo (template CallId p_callId)
modifies mw_INVITE_Request_Base
:=
{
msgHeader := { pAccessNetworkInfo := ?}
}
 
template INVITE_Request mw_INVITE_MSRP_Session(
in template SDP_media_field p_media_MSRP
) modifies mw_INVITE_Request_Base := {
messageBody := {
sdpMessageBody := {
protocol_version := ?,
origin := ?,
session_name := ?,
information := *,
uri := *,
emails := *,
phone_numbers := *,
connection := *,
bandwidth := *,
times := ?,
timezone_adjustments := *,
key := *,
attributes := *,
media_list := {
{
media_field := p_media_MSRP,
information := *,
connections := *,
bandwidth := *,
key := *,
attributes := {
{
msrp := {
attr_value := pattern "path:msrp://*" // FIXME Shall parse msrp and msrps for secured msrp
}
}
} //* end of group message_send
 
group request_receive {
 
template(present) ACK_Request mw_ACK_Request_Base(
template CallId p_callId
) modifies mw_ACK_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) BYE_Request mw_BYE_Request_Base(
template CallId p_callId
) modifies mw_BYE_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) CANCEL_Request mw_CANCEL_Request_Base(
template CallId p_callId
) modifies mw_CANCEL_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) INFO_Request mw_INFO_Request_Base(
template CallId p_callId
) modifies mw_INFO_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy := {requestLine := {method := INVITE_E}}
 
template(present) MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy := {msgHeader := {contact := *}}
 
template(present) NOTIFY_Request mw_NOTIFY_Request_Base(
template CallId p_callId
) modifies mw_NOTIFY_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) OPTIONS_Request mw_OPTIONS_Request_Base(
template CallId p_callId
) modifies mw_OPTIONS_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) PRACK_Request mw_PRACK_Request_Base(
template CallId p_callId
) modifies mw_PRACK_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) PUBLISH_Request mw_PUBLISH_Request_Base(
template CallId p_callId
) modifies mw_PUBLISH_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) REFER_Request mw_REFER_Request_Base(
template CallId p_callId
) modifies mw_REFER_Dummy := {
msgHeader := {callId := p_callId}
}
 
template(present) REFER_Request mw_REFER_Request(
template CallId p_callId,
template(value) SipUrl p_requestUri,
template(value) SipUrl p_referredBy
) modifies mw_REFER_Request_Base := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := mw_NameAddr(*, p_referredBy), // STF471
// {displayName
// :=
// *,
// addrSpec
// :=
// p_referredBy},
referredbyIdParams := *
}
}
}
}
}
}
template UPDATE_Request mw_UPDATE_Request_SDP(template CallId p_callId, template MessageBody p_mb) modifies mw_UPDATE_Dummy :=
{
messageBody := p_mb
}
template NOTIFY_Request mw_NOTIFY_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_NOTIFY_Request_Base :=
{
messageBody := p_mb
}
 
} //* end group request_receive
template(present) INVITE_Request mw_INVITE_Request(
template Require p_require,
template(value) SipUrl p_referredBy
) modifies mw_INVITE_Request_Base := {
msgHeader := {
require := p_require,
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := mw_NameAddr(*, p_referredBy), // STF471
// {displayName
// :=
// *,
// addrSpec
// :=
// p_referredBy},
referredbyIdParams := *
}
}
}
 
group response_send {
template Response m_Response_AlertInfo (
StatusLine p_statusLine,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
Contact p_contact,
template AlertInfo p_alertInfo
) modifies m_Response_Base:= {
msgHeader := {
alertInfo := p_alertInfo,
contact := p_contact
}
}
template Response m_Response_Contact (
StatusLine p_statusLine,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
Contact p_contact
) modifies m_Response_Base:= {
msgHeader := {
contact := p_contact
}
}
template(present) REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy := {requestLine := {method := REGISTER_E}}
 
template Response m_Response_ext (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute) modifies m_Response_Base:=
{
msgHeader :={
route := p_route, //f_route(),
recordRoute := p_recordroute //f_recordroute()
}
}
template Response m_Response_mbody (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template MessageBody p_mb) modifies m_Response_ext:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication}
},
messageBody := p_mb
}
template Response m_Response_mbody_contact (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template MessageBody p_mb, template Contact p_contact) modifies m_Response_mbody:=
{
msgHeader :=
{
contact := p_contact
}
}
template Response m_Response_PAsserted_Privacy (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template PAssertedID p_pAssertedID, template Privacy p_privacy) modifies m_Response_ext:=
{
msgHeader :=
{
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
template Response mw_Response_PAsserted_Privacy_Supported (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template PAssertedID p_pAssertedID, template Privacy p_privacy, template Supported p_supported) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
pAssertedID := p_pAssertedID,
privacy := p_privacy,
supported := p_supported
}
}
template Response m_Response_PAsserted_Privacy_mbody (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template PAssertedID p_pAssertedID, template Privacy p_privacy, MessageBody p_mb) modifies m_Response_ext:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication},
pAssertedID := p_pAssertedID,
privacy := p_privacy
},
messageBody := p_mb
}
template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy := {requestLine := {method := SUBSCRIBE_E}}
 
} //* end group response_send
template(present) UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy := {msgHeader := {callId := p_callId}}
 
 
group response_receive {
} //* end group request_receive
 
template Response mw_Response_Expires (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template DeltaSec p_deltaSec) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
expires := {fieldName := EXPIRES_E, deltaSec := p_deltaSec}
}
}
group response_send {
 
template Response mw_Response_PAsserted_Privacy (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template PAssertedID p_pAssertedID, template Privacy p_privacy) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
template(value) Response m_Response_Base(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_Response_Dummy := {
statusLine := p_statusLine,
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
maxForwards := omit,
toField := p_to,
via := p_via
},
messageBody := omit,
payload := omit
}
 
template Response mw_Response_Reason (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template charstring p_cause) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
reason := mw_Reason(p_cause)
}
}
 
template Response mw_Response_RecordRoute (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template RecordRoute p_recordRoute) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
recordRoute := p_recordRoute
}
}
} //* end group response_send
 
template Response mw_Response_Via (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Via p_via) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
via := p_via
}
}
template Response mw_Response_Contact (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Contact p_contact) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
contact := p_contact
}
}
template Response mw_Response_AlertInfo (
template StatusLine p_statusLine,
template CallId p_callId,
template CSeq p_cSeq,
template AlertInfo p_alertInfo
) modifies mw_Response_Base:= {
statusLine := {
sipVersion := c_sipNameVersion,
statusCode := p_statusLine.statusCode,
reasonPhrase := ?
},
msgHeader :=
{
alertInfo := p_alertInfo
}
}
template Response mw_Response_HistoryInfo (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template HistoryInfo p_historyInfo) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
historyInfo:=p_historyInfo
}
}
template Response mw_Response_messageBody (
template StatusLine p_statusLine,
template CallId p_callId,
template CSeq p_cSeq,
template Require p_require,
template MessageBody p_mb
) modifies mw_Response_Base:= {
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
require := p_require
},
messageBody := p_mb
}
template Response mw_Response_Require (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Require p_require) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
require := p_require
}
}
template Response mw_Response_Require_ifpresent (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Require p_require) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
require := p_require ifpresent
}
}
template Response mw_Response_Supported (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Supported p_supported) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
supported := p_supported
}
}
template Response mw_Response_UserToUser (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
userToUser := ?
}
}
template Response mw_Response_Algorithm (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template CredentialsList p_credentialsList) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
authorization:= {fieldName := AUTHORIZATION_E, body := p_credentialsList }
}
}
} //* end group response_receive
group response_receive {
 
} //* end group modified_templates
template(present) Response mw_Response_Base(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Dummy := {
statusLine := p_statusLine,
msgHeader := {
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
 
} //* end group MessageTemplates
template(present) Response mw_Response_StatusCode_Base(
template(present) StatusLine.statusCode p_statusCode := ?,
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Dummy := {
statusLine := mw_statusLine(p_statusCode, ?),
msgHeader := {
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
 
group SDP_Templates {
group SDP_Messages {
template(present) Response mw_Response_1xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Dummy := {
statusLine := mw_statusLine1xx,
msgHeader := {
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
 
group base_templates {
template SDP_Message m_SDP(SDP_media_desc p_media, in SipUserProfile p_userprofile) := {
protocol_version := 0, //* v=0
origin := {
user_name := "voicesession",
session_id := "30000",
session_version := "0",
net_type := c_in,
addr_type := c_ip4,
addr := p_userprofile.contactIpaddr },
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
session_name := "Voice Session", //* s=Voice Session
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := { addr:= p_userprofile.bearerIpaddr, ttl:=omit, num_of_addr:=omit }
}, //* c=IN IP4 172.27.1.219
bandwidth := omit,
times := { { time_field := { "0", "0" }, time_repeat:=omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := {p_media}
};
template SDP_Message m_SDP_mediaList(SDP_media_desc_list p_media_list, in SipUserProfile p_userprofile)
:= {
protocol_version := 0, //* v=0
origin := {
user_name := "voicesession",
session_id := "30000",
session_version := "0",
net_type := c_in,
addr_type := c_ip4,
addr := p_userprofile.contactIpaddr },
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
session_name := "Voice Session", //* s=Voice Session
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := { addr:= p_userprofile.bearerIpaddr, ttl:=omit, num_of_addr:=omit }
}, //* c=IN IP4 172.27.1.219
bandwidth := omit,
times := { { time_field := { "0", "0" }, time_repeat:=omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := p_media_list
};
template(present) Response mw_Response_2xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine2xx
}
 
template SDP_Message m_SDP_media_attr_preconditions(SDP_media_desc p_media, in SipUserProfile p_userprofile, SDP_attribute_list p_attribute_list)
modifies m_SDP
:= {
media_list := {
{
media_field := {
media := c_audio,
ports := { port_number := 8500, num_of_ports:=omit },
transport := c_rtpAvp,
fmts := { "0" }
}, //* m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := p_attribute_list
}}
}
template SDP_Message m_SDP_attribute(SDP_media_desc p_media, in SipUserProfile p_userprofile, SDP_attribute loc_attribute)
modifies m_SDP
:= {
attributes := {loc_attribute}
};
template(present) Response mw_Response_3xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine3xx
}
 
template SDP_Message mw_SDP := {
protocol_version := 0, //* v=0
origin := ?,
session_name := ?,
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := ?,
bandwidth := omit,
times := { { time_field := { "0", "0" }, time_repeat:=omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := ?
};
}//* end group base_templates
template(present) Response mw_Response_4xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine4xx
}
 
group modified_templates{
template SDP_Message m_SDP_bandwidth(SDP_media_desc p_media, in SipUserProfile p_userprofile)
modifies m_SDP
:= {
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
};
template(present) Response mw_Response_5xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine5xx
}
 
template(present) Response mw_Response_6xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine6xx
}
 
template(present) Response mw_Response_Algorithm(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) CredentialsList p_credentialsList
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {
authorization := {
fieldName := AUTHORIZATION_E,
body := p_credentialsList
}
}
}
 
 
} //* end group message_receive
 
} //* end group full_templates
 
group modified_templates {
 
group request_send {
 
template(value) ACK_Request m_ACK_Request_route(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit
) modifies m_ACK_Request_Base := {
msgHeader := {route := p_route}
}
 
template(value) ACK_Request m_ACK_Request_sdp(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) MessageBody p_mb
) modifies m_ACK_Request_Base := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication)
},
messageBody := p_mb
}
 
template(value) BYE_Request m_BYE_Request_cause(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) integer p_cause
) modifies m_BYE_Request_Base := {
msgHeader := {reason := m_Reason(p_cause)}
}
 
template(value) INVITE_Request m_INVITE_Request_sdp(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact,
template(value) MessageBody p_mb
) modifies m_INVITE_Request_Base := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication)
},
messageBody := p_mb
}
 
template(value) INVITE_Request m_INVITE_Request_ResourceList(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact,
template(value) MessageBody p_mb
) modifies m_INVITE_Request_Base := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(p_mb)},
contentType := m_contentType(c_xmlresourcelistApplication), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// "application/resource-lists+xml"},
contentDisposition := {
fieldName := CONTENT_DISPOSITION_E,
dispositionType := "recipient-list",
dispositionParams := omit
},
require := {
fieldName := REQUIRE_E,
optionsTags := {"recipient-list-invite"}
}
},
messageBody := p_mb
}
 
template(value) REFER_Request m_REFER_Request_route(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(omit) Contact p_contact := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) ReferTo p_referTo,
template(value) ReferredBy p_referredBy,
template(value) Route p_route
) modifies m_REFER_Request_Base := {
msgHeader := {route := p_route}
}
 
template(value) REGISTER_Request m_REGISTER_Request_expires(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(omit) Authorization p_authorization := omit,
template(value) charstring p_expires
) modifies m_REGISTER_Request_Base := {
msgHeader := {
authorization := p_authorization,
expires := m_Expires(p_expires)
}
}
 
template(value) NOTIFY_Request m_NOTIFY_Request_contact(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit
) modifies m_NOTIFY_Request_Base := {
msgHeader := {
contact := p_contact,
event := m_Event_reg,
subscriptionState := m_SubscriptionState_active
}
}
 
template(value) NOTIFY_Request m_NOTIFY_Request_sipfrag(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) charstring p_state,
template(value) charstring p_sipfrag
) modifies m_NOTIFY_Request_Base := {
requestLine := {
method := NOTIFY_E,
requestUri := {
scheme := ?,
components := {
sip := {
userInfo := *,
hostPort := p_requestUri.components.sip.hostPort
}
}
}
},
msgHeader := {
contentLength := m_contentLength(lengthof(p_sipfrag)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// lengthof(p_sipfrag)},
contentType := m_contentType(c_sipfragMessage), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// "message/sipfrag"},
subscriptionState := {
fieldName := SUBSCRIPTION_STATE_E,
subState := p_state,
substateParams := omit
},
event := m_Event_refer
},
messageBody := {sipfrag := p_sipfrag}
}
 
template(value) UPDATE_Request m_UPDATE_Request_route(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(value) MessageBody p_mb,
template(value) Route p_route
) modifies m_UPDATE_Request_Base := {
msgHeader := {route := p_route}
}
 
 
} //* end group request_send
 
 
group request_receive {
 
template(present) BYE_Request mw_BYE_Request_Reason(
template CallId p_callId,
template(value) GenValue p_cause
) modifies mw_BYE_Request_Base := {
msgHeader := {reason := mw_Reason(p_cause)}
}
 
template(present) BYE_Request mw_BYE_Request_ReasonSIP(
template CallId p_callId,
template(value) GenValue p_cause
) modifies mw_BYE_Request_Base := {
msgHeader := {reason := mw_ReasonSIP(p_cause)}
}
 
template(present) BYE_Request mw_BYE_Request_headerfieldlist(
template CallId p_callId,
template(present) SipUrl p_requestUri,
template(present) To p_to := ?,
template(present) From p_from := ?,
template CSeq p_cSeq,
template Route p_route,
template RecordRoute p_recordRoute,
template Reason p_reason
) modifies mw_BYE_Request_Base := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
toField := p_to,
fromField := p_from,
cSeq := p_cSeq,
route := p_route,
recordRoute := p_recordRoute,
reason := p_reason
}
}
 
template(present) BYE_Request mw_BYE_Request_UserToUser(
template CallId p_callId
) modifies mw_BYE_Request_Base := {
msgHeader := {userToUser := ?}
}
 
 
template(present) INVITE_Request mw_INVITE_Request_RequestURI(
template(present) SipUrl p_sipUrl := ?
) modifies mw_INVITE_Dummy := {
requestLine := {
requestUri := p_sipUrl,
sipVersion := c_sipNameVersion
}
}
 
template(present) INFO_Request mw_INFO_Request_MB(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_INFO_Request_Base := {
messageBody := p_mb
}
 
template(present) INVITE_Request mw_INVITE_Request_expires modifies mw_INVITE_Request_Base := {msgHeader := {expires := ?}}
 
template(present) INVITE_Request mw_INVITE_Request_callid(
template CallId p_callId
) modifies mw_INVITE_Request_Base := {
msgHeader := {callId := p_callId}
}
 
template(present) INVITE_Request mw_INVITE_Request_MB(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_INVITE_Request_callid := {
messageBody := p_mb
}
 
template(present) INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo(
template CallId p_callId
) modifies mw_INVITE_Request_callid := {
msgHeader := {pAccessNetworkInfo := omit}
}
 
template(present) INVITE_Request mw_INVITE_Request_PaccessNetworkInfo(
template CallId p_callId
) modifies mw_INVITE_Request_callid := {
msgHeader := {pAccessNetworkInfo := ?}
}
 
template(present) INVITE_Request mw_INVITE_MSRP_Session(
template(present) SDP_media_field p_media_MSRP := ?
) modifies mw_INVITE_Request_Base := {
messageBody := {
sdpMessageBody := {
protocol_version := ?,
origin := ?,
session_name := ?,
information := *,
uri := *,
emails := *,
phone_numbers := *,
connection := *,
bandwidth := *,
times := ?,
timezone_adjustments := *,
key := *,
attributes := *,
media_list := {
{
media_field := p_media_MSRP,
information := *,
connections := *,
bandwidth := *,
key := *,
attributes := {
{
msrp := {
attr_value :=
pattern
"path:msrp://*"
}
}
}
}
}
}
}
}
 
template(present) REGISTER_Request mw_REGISTER_Request_ISC(
template PAccessNetworkInfo p_access,
template PVisitedNetworkID p_visited
) modifies mw_REGISTER_Request_Base := {
msgHeader := {
pAccessNetworkInfo := p_access,
pVisitedNetworkID := p_visited
}
}
 
template(present) UPDATE_Request mw_UPDATE_Request_SDP(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_UPDATE_Request_Base := {
messageBody := p_mb
}
 
template(present) NOTIFY_Request mw_NOTIFY_Request_MB(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_NOTIFY_Request_Base := {
messageBody := p_mb
}
 
} //* end group request_receive
 
group response_send {
 
template(value) Response m_Response_AlertInfo(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact,
template(value) AlertInfo p_alertInfo
) modifies m_Response_Contact := {
msgHeader := {alertInfo := p_alertInfo}
}
 
template(value) Response m_Response_Contact(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit
) modifies m_Response_Base := {
msgHeader := {contact := p_contact}
}
 
template(value) Response m_Response_ext(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit,
template(omit) RecordRoute p_recordroute := omit
) modifies m_Response_Base := {
msgHeader := {
route := p_route, // f_route(),
recordRoute :=
p_recordroute // f_recordroute()
}
}
 
template(value) Response m_Response_mbody(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit,
template(omit) RecordRoute p_recordroute := omit,
template(value) MessageBody p_mb
) modifies m_Response_ext := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication)
},
messageBody := p_mb
}
 
template(value) Response m_Response_mbody_contact (
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit,
template(omit) RecordRoute p_recordroute := omit,
template(value) MessageBody p_mb,
template(value) Contact p_contact
) modifies m_Response_mbody := {
msgHeader := {
contact := p_contact
}
}
 
 
template(value) Response m_Response_PAsserted_Privacy(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Route p_route,
template(value) RecordRoute p_recordroute,
template(value) PAssertedID p_pAssertedID,
template(value) Privacy p_privacy
) modifies m_Response_ext := {
msgHeader := {
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
 
template(present) Response mw_Response_PAsserted_Privacy_Supported(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template PAssertedID p_pAssertedID,
template Privacy p_privacy,
template Supported p_supported
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {
pAssertedID := p_pAssertedID,
privacy := p_privacy,
supported := p_supported
}
}
 
template(value) Response m_Response_PAsserted_Privacy_mbody(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Route p_route,
template(value) RecordRoute p_recordroute,
template(value) PAssertedID p_pAssertedID,
template(value) Privacy p_privacy,
template(value) MessageBody p_mb
) modifies m_Response_ext := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// c_sdpApplication
// },
pAssertedID := p_pAssertedID,
privacy := p_privacy
},
messageBody := p_mb
}
 
} //* end group response_send
 
 
group response_receive {
 
template(present) Response mw_Response_Expires(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) DeltaSec p_deltaSec := ?
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {expires := mw_Expires(p_deltaSec)}
}
 
template(present) Response mw_Response_PAsserted_Privacy(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template PAssertedID p_pAssertedID,
template Privacy p_privacy
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
 
template(present) Response mw_Response_Reason(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(value) GenValue p_cause
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {reason := mw_Reason(p_cause)}
}
 
template(present) Response mw_Response_RecordRoute(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template RecordRoute p_recordRoute
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {recordRoute := p_recordRoute}
}
 
template(present) Response mw_Response_Via(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) Via p_via := ?
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {via := p_via}
}
 
template(present) Response mw_Response_Contact(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Contact p_contact
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {contact := p_contact}
}
 
template(present) Response mw_Response_AlertInfo(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template AlertInfo p_alertInfo
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {alertInfo := p_alertInfo}
}
 
template(present) Response mw_Response_HistoryInfo(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template HistoryInfo p_historyInfo
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {historyInfo := p_historyInfo}
}
 
template(present) Response mw_Response_messageBody(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Require p_require,
template MessageBody p_mb
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {require := p_require},
messageBody := p_mb
}
 
template(present) Response mw_Response_Require(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Require p_require
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {require := p_require}
}
 
template(present) Response mw_Response_Require_ifpresent(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) Require p_require
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {require := p_require ifpresent}
}
 
template(present) Response mw_Response_Supported(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Supported p_supported
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {supported := p_supported}
}
 
template(present) Response mw_Response_UserToUser(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {userToUser := ?}
}
 
} //* end group response_receive
 
} //* end group modified_templates
 
template SDP_Message m_SDP_unacceptable(SDP_media_desc p_media, in SipUserProfile p_userprofile)
modifies m_SDP
:= {
protocol_version := 1, //* v=1 unacceptable version of SDP
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
};
template SDP_Message m_SDP_encrypted(SDP_media_desc p_media, in SipUserProfile p_userprofile)
modifies m_SDP
:= {
protocol_version := 0,
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}},
key := {
method := "base64", //prompt
key := "blablabla"
}
};
}//* end group modified_templates
} //* end group SDP_Messages
group SDP_Fields {
} //* end group MessageTemplates
 
template SDP_media_desc m_media(template SDP_media_field p_mf) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
};
//TODO - delete old
// template SDP_media_desc m_mediaFieldBandwdthAttributes(template SDP_media_field p_mf, template SDP_bandwidth p_bw, template SDP_attribute_list p_attributes) := {
// media_field := p_mf,
// information := omit,
// connections := omit,
// bandwidth := {p_bw},
// key := omit,
// attributes := p_attributes
// };
template SDP_media_desc m_mediaFieldBandwdthAttributes(template SDP_media_field p_mf, template SDP_bandwidth_list p_bw_l, template SDP_attribute_list p_attributes) := {
media_field := p_mf,
group SDP_Templates {
 
group SDP_Messages {
 
group base_templates {
 
template(value) SDP_Message m_SDP_base := {
protocol_version := 0, //* v=0
origin := {
user_name := PX_SIP_SDP_USER_NAME,
session_id := PX_SIP_SDP_SESSION_ID,
session_version := "0",
net_type := c_in,
addr_type := c_ip4,
addr := ""
},
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
session_name := "Voice Session", //* s=Voice Session
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := omit,
bandwidth := omit,
times := {
{
time_field := {"0", "0"},
time_repeat := omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := omit
}
 
template(value) SDP_Message m_SDP(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP_base := {
origin := {
addr := p_userprofile.contactIpaddr
},
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := {
addr := p_userprofile.bearerIpaddr,
ttl := omit,
num_of_addr := omit
}
}, //* c=IN
//* IP4
//* 172.27.1.219
media_list := {p_media}
}
 
template(value) SDP_Message m_SDP_mediaList(
template(value) SDP_media_desc_list p_media_list,
template(value) SipUserProfile p_userprofile
) modifies m_SDP_base := {
origin := {
addr := p_userprofile.contactIpaddr
},
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := {
addr := p_userprofile.bearerIpaddr,
ttl := omit,
num_of_addr := omit
}
}, //* c=IN
//* IP4
//* 172.27.1.219
media_list := p_media_list
}
 
template(value) SDP_Message m_SDP_media_attr_preconditions(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile,
template(value) SDP_attribute_list p_attribute_list
) modifies m_SDP := {
media_list := {
{
media_field := {
media := c_audio,
ports := {
port_number := 8500,
num_of_ports := omit
},
transport := c_rtpAvp,
fmts := {"0"}
}, //* m=audio
//* 8500
//* RTP/AVP
//* 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := p_attribute_list
}
}
}
 
template(value) SDP_Message m_SDP_attribute(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile,
template(value) SDP_attribute p_loc_attribute
) modifies m_SDP := {
attributes := {p_loc_attribute}
}
 
template(present) SDP_Message mw_SDP := {
protocol_version := 0, //* v=0
origin := ?,
session_name := ?,
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := ?,
bandwidth := omit,
times := {
{
time_field := {"0", "0"},
time_repeat := omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := ?
}
 
 
} //* end group base_templates
 
group modified_templates {
template(value) SDP_Message m_SDP_bandwidth(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP := {
bandwidth := {
{
PX_SIP_SDP_B_MODIFIER,
PX_SIP_SDP_B_BANDWIDTH
}
}
}
 
template(value) SDP_Message m_SDP_unacceptable(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP := {
protocol_version := 1, //* v=1 unacceptable version of
//* SDP
bandwidth := {
{
PX_SIP_SDP_B_MODIFIER,
PX_SIP_SDP_B_BANDWIDTH
}
}
}
 
template(value) SDP_Message m_SDP_encrypted(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP := {
bandwidth := {
{
PX_SIP_SDP_B_MODIFIER,
PX_SIP_SDP_B_BANDWIDTH
}
},
key := {
method := "base64", // prompt
key := "blablabla"
}
}
 
} //* end group modified_templates
 
} //* end group SDP_Messages
 
group SDP_Fields {
 
template(value) SDP_media_desc m_media(template(value) SDP_media_field p_mf) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
}
 
template(value) SDP_media_desc m_mediaFieldBandwdthAttributes(
template(value) SDP_media_field p_mf,
template(omit) SDP_bandwidth_list p_bw_l := omit,
template(omit) SDP_attribute_list p_attributes := omit
) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := p_bw_l,
key := omit,
key := omit,
attributes := p_attributes
};
template SDP_media_desc m_media_dynPT(charstring p_PT, charstring p_encod, template SDP_key p_sdpKey:= omit) := {
media_field := {
media := c_audio,//* "audio",
ports := { port_number := 8500, num_of_ports:=omit },
transport := c_rtpAvp,//* "RTP/AVP",
fmts := { p_PT }
}, //* m=audio 8500 RTP/AVP 8
information := omit,
connections := omit,
bandwidth := omit,
key := p_sdpKey,
attributes := { { rtpmap := { attr_value := p_PT & " " & p_encod }
}
} //* a=rtpmap:8 PCMA/8000
};
template SDP_media_desc m_media_unsupported := {
media_field := {
media := "video",
ports := { port_number := 11500, num_of_ports:=omit },
transport := "RTP/AVP",
fmts := { "99" }
}, //* m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := { {
rtpmap := { attr_value := "99 X-Experimental/180000"}
}}
};
}
 
template SDP_bandwidth m_bandwidth(template charstring loc_m, template integer loc_b) := {
modifier:=loc_m,
bandwidth:=loc_b
};
template(value) SDP_media_desc m_media_dynPT(
template(value) charstring p_payloadType,
template(value) charstring p_encoding,
template(value) charstring p_clockrate,
template(omit) charstring p_parameters := omit,
template(omit) SDP_key p_sdpKey := omit
) := {
media_field := {
media := c_audio, //* "audio",
ports := {
port_number := 8500,
num_of_ports := omit
},
transport := c_rtpAvp, //* "RTP/AVP",
fmts := { p_payloadType }
}, //* m=audio 8500 RTP/AVP 8
information := omit,
connections := omit,
bandwidth := omit,
key := p_sdpKey,
attributes := {{rtpmap := {
payload_type := p_payloadType,
codec := {
encoding := p_encoding,
clockrate := p_clockrate,
parameters := p_parameters
}
}
}} //* a=rtpmap:8 PCMA/8000
}
 
template SDP_bandwidth m_bandwidth_as_64:=
{
modifier:="AS",
bandwidth:=64
}
template SDP_bandwidth mw_bandwidth_rs:=
{
modifier:="RS",
bandwidth:=?
}
template SDP_bandwidth mw_bandwidth_rr:=
{
modifier:="RR",
bandwidth:=?
}
/**
* @desc send template with specific media transport and attribute values
* @param p_mediaAttribute parameter for SDP media transport supported by the IUT
* former PX_SIP_SDP_media_transport
* @param p_mediaAttribute parameter for SDP media attribute supported by the IUT,
* former PX_SIP_SDP_media_attribute_Exp & PX_SIP_SDP_media_transport_Exp
* @param p_mediaType parameter for SDP media type supported by the IUT,
* former PX_SIP_SDP_MEDIA_VIDEO
*/
template(value) SDP_media_desc m_media_unsupported(
template(value) charstring p_mediaTransport,
template(value) SDP_attribute_rtpmap p_mediaAttribute,
template(value) charstring p_mediaType := "video"
) := {
media_field := {
media := p_mediaType,
ports := {
port_number := 11500,
num_of_ports := omit
},
transport := p_mediaTransport,
fmts := {"99"}
}, //* m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := {{rtpmap := p_mediaAttribute}}
}
 
template SDP_media_field m_media_field(charstring p_media, integer p_portNum, charstring p_transport, charstring p_fmts) :=
{
media := p_media,
ports := { port_number := p_portNum, num_of_ports:=omit },
transport := p_transport,
fmts := { p_fmts }
}
template(value) SDP_bandwidth m_bandwidth(
template(value) charstring p_loc_m,
template(value) integer p_loc_b
) := {
modifier := p_loc_m,
bandwidth := p_loc_b
}
 
template SDP_media_field mw_media_PCMU :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { "0" }
}
template(value) SDP_bandwidth m_bandwidth_as_64 := {
modifier := "AS",
bandwidth := 64
}
 
template SDP_media_field mw_media_PCMA :=
{
media := c_audio,
ports := { port_number := 8500, num_of_ports:=omit },
transport := c_rtpAvp,
fmts := { "8" }
}
template SDP_media_field mw_media_PCMA_U_DPT :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { * }
}
template SDP_media_field mw_media_T38 :=
{
media := c_image,
ports := { port_number := ?, num_of_ports:=* },
transport := pattern "*ptl", //* udptl,tcptl
fmts := { "t38" }
}
template(present) SDP_bandwidth mw_bandwidth_rs := {
modifier := "RS",
bandwidth := ?
}
 
template SDP_media_field mw_media_G722 :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := "RTP/AVP",
fmts := { "9" }
}
template(present) SDP_bandwidth mw_bandwidth_rr := {
modifier := "RR",
bandwidth := ?
}
 
template SDP_media_field mw_media_AMR_DPT :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { * }
}
template SDP_media_field mw_media_MSRP :=
{
media := c_msrp,
ports := { port_number := ?, num_of_ports:=omit },
transport := c_msrpTcp,
fmts := { * }
}
template(value) SDP_media_field m_media_field(
template(value) charstring p_media,
template(value) integer p_portNum,
template(value) charstring p_transport,
template(value) charstring p_fmts
) := {
media := p_media,
ports := {
port_number := p_portNum,
num_of_ports := omit
},
transport := p_transport,
fmts := {p_fmts}
}
 
template SDP_attribute m_attribute_sendonly := {sendonly:={}};
template SDP_attribute mw_attribute_sendonly := {sendonly:={}};//MRO
template SDP_attribute m_attribute_recvonly := {recvonly:={}};
template SDP_attribute mw_attribute_recvonly := {recvonly:={}};//MRO
template SDP_attribute m_attribute_sendrecv := {sendrecv:={}};
template SDP_attribute mw_attribute_sendrecv := {sendrecv:={}};//MRO
template SDP_attribute m_attribute_inactive := {inactive:={}};
template SDP_attribute mw_attribute_inactive := {inactive:={}};//MRO
template SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly,mw_attribute_inactive);
template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv,mw_attribute_recvonly,omit);
template SDP_attribute m_attribute_AMR_DPT := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " AMR" }};
template SDP_attribute m_attribute_CLEARMODE_DPT := {rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " CLEARMODE/8000" }};
template SDP_attribute m_attribute_G722 := { rtpmap := { attr_value := "9 G722/8000" }};
template SDP_attribute m_attribute_PCMU := { rtpmap := { attr_value := "0 PCMU/8000" }};
template SDP_attribute m_attribute_PCMU_DPT := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " PCMU/8000" }};
template SDP_attribute m_attribute_PCMA := { rtpmap := { attr_value := "8 PCMA/8000" }};
template SDP_attribute m_attribute_PCMA_DPT := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " PCMA/8000" }};
template SDP_attribute m_attribute_T38 := { unknown := { name:=?, attr_value := pattern "*t38*" }};
template SDP_attribute m_attribute_curr (charstring p_preconditionType, charstring p_statusType, charstring p_direction):=
{
curr:={preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction}
};
template SDP_attribute mw_attribute_curr :=
{
curr := ?
};
template SDP_attribute m_attribute_des (charstring p_preconditionType, charstring p_strength, charstring p_statusType, charstring p_direction):=
{
des:={preconditionType := p_preconditionType,
strength := p_strength,
statusType := p_statusType,
direction := p_direction}
};
template SDP_attribute mw_attribute_des :=
{
des := ?
};
template SDP_attribute m_attribute_conf (charstring p_preconditionType, charstring p_statusType, charstring p_direction):=
{
conf:={preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction}
};
} //* end group SDP_Fields
template(present) SDP_media_field mw_media_PCMU := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := c_rtpAvp,
fmts := {"0"}
}
 
} //* end group SDP_Templates
template(present) SDP_media_field mw_media_PCMA := {
media := c_audio,
ports := {
port_number := 8500,
num_of_ports := omit
},
transport := c_rtpAvp,
fmts := {"8"}
}
 
group SimpleMsgSummary_Templates {
template SimpleMsgSummary m_SMS(template Msg_summary_line_list p_summaryLineList, template charstring p_uri) :=
{
msg_status_line := m_msgStatusLine_yes,
msg_account := m_msgAccount(p_uri),
msg_summary_line_list :=p_summaryLineList,
opt_msg_headers := omit
}
template SimpleMsgSummary mw_SMS :=
{
msg_status_line := ?,
msg_account := *,
msg_summary_line_list := *,
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yes :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := *,
msg_summary_line_list := *,
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yesUri :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := mw_msgAccount,
msg_summary_line_list := *,
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yesVoice :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := *,
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)},
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yesUriVoice :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := mw_msgAccount,
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)},
opt_msg_headers := *
}
template Msg_status_line m_msgStatusLine_yes:=
{
msg_type := c_messageWaiting,
msg_status := "yes"
}
template Msg_status_line mw_msgStatusLine_yes:=
{
msg_type := c_messageWaiting,
msg_status := "yes"
}
template(present) SDP_media_field mw_media_PCMA_U_DPT := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := c_rtpAvp,
fmts := {*}
}
 
template Msg_account m_msgAccount(template charstring p_uri) :=
{
msg_type_account := c_messageAccount,
account_URI := p_uri//m_SipUrl_NumberHostParam(PX_IMS_SUT_UE2_PUBLIC_USER,PX_IMS_SUT_UE2_HOME_DOMAIN,omit)
}
template(present) SDP_media_field mw_media_T38 := {
media := c_image,
ports := {
port_number := ?,
num_of_ports := *
},
transport := pattern "*ptl", //* udptl,tcptl
fmts := {"t38"}
}
 
template Msg_account mw_msgAccount :=
{
msg_type_account := c_messageAccount,
account_URI := ?
}
template(present) SDP_media_field mw_media_G722 := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := "RTP/AVP",
fmts := {"9"}
}
 
template(present) SDP_media_field mw_media_AMR_DPT := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := c_rtpAvp,
fmts := {*}
}
 
template(present) SDP_media_field mw_media_MSRP := {
media := c_msrp,
ports := {
port_number := ?,
num_of_ports := omit
},
transport := c_msrpTcp,
fmts := {*}
}
 
template(value) SDP_attribute m_attribute_sendonly := {sendonly := {}}
template(present) SDP_attribute mw_attribute_sendonly := {sendonly := {}}
// MRO
template(value) SDP_attribute m_attribute_recvonly := {recvonly := {}}
template(present) SDP_attribute mw_attribute_recvonly := {recvonly := {}}
// MRO
template(value) SDP_attribute m_attribute_sendrecv := {sendrecv := {}}
template(present) SDP_attribute mw_attribute_sendrecv := {sendrecv := {}}
// MRO
template(value) SDP_attribute m_attribute_inactive := {inactive := {}}
template(present) SDP_attribute mw_attribute_inactive := {inactive := {}}
// MRO
template(present) SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly, mw_attribute_inactive);
template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv, mw_attribute_recvonly, omit);
template(value) SDP_attribute m_attribute_base(
template(value) SDP_attribute_rtpmap p_attr_value
) := {
rtpmap := p_attr_value
}
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_AMR
*/
template(value) SDP_attribute m_attribute_AMR_DPT(//"0 AMR"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"AMR", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_CLE
*/
template(value) SDP_attribute m_attribute_CLEARMODE_DPT(//"0 CLEARMODE/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"CLEARMODE", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_G222
*/
template(value) SDP_attribute m_attribute_G722(//"9 G722/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"9", {"G722", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMU
*/
template(value) SDP_attribute m_attribute_PCMU(//"0 PCMU/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMU
*/
template(value) SDP_attribute m_attribute_PCMU_DPT(//"0 PCMU/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMA
*/
template(value) SDP_attribute m_attribute_PCMA(//"8 PCMA/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"8", {"PCMA", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMA
*/
template(value) SDP_attribute m_attribute_PCMA_DPT(//"0 PCMA/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMA", "8000", omit}}
) := m_attribute_base(p_attr_value);
 
template(present) SDP_attribute mw_attribute_T38 := {
unknown := {
name := ?,
attr_value := pattern "*t38*"
}
}
 
template(value) SDP_attribute m_attribute_curr(
template(value) charstring p_preconditionType,
template(value) charstring p_statusType,
template(value) charstring p_direction
) := {
curr := {
preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction
}
}
 
template(present) SDP_attribute mw_attribute_curr := {curr := ?}
 
template(value) SDP_attribute m_attribute_des(
template(value) charstring p_preconditionType,
template(value) charstring p_strength,
template(value) charstring p_statusType,
template(value) charstring p_direction
) := {
des := {
preconditionType := p_preconditionType,
strength := p_strength,
statusType := p_statusType,
direction := p_direction
}
}
 
template(present) SDP_attribute mw_attribute_des := {des := ?}
 
template(value) SDP_attribute m_attribute_conf(
template(value) charstring p_preconditionType,
template(value) charstring p_statusType,
template(value) charstring p_direction
) := {
conf := {
preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction
}
}
 
} //* end group SDP_Fields
 
template Msg_summary_line m_msgSummaryLine(template charstring p_msgContexClass,template charstring p_msgs,template charstring p_urgent_msgs) :=
{
msg_context_class := p_msgContexClass,
msgs := p_msgs,
urgent_msgs := p_urgent_msgs
}
template Msg_summary_line mw_msgSummaryLine(template charstring p_msgContexClass) :=
{
msg_context_class := p_msgContexClass,
msgs := ?,
urgent_msgs :=*
}
} //end group Templates_SMS
} //* end group SDP_Templates
 
group MessageBodies {
template MessageBody m_MBody_SDP(template SDP_Message p_SDP):=
{
sdpMessageBody := p_SDP
};
template MessageBody m_MBody_XML(template XmlBody p_xmlBody):=
{
xmlBody := p_xmlBody
};
template MessageBody m_mBody_SMS(template SimpleMsgSummary p_SMS):=
{
simpleMsgSummary := p_SMS
};
template MessageBody m_MBody_longPlainText:=
{
textplain := c_longMessageContent_1300Bytes
};
group SimpleMsgSummary_Templates {
 
template MessageBody m_mBody_plainText(charstring p_plaitext):=
{
textplain := p_plaitext
};
template MessageBody m_MBody_sipfrag(charstring p_sipfrag) := {
sipfrag := p_sipfrag
}
template MessageBody m_MBody_MIMESdpXml(template SDP_Message p_sdp, template XmlBody p_xmlBody):=
{
mimeMessageBody := {boundary:="--boundary1", //"PX_SIP_MIME_Boundary",
mimeEncapsulatedList:= {
{content_type:="application/sdp",//"PX_SIP_SDP_ContentType",
content_disposition:=omit,
mime_encapsulated_part:={sdpMessageBody := p_sdp}},
{content_type:="application/vnd.3gpp.cw+xml",//"PX_SIP_ISUP_ContentType",
content_disposition:=omit,
mime_encapsulated_part:={xmlBody := p_xmlBody}}
}
}
}
template(value) SimpleMsgSummary m_SMS(
template(value) Msg_summary_line_list p_summaryLineList,
template(value) charstring p_uri
) := {
msg_status_line := m_msgStatusLine_yes,
msg_account := m_msgAccount(p_uri),
msg_summary_line_list := p_summaryLineList,
opt_msg_headers := omit
}
 
template MessageBody m_MBody_MIMESdpEncrypted(template SDP_Message p_sdp):=
{
mimeMessageBody := {boundary:="--boundary1", //"PX_SIP_MIME_Boundary",
mimeEncapsulatedList:= {
{content_type:="application/sdp",//"PX_SIP_SDP_ContentType",
//TODO add "Content-Transfer-Encoding:base64"
content_disposition:="attachment;handling=required;filename=smime.p7", //TODO use PIXIT
mime_encapsulated_part:={sdpMessageBody := p_sdp}}
template(present) SimpleMsgSummary mw_SMS := {
msg_status_line := ?,
msg_account := *,
msg_summary_line_list := *,
opt_msg_headers := *
}
 
template(present) SimpleMsgSummary mw_SMS_yes modifies mw_SMS := {
msg_status_line := mw_msgStatusLine_yes
}
 
template(present) SimpleMsgSummary mw_SMS_yesUri modifies mw_SMS_yes := {
msg_account := mw_msgAccount
}
 
template(present) SimpleMsgSummary mw_SMS_yesVoice modifies mw_SMS_yes := {
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)}
}
 
template(present) SimpleMsgSummary mw_SMS_yesUriVoice modifies mw_SMS_yesUri := {
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)}
}
 
template(value) Msg_status_line m_msgStatusLine_yes := {
msg_type := c_messageWaiting,
msg_status := "yes"
}
 
template(present) Msg_status_line mw_msgStatusLine_yes := {
msg_type := c_messageWaiting,
msg_status := "yes"
}
 
template(value) Msg_account m_msgAccount(
template(value) charstring p_uri
) := {
msg_type_account := c_messageAccount,
account_URI :=
p_uri // m_SipUrl_NumberHostParam(PX_IMS_SUT_UE2_PUBLIC_USER,PX_IMS_SUT_UE2_HOME_DOMAIN,omit)
}
 
template(present) Msg_account mw_msgAccount := {
msg_type_account := c_messageAccount,
account_URI := ?
}
 
template(value) Msg_summary_line m_msgSummaryLine(
template(value) charstring p_msgContexClass,
template(value) charstring p_msgs,
template(value) charstring p_urgent_msgs
) := {
msg_context_class := p_msgContexClass,
msgs := p_msgs,
urgent_msgs := p_urgent_msgs
}
 
template(present) Msg_summary_line mw_msgSummaryLine(
template(present) charstring p_msgContexClass := ?
) := {
msg_context_class := p_msgContexClass,
msgs := ?,
urgent_msgs := *
}
 
 
} // end group Templates_SMS
 
group MessageBodies {
 
template(value) MessageBody m_MBody_SDP(
template(value) SDP_Message p_SDP
) := {
sdpMessageBody := p_SDP
}
 
template(value) MessageBody m_MBody_XML(
template(value) XmlBody p_xmlBody
) := {
xmlBody := p_xmlBody
}
 
template(value) MessageBody m_mBody_SMS(
template(value) SimpleMsgSummary p_SMS
) := {
simpleMsgSummary := p_SMS
}
 
template(value) MessageBody m_MBody_longPlainText := {textplain := c_longMessageContent_1300Bytes}
 
template(value) MessageBody m_mBody_plainText(
template(value) charstring p_plaitext
) := {
textplain := p_plaitext
}
 
template(value) MessageBody m_MBody_sipfrag(
template(value) charstring p_sipfrag
) := {
sipfrag := p_sipfrag
}
 
template(value) MessageBody m_MBody_MIMESdpXml(
template(value) SDP_Message p_sdp,
template(value) XmlBody p_xmlBody
) := {
mimeMessageBody := {
boundary := "--" & PX_SIP_MIME_BOUNDARY,
mimeEncapsulatedList := {
{
content_type := c_sdpApplication,
content_disposition := omit,
mime_encapsulated_part := {sdpMessageBody := p_sdp}
},
{
content_type := c_ims3gppCwApplication,
content_disposition := omit,
mime_encapsulated_part := {xmlBody := p_xmlBody}
}
}
}
}
 
template(value) MessageBody m_MBody_MIMESdpEncrypted(
template(value) SDP_Message p_sdp
) := {
mimeMessageBody := {
boundary := "--" & PX_SIP_MIME_BOUNDARY,
mimeEncapsulatedList := {
{
content_type := "application/sdp",
content_disposition := "attachment;handling=required;filename=smime.p7",
mime_encapsulated_part := {sdpMessageBody := p_sdp}
}
}
}
}
 
template(present) MessageBody mw_MBody_SDP(
template(present) SDP_Message p_SDP := ?
) := {
sdpMessageBody := p_SDP
}
 
template(present) MessageBody mw_MBody_XML(
template(present) XmlBody p_xmlBody := ?
) := {
xmlBody := p_xmlBody
}
 
template(present) MessageBody mw_mBody_SMS(
template(present) SimpleMsgSummary p_SMS := ?
) := {
simpleMsgSummary := p_SMS
}
 
template(present) MessageBody mw_MBody_MIMESdpXml(
template(present) SDP_Message p_sdp := ?,
template(present) XmlBody p_xmlBody := ?
) := {
mimeMessageBody := {
boundary := ?,
mimeEncapsulatedList := {
{
content_type := ?,
content_disposition := *,
mime_encapsulated_part := {sdpMessageBody := p_sdp}
},
{
content_type := ?,
content_disposition := *,
mime_encapsulated_part := {xmlBody := p_xmlBody}
}
}
}
}
 
template(present) MessageBody mw_MBody_MIME_Ims3gpp(
template charstring p_disposition,
template(present) Ims_3gpp p_ims3gpp := ?
) := {
mimeMessageBody := {
boundary := ?,
mimeEncapsulatedList := {
*,
{
content_type := c_ims3gppApplication,
content_disposition := p_disposition,
mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}}
},
*
}
}
}
 
template(present) MessageBody mw_MBody_MIME_Ims3gppCW(
template charstring p_disposition,
template(present) Ims_3gpp p_ims3gpp := ?
) := {
mimeMessageBody := {
boundary := ?,
mimeEncapsulatedList := {
*,
{
content_type := c_ims3gppCwApplication,
content_disposition := p_disposition,
mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}}
},
*
}
}
}
 
}
template MessageBody mw_MBody_SDP(template SDP_Message p_SDP):=
{
sdpMessageBody := p_SDP
};
template MessageBody mw_MBody_XML(template XmlBody p_xmlBody):=
{
xmlBody := p_xmlBody
};
template MessageBody mw_mBody_SMS(template SimpleMsgSummary p_SMS):=
{
simpleMsgSummary := p_SMS
};
template MessageBody mw_MBody_MIMESdpXml(template SDP_Message p_sdp, template XmlBody p_xmlBody):=
{
mimeMessageBody := {boundary:=?,
mimeEncapsulatedList:= {
{content_type:=?,
content_disposition:=*,
mime_encapsulated_part:={sdpMessageBody := p_sdp}},
{content_type:=?,
content_disposition:=*,
mime_encapsulated_part:={xmlBody := p_xmlBody}}
}
}
}
template MessageBody mw_MBody_MIME_Ims3gpp(
template charstring p_disposition,
template Ims_3gpp p_ims3gpp
):= {
mimeMessageBody := {boundary:=?,
mimeEncapsulatedList:= {
*,
{
content_type:= c_ims3gppAplication,
content_disposition:= p_disposition,
mime_encapsulated_part :={
xmlBody := {
ims3gpp := p_ims3gpp
}
}
},
*
}
}
}
template MessageBody mw_MBody_MIME_Ims3gppCW(
template charstring p_disposition,
template Ims_3gpp p_ims3gpp
):= {
mimeMessageBody := {boundary:=?,
mimeEncapsulatedList:= {
*,
{
content_type:= c_ims3gppCwApplication,
content_disposition:= p_disposition,
mime_encapsulated_part :={
xmlBody := {
ims3gpp := p_ims3gpp
}
}
},
*
}
}
}
}
/*
*
* @desc group TemplatePreparationFunctions contain functions which are used for templates
*/
group TemplatePreparationFunctions {
/*
*
* @desc group TemplatePreparationFunctions contain functions which are used for templates
*/
group TemplatePreparationFunctions {
 
group MessageBody_Calculation{
/**
*
* @desc Calculation of Message Body length
* @param p_mb_par contain message body part
* @return message body length
*/
function f_MessageBodyLength(MessageBody p_mb_par) return integer {
group MessageBody_Calculation {
 
var integer v_result:=0;
if (MB_LENGTH_FROM_ENCVAL){ //by default it is set to true
v_result:= lengthof(encvalue(p_mb_par))/8; // length in bypes, let get length of encoded value
}
else{
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb_par.sdpMessageBody))
{
v_result := f_SDPlength(p_mb_par.sdpMessageBody);
};
// assume XML_Body ONLY in the message body
if (ischosen(p_mb_par.xmlBody))
{
v_result := f_XMLBody_Length(p_mb_par.xmlBody, USE_FX_FOR_XML_LENGTH );
};
// assume simpleMsgSummary_Body ONLY in the message body
if (ischosen(p_mb_par.simpleMsgSummary))
{
v_result := f_simpleMsgSummaryBody_Length(p_mb_par.simpleMsgSummary );
};
// assume MIME_Message in the message body
if (ischosen(p_mb_par.mimeMessageBody))
{
v_result := f_MIMElength(p_mb_par.mimeMessageBody);
};
//assume sipfrag in the message body
if (ischosen(p_mb_par.sipfrag))
{
v_result := f_TextPlainLength(p_mb_par); //same function due to same type with textplain
};
//assume textplain in the message body
if (ischosen(p_mb_par.textplain))
{
v_result := f_TextPlainLength(p_mb_par);
};
}
/**
* @desc Calculation of Message Body length
* @param p_mb_par contain message body part
* @return message body length
*/
function f_MessageBodyLength(
template(value) MessageBody p_mb_par
) return integer {
 
return v_result
}
group SDP_Len_calculation {
/**
*
* @desc Calculation of SDP length
* @param p_mb contain sdp message
* @return sdp_lenght
*/
function f_SDPlength(SDP_Message p_mb) return integer
{
var integer v_result:=2; //* due to empty line beginning of message body
var charstring v_auxstring;
v_result := 2 + c_CRlen + lengthof(int2str(p_mb.protocol_version)); //* "v="
v_auxstring := p_mb.origin.user_name & " " & p_mb.origin.session_id & " " & p_mb.origin.session_version & " " & p_mb.origin.net_type & " " & p_mb.origin.addr_type & " " & p_mb.origin.addr;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "o="
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.session_name); //* "s="
if (ispresent(p_mb.information))
{v_auxstring:=p_mb.information; v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);}; //* "i= "
if (ispresent(p_mb.uri))
{v_auxstring:=p_mb.uri; v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);}; //* "u="
if (ispresent(p_mb.emails)) {
for (var integer i:=0; i<sizeof(p_mb.emails); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //* "e="
if (ispresent(p_mb.emails[i].disp_name))
{v_auxstring:=p_mb.emails[i].disp_name; v_result := v_result + 1 + lengthof(v_auxstring);};
};
};
if (ispresent(p_mb.phone_numbers)) {
for (var integer i:=0; i<sizeof(p_mb.phone_numbers); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //* "p= "
if (ispresent(p_mb.phone_numbers[i].disp_name))
{v_auxstring:=p_mb.phone_numbers[i].disp_name; v_result := v_result + 1 + lengthof(v_auxstring);};
};
};
if (ispresent(p_mb.connection))
{
var integer v_len_con0 := f_SDPlength_connection(p_mb.connection);
v_result := v_result + v_len_con0;
}; //* "c="
if (ispresent(p_mb.bandwidth))
{
for (var integer i:=0; i<sizeof(p_mb.bandwidth); i:=i+1) { //* "b= "
v_auxstring:= p_mb.bandwidth[i].modifier & " ";
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring) +
lengthof(int2str(p_mb.bandwidth[i].bandwidth));
};
};
for (var integer i:=0; i<sizeof(p_mb.times); i:=i+1) {
v_auxstring:= p_mb.times[i].time_field.start_time & " " & p_mb.times[i].time_field.stop_time;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);//* "t="
if (ispresent(p_mb.times[i].time_repeat))
{
for (var integer j:=0; j<sizeof(p_mb.times[i].time_repeat); j:=j+1)
{
v_result := v_result + 2 + c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //* "r="
if (ispresent(p_mb.times[i].time_repeat[j].repeat_interval.unit))
{
v_auxstring:=p_mb.times[i].time_repeat[j].repeat_interval.unit;
v_result := v_result + 1 + lengthof(v_auxstring);
};
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time));
if (ispresent(p_mb.times[i].time_repeat[j].active.unit))
{
v_auxstring:=p_mb.times[i].time_repeat[j].active.unit;
v_result := v_result + 1 + lengthof(v_auxstring);
};
for (var integer k:=0; k<sizeof(p_mb.times[i].time_repeat[j].offsets); k:=k+1)
{
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time));
if (ispresent(p_mb.times[i].time_repeat[j].offsets[k].unit))
{
v_auxstring:=p_mb.times[i].time_repeat[j].offsets[k].unit;
v_result := v_result + 1 + lengthof(v_auxstring);
};
}
}
};
};
var integer v_result := 0;
if (PX_MB_LENGTH_FROM_ENCVAL) {
// by default it is set to true
// in case the codec encodes the variant selector, this
// needs to be changed to ischosen...
v_result := lengthof(encvalue(p_mb_par)) / 8; // length
// in
// bytes,
// let get
// length
// of
// encoded
// value
}
else {
 
if (ispresent(p_mb.timezone_adjustments))
{log("timezone adjustments have not been considered in SDP length calculation yet");
}; //* "z="
if (ispresent(p_mb.key)) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.key.method); //* "k= "
if (ispresent(p_mb.key.key))
{v_auxstring:=p_mb.key.key; v_result := v_result + 1 + lengthof(v_auxstring);};
};
if (ispresent(p_mb.attributes)) {
for (var integer i:=0; i<sizeof(p_mb.attributes); i:=i+1){ //* "a= "
var integer v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]);
v_result := v_result + v_len_con1;
};
}; //* "a="
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb_par.sdpMessageBody)) {
v_result := f_SDPlength(valueof(p_mb_par.sdpMessageBody));
}
 
if (ispresent(p_mb.media_list))
{
for (var integer i:=0; i<sizeof(p_mb.media_list); i:=i+1){ //* "m= "
//* for each media_field
//* log("p_mb.media_list[i] ",p_mb.media_list[i]);
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].media_field.media)
+ 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number));
// assume XML_Body ONLY in the message body
if (ischosen(p_mb_par.xmlBody)) {
v_result := f_XMLBody_Length(valueof(p_mb_par.xmlBody), PX_USE_FX_FOR_XML_LENGTH);
}
 
// assume simpleMsgSummary_Body ONLY in the message body
if (ischosen(p_mb_par.simpleMsgSummary)) {
v_result := f_simpleMsgSummaryBody_Length(valueof(p_mb_par.simpleMsgSummary));
}
 
if (ispresent(p_mb.media_list[i].media_field.ports.num_of_ports))
{v_result := v_result + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.num_of_ports));};
v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport);
for (var integer j:=0; j<sizeof(p_mb.media_list[i].media_field.fmts); j:=j+1){
v_result := v_result + 1 + lengthof(valueof(p_mb.media_list[i].media_field.fmts[j]));
}
if (ispresent(p_mb.media_list[i].information)) {
v_auxstring:=p_mb.media_list[i].information;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "i= "
};
if (ispresent(p_mb.media_list[i].connections)) {
for (var integer j:=0; j<sizeof(p_mb.media_list[i].connections); j:=j+1){
var integer v_len_con2 := f_SDPlength_connection(p_mb.media_list[i].connections[j]);
v_result := v_result + v_len_con2;
}; //* end for
};
if (ispresent(p_mb.media_list[i].bandwidth)) { //* "b= "
for (var integer j:=0; j<sizeof(p_mb.media_list[i].bandwidth); j:=j+1){
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].bandwidth[j].modifier)
+ 1 + lengthof(int2str(p_mb.media_list[i].bandwidth[j].bandwidth));
}; //* end for
};
if (ispresent(p_mb.media_list[i].key)) { //* "k= "
v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method);
if (ispresent(p_mb.media_list[i].key.key)) {
v_auxstring := p_mb.media_list[i].key.key;
v_result := v_result + 1 + lengthof(v_auxstring);
};
};
if (ispresent(p_mb.media_list[i].attributes)) {
for (var integer j:=0; j<sizeof(p_mb.media_list[i].attributes); j:=j+1){ //* "a= "
var integer v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]);
v_result := v_result + v_len_attr;
} //* end for j
};
}; //* end for i
}; //* end if media_list
// assume MIME_Message in the message body
if (ischosen(p_mb_par.mimeMessageBody)) {
v_result := f_MIMElength(valueof(p_mb_par.mimeMessageBody));
}
 
return v_result;
};//* end function f_SDPlength
// assume sipfrag in the message body
if (ischosen(p_mb_par.sipfrag)) {
v_result := f_TextPlainLength(p_mb_par); // same
// function
// due to
// same
// type
// with
// textplain
}
 
function f_SDPlength_connection(SDP_connection p_element) return integer //* "c="
{
var integer v_result:=0;
var charstring v_auxstring;
v_result := v_result + 2 + c_CRlen + lengthof(p_element.net_type & " " &
p_element.addr_type & " " &
p_element.conn_addr.addr);
if (ispresent(p_element.conn_addr.ttl) and p_element.conn_addr.ttl>0)
{v_result := v_result + 1 + lengthof(int2str(p_element.conn_addr.ttl));};
if (ispresent(p_element.conn_addr.num_of_addr) and p_element.conn_addr.num_of_addr>0)
{v_result := v_result + 1 + lengthof(int2str(p_element.conn_addr.num_of_addr));};
return v_result
} //* f_SDPlength_connection
// assume textplain in the message body
if (ischosen(p_mb_par.textplain)) {
v_result := f_TextPlainLength(p_mb_par);
}
}
 
function f_SDPlength_attribute(SDP_attribute p_element) return integer //* "a="
{
var integer v_result:=0;
var charstring v_auxstring;
if (ischosen(p_element.cat)) {v_result := v_result + 2 + c_CRlen + lengthof("cat:" & p_element.cat.attr_value)};
if (ischosen(p_element.keywds)) {v_result := v_result + 2 + c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value)};
if (ischosen(p_element.tool)) {v_result := v_result + 2 + c_CRlen + lengthof("tool:" & p_element.tool.attr_value)};
if (ischosen(p_element.ptime)) {v_result := v_result + 2 + c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value)};
if (ischosen(p_element.recvonly)) {v_result := v_result +c_CRlen + lengthof("recvonly")};
if (ischosen(p_element.sendrecv)) {v_result := v_result +c_CRlen + lengthof("sendrecv")};
if (ischosen(p_element.sendonly)) {v_result := v_result +c_CRlen + lengthof("sendonly")};
if (ischosen(p_element.inactive)) {v_result := v_result +c_CRlen + lengthof("inactive")};
if (ischosen(p_element.orient)) {v_result := v_result + 2 + c_CRlen + lengthof("orient:" & p_element.orient.attr_value)};
if (ischosen(p_element.sdp_type)) {v_result := v_result + 2 + c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value)};
if (ischosen(p_element.charset)) {v_result := v_result + 2 + c_CRlen + lengthof("charset" & p_element.charset.attr_value)};
if (ischosen(p_element.sdplang)) {v_result := v_result + 2 + c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value)};
if (ischosen(p_element.lang)) {v_result := v_result + 2 + c_CRlen + lengthof("lang:" & p_element.lang.attr_value)};
if (ischosen(p_element.framerate)) {v_result := v_result + 2 + c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value)};
if (ischosen(p_element.quality)) {v_result := v_result + 2 + c_CRlen + lengthof("quality:" & p_element.quality.attr_value)};
if (ischosen(p_element.fmtp)) {v_result := v_result + 2 + c_CRlen + lengthof("fmtp:" & p_element.fmtp.attr_value)};
if (ischosen(p_element.curr)) {v_result := v_result + 2 + c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " "
& p_element.curr.statusType & " " & p_element.curr.direction)};
if (ischosen(p_element.des)) {v_result := v_result + 2 + c_CRlen + lengthof("des:" & p_element.des.preconditionType & " "
& p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction)};
if (ischosen(p_element.conf)) {v_result := v_result + 2 + c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " "
& p_element.des.statusType & " " & p_element.des.direction)};
if (ischosen(p_element.rtpmap)) {v_result := v_result + 2 + c_CRlen + lengthof("rtpmap:" & p_element.rtpmap.attr_value)};
if (ischosen(p_element.rtcp)) {v_result := v_result + 2 + c_CRlen + lengthof("rtcp:" & p_element.rtcp.attr_value)};
if (ischosen(p_element.unknown))
{v_result := v_result + 2 + c_CRlen + lengthof(p_element.unknown.name);
if (ispresent(p_element.unknown.attr_value))
{var charstring aux := p_element.unknown.attr_value;
v_result := v_result + lengthof(":" & p_element.unknown.attr_value);
};
};
//* log("axr: length attribute=", v_result);
return v_result
} //* f_SDPlength_attribute
} //* group SDPlen_calculation
return v_result;
}
 
group XML_Len_calculation{
/**
* @desc Declaration of external functions to calculate length of message bodies
* switching of internal or external functions are made by boolean module parameter/PIXIT
* USE_FX_FOR_XML_LENGTH declared at top of this module
*/
 
external function fx_calculateXMLBodyLen(XmlBody p_mb) return integer;
/**
*
* @desc Calculation of XML body length
* @param p_mb contain XML body
* @return xml_length
*/
function f_XMLBody_Length(XmlBody p_mb, boolean p_ext_func) return integer
{
var integer v_result:=0;
if ( p_ext_func){
v_result := fx_calculateXMLBodyLen(p_mb);
}else{
// assume ConferenceInfo ONLY in the XML message body
if (ischosen(p_mb.conference))
{
v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conference);
};
// assume CUG ONLY in the XML message body
if (ischosen(p_mb.cug))
{
v_result := f_XMLBody_Cug_Length(p_mb.cug);
};
// assume MCID ONLY in the XML message body
if (ischosen(p_mb.mcid))
{
v_result := f_XMLBody_Mcid_Length(p_mb.mcid);
};
// assume CW ONLY in the XML message body
if (ischosen(p_mb.cw))
{
v_result := f_XMLBody_Cw_Length(p_mb.cw);
};
// assume CDIV ONLY in the XML message body
if (ischosen(p_mb.cdivn))
{
v_result := f_XMLBody_Cdivn_Length(p_mb.cdivn);
};
// assume PSTNTransit ONLY in the XML message body
if (ischosen(p_mb.pstnTransit))
{
v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit);
};
// assume Simservs ONLY in the XML message body
if (ischosen(p_mb.simservs))
{
v_result := f_XMLBody_Simservs_Length(p_mb.simservs);
};
// assume ResourceLists ONLY in the XML message body
if (ischosen(p_mb.resourceLists))
{
v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists);
};
// assume Ims3GPP ONLY in the XML message body
if (ischosen(p_mb.ims3gpp))
{
v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp);
};
/** Add aditional checks regarding to new variants,
* also implement appropriate function for calculation
*/
}
return v_result
} //* f_XMLBodyLength
group XMLBodies_calculation{
/**
*
* @desc Calculation of XML ConferenceInfo element length
* @param p_mb contain XML ConfInfo body
* @return xml_length
*/
function f_XMLBody_ConferenceInfo_Length(Conference_type p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_ConferenceInfo_Length
/**
*
* @desc Calculation of XML CUG element length
* @param p_mb contain XML CUG body
* @return xml_length
*/
function f_XMLBody_Cug_Length(Cug p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Cug_Length
/**
*
* @desc Calculation of XML MCID element length
* @param p_mb contain XML MCID body
* @return xml_length
*/
function f_XMLBody_Mcid_Length(Mcid p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Mcid_Length
/**
*
* @desc Calculation of XML CW element length
* @param p_mb contain XML CW body
* @return xml_length
*/
function f_XMLBody_Cw_Length(Ims_cw p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Cw_Length
/**
*
* @desc Calculation of XML CDIVN element length
* @param p_mb contain XML CDIVN body
* @return xml_length
*/
function f_XMLBody_Cdivn_Length(Comm_div_info_type p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Cdivn_Length
/**
*
* @desc Calculation of XML PSTNTransit element length
* @param p_mb contain XML PSTNTransit body
* @return xml_length
*/
function f_XMLBody_PSTNTransit_Length(PSTN_transit p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_PSTNTransit_Length
/** @desc Calculation of XML Simservs element length
* @param p_mb contain XML Simservs body
* @return xml_length
*/
function f_XMLBody_Simservs_Length(Simservs p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Simservs_Length
/** @desc Calculation of XML ResourceList length
* @param p_mb contain XML ResourceList body
* @return xml_length
*/
function f_XMLBody_ResourceList_Length(Resource_lists p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_ResourceList_Length
/** @desc Calculation of XML Ims3GPP length
* @param p_mb contain XML Ims3GPP body
* @return xml_length
*/
function f_XMLBody_Ims3GPP_Length(TIMS3GPP p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Ims3GPP_Length
} //* XMLBodies_calculation
}//* group XMLlen_calculation
group simpleMsgSummaryBody_Length{
function f_simpleMsgSummaryBody_Length(SimpleMsgSummary p_mb) return integer
{
var integer v_result:=2; //* due to empty line beginning of message body
var charstring v_auxstring;
v_result := 2+lengthof(p_mb.msg_status_line.msg_type) + 2 + lengthof(p_mb.msg_status_line.msg_status)+c_CRlen; //* "Message-Waiting: yes"
group SDP_Len_calculation {
/**
* @desc Calculation of SDP length
* @param p_mb contain sdp message
* @return sdp_lenght
*/
function f_SDPlength(
SDP_Message p_mb
) return integer {
var integer i, j, k, v_len_con0, v_len_con1, v_len_con2, v_len_attr;
var integer v_result := 2;
//* due to empty line beginning of message body
var charstring v_auxstring;
 
if (ispresent(p_mb.msg_account)) //* "Message-Account"
{v_result := v_result + 2 + lengthof(p_mb.msg_account.msg_type_account)+2+lengthof(p_mb.msg_account.account_URI)+c_CRlen;};
if (ispresent(p_mb.msg_summary_line_list)) {
for (var integer i:=0; i<sizeof(p_mb.msg_summary_line_list); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.msg_summary_line_list[i].msg_context_class)+2+lengthof(p_mb.msg_summary_line_list[i].msgs);
if (ispresent(p_mb.msg_summary_line_list[i].urgent_msgs))
{v_auxstring:=p_mb.msg_summary_line_list[i].urgent_msgs; v_result := v_result + 1 + lengthof(v_auxstring);};
};
};
if (ispresent(p_mb.opt_msg_headers)) {
for (var integer i:=0; i<sizeof(p_mb.opt_msg_headers); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.opt_msg_headers[i]);
};
};
return v_result
}
}
v_result := 2 + c_CRlen + lengthof(int2str(p_mb.protocol_version)); //* "v="
v_auxstring := p_mb.origin.user_name & " " & p_mb.origin.session_id & " " & p_mb.origin.session_version & " " & p_mb.origin.net_type & " " & p_mb.origin.addr_type & " " & p_mb.origin.addr;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "o="
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.session_name); //* "s="
if (isvalue(p_mb.information)) {
v_auxstring := valueof(p_mb.information);
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);
} //* "i= "
if (isvalue(p_mb.uri)) {
v_auxstring := valueof(p_mb.uri);
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);
} //* "u="
if (isvalue(p_mb.emails)) {
for (i := 0; i < lengthof(p_mb.emails); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //* "e="
if (isvalue(p_mb.emails[i].disp_name)) {
v_auxstring := valueof(p_mb.emails[i].disp_name);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
 
group MIME_Len_calculation{
/**
*
* @desc Calculation of MIME length
* @param p_mb contain MIME message
* @return xml_length
*/
function f_MIMElength(MIME_Message p_mb) return integer
{
var integer v_result:=2; //0d0a
v_result := v_result + lengthof(p_mb.boundary) + 2/*0d0a*/;
for (var integer i:=0; i<sizeof(p_mb.mimeEncapsulatedList); i:=i+1){
v_result := v_result + lengthof("Content-Type: ")+ lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2/*0d0a*/ ;
if (ispresent(p_mb.mimeEncapsulatedList[i].content_disposition)){
v_result := v_result + lengthof("Content-Disposition: ")+ lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2/*0d0a*/ ;
}
//v_result := v_result +2/*0d0a*/; ??? to check
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody))
{
v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody);
};
// assume XML_Body ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody))
{
v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, USE_FX_FOR_XML_LENGTH );
};
// //assume XML_Message ONLY in the message body
// if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlMessage))
// {
// v_result := v_result + f_XMLlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlMessage, USE_FX_FOR_XML_LENGTH );
// };
//v_result := v_result +2/*0d0a*/; ??? to check
}
//v_result := v_result +2/*0d0a*/; ??? to check
return v_result
} //* f_MIMElength
}//* group MIMElen_calculation
group TextPlain_Len_calculation{
/**
*
* @desc Calculation of messagebody-textplain type length
* @param p_mb contain textplain message
* @return lenght
*/
function f_TextPlainLength(MessageBody p_mb) return integer
{
var integer v_result:=0;
if (isvalue(p_mb.phone_numbers)) {
for (i := 0; i < lengthof(p_mb.phone_numbers); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //* "p=
//* "
if (isvalue(p_mb.phone_numbers[i].disp_name)) {
v_auxstring := valueof(p_mb.phone_numbers[i].disp_name);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
 
v_result:=v_result+lengthof(p_mb.textplain);
return v_result;
}//* end function f_TextPlainLength
}//*end group TextPlainLen_calculation
if (isvalue(p_mb.connection)) {
v_len_con0 := f_SDPlength_connection(valueof(p_mb.connection));
v_result := v_result + v_len_con0;
} //* "c="
if (isvalue(p_mb.bandwidth)) {
for (i := 0; i < lengthof(p_mb.bandwidth); i := i + 1) {
//* "b= "
v_auxstring := p_mb.bandwidth[i].modifier & " ";
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring) + lengthof(int2str(p_mb.bandwidth[i].bandwidth));
}
}
 
}//*group MessageBody_Calculation
for (i := 0; i < lengthof(p_mb.times); i := i + 1) {
v_auxstring := p_mb.times[i].time_field.start_time & " " & p_mb.times[i].time_field.stop_time;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "t="
if (isvalue(p_mb.times[i].time_repeat)) {
for (j := 0; j < lengthof(p_mb.times[i].time_repeat); j := j + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //* "r="
if (isvalue(p_mb.times[i].time_repeat[j].repeat_interval.unit)) {
v_auxstring := valueof(p_mb.times[i].time_repeat[j].repeat_interval.unit);
v_result := v_result + 1 + lengthof(v_auxstring);
}
 
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time));
if (isvalue(p_mb.times[i].time_repeat[j].active.unit)) {
v_auxstring := valueof(p_mb.times[i].time_repeat[j].active.unit);
v_result := v_result + 1 + lengthof(v_auxstring);
}
 
group GiveHeaders {
/**
*
* @desc Return component variable of recordRoute header if vc_boo_recordRoute is true
* @return component variable of recordRoute header
*/
for (k := 0; k < lengthof(p_mb.times[i].time_repeat[j].offsets); k := k + 1) {
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time));
if (isvalue(p_mb.times[i].time_repeat[j].offsets[k].unit)) {
v_auxstring := valueof(p_mb.times[i].time_repeat[j].offsets[k].unit);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
}
}
 
function f_recordroute() runs on SipComponent return template RecordRoute
{
template RecordRoute v_recordRoute := omit;
if (vc_boo_recordRoute)
{return vc_recordRoute}
else {return(v_recordRoute)} //* TODO: RecordRoute is not OPTIONAL!!! Check IT!
}
/**
*
* @desc Return component variable of Route header if vc_boo_route is true
* @return component variable of recordRoute header
*/
function f_route() runs on SipComponent return template Route
{
template Route v_route := omit;
if (vc_boo_route)
{return vc_route} //* TODO: Route header need to be in reverse order than RecordRoute, question of return value - RecordRoute
else {return(v_route)} //* TODO: Route is not OPTIONAL!!! Check IT!
}
} //* end group GiveHeaders
group others {
if (isvalue(p_mb.timezone_adjustments)) {
log("*** " & __SCOPE__ & ": INFO: timezone adjustments have not been considered in SDP length calculation yet ***");
} //* "z="
if (isvalue(p_mb.key)) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.key.method); //* "k=
//* "
if (isvalue(p_mb.key.key)) {
v_auxstring := valueof(p_mb.key.key);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
if (isvalue(p_mb.attributes)) {
for (i := 0; i < lengthof(p_mb.attributes); i := i + 1) {
 
/*
*
* @desc function combines two comma parameter lists
* @param p_list1 first list
* @param p_list2 second list
* @return comma parameter list that contains parameters from both input lists
* @verdict
*/
 
function f_merge_CommaParam_List(CommaParam_List p_list1, CommaParam_List p_list2) return template CommaParam_List
{ var template CommaParam_List p_result;
var integer limit1 := sizeof(p_list1);
for (var integer i:=0; i<limit1; i:=i+1) {
p_result[i] := p_list1[i]
};
for (var integer i:=0; i<sizeof(p_list2); i:=i+1) {
p_result[i+limit1] := p_list2[i]
};
return p_result
}
} //* end group others
//* "a= "
v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]);
v_result := v_result + v_len_con1;
}
} //* "a="
if (isvalue(p_mb.media_list)) {
for (i := 0; i < lengthof(p_mb.media_list); i := i + 1) {
//* "m= "
//* for each media_field
//* log("p_mb.media_list[i ] ",p_mb.media_list[i
//* ] );
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].media_field.media) + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number));
 
} //* group TemplatePreparationFunctions
} //* end module LibSip_Templates
 
if (isvalue(p_mb.media_list[i].media_field.ports.num_of_ports)) {
v_result := v_result + 1 + lengthof(int2str(valueof(p_mb.media_list[i].media_field.ports.num_of_ports)));
}
v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport);
for (j := 0; j < lengthof(p_mb.media_list[i].media_field.fmts); j := j + 1) {
v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.fmts[j]);
}
 
if (isvalue(p_mb.media_list[i].information)) {
v_auxstring := valueof(p_mb.media_list[i].information);
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "i= "
}
if (isvalue(p_mb.media_list[i].connections)) {
for (j := 0; j < lengthof(p_mb.media_list[i].connections); j := j + 1) {
v_len_con2 := f_SDPlength_connection(p_mb.media_list[i].connections[j]);
v_result := v_result + v_len_con2;
} //* end for
}
if (isvalue(p_mb.media_list[i].bandwidth)) {
//* "b= "
for (j := 0; j < lengthof(p_mb.media_list[i].bandwidth); j := j + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].bandwidth[j].modifier) + 1 + lengthof(int2str(p_mb.media_list[i].bandwidth[j].bandwidth));
} //* end for
}
if (isvalue(p_mb.media_list[i].key)) {
//* "k= "
v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method);
if (isvalue(p_mb.media_list[i].key.key)) {
v_auxstring := valueof(p_mb.media_list[i].key.key);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
if (isvalue(p_mb.media_list[i].attributes)) {
for (j := 0; j < lengthof(p_mb.media_list[i].attributes); j := j + 1) {
 
//* "a= "
v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]);
v_result := v_result + v_len_attr;
} //* end for j
}
} //* end for i
} //* end if media_list
return v_result;
}
//* end function f_SDPlength
function f_SDPlength_connection(
SDP_connection p_element
) return integer {
//* "c="
var integer v_result := 0;
v_result := v_result + 2 + c_CRlen + lengthof(p_element.net_type & " " & p_element.addr_type & " " & p_element.conn_addr.addr);
if (isvalue(p_element.conn_addr.ttl) and p_element.conn_addr.ttl > 0) {
v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.ttl)));
}
if (isvalue(p_element.conn_addr.num_of_addr) and p_element.conn_addr.num_of_addr > 0) {
v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.num_of_addr)));
}
return v_result;
} //* f_SDPlength_connection
 
function f_SDPlength_attribute(
SDP_attribute p_element
) return integer {
//* "a="
var integer v_result := 0;
if (ischosen(p_element.cat)) {
v_result := v_result + 2 + c_CRlen + lengthof("cat:" & p_element.cat.attr_value);
}
if (ischosen(p_element.keywds)) {
v_result := v_result + 2 + c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value);
}
if (ischosen(p_element.tool)) {
v_result := v_result + 2 + c_CRlen + lengthof("tool:" & p_element.tool.attr_value);
}
if (ischosen(p_element.ptime)) {
v_result := v_result + 2 + c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value);
}
if (ischosen(p_element.recvonly)) {
v_result := v_result + c_CRlen + lengthof("recvonly");
}
if (ischosen(p_element.sendrecv)) {
v_result := v_result + c_CRlen + lengthof("sendrecv");
}
if (ischosen(p_element.sendonly)) {
v_result := v_result + c_CRlen + lengthof("sendonly");
}
if (ischosen(p_element.inactive)) {
v_result := v_result + c_CRlen + lengthof("inactive");
}
if (ischosen(p_element.orient)) {
v_result := v_result + 2 + c_CRlen + lengthof("orient:" & p_element.orient.attr_value);
}
if (ischosen(p_element.sdp_type)) {
v_result := v_result + 2 + c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value);
}
if (ischosen(p_element.charset)) {
v_result := v_result + 2 + c_CRlen + lengthof("charset" & p_element.charset.attr_value);
}
if (ischosen(p_element.sdplang)) {
v_result := v_result + 2 + c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value);
}
if (ischosen(p_element.lang)) {
v_result := v_result + 2 + c_CRlen + lengthof("lang:" & p_element.lang.attr_value);
}
if (ischosen(p_element.framerate)) {
v_result := v_result + 2 + c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value);
}
if (ischosen(p_element.quality)) {
v_result := v_result + 2 + c_CRlen + lengthof("quality:" & p_element.quality.attr_value);
}
if (ischosen(p_element.fmtp)) {
v_result := v_result + 2 + c_CRlen + lengthof("fmtp:" & p_element.fmtp.format & " " & f_fmtpparams_to_charstring(p_element.fmtp.params));
}
if (ischosen(p_element.curr)) {
v_result := v_result + 2 + c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " " & p_element.curr.statusType & " " & p_element.curr.direction);
}
if (ischosen(p_element.des)) {
v_result := v_result + 2 + c_CRlen + lengthof("des:" & p_element.des.preconditionType & " " & p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction);
}
if (ischosen(p_element.conf)) {
v_result := v_result + 2 + c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " " & p_element.conf.statusType & " " & p_element.conf.direction);
}
if (ischosen(p_element.rtpmap)) {
v_result := v_result + 2 + c_CRlen + lengthof("rtpmap:" & f_rtpmap_to_charstring(p_element.rtpmap));
}
if (ischosen(p_element.rtcp)) {
v_result := v_result + 2 + c_CRlen + lengthof("rtcp:" & f_rtcp_to_charstring(p_element.rtcp));
}
if (ischosen(p_element.unknown)) {
v_result := v_result + 2 + c_CRlen + lengthof(p_element.unknown.name);
if (isvalue(p_element.unknown.attr_value)) {
v_result := v_result + lengthof(":" & p_element.unknown.attr_value);
}
}
//* log("axr: length attribute=", v_result);
return v_result;
} //* f_SDPlength_attribute
 
function f_fmtpparams_to_charstring(
SDP_attribute_fmtp_format_specific_params p_params
) return charstring {
var charstring v_result := "";
if(ischosen(p_params.unstructured)){
v_result := p_params.unstructured;
}
else
{
for(var integer v_idx := 0; v_idx < lengthof(p_params.paramList); v_idx := v_idx + 1) {
if(v_idx != 0)
{
v_result := v_result & "; "
}
v_result := v_result & p_params.paramList[v_idx].id;
if(ispresent(p_params.paramList[v_idx].paramValue)){
if(ischosen(p_params.paramList[v_idx].paramValue.tokenOrHost))
{
v_result := v_result & "=" & p_params.paramList[v_idx].paramValue.tokenOrHost;
}
else
{
v_result := v_result & "=""" & p_params.paramList[v_idx].paramValue.quotedString & """";
}
}
}
}
return v_result;
}
 
function f_rtpmap_to_charstring(
SDP_attribute_rtpmap p_rtpmap
) return charstring {
var charstring v_result := "";
v_result := p_rtpmap.payload_type & " " & p_rtpmap.codec.encoding & "/" & p_rtpmap.codec.clockrate;
if(ispresent(p_rtpmap.codec.parameters))
{
v_result := v_result & "/" & p_rtpmap.codec.parameters;
}
return v_result;
}
 
function f_rtcp_to_charstring(
SDP_attribute_rtcp p_rtcp
) return charstring {
var charstring v_result := int2str(p_rtcp.portnumber);
if(ispresent(p_rtcp.connection))
{
v_result := v_result & " " & p_rtcp.connection.net_type & " " & p_rtcp.connection.addr_type & " " & p_rtcp.connection.conn_addr.addr;
if(ispresent(p_rtcp.connection.conn_addr.ttl))
{
v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.ttl);
if(ispresent(p_rtcp.connection.conn_addr.num_of_addr))
{
v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.num_of_addr);
}
}
}
return v_result;
}
 
} //* group SDPlen_calculation
 
group XML_Len_calculation {
 
/**
* @desc Declaration of external functions to calculate length of message bodies switching of internal or external functions are made by boolean module parameter/PIXIT USE_FX_FOR_XML_LENGTH declared at top of this module
*/
external function fx_calculateXMLBodyLen(
XmlBody p_mb
) return integer;
 
/**
* @desc Calculation of XML body length
* @param p_mb contain XML body
* @return xml_length
*/
function f_XMLBody_Length(
XmlBody p_mb,
boolean p_ext_func
) return integer {
var integer v_result := 0;
 
if (p_ext_func) {
v_result := fx_calculateXMLBodyLen(p_mb);
}
else {
// assume ConferenceInfo ONLY in the XML message
// body
if (ischosen(p_mb.conference)) {
v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conference);
}
 
// assume CUG ONLY in the XML message body
if (ischosen(p_mb.cug)) {
v_result := f_XMLBody_Cug_Length(p_mb.cug);
}
 
// assume MCID ONLY in the XML message body
if (ischosen(p_mb.mcid)) {
v_result := f_XMLBody_Mcid_Length(p_mb.mcid);
}
 
// assume CW ONLY in the XML message body
if (ischosen(p_mb.cw)) {
v_result := f_XMLBody_Cw_Length(p_mb.cw);
}
 
// assume CDIV ONLY in the XML message body
if (ischosen(p_mb.cdivn)) {
v_result := f_XMLBody_Cdivn_Length(p_mb.cdivn);
}
 
// assume PSTNTransit ONLY in the XML message body
if (ischosen(p_mb.pstnTransit)) {
v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit);
}
 
// assume Simservs ONLY in the XML message body
if (ischosen(p_mb.simservs)) {
v_result := f_XMLBody_Simservs_Length(p_mb.simservs);
}
 
// assume ResourceLists ONLY in the XML message body
if (ischosen(p_mb.resourceLists)) {
v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists);
}
 
// assume Ims3GPP ONLY in the XML message body
if (ischosen(p_mb.ims3gpp)) {
v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp);
}
/**
* Add aditional checks regarding to new variants, also implement appropriate function for calculation
*/
}
return v_result;
} //* f_XMLBodyLength
 
group XMLBodies_calculation {
 
/**
* @desc Calculation of XML ConferenceInfo element length
* @param p_mb contain XML ConfInfo body
* @return xml_length
*/
function f_XMLBody_ConferenceInfo_Length(
template(value) Conference_type p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_ConferenceInfo_Length
 
/**
* @desc Calculation of XML CUG element length
* @param p_mb contain XML CUG body
* @return xml_length
*/
function f_XMLBody_Cug_Length(
template(value) Cug p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Cug_Length
 
/**
* @desc Calculation of XML MCID element length
* @param p_mb contain XML MCID body
* @return xml_length
*/
function f_XMLBody_Mcid_Length(
template(value) Mcid p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
 
return v_result;
} //* f_XMLBody_Mcid_Length
 
/**
* @desc Calculation of XML CW element length
* @param p_mb contain XML CW body
* @return xml_length
*/
function f_XMLBody_Cw_Length(
template(value) Ims_cw p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
 
return v_result;
} //* f_XMLBody_Cw_Length
 
/**
* @desc Calculation of XML CDIVN element length
* @param p_mb contain XML CDIVN body
* @return xml_length
*/
function f_XMLBody_Cdivn_Length(
template(value) Comm_div_info_type p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
 
return v_result;
} //* f_XMLBody_Cdivn_Length
 
/**
* @desc Calculation of XML PSTNTransit element length
* @param p_mb contain XML PSTNTransit body
* @return xml_length
*/
function f_XMLBody_PSTNTransit_Length(
template(value) PSTN_transit p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_PSTNTransit_Length
 
/**
* @desc Calculation of XML Simservs element length
* @param p_mb contain XML Simservs body
* @return xml_length
*/
function f_XMLBody_Simservs_Length(
template(value) Simservs p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Simservs_Length
 
/**
* @desc Calculation of XML ResourceList length
* @param p_mb contain XML ResourceList body
* @return xml_length
*/
function f_XMLBody_ResourceList_Length(
template(value) Resource_lists p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_ResourceList_Length
 
/**
* @desc Calculation of XML Ims3GPP length
* @param p_mb contain XML Ims3GPP body
* @return xml_length
*/
function f_XMLBody_Ims3GPP_Length(
template(value) TIMS3GPP p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Ims3GPP_Length
 
 
} //* XMLBodies_calculation
 
 
} //* group XMLlen_calculation
 
group simpleMsgSummaryBody_Length {
 
function f_simpleMsgSummaryBody_Length(
SimpleMsgSummary p_mb
) return integer {
var integer i;
var integer v_result := 2;
 
 
//* due to empty line beginning of message body
var charstring v_auxstring;
 
v_result := 2 + lengthof(p_mb.msg_status_line.msg_type) + 2 + lengthof(p_mb.msg_status_line.msg_status) + c_CRlen; //* "Message-Waiting:
//* yes"
if (isvalue(p_mb.msg_account))
//* "Message-Account"
{
v_result := v_result + 2 + lengthof(p_mb.msg_account.msg_type_account) + 2 + lengthof(p_mb.msg_account.account_URI) + c_CRlen;
}
if (isvalue(p_mb.msg_summary_line_list)) {
for (i := 0; i < lengthof(p_mb.msg_summary_line_list); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.msg_summary_line_list[i].msg_context_class) + 2 + lengthof(p_mb.msg_summary_line_list[i].msgs);
if (isvalue(p_mb.msg_summary_line_list[i].urgent_msgs)) {
v_auxstring := valueof(p_mb.msg_summary_line_list[i].urgent_msgs);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
if (isvalue(p_mb.opt_msg_headers)) {
for (i := 0; i < lengthof(p_mb.opt_msg_headers); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.opt_msg_headers[i]);
}
}
return v_result;
}
}
 
group MIME_Len_calculation {
/**
* @desc Calculation of MIME length
* @param p_mb contain MIME message
* @return xml_length
*/
function f_MIMElength(
MIME_Message p_mb
) return integer {
var integer i;
var integer v_result := 2;
// 0d0a
v_result := v_result + lengthof(p_mb.boundary) + 2 /*0d0a*/;
 
for (i := 0; i < lengthof(p_mb.mimeEncapsulatedList); i := i + 1) {
 
v_result := v_result + lengthof("Content-Type: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2 /*0d0a*/;
 
if (isvalue(p_mb.mimeEncapsulatedList[i].content_disposition)) {
v_result := v_result + lengthof("Content-Disposition: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2 /*0d0a*/;
}
 
// v_result := v_result +2/*0d0a*/; ??? to check
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody)) {
v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody);
}
 
// assume XML_Body ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody)) {
v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, PX_USE_FX_FOR_XML_LENGTH);
}
// //assume XML_Message ONLY in the message body
// if (ischosen(p_mb.mimeEncapsulatedList[i ]
// .mime_encapsulated_part.xmlMessage))
// {
// v_result := v_result +
// f_XMLlength(p_mb.mimeEncapsulatedList[i ]
// .mime_encapsulated_part.xmlMessage,
// USE_FX_FOR_XML_LENGTH );
// };
// v_result := v_result +2/*0d0a*/; ??? to check
}
 
// v_result := v_result +2/*0d0a*/; ??? to check
return v_result;
} //* f_MIMElength
 
 
} //* group MIMElen_calculation
 
group TextPlain_Len_calculation {
/**
* @desc Calculation of messagebody-textplain type length
* @param p_mb contain textplain message
* @return lenght
*/
function f_TextPlainLength(
template(value) MessageBody p_mb
) return integer {
var integer v_result := 0;
 
v_result := v_result + lengthof(p_mb.textplain);
 
return v_result;
} //* end function f_TextPlainLength
 
} //* end group TextPlainLen_calculation
 
} //* group MessageBody_Calculation
 
 
group GiveHeaders {
/**
* @desc Return component variable of recordRoute header if vc_boo_recordRoute is true
* @return component variable of recordRoute header
*/
function f_recordroute(
) runs on SipComponent
return template(omit) RecordRoute {
var template(omit) RecordRoute v_recordRoute := omit;
if (vc_boo_recordRoute) {
return vc_recordRoute;
}
else {
return (v_recordRoute);
}
}
 
/**
* @desc Return component variable of Route header if vc_boo_route is true
* @return component variable of recordRoute header
*/
function f_route(
) runs on SipComponent
return template(omit) Route {
var template(omit) Route v_route := omit;
if (vc_boo_route) {
return vc_route;
}
else {
return (v_route);
}
}
 
} //* end group GiveHeaders
 
group others {
 
/*
*
* @desc function combines two comma parameter lists
* @param p_list1 first list
* @param p_list2 second list
* @return comma parameter list that contains parameters from both input lists
* @verdict
*/
function f_merge_CommaParam_List(
template(value) CommaParam_List p_list1,
template(value) CommaParam_List p_list2
) return template(value) CommaParam_List {
var template(value) CommaParam_List p_result;
var integer i, v_limit1 := lengthof(p_list1);
for (i := 0; i < v_limit1; i := i + 1) {
p_result[i] := p_list1[i];
}
for (i := 0; i < lengthof(p_list2); i := i + 1) {
p_result[i + v_limit1] := p_list2[i];
}
return p_result;
}
 
} //* end group others
 
} //* group TemplatePreparationFunctions
} //* end module LibSip_Templates
/trunk/ttcn/LibSip_XMLTypes.ttcn
1,124 → 1,112
/**
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module provides the XML type system for SIP tests.
* The types have been generated automatically, followed by manual modifications:
* - bitType substituted by OneBitType
* - twobitType substituted by TwoBitType
* - addition of pattern for: OneBitType, TwoBitType, ThreeBitType, FourBitType, FourBitType, SixBitType
* - application of enumerated for: State_type, Endpoint_status_type, Joining_type, Disconnection_type, Media_status_type,
* Originating_identity_presentation_restriction, Terminating_identity_presentation_restriction
* - addition of length value: NetworkIdentityType, SixteenbitType
* - addition of value restriction: CugIndexType
* - substitution of "content" by "choice": Call_type, Mcid
* - additional type renaming (upper first letter): AbsService, Anonymous, Busy,
* Communication_diverted, Conference_description_type, Conference_info,
* Conference_media_type, Conference_medium_type, Conference_state_type,
* Conference_type, Cug, CugRequestType, Empty_element_type, Endpoint_type,
* Execution_type, Host_type, Keywords_type, Media, Media_type, No_answer,
* Not_reachable, Not_registered, Originating_identity_presentation, Presence_status,
* Presence_status_activity_type, RequestType, ResponseType, Roaming,
* Rule_deactivated, Sidebars_by_val_type, Simservs, SimservType,
* Terminating_identity_presentation, Uri_type, Uris_type, User_roles_type,
* User_languages_type, User_type, Users_type
*
* - new group CDIV added by STF369
* - new group ACR_CD added by STF38
* - new types RegInfo and Pidf_Lo added by STF160
*
* This module is part of LibSipV2.
* @author STF 346, STF366, STF368, STF369, STF471
* @version $Id$
* @desc
* This module provides the XML type system for SIP tests. The types have been generated automatically, followed by manual modifications: - bitType substituted by OneBitType - twobitType substituted by TwoBitType - addition of pattern for: OneBitType, TwoBitType, ThreeBitType, FourBitType, FourBitType, SixBitType - application of enumerated for: State_type, Endpoint_status_type, Joining_type, Disconnection_type, Media_status_type, Originating_identity_presentation_restriction, Terminating_identity_presentation_restriction - addition of length value: NetworkIdentityType, SixteenbitType - addition of value restriction: CugIndexType - substitution of "content" by "choice": Call_type, Mcid - additional type renaming (upper first letter): AbsService, Anonymous, Busy, Communication_diverted,
* Conference_description_type, Conference_info, Conference_media_type, Conference_medium_type, Conference_state_type, Conference_type, Cug, CugRequestType, Empty_element_type, Endpoint_type, Execution_type, Host_type, Keywords_type, Media, Media_type, No_answer, Not_reachable, Not_registered, Originating_identity_presentation, Presence_status, Presence_status_activity_type, RequestType, ResponseType, Roaming, Rule_deactivated, Sidebars_by_val_type, Simservs, SimservType, Terminating_identity_presentation, Uri_type, Uris_type, User_roles_type, User_languages_type, User_type, Users_type - new group CDIV added by STF369 - new group ACR_CD added by STF38 - new types RegInfo and Pidf_Lo added by STF160.
* This module is part of LibSipV3.
*/
module LibSip_XMLTypes {
 
import from http_www_w3_org_XML_1998_namespace language "XSD" all
with {
extension "File:../xsd/xml.xsd"
extension "File:../xsd/xml.xsd";
}
 
import from urn_ietf_params_xml_ns_common_policy language "XSD" all
with {
extension "File:../xsd/common-policy.xsd"
extension "File:../xsd/common-policy.xsd";
}
 
import from urn_ietf_params_xml_ns_resource_lists language "XSD" all
with {
extension "File:../xsd/ResourceList.xsd"
extension "File:../xsd/ResourceList.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all
with {
extension "File:../xsd/SupplementaryServices.xsd"
extension "File:../xsd/SupplementaryServices.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all
with {
extension "File:../xsd/MCID.xsd"
extension "File:../xsd/MCID.xsd";
}
 
import from NoTargetNamespace language "XSD" all
with {
extension "File:../xsd/Ims3gpp.xsd"
extension "File:../xsd/Ims3gpp.xsd";
}
 
import from urn_3gpp_ns_cw_1_0 language "XSD" all
with {
extension "File:../xsd/cw.xsd"
with {
extension "File:../xsd/cw.xsd";
}
 
import from urn_ietf_params_xml_ns_conference_info language "XSD" all
with {
extension "File:../xsd/CONF.xsd"
extension "File:../xsd/CONF.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all
with {
extension "File:../xsd/PSTN.xsd"
extension "File:../xsd/PSTN.xsd";
}
 
import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all
with {
extension "File:../xsd/CDIVN.xsd"
extension "File:../xsd/CDIVN.xsd";
}
 
import from urn_oma_xml_xdm_common_policy language "XSD" all
with {
extension "File:../xsd/xdm_commonPolicy-v1_0.xsd"
extension "File:../xsd/xdm_commonPolicy-v1_0.xsd";
}
// RFC 3680 Registration Info
import from urn_ietf_params_xml_ns_reginfo language "XSD" all
with {
extension "File:../xsd/regInfo.xsd"
extension "File:../xsd/regInfo.xsd";
}
// RFC 3863 Presence Information Data Format
import from urn_ietf_params_xml_ns_pidf language "XSD" all
with {
extension "File:../xsd/pidf.xsd"
extension "File:../xsd/pidf.xsd";
}
// RFC 4119 Presence Information Data Format, Location Object extension
// RFC 4119 Presence Information Data Format, Location Object extension
import from urn_ietf_params_xml_ns_pidf_geopriv10_basicPolicy language "XSD" all
with {
extension "File:../xsd/geopriv10basic.xsd"
extension "File:../xsd/geopriv10basic.xsd";
}
// RFC 4119 Presence Information Data Format, Location Object extension
 
// RFC 4119 Presence Information Data Format, Location Object extension
import from urn_ietf_params_xml_ns_pidf_geopriv10 language "XSD" all
with {
extension "File:../xsd/pidf_lo.xsd"
extension "File:../xsd/pidf_lo.xsd";
}
 
group XmlTypes {
type union XmlBody {
Mcid mcid, // if there is XML Mcid
Comm_div_info_type cdivn, // if there is XML cdivn
Simservs simservs, // if there is XML simservs (Oip/r, Tip/r, Call Diversion, ICB, OCB ...)
Conference_type conference, // if there is XML conf
Ims_cw cw, // if there is XML cw (defined in X_3gpp_ns_cw_1_0.ttcn3view)
Cug cug, // if there is XML cug (defined in org_etsi_uri__ngn_params_xml_simservs_xcap.ttcn3view)
TIMS3GPP ims3gpp, // if there is XML IMS 3GPP
PSTN_transit pstnTransit, // if there is XML PSTN_transit
Resource_lists resourceLists, // if there is XML Resource List data
Reginfo regInfo, // if it is a registration event
Geopriv geopriv // if it is a Presence Information Data Format Location Object
Mcid mcid,
// if there is XML Mcid
Comm_div_info_type cdivn,
// if there is XML cdivn
Simservs simservs,
// if there is XML simservs (Oip/r, Tip/r, Call Diversion, ICB, OCB ...)
Conference_type conference,
// if there is XML conf
Ims_cw cw,
// if there is XML cw (defined in X_3gpp_ns_cw_1_0.ttcn3view)
Cug cug,
// if there is XML cug (defined in org_etsi_uri__ngn_params_xml_simservs_xcap.ttcn3view)
TIMS3GPP ims3gpp,
// if there is XML IMS 3GPP
PSTN_transit pstnTransit,
// if there is XML PSTN_transit
Resource_lists resourceLists,
// if there is XML Resource List data
Reginfo regInfo,
// if it is a registration event
Geopriv
geopriv // if it is a Presence Information Data Format Location Object
}
}
}
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_common_policy.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_3gpp_ns_cw_1_0.ttcn3view
File deleted
/trunk/xsd/ttcn3view/http_uri_etsi_org_ngn_params_xml_simservs_mcid.ttcn3view
File deleted
/trunk/xsd/ttcn3view/http_uri_etsi_org_ngn_params_xml_comm_div_info.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_reginfo.ttcn3view
File deleted
/trunk/xsd/ttcn3view/http_www_w3_org_XML_1998_namespace.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_pidf_geopriv10.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_pidf_geopriv10_basicPolicy.ttcn3view
File deleted
/trunk/xsd/ttcn3view/http_uri_etsi_org_ngn_params_xml_simservs_pstn.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_oma_xml_xdm_common_policy.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_pidf.ttcn3view
File deleted
/trunk/xsd/ttcn3view/NoTargetNamespace.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_conference_info.ttcn3view
File deleted
/trunk/xsd/ttcn3view/urn_ietf_params_xml_ns_resource_lists.ttcn3view
File deleted
/trunk/xsd/ttcn3view/http_uri_etsi_org_ngn_params_xml_simservs_xcap.ttcn3view
File deleted
/trunk/xsd/ACR_CB.xsd
1,54 → 1,66
 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap" xmlns:cp="urn:ietf:params:xml:ns:common-policy"
xmlns:ocp="urn:oma:xml:xdm:common-policy"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- import common policy definitions -->
<xs:import namespace="urn:ietf:params:xml:ns:common-policy" schemaLocation="common-policy.xsd"/>
<!-- import OMA common policy extensions -->
<xs:import namespace="urn:oma:xml:xdm:common-policy" schemaLocation="xdm_commonPolicy-v1_0.xsd"/>
<!-- incoming communication barring rule set based on the common policy rule set.-->
<xs:element name="incoming-communication-barring" substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>This is the incoming communication barring configuration
document.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<!-- add service specific elements here-->
<xs:element ref="cp:ruleset" minOccurs="0"/>
</xs:sequence>
</xs:extension>
<!-- service specific attributes can be defined here -->
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- outgoing communication barring rule set based on the common policy rule set.-->
<xs:element name="outgoing-communication-barring" substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>This is the outgoing communication barring configuration
document.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<!-- add service specific elements here-->
<xs:element ref="cp:ruleset" minOccurs="0"/>
</xs:sequence>
</xs:extension>
<!-- service specific attributes can be defined here -->
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- communication barring specific extensions to IETF common policy actions-->
<xs:element name="allow" type="ss:allow-action-type"/>
<!-- communication barring specific type declarations -->
<!-- <xs:simpleType name="allow-action-type" final="list restriction"> -->
<xs:simpleType name="allow-action-type">
<xs:restriction base="xs:boolean"/>
</xs:simpleType>
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy" xmlns:ocp="urn:oma:xml:xdm:common-policy"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- import common policy definitions -->
<xs:import namespace="urn:ietf:params:xml:ns:common-policy"
schemaLocation="common-policy.xsd" />
<!-- import OMA common policy extensions -->
<xs:import namespace="urn:oma:xml:xdm:common-policy"
schemaLocation="xdm_commonPolicy-v1_0.xsd" />
<!-- incoming communication barring rule set based on the common policy
rule set. -->
<xs:element name="incoming-communication-barring"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>This is the incoming communication barring
configuration document.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<!-- add service specific elements here -->
<xs:element ref="cp:ruleset"
minOccurs="0" />
</xs:sequence>
</xs:extension>
<!-- service specific attributes can be defined here -->
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- outgoing communication barring rule set based on the common policy
rule set. -->
<xs:element name="outgoing-communication-barring"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>This is the outgoing communication barring
configuration
document.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<!-- add service specific elements here -->
<xs:element ref="cp:ruleset"
minOccurs="0" />
</xs:sequence>
</xs:extension>
<!-- service specific attributes can be defined here -->
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- communication barring specific extensions to IETF common policy
actions -->
<xs:element name="allow" type="ss:allow-action-type" />
<!-- communication barring specific type declarations -->
<!-- <xs:simpleType name="allow-action-type" final="list restriction"> -->
<xs:simpleType name="allow-action-type">
<xs:restriction base="xs:boolean" />
</xs:simpleType>
</xs:schema>
/trunk/xsd/CDIV.xsd
1,67 → 1,80
 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy"
xmlns:ocp="urn:oma:xml:xdm:common-policy"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- import common policy definitions -->
<xs:import namespace="urn:ietf:params:xml:ns:common-policy" schemaLocation="common-policy.xsd"/>
<!-- import OMA common policy extensions -->
<xs:import namespace="urn:oma:xml:xdm:common-policy" schemaLocation="xdm_commonPolicy-v1_0.xsd"/>
<!-- communication diversion specific extensions to IETF common policy conditions. The
cp:conditionsType is expanded with the elements: ss:not-registered, ss:busy, ss:no-answer, ss:notreachable,
ss:media as optional elements -->
<!-- communication diversion rule set based on the common policy rule set.-->
<xs:element name="communication-diversion" substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>This is the communication diversion configuration
document.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<!-- add service specific elements here-->
<xs:element ref="cp:ruleset" minOccurs="0"/>
</xs:sequence>
</xs:extension>
<!-- service specific attributes can be defined here -->
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- communication diversion specific extensions to IETF common policy actions-->
<xs:element name="forward-to" type="ss:forward-to-type"/> <xs:simpleType name="reveal-URIoptions-type">
<xs:restriction base="xs:string">
<xs:enumeration value="false"/>
<xs:enumeration value="not-reveal-GRUU"/>
<xs:enumeration value="true"/>
</xs:restriction>
</xs:simpleType>
<!-- communication diversion specific type declarations -->
<xs:complexType name="forward-to-type">
<xs:sequence>
<xs:element name="target" type="xs:anyURI" minOccurs="1" maxOccurs="1"/>
<xs:element name="notify-caller" type="xs:boolean" default="true" minOccurs="0"/>
<xs:element name="reveal-identity-to-caller" type="ss:reveal-URIoptions-type"
default="true" minOccurs="0"/>
<xs:element name="reveal-served-user-identity-to-caller" type="ss:reveal-URIoptions-type"
default="true" minOccurs="0"/>
<xs:element name="notify-served-user" type="xs:boolean" default="false" minOccurs="0"/>
<xs:element name="notify-served-user-on-outbound-call" type="xs:boolean" default="false"
minOccurs="0"/>
<xs:element name="reveal-identity-to-target" type="ss:reveal-URIoptions-type"
default="true" minOccurs="0"/>
<xs:element ref="ss:NoReplyTimer" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="NoReplyTimer">
<xs:simpleType>
<xs:restriction base="xs:positiveInteger">
<xs:minInclusive value="5"/>
<xs:maxInclusive value="180"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy" xmlns:ocp="urn:oma:xml:xdm:common-policy"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- import common policy definitions -->
<xs:import namespace="urn:ietf:params:xml:ns:common-policy"
schemaLocation="common-policy.xsd" />
<!-- import OMA common policy extensions -->
<xs:import namespace="urn:oma:xml:xdm:common-policy"
schemaLocation="xdm_commonPolicy-v1_0.xsd" />
<!-- communication diversion specific extensions to IETF common policy
conditions. The cp:conditionsType is expanded with the elements: ss:not-registered,
ss:busy, ss:no-answer, ss:notreachable, ss:media as optional elements -->
<!-- communication diversion rule set based on the common policy rule
set. -->
<xs:element name="communication-diversion"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>This is the communication diversion
configuration
document.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<!-- add service specific elements here -->
<xs:element ref="cp:ruleset"
minOccurs="0" />
</xs:sequence>
</xs:extension>
<!-- service specific attributes can be defined here -->
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- communication diversion specific extensions to IETF common policy
actions -->
<xs:element name="forward-to" type="ss:forward-to-type" />
<xs:simpleType name="reveal-URIoptions-type">
<xs:restriction base="xs:string">
<xs:enumeration value="false" />
<xs:enumeration value="not-reveal-GRUU" />
<xs:enumeration value="true" />
</xs:restriction>
</xs:simpleType>
<!-- communication diversion specific type declarations -->
<xs:complexType name="forward-to-type">
<xs:sequence>
<xs:element name="target" type="xs:anyURI"
minOccurs="1" maxOccurs="1" />
<xs:element name="notify-caller" type="xs:boolean"
default="true" minOccurs="0" />
<xs:element name="reveal-identity-to-caller"
type="ss:reveal-URIoptions-type" default="true"
minOccurs="0" />
<xs:element name="reveal-served-user-identity-to-caller"
type="ss:reveal-URIoptions-type" default="true"
minOccurs="0" />
<xs:element name="notify-served-user" type="xs:boolean"
default="false" minOccurs="0" />
<xs:element name="notify-served-user-on-outbound-call"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="reveal-identity-to-target"
type="ss:reveal-URIoptions-type" default="true"
minOccurs="0" />
<xs:element ref="ss:NoReplyTimer" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:element name="NoReplyTimer">
<xs:simpleType>
<xs:restriction base="xs:positiveInteger">
<xs:minInclusive value="5" />
<xs:maxInclusive value="180" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
/trunk/xsd/CDIVN.xsd
1,249 → 1,226
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema targetNamespace="http://uri.etsi.org/ngn/params/xml/comm-div-info"
xmlns:tns="http://uri.etsi.org/ngn/params/xml/comm-div-info"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://uri.etsi.org/ngn/params/xml/comm-div-info"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- This import brings in the XML language definition -->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
<!-- Communication Diversion Information. This is the top-level XML element -->
<xs:element name="comm-div-info" type="comm-div-info-type" />
<!-- Communication Diversion Information Type. This is the top-level
XML element -->
<xs:complexType name="comm-div-info-type">
<xs:sequence>
<xs:element name="comm-div-subs-info" type="comm-div-subs-info-type"
minOccurs="0" />
<xs:element name="comm-div-ntfy-info" type="comm-div-ntfy-info-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI" use="required" />
</xs:complexType>
<!--- Communication Diversion Subscription Type. Used at Subscription
time to select Communication Diversions for notification, when to notify
them and what to notify. -->
<xs:complexType name="comm-div-subs-info-type">
<xs:sequence>
<xs:element name="comm-div-selection-criteria"
type="comm-div-selection-criteria-type" minOccurs="0" />
<xs:element name="comm-div-ntfy-trigger-criteria"
type="comm-div-ntfy-trigger-criteria-type" minOccurs="0" />
<xs:element name="comm-div-info-selection-criteria"
type="comm-div-info-selection-criteria-type" minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!--- Communication Diversion Notification Information Type Used while
notifying the User about the Communication Diversion -->
<xs:complexType name="comm-div-ntfy-info-type">
<xs:sequence>
<xs:element name="originating-user-info" type="user-info-type"
minOccurs="0" />
<xs:element name="diverting-user-info" type="xs:anyURI"
minOccurs="0" />
<xs:element name="diverted-to-user-info" type="xs:anyURI"
minOccurs="0" />
<xs:element name="diversion-time-info" type="xs:dateTime"
minOccurs="0" />
<xs:element name="diversion-reason-info" type="diversion-reason-info-type"
minOccurs="0" />
<xs:element name="diversion-rule-info" type="diversion-rule-info-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="previous-cdivn-state" type="cdivn-states-types"
minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- COMMUNICATION DIVERSION SELECTION CRITERIA -->
<xs:complexType name="comm-div-selection-criteria-type">
<xs:sequence>
<xs:element name="originating-user-selection-criteria"
type="user-selection-criteria-type" minOccurs="0" />
<xs:element name="diverting-user-selection-criteria"
type="xs:anyURI" minOccurs="0" />
<xs:element name="diverted-to-user-selection-criteria"
type="xs:anyURI" minOccurs="0" />
<xs:element name="diversion-time-selection-criteria"
type="time-range-selection-criteria-type" minOccurs="0" />
<xs:element name="diversion-reason-selection-criteria"
type="diversion-reason-selection-criteria-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- COMMUNICATION DIVERSION NOTIFICATION TRIGGER CRITERIA -->
<xs:complexType name="comm-div-ntfy-trigger-criteria-type">
<xs:sequence>
<xs:element name="notification-time-selection-criteria"
type="time-range-selection-criteria-type" minOccurs="0" />
<xs:element name="presence-status-selection-criteria"
type="presence-status-selection-criteria-type"
minOccurs="0" />
<xs:element name="notification-buffer-interval"
minOccurs="0" default="86400">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:maxInclusive value="86400" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- COMMUNICATION DIVERSION INFORMATION SELECTION CRITERIA -->
<xs:complexType name="comm-div-info-selection-criteria-type">
<xs:sequence>
<xs:element name="disable-originating-user-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diverting-user-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diverted-to-user-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diversion-time-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diversion-reason-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diversion-rule-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
 
<xs:schema
targetNamespace="http://uri.etsi.org/ngn/params/xml/comm-div-info"
xmlns:tns="http://uri.etsi.org/ngn/params/xml/comm-div-info"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://uri.etsi.org/ngn/params/xml/comm-div-info"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!--
This import brings in the XML language definition
-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<!--
Communication Diversion Information. This is the top-level XML element
-->
<xs:element name="comm-div-info"
type="comm-div-info-type" />
<!--
Communication Diversion Information Type. This is the top-level XML element
-->
<xs:complexType name="comm-div-info-type">
<xs:sequence>
<xs:element name="comm-div-subs-info"
type="comm-div-subs-info-type" minOccurs="0" />
<xs:element name="comm-div-ntfy-info"
type="comm-div-ntfy-info-type" minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI"
use="required"/>
</xs:complexType>
<!---
Communication Diversion Subscription Type.
Used at Subscription time to
select Communication Diversions for notification,
when to notify them and
what to notify.
-->
<xs:complexType name="comm-div-subs-info-type">
<xs:sequence>
<xs:element name="comm-div-selection-criteria"
type="comm-div-selection-criteria-type"
minOccurs="0" />
<xs:element name="comm-div-ntfy-trigger-criteria"
type="comm-div-ntfy-trigger-criteria-type"
minOccurs="0" />
<xs:element name="comm-div-info-selection-criteria"
type="comm-div-info-selection-criteria-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!---
Communication Diversion Notification Information Type
Used while notifying the User about the Communication Diversion
-->
<xs:complexType name="comm-div-ntfy-info-type">
<xs:sequence>
<xs:element name="originating-user-info"
type="user-info-type" minOccurs="0" />
<xs:element name="diverting-user-info"
type="xs:anyURI" minOccurs="0" />
<xs:element name="diverted-to-user-info"
type="xs:anyURI" minOccurs="0" />
<xs:element name="diversion-time-info"
type="xs:dateTime" minOccurs="0" />
<xs:element name="diversion-reason-info"
type="diversion-reason-info-type" minOccurs="0" />
<xs:element name="diversion-rule-info"
type="diversion-rule-info-type" minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
COMMUNICATION DIVERSION SELECTION CRITERIA
-->
<xs:complexType name="comm-div-selection-criteria-type">
<xs:sequence>
<xs:element name="originating-user-selection-criteria"
type="user-selection-criteria-type"
minOccurs="0" />
<xs:element name="diverting-user-selection-criteria"
type="xs:anyURI"
minOccurs="0" />
<xs:element name="diverted-to-user-selection-criteria"
type="xs:anyURI"
minOccurs="0" />
<xs:element name="diversion-time-selection-criteria"
type="time-range-selection-criteria-type"
minOccurs="0" />
<xs:element name="diversion-reason-selection-criteria"
type="diversion-reason-selection-criteria-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
COMMUNICATION DIVERSION NOTIFICATION TRIGGER CRITERIA
-->
<xs:complexType name="comm-div-ntfy-trigger-criteria-type">
<xs:sequence>
<xs:element name="notification-time-selection-criteria"
type="time-range-selection-criteria-type"
minOccurs="0" />
<xs:element name="presence-status-selection-criteria"
type="presence-status-selection-criteria-type"
minOccurs="0" />
<xs:element name="notification-buffer-interval" minOccurs="0" default="86400">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:maxInclusive value="86400"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
COMMUNICATION DIVERSION INFORMATION SELECTION CRITERIA
-->
<xs:complexType name="comm-div-info-selection-criteria-type">
<xs:sequence>
<xs:element name="disable-originating-user-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diverting-user-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diverted-to-user-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diversion-time-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diversion-reason-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:element name="disable-diversion-rule-info"
type="xs:boolean" default="false" minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!-- User Info Type -->
<xs:complexType name="user-info-type">
<xs:sequence>
<xs:element name="user-name" type="xs:string"
minOccurs="0" maxOccurs="1" />
<xs:element name="user-URI" type="xs:anyURI" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- CDIVN FSM STATES -->
<xs:simpleType name="cdivn-states-types">
<xs:list itemType="cdivn-states-type" />
</xs:simpleType>
<xs:simpleType name="cdivn-states-type">
<xs:restriction base="xs:string">
<xs:enumeration value="IDLE" />
<xs:enumeration value="DIVERSION_NOTIFIED" />
<xs:enumeration value="DIVERSION_NOT_NOTIFIED" />
</xs:restriction>
</xs:simpleType>
<!-- DIVERSION REASON INFO -->
 
<!-- User Info Type -->
<xs:complexType name="user-info-type">
<xs:sequence>
<xs:element name="user-name" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="user-URI" type="xs:anyURI"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
 
<!--
DIVERSION REASON INFO
-->
 
<xs:simpleType name="diversion-reason-info-types">
<xs:list itemType="diversion-reason-info-type"/>
<xs:list itemType="diversion-reason-info-type" />
</xs:simpleType>
<xs:simpleType name="diversion-reason-info-type">
<xs:simpleType name="diversion-reason-info-type">
<xs:restriction base="xs:integer">
<xs:enumeration value="404"/>
<xs:enumeration value="486"/>
<xs:enumeration value="408"/>
<xs:enumeration value="302"/>
<xs:enumeration value="487"/>
<xs:enumeration value="480"/>
<xs:enumeration value="503"/>
<xs:enumeration value="404" />
<xs:enumeration value="486" />
<xs:enumeration value="408" />
<xs:enumeration value="302" />
<xs:enumeration value="487" />
<xs:enumeration value="480" />
<xs:enumeration value="503" />
</xs:restriction>
</xs:simpleType>
<!--
DIVERSION RULE INFO
-->
<xs:complexType name="diversion-rule-info-type">
<xs:sequence>
<xs:element name="diversion-rule" type="xs:string"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
ORIGINATING USER SELECTION CRITERIA
-->
<xs:complexType name="user-selection-criteria-type">
<xs:sequence>
<xs:element name="user-info"
type="user-info-type" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
DIVERSION REASON SELECTION CRITERIA
-->
<xs:complexType name="diversion-reason-selection-criteria-type">
<xs:sequence>
<xs:element name="diversion-reason-info"
type="diversion-reason-info-types"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
TIME RANGE SELECTION CRITERIA
-->
<xs:complexType name="time-range-selection-criteria-type">
<xs:sequence>
<xs:element name="time-range"
type="time-range-type" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
TIME RANGE INFO
-->
<xs:complexType name="time-range-type">
<xs:sequence>
<xs:element name="start-time" type="xs:dateTime" />
<xs:element name="end-time" type="xs:dateTime" />
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
PRESENCE STATUS SELECTION CRITERIA
-->
<xs:complexType name="presence-status-selection-criteria-type">
<xs:sequence>
<xs:element name="presence-status-info"
type="presence-status-info-type" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
PRESENCE STATUS INFo
-->
<xs:complexType name="presence-status-info-type">
<xs:sequence>
<xs:element name="presence-status" type="xs:string" />
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:schema>
</xs:simpleType>
<!-- DIVERSION RULE INFO -->
<xs:complexType name="diversion-rule-info-type">
<xs:sequence>
<xs:element name="diversion-rule" type="xs:string" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- ORIGINATING USER SELECTION CRITERIA -->
<xs:complexType name="user-selection-criteria-type">
<xs:sequence>
<xs:element name="user-info" type="user-info-type"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- DIVERSION REASON SELECTION CRITERIA -->
<xs:complexType name="diversion-reason-selection-criteria-type">
<xs:sequence>
<xs:element name="diversion-reason-info" type="diversion-reason-info-types" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- TIME RANGE SELECTION CRITERIA -->
<xs:complexType name="time-range-selection-criteria-type">
<xs:sequence>
<xs:element name="time-range" type="time-range-type"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- TIME RANGE INFO -->
<xs:complexType name="time-range-type">
<xs:sequence>
<xs:element name="start-time" type="xs:dateTime" />
<xs:element name="end-time" type="xs:dateTime" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- PRESENCE STATUS SELECTION CRITERIA -->
<xs:complexType name="presence-status-selection-criteria-type">
<xs:sequence>
<xs:element name="presence-status-info" type="presence-status-info-type"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- PRESENCE STATUS INFo -->
<xs:complexType name="presence-status-info-type">
<xs:sequence>
<xs:element name="presence-status" type="xs:string" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
</xs:schema>
/trunk/xsd/CONF.xsd
1,387 → 1,342
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
targetNamespace="urn:ietf:params:xml:ns:conference-info"
xmlns:tns="urn:ietf:params:xml:ns:conference-info"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:ietf:params:xml:ns:conference-info"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!--
This imports the xml:language definition
-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<!--
CONFERENCE ELEMENT
-->
<xs:element name="conference-info" type="conference-type"/>
<!--
CONFERENCE TYPE
-->
<xs:complexType name="conference-type">
<xs:sequence>
<xs:element name="conference-description"
type="conference-description-type" minOccurs="0"/>
<xs:element name="host-info"
type="host-type" minOccurs="0"/>
<xs:element name="conference-state"
type="conference-state-type" minOccurs="0"/>
<xs:element name="users"
type="users-type" minOccurs="0"/>
<xs:element name="sidebars-by-ref"
type="uris-type" minOccurs="0"/>
<xs:element name="sidebars-by-val"
type="sidebars-by-val-type" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity"
type="xs:anyURI" use="required"/>
<xs:attribute name="state"
type="state-type" use="optional" default="full"/>
<xs:attribute name="version"
type="xs:unsignedInt" use="optional"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
STATE TYPE
-->
<xs:simpleType name="state-type">
<xs:restriction base="xs:string">
<xs:enumeration value="full"/>
<xs:enumeration value="partial"/>
<xs:enumeration value="deleted"/>
</xs:restriction>
</xs:simpleType>
<!--
CONFERENCE DESCRIPTION TYPE
-->
<xs:complexType name="conference-description-type">
<xs:sequence>
<xs:element name="display-text"
type="xs:string" minOccurs="0"/>
<xs:element name="subject"
type="xs:string" minOccurs="0"/>
<xs:element name="free-text"
type="xs:string" minOccurs="0"/>
<xs:element name="keywords"
type="keywords-type" minOccurs="0"/>
<xs:element name="conf-uris"
type="uris-type" minOccurs="0"/>
<xs:element name="service-uris"
type="uris-type" minOccurs="0"/>
<xs:element name="maximum-user-count"
type="xs:unsignedInt" minOccurs="0"/>
<xs:element name="available-media"
type="conference-media-type" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
HOST TYPE
-->
<xs:complexType name="host-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="web-page" type="xs:anyURI"
minOccurs="0"/>
<xs:element name="uris" type="uris-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE STATE TYPE
-->
<xs:complexType name="conference-state-type">
<xs:sequence>
<xs:element name="user-count" type="xs:unsignedInt"
minOccurs="0"/>
<xs:element name="active" type="xs:boolean"
minOccurs="0"/>
<xs:element name="locked" type="xs:boolean"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE MEDIA TYPE
-->
<xs:complexType name="conference-media-type">
<xs:sequence>
<xs:element name="entry" type="conference-medium-type"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE MEDIUM TYPE
-->
<xs:complexType name="conference-medium-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="type" type="xs:string"/>
<xs:element name="status" type="media-status-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="label" type="xs:string"
use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
URIs TYPE
-->
<xs:complexType name="uris-type">
<xs:sequence>
<xs:element name="entry" type="uri-type"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
URI TYPE
-->
<xs:complexType name="uri-type">
<xs:sequence>
<xs:element name="uri" type="xs:anyURI"/>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="purpose" type="xs:string"
minOccurs="0"/>
<xs:element name="modified" type="execution-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
KEYWORDS TYPE
-->
<xs:simpleType name="keywords-type">
<xs:list itemType="xs:string"/>
</xs:simpleType>
<!--
USERS TYPE
-->
<xs:complexType name="users-type">
<xs:sequence>
<xs:element name="user" type="user-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER TYPE
-->
<xs:complexType name="user-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="associated-aors" type="uris-type"
minOccurs="0"/>
<xs:element name="roles" type="user-roles-type"
minOccurs="0"/>
<xs:element name="languages" type="user-languages-type"
minOccurs="0"/>
<xs:element name="cascaded-focus" type="xs:anyURI"
minOccurs="0"/>
<xs:element name="endpoint" type="endpoint-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI"/>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER ROLES TYPE
-->
<xs:complexType name="user-roles-type">
<xs:sequence>
<xs:element name="entry" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER LANGUAGES TYPE
-->
<xs:simpleType name="user-languages-type">
<xs:list itemType="xs:language"/>
</xs:simpleType>
<!--
ENDPOINT TYPE
-->
<xs:complexType name="endpoint-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="referred" type="execution-type"
minOccurs="0"/>
<xs:element name="status" type="endpoint-status-type"
minOccurs="0"/>
<xs:element name="joining-method" type="joining-type"
minOccurs="0"/>
<xs:element name="joining-info"
type="execution-type"
minOccurs="0"/>
<xs:element name="disconnection-method"
type="disconnection-type"
minOccurs="0"/>
<xs:element name="disconnection-info"
type="execution-type"
minOccurs="0"/>
<xs:element name="media" type="media-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="call-info" type="call-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:string"/>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
ENDPOINT STATUS TYPE
-->
<xs:simpleType name="endpoint-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="pending"/>
<xs:enumeration value="dialing-out"/>
<xs:enumeration value="dialing-in"/>
<xs:enumeration value="alerting"/>
<xs:enumeration value="on-hold"/>
<xs:enumeration value="connected"/>
<xs:enumeration value="muted-via-focus"/>
<xs:enumeration value="disconnecting"/>
<xs:enumeration value="disconnected"/>
</xs:restriction>
</xs:simpleType>
<!--
JOINING TYPE
-->
<xs:simpleType name="joining-type">
<xs:restriction base="xs:string">
<xs:enumeration value="dialed-in"/>
<xs:enumeration value="dialed-out"/>
<xs:enumeration value="focus-owner"/>
</xs:restriction>
</xs:simpleType>
<!--
DISCONNECTION TYPE
-->
<xs:simpleType name="disconnection-type">
<xs:restriction base="xs:string">
<xs:enumeration value="departed"/>
<xs:enumeration value="booted"/>
<xs:enumeration value="failed"/>
<xs:enumeration value="busy"/>
</xs:restriction>
</xs:simpleType>
<!--
EXECUTION TYPE
-->
<xs:complexType name="execution-type">
<xs:sequence>
<xs:element name="when" type="xs:dateTime"
minOccurs="0"/>
<xs:element name="reason" type="xs:string"
minOccurs="0"/>
<xs:element name="by" type="xs:anyURI"
minOccurs="0"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CALL TYPE
-->
<xs:complexType name="call-type">
<xs:choice>
<xs:element name="sip" type="sip-dialog-id-type"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
SIP DIALOG ID TYPE
-->
<xs:complexType name="sip-dialog-id-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="call-id" type="xs:string"/>
<xs:element name="from-tag" type="xs:string"/>
<xs:element name="to-tag" type="xs:string"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
MEDIA TYPE
-->
<xs:complexType name="media-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="type" type="xs:string"
minOccurs="0"/>
<xs:element name="label" type="xs:string"
minOccurs="0"/>
<xs:element name="src-id" type="xs:string"
minOccurs="0"/>
<xs:element name="status" type="media-status-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string"
use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
MEDIA STATUS TYPE
-->
<xs:simpleType name="media-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="recvonly"/>
<xs:enumeration value="sendonly"/>
<xs:enumeration value="sendrecv"/>
<xs:enumeration value="inactive"/>
</xs:restriction>
</xs:simpleType>
<!--
SIDEBARS BY VAL TYPE
-->
<xs:complexType name="sidebars-by-val-type">
<xs:schema targetNamespace="urn:ietf:params:xml:ns:conference-info"
xmlns:tns="urn:ietf:params:xml:ns:conference-info" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:ietf:params:xml:ns:conference-info" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- This imports the xml:language definition -->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
<!-- CONFERENCE ELEMENT -->
<xs:element name="conference-info" type="conference-type" />
<!-- CONFERENCE TYPE -->
<xs:complexType name="conference-type">
<xs:sequence>
<xs:element name="entry" type="conference-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="conference-description" type="conference-description-type"
minOccurs="0" />
<xs:element name="host-info" type="host-type"
minOccurs="0" />
<xs:element name="conference-state" type="conference-state-type"
minOccurs="0" />
<xs:element name="users" type="users-type"
minOccurs="0" />
<xs:element name="sidebars-by-ref" type="uris-type"
minOccurs="0" />
<xs:element name="sidebars-by-val" type="sidebars-by-val-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:schema>
<xs:attribute name="entity" type="xs:anyURI" use="required" />
<xs:attribute name="state" type="state-type" use="optional"
default="full" />
<xs:attribute name="version" type="xs:unsignedInt"
use="optional" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- STATE TYPE -->
<xs:simpleType name="state-type">
<xs:restriction base="xs:string">
<xs:enumeration value="full" />
<xs:enumeration value="partial" />
<xs:enumeration value="deleted" />
</xs:restriction>
</xs:simpleType>
<!-- CONFERENCE DESCRIPTION TYPE -->
<xs:complexType name="conference-description-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="subject" type="xs:string"
minOccurs="0" />
<xs:element name="free-text" type="xs:string"
minOccurs="0" />
<xs:element name="keywords" type="keywords-type"
minOccurs="0" />
<xs:element name="conf-uris" type="uris-type"
minOccurs="0" />
<xs:element name="service-uris" type="uris-type"
minOccurs="0" />
<xs:element name="maximum-user-count" type="xs:unsignedInt"
minOccurs="0" />
<xs:element name="available-media" type="conference-media-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- HOST TYPE -->
<xs:complexType name="host-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="web-page" type="xs:anyURI"
minOccurs="0" />
<xs:element name="uris" type="uris-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- CONFERENCE STATE TYPE -->
<xs:complexType name="conference-state-type">
<xs:sequence>
<xs:element name="user-count" type="xs:unsignedInt"
minOccurs="0" />
<xs:element name="active" type="xs:boolean"
minOccurs="0" />
<xs:element name="locked" type="xs:boolean"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- CONFERENCE MEDIA TYPE -->
<xs:complexType name="conference-media-type">
<xs:sequence>
<xs:element name="entry" type="conference-medium-type"
maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- CONFERENCE MEDIUM TYPE -->
<xs:complexType name="conference-medium-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="type" type="xs:string" />
<xs:element name="status" type="media-status-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="label" type="xs:string" use="required" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- URIs TYPE -->
<xs:complexType name="uris-type">
<xs:sequence>
<xs:element name="entry" type="uri-type"
maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="state" type="state-type" use="optional"
default="full" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- URI TYPE -->
<xs:complexType name="uri-type">
<xs:sequence>
<xs:element name="uri" type="xs:anyURI" />
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="purpose" type="xs:string"
minOccurs="0" />
<xs:element name="modified" type="execution-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- KEYWORDS TYPE -->
<xs:simpleType name="keywords-type">
<xs:list itemType="xs:string" />
</xs:simpleType>
<!-- USERS TYPE -->
<xs:complexType name="users-type">
<xs:sequence>
<xs:element name="user" type="user-type"
minOccurs="0" maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="state" type="state-type" use="optional"
default="full" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- USER TYPE -->
<xs:complexType name="user-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="associated-aors" type="uris-type"
minOccurs="0" />
<xs:element name="roles" type="user-roles-type"
minOccurs="0" />
<xs:element name="languages" type="user-languages-type"
minOccurs="0" />
<xs:element name="cascaded-focus" type="xs:anyURI"
minOccurs="0" />
<xs:element name="endpoint" type="endpoint-type"
minOccurs="0" maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI" />
<xs:attribute name="state" type="state-type" use="optional"
default="full" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- USER ROLES TYPE -->
<xs:complexType name="user-roles-type">
<xs:sequence>
<xs:element name="entry" type="xs:string"
maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- USER LANGUAGES TYPE -->
<xs:simpleType name="user-languages-type">
<xs:list itemType="xs:language" />
</xs:simpleType>
<!-- ENDPOINT TYPE -->
<xs:complexType name="endpoint-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="referred" type="execution-type"
minOccurs="0" />
<xs:element name="status" type="endpoint-status-type"
minOccurs="0" />
<xs:element name="joining-method" type="joining-type"
minOccurs="0" />
<xs:element name="joining-info" type="execution-type"
minOccurs="0" />
<xs:element name="disconnection-method" type="disconnection-type"
minOccurs="0" />
<xs:element name="disconnection-info" type="execution-type"
minOccurs="0" />
<xs:element name="media" type="media-type"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="call-info" type="call-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="entity" type="xs:string" />
<xs:attribute name="state" type="state-type" use="optional"
default="full" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- ENDPOINT STATUS TYPE -->
<xs:simpleType name="endpoint-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="pending" />
<xs:enumeration value="dialing-out" />
<xs:enumeration value="dialing-in" />
<xs:enumeration value="alerting" />
<xs:enumeration value="on-hold" />
<xs:enumeration value="connected" />
<xs:enumeration value="muted-via-focus" />
<xs:enumeration value="disconnecting" />
<xs:enumeration value="disconnected" />
</xs:restriction>
</xs:simpleType>
<!-- JOINING TYPE -->
<xs:simpleType name="joining-type">
<xs:restriction base="xs:string">
<xs:enumeration value="dialed-in" />
<xs:enumeration value="dialed-out" />
<xs:enumeration value="focus-owner" />
</xs:restriction>
</xs:simpleType>
<!-- DISCONNECTION TYPE -->
<xs:simpleType name="disconnection-type">
<xs:restriction base="xs:string">
<xs:enumeration value="departed" />
<xs:enumeration value="booted" />
<xs:enumeration value="failed" />
<xs:enumeration value="busy" />
</xs:restriction>
</xs:simpleType>
<!-- EXECUTION TYPE -->
<xs:complexType name="execution-type">
<xs:sequence>
<xs:element name="when" type="xs:dateTime"
minOccurs="0" />
<xs:element name="reason" type="xs:string"
minOccurs="0" />
<xs:element name="by" type="xs:anyURI" minOccurs="0" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- CALL TYPE -->
<xs:complexType name="call-type">
<xs:choice>
<xs:element name="sip" type="sip-dialog-id-type" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- SIP DIALOG ID TYPE -->
<xs:complexType name="sip-dialog-id-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="call-id" type="xs:string" />
<xs:element name="from-tag" type="xs:string" />
<xs:element name="to-tag" type="xs:string" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- MEDIA TYPE -->
<xs:complexType name="media-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0" />
<xs:element name="type" type="xs:string"
minOccurs="0" />
<xs:element name="label" type="xs:string"
minOccurs="0" />
<xs:element name="src-id" type="xs:string"
minOccurs="0" />
<xs:element name="status" type="media-status-type"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<!-- MEDIA STATUS TYPE -->
<xs:simpleType name="media-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="recvonly" />
<xs:enumeration value="sendonly" />
<xs:enumeration value="sendrecv" />
<xs:enumeration value="inactive" />
</xs:restriction>
</xs:simpleType>
<!-- SIDEBARS BY VAL TYPE -->
<xs:complexType name="sidebars-by-val-type">
<xs:sequence>
<xs:element name="entry" type="conference-type"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="state" type="state-type" use="optional"
default="full" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
</xs:schema>
/trunk/xsd/Ims3gpp.xsd
1,60 → 1,66
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1">
<xs:complexType name="tIMS3GPP">
<xs:sequence>
<xs:choice>
<xs:element name="alternative-service" type="tAlternativeService"/>
<xs:element name="service-info" type="xs:string"/>
</xs:choice>
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="version" type="xs:decimal" use="required"/>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="tAlternativeService">
<xs:sequence>
<xs:element name="type" type="tType"/>
<xs:element name="reason" type="xs:string"/>
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="tType">
<xs:sequence>
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="tAction">
<xs:sequence>
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified"
version="1">
<xs:complexType name="tIMS3GPP">
<xs:sequence>
<xs:choice>
<xs:element name="alternative-service" type="tAlternativeService" />
<xs:element name="service-info" type="xs:string" />
</xs:choice>
<xs:any namespace="##any" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="version" type="xs:decimal" use="required" />
<xs:anyAttribute />
</xs:complexType>
<xs:complexType name="tAlternativeService">
<xs:sequence>
<xs:element name="type" type="tType" />
<xs:element name="reason" type="xs:string" />
<xs:any namespace="##any" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute />
</xs:complexType>
<xs:complexType name="tType">
<xs:sequence>
<xs:any namespace="##any" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute />
</xs:complexType>
<xs:complexType name="tAction">
<xs:sequence>
<xs:any namespace="##any" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute />
</xs:complexType>
 
<!-- root element -->
<xs:element name="ims-3gpp" type="tIMS3GPP"/>
<!-- root element -->
<xs:element name="ims-3gpp" type="tIMS3GPP" />
 
<!-- emergency element for //ims-3gpp//alternative-service//type -->
<xs:element name="emergency">
<xs:complexType/>
</xs:element>
<!-- emergency element for //ims-3gpp//alternative-service//type -->
<xs:element name="emergency">
<xs:complexType />
</xs:element>
 
<!-- restoration element for //ims-3gpp//alternative-service//type -->
<xs:element name="restoration">
<xs:complexType/>
</xs:element>
<!-- restoration element for //ims-3gpp//alternative-service//type -->
<xs:element name="restoration">
<xs:complexType />
</xs:element>
 
<!-- action element for //ims-3gpp//alternative-service -->
<xs:element name="action" type="tAction"/>
<!-- action element for //ims-3gpp//alternative-service -->
<xs:element name="action" type="tAction" />
 
<!-- emergency-registration element for //ims-3gpp//alternative-service//action -->
<xs:element name="emergency-registration">
<xs:complexType/>
</xs:element>
<!-- emergency-registration element for //ims-3gpp//alternative-service//action -->
<xs:element name="emergency-registration">
<xs:complexType />
</xs:element>
 
<!-- initial-registration element for //ims-3gpp//alternative-service//action -->
<xs:element name="initial-registration">
<xs:complexType/>
</xs:element>
<!-- initial-registration element for //ims-3gpp//alternative-service//action -->
<xs:element name="initial-registration">
<xs:complexType />
</xs:element>
</xs:schema>
/trunk/xsd/MCID.xsd
1,37 → 1,41
 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://uri.etsi.org/ngn/params/xml/simservs/mcid"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/mcid" elementFormDefault="qualified">
<xs:annotation>
<xs:documentation>XML Schema Definition to the mcid request-response to the Malicious Communication
Identification simulation service</xs:documentation>
</xs:annotation>
<!--Definition of simple types-->
<xs:simpleType name="bitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1]"/>
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types-->
<xs:complexType name="requestType">
<xs:sequence>
<xs:element name="McidRequestIndicator" type="bitType"/>
<xs:element name="HoldingIndicator" type="bitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="responseType">
<xs:sequence>
<xs:element name="McidResponseIndicator" type="bitType"/>
<xs:element name="HoldingProvidedIndicator" type="bitType"/>
</xs:sequence>
</xs:complexType>
<!--Definition of document structure-->
<xs:element name="mcid">
<xs:complexType>
<xs:choice>
<xs:element name="request" type="requestType"/>
<xs:element name="response" type="responseType"/>
</xs:choice>
</xs:complexType>
</xs:element>
xmlns="http://uri.etsi.org/ngn/params/xml/simservs/mcid"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/mcid"
elementFormDefault="qualified">
<xs:annotation>
<xs:documentation>XML Schema Definition to the mcid
request-response
to the Malicious Communication
Identification simulation service
</xs:documentation>
</xs:annotation>
<!--Definition of simple types -->
<xs:simpleType name="bitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1]" />
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types -->
<xs:complexType name="requestType">
<xs:sequence>
<xs:element name="McidRequestIndicator" type="bitType" />
<xs:element name="HoldingIndicator" type="bitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="responseType">
<xs:sequence>
<xs:element name="McidResponseIndicator" type="bitType" />
<xs:element name="HoldingProvidedIndicator" type="bitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of document structure -->
<xs:element name="mcid">
<xs:complexType>
<xs:choice>
<xs:element name="request" type="requestType" />
<xs:element name="response" type="responseType" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
/trunk/xsd/OIP-OIR.xsd
1,37 → 1,40
 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="originating--identity--presentation--restriction"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Originating Identity presentation Restriction
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<xs:element name="default--behaviour" default="presentation--restricted"
minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="presentation--restricted"/>
<xs:enumeration value="presentation--not--restricted"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="originating--identity--presentation" type="ss:simservType"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Originating Identity Presentation
</xs:documentation>
</xs:annotation>
</xs:element>
xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="originating--identity--presentation--restriction"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Originating Identity presentation
Restriction
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<xs:element name="default--behaviour"
default="presentation--restricted"
minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration
value="presentation--restricted" />
<xs:enumeration
value="presentation--not--restricted" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="originating--identity--presentation"
type="ss:simservType" substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Originating Identity Presentation
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
/trunk/xsd/PSTN.xsd
1,367 → 1,418
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://uri.etsi.org/ngn/params/xml/simservs/pstn" xmlns:ns1="http://uri.etsi.org/ngn/params/xml/simservs/pstn" targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/pstn" elementFormDefault="qualified">
<xs:annotation>
<xs:documentation>XML Schema definition for mapping of some PSTN into SIP MIME Bodies</xs:documentation>
</xs:annotation>
<!--Definition of simple types-->
<xs:simpleType name="OneBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TwoBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ThreeBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FourBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FiveBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SixBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SevenBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1][0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types-->
<!--Definition of BearerCapability Octets-->
<xs:complexType name="BCOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType"/>
<xs:element name="InformationTransferCabability" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet4Type">
<xs:sequence>
<xs:element name="TransferMode" type="TwoBitType"/>
<xs:element name="InformationTransferRate" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet4-1Type">
<xs:sequence>
<xs:element name="RateMultiplier" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5Type">
<xs:sequence>
<xs:element name="Layer1Identification" type="TwoBitType"/>
<xs:element name="UserInfoLayer1Protocol" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5aType">
<xs:sequence>
<xs:element name="SynchronousAsynchronous" type="OneBitType"/>
<xs:element name="Negotiation" type="OneBitType"/>
<xs:element name="UserRate" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5bV110Type">
<xs:sequence>
<xs:element name="IntermediateRate" type="TwoBitType"/>
<xs:element name="NIConTX" type="OneBitType"/>
<xs:element name="NIConRX" type="OneBitType"/>
<xs:element name="FlowControlOnTX" type="OneBitType"/>
<xs:element name="FlowControlOnRX" type="OneBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5bV120Type">
<xs:sequence>
<xs:element name="RateAdaptionHeader" type="OneBitType"/>
<xs:element name="MultipleFrameEstablishmentSupport" type="OneBitType"/>
<xs:element name="ModeOfOperation" type="OneBitType"/>
<xs:element name="LogicalLinkIdentifier" type="OneBitType"/>
<xs:element name="Assignor" type="OneBitType"/>
<xs:element name="InbandOutbandNegotiation" type="OneBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5cType">
<xs:sequence>
<xs:element name="NumberOfStopBits" type="TwoBitType"/>
<xs:element name="NumberOfDataBits" type="TwoBitType"/>
<xs:element name="Parity" type="ThreeBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5dType">
<xs:sequence>
<xs:element name="DuplexMode" type="OneBitType"/>
<xs:element name="ModemType" type="SixBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet6Type">
<xs:sequence>
<xs:element name="Layer2Identification" type="TwoBitType"/>
<xs:element name="UserInfoLayer2Protocol" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7Type">
<xs:sequence>
<xs:element name="Layer3Identification" type="TwoBitType"/>
<xs:element name="UserInfoLayer3Protocol" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7aType">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7bType">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType"/>
</xs:sequence>
</xs:complexType>
<!--Definition of High Layer Compatibility Octets-->
<xs:complexType name="HLOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType"/>
<xs:element name="Interpretation" type="ThreeBitType"/>
<xs:element name="PresentationMethod" type="TwoBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4Type">
<xs:sequence>
<xs:element name="HighLayerCharacteristics" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4aMaintenanceType">
<xs:sequence>
<xs:element name="HighLayerCharacteristics" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4aAudioType">
<xs:sequence>
<xs:element name="VideoTelephonyCharacteristics" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<!--Definition of Low Layer Compatibility Octets-->
<xs:complexType name="LLOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType"/>
<xs:element name="InformationTransferCapability" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet3aType">
<xs:sequence>
<xs:element name="NegotiationIndicator" type="OneBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet4Type">
<xs:sequence>
<xs:element name="TransferMode" type="TwoBitType"/>
<xs:element name="InformationTransferRate" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet4-1Type">
<xs:sequence>
<xs:element name="RateMultiplier" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5Type">
<xs:sequence>
<xs:element name="Layer1Identification" type="TwoBitType"/>
<xs:element name="UserInfoLayer1Protocol" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5aType">
<xs:sequence>
<xs:element name="SynchronousAsynchronous" type="OneBitType"/>
<xs:element name="Negotiation" type="OneBitType"/>
<xs:element name="UserRate" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5bV110Type">
<xs:sequence>
<xs:element name="IntermediateRate" type="TwoBitType"/>
<xs:element name="NIConTX" type="OneBitType"/>
<xs:element name="NIConRX" type="OneBitType"/>
<xs:element name="FlowControlOnTX" type="OneBitType"/>
<xs:element name="FlowControlOnRX" type="OneBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5bV120Type">
<xs:sequence>
<xs:element name="RateAdaptionHeader" type="OneBitType"/>
<xs:element name="MultipleFrameEstablishmentSupport" type="OneBitType"/>
<xs:element name="ModeOfOperation" type="OneBitType"/>
<xs:element name="LogicalLinkIdentifier" type="OneBitType"/>
<xs:element name="Assignor" type="OneBitType"/>
<xs:element name="InbandOutbandNegotiation" type="OneBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5cType">
<xs:sequence>
<xs:element name="NumberOfStopBits" type="TwoBitType"/>
<xs:element name="NumberOfDataBits" type="TwoBitType"/>
<xs:element name="Parity" type="ThreeBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5dType">
<xs:sequence>
<xs:element name="DuplexMode" type="OneBitType"/>
<xs:element name="ModemType" type="SixBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6Type">
<xs:sequence>
<xs:element name="Layer2Identification" type="TwoBitType"/>
<xs:element name="UserInfoLayer2Protocol" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6aHDLCType">
<xs:sequence>
<xs:element name="Mode" type="TwoBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6aUserSpecificType">
<xs:sequence>
<xs:element name="UserSpecificLayer2Information" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6bType">
<xs:sequence>
<xs:element name="WindowSize" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7Type">
<xs:sequence>
<xs:element name="Layer3Identification" type="TwoBitType"/>
<xs:element name="UserInfoLayer3Protocol" type="FiveBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aUserSpecificType">
<xs:sequence>
<xs:element name="OptionalLayer3Information" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aX25Type">
<xs:sequence>
<xs:element name="Mode" type="TwoBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7bX25Type">
<xs:sequence>
<xs:element name="DefaultPacketSize" type="FourBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7cType">
<xs:sequence>
<xs:element name="PacketWindowSize" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aTR9577Type">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7bTR9577Type">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DispOctet3Type">
<xs:sequence>
<xs:element name="DisplayInformation" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<!--Definition of the information elements-->
<xs:complexType name="BearerCapabilityType">
<xs:sequence>
<xs:element name="BCoctet3" type="BCOctet3Type"/>
<xs:element name="BCoctet4" type="BCOctet4Type"/>
<xs:element name="BCoctet4-1" type="BCOctet4-1Type" minOccurs="0"/>
<xs:element name="BCoctet5" type="BCOctet5Type" minOccurs="0"/>
<xs:element name="BCoctet5a" type="BCOctet5aType" minOccurs="0"/>
<xs:element name="BCoctet5bV110" type="BCOctet5bV110Type" minOccurs="0"/>
<xs:element name="BCoctet5bV120" type="BCOctet5bV120Type" minOccurs="0"/>
<xs:element name="BCoctet5c" type="BCOctet5cType" minOccurs="0"/>
<xs:element name="BCoctet5d" type="BCOctet5dType" minOccurs="0"/>
<xs:element name="BCoctet6" type="BCOctet6Type" minOccurs="0"/>
<xs:element name="BCoctet7" type="BCOctet7Type" minOccurs="0"/>
<xs:element name="BCoctet7a" type="BCOctet7aType" minOccurs="0"/>
<xs:element name="BCoctet7b" type="BCOctet7bType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HighLayerCompatibilityType">
<xs:sequence>
<xs:element name="HLOctet3" type="HLOctet3Type"/>
<xs:element name="HLOctet4" type="HLOctet4Type"/>
<xs:element name="HLOctet4aMaintenance" type="HLOctet4aMaintenanceType" minOccurs="0"/>
<xs:element name="HLOctet4Audio" type="HLOctet4aAudioType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LowLayerCompatibilityType">
<xs:sequence>
<xs:element name="LLOctet3" type="LLOctet3Type"/>
<xs:element name="LLOctet3a" type="LLOctet3aType" minOccurs="0"/>
<xs:element name="LLOctet4" type="LLOctet4Type"/>
<xs:element name="LLOctet4-1" type="LLOctet4-1Type" minOccurs="0"/>
<xs:element name="LLOctet5" type="LLOctet5Type" minOccurs="0"/>
<xs:element name="LLOctet5a" type="LLOctet5aType" minOccurs="0"/>
<xs:element name="LLOctet5bV110" type="LLOctet5bV110Type" minOccurs="0"/>
<xs:element name="LLOctet5bV120" type="LLOctet5bV120Type" minOccurs="0"/>
<xs:element name="LLOctet5c" type="LLOctet5cType" minOccurs="0"/>
<xs:element name="LLOctet5d" type="LLOctet5dType" minOccurs="0"/>
<xs:element name="LLOctet6" type="LLOctet6Type" minOccurs="0"/>
<xs:element name="LLOctet6aHDLC" type="LLOctet6aHDLCType" minOccurs="0"/>
<xs:element name="LLOctet6aUserSpecific" type="LLOctet6aUserSpecificType" minOccurs="0"/>
<xs:element name="LLOctet6b" type="LLOctet6bType" minOccurs="0"/>
<xs:element name="LLOctet7" type="LLOctet7Type"/>
<xs:element name="LLOctet7aUserSpecific" type="LLOctet7aUserSpecificType" minOccurs="0"/>
<xs:element name="LLOctet7aX25" type="LLOctet7aX25Type" minOccurs="0"/>
<xs:element name="LLOctet7bX25" type="LLOctet7bX25Type" minOccurs="0"/>
<xs:element name="LLOctet7c" type="LLOctet7cType" minOccurs="0"/>
<xs:element name="LLOctet7aTR9577" type="LLOctet7aTR9577Type" minOccurs="0"/>
<xs:element name="LLOctet7bTR9577" type="LLOctet7bTR9577Type" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DisplayType">
<xs:sequence>
<xs:element name="DispOctet3" type="DispOctet3Type"/>
</xs:sequence>
</xs:complexType>
<!--Definition of progress indicator-->
<xs:complexType name="ProgressOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType"/>
<xs:element name="Location" type="FourBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ProgressOctet4Type">
<xs:sequence>
<xs:element name="ProgressDescription" type="SevenBitType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ProgressIndicatorType">
<xs:sequence>
<xs:element name="ProgressOctet3" type="ProgressOctet3Type"/>
<xs:element name="ProgressOctet4" type="ProgressOctet4Type"/>
</xs:sequence>
</xs:complexType>
<!--Definition of document structure-->
<xs:element name="PSTN-transit">
<xs:complexType>
<xs:sequence>
<xs:element name="BearerInfomationElement" type="BearerCapabilityType" maxOccurs="2"/>
<xs:element name="HighLayerCompatibility" type="HighLayerCompatibilityType" minOccurs="0" maxOccurs="2"/>
<xs:element name="LowLayerCompatibility" type="LowLayerCompatibilityType" minOccurs="0"/>
<xs:element name="ProgressIndicator" type="ProgressIndicatorType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Display" type="DisplayType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://uri.etsi.org/ngn/params/xml/simservs/pstn" xmlns:ns1="http://uri.etsi.org/ngn/params/xml/simservs/pstn"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/pstn"
elementFormDefault="qualified">
<xs:annotation>
<xs:documentation>XML Schema definition for mappingof some PSTN
into
SIP MIME Bodies
</xs:documentation>
</xs:annotation>
<!--Definition of simple types -->
<xs:simpleType name="OneBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TwoBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ThreeBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FourBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FiveBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SixBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SevenBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types -->
<!--Definition of BearerCapability Octets -->
<xs:complexType name="BCOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="InformationTransferCabability"
type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet4Type">
<xs:sequence>
<xs:element name="TransferMode" type="TwoBitType" />
<xs:element name="InformationTransferRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet4-1Type">
<xs:sequence>
<xs:element name="RateMultiplier" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5Type">
<xs:sequence>
<xs:element name="Layer1Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer1Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5aType">
<xs:sequence>
<xs:element name="SynchronousAsynchronous" type="OneBitType" />
<xs:element name="Negotiation" type="OneBitType" />
<xs:element name="UserRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5bV110Type">
<xs:sequence>
<xs:element name="IntermediateRate" type="TwoBitType" />
<xs:element name="NIConTX" type="OneBitType" />
<xs:element name="NIConRX" type="OneBitType" />
<xs:element name="FlowControlOnTX" type="OneBitType" />
<xs:element name="FlowControlOnRX" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5bV120Type">
<xs:sequence>
<xs:element name="RateAdaptionHeader" type="OneBitType" />
<xs:element name="MultipleFrameEstablishmentSupport"
type="OneBitType" />
<xs:element name="ModeOfOperation" type="OneBitType" />
<xs:element name="LogicalLinkIdentifier" type="OneBitType" />
<xs:element name="Assignor" type="OneBitType" />
<xs:element name="InbandOutbandNegotiation" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5cType">
<xs:sequence>
<xs:element name="NumberOfStopBits" type="TwoBitType" />
<xs:element name="NumberOfDataBits" type="TwoBitType" />
<xs:element name="Parity" type="ThreeBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5dType">
<xs:sequence>
<xs:element name="DuplexMode" type="OneBitType" />
<xs:element name="ModemType" type="SixBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet6Type">
<xs:sequence>
<xs:element name="Layer2Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer2Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7Type">
<xs:sequence>
<xs:element name="Layer3Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer3Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7aType">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7bType">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of High Layer Compatibility Octets -->
<xs:complexType name="HLOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="Interpretation" type="ThreeBitType" />
<xs:element name="PresentationMethod" type="TwoBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4Type">
<xs:sequence>
<xs:element name="HighLayerCharacteristics" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4aMaintenanceType">
<xs:sequence>
<xs:element name="HighLayerCharacteristics" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4aAudioType">
<xs:sequence>
<xs:element name="VideoTelephonyCharacteristics"
type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of Low Layer Compatibility Octets -->
<xs:complexType name="LLOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="InformationTransferCapability"
type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet3aType">
<xs:sequence>
<xs:element name="NegotiationIndicator" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet4Type">
<xs:sequence>
<xs:element name="TransferMode" type="TwoBitType" />
<xs:element name="InformationTransferRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet4-1Type">
<xs:sequence>
<xs:element name="RateMultiplier" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5Type">
<xs:sequence>
<xs:element name="Layer1Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer1Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5aType">
<xs:sequence>
<xs:element name="SynchronousAsynchronous" type="OneBitType" />
<xs:element name="Negotiation" type="OneBitType" />
<xs:element name="UserRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5bV110Type">
<xs:sequence>
<xs:element name="IntermediateRate" type="TwoBitType" />
<xs:element name="NIConTX" type="OneBitType" />
<xs:element name="NIConRX" type="OneBitType" />
<xs:element name="FlowControlOnTX" type="OneBitType" />
<xs:element name="FlowControlOnRX" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5bV120Type">
<xs:sequence>
<xs:element name="RateAdaptionHeader" type="OneBitType" />
<xs:element name="MultipleFrameEstablishmentSupport"
type="OneBitType" />
<xs:element name="ModeOfOperation" type="OneBitType" />
<xs:element name="LogicalLinkIdentifier" type="OneBitType" />
<xs:element name="Assignor" type="OneBitType" />
<xs:element name="InbandOutbandNegotiation" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5cType">
<xs:sequence>
<xs:element name="NumberOfStopBits" type="TwoBitType" />
<xs:element name="NumberOfDataBits" type="TwoBitType" />
<xs:element name="Parity" type="ThreeBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5dType">
<xs:sequence>
<xs:element name="DuplexMode" type="OneBitType" />
<xs:element name="ModemType" type="SixBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6Type">
<xs:sequence>
<xs:element name="Layer2Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer2Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6aHDLCType">
<xs:sequence>
<xs:element name="Mode" type="TwoBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6aUserSpecificType">
<xs:sequence>
<xs:element name="UserSpecificLayer2Information"
type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6bType">
<xs:sequence>
<xs:element name="WindowSize" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7Type">
<xs:sequence>
<xs:element name="Layer3Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer3Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aUserSpecificType">
<xs:sequence>
<xs:element name="OptionalLayer3Information"
type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aX25Type">
<xs:sequence>
<xs:element name="Mode" type="TwoBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7bX25Type">
<xs:sequence>
<xs:element name="DefaultPacketSize" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7cType">
<xs:sequence>
<xs:element name="PacketWindowSize" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aTR9577Type">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7bTR9577Type">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="DispOctet3Type">
<xs:sequence>
<xs:element name="DisplayInformation" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of the information elements -->
<xs:complexType name="BearerCapabilityType">
<xs:sequence>
<xs:element name="BCoctet3" type="BCOctet3Type" />
<xs:element name="BCoctet4" type="BCOctet4Type" />
<xs:element name="BCoctet4-1" type="BCOctet4-1Type"
minOccurs="0" />
<xs:element name="BCoctet5" type="BCOctet5Type"
minOccurs="0" />
<xs:element name="BCoctet5a" type="BCOctet5aType"
minOccurs="0" />
<xs:element name="BCoctet5bV110" type="BCOctet5bV110Type"
minOccurs="0" />
<xs:element name="BCoctet5bV120" type="BCOctet5bV120Type"
minOccurs="0" />
<xs:element name="BCoctet5c" type="BCOctet5cType"
minOccurs="0" />
<xs:element name="BCoctet5d" type="BCOctet5dType"
minOccurs="0" />
<xs:element name="BCoctet6" type="BCOctet6Type"
minOccurs="0" />
<xs:element name="BCoctet7" type="BCOctet7Type"
minOccurs="0" />
<xs:element name="BCoctet7a" type="BCOctet7aType"
minOccurs="0" />
<xs:element name="BCoctet7b" type="BCOctet7bType"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HighLayerCompatibilityType">
<xs:sequence>
<xs:element name="HLOctet3" type="HLOctet3Type" />
<xs:element name="HLOctet4" type="HLOctet4Type" />
<xs:element name="HLOctet4aMaintenance" type="HLOctet4aMaintenanceType"
minOccurs="0" />
<xs:element name="HLOctet4Audio" type="HLOctet4aAudioType"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LowLayerCompatibilityType">
<xs:sequence>
<xs:element name="LLOctet3" type="LLOctet3Type" />
<xs:element name="LLOctet3a" type="LLOctet3aType"
minOccurs="0" />
<xs:element name="LLOctet4" type="LLOctet4Type" />
<xs:element name="LLOctet4-1" type="LLOctet4-1Type"
minOccurs="0" />
<xs:element name="LLOctet5" type="LLOctet5Type"
minOccurs="0" />
<xs:element name="LLOctet5a" type="LLOctet5aType"
minOccurs="0" />
<xs:element name="LLOctet5bV110" type="LLOctet5bV110Type"
minOccurs="0" />
<xs:element name="LLOctet5bV120" type="LLOctet5bV120Type"
minOccurs="0" />
<xs:element name="LLOctet5c" type="LLOctet5cType"
minOccurs="0" />
<xs:element name="LLOctet5d" type="LLOctet5dType"
minOccurs="0" />
<xs:element name="LLOctet6" type="LLOctet6Type"
minOccurs="0" />
<xs:element name="LLOctet6aHDLC" type="LLOctet6aHDLCType"
minOccurs="0" />
<xs:element name="LLOctet6aUserSpecific" type="LLOctet6aUserSpecificType"
minOccurs="0" />
<xs:element name="LLOctet6b" type="LLOctet6bType"
minOccurs="0" />
<xs:element name="LLOctet7" type="LLOctet7Type" />
<xs:element name="LLOctet7aUserSpecific" type="LLOctet7aUserSpecificType"
minOccurs="0" />
<xs:element name="LLOctet7aX25" type="LLOctet7aX25Type"
minOccurs="0" />
<xs:element name="LLOctet7bX25" type="LLOctet7bX25Type"
minOccurs="0" />
<xs:element name="LLOctet7c" type="LLOctet7cType"
minOccurs="0" />
<xs:element name="LLOctet7aTR9577" type="LLOctet7aTR9577Type"
minOccurs="0" />
<xs:element name="LLOctet7bTR9577" type="LLOctet7bTR9577Type"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="DisplayType">
<xs:sequence>
<xs:element name="DispOctet3" type="DispOctet3Type" />
</xs:sequence>
</xs:complexType>
<!--Definition of progress indicator -->
<xs:complexType name="ProgressOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="Location" type="FourBitType" />
</xs:sequence>
<!--ETSI ETSI TS 124 503 V8.15.0 (2013-07) 323 Release 7 -->
</xs:complexType>
<xs:complexType name="ProgressOctet4Type">
<xs:sequence>
<xs:element name="ProgressDescription" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ProgressIndicatorType">
<xs:sequence>
<xs:element name="ProgressOctet3" type="ProgressOctet3Type" />
<xs:element name="ProgressOctet4" type="ProgressOctet4Type" />
</xs:sequence>
</xs:complexType>
<!--Definition of document structure -->
<xs:element name="PSTN-transit">
<xs:complexType>
<xs:sequence>
<xs:element name="BearerInfomationElement"
type="BearerCapabilityType" maxOccurs="2" />
<xs:element name="HighLayerCompatibility"
type="HighLayerCompatibilityType" minOccurs="0"
maxOccurs="2" />
<xs:element name="LowLayerCompatibility"
type="LowLayerCompatibilityType" minOccurs="0" />
<xs:element name="ProgressIndicator" type="ProgressIndicatorType"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Display" type="DisplayType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
/trunk/xsd/ResourceList.xsd
1,70 → 1,84
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="urn:ietf:params:xml:ns:resource-lists" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:resource-lists">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
<xs:schema xmlns="urn:ietf:params:xml:ns:resource-lists"
xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified"
elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:resource-lists">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
<xs:complexType name="listType">
<xs:sequence>
<xs:element minOccurs="0" name="display-name" type="display-nameType"/>
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:choice>
<xs:element name="list">
<xs:complexType>
<xs:complexContent>
<xs:extension base="listType"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="external" type="externalType"/>
<xs:element name="entry" type="entryType"/>
<xs:element name="entry-ref" type="entry-refType"/>
</xs:choice>
</xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="optional"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
<xs:sequence>
<xs:element minOccurs="0" name="display-name"
type="display-nameType" />
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:choice>
<xs:element name="list">
<xs:complexType>
<xs:complexContent>
<xs:extension base="listType" />
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="external" type="externalType" />
<xs:element name="entry" type="entryType" />
<xs:element name="entry-ref" type="entry-refType" />
</xs:choice>
</xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0"
namespace="##other" processContents="lax" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="optional" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<xs:complexType name="entryType">
<xs:sequence>
<xs:element minOccurs="0" name="display-name">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="display-nameType"/>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:attribute name="uri" type="xs:anyURI" use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
<xs:sequence>
<xs:element minOccurs="0" name="display-name">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="display-nameType" />
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any maxOccurs="unbounded" minOccurs="0"
namespace="##other" processContents="lax" />
</xs:sequence>
<xs:attribute name="uri" type="xs:anyURI" use="required" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<xs:complexType name="entry-refType">
<xs:sequence>
<xs:element minOccurs="0" name="display-name" type="display-nameType"/>
<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:attribute name="ref" type="xs:anyURI" use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
<xs:complexType name="entry-refType">
<xs:sequence>
<xs:element minOccurs="0" name="display-name"
type="display-nameType" />
<xs:any maxOccurs="unbounded" minOccurs="0"
namespace="##other" processContents="lax" />
</xs:sequence>
<xs:attribute name="ref" type="xs:anyURI" use="required" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<xs:complexType name="externalType">
<xs:sequence>
<xs:element minOccurs="0" name="display-name" type="display-nameType"/>
<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:attribute name="anchor" type="xs:anyURI"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
<xs:sequence>
<xs:element minOccurs="0" name="display-name"
type="display-nameType" />
<xs:any maxOccurs="unbounded" minOccurs="0"
namespace="##other" processContents="lax" />
</xs:sequence>
<xs:attribute name="anchor" type="xs:anyURI" />
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<xs:element name="resource-lists">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:element name="list" type="listType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:element name="list" type="listType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="display-nameType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang"/>
</xs:extension>
</xs:simpleContent>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
</xs:schema>
/trunk/xsd/SupplementaryServices.xsd
1,15 → 1,14
 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
 
<xs:include schemaLocation="simservs.xsd"/>
<xs:include schemaLocation="TIP-TIR.xsd"/>
<xs:include schemaLocation="OIP-OIR.xsd"/>
<xs:include schemaLocation="CDIV.xsd"/>
<xs:include schemaLocation="ACR_CB.xsd"/>
<xs:include schemaLocation="cug.xsd"/>
<xs:include schemaLocation="simservs.xsd" />
<xs:include schemaLocation="TIP-TIR.xsd" />
<xs:include schemaLocation="OIP-OIR.xsd" />
<xs:include schemaLocation="CDIV.xsd" />
<xs:include schemaLocation="ACR_CB.xsd" />
<xs:include schemaLocation="cug.xsd" />
 
</xs:schema>
/trunk/xsd/TIP-TIR.xsd
1,37 → 1,39
 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="terminating-identity-presentation-restriction"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Terminating Identity presentation Restriction
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<xs:element name="default-behaviour" default="presentation-restricted"
minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="presentation-restricted"/>
<xs:enumeration value="presentation-not-restricted"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="terminating-identity-presentation" type="ss:simservType"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Terminating Identity Presentation
</xs:documentation>
</xs:annotation>
</xs:element>
xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="terminating-identity-presentation-restriction"
substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Terminating Identity presentation
Restriction
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<xs:element name="default-behaviour"
default="presentation-restricted" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration
value="presentation-restricted" />
<xs:enumeration
value="presentation-not-restricted" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="terminating-identity-presentation"
type="ss:simservType" substitutionGroup="ss:absService">
<xs:annotation>
<xs:documentation>Terminating Identity Presentation
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
/trunk/xsd/common-policy.xsd
1,127 → 1,126
<?xml version="1.0"?>
<xs:schema targetNamespace="urn:ietf:params:xml:ns:common-policy"
xmlns:cp="urn:ietf:params:xml:ns:common-policy"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- /ruleset -->
<xs:element name="ruleset">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="rule" type="cp:ruleType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- /ruleset/rule -->
<xs:complexType name="ruleType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="conditions"
type="cp:conditionsType" minOccurs="0"/>
<xs:element name="actions"
type="cp:extensibleType" minOccurs="0"/>
<xs:element name="transformations"
type="cp:extensibleType" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //rule/conditions -->
<xs:complexType name="conditionsType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:choice maxOccurs="unbounded">
<xs:element name="identity"
type="cp:identityType" minOccurs="0"/>
<xs:element name="sphere"
type="cp:sphereType" minOccurs="0"/>
<xs:element name="validity"
type="cp:validityType" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //conditions/identity -->
<xs:complexType name="identityType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="one" type="cp:oneType"/>
<xs:element name="many" type="cp:manyType"/>
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //identity/one -->
<xs:complexType name="oneType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:any namespace="##other"
minOccurs="0" processContents="lax"/>
</xs:sequence>
<xs:attribute name="id"
type="xs:anyURI" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //identity/many -->
<xs:complexType name="manyType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="except" type="cp:exceptType"/>
<xs:any namespace="##other"
minOccurs="0" processContents="lax"/>
</xs:choice>
<xs:attribute name="domain"
use="optional" type="xs:string"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //many/except -->
<xs:complexType name="exceptType">
<xs:attribute name="domain" type="xs:string" use="optional"/>
<xs:attribute name="id" type="xs:anyURI" use="optional"/>
</xs:complexType>
<!-- //conditions/sphere -->
<xs:complexType name="sphereType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:attribute name="value"
type="xs:string" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //conditions/validity -->
<xs:complexType name="validityType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="from" type="xs:dateTime"/>
<xs:element name="until" type="xs:dateTime"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //rule/actions or //rule/transformations -->
<xs:complexType name="extensibleType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:ietf:params:xml:ns:common-policy"
xmlns:cp="urn:ietf:params:xml:ns:common-policy" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- /ruleset -->
<xs:element name="ruleset">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="rule" type="cp:ruleType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- /ruleset/rule -->
<xs:complexType name="ruleType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="conditions" type="cp:conditionsType"
minOccurs="0" />
<xs:element name="actions" type="cp:extensibleType"
minOccurs="0" />
<xs:element name="transformations" type="cp:extensibleType"
minOccurs="0" />
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //rule/conditions -->
<xs:complexType name="conditionsType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:choice maxOccurs="unbounded">
<xs:element name="identity" type="cp:identityType"
minOccurs="0" />
<xs:element name="sphere" type="cp:sphereType"
minOccurs="0" />
<xs:element name="validity" type="cp:validityType"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //conditions/identity -->
<xs:complexType name="identityType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="one" type="cp:oneType" />
<xs:element name="many" type="cp:manyType" />
<xs:any namespace="##other" processContents="lax" />
</xs:choice>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //identity/one -->
<xs:complexType name="oneType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:any namespace="##other" minOccurs="0"
processContents="lax" />
</xs:sequence>
<xs:attribute name="id" type="xs:anyURI"
use="required" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //identity/many -->
<xs:complexType name="manyType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="except" type="cp:exceptType" />
<xs:any namespace="##other" minOccurs="0"
processContents="lax" />
</xs:choice>
<xs:attribute name="domain" use="optional"
type="xs:string" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //many/except -->
<xs:complexType name="exceptType">
<xs:attribute name="domain" type="xs:string" use="optional" />
<xs:attribute name="id" type="xs:anyURI" use="optional" />
</xs:complexType>
<!-- //conditions/sphere -->
<xs:complexType name="sphereType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:attribute name="value" type="xs:string"
use="required" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //conditions/validity -->
<xs:complexType name="validityType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="from" type="xs:dateTime" />
<xs:element name="until" type="xs:dateTime" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!-- //rule/actions or //rule/transformations -->
<xs:complexType name="extensibleType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
/trunk/xsd/cug.xsd
1,54 → 1,64
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap" xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap" targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>XML Schema Definition for the closed user group
parameter</xs:documentation>
</xs:annotation>
<!--Definition of simple types-->
<xs:simpleType name="twobitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1]"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="networkIdentityType">
<xs:restriction base="xs:hexBinary">
<xs:length value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sixteenbitType">
<xs:restriction base="xs:hexBinary">
<xs:length value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="cugIndexType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="32767"/>
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types-->
<xs:complexType name="cugRequestType">
<xs:sequence>
<xs:element name="outgoingAccessRequest" type="xs:boolean"/>
<xs:element name="cugIndex" type="cugIndexType"/>
</xs:sequence>
</xs:complexType>
<!--Definition of document structure-->
<xs:element name="cug" substitutionGroup="ss:absService">
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<xs:element name="cugCallOperation" type="cugRequestType" minOccurs="0"/>
<xs:element name="networkIndicator" type="networkIdentityType"
minOccurs="0"/>
<xs:element name="cugInterlockBinaryCode" type="sixteenbitType"
minOccurs="0"/>
<xs:element name="cugCommunicationIndicator" type="twobitType"
minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap" xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>XML Schema Definition for the closed user
group
parameter
</xs:documentation>
</xs:annotation>
<!-- Because of some XSD to TTCN-3 mapping limitations, xcap.xsd=simservs.xsd
with modifications -->
<!--xs:include schemaLocation="xcap.xsd"/ -->
<!--Definition of simple types -->
<xs:simpleType name="twobitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="networkIdentityType">
<xs:restriction base="xs:hexBinary">
<xs:length value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sixteenbitType">
<xs:restriction base="xs:hexBinary">
<xs:length value="2" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="cugIndexType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="32767" />
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types -->
<xs:complexType name="cugRequestType">
<xs:sequence>
<xs:element name="outgoingAccessRequest" type="xs:boolean" />
<xs:element name="cugIndex" type="cugIndexType"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<!--Definition of document structure -->
<xs:element name="cug" substitutionGroup="ss:absService">
<xs:complexType>
<xs:complexContent>
<xs:extension base="ss:simservType">
<xs:sequence>
<xs:element name="cugCallOperation"
type="cugRequestType" minOccurs="0" />
<xs:element name="networkIndicator"
type="networkIdentityType" minOccurs="0" />
<xs:element name="cugInterlockBinaryCode"
type="sixteenbitType" minOccurs="0" />
<xs:element name="cugCommunicationIndicator"
type="twobitType" minOccurs="0" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
/trunk/xsd/cw.xsd
1,16 → 1,17
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:3gpp:ns:cw:1.0"
xmlns:cw10="urn:3gpp:ns:cw:1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="tEmptyType"/>
<xs:schema targetNamespace="urn:3gpp:ns:cw:1.0" xmlns:cw10="urn:3gpp:ns:cw:1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="tEmptyType" />
<xs:complexType name="tCWtype">
<xs:sequence>
<xs:element name="communication-waiting-indication" minOccurs="0" maxOccurs="1"
type="cw10:tEmptyType"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="communication-waiting-indication"
minOccurs="0" maxOccurs="1" type="cw10:tEmptyType" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
<xs:anyAttribute namespace="##other"
processContents="lax" />
</xs:complexType>
<xs:element name="ims-cw" type="cw10:tCWtype"/>
<xs:element name="ims-cw" type="cw10:tCWtype" />
</xs:schema>
/trunk/xsd/geopriv10basic.xsd
1,34 → 1,34
<xs:schema
targetNamespace="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
xmlns:tns="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
xmlns:tns="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
 
<!-- This import brings in the XML language attribute xml:lang-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<!-- This import brings in the XML language attribute xml:lang -->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
 
<xs:complexType name="locPolicyType">
<xs:sequence>
<xs:element name="retransmission-allowed" type="xs:boolean"
minOccurs="0" maxOccurs="1"/>
<xs:element name="retention-expiry" type="xs:dateTime"
minOccurs="0" maxOccurs="1"/>
<xs:element name="external-ruleset" type="xs:anyURI"
minOccurs="0" maxOccurs="1"/>
<xs:element name="note-well" type="tns:notewell"
minOccurs="0" maxOccurs="1"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="locPolicyType">
<xs:sequence>
<xs:element name="retransmission-allowed" type="xs:boolean"
minOccurs="0" maxOccurs="1" />
<xs:element name="retention-expiry" type="xs:dateTime"
minOccurs="0" maxOccurs="1" />
<xs:element name="external-ruleset" type="xs:anyURI"
minOccurs="0" maxOccurs="1" />
<xs:element name="note-well" type="tns:notewell"
minOccurs="0" maxOccurs="1" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
 
<xs:complexType name="notewell">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" />
</xs:extension>
</xs:simpleContent>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
 
</xs:schema>
/trunk/xsd/pidf.xsd
1,92 → 1,92
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf"
xmlns:tns="urn:ietf:params:xml:ns:pidf" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- RFC 3863 -->
 
<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf"
xmlns:tns="urn:ietf:params:xml:ns:pidf"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!--
RFC 3863
-->
 
<!-- This import brings in the XML language attribute xml:lang -->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
 
<!-- This import brings in the XML language attribute xml:lang-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:element name="presence" type="tns:presence" />
 
<xs:element name="presence" type="tns:presence"/>
<xs:complexType name="presence">
<xs:sequence>
<xs:element name="tuple" type="tns:tuple"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="note" type="tns:note"
minOccurs="0" maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI" use="required" />
</xs:complexType>
 
<xs:complexType name="presence">
<xs:sequence>
<xs:element name="tuple" type="tns:tuple" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="note" type="tns:note" minOccurs="0"
maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI" use="required"/>
</xs:complexType>
<xs:complexType name="tuple">
<xs:sequence>
<xs:element name="status" type="tns:status" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="contact" type="tns:contact"
minOccurs="0" />
<xs:element name="note" type="tns:note"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="timestamp" type="xs:dateTime"
minOccurs="0" />
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required" />
</xs:complexType>
 
<xs:complexType name="tuple">
<xs:sequence>
<xs:element name="status" type="tns:status"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="contact" type="tns:contact" minOccurs="0"/>
<xs:element name="note" type="tns:note" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="timestamp" type="xs:dateTime" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
<xs:complexType name="status">
<xs:sequence>
<xs:element name="basic" type="tns:basic"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="basic">
<xs:restriction base="xs:string">
<xs:enumeration value="open" />
<xs:enumeration value="closed" />
</xs:restriction>
</xs:simpleType>
 
<xs:complexType name="status">
<xs:sequence>
<xs:element name="basic" type="tns:basic" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="basic">
<xs:restriction base="xs:string">
<xs:enumeration value="open"/>
<xs:enumeration value="closed"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="contact">
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="priority" type="tns:qvalue" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
 
<xs:complexType name="contact">
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="priority" type="tns:qvalue"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="note">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
 
<xs:complexType name="note">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="qvalue">
<xs:restriction base="xs:decimal">
<xs:pattern value="0(.[0-9]{0,3})?" />
<xs:pattern value="1(.0{0,3})?" />
</xs:restriction>
</xs:simpleType>
 
<xs:simpleType name="qvalue">
<xs:restriction base="xs:decimal">
<xs:pattern value="0(.[0-9]{0,3})?"/>
<xs:pattern value="1(.0{0,3})?"/>
</xs:restriction>
</xs:simpleType>
<!-- Global Attributes -->
<xs:attribute name="mustUnderstand" type="xs:boolean"
default="0">
<xs:annotation>
<xs:documentation>
This attribute may be used on any element within an optional
PIDF extension to indicate that the corresponding element must
be understood by the PIDF processor if the enclosing optional
element is to be handled.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:schema>
 
<!-- Global Attributes -->
<xs:attribute name="mustUnderstand" type="xs:boolean" default="0">
<xs:annotation>
<xs:documentation>
This attribute may be used on any element within an optional
PIDF extension to indicate that the corresponding element must
be understood by the PIDF processor if the enclosing optional
element is to be handled.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:schema>
 
/trunk/xsd/pidf_lo.xsd
1,57 → 1,55
<xs:schema
targetNamespace="urn:ietf:params:xml:ns:pidf:geopriv10"
xmlns:tns="urn:ietf:params:xml:ns:pidf:geopriv10"
xmlns:gbp="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf:geopriv10"
xmlns:tns="urn:ietf:params:xml:ns:pidf:geopriv10" xmlns:gbp="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
 
<xs:import namespace=
"urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
schemaLocation="geopriv10basic.xsd"/>
<xs:import namespace="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
schemaLocation="geopriv10basic.xsd" />
 
<!-- This import brings in the XML language attribute xml:lang-->
<!-- This import brings in the XML language attribute xml:lang -->
 
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
 
<xs:element name="geopriv" type="tns:geopriv"/>
<xs:element name="geopriv" type="tns:geopriv" />
 
<xs:complexType name="geopriv">
<xs:sequence>
<xs:element name="location-info" type="tns:locInfoType"
minOccurs="1" maxOccurs="1"/>
<xs:element name="usage-rules" type="gbp:locPolicyType"
minOccurs="1" maxOccurs="1"/>
<xs:element name="method" type="tns:locMethod"
minOccurs="0" maxOccurs="1"/>
<xs:element name="provided-by" type="tns:locProvidedBy"
minOccurs="0" maxOccurs="1"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="geopriv">
<xs:sequence>
<xs:element name="location-info" type="tns:locInfoType"
minOccurs="1" maxOccurs="1" />
<xs:element name="usage-rules" type="gbp:locPolicyType"
minOccurs="1" maxOccurs="1" />
<xs:element name="method" type="tns:locMethod"
minOccurs="0" maxOccurs="1" />
<xs:element name="provided-by" type="tns:locProvidedBy"
minOccurs="0" maxOccurs="1" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
 
<xs:complexType name="locInfoType">
<xs:sequence>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="locInfoType">
<xs:sequence>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
 
<xs:complexType name="locMethod">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="locMethod">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
 
<xs:complexType name="locProvidedBy">
<xs:sequence>
<xs:any namespace="##other" processContents="skip"
minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="locProvidedBy">
<xs:sequence>
<xs:any namespace="##other" processContents="skip"
minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
 
</xs:schema>
</xs:schema>
 
/trunk/xsd/regInfo.xsd
1,111 → 1,111
 
<xs:schema targetNamespace="urn:ietf:params:xml:ns:reginfo"
xmlns:tns="urn:ietf:params:xml:ns:reginfo"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--
RFC 3680 clause 5.4
-->
 
<!-- This import brings in the XML language attribute xml:lang-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
<xs:element name="reginfo">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:registration" minOccurs="0"
maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="version" type="xs:nonNegativeInteger"
use="required"/>
<xs:attribute name="state" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="full"/>
<xs:enumeration value="partial"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="registration">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:contact" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="aor" type="xs:anyURI" use="required"/>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="state" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="init"/>
<xs:enumeration value="active"/>
<xs:enumeration value="terminated"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="contact">
<xs:complexType>
<xs:sequence>
<xs:element name="uri" type="xs:anyURI"/>
<xs:element name="display-name" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="unknown-param" minOccurs="0"
maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="active"/>
<xs:enumeration value="terminated"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="event" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="registered"/>
<xs:enumeration value="created"/>
<xs:enumeration value="refreshed"/>
<xs:enumeration value="shortened"/>
<xs:enumeration value="expired"/>
<xs:enumeration value="deactivated"/>
<xs:enumeration value="probation"/>
<xs:enumeration value="unregistered"/>
<xs:enumeration value="rejected"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="duration-registered" type="xs:unsignedLong"/>
<xs:attribute name="expires" type="xs:unsignedLong"/>
<xs:attribute name="retry-after" type="xs:unsignedLong"/>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="q" type="xs:string"/>
<xs:attribute name="callid" type="xs:string"/>
<xs:attribute name="cseq" type="xs:unsignedLong"/>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:ietf:params:xml:ns:reginfo"
xmlns:tns="urn:ietf:params:xml:ns:reginfo" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- RFC 3680 clause 5.4 -->
 
<!-- This import brings in the XML language attribute xml:lang -->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd" />
<xs:element name="reginfo">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:registration" minOccurs="0"
maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="version" type="xs:nonNegativeInteger"
use="required" />
<xs:attribute name="state" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="full" />
<xs:enumeration value="partial" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="registration">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:contact" minOccurs="0"
maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="aor" type="xs:anyURI" use="required" />
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="state" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="init" />
<xs:enumeration value="active" />
<xs:enumeration value="terminated" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="contact">
<xs:complexType>
<xs:sequence>
<xs:element name="uri" type="xs:anyURI" />
<xs:element name="display-name" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang"
use="optional" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="unknown-param" minOccurs="0"
maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name"
type="xs:string" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="state" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="active" />
<xs:enumeration value="terminated" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="event" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="registered" />
<xs:enumeration value="created" />
<xs:enumeration value="refreshed" />
<xs:enumeration value="shortened" />
<xs:enumeration value="expired" />
<xs:enumeration value="deactivated" />
<xs:enumeration value="probation" />
<xs:enumeration value="unregistered" />
<xs:enumeration value="rejected" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="duration-registered" type="xs:unsignedLong" />
<xs:attribute name="expires" type="xs:unsignedLong" />
<xs:attribute name="retry-after" type="xs:unsignedLong" />
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="q" type="xs:string" />
<xs:attribute name="callid" type="xs:string" />
<xs:attribute name="cseq" type="xs:unsignedLong" />
</xs:complexType>
</xs:element>
</xs:schema>
/trunk/xsd/simservs.xsd
1,83 → 1,90
 
<?xml version="1.0" encoding="UTF-8"?>
<!-- TS 27.173 / 183 023 -->
<xs:schema targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
 
<!-- The element "simservs" maps to the Common Parts of an NGN PSTN/ISDN Simulation services document -->
<!-- The element "simservs" maps to the Common Parts of an NGN PSTN/ISDN
Simulation services document -->
 
<xs:element name="simservs">
<xs:annotation>
<xs:documentation>XML Schema for data manipulation of ETSI
NGN PSTN/ISDN Simulation Services
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:group ref="ss:absServiceGroup" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="extensions" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="simservs">
<xs:annotation>
<xs:documentation>XML Schema for data manipulation of ETSI
NGN PSTN/ISDN Simulation Services
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:group ref="ss:absServiceGroup" minOccurs="0"
maxOccurs="unbounded" />
<xs:element name="extensions" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##other"
processContents="lax" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:anyAttribute namespace="##any"
processContents="lax" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:anyAttribute namespace="##any" processContents="lax"/>
</xs:complexType>
</xs:element>
 
<xs:element name="absService" abstract="true" type="ss:simservType"/>
<xs:element name="absService" abstract="true" type="ss:simservType" />
 
<xs:complexType name="simservType">
<xs:attribute name="active" type="xs:boolean"
use="optional" default="true" />
<xs:anyAttribute namespace="##any" processContents="lax"/>
</xs:complexType>
<xs:attribute name="active" type="xs:boolean" use="optional"
default="true" />
<xs:anyAttribute namespace="##any"
processContents="lax" />
</xs:complexType>
 
<!-- service specific IETF common policy condition elements-->
<xs:element name="anonymous" type="ss:empty-element-type"/>
<xs:element name="presence-status" type="ss:presence-status-activity-type"/>
<xs:element name="media" type="ss:media-type1"/>
<xs:element name="communication-diverted" type="ss:empty-element-type"/>
<xs:element name="rule-deactivated" type="ss:empty-element-type"/>
<xs:element name="not-registered" type="ss:empty-element-type"/>
<xs:element name="busy" type="ss:empty-element-type"/>
<xs:element name="no-answer" type="ss:empty-element-type"/>
<xs:element name="not-reachable" type="ss:empty-element-type"/>
<xs:element name="roaming" type="ss:empty-element-type"/>
<!-- service specific IETF common policy condition elements -->
<xs:element name="anonymous" type="ss:empty-element-type" />
<xs:element name="presence-status" type="ss:presence-status-activity-type" />
<xs:element name="media" type="ss:media-type1" />
<xs:element name="communication-diverted" type="ss:empty-element-type" />
<xs:element name="rule-deactivated" type="ss:empty-element-type" />
<xs:element name="not-registered" type="ss:empty-element-type" />
<xs:element name="busy" type="ss:empty-element-type" />
<xs:element name="no-answer" type="ss:empty-element-type" />
<xs:element name="not-reachable" type="ss:empty-element-type" />
<xs:element name="roaming" type="ss:empty-element-type" />
 
<!-- service specific type declarations -->
<xs:simpleType name="media-type1">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="presence-status-activity-type">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:complexType name="empty-element-type"/>
<!-- ETSI substitutionGroup workaround, because TTCN-3 does not support mapping of substitutionGroup -->
<xs:group name="absServiceGroup">
<xs:choice>
<!-- default -->
<xs:element ref="ss:absService"/>
<!-- TIP-TRI -->
<xs:element ref="ss:terminating-identity-presentation-restriction"/>
<xs:element ref="ss:terminating-identity-presentation"/>
<!-- OIP-OIR -->
<xs:element ref="ss:originating--identity--presentation--restriction"/>
<xs:element ref="ss:originating--identity--presentation"/>
<!-- CDIV -->
<xs:element ref="ss:communication-diversion"/>
<!-- ACR-CB -->
<xs:element ref="ss:incoming-communication-barring"/>
<xs:element ref="ss:outgoing-communication-barring"/>
<!-- CUG -->
<!-- <xs:element ref="cug"/> -->
</xs:choice>
</xs:group>
<!-- service specific type declarations -->
<xs:simpleType name="media-type1">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:simpleType name="presence-status-activity-type">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:complexType name="empty-element-type" />
 
<!-- ETSI substitutionGroup workaround, because TTCN-3 does not support
mapping of substitutionGroup -->
<xs:group name="absServiceGroup">
<xs:choice>
<!-- default -->
<xs:element ref="ss:absService" />
<!-- TIP-TRI -->
<xs:element
ref="ss:terminating-identity-presentation-restriction" />
<xs:element ref="ss:terminating-identity-presentation" />
<!-- OIP-OIR -->
<xs:element
ref="ss:originating--identity--presentation--restriction" />
<xs:element ref="ss:originating--identity--presentation" />
<!-- CDIV -->
<xs:element ref="ss:communication-diversion" />
<!-- ACR-CB -->
<xs:element ref="ss:incoming-communication-barring" />
<xs:element ref="ss:outgoing-communication-barring" />
<!-- CUG -->
<!-- <xs:element ref="cug"/> -->
</xs:choice>
</xs:group>
 
</xs:schema>
/trunk/xsd/xdm_commonPolicy-v1_0.xsd
1,107 → 1,73
<?xml version="1.0" encoding="UTF-8"?>
 
<!--
XDM - Common Policy
version - 1.0
date - 27 Jun 2008
<!-- XDM - Common Policy version - 1.0 date - 27 Jun 2008 FILE INFORMATION
OMA Permanent Document File: OMA-SUP-XSD_xdm_commonPolicy-V1_0_2-20080627-A
Type: Text - Schema Description Public Reachable Information Path: http://www.openmobilealliance.org/tech/profiles
Name: xdm_commonPolicy-v1_0.xsd NORMATIVE INFORMATION Information about this
file can be found in the specification OMA-TS-XDM_Core-V1_1 available at
http://www.openmobilealliance.org/ Send comments to technical-comments@mail.openmobilealliance.org
LEGAL DISCLAIMER Use of this document is subject to all of the terms and
conditions of the Use Agreement located at http://www.openmobilealliance.org/UseAgreement.html
You may use this document or any part of the document for internal or educational
purposes only, provided you do not modify, edit or take out of context the
information in this document in any manner. Information contained in this
document may be used, at your sole risk, for any purposes. You may not use
this document in any other manner without the prior written permission of
the Open Mobile Alliance. The Open Mobile Alliance authorizes you to copy
this document, provided that you retain all copyright and other proprietary
notices contained in the original materials on any copies of the materials
and that you comply strictly with these terms. This copyright permission
does not constitute an endorsement of the products or services. The Open
Mobile Alliance assumes no responsibility for errors or omissions in this
document. Each Open Mobile Alliance member has agreed to use reasonable endeavors
to inform the Open Mobile Alliance in a timely manner of Essential IPR as
it becomes aware that the Essential IPR is related to the prepared or published
specification. However, the members do not have an obligation to conduct
IPR searches. The declared Essential IPR is publicly available to members
and non-members of the Open Mobile Alliance and may be found on the "OMA
IPR Declarations" list at http://www.openmobilealliance.org/ipr.html. The
Open Mobile Alliance has not conducted an independent IPR review of this
document and the information contained herein, and makes no representations
or warranties regarding third party IPR, including without limitation patents,
copyrights or trade secret rights. This document may contain inventions for
which you must obtain licenses from third parties before making, using or
selling the inventions. Defined terms above are set forth in the schedule
to the Open Mobile Alliance Application Form. NO REPRESENTATIONS OR WARRANTIES
(WHETHER EXPRESS OR IMPLIED) ARE MADE BY THE OPEN MOBILE ALLIANCE OR ANY
OPEN MOBILE ALLIANCE MEMBER OR ITS AFFILIATES REGARDING ANY OF THE IPR'S
REPRESENTED ON THE "OMA IPR DECLARATIONS" LIST, INCLUDING, BUT NOT LIMITED
TO THE ACCURACY, COMPLETENESS, VALIDITY OR RELEVANCE OF THE INFORMATION OR
WHETHER OR NOT SUCH RIGHTS ARE ESSENTIAL OR NON-ESSENTIAL. THE OPEN MOBILE
ALLIANCE IS NOT LIABLE FOR AND HEREBY DISCLAIMS ANY DIRECT, INDIRECT, PUNITIVE,
SPECIAL, INCIDENTAL, CONSEQUENTIAL, OR EXEMPLARY DAMAGES ARISING OUT OF OR
IN CONNECTION WITH THE USE OF DOCUMENTS AND THE INFORMATION CONTAINED IN
THE DOCUMENTS. Copyright 2008 Open Mobile Alliance Ltd. All Rights Reserved.
Used with the permission of the Open Mobile Alliance Ltd. under the terms
set forth above. -->
 
FILE INFORMATION
 
OMA Permanent Document
File: OMA-SUP-XSD_xdm_commonPolicy-V1_0_2-20080627-A
Type: Text - Schema Description
 
Public Reachable Information
Path: http://www.openmobilealliance.org/tech/profiles
Name: xdm_commonPolicy-v1_0.xsd
 
NORMATIVE INFORMATION
 
Information about this file can be found in the specification
OMA-TS-XDM_Core-V1_1
available at http://www.openmobilealliance.org/
 
Send comments to technical-comments@mail.openmobilealliance.org
 
LEGAL DISCLAIMER
 
Use of this document is subject to all of the terms and conditions
of the Use Agreement located at
http://www.openmobilealliance.org/UseAgreement.html
 
You may use this document or any part of the document for internal
or educational purposes only, provided you do not modify, edit or
take out of context the information in this document in any manner.
Information contained in this document may be used, at your sole
risk, for any purposes.
 
You may not use this document in any other manner without the prior
written permission of the Open Mobile Alliance. The Open Mobile
Alliance authorizes you to copy this document, provided that you
retain all copyright and other proprietary notices contained in the
original materials on any copies of the materials and that you
comply strictly with these terms. This copyright permission does
not constitute an endorsement of the products or services. The
Open Mobile Alliance assumes no responsibility for errors or
omissions in this document.
 
Each Open Mobile Alliance member has agreed to use reasonable
endeavors to inform the Open Mobile Alliance in a timely manner of
Essential IPR as it becomes aware that the Essential IPR is related
to the prepared or published specification. However, the members
do not have an obligation to conduct IPR searches. The declared
Essential IPR is publicly available to members and non-members of
the Open Mobile Alliance and may be found on the "OMA IPR
Declarations" list at http://www.openmobilealliance.org/ipr.html.
The Open Mobile Alliance has not conducted an independent IPR review
of this document and the information contained herein, and makes no
representations or warranties regarding third party IPR, including
without limitation patents, copyrights or trade secret rights. This
document may contain inventions for which you must obtain licenses
from third parties before making, using or selling the inventions.
Defined terms above are set forth in the schedule to the Open Mobile
Alliance Application Form.
 
NO REPRESENTATIONS OR WARRANTIES (WHETHER EXPRESS OR IMPLIED) ARE
MADE BY THE OPEN MOBILE ALLIANCE OR ANY OPEN MOBILE ALLIANCE MEMBER
OR ITS AFFILIATES REGARDING ANY OF THE IPR'S REPRESENTED ON THE "OMA
IPR DECLARATIONS" LIST, INCLUDING, BUT NOT LIMITED TO THE ACCURACY,
COMPLETENESS, VALIDITY OR RELEVANCE OF THE INFORMATION OR WHETHER OR
NOT SUCH RIGHTS ARE ESSENTIAL OR NON-ESSENTIAL.
 
THE OPEN MOBILE ALLIANCE IS NOT LIABLE FOR AND HEREBY DISCLAIMS ANY
DIRECT, INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL, CONSEQUENTIAL, OR
EXEMPLARY DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE OF
DOCUMENTS AND THE INFORMATION CONTAINED IN THE DOCUMENTS.
 
Copyright 2008 Open Mobile Alliance Ltd. All Rights Reserved.
Used with the permission of the Open Mobile Alliance Ltd. under the
terms set forth above.
-->
 
<xs:schema targetNamespace="urn:oma:xml:xdm:common-policy"
xmlns="urn:oma:xml:xdm:common-policy"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
xmlns="urn:oma:xml:xdm:common-policy" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
 
<!-- OMA specific "conditions" child elements -->
<xs:element name="other-identity" type="emptyType"/>
<!-- OMA specific "conditions" child elements -->
<xs:element name="other-identity" type="emptyType" />
 
<xs:element name="external-list">
<xs:complexType>
<xs:sequence>
<xs:element name="entry" type="anchorType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType>
<xs:sequence>
<xs:element name="entry" type="anchorType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
 
<xs:element name="anonymous-request" type="emptyType"/>
<xs:element name="anonymous-request" type="emptyType" />
 
<xs:complexType name="anchorType">
<xs:attribute name="anc" type="xs:anyURI"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
<xs:complexType name="anchorType">
<xs:attribute name="anc" type="xs:anyURI" />
<xs:anyAttribute processContents="lax" />
</xs:complexType>
 
<xs:complexType name="emptyType"/>
<xs:complexType name="emptyType" />
 
</xs:schema>
/trunk/xsd/xml.xsd
1,38 → 1,38
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xml:lang="en">
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
 
<xs:attribute name="lang">
<xs:simpleType>
<xs:union memberTypes="xs:language">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="lang">
<xs:simpleType>
<xs:union memberTypes="xs:language">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="" />
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
 
<xs:attribute name="space">
<xs:simpleType>
<xs:restriction base="xs:NCName">
<xs:enumeration value="default"/>
<xs:enumeration value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="base" type="xs:anyURI">
</xs:attribute>
<xs:attribute name="id" type="xs:ID">
</xs:attribute>
<xs:attribute name="space">
<xs:simpleType>
<xs:restriction base="xs:NCName">
<xs:enumeration value="default" />
<xs:enumeration value="preserve" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
 
<xs:attributeGroup name="specialAttrs">
<xs:attribute ref="xml:base"/>
<xs:attribute ref="xml:lang"/>
<xs:attribute ref="xml:space"/>
<xs:attribute ref="xml:id"/>
</xs:attributeGroup>
<xs:attribute name="base" type="xs:anyURI">
</xs:attribute>
 
<xs:attribute name="id" type="xs:ID">
</xs:attribute>
 
<xs:attributeGroup name="specialAttrs">
<xs:attribute ref="xml:base" />
<xs:attribute ref="xml:lang" />
<xs:attribute ref="xml:space" />
<xs:attribute ref="xml:id" />
</xs:attributeGroup>
</xs:schema>
/trunk/xsd
Property changes:
Added: svn:ignore
## -0,0 +1 ##
+ttcn3view
Index: trunk
===================================================================
--- trunk (revision 631)
+++ trunk (revision 632)
/trunk
Property changes:
Added: svn:ignore
## -0,0 +1 ##
+XSDAUX.ttcn
Added: svn:mergeinfo
## -0,0 +0,1 ##
Merged /branches/v3:r553-628