pax_global_header 0000666 0000000 0000000 00000000064 11340712073 0014510 g ustar 00root root 0000000 0000000 52 comment=43d0023a641ca834e5da15b6f611415b42919e73
LibSip-v1.4.0@446/ 0000775 0000000 0000000 00000000000 11340712073 0013420 5 ustar 00root root 0000000 0000000 LibSip-v1.4.0@446/ttcn/ 0000775 0000000 0000000 00000000000 11340712073 0014370 5 ustar 00root root 0000000 0000000 LibSip-v1.4.0@446/ttcn/LibSip_Interface.ttcn 0000664 0000000 0000000 00000020540 11340712073 0020425 0 ustar 00root root 0000000 0000000 /*
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-IMS tests. Module become from STF306 and STF334-336
*/
module LibSip_Interface language "TTCN-3:2005"//MRO
{
//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;
group AdressTypes
{
type record address4SIP
{
//HostPort
charstring host optional, // hostname, IPv4 or IPv6
integer portField optional // represented as an integer
} with { encode "SIPCodec" }
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
type component SipComponent
{
//port
port SipPort SIPP;
// used for communication with the operator
port operatorPort opPort;
// 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 RecordRoute vc_recordRoute; // value of RecordRoute header
var boolean vc_boo_recordRoute := false; // boolean indicates valid recordRoute
var Route vc_route; // value of Route header
var 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
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 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 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;
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_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 v_white_space := false;//MRO
// ETS address
var address v_ets_label := { host := PX_SIP_TS1_IPADDR, portField := PX_SIP_TS1_PORT};
// 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;
} // end SipComponent
} // end module LibSip_Interface
LibSip-v1.4.0@446/ttcn/LibSip_PIXITS.ttcn 0000664 0000000 0000000 00000030376 11340712073 0017555 0 ustar 00root root 0000000 0000000 /*
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-IMS tests. Module become from STF306 and STF334-336
* 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
*/
module LibSip_PIXITS language "TTCN-3:2005"//MRO
{
//LibCommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
// _____________________________ PIXIT-S_______________________________
group SIP_PIXITparameters{
group SDPParameter {
modulepar {
/** @desc charstring for SDP dynamic port
*/
charstring PX_SIP_SDP_dyn := "0";
/** @desc charstring for SDP bandwidth modifier
*/
charstring PX_SIP_SDP_b_modifier := "AS";
/** @desc integer for SDP bandwidth value
*/
integer PX_SIP_SDP_b_bandwidth := 64;
/** @desc charstring for SDP media attribute encoding supported by the IUT
*/
charstring PX_SIP_SDP_encoding := "PCMU/8000";
/** @desc charstring for SDP media attribute encoding unavailable by the IUT
*/
charstring PX_SIP_SDP_encoding_unavail := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
/** @desc charstring for SDP media attribute encoding unsupported by the IUT
*/
charstring PX_SIP_SDP_encoding_unsup := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
/** @desc charstring for SDP media T.38 transport (used in TC2101_IS___AU__09)
*/
charstring PX_SIP_SDP_transport := "udptl";
} // modulepar
} //group SDP Parameter
group ISUPinterworkingParameters{
modulepar {
/** @desc charstring for Used CPC language
*/
charstring PX_SIP_ISUP_LANGUAGE := "English";
/** @desc charstring for Used CPC language
*/
charstring PX_SIP_ISUP_CPC_VALUE := "prison";
}//modulepar
} // goup PSTNParameters
group SupportedOptions{
modulepar {
/** @desc boolean for True if 100rel mechanism is supported in SIP
*/
boolean PX_SIP_100rel := false;
/** @desc boolean for True if precondition mechanism is supported in SIP
*/
boolean PX_SIP_precondition := false;
/** @desc boolean for True if UDP Transport is used by the IUT to run campaign
*/
boolean PX_SIP_UDP := true;
/** @desc charstring for Used Transport in upper case "UDP"/"TCP"
*/
charstring PX_SIP_TRANSPORT := "UDP";
}//modulepar
}// 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{
modulepar{
/** @desc integer for SUT port number to exchange SIP messages
*/
integer PX_SIP_SUT_PORT := 5060;
/** @desc charstring for SUT IP address to exchange SIP messages
*/
charstring PX_SIP_SUT_IPADDR := "172.27.16.115";
/** @desc charstring for SUT domain
*/
charstring PX_SIP_SUT_HOME_DOMAIN := "172.27.16.115";
/** @desc charstring for unknown SUT domain
*/
charstring PX_SIP_SUT_HOME_DOMAIN_UNKNOWN := "172.88.88.88";
} //modulepar
}
// 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
modulepar {
/** @desc integer for port number used by the TS1 to exchange SIP messages
*/
integer PX_SIP_TS1_PORT := 5060;
/** @desc charstring for IP address used by the TS1 to exchange SIP messages
*/
charstring PX_SIP_TS1_IPADDR := "172.27.1.218";
/** @desc charstring for identity of the tester local domain
*/
charstring PX_SIP_TS1_LOCAL_DOMAIN := "172.27.1.218";
/** @desc charstring for identity of the tester local user
*/
charstring PX_SIP_TS1_LOCAL_USER := "2910";
/** @desc charstring for identity of the user with active call diversion service
*/
charstring PX_SIP_TS1_LOCAL_USER_DIV := "2907";
/** @desc charstring for identity of the tester local user (format "+"cc+ndc+sn)
*/
charstring PX_SIP_TS1_LOCAL_USER_FULL := "+ 33492941111";
/** @desc integer for port number used by the TS to exchange media streams
*/
integer PX_SIP_TS1_BEARER_PORT := 52000;
/** @desc charstring for port number used by the TS to exchange media streams
*/
integer PX_SIP_TS1_BEARER_PORT2 := 62000;
/** @desc charstring for IP address used by the TS to exchange media streams
*/
charstring PX_SIP_TS1_BEARER_IPADDR := "172.27.1.218";
}//modulepar
}// group PortsAndAddressesOfTheTS
// 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
modulepar {
/** @desc integer for port number used by the TS2 to exchange SIP messages
*/
integer PX_SIP_TS2_PORT := 5060;
/** @desc charstring for IP address used by the TS2 to exchange SIP messages
*/
charstring PX_SIP_TS2_IPADDR := "172.27.1.219";
/** @desc charstring for identity of the tester local domain
*/
charstring PX_SIP_TS2_LOCAL_DOMAIN := "172.27.1.219";
/** @desc charstring for identity of the tester local user
*/
charstring PX_SIP_TS2_LOCAL_USER := "2911";
/** @desc charstring for identity of the user with active call diversion service
*/
charstring PX_SIP_TS2_LOCAL_USER_DIV := "2011";
/** @desc charstring for identity of the tester local user (format "+"cc+ndc+sn)
*/
charstring PX_SIP_TS2_LOCAL_USER_FULL := "+ 33 4 92941111";
/** @desc integer for port number used by the TS to exchange media streams
*/
integer PX_SIP_TS2_BEARER_PORT := 53000;
/** @desc integer for port number used by the TS to exchange media streams
*/
integer PX_SIP_TS2_BEARER_PORT2 := 63000;
/** @desc charstring for IP address used by the TS to exchange media streams
*/
charstring PX_SIP_TS2_BEARER_IPADDR := "172.27.1.218";
} // modulepar
}//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
modulepar{
/** @desc integer for Port number used by the TS3 to exchange SIP messages
*/
integer PX_SIP_TS3_PORT := 5060;
/** @desc charstring for IP address used by the TS3 to exchange SIP messages
*/
charstring PX_SIP_TS3_IPADDR := "172.27.1.220";
/** @desc charstring for identity of the tester local domain
*/
charstring PX_SIP_TS3_LOCAL_DOMAIN := "172.27.1.220";
/** @desc charstring for identity of the tester local user
*/
charstring PX_SIP_TS3_LOCAL_USER := "2012";
} //modulepar
} //group PortsAndAddressesOfTheTS3
group RegistrationParameters {
modulepar {
/** @desc boolean for the SIP user if it have to register itself before executing a test case
*/
boolean PX_SIP_REGISTRATION := false;
/** @desc integer for the minimun SIP user registration expires-value
*/
integer PX_SIP_REGISTRATION_exp_min := 3600;
/** @desc charstring for REGISTRAR domain
*/
charstring PX_SIP_SUT_REGISTRAR_DOMAIN := "172.27.16.115";
}// modulepar
}// group Registration parameters
group ReleaseCause{
modulepar {
/** @desc integer for Release cause to be used in BYE and in Failure messages
*/
integer PX_SIP_BYE_CAUSE := 16;
}//modulepar
}//group ReleaseCause
group RTPStreamControlAndCheck{
modulepar {
/** @desc boolean for True, if conversation check is implemented.
*/
boolean PX_SIP_CheckConversation := false;
/** @desc boolean for True, if DTMF check is implemented.
*/
boolean PX_SIP_CheckDTMF := false;
/** @desc boolean for True, if Announcement sending is implemented.
*/
boolean PX_SIP_SendAnnouncement := false;
/** @desc boolean for True, if ringing check is implemented.
*/
boolean PX_SIP_CheckRinging := false;
}//modulepar
}//group RTPStreamControlAndCheck
group SwitchToEnableAuthentication {
modulepar{
/** @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages
*/
boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
/** @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages
*/
boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
}
}
// 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 {
modulepar{
/** @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 PX_SIP_SUT_UE1_QOP := "auth";
/** @desc charstring for RFC 2617 3.2.2 username
* The name of user in the specified realm
*/
charstring PX_SIP_SUT_UE1_USERNAME := "abcd";
/** @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
*/
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.
*/
charstring PX_SIP_SUT_UE2_QOP := "auth";
/** @desc charstring for RFC 2617 3.2.2 username
* The name of user in the specified realm
*/
charstring PX_SIP_SUT_UE2_USERNAME := "abcd";
/** @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
*/
charstring PX_SIP_SUT_UE2_PASSWD := "1234";
}//modulepar
}//group ParametersForHTTP_Authentication
group SIP_Timers {
modulepar {
/** @desc float for T1 RTT estimate (500 ms)
*/
float PX_SIP_T1 := 0.5;
/** @desc float for T2 Maximum retransmit interval for non-INVITE requests and INVITE response (4000 ms)
*/
float PX_T2 := 4.0;
/** @desc float for T4 Maximum duration a message will remain in the network
*/
float PX_T4 := 1.0;
/** @desc float for TDELAY default value for timeout on outgoing SIP request (ie 64*T1)
*/
float PX_SIP_TF := 32.0;
/** @desc float for TWait default value for waiting an operator action
*/
float PX_SIP_TWAIT := 30.0;
/** @desc float for TAck default value for waiting an acknowledgement
*/
float PX_SIP_TACK := 8.0;
/** @desc float for TResp default value for waiting for a response from the IUT
*/
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))
*/
float PX_SIP_TNOACT := 1.0;
/** @desc float for TSYNC default value to synchronise ptc
*/
float PX_SIP_TSYNC := 10.0;
/** @desc float for TGUARD default value for an extra long timer to limit test execution
*/
float PX_SIP_TGUARD := 120.0;
/** @desc float for TRespRetention minimum time that a Proxy will wait before sending a final response
*/
float PX_TRespRetention := 1.0;
}//modulepar
}//group SIP_Timers
} //group SIP_PIXITparameters
} // end module LibSip_PIXITS
LibSip-v1.4.0@446/ttcn/LibSip_SDPTypes.ttcn 0000664 0000000 0000000 00000022455 11340712073 0020207 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module defines message, attribute, structured and simple
* SDP types as well constants used by LipSip constructs.
* 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
* @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 language "TTCN-3:2005"//MRO
{
group Constants
{
group SimpleConstants
{
// SDP net_type
const charstring c_in := "IN";
// SDP addr_type
const charstring c_ip4 := "IP4";
// SDP_media_desc: media
const charstring c_audio := "audio";
const charstring c_image := "image";
const charstring c_video := "video";
// SDP_media_desc: transport
const charstring c_rtpAvp := "RTP/AVP";
const charstring c_udptl := "Udptl";
// SDP_attribute_list constants:
const charstring c_local := "local";
const charstring c_mandatory := "mandatory";
const charstring c_none := "none";
const charstring c_qos := "qos";
const charstring c_remote := "remote";
const charstring c_sendrecv := "sendrecv";
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
}
type record SDP_attribute_keywds {
charstring attr_value
}
type record SDP_attribute_tool {
charstring attr_value
}
type record SDP_attribute_ptime {
charstring attr_value
}
type record SDP_attribute_recvonly {
}
type record SDP_attribute_sendrecv {
}
type record SDP_attribute_sendonly {
}
type record SDP_attribute_inactive {
}
type record SDP_attribute_orient {
charstring attr_value
}
type record SDP_attribute_type {
charstring attr_value
}
type record SDP_attribute_charset {
charstring attr_value
}
type record SDP_attribute_sdplang {
charstring attr_value
}
type record SDP_attribute_lang {
charstring attr_value
}
type record SDP_attribute_framerate {
charstring attr_value
}
type record SDP_attribute_quality {
charstring attr_value
}
type record SDP_attribute_fmtp {
charstring attr_value
}
type record SDP_attribute_curr {
charstring preconditionType,
charstring statusType,
charstring direction
}
type record SDP_attribute_des {
charstring preconditionType,
charstring strength,
charstring statusType,
charstring direction
}
type record SDP_attribute_conf {
charstring preconditionType,
charstring statusType,
charstring direction
}
type record SDP_attribute_rtpmap {
charstring attr_value
}
type record SDP_attribute_rtcp {
charstring attr_value
}
type record SDP_attribute_unknown {
charstring name,
charstring attr_value 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,
//* 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
}
type set of SDP_bandwidth SDP_bandwidth_list;
type record SDP_connection {
charstring net_type,
charstring addr_type,
SDP_conn_addr conn_addr
}
type record SDP_conn_addr {
charstring addr,
integer ttl optional,
integer num_of_addr optional
}
type set of SDP_connection SDP_connection_list;
type record SDP_contact {
charstring addr_or_phone,
charstring disp_name optional
}
type SDP_contact SDP_contact_tel;
type SDP_contact SDP_contact_email;
type set of SDP_contact_email SDP_email_list;
type record of charstring SDP_fmt_list ;
type record SDP_key {
charstring method,
charstring key optional
}
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 set of SDP_media_desc SDP_media_desc_list;
type record SDP_media_port {
integer port_number,
integer num_of_ports optional
}
type record SDP_media_field {
charstring media,
SDP_media_port ports,
charstring transport,
SDP_fmt_list fmts
}
type record SDP_time{
SDP_time_field time_field,
SDP_repeat_list time_repeat optional
}
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_repeat{
SDP_typed_time repeat_interval,
SDP_typed_time active,
SDP_typed_time_list offsets
}
type set of SDP_repeat SDP_repeat_list;
type record SDP_typed_time{
integer time,
charstring unit optional
}
type set of SDP_typed_time SDP_typed_time_list;
type set of SDP_time SDP_time_list;
type record SDP_timezone{
charstring adjustment_time,
SDP_typed_time offset
}
type set of SDP_timezone SDP_timezone_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
}
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
} // group Types
} // end module LibSip_SDPTypes
LibSip-v1.4.0@446/ttcn/LibSip_SIPTypesAndValues.ttcn 0000664 0000000 0000000 00000152255 11340712073 0022021 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module defines message, header, structured and simple SIP
* types as well constants used by LipSip constructs.
* 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
* @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 language "TTCN-3:2005"//MRO
{
// Lib Common
import from LibCommon_TextStrings {const c_CRLF};
// SipAts
import from LibSip_SDPTypes all;
import from LibSip_XMLTypes all;
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";
// 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";
// MIME name application
const charstring c_mimeMultipart := "multipart/mixed";
// IMS 3GPP name application
const charstring c_ims3gppAplication := "application/3gpp-ims+xml";
// IMS 3GPP name CW application
const charstring c_ims3gppCwApplication := "application/vnd.3gpp.cw+xml";
// IMS ETSI name MCID application
const charstring c_imsEtsiMcidApplication := "application/vnd.etsi.mcid+xml";
// IMS ETSI name CUG application
const charstring c_imsEtsiCugApplication := "application/vnd.etsi.cug+xml";
// 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";
// PLAIN-TEXT name application
const charstring c_plainText := "text/plain";
//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"&
c_CRLF;
// 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";
// ([RFC3891]Sec 6.1)
const charstring c_earlyFlag := "early-only";
// 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";
// 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";
// @ (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);
// * (wildchard) sign
const charstring c_WILDCARD := "*";
const integer c_CRlen := 2; // length of new line (0d0a)
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"}
} //end group SimpleConstants
group AuthorizationConstants {
const charstring c_ik := "";
const charstring c_ck := "";
const charstring c_algorithm := "MD5";
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";
} //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,
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,
userInfo := omit ,
hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort},
urlParameters := omit,
headers := omit
};
const SipUrl c_unavailableUri :=
{
scheme := c_sipScheme,
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,
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
}
}};
}
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 long"};
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 doesnot 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 timeout"};
const StatusLine c_statusLine505 := {c_sipNameVersion, 505, "Version not supported"};
const StatusLine c_statusLine513 := {c_sipNameVersion, 513, "Message too long"};
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_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,
// [3326]
REASON_E,
// [3515] - REFER method
REFER_TO_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,
// [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
}
// [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
}
// [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]
/**
*
* @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 SipUrl
{
charstring scheme, // e.g "sip" or "tel"
UserInfo userInfo optional,
HostPort hostPort optional,
SemicolonParam_List urlParameters optional,
AmpersandParam_List headers optional
}
// [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;
type Addr_Union PAssertedIDValue;
type record of PAssertedIDValue PAssertedIDValue_List;
type charstring PAssertedServiceValue;
type Addr_Union PPreferredIDValue;
type record of PPreferredIDValue PPreferredIDValue_List;
type charstring PrivacyValue;
type record of PrivacyValue PrivacyValue_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
group RFC3265HeaderFieldTypes
{
// [3265/7.2]
type record AllowEvents {
FieldName fieldName(ALLOW_EVENTS_E),
EventType_List eventTypes
}
type set of EventType EventType_List;
type charstring EventType;
// [3265/7.2]
type record Event {
FieldName fieldName(EVENT_E),
EventType eventType,
SemicolonParam_List eventParams optional
}
// [3265/7.2]
type record SubscriptionState {
FieldName fieldName(SUBSCRIPTION_STATE_E),
SubState subState,
SemicolonParam_List substateParams optional
}
type charstring SubState;
}//end group RFC3265HeaderFieldTypes
group RFC3313HeaderFieldTypes
{
// [3313/5]
type record PMediaAuthorization {
FieldName fieldName(P_MEDIA_AUTHORIZATION_E),
PMediaAuthorization_List pMediaAuthorizations
}
type charstring PMediaAuthValue; //HEXDIG "0"-"9", "A"-"F"
type record of PMediaAuthValue PMediaAuthorization_List;
}//end group RFC3265HeaderFieldTypes
group RFC3323HeaderFieldTypes
{
// [3323]
type record Privacy {
FieldName fieldName(PRIVACY_E),
PrivacyValue_List privValueList
}
}//end group RFC3323HeaderFieldTypes
group RFC3325HeaderFieldTypes
{
// [3325]
type record PAssertedID {
FieldName fieldName(P_ASSERTED_ID_E),
PAssertedIDValue_List pAssertedIDValueList
}
// [3325]
type record PPreferredID {
FieldName fieldName(P_PREFERRED_ID_E),
PPreferredIDValue_List pPreferredIDValueList
}
}//end group RFC3325HeaderFieldTypes
group RFC3326HeaderFieldTypes
{
//[3326]
type record of ReasonValue ReasonValues;
type record ReasonValue {
charstring token,
SemicolonParam_List reasonParams optional
}
type record Reason {
FieldName fieldName(REASON_E),
ReasonValues reasonValues
}
}//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 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),
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
}
}// end group RFC3841HeaderFieldTypes
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
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
}
}//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
}
} // 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,
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
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,
ReferredBy referredBy optional, // 3892 - REFER method
ReferTo referTo optional, // 3515 - 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
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
} 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"}
type record INVITE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
type record OPTIONS_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
type record BYE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
type record CANCEL_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
type record ACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
// [3262/7.1]
type record PRACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
// [3265/7.1]
type record NOTIFY_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
// [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" }
// [3311/7]
type record UPDATE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
//
type record REFER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
//
type record MESSAGE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec" }
//
type record INFO_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
} with { encode "SIPCodec"}
} //with { encode "SIPCodec" }// 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
} with { encode "SIPCodec"}
} //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
group MessageBodyTypes
{
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)
};
} // end group MessageBodyTypes
group MIMETypes
{
group SubMIMETypes
{
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
}
}//end group SubMIMETypes
group MessageTypes {
type record MIME_Message {
charstring boundary, // len:
MimeEncapsulatedList mimeEncapsulatedList
}
type record of MIME_Encapsulated_Part MimeEncapsulatedList;
} // group MessageTypes
} // group MIMETypes
}// end group MSGTypes
}// end group Types
} // end module LibSip_TypesAndValues
LibSip-v1.4.0@446/ttcn/LibSip_Steps.ttcn 0000664 0000000 0000000 00000375411 11340712073 0017635 0 ustar 00root root 0000000 0000000 /*
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-IMS tests.
*/
module LibSip_Steps language "TTCN-3:2005"//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 {
//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;
// 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;
}
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);
}
/**
*
* @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) 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.
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
}};
return 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";
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=md5", 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 v_result;
}
/**
*
* @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";
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=md5", 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;
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 := 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
}
};
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";
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=md5", 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 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;
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;
}
}
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
group FieldOperations {
/**
*
* @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);
}
/**
*
* @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 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));
}
/**
*
* @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) 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 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
// 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.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 (ispresent(p_message.msgHeader.recordRoute)) {
if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.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.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 := p_request.msgHeader.via.viaBody[1].viaParams[0]; // second element
if (not v_viaParameter.id == "tokenized-by")
{return(false)};
return(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;
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
if (not v_viaParameter.id == "tokenized-by")
{return(false)}
}
return(true);
}
group SetHeaders {
/**
*
* @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
{
var SemicolonParam_List v_params;
p_cSeq_s.fieldName := CSEQ_E;
p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
p_cSeq_s.method := p_method ;
vc_cSeq := p_cSeq_s;
vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
vc_branch := c_branchCookie & f_getRndTag();
vc_via:={
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
}// end function f_setHeadersGeneral
/**
*
* @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 };
f_addTagInTo(vc_to);
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.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
{
p_cSeq_s.method := "CANCEL";
//vc_branch := c_branchCookie & f_getRndTag();
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) runs on SipComponent
{
var SemicolonParam_List v_params;
f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
vc_requestUri:=
{
scheme := c_sipScheme,
userInfo := omit,
hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit},
urlParameters := omit,
headers := omit
};
vc_reqHostPort := vc_requestUri.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)
{
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
/**
*
* @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,
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.
{
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,
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
vc_requestUri:=
{
scheme := c_sipScheme,
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_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(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.hostPort;
}// 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
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.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(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.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
//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.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.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.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
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.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.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 (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 (ispresent(p_Request.msgHeader.authorization)) {
vc_authorization := 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 (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
/**
*
* @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);
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 (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; i0; 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 := 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;
}
} // 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(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))
{
vc_reqHostPort := vc_to.addressField.nameAddr.addrSpec.hostPort;
vc_requestUri := vc_to.addressField.nameAddr.addrSpec;
}
else
{
vc_reqHostPort := vc_to.addressField.addrSpecUnion.hostPort;
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;
};
// 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)
};
};
// 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};
//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 ( ischosen(p_response.messageBody.xmlBody))
{
vc_xml_remote := p_response.messageBody.xmlBody;
}
if ( ischosen(p_response.messageBody.mimeMessageBody))
{
for (var integer j:=0; j0)
{
// 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 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 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 value v_request sender vc_sent_label
{
tc_wait.stop;
f_setHeadersOnReceiptOfREGISTER(v_request);
}
[] tc_wait.timeout
{
setverdict (fail);
f_componentStop();
}
}
}
/**
*
* @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);
}
}
}
/**
*
* @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();};
}
[] tc_wait.timeout
{
setverdict (fail);
f_componentStop();
}
}
}
/**
*
* @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
{
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 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;
}
}
} //end f_awaitingINVITE
/**
*
* @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 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
/**
*
* @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
{
tc_ack.stop;
}
}
} //end f_awaitingAckRequest
/**
*
* @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
/**
*
* @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 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
* 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();
}
}
} // 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_setHeadersOnReceiptOfRequest(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 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;
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(template PRACK_Request p_request) runs on SipComponent
{
f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via
vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
SIPP.send(p_request) 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
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;
}
} // 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("component terminated - forced!");
deactivate;
stop;
}
/**
*
* @desc component termination
*/
function f_componentStop() runs on SipComponent
{
syncPort.send(m_syncClientStop);
SIPP.clear;
stop;
}
/**
*
* @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 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 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
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) runs on SipComponent
{
if (PX_SIP_REGISTRATION)
{
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(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 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);
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg,
p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0");
v_request.msgHeader.route := f_route();
f_SendREGISTER(v_request);
if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED)
{
// receiving 401 Unauthorized response.
// and Re-send REGISTER request with Authorization header
tc_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);
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg,
p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0");
v_request.msgHeader.route := f_route();
// Re-send protected REGISTER
f_SendREGISTER(v_request);//LibSip
// awaiting 200 OK REGISTER
f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
}
[] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq))-> value vc_response
{
tc_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 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
}//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
{
//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 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
{
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(p_notify);
}//end function f_Subscription
/**
*
* @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;
}
[] 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);
}
}
// TODO check how to solve sending of NOTIFY on SUBSCRIBE
}//end function f_awaitingSubscription
}//end group Subscription
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 {
/**
*
* @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
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;
}
}
}
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));
}
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));
}
} // end group Postambles
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;}
}
}
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
*
*/
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;}
}
}
f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict());
return
} // end of f_check_Ringing
/*
* @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;}
}
}
f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict());
return
} // end of f_check_AnnouncementUE_A
/*
* @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;}
}
}
f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict());
return
} // end of f_check_Announcement
/*
* @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;}
}
}
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;}
}
}
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: 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 ;
}
}
/**
*
* @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);
}
// 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,vc_callId, vc_cSeq))
{
repeat
}
// ignore 181 if flag is set (following TS 183004 §4.5.2.1)
[vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181,vc_callId, vc_cSeq))-> value v_response sender vc_sent_label
{
f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response);
repeat;
}
// according to SIP chap.8.1.3.2
[] SIPP.receive(mw_Response_Base(c_statusLine183,vc_callId, vc_cSeq))
{
repeat;
}
// ignore 484 if flag is set
[vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484,vc_callId, vc_cSeq))
{
repeat
}
[vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx,vc_callId, ?))-> value v_response sender vc_sent_label
{
f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response);
f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
repeat
}
[vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?))
{
repeat
}
[] SIPP.receive(mw_INFO_Request_Base(vc_callId))->value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
repeat
}
// awaiting of Notify
[] SIPP.receive(mw_NOTIFY_Request_Base(vc_callId))->value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
repeat
}
// awaiting of subscribe from UE
[vc_ignore_subscribe] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
}
//awaiting of subscribe on proxy
[] SIPP.receive(mw_SUBSCRIBE_Request_Base)->value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfRequest(v_request);
f_sendResponse(m_Response_Contact(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact));
//f_setHeadersGeneral(vc_cSeq, "NOTIFY"); // cseq, contact, branch, via
//f_SendNOTIFY(m_NOTIFY_Request_contact(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_contact));
log(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec);
f_SendNOTIFY(m_NOTIFY_Request_contact(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact));
f_awaitingOkResponse(vc_cSeq);
repeat
}
// unexpected BYE is acknowledged to avoid retransmissions
[] SIPP.receive(mw_BYE_Request_Base(?))-> value v_request sender vc_sent_label
{
setverdict(fail);
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
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);
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);
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;
}
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
LibSip-v1.4.0@446/ttcn/LibSip_Templates.ttcn 0000664 0000000 0000000 00000277610 11340712073 0020477 0 ustar 00root root 0000000 0000000 /*
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module defines SIP Templates for message, header, and
* structured types.
* 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
* @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;
//LibXMLTypes
import from ietf_params_xml_ns_resource_lists language "XSD" all
with {
extension "File:../xsd/ResourceList.xsd"
}
import from org_etsi_uri__ngn_params_xml_simservs_xcap language "XSD" all
with {
extension "File:../xsd/SupplementaryServices.xsd"
}
import from org_etsi_uri__ngn_params_xml_simservs_mcid language "XSD" all
with {
extension "File:../xsd/MCID.xsd"
}
import from Ims3gpp language "XSD" all
with {
extension "File:../xsd/Ims3gpp.xsd"
}
import from ietf_params_xml_ns_conference_info language "XSD" all
with {
extension "File:../xsd/CONF.xsd"
}
import from org_etsi_uri__ngn_params_xml_simservs_pstn language "XSD" all
with {
extension "File:../xsd/PSTN.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
}
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 CommaParam_List mw_digestResponse(template GenericParam p_genericParam) :=
superset(p_genericParam); //* c_Integrity_protected_yes
template SemicolonParam_List m_cpc :=
{{"cpc",PX_SIP_ISUP_CPC_VALUE}};
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 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 SentProtocol m_SentProtocol (charstring p_protocol) :=
{protocolName := c_sipName,
protocolVersion:= c_sipVersion,
transport:= p_protocol};
template SipUrl m_SipUrl_currDomain(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "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 SipUrl m_SipUrl_contactIpaddr(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "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 SipUrl m_SipUrl_contactIpaddrAndCpc(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "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 SipUrl m_SipUrl_currIpaddr(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "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"
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"
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* 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 SipUrl mw_TelUrl :=
{
scheme := c_telScheme,
userInfo := *,
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl :=
{
scheme := c_sipScheme,
userInfo := *,
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_TelSip_unavailableInvalidUri :=
{
scheme := (c_telScheme,c_sipScheme),
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort},
urlParameters := omit,
headers := omit
};
template SipUrl mw_TelSip_unavailableUri (charstring p_host):=
{
scheme := (c_telScheme,c_sipScheme),
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:=p_host, portField:=c_defaultSipPort},
urlParameters := omit,
headers := omit
};
template SipUrl mw_SipUrl_Number(charstring p_number) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_TelSipUrl_Number(template charstring p_number) := //* SIP-URL with a calling party number
{
scheme := (c_telScheme,c_sipScheme), //* contains "sip" or "tel"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*}, //* nat or int format
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl_Host(charstring p_host) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= *,
hostPort := {host:=p_host, portField:=*},
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl_NumberHost(charstring p_number, charstring p_host) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*},
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"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*},
urlParameters := p_urlParameters,
headers := *
};
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"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=c_defaultSipPort},
urlParameters := p_urlParameters,
headers := omit
};
template SipUrl mw_SipUrl_Anonymous := //* SIP-URL with a calles party number
{
scheme := c_sipScheme, //* contains "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"
userInfo:= *,
hostPort := *,
urlParameters := p_urlParameters,
headers := *
};
template ContactAddress mw_ContactAddress :=
{
addressField := ?,
contactParams := *
};
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 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"
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"
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)
}
} //* end group Subfields
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 GenericParam m_Cause (template charstring p_cause):=
{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 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 Authorization m_Authorization_other :=
{
fieldName := AUTHORIZATION_E,
body := {{otherResponse := ?}}
}
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 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 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 Event m_Event_conference :=
{
fieldName := EVENT_E,
eventType := "conference",
eventParams := omit
};
template Event m_Event_presence :=
{
fieldName := EVENT_E,
eventType := "presence",
eventParams := omit
};
template Event m_Event_reg :=
{
fieldName := EVENT_E,
eventType := "reg",
eventParams := omit
};
template Event m_Event_cdiv :=
{
fieldName := EVENT_E,
eventType := "comm-div-info",
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 Expires m_Expires (charstring p_deltaSec):=
{
fieldName := EXPIRES_E,
deltaSec := p_deltaSec
};
template PAssertedID m_PAssertedID(template Addr_Union p_pAssertedIDValue) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
};
template HistoryInfo mw_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) :=
{
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
};
template HistoryInfoEntry mw_HistoryInfoEntry(template SipUrl p_Url, template IntegerList 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 IntegerList 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 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 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 Reason m_Reason(integer p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(p_cause),"dummy")}
};
template Reason m_Reason21 :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(21),"call reject")}
};
template RecordRoute m_recordRoute_currIpAddr (in SipUserProfile p_userprofile):=
{
fieldName := RECORD_ROUTE_E,
routeBody := {{nameAddr := {displayName := omit,
addrSpec := {scheme := c_sipScheme, //* contains "sip"
userInfo := omit,
hostPort := {host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort},
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 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 Require m_Require_replaces :=
{
fieldName := REQUIRE_E,
optionsTags := {c_replaces}
};
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 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 UserToUser m_UserToUserData(template charstring p_U2UData):=
{
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := m_UserToUserEncodingHex
}
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 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 To mw_To(template SipUrl p_sipUrl) := {
fieldName := TO_E,
addressField := { nameAddr := {displayName := *, addrSpec := p_sipUrl}},
toParams:= *
}
template From mw_From(template SipUrl p_sipUrl) := {
fieldName := FROM_E,
addressField := { nameAddr := {displayName := *, addrSpec := p_sipUrl}},
fromParams:= *
}
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 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 Privacy mw_Privacy_id :=
{
fieldName := PRIVACY_E,
privValueList := {*,"id",*}
};
template Privacy mw_Privacy_user :=
{
fieldName := PRIVACY_E,
privValueList := {*,"user",*}
};
template Reason mw_Reason(integer p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(p_cause),?)}
};
template Reason mw_ReasonSIP(integer p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValueSIP(int2str(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 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 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 := ?,//MRO
contactParams := {{"isfocus",*}}
}
}
}
}
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
group MessageTemplates {
group dummy_templates {
group dummy_parameter_send {
template RequestLine m_requestLine_dummy(Method p_method) :=
{
method := p_method,
requestUri := c_unavailableUri,
sipVersion := c_sipNameVersion
}
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,
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,
priority := omit,
privacy := omit,
proxyAuthenticate := omit,
proxyAuthorization := omit,
proxyRequire := omit,
pVisitedNetworkID := omit, //* RFC3455
rAck := omit,
rSeq := omit,
reason := omit,
recordRoute := omit,
referredBy := omit, //* RFC3892 - REFER method
referTo := omit, //* RFC3515 - 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
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 RequestLine mw_requestLine_dummy(Method p_method) :=
{
method := p_method,
requestUri := ?,
sipVersion := c_sipNameVersion
}
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 := ?,
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 := *,
priority := *,
privacy := *,
proxyAuthenticate := *,
proxyAuthorization := *,
proxyRequire := *,
pVisitedNetworkID := *, //* RFC3455
rAck := *,
rSeq := *,
reason := *,
recordRoute := *,
referredBy := *, //* RFC3892 - REFER method
referTo := *, //* RFC3515 - REFER method
replaces := *, //* RFC 3891
replyTo := *,
require := *,
retryAfter := *,
route := *,
securityClient := *, //* RFC3329
securityServer := *, //* RFC3329
securityVerify := *, //* RFC3329
server := *,
serviceRoute := *, //* RFC3608
sessionExpires := *, //* RFC4028
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 ACK_Request m_ACK_Dummy :=
{
requestLine := m_requestLine_dummy(ACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template BYE_Request m_BYE_Dummy :=
{
requestLine := m_requestLine_dummy(BYE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template CANCEL_Request m_CANCEL_Dummy :=
{
requestLine := m_requestLine_dummy(CANCEL_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template INFO_Request m_INFO_Dummy :=
{
requestLine := m_requestLine_dummy(INFO_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template INVITE_Request m_INVITE_Dummy :=
{
requestLine := m_requestLine_dummy(INVITE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template MESSAGE_Request m_MESSAGE_Dummy :=
{
requestLine := m_requestLine_dummy(MESSAGE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template NOTIFY_Request m_NOTIFY_Dummy :=
{
requestLine := m_requestLine_dummy(NOTIFY_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template PRACK_Request m_PRACK_Dummy :=
{
requestLine := m_requestLine_dummy(PRACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template PUBLISH_Request m_PUBLISH_Dummy :=
{
requestLine := m_requestLine_dummy(PUBLISH_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template REGISTER_Request m_REGISTER_Dummy :=
{
requestLine := m_requestLine_dummy(REGISTER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template REFER_Request m_REFER_Dummy :=
{
requestLine := m_requestLine_dummy(REFER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := 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{
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 := *
}
template CANCEL_Request mw_CANCEL_Dummy :=
{
requestLine := mw_requestLine_dummy(CANCEL_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template INFO_Request mw_INFO_Dummy :=
{
requestLine := mw_requestLine_dummy(INFO_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template INVITE_Request mw_INVITE_Dummy :=
{
requestLine := mw_requestLine_dummy(INVITE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template MESSAGE_Request mw_MESSAGE_Dummy :=
{
requestLine := mw_requestLine_dummy(MESSAGE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
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 := *
}
template PUBLISH_Request mw_PUBLISH_Dummy :=
{
requestLine := mw_requestLine_dummy(PUBLISH_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template REFER_Request mw_REFER_Dummy :=
{
requestLine := mw_requestLine_dummy(REFER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template REGISTER_Request mw_REGISTER_Dummy :=
{
requestLine := mw_requestLine_dummy(REGISTER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
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
}
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
},
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 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 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 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 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 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 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
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 INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy :=
{
requestLine :=
{
method := INVITE_E
}
}
template MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy :=
{
msgHeader :=
{
contact := *
}
}
template NOTIFY_Request mw_NOTIFY_Request_Base (template CallId p_callId) modifies mw_NOTIFY_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
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 (CallId p_callId) modifies mw_REFER_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template REFER_Request
mw_REFER_Request(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
}
}
template SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy :=
{
requestLine :=
{
method := SUBSCRIBE_E
}
}
template UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
} //* end group request_receive
group response_send {
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
}
} //* end group response_send
group response_receive {
template Response mw_Response_Base (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq) modifies mw_Response_Dummy:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
} //* end group message_receive
} //* end group full_templates
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, Route p_route)
modifies m_ACK_Request_Base
:=
{
msgHeader :=
{
route := p_route
}
}
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 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 :=
{
hostPort:= p_requestUri.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
}
}
} //* end group request_send
group request_receive {
template BYE_Request mw_BYE_Request_Reason(template CallId p_callId, integer p_cause) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
reason := mw_Reason(p_cause)
}
}
template BYE_Request mw_BYE_Request_ReasonSIP(template CallId p_callId, integer p_cause) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
reason := mw_ReasonSIP(p_cause)
}
}
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 INVITE_Request mw_INVITE_Request_RequestURI (template SipUrl p_sipUrl) modifies mw_INVITE_Dummy :=
{
requestLine :=
{
requestUri := p_sipUrl,
sipVersion := c_sipNameVersion
}
}
template INFO_Request mw_INFO_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INFO_Request_Base :=
{
messageBody := p_mb
}
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 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 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 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
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,
AlertInfo p_alertInfo
) modifies m_Response_Base:= {
msgHeader := {
alertInfo := p_alertInfo
}
}
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 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_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
}
} //* end group response_send
group response_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}
}
}
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 Response mw_Response_Reason (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, integer 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
}
}
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 := ?
}
}
} //* end group response_receive
} //* end group modified_templates
} //* end group MessageTemplates
group SDP_Templates {
group SDP_Messages {
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 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 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 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 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 := 1, //* v=1 unacceptable version of SDP
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
};
}//* end group modified_templates
} //* end group SDP_Messages
group SDP_Fields {
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
};
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_media_dynPT(charstring p_PT, charstring p_encod) := {
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 := omit,
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 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:=?
}
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 SDP_media_field mw_media_PCMU :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { "0" }
}
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 SDP_media_field mw_media_G722 :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := "RTP/AVP",
fmts := { "9" }
}
template SDP_media_field mw_media_AMR_DPT :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
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
} //* 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_longPlainText:=
{
textplain := c_longMessageContent_1300Bytes
};
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:="PX_SIP_MIME_Boundary",
mimeEncapsulatedList:= {
{content_type:="PX_SIP_SDP_ContentType",
content_disposition:=omit,
mime_encapsulated_part:={sdpMessageBody := p_sdp}},
{content_type:="PX_SIP_ISUP_ContentType",
content_disposition:=omit,
mime_encapsulated_part:={xmlBody := p_xmlBody}}
}
}
}
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_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 TIMS3GPP 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 TIMS3GPP 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 {
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 {
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 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);
};
}
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_result := v_result + 2+c_CRlen + lengthof(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
); //* "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