pax_global_header 0000666 0000000 0000000 00000000064 12375630627 0014525 g ustar 00root root 0000000 0000000 52 comment=596824919275ff28115674598618bcc69787097d
LibSip-v3/ 0000775 0000000 0000000 00000000000 12375630627 0012601 5 ustar 00root root 0000000 0000000 LibSip-v3/ttcn/ 0000775 0000000 0000000 00000000000 12375630627 0013551 5 ustar 00root root 0000000 0000000 LibSip-v3/ttcn/LibSip_Interface.ttcn 0000664 0000000 0000000 00000023445 12375630627 0017615 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-IMS tests. Module become from STF306 and STF334-336
* This module is part of LibSipV3.
*/
module LibSip_Interface {
// LibCommon
import from LibCommon_Sync all;
import from LibCommon_AbstractData all;
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
// LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_XMLTypes all;
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 "LibSip V3";
}
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 p_text,
out boolean p_answer
) ;
signature s_SIP_ringing(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_announcementA(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_announcementB(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_announcement(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_voiceMessage(
in charstring p_text,
out boolean p_answer
) ;
signature s_SIP_mediastopped(
in charstring p_text,
out boolean p_answer
) ;
type port OperatorPort procedure {
inout s_SIP_conversation;
inout s_SIP_ringing;
inout s_SIP_announcementA;
inout s_SIP_announcementB;
inout s_SIP_announcement;
inout s_SIP_voiceMessage;
inout s_SIP_mediastopped;
}
// Solution for building error problem. (Important for validation)
// type component ImsComponent extends SipComponent need to be located in LibIms_Interface and not in LibSip_Interface module
// With this solution TAU compiler error.
// type component ImsComponent extends SipComponent
// {
// // general variables
// var ImsInterfaceProfile vc_interfaceprofile
// } // end ImsComponent
type component SipComponent extends SelfSyncComp {
// port
port SipPort SIPP;
// used for communication with the operator
port OperatorPort opPort;
// 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 template(omit) CallId vc_callId := c_empty_CallId;
var template(omit) CallId vc_callIdReg := c_empty_CallId;
var template(omit) CallId vc_callIdSub := c_empty_CallId;
var From vc_from := c_empty_From;
var To vc_to := c_empty_To;
var To vc_cancel_To := c_empty_To; // used for next CANCEL
var Via vc_via := c_empty_Via;
var Via vc_via_REG := c_empty_Via; // via used in last REGISTER
var ContentType vc_contentType := c_empty_ContentType; // MRO
var template(omit) RecordRoute vc_recordRoute; // value of RecordRoute header
var boolean vc_boo_recordRoute := false; // boolean indicates valid recordRoute
var template(omit) Route vc_route; // value of Route header
var template(omit) Route vc_route_REG; // value of Route header from registration ServiceRoute header for initial Requests
var
UrnUriComponents
vc_reqUrnUri := {
namespaceId := "",
namespaceSpecificString := ""
};
var boolean vc_boo_route := false; // boolean indicates valid Route
var template(omit) Contact vc_contact; // value of Contact header
var CSeq vc_cSeq := c_empty_cSeq; // value of CSeq header
var template(value)
RAck
vc_rAck := {
fieldName := RACK_E,
responseNum := 1,
seqNumber := 1,
method := "INVITE"
}; // value of RAck header
// address to send request
var HostPort vc_reqHostPort := {//STF471 removed PIXIT assignment, should be performed in specific ATS
host := "127.0.0.1", // former PX_SIP_SUT_IPADDR value
portField := 5060 //former PX_SIP_SUT_PORT value
};
var template(omit) Privacy vc_privacy;
var HistoryInfo_List vc_historyInfoList := {}; // value of history list according to RFC4244
var SipUrl vc_confURI; // conference URI according to TS124147 ch. 5.3.1.3.2
var SDP_Message vc_sdp_remote; // incoming SDP offers
var SDP_Message vc_sdp_local; // SDP values to be sent
var XmlBody vc_xml_remote; // incoming XML value
var template XmlBody vc_xml_local; // SDP values to be sent
var template(omit) CSeq vc_iut_CSeq := c_empty_cSeq; // value of last CSeq header used by the IUT in request
// To/From header-fields to be used if the callee will release the session
var To vc_callee_To := c_empty_To;
var From vc_callee_From := c_empty_From;
// To/From header-fields to be used if the caller will release the session
var To vc_caller_To := c_empty_To;
var From vc_caller_From := c_empty_From;
var Authorization vc_authorization;
// variables for storing default references
var default vc_default;
var default vc_def_catchSyncStop;
// general timers
timer tc_T1 := 0.5;//STF471 default value, should be set in specific ATS, former PX_SIP_T1
timer tc_Tf := 32.0;//STF471 default value, should be set in specific ATS, former PX_SIP_TF
timer tc_wait := PX_SIP_TWAIT;
timer tc_ack := PX_SIP_TACK;
timer tc_resp := PX_SIP_TRESP;
timer tc_noAct := PX_SIP_TNOACT; // time for SUT to get idle state
// timer TRept;
// timer TSync := 10.0; //STF471 default value, should be set in specific ATS, former PX_SIP_TSYNC
timer tc_guard := 120.0; //STF471 default value, should be set in specific ATS, former PX_SIP_TGUARD
timer tc_tDelay := 32.0;
var float vc_tcRESP := PX_SIP_TRESP; // standard value for TRESP (may be modified in particular tests)
// indicators set/used parameter status or state handling in default
var boolean vc_sdp_remote_is_valid := false; // true if there is a value in v_SDP_remote
var boolean vc_history_is_valid := false; // true if there is a HistoryList in response message
var boolean vc_send_SDP := false; // send SDP in the next outgoing message
var boolean vc_ignore_bye := false; // enable ignore of repeated bye in default
var boolean vc_ignore_invite := false; // enable ignore invite in default
var boolean vc_ignore_subscribe := false; // enable ignore subscribe in default
var boolean vc_ignore181 := false; // enable ignore of 181 in default
var boolean vc_ignore484 := false; // enable ignore of 484 in default
var boolean vc_ignore4xx := false; // enable ignore of 4xx in default
var boolean vc_ignore200OKinv := false; // enable ignore of 200OKinv in default
var boolean vc_ignore_notify := false; // enable ignore of notify in default
var boolean vc_supported_100rel := false; // true if the received invite contains 100rel
var boolean vc_supported_precondition := false; // true if the received invite contains precondition
var boolean vc_MESSAGEreceived := false; // true if MESSAGE received during altstep
var boolean vc_first_recv := false; // true after receipt of first incomming SIP message
var boolean vc_firstREGISTER_sent := false; // true after sent of first REGISTER message
var boolean vc_DeregDone := false; // true after first DeREGISTRATION trail (avoid loop)
var boolean vc_interface_isc := false; // true if isc interface is in use
var boolean vc_white_space := false; // MRO
var boolean vc_subscribed := false;
// ETS address
var address vc_ets_label; //This value should be initialized in specific ATS
// // used for communication with the operator
// port OperatorPort_SIP opPort;
} // end SipComponent
} // end module LibSip_Interface
LibSip-v3/ttcn/LibSip_Library.ttcn 0000664 0000000 0000000 00000001670 12375630627 0017315 0 ustar 00root root 0000000 0000000 /**
* @author STF471
* @version $Id: LibSip_Steps.ttcn 614 2014-07-07 10:01:14Z tepelmann $
* @desc This module provides all modules of the LibSip as public imports.
* Importing this module will automatically import all here listed modules,
* no other LibSip_xxx module import needed in this case.
* This module is part of LibSipV3.
*/
module LibSip_Library {
public import from LibSip_Interface all;
public import from LibSip_MessageBodyTypes all;
public import from LibSip_PIXITS all;
public import from LibSip_SDPTypes all;
public import from LibSip_SimpleMsgSummaryTypes all;
public import from LibSip_SMSFunctions all;
public import from LibSip_SMSTemplates all;
public import from LibSip_SMSTypesAndValues all;
public import from LibSip_Steps all;
public import from LibSip_Templates all;
public import from LibSip_XMLTypes all;
} LibSip-v3/ttcn/LibSip_MessageBodyTypes.ttcn 0000664 0000000 0000000 00000004147 12375630627 0021142 0 ustar 00root root 0000000 0000000 /******************************************************************************
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id: LibSip_MessageBodyTypes.ttcn 622 2014-07-10 14:50:54Z nikolajev $
* @desc This module provides the types used for alternative SIP message
* body variants and combinations.
* This module is part of LibSipV3.
*/
module LibSip_MessageBodyTypes {
import from LibSip_SDPTypes all;
import from LibSip_SimpleMsgSummaryTypes all;
import from LibSip_XMLTypes all;
/*
* Simple body types that can be used instead of the more detailed XML and SDP
* without codec support
* */
//type charstring XmlBody;
//type charstring SDP_Message;
group MIMETypes {
type union MIME_Encapsulated_Parts {
SDP_Message sdpMessageBody,
XmlBody xmlBody // if there is XML body
}
type record MIME_Encapsulated_Part {
charstring content_type,
charstring content_disposition optional,
MIME_Encapsulated_Parts mime_encapsulated_part
}
type record MIME_Message {
charstring boundary,
// len:
MimeEncapsulatedList mimeEncapsulatedList
}
type record of MIME_Encapsulated_Part MimeEncapsulatedList;
} // group MIMETypes
type union MessageBody {
SDP_Message sdpMessageBody,
// if there is only SDP part
// XMLMessage xmlMessage, // if there is XML message (with header and body)
XmlBody xmlBody,
// if there is XML body
MIME_Message mimeMessageBody,
// if there is SDP and encapsulated ISUP part
charstring sipfrag,
// if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2)
charstring textplain,
// if content type is text/plain (for testing long messages)
SimpleMsgSummary simpleMsgSummary,
// RFC 3842
octetstring smsMessage // encoded SMS message 3GPP 23.040, 24.011
}
}
LibSip-v3/ttcn/LibSip_PIXITS.ttcn 0000664 0000000 0000000 00000011242 12375630627 0016725 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module provides module parameters used within the SIP
* protocol for timers, SDP formats etc.
* This module is part of LibSipV3.
*/
module LibSip_PIXITS {
// LibCommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
// ____________________________ PIXIT-S_______________________________
group SIP_PIXITparameters {
group SDPParameter {
/**
* @desc charstring for SDP user name
*/
modulepar charstring PX_SIP_SDP_USER_NAME := "voicesession";
/**
* @desc charstring for SDP session identifier
*/
modulepar charstring PX_SIP_SDP_SESSION_ID := "30000";
/**
* @desc charstring for SDP dynamic port
*/
modulepar charstring PX_SIP_SDP_DYN := "0";
/**
* @desc charstring for SDP bandwidth modifier
*/
modulepar charstring PX_SIP_SDP_B_MODIFIER := "AS";
/**
* @desc integer for SDP bandwidth value
*/
modulepar integer PX_SIP_SDP_B_BANDWIDTH := 64;
/**
* @desc charstring for SDP media attribute encoding supported by the IUT
*/
modulepar charstring PX_SIP_SDP_ENCODING := "PCMU";
/**
* @desc charstring for SDP media attribute encoding clockrate supported by the IUT
*/
modulepar charstring PX_SIP_SDP_CLOCKRATE := "8000";
} // group SDP Parameter
group XMLCOnfiguration{
/**
* @desc boolean for MessageBody length calculation based on encvalue operation result
*/
modulepar boolean PX_MB_LENGTH_FROM_ENCVAL := true;
/**
* @desc boolean for MessageBody length calculation to be performed by external function
*/
modulepar boolean PX_USE_FX_FOR_XML_LENGTH := false;
}
group SupportedOptions {
/**
* @desc charstring for Used Transport in upper case "UDP"/"TCP"
*/
modulepar charstring PX_SIP_TRANSPORT := "UDP";
} // group SupportedOptions{
group RegistrationParameters {
/**
* @desc boolean for the SIP user if it have to register itself before executing a test case
*/
modulepar boolean PX_SIP_REGISTRATION := false;
/**
* @desc charstring for PX_AUTH_ALGORITHM security algorithm Possible values: MD5 or AKAv1-MD5
*/
modulepar charstring PX_AUTH_ALGORITHM := "AKAv1-MD5";
} // group Registration parameters
group SwitchToEnableAuthentication {
/**
* @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages
*/
modulepar boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
/**
* @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages
*/
modulepar boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
} // group SwitchToEnableAuthentication
group SIP_Timers {
/**
* @desc float for TWait default value for waiting an operator action
*/
modulepar float PX_SIP_TWAIT := 30.0;
/**
* @desc float for TAck default value for waiting an acknowledgement
*/
modulepar float PX_SIP_TACK := 8.0;
/**
* @desc float for TResp default value for waiting for a response from the IUT
*/
modulepar float PX_SIP_TRESP := 15.0;
/**
* @desc float for TNoAct default value for waiting no message from the IUT Value given for PX_TNOACT should be less than value of SHORT_REGISTRATION constant (which is currently "3" (seconds))
*/
modulepar float PX_SIP_TNOACT := 1.0;
} // group SIP_Timers
group MimePart {
/**
* @desc charstring for delimiter value used in mime multipart message to separate message body parts
*/
modulepar charstring PX_SIP_MIME_BOUNDARY := "boundary1";
} // group MimePart
} // group SIP_PIXITparameters
} // end module LibSip_PIXITS
LibSip-v3/ttcn/LibSip_SDPTypes.ttcn 0000664 0000000 0000000 00000033155 12375630627 0017367 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module defines message, attribute, structured and simple
* SDP types as well constants used by LipSip constructs.
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* This module is part of LibSipV3.
* @remark Adding of new attributes types is ok; Adding of new optional attributes in @see SDP_attribute type is ok; Existing attribute types shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
*/
module LibSip_SDPTypes {
import from LibSip_SIPTypesAndValues all;
group Constants {
group SimpleConstants {
// SDP net_type
const charstring c_in := "IN";
// SDP addr_type
const charstring c_ip4 := "IP4";
const charstring c_ip6 := "IP6";
// SDP_media_desc: media
const charstring c_audio := "audio";
const charstring c_image := "image";
const charstring c_video := "video";
const charstring c_text := "text";
const charstring c_msrp := "msrp";
// SDP_media_desc: transport
const charstring c_rtpAvp := "RTP/AVP";
const charstring c_rtpAvpf := "RTP/AVPF";
const charstring c_msrpTcp := "TCP/MSRP";
const charstring c_udptl := "Udptl";
// SDP_attribute_list constants:
const charstring c_local := "local";
const charstring c_mandatory := "mandatory";
const charstring c_optional := "optional";
const charstring c_none := "none";
const charstring c_qos := "qos";
const charstring c_remote := "remote";
const charstring c_sendrecv := "sendrecv";
const charstring c_sendonly := "sendonly";
const charstring c_inactive := "inactive";
const charstring c_send := "send";
const charstring c_recv := "recv";
const charstring c_e2e := "e2e";
}
}
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 union SDP_attribute_fmtp_format_specific_params {
SemicolonParam_List paramList,
charstring unstructured
}
type record SDP_attribute_fmtp {
charstring format,
SDP_attribute_fmtp_format_specific_params params
}
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_codec {
charstring encoding,
charstring clockrate,
charstring parameters optional
}
type record SDP_attribute_rtpmap {
charstring payload_type,
SDP_attribute_rtpmap_codec codec
}
type record SDP_attribute_rtcp {
integer portnumber,
SDP_connection connection optional
}
type record SDP_attribute_msrp {
charstring attr_value
}
type record SDP_attribute_unknown {
charstring name,
charstring attr_value optional
}
type record SDP_attribute_maxptime {
charstring attr_value
}
type record SDP_attribute_tcap {
integer trpr_cap_num,
Charstring_List proto_list
}
type record SDP_attribute_pcfg {
integer config_number,
Charstring_List pot_cfg_list optional
}
type record SDP_attribute_acfg {
integer config_number,
Charstring_List sel_cfg_list optional
}
type record SDP_attribute_ecn_capable_rtp {
Charstring_List init_list,
Charstring_List parm_list optional
}
type record SDP_attribute_rtcp_fb {
charstring rtcp_fb_pt,
charstring rtcp_fb_val
}
type record SDP_attribute_rtcp_xr {
Charstring_List xr_format_list optional
}
type record SDP_attribute_rtcp_rsize {
}
type record SDP_attribute_3ge2ae {
charstring indicator
}
type record SDP_attribute_crypto {
charstring tag,
charstring crypto_suite,
charstring key_params,
Charstring_List session_params optional
}
type union SDP_attribute {
SDP_attribute_cat cat,
SDP_attribute_keywds keywds,
SDP_attribute_tool tool,
SDP_attribute_ptime ptime,
SDP_attribute_recvonly recvonly,
SDP_attribute_sendrecv sendrecv,
SDP_attribute_sendonly sendonly,
SDP_attribute_inactive inactive,
SDP_attribute_orient orient,
SDP_attribute_type sdp_type,
SDP_attribute_charset charset,
SDP_attribute_sdplang sdplang,
SDP_attribute_lang lang,
SDP_attribute_framerate framerate,
SDP_attribute_quality quality,
SDP_attribute_fmtp fmtp,
SDP_attribute_curr curr,
SDP_attribute_des des,
SDP_attribute_conf conf,
SDP_attribute_rtpmap rtpmap,
SDP_attribute_rtcp rtcp,
SDP_attribute_msrp msrp,
SDP_attribute_maxptime maxptime,
SDP_attribute_tcap tcap,
SDP_attribute_pcfg pcfg,
SDP_attribute_acfg acfg,
SDP_attribute_ecn_capable_rtp ecn_capable_rtp,
SDP_attribute_rtcp_fb rtcp_fb,
SDP_attribute_rtcp_xr rtcp_xr,
SDP_attribute_rtcp_rsize rtcp_rsize,
SDP_attribute_3ge2ae e2ae,
SDP_attribute_crypto crypto,
//* unknown has to be the last else encoding/decoding won't work!
SDP_attribute_unknown unknown
}
} //* group AttributeTypes
type set of SDP_attribute SDP_attribute_list;
type record SDP_bandwidth {
charstring modifier,
integer bandwidth
}
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-v3/ttcn/LibSip_SIPTypesAndValues.ttcn 0000664 0000000 0000000 00000233271 12375630627 0021200 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module defines message, header, structured and simple SIP
* types as well constants used by LipSip constructs.
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* This module is part of LibSipV3.
* @remark Adding of new message and header types is ok; Adding of new optional header fields in
* @see MessageHeader type is ok but should be done at same time as dummy template updates; Existing message or header types shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
*/
module LibSip_SIPTypesAndValues {
import from LibSip_MessageBodyTypes all;
import from LibSip_PIXITS all;
group Constants {
group SimpleConstants {
// SIP name protocol plus version
const charstring c_sipNameVersion := "SIP/2.0";
// SIP name protocol
const charstring c_sipName := "SIP";
// SIP version
const charstring c_sipVersion := "2.0";
// SIP scheme
const charstring c_sipScheme := "sip";
// TEL scheme
const charstring c_telScheme := "tel";
// URN schema
const charstring c_urnScheme := "urn";
// 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_sdpApplication := "application/sdp";
// XML name application
const charstring c_xmlApplication := "application/xml";
// XML name application
const charstring c_xmlreginfoApplication := "application/reginfo+xml";
// XML name resource-list
const charstring c_xmlresourcelistApplication := "application/resource-lists+xml";
// MIME name application
const charstring c_mimeMultipart := "multipart/mixed;boundary=""" & PX_SIP_MIME_BOUNDARY & """";
// IMS 3GPP name application
const charstring c_ims3gppApplication := "application/3gpp-ims+xml";
// 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_octetApplication := "application/octet-stream";
// PLAIN-TEXT name application
const charstring c_plainText := "text/plain";
// SIP fragment message
const charstring c_sipfragMessage := "message/sipfrag";
// text content of 1300 bytes for messages with message body
const charstring c_longMessageContent_1300Bytes :=
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" &
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & oct2char('0D'O) & oct2char('0A'O);
// CRLF
// Default SIP port number : 5060
const integer c_defaultSipPort := 5060;
// 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";
const PrivacyValue c_privacy_session := "session";
//
const charstring c_AT := "@";
// MRO
const charstring c_SP := oct2char('20'O);
const charstring c_SLASH := oct2char('2F'O);
const charstring c_LT := oct2char('3C'O);
const charstring c_GT := oct2char('3E'O);
// * (wildchard) sign
const charstring c_WILDCARD := "*";
const integer c_CRlen := 2;
// length of new line (0d0a)
const GenericParam c_Integrity_protected_yes := {"integrity-protected", {tokenOrHost := "yes"}};
const GenericParam c_Integrity_protected_no := {"integrity-protected", {tokenOrHost := "no"}};
const GenericParam c_Integrity_protected_ip_assoc_pending := {"integrity-protected", {tokenOrHost := "ip-assoc-pending"}};
const charstring c_algorithm := "MD5";
} // end group SimpleConstants
group AuthorizationConstants {
const charstring c_ik := "";
const charstring c_ck := "";
const charstring c_nonce := "";
const charstring c_nonce_value := "0edff6c521cc3f407f2d9e01cf6ed82b";
} // end group AuthorizationConstants
group PChargingVectorConstants {
const charstring c_icid := "icid-value";
const charstring c_icid_value := "123abc";
const charstring c_icid_generated_at := "icid-generated-at";
const charstring c_orig_ioi := "orig-ioi";
const charstring c_term_ioi := "term-ioi";
const charstring c_access_network_charging_info := "access-network-charging-info";
} // end group PChargingVectorConstants
group HeaderFieldConstants {
const CallId c_empty_CallId := {
fieldName := CALL_ID_E,
callid := ""
};
const ContentType c_empty_ContentType := {
fieldName := CONTENT_TYPE_E,
mediaType := ""
};
const CSeq c_empty_cSeq := {
fieldName := CSEQ_E,
seqNumber := 0,
method := "EMPTY"
};
const From c_empty_From := {
fieldName := FROM_E,
addressField := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := "127.0.0.1",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
}
}
},
fromParams := omit
};
const MaxForwards c_maxForwards70 := {
fieldName := MAX_FORWARDS_E,
forwards := 70
};
const SipUrl c_empty_RequestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := "127.0.0.1",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
};
const SipUrl c_unavailableUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "unavailable",
password := omit
},
hostPort := {
host := "anonymous.invalid",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
};
const To c_empty_To := {
// value of To header
fieldName := TO_E,
addressField := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := "127.0.0.1",
portField := c_defaultSipPort
}
}
},
urlParameters := omit,
headers := omit
}
}
},
toParams := omit
};
const Via c_empty_Via := {
fieldName := VIA_E,
viaBody := {
{
sentProtocol := {
protocolName := c_sipName,
protocolVersion := c_sipVersion,
transport := c_defaultSipProt
},
sentBy := {
host := "127.0.0.1",
portField := c_defaultSipPort
},
viaParams := omit
}
}
};
}
group UserProfileConstants {
// number of user profile from 1-10 for SIP profile
const integer c_userProfile_SIP1_home := 1;
const integer c_userProfile_SIP2_home := 2;
} // end group UserProfileConstants
group StatusLines {
const StatusLine c_statusLine100 := {c_sipNameVersion, 100, "Trying"};
const StatusLine c_statusLine180 := {c_sipNameVersion, 180, "Ringing"};
const StatusLine c_statusLine181 := {c_sipNameVersion, 181, "Call Is Being Forwarded"};
const StatusLine c_statusLine182 := {c_sipNameVersion, 182, "Queued"};
const StatusLine c_statusLine183 := {c_sipNameVersion, 183, "Session Progress"};
const StatusLine c_statusLine200 := {c_sipNameVersion, 200, "OK"};
const StatusLine c_statusLine202 := {c_sipNameVersion, 202, "Accepted"};
const StatusLine c_statusLine300 := {c_sipNameVersion, 300, "Multiple Choices"};
const StatusLine c_statusLine301 := {c_sipNameVersion, 301, "Moved Permanently"};
const StatusLine c_statusLine302 := {c_sipNameVersion, 302, "Moved Temporarily"};
const StatusLine c_statusLine305 := {c_sipNameVersion, 305, "Use Proxy"};
const StatusLine c_statusLine380 := {c_sipNameVersion, 380, "Alternative Service"};
const StatusLine c_statusLine400 := {c_sipNameVersion, 400, "Bad Request"};
const StatusLine c_statusLine401 := {c_sipNameVersion, 401, "Unauthorized"};
const StatusLine c_statusLine402 := {c_sipNameVersion, 402, "Payment Required"};
const StatusLine c_statusLine403 := {c_sipNameVersion, 403, "Forbidden"};
const StatusLine c_statusLine404 := {c_sipNameVersion, 404, "Not Found"};
const StatusLine c_statusLine405 := {c_sipNameVersion, 405, "Method Not Allowed"};
const StatusLine c_statusLine406 := {c_sipNameVersion, 406, "Not Acceptable"};
const StatusLine c_statusLine407 := {c_sipNameVersion, 407, "Proxy Authentication Required"};
const StatusLine c_statusLine408 := {c_sipNameVersion, 408, "Request Timeout"};
const StatusLine c_statusLine410 := {c_sipNameVersion, 410, "Gone"};
const StatusLine c_statusLine413 := {c_sipNameVersion, 413, "Request Entity Too Large"};
const StatusLine c_statusLine414 := {c_sipNameVersion, 414, "Request-URI Too Long"};
const StatusLine c_statusLine415 := {c_sipNameVersion, 415, "Unsupported Media Type"};
const StatusLine c_statusLine416 := {c_sipNameVersion, 416, "Unsupported URI Scheme"};
const StatusLine c_statusLine420 := {c_sipNameVersion, 420, "Bad Extension"};
const StatusLine c_statusLine421 := {c_sipNameVersion, 421, "Extension Required"};
const StatusLine c_statusLine422 := {c_sipNameVersion, 422, "Session Interval Too Small"};
const StatusLine c_statusLine423 := {c_sipNameVersion, 423, "Interval Too Brief"};
const StatusLine c_statusLine433 := {c_sipNameVersion, 433, "Anonymity Disallowed"};
const StatusLine c_statusLine480 := {c_sipNameVersion, 480, "Temporarily Unavailable"};
const StatusLine c_statusLine481 := {c_sipNameVersion, 481, "Call/Transaction Does Not Exist"};
const StatusLine c_statusLine482 := {c_sipNameVersion, 482, "Loop Detected"};
const StatusLine c_statusLine483 := {c_sipNameVersion, 483, "Too Many Hops"};
const StatusLine c_statusLine484 := {c_sipNameVersion, 484, "Address Incomplete"};
const StatusLine c_statusLine485 := {c_sipNameVersion, 485, "Ambiguous"};
const StatusLine c_statusLine486 := {c_sipNameVersion, 486, "Busy Here"};
const StatusLine c_statusLine487 := {c_sipNameVersion, 487, "Request Terminated"};
const StatusLine c_statusLine488 := {c_sipNameVersion, 488, "Not Acceptable Here"};
const StatusLine c_statusLine493 := {c_sipNameVersion, 493, "Undecipherable"};
const StatusLine c_statusLine500 := {c_sipNameVersion, 500, "Server Internal Error"};
const StatusLine c_statusLine501 := {c_sipNameVersion, 501, "Not implemented"};
const StatusLine c_statusLine502 := {c_sipNameVersion, 502, "Bad Gateway"};
const StatusLine c_statusLine503 := {c_sipNameVersion, 503, "Service Unavailable"};
const StatusLine c_statusLine504 := {c_sipNameVersion, 504, "Server Time-out"};
const StatusLine c_statusLine505 := {c_sipNameVersion, 505, "Version Not Supported"};
const StatusLine c_statusLine513 := {c_sipNameVersion, 513, "Message Too Large"};
const StatusLine c_statusLine580 := {c_sipNameVersion, 580, "Precondition Failure"};
const StatusLine c_statusLine600 := {c_sipNameVersion, 600, "Busy Everywhere"};
const StatusLine c_statusLine603 := {c_sipNameVersion, 603, "Decline"};
const StatusLine c_statusLine604 := {c_sipNameVersion, 604, "Does Not Exist Anywhere"};
const StatusLine c_statusLine606 := {c_sipNameVersion, 606, "Not Acceptable"};
} // end StatusLines
group SIPSyncPointNames {
const charstring c_Ringing := "Ringing";
const charstring c_uPlane := "uPlane";
const charstring c_sync1 := "sync1";
const charstring c_sync2 := "sync2";
const charstring c_sync3 := "sync3";
const charstring c_sync4 := "sync4";
const charstring c_uPlaneStop := "uPlaneStop";
const charstring c_annoucA := "announcementA";
const charstring c_annoucB := "announcementB";
const charstring c_annouc := "announcement";
const charstring c_voicem := "voiceMessage";
}
} // end group Constants
group Types {
group SubTypes {
// Subtypes
group TokenTypes // TokensTypes
{
// [20 ]
type enumerated FieldName {
ACCEPT_E,
ACCEPT_ENCODING_E,
ACCEPT_LANGUAGE_E,
ALERT_INFO_E,
ALLOW_E,
AUTHENTICATION_INFO_E,
AUTHORIZATION_E,
CALL_ID_E,
CALL_INFO_E,
CONTACT_E,
CONTENT_DISPOSITION_E,
CONTENT_ENCODING_E,
CONTENT_LANGUAGE_E,
CONTENT_LENGTH_E,
CONTENT_TYPE_E,
CSEQ_E,
DATE_E,
ERROR_INFO_E,
EXPIRES_E,
FROM_E,
IN_REPLY_TO_E,
MAX_FORWARDS_E,
MIME_VERSION_E,
MIN_EXPIRES_E,
ORGANIZATION_E,
PRIORITY_E,
PROXY_AUTHENTICATE_E,
PROXY_AUTHORIZATION_E,
PROXY_REQUIRE_E,
RECORD_ROUTE_E,
REPLY_TO_E,
REQUIRE_E,
RETRY_AFTER_E,
ROUTE_E,
SERVER_E,
SUBJECT_E,
SUPPORTED_E,
TIMESTAMP_E,
TO_E,
UNSUPPORTED_E,
USER_AGENT_E,
VIA_E,
WARNING_E,
WWW_AUTHENTICATE_E,
// [3262/7.1 ]
RACK_E,
RSEQ_E,
// [3265/7.2 ]
ALLOW_EVENTS_E,
EVENT_E,
SUBSCRIPTION_STATE_E,
// [3313 ]
P_MEDIA_AUTHORIZATION_E,
// [3323 ]
PRIVACY_E,
// [3325 ]
P_ASSERTED_ID_E,
P_PREFERRED_ID_E,
P_PREFERRED_SERVICE_E,
// [3326 ]
REASON_E,
// [3515 ] - REFER method
REFER_TO_E,
// [4488 ] - REFER method
REFER_SUB_E,
// [3891 ]
REPLACES_E,
// [3892 ] - REFER method
REFERRED_BY_E,
// [4244 ]
HISTORY_INFO_E,
// [3313 ]
P_MEDIA_AUTH_E,
// [3327 ]
PATH_E,
// [3329 ]
SECURITY_CLIENT_E,
SECURITY_SERVER_E,
SECURITY_VERIFY_E,
// [3455 ]
P_ACCESS_NETWORK_INFO_E,
P_ASSOCIATED_URI_E,
P_CALLED_PARTY_E,
P_CHARGING_FUNCTION_ADDRESSES_E,
P_CHARGING_VECTOR_E,
P_VISITED_NETWORK_E,
// [3608 ]
SERVICE_ROUTE_E,
// [3841 ]
ACCEPT_CONTACT_E,
REQUEST_DISPOSITION_E,
// [4028 ]
MIN_SE_E,
SESSION_EXPIRES_E,
P_ASSERTED_SERVICE_E,
// [5009 ]
P_EARLY_MEDIA_E,
// http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07
// Transporting User to User Call Control Information in SIP for ISDN Interworking
USER_TO_USER_E,
// [6442 ] /*
// @sic R5-133151 update of header fields sic@ */
GEOLOCATION_E,
GEOLOCATION_ROUTING_E,
SESSION_ID_E,
SIP_ETAG_E,
SIP_IF_MATCH_E,
FEATURE_CAPS_E
}
// [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
}
type union GenValue {
charstring tokenOrHost,
charstring quotedString
}
// [20.1, 20.3, 20.4, 20.7, 20.9, 20.10, 20.11, 20.18, 20.20, 20.27, 20.28, 20.30, 20.31,
// 20.33, 20.34, 20.39, 20.42, 20.44 ]
type record GenericParam {
charstring id,
GenValue paramValue optional
}
// [? ]
type set of GenericParam SemicolonParam_List;
// [? ]
type set of GenericParam AmpersandParam_List;
// [? ]
type set of GenericParam CommaParam_List;
type set length (1..infinity) of charstring Charstring_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 SipUriComponents {
// sip-uri acc. to RFC 3261 cl. 19.1
UserInfo userInfo optional,
HostPort hostPort
}
type record TelUriComponents {
// tel-uri acc. to RFC 3966
charstring subscriber
}
type record UrnUriComponents {
// urn-uri acc. to RFC 2141
charstring namespaceId,
// e.g. "service" as acc. to RFC 5031
charstring
namespaceSpecificString // e.g. "sos"
}
type union UriComponents {
SipUriComponents sip,
// scheme: "sip" or sips"
TelUriComponents tel,
// scheme: "tel"
UrnUriComponents urn,
// scheme: "urn"
charstring
other // scheme: none of the above schemes
}
type record SipUrl {
charstring scheme,
// e.g "sip" or "tel"
UriComponents components,
// corresponding to the scheme
SemicolonParam_List urlParameters optional,
AmpersandParam_List headers optional
}
// [20.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 ["
// [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;
type set of FcValue FcValue_List;
type record FcValue {
charstring wildcard(c_WILDCARD),
SemicolonParam_List fcParams optional
}
} // 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
}
//[6809]
type record FeatureCaps {
FieldName fieldName(FEATURE_CAPS_E),
FcValue_List fcValues
}
// [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
}
// draft-drage-sipping-service-identification-01 (July 2007)
type record PPreferredService {
FieldName fieldName (P_PREFERRED_SERVICE_E) ,
charstring serviceId
}
} // 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 RFC4488HeaderFieldTypes {
// [4488 ]
type record ReferSub {
FieldName fieldName (REFER_SUB_E) ,
boolean referSubValue,
SemicolonParam_List referSubParams optional
}
} // end group RFC4488HeaderFieldTypes
group RFC3329HeaderFieldTypes {
// [RFC3329/2.2 ]
type record SecurityMechanism {
charstring mechName,
SemicolonParam_List mechParams optional
}
type set of SecurityMechanism SecurityMechanism_List;
type record SecurityClient {
FieldName fieldName (SECURITY_CLIENT_E) ,
SecurityMechanism_List securityMech
}
type record SecurityServer {
FieldName fieldName (SECURITY_SERVER_E) ,
SecurityMechanism_List securityMech
}
type record SecurityVerify {
FieldName fieldName (SECURITY_VERIFY_E) ,
SecurityMechanism_List securityMech
}
} // end group RFC3329HeaderFieldTypes
group RFC3455HeaderFieldTypes {
type record of NameAddrParam NameAddrParam_List;
type record NameAddrParam {
NameAddr nameAddr,
SemicolonParam_List genericParams optional
}
// [3455/5.1 ]
type record PAssociatedURI {
FieldName fieldName (P_ASSOCIATED_URI_E) ,
NameAddrParam_List nameAddrList
}
// [3455/5.2 ]
type record PCalledPartyID {
FieldName fieldName (P_CALLED_PARTY_E) ,
NameAddrParam nameAddParams
}
type record of VnetworkSpec VnetworkSpec_List;
type record VnetworkSpec {
charstring vNetworkSpecToken,
SemicolonParam_List genericParams optional
}
// [3455/5.3 ]
type record PVisitedNetworkID {
FieldName fieldName (P_VISITED_NETWORK_E) ,
VnetworkSpec_List vNetWorkSpec
}
// [3455/5.4 ]
type record PAccessNetworkInfo {
FieldName fieldName (P_ACCESS_NETWORK_INFO_E) ,
charstring accessType,
SemicolonParam_List genericParams optional
}
// [3455/5.5 ]
type record PChargingFunctionAddresses {
FieldName fieldName (P_CHARGING_FUNCTION_ADDRESSES_E) ,
SemicolonParam_List chargeAddrParams optional
}
// [3455/5.6 ]
type record PChargingVector {
FieldName fieldName (P_CHARGING_VECTOR_E) ,
charstring icidValue,
SemicolonParam_List chargeParams optional
}
} // end group RFC33455HeaderFieldTypes
group RFC3515HeaderFieldTypes {
// [3515 ]
type record ReferTo {
FieldName fieldName (REFER_TO_E) ,
NameAddr nameAddr,
SemicolonParam_List referToParams optional
}
} // end group RFC3515HeaderFieldTypes
group RFC3608HeaderFieldTypes {
// [3608 ]
type record ServiceRoute {
FieldName fieldName (SERVICE_ROUTE_E) ,
RouteBody_List routeBody
}
} // end group RFC33608HeaderFieldTypes
group RFC3841HeaderFieldTypes {
// [3841 ]
type record AcceptContact {
FieldName fieldName (ACCEPT_CONTACT_E) ,
AcRcValue_List acValues
}
type set of AcRcValue AcRcValue_List;
type record AcRcValue {
charstring wildcard (c_WILDCARD) ,
SemicolonParam_List acRcParams optional
}
// [RFC 3841 ]
type charstring Directive;
type set of Directive Directive_List;
type record RequestDisposition {
FieldName fieldName (REQUEST_DISPOSITION_E) ,
Directive_List directives
}
} // end group RFC3841HeaderFieldTypes
group RFC3891HeaderFieldTypes {
// [3891 ]
type record Replaces {
FieldName fieldName (REPLACES_E) ,
CallidString callid,
SemicolonParam_List replacesParams optional
}
} // end group RFC3891HeaderFieldTypes
group RFC3892HeaderFieldTypes {
// [3892 ]
type record ReferredBy {
FieldName fieldName (REFERRED_BY_E) ,
NameAddr nameAddr,
SemicolonParam_List referredbyIdParams optional
}
} // end group RFC3892HeaderFieldTypes
group RFC4028HeaderFieldTypes {
// [4028 ]
type record MinSE {
FieldName fieldName (MIN_SE_E) ,
DeltaSec deltaSec,
SemicolonParam_List minSeParam optional
}
// [4028 ]
type record SessionExpires {
FieldName fieldName (SESSION_EXPIRES_E) ,
DeltaSec deltaSec,
SemicolonParam_List seParam optional
}
} // end group RFC4028HeaderFieldTypes
group RFC4244HeaderFieldTypes {
// [4244 ]
type record HistoryInfo {
FieldName fieldName (HISTORY_INFO_E) ,
HistoryInfo_List historyInfoList
}
type record of HistoryInfoEntry HistoryInfo_List;
type record of integer IntegerList;
type record HistoryInfoEntry {
NameAddr nameAddr,
IntegerList hiIndex optional,
SemicolonParam_List hiExtention optional
}
type record of charstring StringList;
} // end group RFC4244HeaderFieldTypes
group RFC5009PEarlyMediaHeader {
// [5009 ]
type record PEarlyMedia {
FieldName fieldName (P_EARLY_MEDIA_E) ,
EM_List em_param
}
type record of charstring EM_List;
} // end group RFC5009PEarlyMediaHeader
// http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07, expires 16.Aug.2009
// Transporting User to User Call Control Information in SIP for ISDN Interworking
// type definition of SIP header mechanism
group UserToUser_PreliminaryRFCDraft {
type record UserToUser {
FieldName fieldName (USER_TO_USER_E) ,
charstring uuiData length(256),
/*length limitation due to ISDN, max of allowed 128 hex digits are represented by 256 characters*/
GenericParam uuiParam
}
} // end group UserToUser_PreliminaryRFCDraft
type record PAssertedService {
FieldName fieldName (P_ASSERTED_SERVICE_E) ,
PAssertedServiceValue pAssertedServiceValue
}
group RFC6442GeolocationConveyance {
/* @sic R5-133151 update of header fields sic@ */
// [6442 ]
type record Geolocation {
// RFC6442 clause 4.1
FieldName fieldName (GEOLOCATION_E) ,
SipUrl addrSpec,
SemicolonParam_List geolocParam optional
}
type enumerated GeolocationRoutingState {
GEOLOCATION_ROUTING_YES_E, GEOLOCATION_ROUTING_NO_E, GEOLOCATION_ROUTING_OTHER_E
}
type record GeolocationRouting {
// RFC6442 clause 4.2
FieldName fieldName (GEOLOCATION_ROUTING_E) ,
GeolocationRoutingState state,
GenericParam genericValue optional
}
} // end group RFC6442GeolocationConveyance
type charstring SessIdString length(32);
type record SessionId {
FieldName fieldName (SESSION_ID_E) ,
SessIdString sessid,
GenericParam sessidParam optional
}
type charstring EntityTag;
type record SIP_ETag {
FieldName fieldName (SIP_ETAG_E) ,
EntityTag entityTag
}
type record SIP_If_Match {
FieldName fieldName (SIP_IF_MATCH_E) ,
EntityTag entityTag
}
} // end group HeaderFieldTypes
group MessageHeaderTypes {
// Message-Header for all SIP requests and responses [20 ]
type set MessageHeader {
Accept accept optional,
AcceptContact acceptContact optional,
AcceptEncoding acceptEncoding optional,
AcceptLanguage acceptLanguage optional,
AlertInfo alertInfo optional,
Allow allow optional,
AllowEvents allowEvents optional,
// 3265/7.2
AuthenticationInfo authenticationInfo optional,
// only in responses
Authorization authorization optional,
// only in requests
CallId callId optional,
// optional only in Invalid test cases mandatory otherwise
CallInfo callInfo optional,
Contact contact optional,
// optional in response and all requests except INVITE where mandatory
ContentDisposition contentDisposition optional,
ContentEncoding contentEncoding optional,
ContentLanguage contentLanguage optional,
ContentLength contentLength optional,
// optional in responses and all requests except ACK where mandatory
ContentType contentType optional,
CSeq cSeq optional,
// optional only in Invalid test cases mandatory otherwise
Date date optional,
ErrorInfo errorInfo optional,
// only in responses
Event event optional,
// 3265/7.2
Expires expires optional,
From fromField,
Geolocation geolocation optional,
// 6442
GeolocationRouting geolocationRouting optional,
// 6442
// @sic R5-133151 update of header fields sic@
HistoryInfo historyInfo optional,
// 4244
InReplyTo inReplyTo optional,
// only in requests
MaxForwards maxForwards optional,
// mandatory in requests not required in responses!
MimeVersion mimeVersion optional,
MinExpires minExpires optional,
// only in responses
MinSE minSE optional,
// 4028
Organization organization optional,
PAccessNetworkInfo pAccessNetworkInfo optional,
// 3455
PAssertedID pAssertedID optional,
// 3325
PAssertedService pAssertedService optional,
PAssociatedURI pAssociatedURI optional,
// 3455
Path path optional,
// 3327
PCalledPartyID pCalledPartyID optional,
// 3455
PChargingFunctionAddresses pChargingFunctionAddresses optional,
// 3455
PChargingVector pChargingVector optional,
// 3455
PEarlyMedia pEarlyMedia optional,
// 5009
PMediaAuthorization pMediaAuthorization optional,
// 3313
PPreferredID pPreferredID optional,
// 3325
PPreferredService pPreferredService optional,
// draft-drage-sipping-service-identification-01 (July 2007)
Priority priority optional,
// only in requests
Privacy privacy optional,
// 3323
ProxyAuthenticate proxyAuthenticate optional,
// only in responses
ProxyAuthorization proxyAuthorization optional,
// only in requests
ProxyRequire proxyRequire optional,
// only in requests
PVisitedNetworkID pVisitedNetworkID optional,
// 3455
RAck rAck optional,
// 3262/7.1
RSeq rSeq optional,
// 3262/7.1
Reason reason optional,
// 3326
RecordRoute recordRoute optional,
RequestDisposition requestDisposition optional,
// 3841
ReferredBy referredBy optional,
// 3892 - REFER method
ReferTo referTo optional,
// 3515 - REFER method
ReferSub referSub optional,
// 4488 - REFER method
Replaces replaces optional,
// 3891
ReplyTo replyTo optional,
// optional in responses and INVITE requests
Require require optional,
RetryAfter retryAfter optional,
// only in responses
Route route optional,
// only in requests
SecurityClient securityClient optional,
// 3329
SecurityServer securityServer optional,
// 3329
SecurityVerify securityVerify optional,
// 3329
Server server optional,
// only in responses
ServiceRoute serviceRoute optional,
// 3608
SessionExpires sessionExpires optional,
// 4028
SessionId sessionId optional,
SIP_ETag sipETag optional,
SIP_If_Match sipIfMatch optional,
Subject subject optional,
// only in requests
SubscriptionState subscriptionState optional,
// 3265/7.2
Supported supported optional,
Timestamp timestamp optional,
To toField,
Unsupported unsupported optional,
// only in responses
UserToUser userToUser optional,
UserAgent userAgent optional,
Via via,
Warning warning optional,
// only in responses
WwwAuthenticate wwwAuthenticate optional,
// only in responses
UndefinedHeader_List undefinedHeader_List optional
}
} // end group MessageHeaderTypes
group StartLineTypes {
// Request-Line [7.1 ]
type record RequestLine {
Method method,
SipUrl requestUri,
charstring sipVersion
}
// Status-Line [7.2 ]
type record StatusLine {
charstring sipVersion,
integer statusCode,
charstring reasonPhrase
}
} // end group StartLineTypes
group otherTypes {
type record SipUserProfile {
/**
* @desc integer for the userprofile identifier
*/
integer id,
/**
* @desc integer for Port number to exchange SIP messages
*/
integer currPort,
/**
* @desc charstring for IP address to exchange SIP messages
*/
charstring currIpaddr,
/**
* @desc integer for Port number to exchange SIP messages
*/
integer contactPort,
/**
* @desc charstring for IP address to exchange SIP messages
*/
charstring contactIpaddr,
/**
* @desc charstring for IP address used by the TS to exchange media streams
*/
charstring bearerIpaddr,
/**
* @desc charstring for identity of the tester local domain
*/
charstring homeDomain,
/**
* @desc charstring for identity of the tester local user
*/
charstring publUsername,
/**
* @desc charstring for RFC 2617 3.2.1 qop options: Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
*/
charstring qop,
/**
* @desc charstring for RFC 2617 3.2.2 username for authentication The name of user in the specified realm
*/
charstring privUsername,
/**
* @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
*/
charstring passwd,
/**
* @desc charstring for registrar domain for authentication and request line
*/
charstring registrarDomain
}
} // end group otherTypes
} // end group Subtypes
group MSGtypes {
group RequestTypes {
// [7.1 ]
/**
* @desc generic type of a SIP request message
* @member statusLine contains a method name, a Request-URI, and the protocol version
* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
* @member messageBody depends on the request method, includes e.g. SDP message.
* @member payload contains the whole message as it has been received in its text format
*/
type record Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
// Note: the introduction of the following specific types is to enable better means for logging
// on the other side the generic type is useful for functions dealing with multiple SIP message types
type record REGISTER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record INVITE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record OPTIONS_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record BYE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record CANCEL_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record ACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
// [3262/7.1 ]
type record PRACK_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
// [3265/7.1 ]
type record NOTIFY_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
// [3265/7.1 ]
type record SUBSCRIBE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
// [3903/11.1 ]
type record PUBLISH_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
// [3311/7 ]
type record UPDATE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record REFER_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record MESSAGE_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type record INFO_Request {
RequestLine requestLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
type union RequestUnion {
REGISTER_Request Register,
INVITE_Request Invite,
OPTIONS_Request Options,
BYE_Request Bye,
CANCEL_Request Cancel,
ACK_Request Ack,
PRACK_Request Prack,
NOTIFY_Request Notify,
SUBSCRIBE_Request Subscribe,
PUBLISH_Request Publish,
UPDATE_Request Update,
REFER_Request Refer,
MESSAGE_Request Message
}
} // end group RequestTypes
group ResponseTypes {
// [7.2 ]
/**
* @desc generic type of a SIP response message
* @member statusLine consists of the protocol version followed by a numeric Status-Code and its associated textual phrase
* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
* @member messageBody depends on the response method, includes e.g. SDP message.
* @member payload contains the whole message as it has been received in its text format
*/
type record Response {
StatusLine statusLine,
MessageHeader msgHeader,
MessageBody messageBody optional,
Payload payload optional
}
} // end group ResponseTypes
// This MSG type is defined for sending synctactic variations, ans syntactically
// erroneous messages, and receving messages failed parsing.
group SyntacticTypes {
type charstring Raw;
} // end group SyntacticTypes
// This type is defined for particular SIP message body types like SDP
} // end group MSGTypes
} // end group Types
}
with {
encode "LibSip V3";
} // end module LibSip_TypesAndValues
LibSip-v3/ttcn/LibSip_SMSFunctions.ttcn3 0000664 0000000 0000000 00000003051 12375630627 0020322 0 ustar 00root root 0000000 0000000 /**
* @author STF 435, 471
* @version $Id$
* @desc This module provides the functions used by the test component
* for SIP-SMS over IMS as specified in 3GPP 24-341 tests.
* This module is part of LibSipV3.
*/
module LibSip_SMSFunctions {
import from LibSip_SMSTypesAndValues all;
function f_IA5_2oct(
charstring p_ASCII_String
) return octetstring {
var integer i;
var integer j;
var integer v_Length := lengthof(p_ASCII_String);
var integer v_Temp;
var octetstring v_Noctets := ''O;
var bitstring v_TempBitSrc := ''B;
var bitstring v_TempBitDes := ''B;
if ((v_Length <= 0) or (v_Length > 160) or (((v_Length * 7) mod 8) != 0)) {
log("*** " & __SCOPE__ & "INFO: Invalid value of input string length ***");
}
for (i := 0; i < v_Length; i := i + 1) {
v_Temp := char2int(p_ASCII_String[i]);
v_TempBitSrc := int2bit(v_Temp, 8);
for (j := 1; j <= 7; j := j + 1) {
v_TempBitDes := v_TempBitSrc[8 - j] & v_TempBitDes;
if (((7 * i + j) mod 8) == 0) {
v_Noctets := v_Noctets & bit2oct(v_TempBitDes);
v_TempBitDes := ''B;
}
}
}
return v_Noctets;
} // f_IA5_2oct
external function fx_GetSC_TimeStamp(
integer p_TimeZone
) return TP_ServiceCentreTimeStamp_Type;
} // End of module LibSip_SMSFunctions LibSip-v3/ttcn/LibSip_SMSTemplates.ttcn3 0000664 0000000 0000000 00000027013 12375630627 0020314 0 ustar 00root root 0000000 0000000 /**
* @author STF 435, STF 471
* @version $Id$
* @desc This module provides the types used by the test component
* for SIP-SMS over IMS as specified in 3GPP 24-341 tests.
* This module is part of LibSipV3.
*/
module LibSip_SMSTemplates {
import from LibCommon_DataStrings all;
import from LibSip_SMSTypesAndValues all;
import from LibSip_SMSFunctions all;
group SMS_Templates_Group {
/* Non-SMS Type Constraints */
template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlanAny := {
extBit := ?,
typeOfNumber := ?,
numberingPlanId := ?
}
template(value) TypeOfNumberingPlan m_TypeOfNumberingPlan := {
extBit := '1'B,
typeOfNumber := '001'B, // international number
numberingPlanId :=
'0001'B // ISDN/telephony numbering plan (Rec. E.164/E.163)
}
template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlan := mw_TypeOfNumberingPlanAny;
/* End Non-SMS Type Constraints */
template(value) RP_OriginatorAddress_dl m_RP_OriginatorAddress_dl := {
spare := omit,
iei := omit,
iel := '06'O, // 6 semi-octets
typeOfNumberingPlan := m_TypeOfNumberingPlan,
digits := '001122'O
}
template(present) RP_OriginatorAddress_ul mw_RP_OriginatorAddress_ul := {
spare := omit,
iei := omit,
iel := '00'O
}
template(present) RP_DestinationAddress_ul mw_RP_DestinationAddress_ul := {
spare := omit,
iei := omit,
iel := ?,
typeOfNumberingPlan := mw_TypeOfNumberingPlan,
digits := ?
}
template(omit) RP_DestinationAddress_dl m_RP_DestinationAddress_dl := {
spare := omit,
iei := omit,
iel := '00'O
}
template(omit) RP_UserData m_RP_UserData_DELIVER(
octetstring p_Digits
) := {
spare := omit,
iei := omit,
iel := int2oct((153 + lengthof(p_Digits)), 1),
tP_PDU := {SMS_DELIVER := m_SMS_DELIVER(p_Digits)}
}
template(value) RP_UserData m_RP_UserData_SUBMIT_REPORT := {
spare := '0'B,
iei := c_IEI_RP_UserData,
iel := '0A'O, // the TPDU data length is 10 octets
tP_PDU := {SMS_SUBMIT_REPORT := m_SMS_SUBMIT_REPORT}
}
template(value) RP_UserData m_RP_UserData_STATUS_REPORT(
template(value) TP_MessageReference_Type p_MessageRef,
template(value) TP_Address_Type p_RecipientAddress,
template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
) modifies m_RP_UserData_SUBMIT_REPORT := {
tP_PDU := {SMS_STATUS_REPORT := m_SMS_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)}
}
template(present) RP_UserData mw_RP_UserData_SUBMIT := {
spare := omit,
iei := omit,
iel := ?,
tP_PDU := {SMS_SUBMIT := mw_SMS_SUBMIT_VPF_REF}
}
template(present) RP_UserData mw_RP_UserData_DELIVER_REPORT := {
spare := '0'B,
iei := c_IEI_RP_UserData,
iel := ?,
tP_PDU := {SMS_DELIVER_REPORT := mw_SMS_DELIVER_REPORT}
}
/* End SM-RP Type Constraints */
/* SM-RP PDU Constraints */
template(value) RP_DATA_dl_Type m_RP_DATA_dl_base := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_DATA_dl,
rP_MessageReference := '00'O,
rP_OriginatorAddress := m_RP_OriginatorAddress_dl,
rP_DestinationAddress := m_RP_DestinationAddress_dl,
rP_UserData := m_RP_UserData_DELIVER('0000'O)
}
template(value) RP_DATA_dl_Type m_RP_DATA_dl_DELIVER(
octetstring p_Digits
) modifies m_RP_DATA_dl_base := {rP_UserData := m_RP_UserData_DELIVER(p_Digits)}
template(value) RP_DATA_dl_Type m_RP_DATA_dl_STATUS_REPORT(
template(value) TP_MessageReference_Type p_MessageRef,
template(value) TP_Address_Type p_RecipientAddress,
template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
) modifies m_RP_DATA_dl_base := {
rP_UserData := m_RP_UserData_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)
}
template(present) RP_DATA_ul_Type mw_RP_DATA_ul_SUBMIT := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_DATA_ul,
rP_MessageReference := ?,
rP_OriginatorAddress := mw_RP_OriginatorAddress_ul,
rP_DestinationAddress := mw_RP_DestinationAddress_ul,
rP_UserData := mw_RP_UserData_SUBMIT
}
template(value) RP_ACK_Type m_RP_ACK_SUBMIT_REPORT(
template(value) Oct1 p_msgReference := '00'O
) := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_ACK_dl,
rP_MessageReference := p_msgReference,
rP_UserData := m_RP_UserData_SUBMIT_REPORT
}
template(present) RP_ACK_Type mw_RP_ACK_DELIVER_REPORT := {
spare5 := '00000'B,
rP_MessageTypeIndicator := c_MT_RP_ACK_ul,
rP_MessageReference := ?,
rP_UserData := mw_RP_UserData_DELIVER_REPORT
}
/* End SM-RP PDU Constraints */
/* SM-TP Type Constraints */
template(value) TP_ProtocolIdentifier_Type mw_TP_ProtocolIdentifier := {
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
}
template(value) TP_ProtocolIdentifier_Type m_TP_ProtocolIdentifier := {
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
}
template(value) TP_DataCodingScheme_Type m_TP_DataCodingScheme := {
codingGroup := '0000'B,
codeValue := '0000'B
}
template(present) TP_Address_Type mw_TP_AddressAny := {
iel := ?,
typeOfNumberingPlan := mw_TypeOfNumberingPlanAny,
digits := *
}
template(value) TP_Address_Type m_TP_Address(
octetstring p_Digits
) := {
iel := int2oct(2 * lengthof(p_Digits), 1),
// length is number of useful semi-octets
// as p_digits is declared as octetstring the number must be even
typeOfNumberingPlan := m_TypeOfNumberingPlan,
digits := p_Digits
}
template(value) TP_ParameterIndicator_Type m_TP_ParameterIndicator := {
extBit1 := '0'B,
spare4 := '0000'B,
tP_UDL := '0'B,
tP_DCS := '0'B,
tP_PID := '1'B
}
/* End SM-TP Type Constraints */
/* SM-TP PDU Constraints */
template(value) SMS_DELIVER_Type m_SMS_DELIVER(
octetstring p_Digits
) := {
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportIndication := '1'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := c_MT_SMS_DELIVER,
tP_OriginatingAddress := m_TP_Address(p_Digits),
tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := m_TP_DataCodingScheme,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_UserDataLength := int2oct(160, 1),
tP_UserData := f_IA5_2oct(c_Fox)
}
template(present) SMS_DELIVER_REPORT_Type mw_SMS_DELIVER_REPORT := {
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := c_MT_SMS_DELIVER_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := ?,
tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := *,
tP_UserDataLength := *,
tP_UserData := *
}
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT := {
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '??'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := c_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := mw_TP_AddressAny,
tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := *,
tP_UserDataLength := int2oct(160, 1),
tP_UserData :=
? // any data will do: 140 octets
}
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_NP modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '00'B,
tP_ValidityPeriod := omit
}
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_REF modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '10'B,
tP_ValidityPeriod := ?
}
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ENH modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '01'B,
tP_ValidityPeriod := ?
}
template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ABS modifies mw_SMS_SUBMIT := {
tP_ValidityPeriodFormat := '11'B,
tP_ValidityPeriod := ?
}
template(value) SMS_SUBMIT_REPORT_Type m_SMS_SUBMIT_REPORT := {
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := c_MT_SMS_SUBMIT_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := m_TP_ParameterIndicator,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
}
template(value) SMS_STATUS_REPORT_Type m_SMS_STATUS_REPORT(
template(value) TP_MessageReference_Type p_MessageRef,
template(value) TP_Address_Type p_RA,
template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
) := {
// TS 34.229-1 clause A.7.5
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportQualifier := '0'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := c_MT_SMS_STATUS_REPORT,
tP_MessageReference := p_MessageRef,
tP_RecipientAddress := p_RA,
tP_ServiceCentreTimeStamp := p_SCTP,
tP_DischargeTime := '00000000000000'H,
tP_Status := {
reserved := '0'B,
status := '0000000'B
},
tP_ParameterIndicator := m_TP_ParameterIndicator,
tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
}
/* End SM-TP PDU Constraints */
} // group SMS_Templates_Group
} // End of module LibSip_SMSTypesAndValues LibSip-v3/ttcn/LibSip_SMSTypesAndValues.ttcn 0000664 0000000 0000000 00000046331 12375630627 0021206 0 ustar 00root root 0000000 0000000 /******************************************************************************
* @author STF 435, STF471
* @version $Id$
* @desc This module contains the type definitions for SMS messages as specified in
* 3GPP 24-011 and 3GPP 23-040 Rel 8 and 9.
* SMS over IMS is specified in 3GPP 24-341.
* This module is part of LibSipV3.
*/
module LibSip_SMSTypesAndValues {
import from LibCommon_DataStrings all;
group SMS_Declarations {
const RP_MessageTypeIndicator_Type c_MT_RP_DATA_ul := '000'B;
/* RP_DATA_ul */
const RP_MessageTypeIndicator_Type c_MT_RP_DATA_dl := '001'B;
/* RP_DATA_dl */
const RP_MessageTypeIndicator_Type c_MT_RP_ACK_ul := '010'B;
/* RP_ACK_ul */
const RP_MessageTypeIndicator_Type c_MT_RP_ACK_dl := '011'B;
/* RP_ACK_dl */
const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_ul := '100'B;
/* RP_ERROR_ul */
const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_dl := '101'B;
/* RP_ERROR_dl */
const RP_MessageTypeIndicator_Type c_MT_RP_SMMA := '110'B;
/* RP_SMMA */
const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER := '00'B;
/* SMS DELIVER */
const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER_REPORT := '00'B;
/* SMS DELIVER REPORT */
const TP_MessageTypeIndicator_Type c_MT_SMS_STATUS_REPORT := '10'B;
/* SMS STATUS REPORT */
const TP_MessageTypeIndicator_Type c_MT_SMS_COMMAND := '10'B;
/* SMS COMMAND */
const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT := '01'B;
/* SMS SUBMIT, SMS SUBMIT REPORT */
const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT_REPORT := '01'B;
/* SMS SUBMIT, SMS SUBMIT REPORT */
const Bit7 c_IEI_RP_UserData := '1000001'B;
/* 24.011 cl. 8.2.5.3 */
const charstring c_Fox := "The quick brown fox jumps over the lazy dog's back. Kaufen Sie Ihrer Frau vier bequeme Pelze. - 0123456789 - THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'S BACK.";
type record TypeOfNumberingPlan {
/* 24.008 cl. 10.5.4.7, 10.5.4.9, 10.5.4.13 */
Bit1 extBit,
/* Extension Bit */
Bit3 typeOfNumber,
/* Type Of Number */
Bit4 numberingPlanId /* Numbering Plan Identification */
}
/* SM-RP Type Declarations */
type Bit3 RP_MessageTypeIndicator_Type;
/* 24.011 cl. 8.2.2 */
type Oct1 RP_MessageReference_Type;
/* 24.011 cl. 8.2.3 */
type record RP_OriginatorAddress_dl {
/* 24.011 cl. 8.2.5.1 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel,
/* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
/* */
octetstring digits length(1 .. 10)
}
type record RP_OriginatorAddress_ul {
/* 24.011 cl. 8.2.5.1 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel /* 0 */
}
type record RP_DestinationAddress_ul {
/* 24.011 cl. 8.2.5.2 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel,
/* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
/* */
octetstring digits length(1 .. 10)
}
type record RP_DestinationAddress_dl {
/* 24.011 cl. 8.2.5.2 */
Bit1 spare optional,
/* 0 */
Bit7 iei optional,
/* 0101 1110 */
Oct1 iel /* 0 */
}
type record RP_UserData {
/* 24.011 cl. 8.2.5.3 */
Bit1 spare optional,
/* 0, present in case of TLV; omit in case of LV */
Bit7 iei optional,
/* 1000001, present in case of TLV; omit in case of LV */
Oct1 iel,
/* */
TP_PDU_Type tP_PDU /* <= 232 octets */
}
type record RP_Cause {
/* 24.011 cl. 8.2.5.4 */
Bit1 spare optional,
/* present in case of TLV; omit in case of LV */
Bit7 iei optional,
/* present in case of TLV; omit in case of LV */
Oct1 iel,
/* 2 or 3 */
Bit1 extBit1,
/* 0 */
Bit7 causeValue1,
/* Table 8.4/3GPP TS 24.011 */
Bit1 extBit2,
/* 0 */
Bit7 causeValue2,
/* Table 8.4/3GPP TS 24.011 */
Oct1 diagnostic optional /* Parameters included in the return error from MAP */
}
/* End SM-RP Type Declarations */
/* SM-RP PDU Declarations */
type record RP_DATA_dl_Type {
/* 24.011 cl. 7.3.1.1
Direction: n -> ue */
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_OriginatorAddress_dl rP_OriginatorAddress,
/* cl. 8.2.5.1 M LV 1-12 octets */
RP_DestinationAddress_dl rP_DestinationAddress,
/* cl. 8.2.5.2 M LV 1 */
RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
}
type record RP_DATA_ul_Type {
/* 24.011 cl. 7.3.1.2
Direction: ue -> n */
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_OriginatorAddress_ul rP_OriginatorAddress,
/* cl. 8.2.5.1 M LV 1 */
RP_DestinationAddress_ul rP_DestinationAddress,
/* cl. 8.2.5.2 M LV 1 */
RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
}
type record RP_SMMA_Type {
/* 24.011 cl. 7.3.2
Direction: ue -> n */
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference /* cl. 8.2.3 M LV 1 */
}
type record RP_ACK_Type {
/* 24.011 cl. 7.3.3
Direction: ue <-> n */
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
}
type record RP_ERROR_Type {
/* 24.011 cl. 7.3.4
Direction: ue <-> n */
Bit5 spare5,
/* cl. 8.2.2 M V 5 bits */
RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
/* cl. 8.2.2 M V 3 bits */
RP_MessageReference_Type rP_MessageReference,
/* cl. 8.2.3 M LV 1 */
RP_Cause rP_Cause,
/* cl. 8.2.5.4 M LV 2-3 */
RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
}
type union RP_PDU_Type {
RP_DATA_dl_Type RP_DATA_dl,
RP_DATA_ul_Type RP_DATA_ul,
RP_SMMA_Type RP_SMMA,
RP_ACK_Type RP_ACK,
RP_ERROR_Type RP_ERROR
}
/* End SM-RP PDU Declarations */
/* SM-TP Type Declarations */
type record TP_Address_Type {
/* 23.040 cl. 9.1.2.5 */
Oct1 iel,
/* min value 2 and max value is 11 */
TypeOfNumberingPlan typeOfNumberingPlan,
octetstring digits length(0 .. 10) optional
}
type Bit2 TP_MessageTypeIndicator_Type;
/* 23.040 cl. 9.2.3.1 */
type Oct1 TP_MessageReference_Type;
/* 23.040 cl. 9.2.3.6 */
type Oct1 TP_UserDataLength_Type;
/* 23.040 cl. 9.2.3.16 */
type record TP_ProtocolIdentifier_Type {
/* 23.040 cl. 9.2.3.9 */
Bit2 pidType,
/* */
Bit1 interworking,
/* */
Bit5 pidValue /* */
}
type record TP_DataCodingScheme_Type {
/* 23.040 cl. 9.2.3.10 + 23.040 cl. 4 */
Bit4 codingGroup,
/* */
Bit4 codeValue /* */
}
type hexstring TP_ServiceCentreTimeStamp_Type length(14);
/* 23.040 cl. 9.2.3.11 */
type Oct1 TP_ValidityPeriodRelative_Type;
/* 23.040 cl. 9.2.3.12.1 */
type hexstring TP_ValidityPeriodAbsolute_Type length(14);
/* 23.040 cl. 9.2.3.12.2 */
type record TP_ValidityPeriodEnhanced_Type {
/* 23.040 cl. 9.2.3.12.3 */
Bit1 extBit,
/* */
Bit1 singleShot,
/* */
Bit3 spare3,
/* */
Bit3 validityPeriodFormat,
/* */
Oct6 validityPeriod /* */
}
type union TP_ValidityPeriod_Type {
/* 23.040 cl. 9.2.3.3 */
TP_ValidityPeriodRelative_Type TP_ValidityPeriodRelative,
/* Relative format */
TP_ValidityPeriodAbsolute_Type TP_ValidityPeriodAbsolute,
/* Absolute format */
TP_ValidityPeriodEnhanced_Type TP_ValidityPeriodEnhanced /* Enhanced format */
}
type record TP_Status_Type {
/* 23.040 cl. 9.2.3.15 */
Bit1 reserved,
/* */
Bit7 status /* */
}
type Bit8 TP_Command_Type;
/* 23.040 cl. 9.2.3.19 */
type record TP_ParameterIndicator_Type {
/* 23.040 cl. 9.2.3.27 */
Bit1 extBit1,
/* */
Bit4 spare4,
/* */
Bit1 tP_UDL,
/* */
Bit1 tP_DCS,
/* */
Bit1 tP_PID /* */
}
/* End SM-TP Type Declarations */
/* SM-TP PDU Declarations */
type record SMS_DELIVER_Type {
/* 23.040 cl. 9.2.2.1
Direction: n -> ue */
Bit1 tP_ReplyPath,
/* 23.040 cl. 9.2.3.17 */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportIndication,
/* 23.040 cl. 9.2.3.4 */
Bit2 spare2,
/* */
Bit1 tP_MoreMessagesToSend,
/* 23.040 cl. 9.2.3.2 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_Address_Type tP_OriginatingAddress,
/* 23.040 cl. 9.1.2.5 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type,
/* 23.040 cl. 9.2.3.10 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
/* 23.040 cl. 9.2.3.11 */
TP_UserDataLength_Type tP_UserDataLength,
/* 23.040 cl. 9.2.3.16, derived from SUBMIT */
octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24, derived from SUBMIT */
}
type record SMS_DELIVER_REPORT_Type {
/* 23.040 cl. 9.2.2.1a
Direction: ue -> n */
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit4 spare4,
/* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
Oct1 tP_FailureCause optional,
/* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
TP_ParameterIndicator_Type tP_ParameterIndicator,
/* 23.040 cl. 9.2.3.27 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
/* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 159) optional /* 23.040 cl. 9.2.3.24 */
}
type record SMS_SUBMIT_Type {
/* 23.040 cl. 9.2.2.2
Direction: ue -> n */
Bit1 tP_ReplyPath,
/* 23.040 cl. 9.2.3.17 */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportRequest,
/* 23.040 cl. 9.2.3.5 */
Bit2 tP_ValidityPeriodFormat,
/* 23.040 cl. 9.2.3.3 */
Bit1 tP_RejectDuplicates,
/* 23.040 cl. 9.2.3.25 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference,
/* 23.040 cl. 9.2.3.6 */
TP_Address_Type tP_DestinationAddress,
/* 23.040 cl. 9.1.2.5 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type,
/* 23.040 cl. 9.2.3.10 */
// one of the subsequent ValidityPeriod solutions has be removed
TP_ValidityPeriod_Type tP_ValidityPeriod optional,
/* 23.040 cl. 9.2.3.12 */
// TP_ValidityPeriodRelative_Type tP_ValidityPeriodRelative optional, /* 23.040 cl. 9.2.3.12.1 */
// TP_ValidityPeriodAbsolute_Type tP_ValidityPeriodAbsolute optional, /* 23.040 cl. 9.2.3.12.2 */
// TP_ValidityPeriodEnhanced_Type tP_ValidityPeriodEnhanced optional, /* 23.040 cl. 9.2.3.12.3 */
TP_UserDataLength_Type tP_UserDataLength,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24 */
}
type record SMS_SUBMIT_REPORT_Type {
/* 23.040 cl. 9.2.2.2a
Direction: n -> ue */
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit4 spare4,
/* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
Oct1 tP_FailureCause optional,
/* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
TP_ParameterIndicator_Type tP_ParameterIndicator,
/* 23.040 cl. 9.2.3.27 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
/* 23.040 cl. 9.2.3.11 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
/* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 152) optional /* 23.040 cl. 9.2.3.24 */
}
type record SMS_STATUS_REPORT_Type {
/* 23.040 cl. 9.2.2.3
Direction: n -> ue */
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatusReportQualifier,
/* 23.040 cl. 9.2.3.26 */
Bit2 spare2,
/* */
Bit1 tP_MoreMessagesToSend,
/* 23.040 cl. 9.2.3.2 */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference,
/* 23.040 cl. 9.2.3.6 */
TP_Address_Type tP_RecipientAddress,
/* 23.040 cl. 9.1.2.5 */
TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
/* 23.040 cl. 9.2.3.11 */
TP_ServiceCentreTimeStamp_Type tP_DischargeTime,
/* 23.040 cl. 9.2.3.12 */
TP_Status_Type tP_Status,
/* 23.040 cl. 9.2.3.15 */
TP_ParameterIndicator_Type tP_ParameterIndicator optional,
/* 23.040 cl. 9.2.3.27 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
/* 23.040 cl. 9.2.3.9 */
TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
/* 23.040 cl. 9.2.3.10 */
TP_UserDataLength_Type tP_UserDataLength optional,
/* 23.040 cl. 9.2.3.16 */
octetstring tP_UserData length(0 .. 143) optional /* 23.040 cl. 9.2.3.24 */
}
type record SMS_COMMAND_Type {
/* 23.040 cl. 9.2.2.4
Direction: ue -> n */
Bit1 spare1,
/* */
Bit1 tP_UserDataHeaderIndicator,
/* 23.040 cl. 9.2.3.23 */
Bit1 tP_StatRptReq,
/* Table 8.4/3GPP TS 24.011 */
Bit3 spare3,
/* */
TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
/* 23.040 cl. 9.2.3.1 */
TP_MessageReference_Type tP_MessageReference,
/* 23.040 cl. 9.2.3.6 */
TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
/* 23.040 cl. 9.2.3.9 */
TP_Command_Type tP_CommandType,
/* 23.040 cl. 9.2.3.19 */
TP_MessageReference_Type tP_MessageNumber,
/* 23.040 cl. 9.2.3.18 */
TP_Address_Type tP_DestinationAddress,
/* 23.040 cl. 9.1.2.5 */
TP_UserDataLength_Type tP_CommandDataLength,
/* 23.040 cl. 9.2.3.20 (number of octets) */
octetstring tP_CommandData length(0 .. 156) optional /* 23.040 cl. 9.2.3.21 */
}
type union TP_PDU_Type {
SMS_DELIVER_Type SMS_DELIVER,
SMS_DELIVER_REPORT_Type SMS_DELIVER_REPORT,
SMS_SUBMIT_Type SMS_SUBMIT,
SMS_SUBMIT_REPORT_Type SMS_SUBMIT_REPORT,
SMS_STATUS_REPORT_Type SMS_STATUS_REPORT,
SMS_COMMAND_Type SMS_COMMAND
}
/* End SM-TP PDU Declarations */
}
with {
encode "SMS Types";
} // group SMS_Declarations
} // End of module LibSip_SMSTypesAndValues
LibSip-v3/ttcn/LibSip_SimpleMsgSummaryTypes.ttcn 0000664 0000000 0000000 00000003352 12375630627 0022213 0 ustar 00root root 0000000 0000000 /**
* @author STF 406, 471
* @version $Id: LibSip_SimpleMsgSummaryTypes.ttcn 488 2010-11-08 10:17:19Z pintar $
* @desc This module provides the SMS type system for SIP tests.
* This module is part of LibSipV3.
*/
module LibSip_SimpleMsgSummaryTypes {
// RFC 3842
group SMSConstants {
// IMS ETSI name MWI application
const charstring c_imsEtsiMwiApplication := "application/simple-message-summary";
// msg_status line := "Message-Waiting"
const charstring c_messageWaiting := "Message-Waiting";
// msg_status line := "Message-Account"
const charstring c_messageAccount := "Message-Account";
// msg_summary line := "Voice-Message"
const charstring c_voiceMessage := "Voice-Message";
}
group SMSTypes {
type record SimpleMsgSummary {
// Simple_message_summary
Msg_status_line msg_status_line,
Msg_account msg_account optional,
Msg_summary_line_list msg_summary_line_list optional,
Opt_msg_headers opt_msg_headers optional
}
type record Msg_status_line {
charstring msg_type,
charstring msg_status
}
type record Msg_account {
charstring msg_type_account,
charstring account_URI
}
type set of Msg_summary_line Msg_summary_line_list;
type record Msg_summary_line {
charstring msg_context_class,
charstring msgs,
charstring urgent_msgs optional
}
type set of charstring Opt_msg_headers;
// type integer msgcount length(1); //msgs and urgent_msgs can be dividet into subtypes
}
} LibSip-v3/ttcn/LibSip_Steps.ttcn 0000664 0000000 0000000 00000622612 12375630627 0017014 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @version $Id$
* @desc This module provides the functions, altsteps and external functions used
* for SIP-IMS tests.
* This module is part of LibSipV3.
*/
module LibSip_Steps {
// LibCommon
import from LibCommon_Sync all;
import from LibCommon_VerdictControl all;
// LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_Templates all;
import from LibSip_Interface all;
import from LibSip_PIXITS all;
import from LibSip_XMLTypes all;
group externalfunctions {
/**
* @desc External function to return random charstring
*/
external function fx_rndStr(
) return charstring;
/**
* @desc External function to return the equivalent string in lower case
*/
external function fx_putInLowercase(
charstring p_string
) return charstring;
/**
* @desc External function to get IP address.
*/
external function fx_getIpAddr(
charstring p_host_name
) return charstring;
/**
* @desc External function to generate a digest response.
* @reference RFC 2617 HTTP Authentication: Basic and Digest Access Authentication, and RFC 1321 The MD5 Message-Digest Algorithm
* @see RFC 2617, chapter 5 Sample implementation, for example usage, as the signature of calculateDigestResponse is according to the example given in the RFC.
*/
external function fx_calculateDigestResponse(
charstring p_nonce,
charstring p_cnonce,
charstring p_user,
charstring p_realm,
charstring p_passwd,
charstring p_alg,
charstring p_nonceCount,
charstring p_method,
charstring p_qop,
charstring p_URI,
charstring p_HEntity
) return charstring;
}
group ParameterOperations {
/**
* @desc function to generate a 32 bits random number as a charstring for tag field (used as e.g.: tag in from-header field, or branch parameter in via header)
* @return random value with at least 32 bits of randomness
*/
function f_getRndTag(
) return charstring {
var charstring v_tag_value;
// tag_value is initialized with a random value with at least 32 bits of randomness
// 4294967296 is a 32 bits integer
v_tag_value := fx_rndStr() & fx_rndStr();
return (v_tag_value);
}
/**
* @desc Function to prepare credentials for request that has an empty entity body such as a REGISTER message.
* @param p_userprofile to get important parameters
* @param p_algorithm Algorthm to be used. Default: omit
* @return Credentials field
*/
function f_calculatecCredentials_empty(
in SipUserProfile p_userprofile,
in boolean p_algorithm := false
) return Credentials {
var Credentials v_result;
// RFC 2617 3.2.2 username:
// The name of user in the specified realm.
var charstring v_username := p_userprofile.privUsername;
var charstring v_realm := p_userprofile.registrarDomain;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
var CommaParam_List v_digestResponse := {};
// Construct credentials for an Authorization field of a request.
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := v_username }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := "" }
}); // already enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "response",
paramValue := { quotedString := "" }
}); // already enclosed to " characters
if (p_algorithm) {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := PX_AUTH_ALGORITHM }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
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 Credentials v_result;
var charstring v_nonce := "";
var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 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;
// a new pseudo-random cnonce value is used every time
// that assumes it is only used once
const charstring cl_nonceCount := "00000001";
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
// MD5 hash of empty entity body.
const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
var CommaParam_List v_digestResponse := {};
// 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, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
// Construct credentials for an Authorization field of a request.
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := v_username }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := v_nonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "response",
paramValue := { quotedString := v_response }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := "md5" }
}); // algorithm is not enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "cnonce",
paramValue := { quotedString := v_cnonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "qop",
paramValue := { tokenOrHost := v_qop }
}); // qop
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nc",
paramValue := { tokenOrHost := cl_nonceCount }
}); // nonceCount
if (v_opaque != "") {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "opaque",
paramValue := { quotedString := v_opaque }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
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 := "";
var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 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;
// a new pseudo-random cnonce value is used every time
// that assumes it is only used once
const charstring cl_nonceCount := "00000001";
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
// MD5 hash of empty entity body.
const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
var CommaParam_List v_digestResponse := {};
// 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, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := v_username }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := v_nonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := "md5" }
}); // algorithm is not enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "cnonce",
paramValue := { quotedString := v_cnonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "qop",
paramValue := { tokenOrHost := v_qop }
}); // qop
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nc",
paramValue := { tokenOrHost := cl_nonceCount }
}); // nonceCount
if (v_opaque == "") {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "opaque",
paramValue := { quotedString := v_opaque }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
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 := { quotedString := v_realm }
},
{
id := "nonce",
paramValue := { quotedString := "0edff6c521cc3f407f2d9e01cf6ed82b" }
},
{
id := "algorithm",
paramValue := { tokenOrHost := PX_AUTH_ALGORITHM }
}, // algorithm is not enclosed with " characters
{
id := "ck",
paramValue := { quotedString := "00112233445566778899aabbccddeeff" }
},
{
id := "ik",
paramValue := { quotedString := "ffeeddccbbaa99887766554433221100" }
}, // already enclosed to " characters
{
/**
* This directive is optional, but is made so only for backward compatibility with RFC 2069
* it SHOULD be used by all implementations compliant with this version of the Digest scheme
*/
id := "qop",
paramValue := { tokenOrHost := v_qop }
} // qop
}
};
return v_result;
}
/**
* @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message and at the end put different private name
* @param p_userprofile to get important parameters
* @param p_method (can be "REGISTER", "INVITE",....)
* @param p_challenge parameter from 4xx response
* @return Credentials field
* @verdict
*/
function f_calculatecCredentialsAndChangeUserName(
in SipUserProfile p_userprofile,
in charstring p_method,
in CommaParam_List p_challenge
) return Credentials {
var Credentials v_result;
var charstring v_nonce := "";
var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
// 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;
// a new pseudo-random cnonce value is used every time
// that assumes it is only used once
const charstring cl_nonceCount := "00000001";
var charstring v_qop := p_userprofile.qop;
var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
// MD5 hash of empty entity body.
const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
var charstring v_response;
var charstring v_opaque;
var CommaParam_List v_digestResponse := {};
// 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, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
// Construct credentials for an Authorization field of a request.
v_digestResponse := f_addParameter(v_digestResponse, {
id := "username",
paramValue := { quotedString := "DifferentToPrivateUser" }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "realm",
paramValue := { quotedString := v_realm }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nonce",
paramValue := { quotedString := v_nonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "uri",
paramValue := { quotedString := v_uri }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "response",
paramValue := { quotedString := v_response }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "algorithm",
paramValue := { tokenOrHost := "md5" }
}); // algorithm is not enclosed to " characters
v_digestResponse := f_addParameter(v_digestResponse, {
id := "cnonce",
paramValue := { quotedString := v_cnonce }
});
v_digestResponse := f_addParameter(v_digestResponse, {
id := "qop",
paramValue := { tokenOrHost := v_qop }
}); // qop
v_digestResponse := f_addParameter(v_digestResponse, {
id := "nc",
paramValue := { tokenOrHost := cl_nonceCount }
});
if (v_opaque != "") {
v_digestResponse := f_addParameter(v_digestResponse, {
id := "opaque",
paramValue := { quotedString := "" }
}); // already enclosed to " characters
}
v_result := {digestResponse := v_digestResponse};
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 := lengthof(p_challenge);
var charstring v_id := fx_putInLowercase(p_id);
var integer i;
for (i := 0; i < v_len; i := i + 1) {
if (fx_putInLowercase(p_challenge[i].id) == v_id) {
v_result := true;
}
}
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 := lengthof(p_param_l);
while (i < v_numberOfParams) {
if (fx_putInLowercase(p_param_l[i].id) == c_tagId) {
return (true);
}
i := i + 1;
}
return (false);
}
/**
* @desc Function to remove a parameter from SemicolonParam_List
* @param p_param_l SemicolonParam_List
* @return SemicolonParam_List new parameter list
*/
function f_removeParameter(
SemicolonParam_List p_param_l,
charstring p_id
) runs on SipComponent
return SemicolonParam_List {
var integer v_numberOfParams;
var integer i := 0;
var integer j := 0;
var SemicolonParam_List v_newParamList;
v_numberOfParams := lengthof(p_param_l);
while (i < v_numberOfParams) {
if (not fx_putInLowercase(p_param_l[i].id) == p_id) {
v_newParamList[j] := p_param_l[i];
j := j + 1;
}
i := i + 1;
}
return v_newParamList;
}
/**
* @desc Function to add a parameter to SemicolonParam_List
* @param p_param_l SemicolonParam_List
* @return SemicolonParam_List new parameter list
*/
function f_addParameter(
SemicolonParam_List p_param_l,
GenericParam p_genparam
)
return SemicolonParam_List {
var SemicolonParam_List v_newParamList := p_param_l;
var integer v_numberOfParams := lengthof(p_param_l);
v_newParamList[v_numberOfParams] := p_genparam;
return v_newParamList;
}
/**
* @desc Function to extract paramValue related to id from CommanParam_List containing challenge.
* @param p_challenge parameter from 4xx response
* @param p_id name of parameter("nonce", "realm",...)
* @return parameter p_id value
*/
function f_extractParamValueFromChallenge(
in CommaParam_List p_challenge,
in charstring p_id
) return charstring {
var charstring v_result := "";
var integer v_len := lengthof(p_challenge);
var charstring v_id := fx_putInLowercase(p_id);
var integer i;
var charstring v_tmpchar;
for (i := 0; i < v_len; i := i + 1) {
if (fx_putInLowercase(p_challenge[i].id) == v_id) {
if (isvalue(p_challenge[i].paramValue)) {
if(ischosen(p_challenge[i].paramValue.quotedString)) {
v_result := valueof(p_challenge[i].paramValue.quotedString);
} else {
v_result := valueof(p_challenge[i].paramValue.tokenOrHost);
}
}
}
}
if (v_result == "") {
if (match(p_id, "algorithm")) {
v_result := "MD5";
}
else if (match(p_id, "opaque")) {
v_result := "";
}
else {
v_tmpchar := "Cannot acquire value from credentials.";
log("*** " & __SCOPE__ &": INFO: Cannot acquire value from credentials ***");
setverdict(inconc);
stop;
}
}
return v_result;
}
/**
* @desc Return the updated component variable of via header
* @return component variable of via header
*/
function f_updateViaHeaderAS(
in Via p_via
) runs on SipComponent
return Via {
var Via v_via;
var ViaBody_List v_viaBody_List := p_via.viaBody;
var integer v_size_via := lengthof(v_viaBody_List);
var integer v_size_via_updated := v_size_via + 1;
var ViaBody_List v_viaBody_List_updated;
var integer i;
vc_branch := c_branchCookie & f_getRndTag();
v_viaBody_List_updated[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile));
// p_viaBody_List_updated[0 ] := vc_request.msgHeader.route.routeBody[0 ] ;
for (i := 1; i < v_size_via_updated; i := i + 1) {
v_viaBody_List_updated[i] := v_viaBody_List[i - 1];
}
v_via.fieldName := p_via.fieldName;
v_via.viaBody := v_viaBody_List_updated;
return (v_via);
}
/**
* @desc Return the updated component variable of route header
* @return component variable of route header
*/
function f_updateRouteHeaderAS(
in Route p_route
) runs on SipComponent
return Route {
var Route v_route;
var RouteBody_List v_routeBody_List := p_route.routeBody;
var integer v_size_route := lengthof(v_routeBody_List);
var integer v_size_route_updated := v_size_route - 1;
var RouteBody_List v_routeBody_List_updated;
var integer i;
for (i := 0; i < v_size_route_updated; i := i + 1) {
v_routeBody_List_updated[i] := v_routeBody_List[i + 1];
}
v_route.fieldName := p_route.fieldName;
v_route.routeBody := v_routeBody_List_updated;
return (v_route);
}
/**
* @desc Return the updated component variable of record route header
* @return component variable of record route header
*/
function f_updateRecordRouteHeaderAS(
in template(value) RecordRoute p_recordRoute
) runs on SipComponent
return RecordRoute {
var
RecordRoute
v_recordRoute :=
valueof(
m_recordRoute_currIpAddr_params(
vc_userprofile,
{
{
"lr",
omit
}
}
)
);
var integer v_size_recordRoute := 0;
var integer i;
if (isvalue(p_recordRoute)) {
v_size_recordRoute := lengthof(valueof(p_recordRoute).routeBody);
}
for (i := 1; i < v_size_recordRoute + 1; i := i + 1) {
v_recordRoute.routeBody[i] := valueof(p_recordRoute).routeBody[i - 1];
}
return (v_recordRoute);
}
} // 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, { tokenOrHost := 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 GenValue p_parameter_value,
inout ViaBody p_viaBody
) {
if (isvalue(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 GenValue p_parameter_value,
inout To p_to
) {
if (isvalue(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
) {
var boolean v_precondition_found;
var integer i;
if (isvalue(p_message.msgHeader.require)) {
v_precondition_found := false;
for (i := 0; i < lengthof(p_message.msgHeader.require.optionsTags); i := i + 1) {
if (match(p_message.msgHeader.require.optionsTags[i], c_tagPrecond)) {
v_precondition_found := true;
}
}
if (not (v_precondition_found)) {
setverdict(fail);
log("*** " & __SCOPE__ & ": FAIL: precondition not found in Require options list! ***");
}
}
else {
setverdict(fail);
log("*** " & __SCOPE__ & ": FAIL: Require options is not present! ***");
}
}
/**
* @desc function checks if P-Charging-Vector contains a particular parameter
* @param p_message (request or response) SIP message to be analysed
* @param p_id name of parameter
* @return true if p_id parameter exist
*/
function f_checkPChargingVectorHeaderParamId(
in Request p_message,
charstring p_id
) return boolean {
var integer i;
if (isvalue(p_message.msgHeader.pChargingVector)) {
for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) {
if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) {
return (true);
}
}
}
return (false);
}
/**
* @desc function checks if P-Charging-Vector contains a particular parameter
* @param p_message (request or response) SIP message to be analysed
* @param p_id name of parameter
* @return true if p_id parameter exist
*/
function f_checkPChargingVectorHeaderParamIdResponse(
in Response p_message,
charstring p_id
) return boolean {
var integer i;
if (isvalue(p_message.msgHeader.pChargingVector)) {
for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) {
if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) {
return true;
}
}
}
return (false);
}
/**
* @desc function returns the Host/Port of a given Contact header field
* @param p_contact contact header field to be analysed
* @return Host/Port record from the contact header field
*/
function f_getContactUri(
in ContactAddress p_contact
) runs on SipComponent
return SipUrl {
var SipUrl v_SipUrl;
if (ischosen(p_contact.addressField.nameAddr)) {
v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
}
else {
v_SipUrl := p_contact.addressField.addrSpecUnion;
}
return (v_SipUrl);
} // end f_getContactUri
/**
* @desc function returns the Host/Port of a given Contact header field
* @param p_contact contact header field to be analysed
* @return Host/Port record from the contact header field
*/
function f_getContactAddr(
in ContactAddress p_contact
) runs on SipComponent
return HostPort {
var HostPort v_locAddr;
var SipUrl v_SipUrl;
if (ischosen(p_contact.addressField.nameAddr)) {
v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
}
else {
v_SipUrl := p_contact.addressField.addrSpecUnion;
}
v_locAddr.host := v_SipUrl.components.sip.hostPort.host;
if (isvalue(v_SipUrl.components.sip.hostPort.portField)) {
v_locAddr.portField := v_SipUrl.components.sip.hostPort.portField;
}
else {
v_locAddr.portField := c_defaultSipPort;
}
return (v_locAddr);
} // end f_getContactAddr
/**
* @desc function checks if History-Info-Header of the p_message contains a particular URI
* @param p_message (request or response) SIP message to be analysed
* @param p_URI name of parameter
* @return true if p_URI parameter exist
*/
function f_checkHeaderInfoURI(
in Response p_message,
SipUrl p_URI
) return boolean {
var integer i;
if (isvalue(p_message.msgHeader.historyInfo)) {
for (i := 0; i < lengthof(p_message.msgHeader.historyInfo.historyInfoList); i := i + 1) {
if (p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI) {
return (true);
}
}
}
return (false);
}
/**
* @desc function returns the Userinfo from a given To header field
* @param p_to To header field to be analysed
* @return Userinfo from the To header field as a charstring
*/
function f_getUserfromTo(
in To p_to
) runs on SipComponent
return charstring {
var SipUrl v_SipUrl;
if (ischosen(p_to.addressField.nameAddr)) {
v_SipUrl := p_to.addressField.nameAddr.addrSpec;
}
else {
v_SipUrl := p_to.addressField.addrSpecUnion;
}
return (v_SipUrl.components.sip.userInfo.userOrTelephoneSubscriber);
} // end f_getUserfromTo
/**
* @desc function to generate a 32 bits random number as a charstring for tag field
* @param p_cSeq_s CSeq parameter used to modify the tag field value
* @return tag value
*/
function f_getRndCallId(
) return charstring {
var charstring v_tag_value := fx_rndStr() & fx_rndStr();
// v_tag_value is initialized with a random value with at least 32 bits of randomness
// 4294967296 is a 32 bits integer
// v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber );
return (v_tag_value);
}
/**
* @desc function give access to the top element of the Path header field.
* @param p_Request SIP message to be analysed
* @return NameAddr (e.g. ) or omit
*/
function f_getPathHeaderTop(
inout Request p_Request
) return template(omit) NameAddr {
if (isvalue(p_Request.msgHeader.path)) {
if (lengthof(p_Request.msgHeader.path.pathValues) > 0) {
return (p_Request.msgHeader.path.pathValues[0].nameAddr);
}
}
return (omit);
}
/**
* @desc function updates first element of a Via headerfield list
* @param p_viaBody_List address list of a Via header field
* @param p_source_address address to be inserted in the top element
*/
function f_getViaReplyAddr(
inout ViaBody_List p_viaBody_List,
inout Address4SIP p_source_address
) runs on SipComponent {
var ViaBody v_viaBody;
// The address to send message shall be updated after getting information
// in the Via header fied and according to 18.2.2
v_viaBody := p_viaBody_List[0];
// received parameter has to be addded to the via hader field
// Be careful it could be an Host name and not an IP Address
// One of the reasons this error can occur is if no DNS server is available.
// As a workaround, it is possible to adapt the configuration on the local machine the test
// suite is running on (e.g. under Windows the following file could be configured:
// C:\WINDOWS\system32\drivers\etc\hosts).
// Check if host address can be rosolved
if (not f_equivalentHostAddr(valueof(v_viaBody.sentBy.host), valueof(p_source_address.host))) {
f_addParameterIfNotPresent(c_receivedId, { tokenOrHost := valueof(p_source_address.host) }, v_viaBody);
}
if (isvalue(v_viaBody.sentBy.portField)) {
p_source_address.portField := valueof(v_viaBody.sentBy.portField);
}
else {
p_source_address.portField := c_defaultSipPort;
}
}
/**
* @desc functions give access to an element of the Route header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of Route record element to be retrieved
* @return HostPort value of the Route element or omit
*/
function f_getRouteHeaderElementAddressFromRequest(
in Request p_message,
in integer p_index
) return HostPort {
if (isvalue(p_message.msgHeader.route)) {
if (lengthof(p_message.msgHeader.route.routeBody) > p_index) {
return (p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
}
}
setverdict(fail);
return (c_hostport_dummy);
}
/**
* @desc functions give access to an element of the Record-Route header field (record).
* @param p_message (request) SIP message to be analysed
* @param p_index index of recordRoute record element to be retrieved
* @return HostPort value of the Record-Route element or omit
*/
function f_getRecordRouteHeaderElementAddressFromRequest(
in Request p_message,
in integer p_index
) return HostPort {
if (isvalue(p_message.msgHeader.recordRoute)) {
if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) {
return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
}
}
setverdict(fail);
return (c_hostport_dummy);
}
/**
* @desc functions give access to an element of the Record-Route header field (record).
* @param p_message (response) SIP message to be analysed
* @param p_index index of recordRoute record element to be retrieved
* @return HostPort value of the Record-Route element or omit
*/
function f_getRecordRouteHeaderElementAddressFromResponse(
in Response p_message,
in integer p_index
) return HostPort {
if (isvalue(p_message.msgHeader.recordRoute)) {
if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) {
return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
}
}
setverdict(fail);
return (c_hostport_dummy);
}
/**
* @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 (lengthof(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 (lengthof(p_message.msgHeader.via.viaBody) > p_index) {
return (p_message.msgHeader.via.viaBody[p_index].sentBy);
}
setverdict(fail);
return (c_hostport_dummy);
}
/**
* @desc function checks indicators if topology hiding (TH) has been applied: - second element in via-header record has tokenized-by parameter
* @param p_Request SIP message to be analysed
* @return boolean value (true indicate TH, false otherwise)
*/
function f_topologyHiding(
inout Request p_request
) runs on SipComponent
return boolean {
var GenericParam v_viaParameter;
if (lengthof(p_request.msgHeader.via.viaBody) <2 ) {
return (false);
}
v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0];
// second element
if (not v_viaParameter.id == "tokenized-by") {
return (false);
}
return (true);
}
/**
* @desc function checks indicators if topology hiding (TH) has been applied: - any element in via-header record has tokenized-by parameter
* @param Response SIP message to be analysed
* @return boolean value (true indicate TH, false otherwise)
*/
function f_topologyHidingResponse(
inout Response p_response
) runs on SipComponent
return boolean {
var GenericParam v_viaParameter;
var integer i;
for (i := 0; i < lengthof(p_response.msgHeader.via.viaBody); i := i + 1) {
v_viaParameter := p_response.msgHeader.via.viaBody[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 {
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.components.sip.hostPort;
} // end function f_setHeadersBYE
/**
* @desc setting of general and basic CANCEL header fields
* @param p_cSeq_s
*/
function f_setHeadersCANCEL(
inout CSeq p_cSeq_s
) runs on SipComponent {
p_cSeq_s.method := "CANCEL";
// vc_branch := c_branchCookie & f_getRndTag(); // STF 406: CANCEL and ACK should have the same branch as the INVITE
vc_via := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
} // end function f_setHeadersCANCEL
/**
* @desc function sets header field for the next outgoing REGISTER message
* @param p_cSeq_s CSeq parameter to be applied
* @param p_emergency Set to true in case of emergency
*/
function f_setHeaders_REGISTER(
inout CSeq p_cSeq_s,
boolean p_emergency := false
) runs on SipComponent {
var SemicolonParam_List v_params := {};
f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
vc_callIdReg := vc_callId; // remember callId for de-registration
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
vc_cancel_To := vc_to;
v_params := f_addParameter(v_params,
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
});
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
if (not vc_firstREGISTER_sent) {
if (p_emergency) {
v_params := {
{
"sos",
omit
}
};
vc_contact.contactBody.contactAddresses[0].addressField.addrSpecUnion.urlParameters := v_params;
}
else {
v_params := {
{
id := c_expiresId,
paramValue := {
tokenOrHost := c_shortRegistration
}
}
};
vc_contact.contactBody.contactAddresses[0].contactParams := v_params;
}
}
vc_firstREGISTER_sent := true; // f_setHeaders_Register is called in deREGISTER function
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_empty(vc_userprofile)}
};
vc_via_REG := vc_via;
} // end function setHeaders_REGISTER
/**
* @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
* @verdict
*/
function f_setHeaders_2ndREGISTER(
inout CSeq p_cSeq_s
) runs on SipComponent {
var CommaParam_List v_challenge;
// Increment CSeq sequence number
p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
vc_cSeq := p_cSeq_s;
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
// new branch tag due to different branch tag in new REGISTER method
vc_branch := c_branchCookie & f_getRndTag();
vc_via_REG := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
// Extract challenge and calculate credentials for a response.
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
// Prepair right answer
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)}
};
} // end function f_setHeaders_2ndREGISTER
/**
* @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER NO response in Authorization header to cause an error
* @verdict
*/
function f_setHeaders_2ndREGISTER_wo_response(
) runs on SipComponent {
var CommaParam_List v_challenge;
vc_branch := c_branchCookie & f_getRndTag();
vc_via_REG := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
if (ischosen(vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge))
// Extract challenge and calculate credentials for a response.
{
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
}
else {
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
}
// Increment CSeq sequence number
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
// Prepair right answer
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)}
};
} // end function f_setHeaders_2ndREGISTER_wo_response
/**
* @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER
* @verdict
*/
function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName(
) runs on SipComponent {
var CommaParam_List v_challenge;
vc_branch := c_branchCookie & f_getRndTag();
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
vc_via_REG := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
// Extract challenge and calculate credentials for a response.
v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
// Increment CSeq sequence number
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
// Prepair right answer
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)}
};
} // end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName
/**
* @desc function sets header fields for the next outgoing REGISTER (de-registration)
* @param p_cSeq_s cSeq to be used
* @verdict
*/
function f_setHeaders_deREGISTER(
inout CSeq p_cSeq_s
) runs on SipComponent {
var SemicolonParam_List v_params := {};
f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
// reset authorization header to not use nonce from registration (otherwise we have to increase nc)
vc_authorization := {
fieldName := AUTHORIZATION_E,
body := {f_calculatecCredentials_empty(vc_userprofile)}
};
vc_requestUri := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := omit,
hostPort := {
host := vc_userprofile.registrarDomain,
portField := omit
}
}
},
urlParameters := omit,
headers := omit
};
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
v_params := f_addParameter(v_params,
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
});
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
vc_contact := {
fieldName := CONTACT_E,
contactBody := {wildcard := "*"}
};
} // end function f_setHeaders_deREGISTER
/**
* @desc setting of general and basic Invite header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersINVITE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
if (ischosen(vc_requestUri.components.sip)) {
// sip/sips call
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
}
else if (ischosen(vc_requestUri.components.urn)) {
// Emergency call
vc_reqUrnUri := vc_requestUri.components.urn;
}
else {
log("*** " & __SCOPE__ &": INFO:f_setHeadersINVITE: unsupported field: ", vc_requestUri," ***");
setverdict(fail);
}
}
/**
* @desc setting of general and basic Update header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersUPDATE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "UPDATE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersUPDATE
/**
* @desc setting of general and basic Message header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersMESSAGE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersMESSAGE
/**
* @desc setting of general and basic Notify header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersNOTIFY(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersNOTIFY
/**
* @desc setting of general and basic Publish header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersPUBLISH(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "PUBLISH"); // cseq, contact, branch, via
// after SUBSCRIBE message callid shall be same
// vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersPUBLISH
/**
* @desc function sets header field for the next outgoing SUBSCRIBE message
* @param p_cSeq_s CSeq parameter to be applied
*/
function f_setHeaders_SUBSCRIBE(
inout CSeq p_cSeq_s
) runs on SipComponent {
var SemicolonParam_List v_params := {};
f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
vc_requestUri := valueof(m_SipUrl_currDomain(vc_userprofile));
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
// store callId from Subscribe message
vc_callIdSub := vc_callId;
vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
vc_cancel_To := vc_to;
v_params := f_addParameter(v_params,
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
});
vc_from := {
fieldName := FROM_E,
addressField := vc_to.addressField,
fromParams := v_params
};
} // end function setHeaders_SUBSCRIBE
/**
* @desc setting of general and basic Subscribe header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersSUBSCRIBE(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
vc_callId := {
fieldName := CALL_ID_E,
callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
};
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersMESSAGE
/**
* @desc setting of general and basic REFER header fields in additon to the addresses (To, From, ReqUri)
* @param p_cSeq_s
*/
function f_setHeadersREFER(
inout CSeq p_cSeq_s
) runs on SipComponent {
f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via
// vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
vc_cancel_To := vc_to;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
vc_reqHostPort := vc_requestUri.components.sip.hostPort;
} // end function f_setHeadersREFER
/**
* @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer
* @param p_Request REGISTER that has been received
*/
function f_setHeadersOnReceiptOfREGISTER(
Request p_Request
) runs on SipComponent {
f_setHeadersOnReceiptOfRequest(p_Request);
vc_callId := p_Request.msgHeader.callId;
vc_caller_From := vc_from;
f_addTagInTo(vc_to);
vc_caller_To := vc_to;
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
if (isvalue(p_Request.msgHeader.contact) and (not ischosen(p_Request.msgHeader.contact.contactBody.wildcard))) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
if (isvalue(p_Request.msgHeader.authorization)) {
vc_authorization := valueof(p_Request.msgHeader.authorization);
}
} // end f_setHeadersOnReceiptOfREGISTER
/**
* @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer
* @param p_Request SUBSCRIBE that has been received
*/
function f_setHeadersOnReceiptOfSUBSCRIBE(
Request p_Request
) runs on SipComponent {
f_setHeadersOnReceiptOfRequest(p_Request);
vc_callId := p_Request.msgHeader.callId;
vc_caller_From := vc_from;
f_addTagInTo(vc_to);
vc_caller_To := vc_to;
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
if (isvalue(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
} // end f_setHeadersOnReceiptOfSUBSCRIBE
function f_setHeadersOnReceiptOfREFER(
Request p_Request
) runs on SipComponent {
f_setHeadersOnReceiptOfRequest(p_Request);
vc_requestUri := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
if (isvalue(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
} // end f_setHeadersOnReceiptOfREFER
/**
* @desc function reads all necessary headers from the received INVITE message and generate the tag for the answer
* @param p_Request received INVITE message
* @verdict
*/
function f_setHeadersOnReceiptOfINVITE(
Request p_Request
) runs on SipComponent {
var integer i, j;
var integer v_length;
f_setHeadersOnReceiptOfRequest(p_Request);
vc_callId := p_Request.msgHeader.callId;
vc_requestUri2 := p_Request.requestLine.requestUri;
vc_cancel_To := p_Request.msgHeader.toField;
f_addTagInTo(vc_to);
vc_caller_From := vc_from;
vc_caller_To := vc_to;
if (isvalue(p_Request.msgHeader.contact)) {
vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
}
// update callee information and pick up tag if the call need to be canceled
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
vc_callee_From := {
fieldName := FROM_E,
addressField := vc_caller_To.addressField,
fromParams := vc_caller_To.toParams
};
if (isvalue(p_Request.msgHeader.privacy)) {
vc_privacy := p_Request.msgHeader.privacy;
}
if (isvalue(p_Request.messageBody)) {
// cleaning of attributes before assignment
if (isvalue(vc_sdp_remote.media_list)) {
v_length := lengthof(vc_sdp_remote.media_list);
for (i := 0; i < v_length; i := i + 1) {
if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
vc_sdp_remote.media_list[i].attributes := omit;
}
}
}
// save SDP if present
if (ischosen(p_Request.messageBody.sdpMessageBody)) {
vc_sdp_remote := p_Request.messageBody.sdpMessageBody;
vc_sdp_remote_is_valid := true;
f_prepare_SDP_answer();
}
// save XML if present
if (ischosen(p_Request.messageBody.xmlBody)) {
vc_xml_remote := p_Request.messageBody.xmlBody;
}
if (ischosen(p_Request.messageBody.mimeMessageBody)) {
for (j := 0; j < lengthof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) {
if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) {
vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
vc_sdp_remote_is_valid := true;
f_prepare_SDP_answer();
}
if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) {
vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
}
}
}
}
if (isvalue(p_Request.msgHeader.supported.optionsTags)) {
for (i := lengthof(p_Request.msgHeader.supported.optionsTags); i > 0; i := i - 1) {
if (p_Request.msgHeader.supported.optionsTags[i - 1] == "100rel") {
vc_supported_100rel := true;
}
if (p_Request.msgHeader.supported.optionsTags[i - 1] == "precondition") {
vc_supported_precondition := true;
}
}
}
} // end f_setHeadersOnReceiptOfINVITE
/**
* @desc function reads header field of a received BYE message
* @param p_Request received BYE
*/
function f_setHeadersOnReceiptOfBYE(
Request p_BYE_Request
) runs on SipComponent {
f_setHeadersOnReceiptOfRequest(p_BYE_Request);
vc_callId := p_BYE_Request.msgHeader.callId;
} // end f_setHeadersOnReceiptOfBYE
/**
* @desc function reads header field from an incoming Request message
* @param p_Request received Request message
*/
function f_setHeadersOnReceiptOfRequest(
Request p_Request
) runs on SipComponent {
vc_request := p_Request;
vc_callId := p_Request.msgHeader.callId;
vc_cSeq := valueof(p_Request.msgHeader.cSeq); // CSeq is mandatory
vc_iut_CSeq := p_Request.msgHeader.cSeq;
vc_from := p_Request.msgHeader.fromField;
vc_caller_From := p_Request.msgHeader.fromField;
vc_to := p_Request.msgHeader.toField;
vc_caller_To := p_Request.msgHeader.toField;
vc_via := p_Request.msgHeader.via;
// update sent_label according to received via header field
f_getViaReplyAddr(vc_via.viaBody, vc_sent_label);
// Catch route
vc_boo_recordRoute := false;
// add tag field into To header if tag is not present
if (not (isvalue(p_Request.msgHeader.toField.toParams))) {
vc_to.toParams := {
{
id := c_tagId,
paramValue := {
tokenOrHost := f_getRndTag()
}
}
};
vc_caller_To := vc_to;
}
if (isvalue(p_Request.msgHeader.recordRoute)) {
vc_boo_recordRoute := true;
vc_recordRoute := p_Request.msgHeader.recordRoute;
}
} // end f_setHeadersOnReceiptOfRequest
/**
* @desc functions reads header fields from an incoming Response message
* @param p_cSeq
* @param p_response received response message
* @verdict
*/
function f_setHeadersOnReceiptOfResponse(
Response p_response
) runs on SipComponent {
var integer i, j, v_nbroute;
var template(omit) Contact v_contact;
// only for local purpose
vc_response := p_response;
// vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq
vc_to := p_response.msgHeader.toField;
vc_from := p_response.msgHeader.fromField;
vc_caller_To := vc_to;
vc_caller_From := vc_from;
if (isvalue(p_response.msgHeader.contact)) {
v_contact := p_response.msgHeader.contact;
if (ischosen(v_contact.contactBody.contactAddresses)) {
vc_reqHostPort := f_getContactAddr(valueof(v_contact.contactBody.contactAddresses[0]));
vc_requestUri := f_getContactUri(valueof(v_contact.contactBody.contactAddresses[0]));
}
}
else {
if (ischosen(vc_to.addressField.addrSpecUnion.components.sip)) {
// sip/sips call
vc_reqHostPort := vc_to.addressField.addrSpecUnion.components.sip.hostPort;
}
else if (ischosen(vc_to.addressField.addrSpecUnion.components.urn)) {
// Emergency call
vc_reqUrnUri := vc_to.addressField.addrSpecUnion.components.urn;
}
else {
log("*** f_setHeadersOnReceiptOfResponse: INFO: unsupported field: ", vc_to, " ***");
setverdict(fail);
}
vc_requestUri := vc_to.addressField.addrSpecUnion;
}
vc_callee_To := {
fieldName := TO_E,
addressField := vc_caller_From.addressField,
toParams := vc_caller_From.fromParams
};
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 (isvalue(p_response.msgHeader.recordRoute)) {
vc_recordRoute := p_response.msgHeader.recordRoute;
v_nbroute := lengthof(vc_recordRoute.routeBody);
// copy and reverse the order of the routes in route header
for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
j := v_nbroute - 1 - i;
vc_route.routeBody[j] := vc_recordRoute.routeBody[i];
}
vc_route.fieldName := ROUTE_E;
vc_boo_recordRoute := true;
vc_boo_route := true;
}
else {
vc_boo_recordRoute := false;
vc_boo_route := false;
}
// extentions due to new fields in PRACK and UPDATE messages
if (isvalue(p_response.msgHeader.rSeq)) {
vc_rAck := {
fieldName := RACK_E,
responseNum := valueof(p_response.msgHeader.rSeq).responseNum,
seqNumber := valueof(p_response.msgHeader.cSeq).seqNumber,
method := valueof(p_response.msgHeader.cSeq).method
};
}
// extentions due to new HistoryInfo fields 180 or 200OK messages
if (isvalue(p_response.msgHeader.historyInfo)) {
vc_historyInfoList := valueof(p_response.msgHeader.historyInfo).historyInfoList;
vc_history_is_valid := true;
}
else {
vc_history_is_valid := false;
}
// sdpMessageBody answer
if (isvalue(p_response.messageBody)) {
if (ischosen(p_response.messageBody.sdpMessageBody)) {
vc_sdp_remote := p_response.messageBody.sdpMessageBody;
vc_sdp_remote_is_valid := true;
}
if (ischosen(p_response.messageBody.xmlBody)) {
vc_xml_remote := p_response.messageBody.xmlBody;
}
if (ischosen(p_response.messageBody.mimeMessageBody)) {
for (j := 0; j < lengthof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) {
if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) {
vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
}
if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) {
vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
}
}
}
}
} // end function f_setHeadersOnReceiptOfResponse
/**
* @desc functions reads ServiceRoute header field from an incoming 200 Response message in registration
* @param p_cSeq
* @param p_response received response message
*/
function f_getServiceRouteMapIntoRouteInRegistration(
Response p_response
) runs on SipComponent {
var integer i, j, v_nbroute;
var template(omit) ServiceRoute v_serviceRoute;
// Route Management
if (isvalue(p_response.msgHeader.serviceRoute)) {
v_serviceRoute := p_response.msgHeader.serviceRoute;
v_nbroute := lengthof(v_serviceRoute.routeBody);
// copy and reverse the order of the routes in route header
for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
j := v_nbroute - 1 - i;
vc_route.routeBody[j] := v_serviceRoute.routeBody[i];
}
vc_route.fieldName := ROUTE_E;
vc_route_REG := vc_route;
vc_boo_route := true;
}
} // end function f_getServiceRouteMapIntoRouteInRegistration
/**
* @desc functions reads Route header field from an incoming Request message and generate RecordRoute
* @param p_cSeq
* @param p_request received request message
*/
function f_getRouteMapIntoRecordRoute(
Request p_request
) runs on SipComponent {
var integer i, j, v_nbroute;
var template(omit) Route v_route;
// Route Management
if (isvalue(p_request.msgHeader.route)) {
v_route := p_request.msgHeader.route;
v_nbroute := lengthof(v_route.routeBody);
// copy and reverse the order of the routes in route header
for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
j := v_nbroute - 1 - i;
vc_recordRoute.routeBody[j] := v_route.routeBody[i];
}
vc_recordRoute.fieldName := RECORD_ROUTE_E;
vc_boo_recordRoute := true;
}
} // end function f_getRouteMapIntoRecordRoute
} // end group SetHeaders
} // end group FieldOperations
group SDPOperations {
/**
* @desc check if message body include SDP attribute (2nd parameter) for any media
*/
function f_check_attribute(
in SDP_Message p_sdp,
in template SDP_attribute p_attribute
) runs on SipComponent
return boolean {
var integer i, j;
if (isvalue(p_sdp.media_list)) {
for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) {
if (isvalue(p_sdp.media_list[j].attributes)) {
for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) {
if (match(p_sdp.media_list[j].attributes[i], p_attribute)) {
return (true);
}
}
}
}
}
if (isvalue(p_sdp.attributes)) {
for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
if (match(p_sdp.attributes[j], p_attribute)) {
return (true);
}
}
}
return (false);
}
/**
* @desc check if message body include SDP (session level) attribute (2nd parameter) for any media
*/
function f_check_session_attribute(
in SDP_Message p_sdp,
in template SDP_attribute p_attribute
) runs on SipComponent
return boolean {
var integer j;
if (isvalue(p_sdp.attributes)) {
for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
if (match(p_sdp.attributes[j], p_attribute)) {
return (true);
}
}
}
return (false);
}
/**
* @desc identify an SDP direction attribute (session or first media attribute) in a SDP message and return its answer value
* @param p_sdp the SDP message that has been received
* @param p_attribute incoming SDP attribute that need to be used for the SDP direction (answer)
* @return the new attribute (to be send out) derived from the incoming SDP value
* @verdict
*/
function f_get_attribute_answer(
in SDP_Message p_sdp,
in template SDP_attribute p_attribute
) runs on SipComponent
return SDP_attribute {
var integer i, j;
var template SDP_attribute v_attribute := p_attribute;
// check if the selected attribute is included in the SDP offer (session attributes)
if (isvalue(p_sdp.attributes)) {
for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
if (match(p_sdp.attributes[j], p_attribute)) {
v_attribute := p_sdp.attributes[j];
}
}
}
else
// check if the selected attribute is included in the SDP offer (any of the media attributes)
{
if (isvalue(p_sdp.media_list)) {
for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) {
if (isvalue(p_sdp.media_list[j].attributes)) {
for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) {
if (match(p_sdp.media_list[j].attributes[i], p_attribute)) {
v_attribute := p_sdp.media_list[j].attributes[i];
}
}
}
}
}
}
select (valueof(v_attribute)) {
case (mw_attribute_sendonly) {
return (valueof(m_attribute_recvonly));
}
case (mw_attribute_sendrecv) {
return (valueof(m_attribute_sendrecv));
} // MRO
case (mw_attribute_inactive) {
return (valueof(m_attribute_inactive));
} // MRO
case (mw_attribute_recvonly) {
return (valueof(m_attribute_sendonly));
} // MRO
}
return (valueof(m_attribute_sendrecv)); // the default return value in case of missing attribute offer
}
/**
* @desc check if message body include SDP bandwidth (2nd parameter) either for the session or a media description
*/
function f_check_bandwidth(
in SDP_Message p_loc_sdp,
in template SDP_bandwidth p_loc_bandw
) runs on SipComponent
return boolean {
var integer i, j;
if (isvalue(p_loc_sdp.bandwidth)) {
for (j := 0; j < lengthof(p_loc_sdp.bandwidth); j := j + 1) {
if (match(p_loc_sdp.bandwidth[j], p_loc_bandw)) {
return (true);
}
}
}
if (isvalue(p_loc_sdp.media_list)) {
for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) {
if (isvalue(p_loc_sdp.media_list[j].bandwidth)) {
for (i := 0; i < lengthof(p_loc_sdp.media_list[j].bandwidth); i := i + 1) {
if (match(p_loc_sdp.media_list[j].bandwidth[i], p_loc_bandw)) {
return (true);
}
}
}
}
}
return (false);
}
/**
* @desc check if message body include SDP media (2nd parameter)
*/
function f_check_media(
in SDP_Message p_loc_sdp,
in template(present) SDP_media_desc p_loc_media
) runs on SipComponent
return boolean {
var integer j;
if (isvalue(p_loc_sdp.media_list)) {
for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) {
if (match(p_loc_sdp.media_list[j].media_field.transport, p_loc_media.media_field.transport) and match(p_loc_sdp.media_list[j].media_field.fmts, p_loc_media.media_field.fmts)) {
return (true);
}
}
}
return (false);
}
/**
* @desc check if message body include precondition mechanism (a=des and a=curr) retrun true, else false
* @param loc_sdp SDP message
*/
function f_check_precondition(
in SDP_Message p_loc_sdp
) runs on SipComponent
return boolean {
if (f_check_attribute(p_loc_sdp, mw_attribute_des) or f_check_attribute(p_loc_sdp, mw_attribute_curr)) {
return (true);
}
return (false);
}
/**
* @desc check if message body include SDP media direction return true, else false
*/
function f_check_media_direction(
in SDP_Message p_loc_sdp
) runs on SipComponent
return boolean {
if (f_check_attribute(p_loc_sdp, mw_attribute_sendonly) or f_check_attribute(p_loc_sdp, mw_attribute_recvonly) or f_check_attribute(p_loc_sdp, mw_attribute_sendrecv) or f_check_attribute(p_loc_sdp, mw_attribute_inactive)) {
return (true);
}
return (false);
}
/**
* @desc copy media/attribute lines from remote to local SDP variable
*/
function f_check_SDP(
integer p_loc_sdp,
integer p_loc_codec
) runs on SipComponent
return boolean {
var SDP_media_desc v_media := f_prepare_media(p_loc_sdp, p_loc_codec);
if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media) {
return false;
}
if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport) {
return false;
}
if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts) {
return false;
}
return true;
}
/**
* @desc replace the first curr media attribute with the given value.
* @param p_sdp SDP message to modify
* @param p_curr new curr attribute
*/
function f_replace_curr_attribute(
inout SDP_Message p_sdp,
in SDP_attribute_curr p_curr
) {
var integer i;
var integer v_mn;
if (isvalue(p_sdp.media_list)) {
v_mn := lengthof(p_sdp.media_list[0].attributes);
for (i := 0; i < v_mn; i := i + 1) {
if (ischosen(p_sdp.media_list[0].attributes[i].curr)) {
p_sdp.media_list[0].attributes[i].curr := p_curr;
i := v_mn;
}
}
}
}
/**
* @desc append new media attribute to the first media description.
* @param p_sdp SDP message to modify
* @param p_att SDP attribute to appand
*/
function f_append_media_attribute(
inout SDP_Message p_sdp,
in SDP_attribute p_att
) {
var integer v_mn;
if (isvalue(p_sdp.media_list)) {
v_mn := lengthof(p_sdp.media_list[0].attributes);
p_sdp.media_list[0].attributes[v_mn] := p_att;
}
}
/**
* @desc append new media to the existing media list in SDP
*/
function f_append_media(
inout SDP_Message p_loc_SDP,
template(value) SDP_media_desc p_loc_media
) {
var integer v_mn := lengthof(p_loc_SDP.media_list);
p_loc_SDP.media_list[v_mn] := valueof(p_loc_media);
}
/**
* @desc repare media/attribute lines
*/
function f_prepare_media(
integer p_loc_sdp,
integer p_loc_codec
) runs on SipComponent
return SDP_media_desc {
var SDP_attribute_rtpmap_codec v_codecs[32] := {
{"PCMU", "8000", omit}, {"GSM", "8000", omit}, {"G723", "8000", omit}, {"DVI4", "8000", omit},
{"DVI4", "16000", omit}, {"LPC", "8000", omit}, {"PCMA", "8000", omit}, {"G722", "8000", omit},
{"L16", "44100", "2"}, {"L16", "44100", omit}, {"QCELP", "8000", omit}, {"CN","8000", omit},
{"MPA", "90000", omit}, {"G728", "8000", omit}, {"DVI4", "11025", omit}, {"DVI4", "22050", omit},
{"G729", "8000", omit}, {"G726-40", "8000", omit}, {"G726-32", "8000", omit}, {"G726-24", "8000", omit},
{"G726-16", "8000", omit}, {"G726D", "8000", omit}, {"G726E", "8000", omit}, {"GSM-EFR", "8000", omit},
{"CelB", "90000", omit}, {"JPEG", "90000", omit}, {"Nv", "90000", omit}, {"H261", "90000", omit},
{"MPV", "90000", omit}, {"MP2T" ,"90000", omit}, {"H263", "90000", omit}, {"H263-1998", "90000", omit}};
var SDP_media_desc v_media := {
media_field := {
media := "audio",
ports := {
port_number := 10000,
num_of_ports := omit
},
transport := "RTP/AVP",
fmts := {"0"}
}, // m=audio
// 8500
// RTP/AVP
// 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
};
if (32 < p_loc_codec or p_loc_codec < 1) {
log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***");
setverdict(inconc);
return (v_media);
}
if (p_loc_sdp == 1) {
}
else if (p_loc_sdp == 2) {
v_media.media_field.fmts := {PX_SIP_SDP_DYN}; // { "98", "0" };
v_media.attributes := {
{
rtpmap := {
payload_type := PX_SIP_SDP_DYN,
codec := v_codecs[p_loc_codec - 1]
}
}
};
}
else if (p_loc_sdp == 3) {
v_media.media_field.fmts := {"8"};
}
else if (p_loc_sdp == 4) {
v_media.media_field.fmts := {"99", "8"};
v_media.attributes := {
{
rtpmap := {
payload_type := "99",
codec := v_codecs[p_loc_codec - 1]
}
}
};
}
else if (p_loc_sdp == 5) {
v_media.media_field.media := "image";
v_media.media_field.transport := "udptl";
v_media.media_field.fmts := {"t38"};
}
else if (p_loc_sdp == 6) {
v_media.media_field.media := "image";
v_media.media_field.transport := "tcptl";
v_media.media_field.fmts := {"t38"};
}
else {
log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***");
setverdict(inconc);
}
return (v_media);
}
/**
* @desc repare media/attribute lines
*/
function f_prepare_SDP(
integer p_loc_sdp,
integer p_loc_codec
) runs on SipComponent {
vc_sdp_local.media_list := {f_prepare_media(p_loc_sdp, p_loc_codec)};
}
/**
* @desc function that copy media/attribute lines from remote to local SDP variable
*/
function f_prepare_SDP_answer(
) runs on SipComponent {
var integer v_mn, v_cn := 0, i, j, k := 0;
var charstring v_PT;
var SDP_attribute_rtpmap_codec v_rtpmap := { "", "", omit};
var SDP_attribute_list v_mediaAttributes := {};
// increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1);
// if more than one codec, select the firs one
v_mn := lengthof(vc_sdp_remote.media_list);
for (i := 0; i < v_mn; i := i + 1) {
// for every single media
if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_remote.media_list[i].attributes);
}
if (lengthof(vc_sdp_remote.media_list[i].media_field.fmts) > 0) {
// select the first one
v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0];
vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
for (j := 0; j < v_cn; j := j + 1) {
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap)) {
if (v_PT == vc_sdp_remote.media_list[i].attributes[j].rtpmap.payload_type) {
v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].rtpmap.codec;
v_mediaAttributes[k] := {rtpmap := {v_PT, v_rtpmap}};
k := k + 1;
} // else line is not copied
}
else {
// simple copy of attribute
v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j];
k := k + 1;
}
}
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
if (isvalue(vc_sdp_local.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_local.media_list[i].attributes);
for (j := 0; j < v_cn; j := j + 1) {
// simplified handling of status attributes (copy/keep status from peer):
// a) copy/keep SDP_attribute_curr (invert tags if applicable)
if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr)) {
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local") {
vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote";
}
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote") {
vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local";
}
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send") {
vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv";
}
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv") {
vc_sdp_local.media_list[i].attributes[j].curr.direction := "send";
}
}
else
if (
// b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)
ischosen(vc_sdp_local.media_list[i].attributes[j].des)
) {
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local") {
vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote";
}
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote") {
vc_sdp_local.media_list[i].attributes[j].des.statusType := "local";
}
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send") {
vc_sdp_local.media_list[i].attributes[j].des.direction := "recv";
}
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv") {
vc_sdp_local.media_list[i].attributes[j].des.direction := "send";
}
}
else
if (
// c) simplification: assume no SDP_attribute_conf
ischosen(vc_sdp_local.media_list[i].attributes[j].conf)
) {
// handle SDP_attribute_conf
}
}
}
}
}
// add handling of prenegotiation, change ports if required etc.
// if prenegotiation...
}
/**
* @desc reject SDP offer by setting media ports to 0
*/
function f_reject_SDP_offer(
) runs on SipComponent {
var integer mn, i;
f_copy_SDP(); // TO BE DONE with more details!
// increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1);
// if more than one codec, select the firs one
mn := lengthof(vc_sdp_local.media_list);
for (i := 0; i < mn; i := i + 1) {
vc_sdp_local.media_list[i].media_field.ports := {0, omit};
vc_sdp_local.media_list[i].attributes := omit; // {};
}
}
/**
* @desc copies SDP message elements from remote to local component variable: - bandwidth - session version (will be incremented) - media list modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
* @param p_medianum list position number of the media (if value 0 identifies first media list element)
* @param p_direction the new direction attribute to be included in the media entry
* @verdict
*/
function f_SIP_modMediaDirection(
integer p_medianum,
template(value) SDP_attribute p_direction
) runs on SipComponent {
var boolean v_set_direction;
// flag indicates if direction attribute has been modified
var integer v_mn := 0;
// length of media list (number of entries)
var integer v_cn := 0;
// number of attributes of a media entry
var integer i, j, k := 0;
var SDP_attribute_list v_mediaAttributes := {};
// collect the media attributes (to be assigned at end of function)
f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
// increment session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1);
// if more than one codec, select the first one
v_mn := lengthof(vc_sdp_local.media_list);
if (p_medianum == 0)
// specific media requested
{
p_medianum := 1; // start checking from first media
}
if (p_medianum > 0)
// specific media requested
{
if (not (p_medianum > v_mn)) {
v_mn := p_medianum;
}
}
// handling of media list elements
for (i := 0; i < v_mn; i := i + 1) {
v_cn := 0; // initialize the number of attributes of the media list entry
if (isvalue(vc_sdp_local.media_list))
// media_list is optional
{
// log("vc_sdp_local.media_list[i ] ",vc_sdp_local.media_list[i ] );
if (isvalue(vc_sdp_local.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_local.media_list[i].attributes);
}
v_set_direction := false;
// if (lengthof(vc_sdp_local.media_list[i ] .media_field.fmts)>1)
// select the first one
for (j := 0; j < v_cn; j := j + 1) {
if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv)) {
v_mediaAttributes[k] := valueof(p_direction);
v_set_direction := true;
}
else
// non-direction attributes will be copied
{
v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
}
k := k + 1;
}
if (not v_set_direction) {
v_mediaAttributes[k] := valueof(p_direction);
}
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
// }
}
}
// add handling of prenegotiation, change ports if required etc.
// if prenegotiation...
}
/**
* @desc modify session and media attributes direction
*/
function f_SIP_modSessionDirection(
template(value) SDP_attribute p_direction
) runs on SipComponent {
var boolean v_set_direction := false;
var integer v_mn := 0, i := 0;
if (isvalue(vc_sdp_local.attributes)) {
v_mn := lengthof(vc_sdp_local.attributes);
for (i := 0; i < v_mn; i := i + 1) {
// for every single attribute (that is not omit)
if (ischosen(vc_sdp_local.attributes[i].recvonly) or ischosen(vc_sdp_local.attributes[i].sendonly) or ischosen(vc_sdp_local.attributes[i].inactive) or ischosen(vc_sdp_local.attributes[i].sendrecv)) {
vc_sdp_local.attributes[i] := valueof(p_direction);
v_set_direction := true;
}
}
if (not v_set_direction)
// if not sent before
{
vc_sdp_local.attributes[v_mn] := valueof(p_direction);
}
}
else {
vc_sdp_local.attributes[0] := valueof(p_direction);
}
}
/**
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirection(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {
setverdict(fail);
}
}
else {
setverdict(pass);
log("*** " &__SCOPE__& ": INFO: attribute found in message body ***");
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirection(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {
setverdict(fail);
}
}
else {
setverdict(pass);
log("*** " &__SCOPE__& ": INFO: attribute found in message body ***");
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local) the session attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirectionSession(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {
setverdict(fail);
}
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local) the session attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirectionSession(
template(value) SDP_attribute p_direction_in,
template(value) SDP_attribute p_direction_out
) runs on SipComponent {
var template(value) SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (isvalue(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) {
if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) {
log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
}
else {
setverdict(fail);
}
}
if (match(omit, p_direction_out))
// not isvalue(v_direction_out))//MRO
{
v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);
}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local)the session/media attribute lines on directions
* @param p_direction_in attribute to be check
* @param p_direction_out attrubyte to be
* @return
* @verdict
*/
function f_SIP_checkSDPrespDirection(
template SDP_attribute p_direction_in
) runs on SipComponent {
// check incoming SDP attribute
if (not (isvalue(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in))) {
setverdict(fail);
}
}
/**
* @desc check media/attribute lines from remote
*/
function f_SIP_checkMediaDirection(
integer p_medianum,
template SDP_attribute p_direction
) runs on SipComponent
return boolean {
var integer v_mn, v_cn := 0, i, j;
var boolean v_result := false;
// increase session version
vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1);
// if more than one codec, select the firs one
v_mn := lengthof(vc_sdp_remote.media_list);
if (p_medianum == 0)
// specific media requested
{
p_medianum := 1; // start checking from first media
}
if (p_medianum > 0)
// specific media requested
{
if (p_medianum > v_mn) {
return false;
}
else {
v_mn := p_medianum;
}
}
for (i := p_medianum - 1; i < v_mn; i := i + 1) {
// for every single media
if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
v_cn := lengthof(vc_sdp_remote.media_list[i].attributes);
}
if (lengthof(vc_sdp_remote.media_list[i].attributes) > 0) {
// select the first one
for (j := 0; j < lengthof(vc_sdp_remote.media_list[i].attributes); j := j + 1) {
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv)) {
if (match(vc_sdp_remote.media_list[i].attributes[j], p_direction)) {
v_result := true;
}
else {
return false;
}
}
}
}
}
return v_result;
}
/**
* @desc copy media/attribute lines from remote to local SDP variable
*/
function f_copy_SDP(
) runs on SipComponent {
if (isvalue(vc_sdp_remote.connection)) {
vc_sdp_local.connection := vc_sdp_remote.connection;
}
else {
vc_sdp_local.connection := omit;
}
vc_sdp_local.origin := vc_sdp_remote.origin;
vc_sdp_local.session_name := vc_sdp_remote.session_name;
if (isvalue(vc_sdp_remote.bandwidth)) {
vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth;
}
else {
vc_sdp_local.bandwidth := {};
}
if (isvalue(vc_sdp_remote.media_list)) {
// // cleaning of media before assignment
// if (isvalue(vc_sdp_local.media_list))
// {
// for (var integer i:=0; i 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(present) SUBSCRIBE_Request p_subscribe := ?
) runs on SipComponent {
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
// f_send200OK();
}
}
}
/**
* @desc function awaits REGISTER and sends a 200 OK response
* @param p_reply flag used to avoid the 200OK response sending
*/
function f_awaitingREGISTER_sendReply(
in template(present) REGISTER_Request p_register := ?,
in boolean p_reply
) runs on SipComponent {
var Request v_request;
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;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
setverdict(pass);
}
}
} // end awaitingOkResponse
/**
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponse(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
a_awaitingResponse(p_Response);
} // end f_awaitingResponse
altstep a_awaitingResponse(
in template(present) Response p_Response := ?
) runs on SipComponent {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// setverdict(pass)
}
} // end f_awaitingResponse
/**
* @desc Function waiting for a response, repeat if 100 Trying is received
* @param p_Response expected response message
*/
function f_awaitingResponseIgnore100Trying(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
alt {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// setverdict(pass)
}
[] SIPP.receive(mw_Response_Base(c_statusLine100, vc_callId, vc_cSeq)) -> value vc_response {
repeat;
}
}
} // end f_awaitingResponseIgnore100Trying
/**
* @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx
* @param p_Response expected response message
*/
function f_awaitingResponseSendACK(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
alt {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
LibSip_Steps.f_setHeadersACK();
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
setverdict(pass);
}
}
} // end f_awaitingResponse
/**
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponsePassOnTimeout(
in template(present) Response p_Response := ?
) runs on SipComponent {
tc_resp.start;
alt {
[] SIPP.receive(p_Response) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
vc_boo_response := true;
// setverdict(pass)
}
[] tc_resp.timeout {
vc_boo_response := false;
// setverdict (pass)
}
}
} // end f_awaitingResponsePassOnTimeout
/**
* @desc Function waiting for a 200 OK response
* @param p_cSeq_s current cSeq expectation
*/
function f_awaitingOkResponseAndNOTIFY_sendReply(
inout CSeq p_cSeq_s,
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var boolean v_received_OK := false;
var boolean v_received_NOTIFY := false;
var NOTIFY_Request v_MSG;
tc_resp.start;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
vc_subscribed := true;
f_setHeadersOnReceiptOfResponse(vc_response);
v_received_OK := true;
setverdict(pass);
if (not (v_received_NOTIFY)) {
repeat;
}
}
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
v_received_NOTIFY := true;
if (not (v_received_OK)) {
repeat;
}
}
}
} // end f_awaitingOkResponseAndNOTIFY_sendReply
/**
* @desc await INFO request reply with 200 OK
*/
function f_awaitingINFO_sendReply(
in template(value) INFO_Request p_info
) runs on SipComponent {
var INFO_Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_info) -> value v_request sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_request);
// Answer to the INFO
f_send200OK();
}
}
} // end of f_awaitingINFO_sendReply
/**
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE(
template(present) INVITE_Request p_request := ?
) runs on SipComponent {
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv := true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[vc_interface_isc] SIPP.receive(mw_INVITE_Request_Base) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
// clear session - send 486 and await ACK
f_sendResponse(m_Response_Base(c_statusLine486, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
f_awaitingACK(mw_ACK_Request_Base(?));
// await 486 which go towards and send ACK
f_awaitingResponse(mw_Response_Base(c_statusLine486, ?, ?));
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
syncPort.send(m_syncClientStop);
stop;
}
}
} // end f_awaitingINVITE
/**
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_No100Response(
template(present) INVITE_Request p_request := ?
) runs on SipComponent {
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv := true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
// SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
}
} // end f_awaitingInviteRequest
/**
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_PassOnTimeout(
template(present) INVITE_Request p_request := ?
) runs on SipComponent {
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv := true; // communication has started
vc_boo_request := true;
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[] tc_wait.timeout {
vc_boo_request := false;
}
}
} // end f_awaitingInviteRequest
/**
* @desc function awaiting ACK request
*/
function f_awaitingACK(
in template(present) ACK_Request p_ACK := ?
) runs on SipComponent {
f_awaitingACK_setHeaders(p_ACK, false);
} // end f_awaitingACK
/**
* @desc function awaiting ACK request
*/
function f_awaitingACK_setHeaders(
in template(present) ACK_Request p_ACK := ?,
in boolean p_setHeaders
) runs on SipComponent {
var Request v_ACK_Request;
tc_ack.start;
alt {
[] SIPP.receive(p_ACK) -> value v_ACK_Request {
tc_ack.stop;
if (p_setHeaders) {
f_setHeadersOnReceiptOfRequest(v_ACK_Request);
}
}
}
} // end f_awaitingACK_setHeaders
/**
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE(
in template(present) BYE_Request p_BYE := ?
) runs on SipComponent {
var BYE_Request v_BYE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_bye := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
// f_send200OK();
}
}
} // end f_awaitingBYE
/**
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE_sendReply(
in template(present) BYE_Request p_BYE := ?
) runs on SipComponent {
var BYE_Request v_BYE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_bye := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
f_send200OK();
}
}
} // end f_awaitingBYE_sendReply
/**
* @desc function awaiting BYE and sending 200OK response
* @param p_BYE expected BYE
*/
function f_awaitingBYE_sendReply_PassOnTimeout(
in template(present) BYE_Request p_BYE := ?
) runs on SipComponent {
var BYE_Request v_BYE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
tc_wait.stop;
vc_ignore_bye := true;
vc_boo_request := true;
f_setHeadersOnReceiptOfBYE(v_BYE_Request);
f_send200OK();
}
[] tc_wait.timeout {
vc_boo_request := false;
}
}
} // end f_awaitingBYE_sendReply_PassOnTimeout
/**
* @desc function awaiting CANCEL
* @param p_CANCEL expected CANCEL
*/
function f_awaitingCANCEL(
in template(present) CANCEL_Request p_CANCEL := ?
) runs on SipComponent {
var CANCEL_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end f_awaitingCANCEL
/**
* @desc await MESSAGE request
*/
function f_awaitingMESSAGE(
in template(present) MESSAGE_Request p_MSG := ?
) runs on SipComponent {
var MESSAGE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
[] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
log("*** " &__SCOPE__& ": INFO: Received MESSAGE not as expected! ***");
setverdict(fail);
}
}
} // end of f_awaitingMESSAGE
/**
* @desc await MESSAGE request reply with 200 OK
*/
function f_awaitingMESSAGE_sendReply(
) runs on SipComponent {
var MESSAGE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the MESSAGE
f_send200OK();
}
}
} // end of f_awaitingMESSAGE_sendReply
/**
* @desc await MESSAGE request
*/
function f_awaitingMESSAGE_sendReply_PassOnTimeout(
in template(present) MESSAGE_Request p_MSG := ?
) runs on SipComponent {
var MESSAGE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the MESSAGE
// f_send200OK();
vc_boo_request := true;
f_send200OK();
// setverdict (pass);
}
[] tc_wait.timeout {
vc_boo_request := false;
// setverdict (pass);
}
}
} // end of f_awaitingMESSAGE_PassOnTimeout
/**
* @desc await NOTIFY request
*/
function f_awaitingNOTIFY(
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var NOTIFY_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingNOTIFY
/**
* @desc await NOTIFY request reply with 200 OK
*/
function f_awaitingNOTIFY_sendReply(
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var NOTIFY_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
}
}
} // end of f_awaitingNOTIFY_sendReply
function f_awaitingNOTIFY_sendReply_postamble(
in template(present) NOTIFY_Request p_MSG := ?
) runs on SipComponent {
var NOTIFY_Request v_MSG;
tc_wait.start(5.0);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
}
[] tc_wait.timeout {
// do nothing as receiving the Notify in de-registration is not part of the test body
}
}
} // end of f_awaitingNOTIFY_sendReply_postamble
/**
* @desc await PRACK request reply with 200 OK
*/
function f_awaitingPRACK_sendReply(
in template(present) PRACK_Request p_MSG := ?
) runs on SipComponent {
var PRACK_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the PRACK
if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) {
f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local)));
}
else {
f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute()));
}
}
}
} // end of f_awaitingPRACK_sendReply
function f_awaitingPRACK(
in template(present) PRACK_Request p_MSG := ?
) runs on SipComponent {
var PRACK_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingPRACK
/**
* @desc await PUBLISH request reply with 200 OK
*/
function f_awaitingPUBLISH_sendReply(
in template(present) PUBLISH_Request p_MSG := ?
) runs on SipComponent {
var PUBLISH_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the PUBLISH
f_send200OK();
}
}
} // end of f_awaitingPUBLISH_sendReply
/**
* @desc await UPDATE request
*/
function f_awaitingUPDATE(
in template(present) UPDATE_Request p_MSG := ?
) runs on SipComponent {
var UPDATE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
}
}
} // end of f_awaitingUPDATE
/**
* @desc await UPDATE request reply with 200 OK
*/
function f_awaitingUPDATE_sendReply(
in template(present) UPDATE_Request p_MSG := ?
) runs on SipComponent {
var UPDATE_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the UPDATE
if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) {
f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local)));
}
else {
f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute()));
}
}
}
} // end of f_awaitingUPDATE_sendReply
/**
* @desc await REFER request
*/
function f_awaitingREFER(
in template(present) REFER_Request p_MSG := ?
) runs on SipComponent {
var REFER_Request v_MSG;
tc_wait.start(PX_SIP_TWAIT);
alt {
[] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
tc_wait.stop;
f_setHeadersOnReceiptOfREFER(v_MSG);
}
}
} // end of f_awaitingUPDATE
} // end AwaitingMessage
group SendMessage {
/**
* @desc send ACK message, update the route and recordRoute header fields depending on boolean flags
* @param p_request template of the message to be sent
*/
function f_SendACK(
template(value) ACK_Request p_request
) runs on SipComponent {
// p_request.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
// n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc send BYE message, update the route and recordRoute header fields depending on boolean flags
* @param p_request template of the message to be sent
*/
function f_SendBYE(
template(value) BYE_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc send CANCEL message
* @param p_request template of the message to be sent
*/
function f_SendCANCEL(
template(value) CANCEL_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc send INFO message
* @param p_request template of the message to be sent
*/
function f_SendINFO(
template(value) INFO_Request p_request
) runs on SipComponent {
f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc send INVITE message
* @param p_request template of the message to be sent
*/
function f_SendINVITE(
template(value) INVITE_Request p_request
) runs on SipComponent {
vc_requestFor407 := valueof(p_request);
SIPP.send(p_request) to vc_sent_label;
vc_request := vc_requestFor407;
if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) {
a_altstep_401or407();
}
}
/**
* @desc send PRACK message
* @param p_request template of the message to be sent
*/
function f_SendPRACK(
) runs on SipComponent {
var integer responseNum := 1;
var PRACK_Request prackReq;
if (isvalue(vc_response.msgHeader.rSeq) and
isvalue(vc_response.msgHeader.rSeq.responseNum)){
responseNum := vc_response.msgHeader.rSeq.responseNum;
}
vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via
prackReq := m_PRACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_rAck);
if (isvalue(vc_response.msgHeader.recordRoute)){
prackReq.msgHeader.route := f_route();
}
SIPP.send(prackReq) to vc_sent_label;
}
/**
* @desc send PUBLISH message
* @param p_request template of the message to be sent
*/
function f_SendPUBLISH(
template(value) 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(value) 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(value) 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(value) UPDATE_Request p_request
) runs on SipComponent {
f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via
p_request.msgHeader.cSeq := vc_cSeq;
p_request.msgHeader.contact := vc_contact;
p_request.msgHeader.via := vc_via;
vc_requestFor407 := valueof(p_request);
SIPP.send(p_request) to vc_sent_label;
if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) {
a_altstep_401or407();
}
}
/**
* @desc function send MESSAGE message
* @param p_request template of the message to be sent
*/
function f_SendMESSAGE(
template(value) MESSAGE_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc function send NOTIFY message
* @param p_request template of the notify to be sent
*/
function f_SendNOTIFY(
template(value) NOTIFY_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc send REFER message
* @param p_request template of the message to be sent
*/
function f_SendREFER(
template(value) REFER_Request p_request
) runs on SipComponent {
SIPP.send(p_request) to vc_sent_label;
}
/**
* @desc send 200 OK
*/
function f_send200OK(
) runs on SipComponent {
f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
}
/**
* @desc send response
* @param p_request template of the message to be sent
*/
function f_sendResponse(
template(value) Response p_response
) runs on SipComponent {
p_response.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
SIPP.send(p_response) to vc_sent_label;
}
} // end SendMessage
group GlobalSteps {
/**
* @desc component initialization
* @param p_cSeq_s cSeq value to be assigned to the component variable
*/
function f_init_component(
inout CSeq p_cSeq_s
) runs on SipComponent {
// Variables
vc_cSeq := p_cSeq_s;
// Defaults
vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
vc_default := activate(a_clearRegistration());
}
/**
* @desc component termination
*/
function f_terminate_component(
) runs on SipComponent {
log("*** " &__SCOPE__& ": INFO: component terminated - forced! ***");
deactivate;
stop;
}
/**
* @desc component termination
*/
function f_componentStop(
) runs on SipComponent {
syncPort.send(m_syncClientStop);
SIPP.clear;
stop;
}
/**
* @desc function waits for particular time that allows the SUT to return to idle state
*/
function f_awaitSUTidle(
) runs on SipComponent {
vc_ignore4xx := true; // allow 4xx in default
tc_noAct.start;
alt {
[] tc_noAct.timeout {
}
}
}
/**
* @desc function waits for particular time before next expected message
*/
function f_wait(
float p_time
) runs on SipComponent {
tc_noAct.start(p_time);
alt {
[] tc_noAct.timeout {
}
}
}
/**
* @desc function cause termination of a PTC
* @param p_syncPoint dummy parameter (copied from the common lib)
*/
function f_check2Null(
in charstring p_syncPoint
) runs on SipComponent {
// != pass does not work, because in case of "none" execution shall continue
if (getverdict == inconc or getverdict == fail) {
log("*** f_check2Null: INFO: Verdict evaluated to fail or inconc. Stopping test execution now ***");
f_selfOrClientSyncAndVerdict(p_syncPoint, e_error);
} // end if
}
/*
*
* @desc original copied from older LibCommon_VerdictControl
*/
function f_getVerdict(
) return FncRetCode {
var FncRetCode v_ret := e_error;
if (getverdict == pass or getverdict == none) {
v_ret := e_success;
}
return v_ret;
}
} // end group GlobalSteps
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
* @param p_emergency Set to true in case of emergency call
*/
function f_Registration(
inout CSeq p_cSeq_s,
out template(value) REGISTER_Request p_register,
in boolean p_auth,
in boolean p_emergency := false
) runs on SipComponent {
if (PX_SIP_REGISTRATION) {
f_setHeaders_REGISTER(p_cSeq_s, p_emergency);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
f_SendREGISTER(p_register); // LibSip
// awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
if (p_auth) {
// receiving 401 Unauthorized response.
// and Re-send REGISTER request with Authorization header
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq_s);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
// Re-send protected REGISTER
f_SendREGISTER(p_register); // LibSip
// awaiting 200 OK REGISTER
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***");
}
}
}
else {
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
}
} // end function f_Registration
/**
* @desc registration and authentication with MD5
* @param p_cSeq_s cseq parameter
* @param p_register register template
* @param p_auth flag indicating if authentication is needed
*/
function f_Registration_withTemplate(
inout CSeq p_cSeq_s,
inout template(value) REGISTER_Request p_register,
in boolean p_auth
) runs on SipComponent {
if (PX_SIP_REGISTRATION) {
if(not isbound(p_register)){
f_setHeaders_REGISTER(p_cSeq_s);
p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
}
f_SendREGISTER(p_register); // LibSip
// awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
if (p_auth) {
// receiving 401 Unauthorized response.
// and Re-send REGISTER request with Authorization header
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq_s);
// p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact,
// vc_authorization);
// Re-send protected REGISTER
p_register.requestLine.requestUri := vc_requestUri;
p_register.msgHeader.cSeq := vc_cSeq;
p_register.msgHeader.via := vc_via_REG;
p_register.msgHeader.authorization := vc_authorization;
f_SendREGISTER(p_register); // LibSip
// awaiting 200 OK REGISTER
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***");
}
}
}
else {
f_awaitingOkResponse(p_cSeq_s);
f_getServiceRouteMapIntoRouteInRegistration(vc_response);
}
}
} // end function f_Registration_withTemplate
/**
* @desc remove registration
* @param p_cSeq_s cseq parameter
*/
function f_RemoveRegistration(
inout CSeq p_cSeq
) runs on SipComponent {
var template(value) REGISTER_Request v_request;
var boolean v_receivedNotify := false;
//
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_REG, vc_contact, vc_authorization, "0");
f_SendREGISTER(v_request);
if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED) {
// receiving 401 Unauthorized response.
// and Re-send REGISTER request with Authorization header
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// set headers via, cseq and authorization
f_setHeaders_2ndREGISTER(p_cSeq);
v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0");
// v_request.msgHeader.route := f_route();
// Re-send protected REGISTER
f_SendREGISTER(v_request); // LibSip
// awaiting 200 OK REGISTER
f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
}
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) -> value vc_response {
tc_resp.stop;
f_setHeadersOnReceiptOfResponse(vc_response);
// log ("Authorization was not requested as expected");
}
[] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) {
}
}
}
else {
tc_resp.start;
alt {
[] a_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) {
}
[] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) {
}
}
}
// await NOTIFY and send reply 200 OK
if (vc_subscribed and v_receivedNotify == false) {
f_awaitingNOTIFY_sendReply_postamble(mw_NOTIFY_Request_Base(vc_callIdReg));
}
}
} // 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 {
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(value) SUBSCRIBE_Request p_subscribe
) runs on SipComponent {
// send SUBSCRIBE
f_SendSUBSCRIBE(p_subscribe);
// awaiting 200 OK SUBSCRIBE
// await NOTIFY and send reply 200 OK
f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, mw_NOTIFY_Request_Base(vc_callId));
} // end function f_Subscription
/**
* @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
* @param p_notify notify template
*/
function f_SubscriptionWithNotification(
inout CSeq p_cSeq_s,
template(value) SUBSCRIBE_Request p_subscribe,
template(present) NOTIFY_Request p_notify := ?
) runs on SipComponent {
f_setHeaders_SUBSCRIBE(p_cSeq_s);
// send SUBSCRIBE
f_SendSUBSCRIBE(p_subscribe);
// awaiting 200 OK SUBSCRIBE
// await NOTIFY and send reply 200 OK
f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, p_notify);
} // end function f_SubscriptionWithNotification
/**
* @desc UE await subscrbe, send on 200 OK; possibility to handle also other SUBSCRIBE methods where event is different than reg
* @param p_cSeq_s cseq parameter
* @param p_subscribe subscribe template
*/
function f_awaitingSubscription(
template(present) SUBSCRIBE_Request p_subscribe := ?
) runs on SipComponent {
var Request v_request;
tc_wait.start(2.0); // awaiting of all SUBSCRIBES
alt {
[] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
}
[] tc_wait.timeout {
setverdict(pass);
}
}
} // end function f_awaitingSubscription
} // 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(
inout CSeq p_cSeq_s
) runs on SipComponent {
// varables and altsteps
f_init_component(p_cSeq_s);
// Preamble
//NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile));
}
/**
* @desc Set variables and default initialization for user profile and handle registration and authentication with MD5
* @param p_userprofile user profile of call
* @param p_cSeq_s cseq parameter
* @param p_register register template
*/
function f_SIP_preamble_withREG(
inout CSeq p_cSeq_s,
template(value) REGISTER_Request p_register
) runs on SipComponent {
// preamble
f_SIP_preamble_woREG(p_cSeq_s);
// 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
* @param p_byeCause parameter for Release cause to be used
* in BYE and in Failure messages, former PX_SIP_BYE_CAUSE
*/
function f_terminateCall(
SipUrl p_requestUri,
CallId p_CallId,
inout CSeq p_cSeq,
From p_from,
template(value) To p_to,
integer p_byeCause
) runs on SipComponent {
// Sending of a BYE request to release the call and expect a final response
f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, p_to, vc_via, p_byeCause));
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq)) {
repeat;
}
[] SIPP.receive(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq)) {
tc_resp.stop;
}
}
} // end function f_terminateCall
function f_cancelCall(
template(value) CANCEL_Request p_request
) runs on SipComponent {
// This function is called to bring back the IUT in idle condition
// in case of errors or unexpected behaviour.
// Sending of a CANCEL request with the same Cseq
f_setHeadersCANCEL(vc_cSeq);
f_SendCANCEL(p_request);
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq)) {
tc_resp.stop;
}
}
}
function f_cancelCall_await487(
template(value) CANCEL_Request p_request
) runs on SipComponent {
// This function is called to bring back the IUT in idle condition
// in case of errors or unexpected behaviour.
// Sending of a CANCEL request with the same Cseq
f_cancelCall(p_request);
// set method on INVITE
vc_cSeq.method := "INVITE";
// 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(present) CANCEL_Request p_request := ?
) runs on SipComponent {
f_awaitingCANCEL(p_request);
f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
// 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));
}
altstep a_receiveCANCELorNothing(
in template(present) CANCEL_Request p_CANCEL := ?
) runs on SipComponent {
var CANCEL_Request v_MSG;
[] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label {
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the CANCEL
f_send200OK();
}
}
altstep a_awaitNotify(
in template(present) NOTIFY_Request p_MSG := ?,
inout boolean p_receivedNotify
) runs on SipComponent {
var NOTIFY_Request v_MSG;
[vc_subscribed] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
p_receivedNotify := true;
f_getRouteMapIntoRecordRoute(v_MSG);
f_setHeadersOnReceiptOfRequest(v_MSG);
// Answer to the NOTIFY
f_send200OK();
repeat;
}
}
} // end group Postambles
group SipChecks {
/**
* @desc check the presence of conversation at SIP side
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_Conversation(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if conversation at SIP port";
if (p_checkConversation) {
opPort
.call(
s_SIP_conversation:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_conversation:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_conversation:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_uPlane, f_getVerdict()); // Note: implemented in test bodies
return;
} // end of f_check_Conversation
/**
* @desc check the presence of conversation at SIP side
* @param p_checkRinging boolean to perform check if ringing check is implemented.
* former PX_SIP_CHECK_RINGING
*/
function f_check_Ringing(
boolean p_checkRinging := false
) runs on SipComponent {
var charstring v_question := "confirm if ringing at SIP port";
if (p_checkRinging) {
opPort
.call(
s_SIP_ringing:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_ringing:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_ringing:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict());
return;
} // end of f_check_Ringing
/**
* @desc check the announcement at SIP side (UE A)
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_AnnouncementUE_A(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if announcement at UE A";
if (p_checkConversation) {
opPort
.call(
s_SIP_announcementA:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_announcementA:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_announcementA:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict());
return;
} // end of f_check_AnnouncementUE_A
/**
* @desc check the announcement at SIP side (UE B)
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_AnnouncementUE_B(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if announcement at UE B";
if (p_checkConversation) {
opPort
.call(
s_SIP_announcementB:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_announcementB:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_announcementB:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_annoucB, f_getVerdict());
return;
} // end of f_check_AnnouncementUE_B
/**
* @desc check the announcement at SIP side
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_Announcement(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if announcement at SIP side";
if (p_checkConversation) {
opPort
.call(
s_SIP_announcement:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_announcement:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_announcement:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict());
return;
} // end of f_check_Announcement
/**
* @desc check the Voice message at SIP side
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_VoiceMessage(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if voice message at SIP side";
if (p_checkConversation) {
opPort
.call(
s_SIP_voiceMessage:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_voiceMessage:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_voiceMessage:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_voicem, f_getVerdict());
return;
} // end of f_check_Announcement
/**
* @desc check the stop of media stream
* @param p_checkConversation boolean to perform check if conversation check is implemented.
* former PX_SIP_CHECK_CONVERSATION
*/
function f_check_MediaStopped(
boolean p_checkConversation := false
) runs on SipComponent {
var charstring v_question := "confirm if media stream stopped";
if (p_checkConversation) {
opPort
.call(
s_SIP_mediastopped:
{
v_question,
-
}
) {
[] opPort
.getreply(
s_SIP_mediastopped:
{
-,
true
}
) {
}
[] opPort
.getreply(
s_SIP_mediastopped:
{
-,
false
}
) {
all timer.stop;
setverdict(fail);
syncPort.send(m_syncClientStop);
stop;
}
};
}
f_selfOrClientSyncAndVerdict(c_uPlaneStop, f_getVerdict());
return;
} // end of f_check_MediaStopped
}
group DefaultsTestStep {
/**
* @desc This default handles receiving of the sync server STOP message and calls the RT HUT postamble. (copy from common lib)
*/
altstep a_Sip_catchSyncStop(
) runs on SipComponent {
[] syncPort.receive(m_syncServerStop) {
tc_sync.stop;
log("*** a_Sip_catchSyncStop: INFO: Test component received STOP signal from MTC - going to IDLE state *** ");
syncPort.send(m_syncClientStop);
// in case if deregistration was not done
// f_RemoveRegistration(vc_cSeq);
f_terminate_component();
log("*** a_Sip_catchSyncStop: INFO: TEST COMPONENT NOW STOPPING ITSELF! *** ");
setverdict(inconc);
stop;
}
}
/**
* @desc main default altstep to handle unexpected messages and timeout
* @verdict fail for all unexpected branches
*/
altstep a_clearRegistration(
) runs on SipComponent {
var Response v_response;
var Request v_request;
var CSeq v_cSeq;
[] any timer.timeout {
setverdict(fail);
all timer.stop;
// f_SendCANCEL(m_CANCEL_Request(vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_reqHostPort, vc_via )); // difference between registration
// state or transaction state
vc_callId := vc_callIdReg;
f_RemoveRegistration(vc_cSeq);
}
// allow repeated INVITEs
[vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base) {
repeat;
}
// allow repeated BYEs after ack of the first BYE
[vc_ignore_bye] SIPP.receive(mw_BYE_Request_Base(?)) {
repeat;
}
[] SIPP.receive(mw_ACK_Request_Base(?)) {
repeat;
}
// allow 100 replies
[] SIPP.receive(mw_Response_Base(c_statusLine100, ?, ?)) {
repeat;
}
// ignore 181 if flag is set (following TS 183004 4.5.2.1)
[vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181, vc_callId, vc_cSeq)) -> value v_response sender vc_sent_label {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
repeat;
}
// according to SIP chap.8.1.3.2
[] SIPP.receive(mw_Response_Base(c_statusLine183, vc_callId, vc_cSeq)) {
repeat;
}
// ignore 484 if flag is set
[vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484, vc_callId, vc_cSeq)) {
repeat;
}
[vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
repeat;
}
[vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?)) {
repeat;
}
[] SIPP.receive(mw_INFO_Request_Base(vc_callId)) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
repeat;
}
// awaiting of Notify
[] SIPP.receive(mw_NOTIFY_Request_Base(vc_callId)) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
repeat;
}
// awaiting of subscribe from UE
[vc_ignore_subscribe] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
f_send200OK();
repeat;
}
// awaiting of subscribe on proxy
[] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
f_setHeadersOnReceiptOfRequest(v_request);
f_sendResponse(m_Response_Contact(c_statusLine200, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact));
// f_setHeadersGeneral(vc_cSeq, "NOTIFY"); // cseq, contact, branch, via
// f_SendNOTIFY(m_NOTIFY_Request_contact(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_contact));
f_SendNOTIFY(m_NOTIFY_Request_contact(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact));
f_awaitingOkResponse(vc_cSeq);
repeat;
}
// unexpected BYE is acknowledged to avoid retransmissions
[] SIPP.receive(mw_BYE_Request_Base(?)) -> value v_request sender vc_sent_label {
setverdict(fail);
f_setHeadersOnReceiptOfRequest(v_request);
f_send200OK();
f_RemoveRegistration(vc_cSeq);
}
// unexpected CANCEL is acknowledged to avoid retransmissions
[] SIPP.receive(mw_CANCEL_Request_Base(?)) -> value v_request sender vc_sent_label {
setverdict(fail);
f_setHeadersOnReceiptOfRequest(v_request);
// Answer to the CANCEL
f_send200OK();
f_RemoveRegistration(vc_cSeq);
}
// catch 4xx response
[] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label {
setverdict(fail);
if (v_response.msgHeader.cSeq.method == "INVITE") {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
LibSip_Steps.f_setHeadersACK();
f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
}
f_RemoveRegistration(vc_cSeq);
}
// catch 5xx response
[] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?)) -> value v_response sender vc_sent_label {
setverdict(fail);
if (v_response.msgHeader.cSeq.method == "INVITE") {
v_cSeq := valueof(v_response.msgHeader.cSeq);
f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory
LibSip_Steps.f_setHeadersACK();
f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
}
f_RemoveRegistration(vc_cSeq);
}
// catch invalid REGISTER
[] SIPP.receive(mw_REGISTER_Request_Base) -> value v_request sender vc_sent_label {
setverdict(fail);
f_componentStop();
}
// any
[] SIPP.receive {
setverdict(fail);
all timer.stop;
// f_setHeadersCANCEL(vc_cSeq);
// f_SendCANCEL(m_CANCEL_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_via )); // difference between
// registration state or transaction state
f_RemoveRegistration(vc_cSeq);
}
}
/**
* @desc altstep handle authentication for INVITE message
*/
altstep a_altstep_401or407(
) runs on SipComponent {
var CommaParam_List v_challenge;
var Credentials v_Credentials;
var Response v_Response;
var Request v_Request := vc_requestFor407;
[] any port.check(receive) {
tc_resp.start;
alt {
[] SIPP.receive(mw_Response_Base((c_statusLine401, c_statusLine407), vc_callId, vc_cSeq)) -> value v_Response {
tc_resp.stop;
// get tag from To header if available
vc_to := v_Response.msgHeader.toField;
if (vc_cSeq.method == "INVITE") {
// send ACK
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
}
// resent the INVITE message with Proxyauthorization header include
// Extract challenge and calculate credentials for a response.
if (
ischosen(
v_Response.msgHeader.proxyAuthenticate.challenge
.otherChallenge // instead of digestCln (changed by axr to comply to alcatel)
)
) {
v_challenge := v_Response.msgHeader.proxyAuthenticate.challenge.otherChallenge.authParams;
v_Credentials := f_calculatecCredentials(vc_userprofile, vc_requestFor407.msgHeader.cSeq.method, v_challenge);
}
else {
log("*** " &__SCOPE__& ": INFO: No scheme in Proxy Authenticate header!!! ***");
setverdict(inconc);
stop;
}
vc_branch := c_branchCookie & f_getRndTag();
vc_via := {
fieldName := VIA_E,
viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
};
v_Request.msgHeader.via := vc_via;
// Increment CSeq sequence number of and add the credentials
// to the original saved INVITE message.
vc_cSeq.method := vc_requestFor407.msgHeader.cSeq.method;
vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
v_Request.msgHeader.cSeq.seqNumber := vc_cSeq.seqNumber;
v_Request.msgHeader.proxyAuthorization.fieldName := PROXY_AUTHORIZATION_E;
v_Request.msgHeader.proxyAuthorization.credentials := {v_Credentials};
// Re-send the saved INVITE with Authorization header
// included.
SIPP.send(v_Request) to vc_sent_label;
}
}
}
}
} // end of group DefaultsTestStep
} // end module LibSip_Steps
LibSip-v3/ttcn/LibSip_Templates.ttcn 0000664 0000000 0000000 00000604716 12375630627 0017661 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF450, STF471
* @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.
* This module is part of LibSipV3.
* @remark Any additions to the templates shall follow the design rules and always modify base templates only; Existing templates shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
*/
module LibSip_Templates {
// LibSip
import from LibSip_SIPTypesAndValues all;
import from LibSip_SDPTypes all;
import from LibSip_Interface all;
import from LibSip_PIXITS all;
import from LibSip_XMLTypes all;
import from LibSip_SimpleMsgSummaryTypes all;
import from LibSip_MessageBodyTypes all;
import from NoTargetNamespace language "XSD" all
with {
extension "File:../xsd/Ims3gpp.xsd";
}
import from urn_ietf_params_xml_ns_conference_info language "XSD" all
with {
extension "File:../xsd/CONF.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all
with {
extension "File:../xsd/PSTN.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all
with {
extension "File:../xsd/SupplementaryServices.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all
with {
extension "File:../xsd/MCID.xsd";
}
import from urn_ietf_params_xml_ns_resource_lists language "XSD" all
with {
extension "File:../xsd/ResourceList.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all
with {
extension "File:../xsd/CDIVN.xsd";
}
import from urn_3gpp_ns_cw_1_0 language "XSD" all
with {
extension "File:../xsd/cw.xsd";
}
group SubFields {
template(value) Addr_Union m_AddrUnion_NameAddr(template(value) NameAddr p_nameAddr) := {nameAddr := p_nameAddr}
template(value) Addr_Union m_AddrUnion_DisplayAndSipUrl(
template(value) charstring p_displayName,
template(value) SipUrl p_addrSpec
) := {
nameAddr := m_CallingAddr(p_displayName, p_addrSpec)
}
template(value) NameAddr m_NameAddr(
template(omit) charstring p_displayName := omit,
template(value) SipUrl p_addrSpec
) := {
displayName := p_displayName,
addrSpec := p_addrSpec
}
template(value) NameAddr m_CallingAddr(
template(value) charstring p_displayName,
template(value) SipUrl p_addrSpec
) := m_NameAddr(p_displayName, p_addrSpec);
template(present) NameAddr mw_NameAddr(
template charstring p_displayName,
template(present) SipUrl p_addrSpec := ?
) := {
displayName := p_displayName,
addrSpec := p_addrSpec
}
template(present) CommaParam_List mw_digestResponse(
template(present) GenericParam p_genericParam := ?
) := superset(p_genericParam);
//* c_Integrity_protected_yes
/**
* @desc send template for parameter list with CPC set to a specific value
* @param p_ISUP_CPC_value CPC parameter value
* former PX_SIP_ISUP_CPC_VALUE
*/
template(value) SemicolonParam_List m_cpc(
template(value) charstring p_ISUP_CPC_value := "prison"
) := {
{
"cpc",
{tokenOrHost := p_ISUP_CPC_value}
}
}
template(value) SemicolonParam_List m_ReasonParams(
template(omit) GenValue p_cause := omit,
template(value) GenValue p_text
) := {
m_Cause(p_cause), m_Text(p_text)
}
template(present) SemicolonParam_List mw_ReasonParams(
template GenValue p_cause,
template GenValue p_text
) := {
mw_Cause_base(p_cause), mw_Text(p_text)
}
template(value) ReasonValue m_ReasonValue_Base := {
token := "",
reasonParams := omit
}
template(present) ReasonValue mw_ReasonValue_Base := {
token := ?,
reasonParams := *
}
template(value) ReasonValue m_ReasonValue_param(
template(value) GenValue p_cause,
template(value) GenValue p_text
) modifies m_ReasonValue_Base := {
reasonParams := m_ReasonParams(p_cause, p_text)
}
template(present) ReasonValue mw_ReasonValue_param(
template GenValue p_cause,
template GenValue p_text
) modifies mw_ReasonValue_Base := {
reasonParams := mw_ReasonParams(p_cause, p_text)
}
template(value) ReasonValue m_ReasonValue(
template(value) GenValue p_cause,
template(value) GenValue p_text
) modifies m_ReasonValue_param := {
token := "Q.850"
}
template(present) ReasonValue mw_ReasonValue(
template GenValue p_cause,
template GenValue p_text
) modifies mw_ReasonValue_param := {
token := "Q.850"
}
template(value) ReasonValue m_ReasonValueSIP(
template(value) GenValue p_cause,
template(value) GenValue p_text
) modifies m_ReasonValue_param := {
token := "SIP"
}
template(present) ReasonValue mw_ReasonValueSIP(
template GenValue p_cause,
template GenValue p_text
) modifies mw_ReasonValue_param := {
token := "SIP"
}
template(present) RouteBody mw_routeBody(
template(present) SipUrl p_sipurl := ?
) := {
nameAddr := mw_NameAddr(*, p_sipurl),
rrParam := *
}
template(value) SentProtocol m_SentProtocol(
template(value) charstring p_protocol
) := {
protocolName := c_sipName,
protocolVersion := c_sipVersion,
transport := p_protocol
}
template(value) SipUrl m_BasicSipUrl := {
scheme := (c_sipScheme),
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "", //* charstring
password :=
omit //* optional charstring
},
hostPort := {
host := omit, //* hostname, IPv4 or IPv6 as a charstring
portField :=
omit //* p_userprofile.currPort - optional integer
}
}
},
urlParameters := omit,
headers := omit
}
template(value) SipUrl m_SipUrl_currDomain_Base(
template(value) SipUserProfile p_userprofile
) modifies m_BasicSipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := p_userprofile.publUsername
}
}
}
}
template(value) SipUrl m_SipUrl_currDomain(
template(value) SipUserProfile p_userprofile
) modifies m_SipUrl_currDomain_Base := {
components := {
sip := {
hostPort := {
host :=
p_userprofile
.homeDomain //* hostname, IPv4 or IPv6 as a charstring
}
}
}
}
template(value) SipUrl m_SipUrl_contactIpaddr(
template(value) SipUserProfile p_userprofile
) modifies m_SipUrl_currDomain_Base := {
components := {
sip := {
hostPort := {
host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField :=
p_userprofile
.contactPort //* optional integer
}
}
}
}
/**
* @desc send template with SIP userinfo
* @param p_userprofile SIP user profile values
* @param p_ISUP_CPC_value CPC parameter value
* former PX_SIP_ISUP_CPC_VALUE
*/
template(value) SipUrl m_SipUrl_contactIpaddrAndCpc(
template(value) SipUserProfile p_userprofile,
template(value) charstring p_ISUP_CPC_value := "prison"
) modifies m_SipUrl_contactIpaddr := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber :=
p_userprofile.publUsername & "; cpc=" &
p_ISUP_CPC_value
}
}
}
}
template(value) SipUrl m_SipUrl_currIpaddr(
template(value) SipUserProfile p_userprofile
) modifies m_SipUrl_currDomain_Base := {
components := {
sip := {
hostPort := {
host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField :=
p_userprofile
.currPort //* optional integer
}
}
}
}
template(value) SipUrl m_SipUrl_Anonymous modifies m_BasicSipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber :=
"Anonymous" //* charstring
},
hostPort := {
host :=
"Anonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring
}
}
}
}
template(value) SipUrl m_SipUrl_NumberHostHeader(
template(value) charstring p_number,
template(value) charstring p_host,
template(omit) AmpersandParam_List p_urlParameters := omit
) modifies m_BasicSipUrl := {
components := {
sip := {
userInfo := {userOrTelephoneSubscriber := p_number},
hostPort := {host := p_host}
}
},
urlParameters := p_urlParameters
}
template(value) SipUrl m_SipUrl_NumberHostParam(
template(value) charstring p_number,
template(value) charstring p_host,
template(omit) AmpersandParam_List p_urlParameters := omit
) modifies m_SipUrl_NumberHostHeader := {
components := {sip := {hostPort := {portField := c_defaultSipPort}}}
}
template(value) SipUrl m_SipUrl_NumberHostParam_woPort(
template(value) charstring p_number,
template(value) charstring p_host,
template(omit) AmpersandParam_List p_urlParameters := omit
) modifies m_SipUrl_NumberHostParam := {
components := {sip := {hostPort := {portField := omit}}}
}
template(present) SipUrl m_BasicTelUrl := {
scheme := (c_telScheme),
components := {tel := {subscriber := ""}},
urlParameters := omit,
headers := omit
}
template(value) SipUrl m_TelUrl_publUser(
template(value) SipUserProfile p_userprofile
) modifies m_BasicTelUrl := {
components := {
tel := {
subscriber :=
p_userprofile
.publUsername //* charstring
}
}
}
template(present) SipUrl mw_TelUrl := {
scheme := c_telScheme,
components := {tel := {subscriber := ?}},
urlParameters := *,
headers := *
}
template(present) SipUrl mw_SipUrl := {
scheme := c_sipScheme,
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := ?,
password := *
},
hostPort := {
host := *,
portField := *
}
}
},
urlParameters := *,
headers := *
}
template(present) SipUrl mw_TelSip_unavailableInvalidUri := (mw_TelSip_unavailableInvalidUri1, mw_TelSip_unavailableInvalidUri2);
template(present) SipUrl mw_TelSip_unavailableInvalidUri1 modifies mw_SipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "unavailable"
},
hostPort := {
host := "anonymous.invalid",
portField := c_defaultSipPort
}
}
}
}
template(present) SipUrl mw_TelSip_unavailableInvalidUri2 modifies mw_TelUrl := {
components := {tel := {subscriber := "unavailable"}}
}
template(present) SipUrl mw_TelSip_unavailableUri(
template(value) charstring p_host
) := (mw_TelSip_unavailableUri1, mw_TelSip_unavailableUri2(p_host));
template(present) SipUrl mw_TelSip_unavailableUri1 modifies mw_TelUrl := {
components := {tel := {subscriber := "unavailable"}}
}
template(present) SipUrl mw_TelSip_unavailableUri2(
template(value) charstring p_host
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := "unavailable"
},
hostPort := {
host := p_host,
portField := c_defaultSipPort
}
}
}
}
template(present) SipUrl mw_SipUrl_Number(
template(present) charstring p_number := ?
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := {userOrTelephoneSubscriber := p_number},
hostPort := ?
}
}
}
template(present) SipUrl mw_TelSipUrl_Number(
template(present) charstring p_number := ?
) := (mw_SipUrl_Number(p_number), mw_TelSipUrl_Number2(p_number));
template(present) SipUrl mw_TelSipUrl_Number1(
template(present) charstring p_number := ?
) := mw_SipUrl_Number(p_number);
template(present) SipUrl mw_TelSipUrl_Number2(
template(present) charstring p_number := ?
) modifies mw_TelUrl := {
components := {
tel := {
subscriber := p_number
}
}
}
template(present) SipUrl mw_SipUrl_Host(
template charstring p_host
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := *,
hostPort := {host := p_host}
}
}
}
template(present) SipUrl mw_SipUrl_User_Host(
template(present) charstring p_user := ?,
template charstring p_host
) modifies mw_SipUrl := {
components := {
sip := {
userInfo := {userOrTelephoneSubscriber := p_user},
hostPort := {
host :=
p_host //* hostname, IPv4 or IPv6 as a charstring
}
}
},
urlParameters := {m_UserPhone}
}
template(present) SipUrl mw_SipUrl_Anonymous modifies mw_SipUrl := {
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := pattern "[a,A][n,N][o,O][n,N][y,Y][m,M][o,O][u,U][s,s]" //* charstring
},
hostPort := {
host :=
pattern
"[a,A]nonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring
}
}
}
}
template(present) SipUrl mw_SipUrl_urlParam(
template SemicolonParam_List p_urlParameters
) modifies mw_SipUrl := {
urlParameters := p_urlParameters
}
template(present) ContactAddress mw_ContactAddress := {
addressField := ?,
contactParams := *
}
template(present) HostPort mw_hostPort(
template charstring p_host,
template integer p_portField
) := {
host := p_host,
portField := p_portField
}
template(present) StatusLine mw_statusLine_any := {
sipVersion := c_sipNameVersion,
statusCode := ?,
reasonPhrase := ?
}
template(present) StatusLine mw_statusLine(
in template(present) integer p_statusCode := ?,
in template(present) charstring p_reasonPhrase := ?
) modifies mw_statusLine_any := {
statusCode := p_statusCode,
reasonPhrase := p_reasonPhrase
}
template(present) StatusLine mw_statusLine1xx modifies mw_statusLine_any := {statusCode := (100 .. 199)}
template(present) StatusLine mw_statusLine2xx modifies mw_statusLine_any := {statusCode := (200 .. 299)}
template(present) StatusLine mw_statusLine3xx modifies mw_statusLine_any := {statusCode := (300 .. 399)}
template(present) StatusLine mw_statusLine4xx modifies mw_statusLine_any := {statusCode := (400 .. 499)}
template(present) StatusLine mw_statusLine5xx modifies mw_statusLine_any := {statusCode := (500 .. 599)}
template(present) StatusLine mw_statusLine6xx modifies mw_statusLine_any := {statusCode := (600 .. 699)}
template(present) StatusLine mw_statusLineFinal modifies mw_statusLine_any := {statusCode := (200 .. 699)}
template(present) NameAddr mw_NameAddr_DispName_User_Host(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
displayName := p_dn,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := {
userOrTelephoneSubscriber := p_user,
password := *
},
hostPort := {
host := p_host, //* hostname, IPv4 or IPv6 as a charstring
portField :=
* //* optional integer
}
}
},
urlParameters := {m_UserPhone},
headers := *
}
}
template(present) Addr_Union mw_AddrUnion_Nameaddr(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
nameAddr := mw_NameAddr_DispName_User_Host(p_dn, p_user, p_host)
}
template(present) Addr_Union mw_AddrUnion_SipUrl(
template(present) charstring p_user := ?,
template charstring p_host
) := {
addrSpecUnion := mw_SipUrl_User_Host(p_user, p_host)
}
} //* end group Subfields
group HeaderFieldTemplates {
template(value) LibSip_SIPTypesAndValues.Allow m_Allow(
template(value) Method_List p_methods
) := {
fieldName := ALLOW_E,
methods := p_methods
}
template(present) LibSip_SIPTypesAndValues.Allow mw_Allow(
template(value) charstring p_method
) := {
fieldName := ALLOW_E,
methods := superset(p_method)
}
template(value) GenericParam m_Cause(
template(omit) GenValue p_cause := omit
) := {
id := "cause",
paramValue := p_cause
}
template(present) GenericParam mw_Cause_base(
template GenValue p_cause
) := {
id := "cause",
paramValue := p_cause
}
template(present) GenericParam mw_Cause(
template(value) charstring p_cause
) := {
id := ?,
paramValue := { tokenOrHost := pattern "*{p_cause}*" }
}
template(value) Authorization m_Authorization(
template(value) Credentials p_credentials
) := {
fieldName := AUTHORIZATION_E,
body := {p_credentials}
}
template(value) Authorization m_Authorization_digest(
template(value) CommaParam_List p_commaParam_List
) := {
fieldName := AUTHORIZATION_E,
body := {{digestResponse := p_commaParam_List}}
}
template(present) Authorization mw_Authorization_digest(
template(present) CommaParam_List p_commaParam_List := ?
) := {
fieldName := AUTHORIZATION_E,
body := {{digestResponse := p_commaParam_List}}
}
template(value) Authorization m_add_Authorization_digest(
template(value) Authorization p_auth,
template(value) CommaParam_List p_commaParam_List
) := {
fieldName := AUTHORIZATION_E,
body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse, p_commaParam_List)}}
}
template(present) Authorization mw_Authorization_other := {
fieldName := AUTHORIZATION_E,
body := {{otherResponse := ?}}
}
template(value) Contact m_Contact(
template(value) SipUrl p_sipUrl
) := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {addrSpecUnion := p_sipUrl},
contactParams := omit
}
}
} //* end contactBody
} //* end m_Contact
template(value) Contact m_Contact_profile(
template(value) SipUserProfile p_userprofile
) := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := omit
}
}
} //* end
//* contactBody
} //* end m_Contact
template(value) Contact m_Contact_profile_expires(
template(value) SipUserProfile p_userprofile,
template(value) GenValue p_expires
) := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := {
{
"expires",
p_expires
}
}
}
}
} //* end contactBody
} //* end m_Contact
template(value) From m_From(
template(value) NameAddr p_nameAddr,
template(value) GenValue p_tag_str
) := {
fieldName := FROM_E,
addressField := {nameAddr := p_nameAddr}, //* end addressField
fromParams := {
{
id := c_tagId,
paramValue := p_tag_str
}
}
}
template(value) From m_From_Anonymous(
template(value) GenValue p_tag_str
) := {
fieldName := FROM_E,
addressField := {
nameAddr :=
m_NameAddr(
"Anonymous",
//* optional charstring
m_SipUrl_Anonymous //* SipUrl
)
}, //* end addressField
fromParams := {
{
id := c_tagId,
paramValue := p_tag_str
}
}
}
template(value) From m_From_SipUrl(
template(value) SipUrl p_sipUrl
) := {
fieldName := FROM_E,
addressField := {
nameAddr :=
m_NameAddr(
omit,
//* optional charstring
p_sipUrl //* SipUrl
)
}, //* end addressField
fromParams := omit
}
template(value) Event m_Event_base := {
fieldName := EVENT_E,
eventType := "",
eventParams := omit
}
template(value) Event m_Event_refer modifies m_Event_base := {eventType := "refer"}
template(value) Event m_Event_conference modifies m_Event_base := {eventType := "conference"}
template(value) Event m_Event_presence modifies m_Event_base := {eventType := "presence"}
template(value) Event m_Event_reg modifies m_Event_base := {eventType := "reg"}
template(value) Event m_Event_cdiv modifies m_Event_base := {eventType := "comm-div-info"}
template(value) Event m_Event_mcid := m_Event_cdiv;
template(value) Expires m_Expires_base := {
fieldName := EXPIRES_E,
deltaSec := ""
}
template(value) Expires m_Expires_600000 modifies m_Expires_base := {deltaSec := "600000"}
template(value) Expires m_Expires(
template(value) charstring p_deltaSec
) modifies m_Expires_base := {
deltaSec := p_deltaSec
}
template(present) Expires mw_Expires(
template(present) charstring p_deltaSec := ?
) := {
fieldName := EXPIRES_E,
deltaSec := p_deltaSec
}
template(value) HistoryInfo m_HistoryInfo(
template(value) HistoryInfo_List p_HistoryInfo_List
) := {
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
}
template(present) HistoryInfo mw_HistoryInfo(
template(present) HistoryInfo_List p_HistoryInfo_List := ?
) := {
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
}
template(value) HistoryInfoEntry m_HistoryInfoEntry(
template(value) SipUrl p_Url,
template(omit) IntegerList p_index := omit,
template(omit) SemicolonParam_List p_paramlist := omit
) := {
nameAddr := m_NameAddr(omit, p_Url),
hiIndex := p_index,
hiExtention := p_paramlist
}
template(present) HistoryInfoEntry mw_HistoryInfoEntry(
template(present) SipUrl p_Url := ?,
template IntegerList p_index,
template SemicolonParam_List p_paramlist
) := {
nameAddr := mw_NameAddr(*, p_Url),
hiIndex := p_index,
hiExtention := p_paramlist
}
template(value) PAssertedID m_PAssertedID(
template(value) Addr_Union p_pAssertedIDValue
) := {
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
}
template(value) PAssertedID m_PAssertedID_2x(
template(value) Addr_Union p_pAssertedIDValue,
template(value) Addr_Union p_pAssertedIDValue2
) modifies m_PAssertedID := {
pAssertedIDValueList := {p_pAssertedIDValue, p_pAssertedIDValue2}
}
template(present) PAssertedID mw_PAssertedID(
template(present) PAssertedIDValue p_pAssertedIDValue := ?
) := {
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
}
template(present) PAssertedIDValue mw_PAssertedIDValue(
template(present) SipUrl p_SipUrl := ?
) := {
nameAddr := {
displayName := *,
addrSpec := p_SipUrl
}
}
template(value) PPreferredID m_PPreferredID(
template(value) Addr_Union p_pPreferredIDValue
) := {
fieldName := P_PREFERRED_ID_E,
pPreferredIDValueList := {p_pPreferredIDValue}
}
template(value) Privacy m_Privacy(
template(value) PrivacyValue p_privacy
) := {
fieldName := PRIVACY_E,
privValueList := {p_privacy}
}
template(present) Privacy mw_Privacy_Base(
template(present) charstring p_value := ?
) := {
fieldName := PRIVACY_E,
privValueList := {*, p_value, *}
}
template(present) Privacy mw_Privacy_id := mw_Privacy_Base("id");
template(present) Privacy mw_Privacy_user := mw_Privacy_Base("user");
template(value) RAck m_RAck(
integer p_responseNum,
integer p_seqNumber,
charstring p_method
) := {
fieldName := RACK_E,
responseNum := p_responseNum,
seqNumber := p_seqNumber,
method := p_method
}
template(value) Reason m_Reason(
template(value) integer p_cause
) := {
fieldName := REASON_E,
reasonValues := {m_ReasonValue({tokenOrHost := int2str(valueof(p_cause))}, { tokenOrHost := "dummy"})}
}
template(value) Reason m_Reason21 := {
fieldName := REASON_E,
reasonValues := {m_ReasonValue({tokenOrHost := int2str(21)}, { tokenOrHost := "call reject"})}
}
template(present) Reason mw_Reason_Base := {
fieldName := REASON_E,
reasonValues := {}
}
template(present) Reason mw_Reason(
template(value) GenValue p_cause
) modifies mw_Reason_Base := {
reasonValues := {mw_ReasonValue(p_cause, ?)}
}
template(present) Reason mw_ReasonSIP(
template(value) GenValue p_cause
) modifies mw_Reason_Base := {
reasonValues := {mw_ReasonValueSIP(p_cause, ?)}
}
template(value) RecordRoute m_recordRoute_currIpAddr(
template(value) SipUserProfile p_userprofile
) := {
fieldName := RECORD_ROUTE_E,
routeBody := {
{
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := omit,
hostPort := {
host := p_userprofile.currIpaddr,
portField := p_userprofile.currPort
}
}
},
urlParameters := omit,
headers := omit
}
},
rrParam := omit
}
}
}
template(value) RecordRoute m_recordRoute_currIpAddr_params(
template(value) SipUserProfile p_userprofile,
template(value) SemicolonParam_List p_urlParameters
) := {
fieldName := RECORD_ROUTE_E,
routeBody := {
{
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := omit,
hostPort := {
host := p_userprofile.currIpaddr,
portField := p_userprofile.currPort
}
}
},
urlParameters := p_urlParameters,
headers := omit
}
},
rrParam := omit
}
}
}
template(value) RouteBody m_routeBody_currIpAddr(
template(value) SipUserProfile p_userprofile
) := {
nameAddr := {
displayName := omit,
addrSpec := {
scheme := c_sipScheme, //* contains "sip"
components := {
sip := {
userInfo := omit,
hostPort := {
host := p_userprofile.homeDomain,
portField := p_userprofile.currPort
}
}
},
urlParameters := omit,
headers := omit
}
},
rrParam := omit
}
template(value) ReferredBy m_ReferredBy_SipUrl(
template(value) SipUrl p_sipUrl
) := {
fieldName := REFERRED_BY_E,
nameAddr :=
m_NameAddr(
// STF471 {displayName
omit,
// := omit,
p_sipUrl // addrSpec:=p_sipUrl}
),
referredbyIdParams := omit
}
template(value) ReferTo m_ReferTo_SipUrl(
template(value) SipUrl p_sipUrl,
template(value) GenValue p_method
) := {
fieldName := REFER_TO_E,
nameAddr :=
m_NameAddr(
// STF471 {displayName
omit,
// := omit,
p_sipUrl // addrSpec:=p_sipUrl}
),
referToParams := {
{
id := "method",
paramValue := p_method
}
}
}
template(value) ReferSub m_ReferSub(
template(value) boolean p_value
) := {
fieldName := REFER_SUB_E,
referSubValue := p_value,
referSubParams := omit
}
template(value) Replaces m_Replaces(
template(value) charstring p_callId,
template(value) GenValue p_toTag,
template(value) GenValue p_fromTag
) := {
fieldName := REPLACES_E,
callid := p_callId,
replacesParams := {
{
id := "to-tag",
paramValue := p_toTag
},
{
id := "from-tag",
paramValue := p_fromTag
}
}
}
template(value) Require m_Require_empty := {
fieldName := REQUIRE_E,
optionsTags := {""}
}
template(value) Require m_Require_replaces modifies m_Require_empty := {optionsTags := {c_replaces}}
template(value) Require m_Require_100rel modifies m_Require_empty := {optionsTags := {c_tag100rel}}
template(value) Require m_Require_prec modifies m_Require_empty := {optionsTags := {c_tagPrecond}}
template(value) SubscriptionState m_SubscriptionState_active := {
fieldName := SUBSCRIPTION_STATE_E,
subState := "active",
substateParams := {
{
id := "expires",
paramValue := {tokenOrHost := "60000"}
}
}
}
template(value) Supported m_Supported_empty := {
fieldName := SUPPORTED_E,
optionsTags := {""}
}
template(value) Supported m_Supported_fromChange modifies m_Supported_empty := {optionsTags := {c_tagFromChange}}
template(value) Supported m_Supported_prec modifies m_Supported_empty := {optionsTags := {c_tagPrecond}}
template(value) Supported m_Supported_100rel modifies m_Supported_empty := {optionsTags := {c_tag100rel}}
template(value) Supported m_Supported_100rel_prec modifies m_Supported_empty := {optionsTags := {c_tag100rel, c_tagPrecond}}
template(value) GenericParam m_Text(
template(value) GenValue p_text
) := {
id := "text",
paramValue := p_text
}
template(present) GenericParam mw_Text(
template GenValue p_text
) := {
id := "text",
paramValue := p_text
}
template(value) GenericParam m_UserPhone := {
id := "user",
paramValue := { quotedString := "phone" }
}
template(value) GenericParam m_UserToUserEncodingHex := {
id := "encoding",
paramValue := { quotedString := "hex" }
}
template(value) UserToUser m_UserToUserData(
template(value) UserToUser.uuiData p_U2UData
) := {
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := m_UserToUserEncodingHex
}
template(value) To m_To(
template(value) SipUrl p_sipUrl
) := {
fieldName := TO_E,
addressField := {
nameAddr :=
m_NameAddr(
"ETSI Tester",
//* optional charstring
p_sipUrl //* SipUrl
)
}, //* end addressField
toParams := omit
}
template(value) To m_To_SipUrl(
template(value) SipUrl p_sipUrl
) modifies m_To := {
addressField := {
nameAddr := {
displayName :=
omit //* optional charstring
}
} //* end addressField
}
template(present) To mw_To_NameAddr_SipUrl(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
fieldName := TO_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)),
toParams := *
}
template(present) To mw_To(
template(present) SipUrl p_sipUrl := ?
) := {
fieldName := TO_E,
addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)},
toParams := *
}
template(present) From mw_From(
template(present) SipUrl p_sipUrl := ?
) := {
fieldName := FROM_E,
addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)},
fromParams := *
}
template(present) From mw_From_NameAddr_SipUrl(
template charstring p_dn,
template(present) charstring p_user := ?,
template charstring p_host
) := {
fieldName := FROM_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)),
fromParams := *
}
template(value) ViaBody m_ViaBody_currIpaddr(
template(value) charstring p_branch_val,
template(value) SipUserProfile p_userprofile
) := {
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy := {
host := p_userprofile.currIpaddr,
portField := p_userprofile.currPort
},
viaParams := {
{
id := c_branchId,
paramValue := {
tokenOrHost := p_branch_val
}
}
}
}
template(present) ViaBody mw_ViaBody_interface(
template(present) HostPort p_hostport := ?
) := {
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy := {
host := p_hostport.host,
portField := p_hostport.portField
},
viaParams := *
}
template(present) Via mw_Via(
template(present) ViaBody p_viabody := ?
) := {
fieldName := VIA_E,
viaBody := {*, p_viabody, *} // superset(p_viabody)
}
template(present) CallId mw_CallId_any := {
fieldName := CALL_ID_E,
callid := ?
}
template(present) Require mw_Require_Base := {
fieldName := REQUIRE_E,
optionsTags := {}
}
template(present) Require mw_Require_not_100rel modifies mw_Require_Base := {optionsTags := superset(complement(c_tag100rel))}
template(present) Require mw_require_100rel modifies mw_Require_Base := {optionsTags := superset(c_tag100rel)}
template(present) RecordRoute mw_recordroute(
template(present) RouteBody p_routeBody := ?
) := {
fieldName := RECORD_ROUTE_E,
routeBody := {*, p_routeBody, *} // superset(p_routeBody)
}
template(present) Route mw_route(
template(present) RouteBody_List p_routeBody := ?
) := {
fieldName := ROUTE_E,
routeBody := p_routeBody
}
template(present) Supported mw_Supported_Base := {
fieldName := SUPPORTED_E,
optionsTags := {}
}
template(present) Supported mw_Supported_100rel_prec modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel, c_tagPrecond)}
template(present) Supported mw_Supported_100rel modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel)}
template(present) Supported mw_Supported_fromChange modifies mw_Supported_Base := {optionsTags := superset(c_tagFromChange)}
template(present) UserToUser mw_UserToUserData(
template(present) UserToUser.uuiData p_U2UData := ?
) := {
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := ?
}
template(present) Contact mw_Contact_conference := {
fieldName := CONTACT_E,
contactBody := {
contactAddresses := {
{
addressField := {
nameAddr := {
displayName := *,
addrSpec := {
scheme := ?,
components := ?,
urlParameters := {
{
"isfocus",
*
},
*
},
headers := *
}
}
},
contactParams := *
}
}
}
}
template(value) AlertInfo m_AlertInfo_Base := {
fieldName := ALERT_INFO_E,
alertInfoBody := {}
}
template(value) AlertInfo m_AlertInfo(
template(value) charstring p_urn
) modifies m_AlertInfo_Base := {
alertInfoBody := {
{
p_urn,
omit
}
}
}
template(present) AlertInfo mw_AlertInfo(
template(present) charstring p_urn := ?
) modifies m_AlertInfo_Base := {
alertInfoBody :=
superset(
{
p_urn,
omit
}
)
}
} //* end of group HeaderFieldTemplates
group MessageTemplates {
group dummy_templates {
group dummy_parameter_send {
template(value) RequestLine m_requestLine_dummy(
template(value) Method p_method
) := {
method := p_method,
requestUri := c_unavailableUri,
sipVersion := c_sipNameVersion
}
template(value) MessageHeader m_msgHeader_dummy := {
accept := omit,
acceptContact := omit,
acceptEncoding := omit,
acceptLanguage := omit,
alertInfo := omit,
allow := omit,
allowEvents := omit, //* RFC3265
authenticationInfo := omit,
authorization := omit,
callId := c_empty_CallId,
callInfo := omit,
contact := omit,
contentDisposition := omit,
contentEncoding := omit,
contentLanguage := omit,
contentLength := {
fieldName := CONTENT_LENGTH_E,
len := 0
},
contentType := omit, //* if message body present m,
//* else not present
cSeq := c_empty_cSeq,
date := omit,
errorInfo := omit,
event := omit, //* RFC3265
expires := omit,
fromField := c_empty_From,
geolocation := omit,
geolocationRouting := omit,
historyInfo := omit, //* RFC4244
inReplyTo := omit,
maxForwards := c_maxForwards70,
mimeVersion := omit,
minExpires := omit,
minSE := omit, //* RFC4028
organization := omit,
pAccessNetworkInfo := omit, //* RFC3455
pAssertedID := omit,
pAssertedService := omit,
pAssociatedURI := omit,
path := omit, //* RFC3327
pCalledPartyID := omit, //* RFC3455
pChargingFunctionAddresses := omit, //* RFC3455
pChargingVector := omit, //* RFC3455
pEarlyMedia := omit, //* RFC5009
pMediaAuthorization := omit, //* RFC3313
pPreferredID := omit,
pPreferredService := omit,
priority := omit,
privacy := omit,
proxyAuthenticate := omit,
proxyAuthorization := omit,
proxyRequire := omit,
pVisitedNetworkID := omit, //* RFC3455
rAck := omit,
rSeq := omit,
reason := omit,
recordRoute := omit,
requestDisposition := omit,
referredBy := omit, //* RFC3892 - REFER method
referTo := omit, //* RFC3515 - REFER method
referSub := omit, //* RFC4488 - REFER method
replaces := omit, //* RFC3891
replyTo := omit,
require := omit,
retryAfter := omit,
route := omit,
securityClient := omit, //* RFC3329
securityServer := omit, //* RFC3329
securityVerify := omit, //* RFC3329
server := omit,
serviceRoute := omit, //* RFC3608
sessionExpires := omit, //* RFC4028
sessionId := omit,
sipETag := omit,
sipIfMatch := omit,
subject := omit,
subscriptionState := omit, //* RFC3265
supported := omit,
timestamp := omit,
toField := c_empty_To,
unsupported := omit,
userToUser := omit,
userAgent := omit,
via := c_empty_Via,
warning := omit,
wwwAuthenticate := omit,
undefinedHeader_List := omit
}
} //* group dummy_parameter_send
group dummy_parameter_receive {
template(present) RequestLine mw_requestLine_dummy(
Method p_method
) := {
method := p_method,
requestUri := ?,
sipVersion := c_sipNameVersion
}
template(present) MessageHeader mw_msgHeader_dummy := {
accept := *,
acceptContact := *,
acceptEncoding := *,
acceptLanguage := *,
alertInfo := *,
allow := *,
allowEvents := *, //* RFC3265
authenticationInfo := *,
authorization := *,
callId := ?,
callInfo := *,
contact := *,
contentDisposition := *,
contentEncoding := *,
contentLanguage := *,
contentLength := ?,
contentType := *,
cSeq := ?,
date := *,
errorInfo := *,
event := *, //* RFC3265
expires := *,
fromField := ?,
geolocation := *,
geolocationRouting := *,
historyInfo := *, //* RFC4244
inReplyTo := *,
maxForwards := *,
mimeVersion := *,
minExpires := *,
minSE := *, //* RFC4028
organization := *,
pAccessNetworkInfo := *, //* RFC3455
pAssertedID := *,
pAssertedService := *,
pAssociatedURI := *,
path := *, //* RFC3327
pCalledPartyID := *, //* RFC3455
pChargingFunctionAddresses := *, //* RFC3455
pChargingVector := *, //* RFC3455
pEarlyMedia := *, //* RFC5009
pMediaAuthorization := *, //* RFC3313
pPreferredID := *,
pPreferredService := *,
priority := *,
privacy := *,
proxyAuthenticate := *,
proxyAuthorization := *,
proxyRequire := *,
pVisitedNetworkID := *, //* RFC3455
rAck := *,
rSeq := *,
reason := *,
recordRoute := *,
requestDisposition := *,
referredBy := *, //* RFC3892 - REFER method
referTo := *, //* RFC3515 - REFER method
referSub := *, //* RFC4488 - REFER method
replaces := *, //* RFC 3891
replyTo := *,
require := *,
retryAfter := *,
route := *,
securityClient := *, //* RFC3329
securityServer := *, //* RFC3329
securityVerify := *, //* RFC3329
server := *,
serviceRoute := *, //* RFC3608
sessionExpires := *, //* RFC4028
sessionId := *,
sipETag := *,
sipIfMatch := *,
subject := *,
subscriptionState := *, //* RFC3265
supported := *,
timestamp := *,
toField := ?,
unsupported := *,
userToUser := *,
userAgent := *,
via := ?,
warning := *,
wwwAuthenticate := *,
undefinedHeader_List := *
}
} //* end group dummy_parameter_receive
group dummy_request_templates_send {
template(value) ACK_Request m_ACK_Dummy := {
requestLine := m_requestLine_dummy(ACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) BYE_Request m_BYE_Dummy := {
requestLine := m_requestLine_dummy(BYE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) CANCEL_Request m_CANCEL_Dummy := {
requestLine := m_requestLine_dummy(CANCEL_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) INFO_Request m_INFO_Dummy := {
requestLine := m_requestLine_dummy(INFO_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) INVITE_Request m_INVITE_Dummy := {
requestLine := m_requestLine_dummy(INVITE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) MESSAGE_Request m_MESSAGE_Dummy := {
requestLine := m_requestLine_dummy(MESSAGE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) NOTIFY_Request m_NOTIFY_Dummy := {
requestLine := m_requestLine_dummy(NOTIFY_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) OPTIONS_Request m_OPTIONS_Dummy := {
requestLine := m_requestLine_dummy(OPTIONS_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) PRACK_Request m_PRACK_Dummy := {
requestLine := m_requestLine_dummy(PRACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) PUBLISH_Request m_PUBLISH_Dummy := {
requestLine := m_requestLine_dummy(PUBLISH_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) REGISTER_Request m_REGISTER_Dummy := {
requestLine := m_requestLine_dummy(REGISTER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) REFER_Request m_REFER_Dummy := {
requestLine := m_requestLine_dummy(REFER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) SUBSCRIBE_Request m_SUBSCRIBE_Dummy := {
requestLine := m_requestLine_dummy(SUBSCRIBE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template(value) UPDATE_Request m_UPDATE_Dummy := {
requestLine := m_requestLine_dummy(UPDATE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
} //* end group dummy_request_templates_send
group dummy_request_templates_receive {
template(present) ACK_Request mw_ACK_Dummy := {
requestLine := mw_requestLine_dummy(ACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) BYE_Request mw_BYE_Dummy := {
requestLine := mw_requestLine_dummy(BYE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) CANCEL_Request mw_CANCEL_Dummy := {
requestLine := mw_requestLine_dummy(CANCEL_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) INFO_Request mw_INFO_Dummy := {
requestLine := mw_requestLine_dummy(INFO_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) INVITE_Request mw_INVITE_Dummy := {
requestLine := mw_requestLine_dummy(INVITE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) MESSAGE_Request mw_MESSAGE_Dummy := {
requestLine := mw_requestLine_dummy(MESSAGE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) OPTIONS_Request mw_OPTIONS_Dummy := {
requestLine := mw_requestLine_dummy(OPTIONS_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) NOTIFY_Request mw_NOTIFY_Dummy := {
requestLine := mw_requestLine_dummy(NOTIFY_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) PRACK_Request mw_PRACK_Dummy := {
requestLine := mw_requestLine_dummy(PRACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) PUBLISH_Request mw_PUBLISH_Dummy := {
requestLine := mw_requestLine_dummy(PUBLISH_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) REFER_Request mw_REFER_Dummy := {
requestLine := mw_requestLine_dummy(REFER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) REGISTER_Request mw_REGISTER_Dummy := {
requestLine := mw_requestLine_dummy(REGISTER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Dummy := {
requestLine := mw_requestLine_dummy(SUBSCRIBE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template(present) UPDATE_Request mw_UPDATE_Dummy := {
requestLine := mw_requestLine_dummy(UPDATE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
} //* end group dummy_request_templates_receive
group dummy_response_templates_send {
template(value) Response m_Response_Dummy := {
statusLine := c_statusLine100,
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
} //* group dummy_response_templates_send
group dummy_response_templates_receive {
template(present) Response mw_Response_Dummy := {
statusLine := ?,
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
} //* group dummy_response_templates_receive
}
group base_templates {
template(value) CSeq m_cSeq(
template(value) integer p_seqNumber,
template(value) charstring p_method
) := {
fieldName := CSEQ_E,
seqNumber := p_seqNumber,
method := p_method
}
template(value) ContentLength m_contentLength(
template(value) integer p_len
) := {
fieldName := CONTENT_LENGTH_E,
len := p_len
}
template(value) ContentType m_contentType(
template(value) charstring p_mediaType
) := {
fieldName := CONTENT_TYPE_E,
mediaType := p_mediaType
}
template(present) ContentType mw_contentType(
in template(present) charstring p_mediaType := ?
) := {
fieldName := CONTENT_TYPE_E,
mediaType := p_mediaType
}
group request_send {
template(value) ACK_Request m_ACK_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_ACK_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "ACK"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "ACK"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) ACK_Request m_ACK_Request_withRecordRoute(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Route p_route
) modifies m_ACK_Request_Base := {
msgHeader := {
route := p_route,
contentLength := m_contentLength(0)
}
}
template(value) BYE_Request m_BYE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_BYE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) CANCEL_Request m_CANCEL_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_CANCEL_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) INFO_Request m_INFO_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_INFO_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) INVITE_Request m_INVITE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact
) modifies m_INVITE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) MESSAGE_Request m_MESSAGE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_MESSAGE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) NOTIFY_Request m_NOTIFY_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_NOTIFY_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "NOTIFY"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "NOTIFY"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) OPTIONS_Request m_OPTIONS_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_OPTIONS_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "OPTIONS"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "OPTIONS"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) PRACK_Request m_PRACK_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) RAck p_RAck
) modifies m_PRACK_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "PRACK"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "PRACK"},
fromField := p_from,
rAck := p_RAck,
toField := p_to,
via := p_via
},
messageBody := omit
}
template(value) PUBLISH_Request m_PUBLISH_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Event p_event := omit,
template(omit) RAck p_RAck := omit,
template(value) MessageBody p_mb
) modifies m_PUBLISH_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_plainText), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// c_plainText/*c_sdp*/},
cSeq := m_cSeq(p_cSeq.seqNumber, "PUBLISH"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "PUBLISH"},
event := p_event,
rAck := p_RAck,
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
template(value) REFER_Request m_REFER_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(omit) Contact p_contact := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) ReferTo p_referTo := omit,
template(omit) ReferredBy p_referredBy := omit
) modifies m_REFER_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contact := p_contact,
cSeq := m_cSeq(p_cSeq.seqNumber, "REFER"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "REFER"},
fromField := p_from,
referTo := p_referTo,
referredBy := p_referredBy,
toField := p_to,
via := p_via
}
}
template(value) REFER_Request m_REFER_Request_replaces(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(omit) Contact p_contact := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) ReferTo p_referTo,
template(value) ReferredBy p_referredBy,
template(value) Replaces p_replaces,
template(omit) Require p_require := omit
) modifies m_REFER_Request_Base := {
msgHeader := {
replaces := p_replaces,
require := p_require
}
}
template(value) REGISTER_Request m_REGISTER_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(omit) Authorization p_authorization := omit
) modifies m_REGISTER_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
authorization := p_authorization,
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
supported := {
fieldName := SUPPORTED_E,
optionsTags := {"path"}
},
via := p_via
}
}
template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_SUBSCRIBE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "SUBSCRIBE"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template(value) UPDATE_Request m_UPDATE_Request_Base(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(value) MessageBody p_mb
) modifies m_UPDATE_Dummy := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
contact := p_contact,
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// c_sdp},
cSeq := m_cSeq(p_cSeq.seqNumber, "UPDATE"), // STF471
// {fieldName:=CSEQ_E,
// seqNumber:=
// p_cSeq.seqNumber,
// method:=
// "UPDATE"},
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
} //* end of group message_send
group request_receive {
template(present) ACK_Request mw_ACK_Request_Base(
template CallId p_callId
) modifies mw_ACK_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) BYE_Request mw_BYE_Request_Base(
template CallId p_callId
) modifies mw_BYE_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) CANCEL_Request mw_CANCEL_Request_Base(
template CallId p_callId
) modifies mw_CANCEL_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) INFO_Request mw_INFO_Request_Base(
template CallId p_callId
) modifies mw_INFO_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy := {requestLine := {method := INVITE_E}}
template(present) MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy := {msgHeader := {contact := *}}
template(present) NOTIFY_Request mw_NOTIFY_Request_Base(
template CallId p_callId
) modifies mw_NOTIFY_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) OPTIONS_Request mw_OPTIONS_Request_Base(
template CallId p_callId
) modifies mw_OPTIONS_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) PRACK_Request mw_PRACK_Request_Base(
template CallId p_callId
) modifies mw_PRACK_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) PUBLISH_Request mw_PUBLISH_Request_Base(
template CallId p_callId
) modifies mw_PUBLISH_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) REFER_Request mw_REFER_Request_Base(
template CallId p_callId
) modifies mw_REFER_Dummy := {
msgHeader := {callId := p_callId}
}
template(present) REFER_Request mw_REFER_Request(
template CallId p_callId,
template(value) SipUrl p_requestUri,
template(value) SipUrl p_referredBy
) modifies mw_REFER_Request_Base := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := mw_NameAddr(*, p_referredBy), // STF471
// {displayName
// :=
// *,
// addrSpec
// :=
// p_referredBy},
referredbyIdParams := *
}
}
}
template(present) INVITE_Request mw_INVITE_Request(
template Require p_require,
template(value) SipUrl p_referredBy
) modifies mw_INVITE_Request_Base := {
msgHeader := {
require := p_require,
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := mw_NameAddr(*, p_referredBy), // STF471
// {displayName
// :=
// *,
// addrSpec
// :=
// p_referredBy},
referredbyIdParams := *
}
}
}
template(present) REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy := {requestLine := {method := REGISTER_E}}
template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy := {requestLine := {method := SUBSCRIBE_E}}
template(present) 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(value) Response m_Response_Base(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via
) modifies m_Response_Dummy := {
statusLine := p_statusLine,
msgHeader := {
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
maxForwards := omit,
toField := p_to,
via := p_via
},
messageBody := omit,
payload := omit
}
} //* end group response_send
group response_receive {
template(present) Response mw_Response_Base(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Dummy := {
statusLine := p_statusLine,
msgHeader := {
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
template(present) Response mw_Response_StatusCode_Base(
template(present) StatusLine.statusCode p_statusCode := ?,
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Dummy := {
statusLine := mw_statusLine(p_statusCode, ?),
msgHeader := {
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
template(present) Response mw_Response_1xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Dummy := {
statusLine := mw_statusLine1xx,
msgHeader := {
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
template(present) Response mw_Response_2xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine2xx
}
template(present) Response mw_Response_3xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine3xx
}
template(present) Response mw_Response_4xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine4xx
}
template(present) Response mw_Response_5xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine5xx
}
template(present) Response mw_Response_6xx_Base(
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_1xx_Base := {
statusLine := mw_statusLine6xx
}
template(present) Response mw_Response_Algorithm(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) CredentialsList p_credentialsList
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {
authorization := {
fieldName := AUTHORIZATION_E,
body := p_credentialsList
}
}
}
} //* end group message_receive
} //* end group full_templates
group modified_templates {
group request_send {
template(value) ACK_Request m_ACK_Request_route(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit
) modifies m_ACK_Request_Base := {
msgHeader := {route := p_route}
}
template(value) ACK_Request m_ACK_Request_sdp(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) MessageBody p_mb
) modifies m_ACK_Request_Base := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication)
},
messageBody := p_mb
}
template(value) BYE_Request m_BYE_Request_cause(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) integer p_cause
) modifies m_BYE_Request_Base := {
msgHeader := {reason := m_Reason(p_cause)}
}
template(value) INVITE_Request m_INVITE_Request_sdp(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact,
template(value) MessageBody p_mb
) modifies m_INVITE_Request_Base := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication)
},
messageBody := p_mb
}
template(value) INVITE_Request m_INVITE_Request_ResourceList(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact,
template(value) MessageBody p_mb
) modifies m_INVITE_Request_Base := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(p_mb)},
contentType := m_contentType(c_xmlresourcelistApplication), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// "application/resource-lists+xml"},
contentDisposition := {
fieldName := CONTENT_DISPOSITION_E,
dispositionType := "recipient-list",
dispositionParams := omit
},
require := {
fieldName := REQUIRE_E,
optionsTags := {"recipient-list-invite"}
}
},
messageBody := p_mb
}
template(value) REFER_Request m_REFER_Request_route(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(omit) Contact p_contact := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) ReferTo p_referTo,
template(value) ReferredBy p_referredBy,
template(value) Route p_route
) modifies m_REFER_Request_Base := {
msgHeader := {route := p_route}
}
template(value) REGISTER_Request m_REGISTER_Request_expires(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(omit) Authorization p_authorization := omit,
template(value) charstring p_expires
) modifies m_REGISTER_Request_Base := {
msgHeader := {
authorization := p_authorization,
expires := m_Expires(p_expires)
}
}
template(value) NOTIFY_Request m_NOTIFY_Request_contact(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit
) modifies m_NOTIFY_Request_Base := {
msgHeader := {
contact := p_contact,
event := m_Event_reg,
subscriptionState := m_SubscriptionState_active
}
}
template(value) NOTIFY_Request m_NOTIFY_Request_sipfrag(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) charstring p_state,
template(value) charstring p_sipfrag
) modifies m_NOTIFY_Request_Base := {
requestLine := {
method := NOTIFY_E,
requestUri := {
scheme := ?,
components := {
sip := {
userInfo := *,
hostPort := p_requestUri.components.sip.hostPort
}
}
}
},
msgHeader := {
contentLength := m_contentLength(lengthof(p_sipfrag)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// lengthof(p_sipfrag)},
contentType := m_contentType(c_sipfragMessage), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// "message/sipfrag"},
subscriptionState := {
fieldName := SUBSCRIPTION_STATE_E,
subState := p_state,
substateParams := omit
},
event := m_Event_refer
},
messageBody := {sipfrag := p_sipfrag}
}
template(value) UPDATE_Request m_UPDATE_Request_route(
template(value) SipUrl p_requestUri,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit,
template(value) MessageBody p_mb,
template(value) Route p_route
) modifies m_UPDATE_Request_Base := {
msgHeader := {route := p_route}
}
} //* end group request_send
group request_receive {
template(present) BYE_Request mw_BYE_Request_Reason(
template CallId p_callId,
template(value) GenValue p_cause
) modifies mw_BYE_Request_Base := {
msgHeader := {reason := mw_Reason(p_cause)}
}
template(present) BYE_Request mw_BYE_Request_ReasonSIP(
template CallId p_callId,
template(value) GenValue p_cause
) modifies mw_BYE_Request_Base := {
msgHeader := {reason := mw_ReasonSIP(p_cause)}
}
template(present) BYE_Request mw_BYE_Request_headerfieldlist(
template CallId p_callId,
template(present) SipUrl p_requestUri,
template(present) To p_to := ?,
template(present) From p_from := ?,
template CSeq p_cSeq,
template Route p_route,
template RecordRoute p_recordRoute,
template Reason p_reason
) modifies mw_BYE_Request_Base := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
toField := p_to,
fromField := p_from,
cSeq := p_cSeq,
route := p_route,
recordRoute := p_recordRoute,
reason := p_reason
}
}
template(present) BYE_Request mw_BYE_Request_UserToUser(
template CallId p_callId
) modifies mw_BYE_Request_Base := {
msgHeader := {userToUser := ?}
}
template(present) INVITE_Request mw_INVITE_Request_RequestURI(
template(present) SipUrl p_sipUrl := ?
) modifies mw_INVITE_Dummy := {
requestLine := {
requestUri := p_sipUrl,
sipVersion := c_sipNameVersion
}
}
template(present) INFO_Request mw_INFO_Request_MB(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_INFO_Request_Base := {
messageBody := p_mb
}
template(present) INVITE_Request mw_INVITE_Request_expires modifies mw_INVITE_Request_Base := {msgHeader := {expires := ?}}
template(present) INVITE_Request mw_INVITE_Request_callid(
template CallId p_callId
) modifies mw_INVITE_Request_Base := {
msgHeader := {callId := p_callId}
}
template(present) INVITE_Request mw_INVITE_Request_MB(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_INVITE_Request_callid := {
messageBody := p_mb
}
template(present) INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo(
template CallId p_callId
) modifies mw_INVITE_Request_callid := {
msgHeader := {pAccessNetworkInfo := omit}
}
template(present) INVITE_Request mw_INVITE_Request_PaccessNetworkInfo(
template CallId p_callId
) modifies mw_INVITE_Request_callid := {
msgHeader := {pAccessNetworkInfo := ?}
}
template(present) INVITE_Request mw_INVITE_MSRP_Session(
template(present) SDP_media_field p_media_MSRP := ?
) modifies mw_INVITE_Request_Base := {
messageBody := {
sdpMessageBody := {
protocol_version := ?,
origin := ?,
session_name := ?,
information := *,
uri := *,
emails := *,
phone_numbers := *,
connection := *,
bandwidth := *,
times := ?,
timezone_adjustments := *,
key := *,
attributes := *,
media_list := {
{
media_field := p_media_MSRP,
information := *,
connections := *,
bandwidth := *,
key := *,
attributes := {
{
msrp := {
attr_value :=
pattern
"path:msrp://*"
}
}
}
}
}
}
}
}
template(present) REGISTER_Request mw_REGISTER_Request_ISC(
template PAccessNetworkInfo p_access,
template PVisitedNetworkID p_visited
) modifies mw_REGISTER_Request_Base := {
msgHeader := {
pAccessNetworkInfo := p_access,
pVisitedNetworkID := p_visited
}
}
template(present) UPDATE_Request mw_UPDATE_Request_SDP(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_UPDATE_Request_Base := {
messageBody := p_mb
}
template(present) NOTIFY_Request mw_NOTIFY_Request_MB(
template CallId p_callId,
template MessageBody p_mb
) modifies mw_NOTIFY_Request_Base := {
messageBody := p_mb
}
} //* end group request_receive
group response_send {
template(value) Response m_Response_AlertInfo(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Contact p_contact,
template(value) AlertInfo p_alertInfo
) modifies m_Response_Contact := {
msgHeader := {alertInfo := p_alertInfo}
}
template(value) Response m_Response_Contact(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Contact p_contact := omit
) modifies m_Response_Base := {
msgHeader := {contact := p_contact}
}
template(value) Response m_Response_ext(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit,
template(omit) RecordRoute p_recordroute := omit
) modifies m_Response_Base := {
msgHeader := {
route := p_route, // f_route(),
recordRoute :=
p_recordroute // f_recordroute()
}
}
template(value) Response m_Response_mbody(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit,
template(omit) RecordRoute p_recordroute := omit,
template(value) MessageBody p_mb
) modifies m_Response_ext := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication)
},
messageBody := p_mb
}
template(value) Response m_Response_mbody_contact (
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(omit) Route p_route := omit,
template(omit) RecordRoute p_recordroute := omit,
template(value) MessageBody p_mb,
template(value) Contact p_contact
) modifies m_Response_mbody := {
msgHeader := {
contact := p_contact
}
}
template(value) Response m_Response_PAsserted_Privacy(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Route p_route,
template(value) RecordRoute p_recordroute,
template(value) PAssertedID p_pAssertedID,
template(value) Privacy p_privacy
) modifies m_Response_ext := {
msgHeader := {
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
template(present) Response mw_Response_PAsserted_Privacy_Supported(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template PAssertedID p_pAssertedID,
template Privacy p_privacy,
template Supported p_supported
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {
pAssertedID := p_pAssertedID,
privacy := p_privacy,
supported := p_supported
}
}
template(value) Response m_Response_PAsserted_Privacy_mbody(
template(value) StatusLine p_statusLine,
template(omit) CallId p_callId := omit,
template(omit) CSeq p_cSeq := omit,
template(value) From p_from,
template(value) To p_to,
template(value) Via p_via,
template(value) Route p_route,
template(value) RecordRoute p_recordroute,
template(value) PAssertedID p_pAssertedID,
template(value) Privacy p_privacy,
template(value) MessageBody p_mb
) modifies m_Response_ext := {
msgHeader := {
contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
// {fieldName
// :=
// CONTENT_LENGTH_E,
// len:=
// f_MessageBodyLength(valueof(p_mb))},
contentType := m_contentType(c_sdpApplication), // STF471
// {fieldName
// :=
// CONTENT_TYPE_E,
// mediaType
// :=
// c_sdpApplication
// },
pAssertedID := p_pAssertedID,
privacy := p_privacy
},
messageBody := p_mb
}
} //* end group response_send
group response_receive {
template(present) Response mw_Response_Expires(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) DeltaSec p_deltaSec := ?
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {expires := mw_Expires(p_deltaSec)}
}
template(present) Response mw_Response_PAsserted_Privacy(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template PAssertedID p_pAssertedID,
template Privacy p_privacy
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
template(present) Response mw_Response_Reason(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(value) GenValue p_cause
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {reason := mw_Reason(p_cause)}
}
template(present) Response mw_Response_RecordRoute(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template RecordRoute p_recordRoute
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {recordRoute := p_recordRoute}
}
template(present) Response mw_Response_Via(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) Via p_via := ?
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {via := p_via}
}
template(present) Response mw_Response_Contact(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Contact p_contact
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {contact := p_contact}
}
template(present) Response mw_Response_AlertInfo(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template AlertInfo p_alertInfo
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {alertInfo := p_alertInfo}
}
template(present) Response mw_Response_HistoryInfo(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template HistoryInfo p_historyInfo
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {historyInfo := p_historyInfo}
}
template(present) Response mw_Response_messageBody(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Require p_require,
template MessageBody p_mb
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {require := p_require},
messageBody := p_mb
}
template(present) Response mw_Response_Require(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Require p_require
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {require := p_require}
}
template(present) Response mw_Response_Require_ifpresent(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template(present) Require p_require
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {require := p_require ifpresent}
}
template(present) Response mw_Response_Supported(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq,
template Supported p_supported
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {supported := p_supported}
}
template(present) Response mw_Response_UserToUser(
template(present) StatusLine p_statusLine := ?,
template CallId p_callId,
template CSeq p_cSeq
) modifies mw_Response_Base := {
statusLine := mw_statusLine(p_statusLine.statusCode, ?),
msgHeader := {userToUser := ?}
}
} //* end group response_receive
} //* end group modified_templates
} //* end group MessageTemplates
group SDP_Templates {
group SDP_Messages {
group base_templates {
template(value) SDP_Message m_SDP_base := {
protocol_version := 0, //* v=0
origin := {
user_name := PX_SIP_SDP_USER_NAME,
session_id := PX_SIP_SDP_SESSION_ID,
session_version := "0",
net_type := c_in,
addr_type := c_ip4,
addr := ""
},
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
session_name := "Voice Session", //* s=Voice Session
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := omit,
bandwidth := omit,
times := {
{
time_field := {"0", "0"},
time_repeat := omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := omit
}
template(value) SDP_Message m_SDP(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP_base := {
origin := {
addr := p_userprofile.contactIpaddr
},
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := {
addr := p_userprofile.bearerIpaddr,
ttl := omit,
num_of_addr := omit
}
}, //* c=IN
//* IP4
//* 172.27.1.219
media_list := {p_media}
}
template(value) SDP_Message m_SDP_mediaList(
template(value) SDP_media_desc_list p_media_list,
template(value) SipUserProfile p_userprofile
) modifies m_SDP_base := {
origin := {
addr := p_userprofile.contactIpaddr
},
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := {
addr := p_userprofile.bearerIpaddr,
ttl := omit,
num_of_addr := omit
}
}, //* c=IN
//* IP4
//* 172.27.1.219
media_list := p_media_list
}
template(value) SDP_Message m_SDP_media_attr_preconditions(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile,
template(value) SDP_attribute_list p_attribute_list
) modifies m_SDP := {
media_list := {
{
media_field := {
media := c_audio,
ports := {
port_number := 8500,
num_of_ports := omit
},
transport := c_rtpAvp,
fmts := {"0"}
}, //* m=audio
//* 8500
//* RTP/AVP
//* 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := p_attribute_list
}
}
}
template(value) SDP_Message m_SDP_attribute(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile,
template(value) SDP_attribute p_loc_attribute
) modifies m_SDP := {
attributes := {p_loc_attribute}
}
template(present) SDP_Message mw_SDP := {
protocol_version := 0, //* v=0
origin := ?,
session_name := ?,
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := ?,
bandwidth := omit,
times := {
{
time_field := {"0", "0"},
time_repeat := omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := ?
}
} //* end group base_templates
group modified_templates {
template(value) SDP_Message m_SDP_bandwidth(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP := {
bandwidth := {
{
PX_SIP_SDP_B_MODIFIER,
PX_SIP_SDP_B_BANDWIDTH
}
}
}
template(value) SDP_Message m_SDP_unacceptable(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP := {
protocol_version := 1, //* v=1 unacceptable version of
//* SDP
bandwidth := {
{
PX_SIP_SDP_B_MODIFIER,
PX_SIP_SDP_B_BANDWIDTH
}
}
}
template(value) SDP_Message m_SDP_encrypted(
template(value) SDP_media_desc p_media,
template(value) SipUserProfile p_userprofile
) modifies m_SDP := {
bandwidth := {
{
PX_SIP_SDP_B_MODIFIER,
PX_SIP_SDP_B_BANDWIDTH
}
},
key := {
method := "base64", // prompt
key := "blablabla"
}
}
} //* end group modified_templates
} //* end group SDP_Messages
group SDP_Fields {
template(value) SDP_media_desc m_media(template(value) SDP_media_field p_mf) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
}
template(value) SDP_media_desc m_mediaFieldBandwdthAttributes(
template(value) SDP_media_field p_mf,
template(omit) SDP_bandwidth_list p_bw_l := omit,
template(omit) SDP_attribute_list p_attributes := omit
) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := p_bw_l,
key := omit,
attributes := p_attributes
}
template(value) SDP_media_desc m_media_dynPT(
template(value) charstring p_payloadType,
template(value) charstring p_encoding,
template(value) charstring p_clockrate,
template(omit) charstring p_parameters := omit,
template(omit) SDP_key p_sdpKey := omit
) := {
media_field := {
media := c_audio, //* "audio",
ports := {
port_number := 8500,
num_of_ports := omit
},
transport := c_rtpAvp, //* "RTP/AVP",
fmts := { p_payloadType }
}, //* m=audio 8500 RTP/AVP 8
information := omit,
connections := omit,
bandwidth := omit,
key := p_sdpKey,
attributes := {{rtpmap := {
payload_type := p_payloadType,
codec := {
encoding := p_encoding,
clockrate := p_clockrate,
parameters := p_parameters
}
}
}} //* a=rtpmap:8 PCMA/8000
}
/**
* @desc send template with specific media transport and attribute values
* @param p_mediaAttribute parameter for SDP media transport supported by the IUT
* former PX_SIP_SDP_media_transport
* @param p_mediaAttribute parameter for SDP media attribute supported by the IUT,
* former PX_SIP_SDP_media_attribute_Exp & PX_SIP_SDP_media_transport_Exp
* @param p_mediaType parameter for SDP media type supported by the IUT,
* former PX_SIP_SDP_MEDIA_VIDEO
*/
template(value) SDP_media_desc m_media_unsupported(
template(value) charstring p_mediaTransport,
template(value) SDP_attribute_rtpmap p_mediaAttribute,
template(value) charstring p_mediaType := "video"
) := {
media_field := {
media := p_mediaType,
ports := {
port_number := 11500,
num_of_ports := omit
},
transport := p_mediaTransport,
fmts := {"99"}
}, //* m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := {{rtpmap := p_mediaAttribute}}
}
template(value) SDP_bandwidth m_bandwidth(
template(value) charstring p_loc_m,
template(value) integer p_loc_b
) := {
modifier := p_loc_m,
bandwidth := p_loc_b
}
template(value) SDP_bandwidth m_bandwidth_as_64 := {
modifier := "AS",
bandwidth := 64
}
template(present) SDP_bandwidth mw_bandwidth_rs := {
modifier := "RS",
bandwidth := ?
}
template(present) SDP_bandwidth mw_bandwidth_rr := {
modifier := "RR",
bandwidth := ?
}
template(value) SDP_media_field m_media_field(
template(value) charstring p_media,
template(value) integer p_portNum,
template(value) charstring p_transport,
template(value) charstring p_fmts
) := {
media := p_media,
ports := {
port_number := p_portNum,
num_of_ports := omit
},
transport := p_transport,
fmts := {p_fmts}
}
template(present) SDP_media_field mw_media_PCMU := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := c_rtpAvp,
fmts := {"0"}
}
template(present) SDP_media_field mw_media_PCMA := {
media := c_audio,
ports := {
port_number := 8500,
num_of_ports := omit
},
transport := c_rtpAvp,
fmts := {"8"}
}
template(present) SDP_media_field mw_media_PCMA_U_DPT := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := c_rtpAvp,
fmts := {*}
}
template(present) SDP_media_field mw_media_T38 := {
media := c_image,
ports := {
port_number := ?,
num_of_ports := *
},
transport := pattern "*ptl", //* udptl,tcptl
fmts := {"t38"}
}
template(present) SDP_media_field mw_media_G722 := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := "RTP/AVP",
fmts := {"9"}
}
template(present) SDP_media_field mw_media_AMR_DPT := {
media := c_audio,
ports := {
port_number := ?,
num_of_ports := *
},
transport := c_rtpAvp,
fmts := {*}
}
template(present) SDP_media_field mw_media_MSRP := {
media := c_msrp,
ports := {
port_number := ?,
num_of_ports := omit
},
transport := c_msrpTcp,
fmts := {*}
}
template(value) SDP_attribute m_attribute_sendonly := {sendonly := {}}
template(present) SDP_attribute mw_attribute_sendonly := {sendonly := {}}
// MRO
template(value) SDP_attribute m_attribute_recvonly := {recvonly := {}}
template(present) SDP_attribute mw_attribute_recvonly := {recvonly := {}}
// MRO
template(value) SDP_attribute m_attribute_sendrecv := {sendrecv := {}}
template(present) SDP_attribute mw_attribute_sendrecv := {sendrecv := {}}
// MRO
template(value) SDP_attribute m_attribute_inactive := {inactive := {}}
template(present) SDP_attribute mw_attribute_inactive := {inactive := {}}
// MRO
template(present) SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly, mw_attribute_inactive);
template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv, mw_attribute_recvonly, omit);
template(value) SDP_attribute m_attribute_base(
template(value) SDP_attribute_rtpmap p_attr_value
) := {
rtpmap := p_attr_value
}
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_AMR
*/
template(value) SDP_attribute m_attribute_AMR_DPT(//"0 AMR"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"AMR", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_CLE
*/
template(value) SDP_attribute m_attribute_CLEARMODE_DPT(//"0 CLEARMODE/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"CLEARMODE", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_G222
*/
template(value) SDP_attribute m_attribute_G722(//"9 G722/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"9", {"G722", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMU
*/
template(value) SDP_attribute m_attribute_PCMU(//"0 PCMU/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMU
*/
template(value) SDP_attribute m_attribute_PCMU_DPT(//"0 PCMU/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMA
*/
template(value) SDP_attribute m_attribute_PCMA(//"8 PCMA/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"8", {"PCMA", "8000", omit}}
) := m_attribute_base(p_attr_value);
/**
* @desc send template for a specific media attribute
* @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMA
*/
template(value) SDP_attribute m_attribute_PCMA_DPT(//"0 PCMA/8000"
template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMA", "8000", omit}}
) := m_attribute_base(p_attr_value);
template(present) SDP_attribute mw_attribute_T38 := {
unknown := {
name := ?,
attr_value := pattern "*t38*"
}
}
template(value) SDP_attribute m_attribute_curr(
template(value) charstring p_preconditionType,
template(value) charstring p_statusType,
template(value) charstring p_direction
) := {
curr := {
preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction
}
}
template(present) SDP_attribute mw_attribute_curr := {curr := ?}
template(value) SDP_attribute m_attribute_des(
template(value) charstring p_preconditionType,
template(value) charstring p_strength,
template(value) charstring p_statusType,
template(value) charstring p_direction
) := {
des := {
preconditionType := p_preconditionType,
strength := p_strength,
statusType := p_statusType,
direction := p_direction
}
}
template(present) SDP_attribute mw_attribute_des := {des := ?}
template(value) SDP_attribute m_attribute_conf(
template(value) charstring p_preconditionType,
template(value) charstring p_statusType,
template(value) charstring p_direction
) := {
conf := {
preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction
}
}
} //* end group SDP_Fields
} //* end group SDP_Templates
group SimpleMsgSummary_Templates {
template(value) SimpleMsgSummary m_SMS(
template(value) Msg_summary_line_list p_summaryLineList,
template(value) charstring p_uri
) := {
msg_status_line := m_msgStatusLine_yes,
msg_account := m_msgAccount(p_uri),
msg_summary_line_list := p_summaryLineList,
opt_msg_headers := omit
}
template(present) SimpleMsgSummary mw_SMS := {
msg_status_line := ?,
msg_account := *,
msg_summary_line_list := *,
opt_msg_headers := *
}
template(present) SimpleMsgSummary mw_SMS_yes modifies mw_SMS := {
msg_status_line := mw_msgStatusLine_yes
}
template(present) SimpleMsgSummary mw_SMS_yesUri modifies mw_SMS_yes := {
msg_account := mw_msgAccount
}
template(present) SimpleMsgSummary mw_SMS_yesVoice modifies mw_SMS_yes := {
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)}
}
template(present) SimpleMsgSummary mw_SMS_yesUriVoice modifies mw_SMS_yesUri := {
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)}
}
template(value) Msg_status_line m_msgStatusLine_yes := {
msg_type := c_messageWaiting,
msg_status := "yes"
}
template(present) Msg_status_line mw_msgStatusLine_yes := {
msg_type := c_messageWaiting,
msg_status := "yes"
}
template(value) Msg_account m_msgAccount(
template(value) charstring p_uri
) := {
msg_type_account := c_messageAccount,
account_URI :=
p_uri // m_SipUrl_NumberHostParam(PX_IMS_SUT_UE2_PUBLIC_USER,PX_IMS_SUT_UE2_HOME_DOMAIN,omit)
}
template(present) Msg_account mw_msgAccount := {
msg_type_account := c_messageAccount,
account_URI := ?
}
template(value) Msg_summary_line m_msgSummaryLine(
template(value) charstring p_msgContexClass,
template(value) charstring p_msgs,
template(value) charstring p_urgent_msgs
) := {
msg_context_class := p_msgContexClass,
msgs := p_msgs,
urgent_msgs := p_urgent_msgs
}
template(present) Msg_summary_line mw_msgSummaryLine(
template(present) charstring p_msgContexClass := ?
) := {
msg_context_class := p_msgContexClass,
msgs := ?,
urgent_msgs := *
}
} // end group Templates_SMS
group MessageBodies {
template(value) MessageBody m_MBody_SDP(
template(value) SDP_Message p_SDP
) := {
sdpMessageBody := p_SDP
}
template(value) MessageBody m_MBody_XML(
template(value) XmlBody p_xmlBody
) := {
xmlBody := p_xmlBody
}
template(value) MessageBody m_mBody_SMS(
template(value) SimpleMsgSummary p_SMS
) := {
simpleMsgSummary := p_SMS
}
template(value) MessageBody m_MBody_longPlainText := {textplain := c_longMessageContent_1300Bytes}
template(value) MessageBody m_mBody_plainText(
template(value) charstring p_plaitext
) := {
textplain := p_plaitext
}
template(value) MessageBody m_MBody_sipfrag(
template(value) charstring p_sipfrag
) := {
sipfrag := p_sipfrag
}
template(value) MessageBody m_MBody_MIMESdpXml(
template(value) SDP_Message p_sdp,
template(value) XmlBody p_xmlBody
) := {
mimeMessageBody := {
boundary := "--" & PX_SIP_MIME_BOUNDARY,
mimeEncapsulatedList := {
{
content_type := c_sdpApplication,
content_disposition := omit,
mime_encapsulated_part := {sdpMessageBody := p_sdp}
},
{
content_type := c_ims3gppCwApplication,
content_disposition := omit,
mime_encapsulated_part := {xmlBody := p_xmlBody}
}
}
}
}
template(value) MessageBody m_MBody_MIMESdpEncrypted(
template(value) SDP_Message p_sdp
) := {
mimeMessageBody := {
boundary := "--" & PX_SIP_MIME_BOUNDARY,
mimeEncapsulatedList := {
{
content_type := "application/sdp",
content_disposition := "attachment;handling=required;filename=smime.p7",
mime_encapsulated_part := {sdpMessageBody := p_sdp}
}
}
}
}
template(present) MessageBody mw_MBody_SDP(
template(present) SDP_Message p_SDP := ?
) := {
sdpMessageBody := p_SDP
}
template(present) MessageBody mw_MBody_XML(
template(present) XmlBody p_xmlBody := ?
) := {
xmlBody := p_xmlBody
}
template(present) MessageBody mw_mBody_SMS(
template(present) SimpleMsgSummary p_SMS := ?
) := {
simpleMsgSummary := p_SMS
}
template(present) MessageBody mw_MBody_MIMESdpXml(
template(present) SDP_Message p_sdp := ?,
template(present) XmlBody p_xmlBody := ?
) := {
mimeMessageBody := {
boundary := ?,
mimeEncapsulatedList := {
{
content_type := ?,
content_disposition := *,
mime_encapsulated_part := {sdpMessageBody := p_sdp}
},
{
content_type := ?,
content_disposition := *,
mime_encapsulated_part := {xmlBody := p_xmlBody}
}
}
}
}
template(present) MessageBody mw_MBody_MIME_Ims3gpp(
template charstring p_disposition,
template(present) Ims_3gpp p_ims3gpp := ?
) := {
mimeMessageBody := {
boundary := ?,
mimeEncapsulatedList := {
*,
{
content_type := c_ims3gppApplication,
content_disposition := p_disposition,
mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}}
},
*
}
}
}
template(present) MessageBody mw_MBody_MIME_Ims3gppCW(
template charstring p_disposition,
template(present) Ims_3gpp p_ims3gpp := ?
) := {
mimeMessageBody := {
boundary := ?,
mimeEncapsulatedList := {
*,
{
content_type := c_ims3gppCwApplication,
content_disposition := p_disposition,
mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}}
},
*
}
}
}
}
/*
*
* @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(
template(value) MessageBody p_mb_par
) return integer {
var integer v_result := 0;
if (PX_MB_LENGTH_FROM_ENCVAL) {
// by default it is set to true
// in case the codec encodes the variant selector, this
// needs to be changed to ischosen...
v_result := lengthof(encvalue(p_mb_par)) / 8; // length
// in
// bytes,
// let get
// length
// of
// encoded
// value
}
else {
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb_par.sdpMessageBody)) {
v_result := f_SDPlength(valueof(p_mb_par.sdpMessageBody));
}
// assume XML_Body ONLY in the message body
if (ischosen(p_mb_par.xmlBody)) {
v_result := f_XMLBody_Length(valueof(p_mb_par.xmlBody), PX_USE_FX_FOR_XML_LENGTH);
}
// assume simpleMsgSummary_Body ONLY in the message body
if (ischosen(p_mb_par.simpleMsgSummary)) {
v_result := f_simpleMsgSummaryBody_Length(valueof(p_mb_par.simpleMsgSummary));
}
// assume MIME_Message in the message body
if (ischosen(p_mb_par.mimeMessageBody)) {
v_result := f_MIMElength(valueof(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 i, j, k, v_len_con0, v_len_con1, v_len_con2, v_len_attr;
var integer v_result := 2;
//* due to empty line beginning of message body
var charstring v_auxstring;
v_result := 2 + c_CRlen + lengthof(int2str(p_mb.protocol_version)); //* "v="
v_auxstring := p_mb.origin.user_name & " " & p_mb.origin.session_id & " " & p_mb.origin.session_version & " " & p_mb.origin.net_type & " " & p_mb.origin.addr_type & " " & p_mb.origin.addr;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "o="
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.session_name); //* "s="
if (isvalue(p_mb.information)) {
v_auxstring := valueof(p_mb.information);
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);
} //* "i= "
if (isvalue(p_mb.uri)) {
v_auxstring := valueof(p_mb.uri);
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);
} //* "u="
if (isvalue(p_mb.emails)) {
for (i := 0; i < lengthof(p_mb.emails); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //* "e="
if (isvalue(p_mb.emails[i].disp_name)) {
v_auxstring := valueof(p_mb.emails[i].disp_name);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
if (isvalue(p_mb.phone_numbers)) {
for (i := 0; i < lengthof(p_mb.phone_numbers); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //* "p=
//* "
if (isvalue(p_mb.phone_numbers[i].disp_name)) {
v_auxstring := valueof(p_mb.phone_numbers[i].disp_name);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
if (isvalue(p_mb.connection)) {
v_len_con0 := f_SDPlength_connection(valueof(p_mb.connection));
v_result := v_result + v_len_con0;
} //* "c="
if (isvalue(p_mb.bandwidth)) {
for (i := 0; i < lengthof(p_mb.bandwidth); i := i + 1) {
//* "b= "
v_auxstring := p_mb.bandwidth[i].modifier & " ";
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring) + lengthof(int2str(p_mb.bandwidth[i].bandwidth));
}
}
for (i := 0; i < lengthof(p_mb.times); i := i + 1) {
v_auxstring := p_mb.times[i].time_field.start_time & " " & p_mb.times[i].time_field.stop_time;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "t="
if (isvalue(p_mb.times[i].time_repeat)) {
for (j := 0; j < lengthof(p_mb.times[i].time_repeat); j := j + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //* "r="
if (isvalue(p_mb.times[i].time_repeat[j].repeat_interval.unit)) {
v_auxstring := valueof(p_mb.times[i].time_repeat[j].repeat_interval.unit);
v_result := v_result + 1 + lengthof(v_auxstring);
}
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time));
if (isvalue(p_mb.times[i].time_repeat[j].active.unit)) {
v_auxstring := valueof(p_mb.times[i].time_repeat[j].active.unit);
v_result := v_result + 1 + lengthof(v_auxstring);
}
for (k := 0; k < lengthof(p_mb.times[i].time_repeat[j].offsets); k := k + 1) {
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time));
if (isvalue(p_mb.times[i].time_repeat[j].offsets[k].unit)) {
v_auxstring := valueof(p_mb.times[i].time_repeat[j].offsets[k].unit);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
}
}
if (isvalue(p_mb.timezone_adjustments)) {
log("*** " & __SCOPE__ & ": INFO: timezone adjustments have not been considered in SDP length calculation yet ***");
} //* "z="
if (isvalue(p_mb.key)) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.key.method); //* "k=
//* "
if (isvalue(p_mb.key.key)) {
v_auxstring := valueof(p_mb.key.key);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
if (isvalue(p_mb.attributes)) {
for (i := 0; i < lengthof(p_mb.attributes); i := i + 1) {
//* "a= "
v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]);
v_result := v_result + v_len_con1;
}
} //* "a="
if (isvalue(p_mb.media_list)) {
for (i := 0; i < lengthof(p_mb.media_list); i := i + 1) {
//* "m= "
//* for each media_field
//* log("p_mb.media_list[i ] ",p_mb.media_list[i
//* ] );
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].media_field.media) + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number));
if (isvalue(p_mb.media_list[i].media_field.ports.num_of_ports)) {
v_result := v_result + 1 + lengthof(int2str(valueof(p_mb.media_list[i].media_field.ports.num_of_ports)));
}
v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport);
for (j := 0; j < lengthof(p_mb.media_list[i].media_field.fmts); j := j + 1) {
v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.fmts[j]);
}
if (isvalue(p_mb.media_list[i].information)) {
v_auxstring := valueof(p_mb.media_list[i].information);
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "i= "
}
if (isvalue(p_mb.media_list[i].connections)) {
for (j := 0; j < lengthof(p_mb.media_list[i].connections); j := j + 1) {
v_len_con2 := f_SDPlength_connection(p_mb.media_list[i].connections[j]);
v_result := v_result + v_len_con2;
} //* end for
}
if (isvalue(p_mb.media_list[i].bandwidth)) {
//* "b= "
for (j := 0; j < lengthof(p_mb.media_list[i].bandwidth); j := j + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].bandwidth[j].modifier) + 1 + lengthof(int2str(p_mb.media_list[i].bandwidth[j].bandwidth));
} //* end for
}
if (isvalue(p_mb.media_list[i].key)) {
//* "k= "
v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method);
if (isvalue(p_mb.media_list[i].key.key)) {
v_auxstring := valueof(p_mb.media_list[i].key.key);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
if (isvalue(p_mb.media_list[i].attributes)) {
for (j := 0; j < lengthof(p_mb.media_list[i].attributes); j := j + 1) {
//* "a= "
v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]);
v_result := v_result + v_len_attr;
} //* end for j
}
} //* end for i
} //* end if media_list
return v_result;
}
//* end function f_SDPlength
function f_SDPlength_connection(
SDP_connection p_element
) return integer {
//* "c="
var integer v_result := 0;
v_result := v_result + 2 + c_CRlen + lengthof(p_element.net_type & " " & p_element.addr_type & " " & p_element.conn_addr.addr);
if (isvalue(p_element.conn_addr.ttl) and p_element.conn_addr.ttl > 0) {
v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.ttl)));
}
if (isvalue(p_element.conn_addr.num_of_addr) and p_element.conn_addr.num_of_addr > 0) {
v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.num_of_addr)));
}
return v_result;
} //* f_SDPlength_connection
function f_SDPlength_attribute(
SDP_attribute p_element
) return integer {
//* "a="
var integer v_result := 0;
if (ischosen(p_element.cat)) {
v_result := v_result + 2 + c_CRlen + lengthof("cat:" & p_element.cat.attr_value);
}
if (ischosen(p_element.keywds)) {
v_result := v_result + 2 + c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value);
}
if (ischosen(p_element.tool)) {
v_result := v_result + 2 + c_CRlen + lengthof("tool:" & p_element.tool.attr_value);
}
if (ischosen(p_element.ptime)) {
v_result := v_result + 2 + c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value);
}
if (ischosen(p_element.recvonly)) {
v_result := v_result + c_CRlen + lengthof("recvonly");
}
if (ischosen(p_element.sendrecv)) {
v_result := v_result + c_CRlen + lengthof("sendrecv");
}
if (ischosen(p_element.sendonly)) {
v_result := v_result + c_CRlen + lengthof("sendonly");
}
if (ischosen(p_element.inactive)) {
v_result := v_result + c_CRlen + lengthof("inactive");
}
if (ischosen(p_element.orient)) {
v_result := v_result + 2 + c_CRlen + lengthof("orient:" & p_element.orient.attr_value);
}
if (ischosen(p_element.sdp_type)) {
v_result := v_result + 2 + c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value);
}
if (ischosen(p_element.charset)) {
v_result := v_result + 2 + c_CRlen + lengthof("charset" & p_element.charset.attr_value);
}
if (ischosen(p_element.sdplang)) {
v_result := v_result + 2 + c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value);
}
if (ischosen(p_element.lang)) {
v_result := v_result + 2 + c_CRlen + lengthof("lang:" & p_element.lang.attr_value);
}
if (ischosen(p_element.framerate)) {
v_result := v_result + 2 + c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value);
}
if (ischosen(p_element.quality)) {
v_result := v_result + 2 + c_CRlen + lengthof("quality:" & p_element.quality.attr_value);
}
if (ischosen(p_element.fmtp)) {
v_result := v_result + 2 + c_CRlen + lengthof("fmtp:" & p_element.fmtp.format & " " & f_fmtpparams_to_charstring(p_element.fmtp.params));
}
if (ischosen(p_element.curr)) {
v_result := v_result + 2 + c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " " & p_element.curr.statusType & " " & p_element.curr.direction);
}
if (ischosen(p_element.des)) {
v_result := v_result + 2 + c_CRlen + lengthof("des:" & p_element.des.preconditionType & " " & p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction);
}
if (ischosen(p_element.conf)) {
v_result := v_result + 2 + c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " " & p_element.conf.statusType & " " & p_element.conf.direction);
}
if (ischosen(p_element.rtpmap)) {
v_result := v_result + 2 + c_CRlen + lengthof("rtpmap:" & f_rtpmap_to_charstring(p_element.rtpmap));
}
if (ischosen(p_element.rtcp)) {
v_result := v_result + 2 + c_CRlen + lengthof("rtcp:" & f_rtcp_to_charstring(p_element.rtcp));
}
if (ischosen(p_element.unknown)) {
v_result := v_result + 2 + c_CRlen + lengthof(p_element.unknown.name);
if (isvalue(p_element.unknown.attr_value)) {
v_result := v_result + lengthof(":" & p_element.unknown.attr_value);
}
}
//* log("axr: length attribute=", v_result);
return v_result;
} //* f_SDPlength_attribute
function f_fmtpparams_to_charstring(
SDP_attribute_fmtp_format_specific_params p_params
) return charstring {
var charstring v_result := "";
if(ischosen(p_params.unstructured)){
v_result := p_params.unstructured;
}
else
{
for(var integer v_idx := 0; v_idx < lengthof(p_params.paramList); v_idx := v_idx + 1) {
if(v_idx != 0)
{
v_result := v_result & "; "
}
v_result := v_result & p_params.paramList[v_idx].id;
if(ispresent(p_params.paramList[v_idx].paramValue)){
if(ischosen(p_params.paramList[v_idx].paramValue.tokenOrHost))
{
v_result := v_result & "=" & p_params.paramList[v_idx].paramValue.tokenOrHost;
}
else
{
v_result := v_result & "=""" & p_params.paramList[v_idx].paramValue.quotedString & """";
}
}
}
}
return v_result;
}
function f_rtpmap_to_charstring(
SDP_attribute_rtpmap p_rtpmap
) return charstring {
var charstring v_result := "";
v_result := p_rtpmap.payload_type & " " & p_rtpmap.codec.encoding & "/" & p_rtpmap.codec.clockrate;
if(ispresent(p_rtpmap.codec.parameters))
{
v_result := v_result & "/" & p_rtpmap.codec.parameters;
}
return v_result;
}
function f_rtcp_to_charstring(
SDP_attribute_rtcp p_rtcp
) return charstring {
var charstring v_result := int2str(p_rtcp.portnumber);
if(ispresent(p_rtcp.connection))
{
v_result := v_result & " " & p_rtcp.connection.net_type & " " & p_rtcp.connection.addr_type & " " & p_rtcp.connection.conn_addr.addr;
if(ispresent(p_rtcp.connection.conn_addr.ttl))
{
v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.ttl);
if(ispresent(p_rtcp.connection.conn_addr.num_of_addr))
{
v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.num_of_addr);
}
}
}
return v_result;
}
} //* group SDPlen_calculation
group XML_Len_calculation {
/**
* @desc Declaration of external functions to calculate length of message bodies switching of internal or external functions are made by boolean module parameter/PIXIT USE_FX_FOR_XML_LENGTH declared at top of this module
*/
external function fx_calculateXMLBodyLen(
XmlBody p_mb
) return integer;
/**
* @desc Calculation of XML body length
* @param p_mb contain XML body
* @return xml_length
*/
function f_XMLBody_Length(
XmlBody p_mb,
boolean p_ext_func
) return integer {
var integer v_result := 0;
if (p_ext_func) {
v_result := fx_calculateXMLBodyLen(p_mb);
}
else {
// assume ConferenceInfo ONLY in the XML message
// body
if (ischosen(p_mb.conference)) {
v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conference);
}
// assume CUG ONLY in the XML message body
if (ischosen(p_mb.cug)) {
v_result := f_XMLBody_Cug_Length(p_mb.cug);
}
// assume MCID ONLY in the XML message body
if (ischosen(p_mb.mcid)) {
v_result := f_XMLBody_Mcid_Length(p_mb.mcid);
}
// assume CW ONLY in the XML message body
if (ischosen(p_mb.cw)) {
v_result := f_XMLBody_Cw_Length(p_mb.cw);
}
// assume CDIV ONLY in the XML message body
if (ischosen(p_mb.cdivn)) {
v_result := f_XMLBody_Cdivn_Length(p_mb.cdivn);
}
// assume PSTNTransit ONLY in the XML message body
if (ischosen(p_mb.pstnTransit)) {
v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit);
}
// assume Simservs ONLY in the XML message body
if (ischosen(p_mb.simservs)) {
v_result := f_XMLBody_Simservs_Length(p_mb.simservs);
}
// assume ResourceLists ONLY in the XML message body
if (ischosen(p_mb.resourceLists)) {
v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists);
}
// assume Ims3GPP ONLY in the XML message body
if (ischosen(p_mb.ims3gpp)) {
v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp);
}
/**
* Add aditional checks regarding to new variants, also implement appropriate function for calculation
*/
}
return v_result;
} //* f_XMLBodyLength
group XMLBodies_calculation {
/**
* @desc Calculation of XML ConferenceInfo element length
* @param p_mb contain XML ConfInfo body
* @return xml_length
*/
function f_XMLBody_ConferenceInfo_Length(
template(value) Conference_type p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_ConferenceInfo_Length
/**
* @desc Calculation of XML CUG element length
* @param p_mb contain XML CUG body
* @return xml_length
*/
function f_XMLBody_Cug_Length(
template(value) Cug p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Cug_Length
/**
* @desc Calculation of XML MCID element length
* @param p_mb contain XML MCID body
* @return xml_length
*/
function f_XMLBody_Mcid_Length(
template(value) Mcid p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Mcid_Length
/**
* @desc Calculation of XML CW element length
* @param p_mb contain XML CW body
* @return xml_length
*/
function f_XMLBody_Cw_Length(
template(value) Ims_cw p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Cw_Length
/**
* @desc Calculation of XML CDIVN element length
* @param p_mb contain XML CDIVN body
* @return xml_length
*/
function f_XMLBody_Cdivn_Length(
template(value) Comm_div_info_type p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Cdivn_Length
/**
* @desc Calculation of XML PSTNTransit element length
* @param p_mb contain XML PSTNTransit body
* @return xml_length
*/
function f_XMLBody_PSTNTransit_Length(
template(value) PSTN_transit p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_PSTNTransit_Length
/**
* @desc Calculation of XML Simservs element length
* @param p_mb contain XML Simservs body
* @return xml_length
*/
function f_XMLBody_Simservs_Length(
template(value) Simservs p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Simservs_Length
/**
* @desc Calculation of XML ResourceList length
* @param p_mb contain XML ResourceList body
* @return xml_length
*/
function f_XMLBody_ResourceList_Length(
template(value) Resource_lists p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_ResourceList_Length
/**
* @desc Calculation of XML Ims3GPP length
* @param p_mb contain XML Ims3GPP body
* @return xml_length
*/
function f_XMLBody_Ims3GPP_Length(
template(value) TIMS3GPP p_mb
) return integer {
var integer v_result := lengthof(encvalue(p_mb)) / 8;
return v_result;
} //* f_XMLBody_Ims3GPP_Length
} //* XMLBodies_calculation
} //* group XMLlen_calculation
group simpleMsgSummaryBody_Length {
function f_simpleMsgSummaryBody_Length(
SimpleMsgSummary p_mb
) return integer {
var integer i;
var integer v_result := 2;
//* due to empty line beginning of message body
var charstring v_auxstring;
v_result := 2 + lengthof(p_mb.msg_status_line.msg_type) + 2 + lengthof(p_mb.msg_status_line.msg_status) + c_CRlen; //* "Message-Waiting:
//* yes"
if (isvalue(p_mb.msg_account))
//* "Message-Account"
{
v_result := v_result + 2 + lengthof(p_mb.msg_account.msg_type_account) + 2 + lengthof(p_mb.msg_account.account_URI) + c_CRlen;
}
if (isvalue(p_mb.msg_summary_line_list)) {
for (i := 0; i < lengthof(p_mb.msg_summary_line_list); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.msg_summary_line_list[i].msg_context_class) + 2 + lengthof(p_mb.msg_summary_line_list[i].msgs);
if (isvalue(p_mb.msg_summary_line_list[i].urgent_msgs)) {
v_auxstring := valueof(p_mb.msg_summary_line_list[i].urgent_msgs);
v_result := v_result + 1 + lengthof(v_auxstring);
}
}
}
if (isvalue(p_mb.opt_msg_headers)) {
for (i := 0; i < lengthof(p_mb.opt_msg_headers); i := i + 1) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.opt_msg_headers[i]);
}
}
return v_result;
}
}
group MIME_Len_calculation {
/**
* @desc Calculation of MIME length
* @param p_mb contain MIME message
* @return xml_length
*/
function f_MIMElength(
MIME_Message p_mb
) return integer {
var integer i;
var integer v_result := 2;
// 0d0a
v_result := v_result + lengthof(p_mb.boundary) + 2 /*0d0a*/;
for (i := 0; i < lengthof(p_mb.mimeEncapsulatedList); i := i + 1) {
v_result := v_result + lengthof("Content-Type: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2 /*0d0a*/;
if (isvalue(p_mb.mimeEncapsulatedList[i].content_disposition)) {
v_result := v_result + lengthof("Content-Disposition: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2 /*0d0a*/;
}
// v_result := v_result +2/*0d0a*/; ??? to check
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody)) {
v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody);
}
// assume XML_Body ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody)) {
v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, PX_USE_FX_FOR_XML_LENGTH);
}
// //assume XML_Message ONLY in the message body
// if (ischosen(p_mb.mimeEncapsulatedList[i ]
// .mime_encapsulated_part.xmlMessage))
// {
// v_result := v_result +
// f_XMLlength(p_mb.mimeEncapsulatedList[i ]
// .mime_encapsulated_part.xmlMessage,
// USE_FX_FOR_XML_LENGTH );
// };
// v_result := v_result +2/*0d0a*/; ??? to check
}
// v_result := v_result +2/*0d0a*/; ??? to check
return v_result;
} //* f_MIMElength
} //* group MIMElen_calculation
group TextPlain_Len_calculation {
/**
* @desc Calculation of messagebody-textplain type length
* @param p_mb contain textplain message
* @return lenght
*/
function f_TextPlainLength(
template(value) MessageBody p_mb
) return integer {
var integer v_result := 0;
v_result := v_result + lengthof(p_mb.textplain);
return v_result;
} //* end function f_TextPlainLength
} //* end group TextPlainLen_calculation
} //* group MessageBody_Calculation
group GiveHeaders {
/**
* @desc Return component variable of recordRoute header if vc_boo_recordRoute is true
* @return component variable of recordRoute header
*/
function f_recordroute(
) runs on SipComponent
return template(omit) RecordRoute {
var template(omit) RecordRoute v_recordRoute := omit;
if (vc_boo_recordRoute) {
return vc_recordRoute;
}
else {
return (v_recordRoute);
}
}
/**
* @desc Return component variable of Route header if vc_boo_route is true
* @return component variable of recordRoute header
*/
function f_route(
) runs on SipComponent
return template(omit) Route {
var template(omit) Route v_route := omit;
if (vc_boo_route) {
return vc_route;
}
else {
return (v_route);
}
}
} //* end group GiveHeaders
group others {
/*
*
* @desc function combines two comma parameter lists
* @param p_list1 first list
* @param p_list2 second list
* @return comma parameter list that contains parameters from both input lists
* @verdict
*/
function f_merge_CommaParam_List(
template(value) CommaParam_List p_list1,
template(value) CommaParam_List p_list2
) return template(value) CommaParam_List {
var template(value) CommaParam_List p_result;
var integer i, v_limit1 := lengthof(p_list1);
for (i := 0; i < v_limit1; i := i + 1) {
p_result[i] := p_list1[i];
}
for (i := 0; i < lengthof(p_list2); i := i + 1) {
p_result[i + v_limit1] := p_list2[i];
}
return p_result;
}
} //* end group others
} //* group TemplatePreparationFunctions
} //* end module LibSip_Templates
LibSip-v3/ttcn/LibSip_XMLTypes.ttcn 0000664 0000000 0000000 00000011735 12375630627 0017401 0 ustar 00root root 0000000 0000000 /**
* @author STF 346, STF366, STF368, STF369, STF471
* @version $Id$
* @desc
* This module provides the XML type system for SIP tests. The types have been generated automatically, followed by manual modifications: - bitType substituted by OneBitType - twobitType substituted by TwoBitType - addition of pattern for: OneBitType, TwoBitType, ThreeBitType, FourBitType, FourBitType, SixBitType - application of enumerated for: State_type, Endpoint_status_type, Joining_type, Disconnection_type, Media_status_type, Originating_identity_presentation_restriction, Terminating_identity_presentation_restriction - addition of length value: NetworkIdentityType, SixteenbitType - addition of value restriction: CugIndexType - substitution of "content" by "choice": Call_type, Mcid - additional type renaming (upper first letter): AbsService, Anonymous, Busy, Communication_diverted,
* Conference_description_type, Conference_info, Conference_media_type, Conference_medium_type, Conference_state_type, Conference_type, Cug, CugRequestType, Empty_element_type, Endpoint_type, Execution_type, Host_type, Keywords_type, Media, Media_type, No_answer, Not_reachable, Not_registered, Originating_identity_presentation, Presence_status, Presence_status_activity_type, RequestType, ResponseType, Roaming, Rule_deactivated, Sidebars_by_val_type, Simservs, SimservType, Terminating_identity_presentation, Uri_type, Uris_type, User_roles_type, User_languages_type, User_type, Users_type - new group CDIV added by STF369 - new group ACR_CD added by STF38 - new types RegInfo and Pidf_Lo added by STF160.
* This module is part of LibSipV3.
*/
module LibSip_XMLTypes {
import from http_www_w3_org_XML_1998_namespace language "XSD" all
with {
extension "File:../xsd/xml.xsd";
}
import from urn_ietf_params_xml_ns_common_policy language "XSD" all
with {
extension "File:../xsd/common-policy.xsd";
}
import from urn_ietf_params_xml_ns_resource_lists language "XSD" all
with {
extension "File:../xsd/ResourceList.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all
with {
extension "File:../xsd/SupplementaryServices.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all
with {
extension "File:../xsd/MCID.xsd";
}
import from NoTargetNamespace language "XSD" all
with {
extension "File:../xsd/Ims3gpp.xsd";
}
import from urn_3gpp_ns_cw_1_0 language "XSD" all
with {
extension "File:../xsd/cw.xsd";
}
import from urn_ietf_params_xml_ns_conference_info language "XSD" all
with {
extension "File:../xsd/CONF.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all
with {
extension "File:../xsd/PSTN.xsd";
}
import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all
with {
extension "File:../xsd/CDIVN.xsd";
}
import from urn_oma_xml_xdm_common_policy language "XSD" all
with {
extension "File:../xsd/xdm_commonPolicy-v1_0.xsd";
}
// RFC 3680 Registration Info
import from urn_ietf_params_xml_ns_reginfo language "XSD" all
with {
extension "File:../xsd/regInfo.xsd";
}
// RFC 3863 Presence Information Data Format
import from urn_ietf_params_xml_ns_pidf language "XSD" all
with {
extension "File:../xsd/pidf.xsd";
}
// RFC 4119 Presence Information Data Format, Location Object extension
import from urn_ietf_params_xml_ns_pidf_geopriv10_basicPolicy language "XSD" all
with {
extension "File:../xsd/geopriv10basic.xsd";
}
// RFC 4119 Presence Information Data Format, Location Object extension
import from urn_ietf_params_xml_ns_pidf_geopriv10 language "XSD" all
with {
extension "File:../xsd/pidf_lo.xsd";
}
group XmlTypes {
type union XmlBody {
Mcid mcid,
// if there is XML Mcid
Comm_div_info_type cdivn,
// if there is XML cdivn
Simservs simservs,
// if there is XML simservs (Oip/r, Tip/r, Call Diversion, ICB, OCB ...)
Conference_type conference,
// if there is XML conf
Ims_cw cw,
// if there is XML cw (defined in X_3gpp_ns_cw_1_0.ttcn3view)
Cug cug,
// if there is XML cug (defined in org_etsi_uri__ngn_params_xml_simservs_xcap.ttcn3view)
TIMS3GPP ims3gpp,
// if there is XML IMS 3GPP
PSTN_transit pstnTransit,
// if there is XML PSTN_transit
Resource_lists resourceLists,
// if there is XML Resource List data
Reginfo regInfo,
// if it is a registration event
Geopriv
geopriv // if it is a Presence Information Data Format Location Object
}
}
} LibSip-v3/xsd/ 0000775 0000000 0000000 00000000000 12375630627 0013377 5 ustar 00root root 0000000 0000000 LibSip-v3/xsd/ACR_CB.xsd 0000664 0000000 0000000 00000005743 12375630627 0015101 0 ustar 00root root 0000000 0000000
This is the incoming communication barring
configuration document.
This is the outgoing communication barring
configuration
document.