Compare Revisions

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

Ignore whitespace Rev 523 → Rev 524

/tags/v1.7.0/ttcn/LibSip_SMSFunctions.ttcn3
0,0 → 1,51
/*
* @author STF 435
* @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.
*/
module LibSip_SMSFunctions {
import from LibSip_SMSTypesAndValues all;
function f_IA5_2oct(charstring p_ASCII_String)
return octetstring
{
var integer i;
var integer k;
var integer v_Length := lengthof(p_ASCII_String);
var integer v_Temp;
var octetstring v_Noctets :=''O;
var bitstring v_TempBitSrc := ''B;
var bitstring v_TempBitDes := ''B;
if ((v_Length<=0) or (v_Length>160) or (((v_Length *7) mod 8) != 0))
{
log("Invalid value of input string length.");
}
for(i:=0; i<v_Length; i:=i+1)
{
v_Temp := char2int(p_ASCII_String[i]);
v_TempBitSrc := int2bit(v_Temp, 8);
for(k:=1; k<=7; k:=k+1)
{
v_TempBitDes := v_TempBitSrc[8-k] & v_TempBitDes;
if(((7*i+k) mod 8) == 0)
{
v_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
/tags/v1.7.0/ttcn/LibSip_SimpleMsgSummaryTypes.ttcn
0,0 → 1,58
/**
* @author STF 406
* @version $Id: LibSip_SimpleMsgSummaryTypes.ttcn 488 2010-11-08 10:17:19Z pintar $
* @desc This module provides the SMS type system for SIP tests.
*/
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{
//TODO add (SMS sms) into type union MessageBody{ in module LibSIPTypesAndValues
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
}
 
} /* end module LibSip_XMLTypes */
/tags/v1.7.0/ttcn/LibSip_SMSTemplates.ttcn3
0,0 → 1,394
/*
* @author STF 435
* @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.
*/
module LibSip_SMSTemplates {
import from LibCommon_DataStrings all;
import from LibSip_SMSTypesAndValues all;
import from LibSip_SMSFunctions all;
group SMS_Templates_Group {
/* Non-SMS Type Constraints */
template (present) TypeOfNumberingPlan cr_TypeOfNumberingPlanAny :=
{
extBit := ?,
typeOfNumber := ?,
numberingPlanId := ?
};
template (value) TypeOfNumberingPlan cs_TypeOfNumberingPlan :=
{
extBit := '1'B,
typeOfNumber := '001'B, // international number
numberingPlanId := '0001'B // ISDN/telephony numbering plan (Rec. E.164/E.163)
};
template (present) TypeOfNumberingPlan cr_TypeOfNumberingPlan :=
{
extBit := ?,
typeOfNumber := ?,
numberingPlanId := ?
};
/* End Non-SMS Type Constraints */
template (omit) RP_OriginatorAddress_dl cs_RP_OriginatorAddress_dl :=
{
spare := omit,
iei := omit,
iel := '06'O, // 6 semi-octets
typeOfNumberingPlan := cs_TypeOfNumberingPlan,
digits := '001122'O
};
template (omit) RP_OriginatorAddress_ul cr_RP_OriginatorAddress_ul :=
{
spare := omit,
iei := omit,
iel := '00'O
};
template RP_DestinationAddress_ul cr_RP_DestinationAddress_ul :=
{
spare := omit,
iei := omit,
iel := ?,
typeOfNumberingPlan := cr_TypeOfNumberingPlan,
digits := ?
};
template (omit) RP_DestinationAddress_dl cs_RP_DestinationAddress_dl :=
{
spare := omit,
iei := omit,
iel := '00'O
};
template (omit) RP_UserData cs_RP_UserData_DELIVER (octetstring p_Digits) :=
{
spare := omit,
iei := omit,
iel := int2oct ((153 + lengthof (p_Digits)), 1),
tP_PDU := {SMS_DELIVER := cs_SMS_DELIVER (p_Digits)}
};
template (omit) RP_UserData cs_RP_UserData_SUBMIT_REPORT :=
{
spare := '0'B,
iei := tsc_IEI_RP_UserData,
iel := '0A'O, // the TPDU data length is 10 octets
tP_PDU := {SMS_SUBMIT_REPORT := cs_SMS_SUBMIT_REPORT}
};
template (omit) RP_UserData cs_RP_UserData_STATUS_REPORT
(TP_MessageReference_Type p_MessageRef,
TP_Address_Type p_RecipientAddress,
TP_ServiceCentreTimeStamp_Type p_SCTP
) :=
{
spare := '0'B,
iei := tsc_IEI_RP_UserData,
iel := '0A'O, // the TPDU data length is 10 octets
tP_PDU := {SMS_STATUS_REPORT := cs_SMS_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)}
};
/*
template RP_UserData cr_RP_UserData (TP_PDU_Type p_TP_PDU) :=
{
spare := omit,
iei := omit,
iel := ?,
tP_PDU := p_TP_PDU
};
*/
template RP_UserData cr_RP_UserData_SUBMIT :=
{
spare := omit,
iei := omit,
iel := ?,
tP_PDU := {SMS_SUBMIT := cr_SMS_SUBMIT_VPF_REF}
};
template RP_UserData cr_RP_UserData_DELIVER_REPORT :=
{
spare := '0'B,
iei := tsc_IEI_RP_UserData,
iel := ?,
tP_PDU := {SMS_DELIVER_REPORT := cr_SMS_DELIVER_REPORT}
};
/* End SM-RP Type Constraints */
/* SM-RP PDU Constraints */
template (value) RP_DATA_dl_Type cs_RP_DATA_dl_DELIVER (octetstring p_Digits) :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_DATA_dl,
rP_MessageReference := '00'O,
rP_OriginatorAddress := cs_RP_OriginatorAddress_dl,
rP_DestinationAddress := cs_RP_DestinationAddress_dl,
rP_UserData := cs_RP_UserData_DELIVER(p_Digits)
};
template (value) RP_DATA_dl_Type cs_RP_DATA_dl_STATUS_REPORT (
TP_MessageReference_Type p_MessageRef,
TP_Address_Type p_RecipientAddress,
TP_ServiceCentreTimeStamp_Type p_SCTP
) :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_DATA_dl,
rP_MessageReference := '00'O,
rP_OriginatorAddress := cs_RP_OriginatorAddress_dl,
rP_DestinationAddress := cs_RP_DestinationAddress_dl,
rP_UserData := cs_RP_UserData_STATUS_REPORT (p_MessageRef, p_RecipientAddress, p_SCTP)
};
template (present) RP_DATA_ul_Type cr_RP_DATA_ul_SUBMIT :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_DATA_ul,
rP_MessageReference := ?,
rP_OriginatorAddress := cr_RP_OriginatorAddress_ul,
rP_DestinationAddress := cr_RP_DestinationAddress_ul,
rP_UserData := cr_RP_UserData_SUBMIT
};
template (value) RP_ACK_Type cs_RP_ACK_SUBMIT_REPORT (Oct1 p_msgReference := '00'O):=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_ACK_dl,
rP_MessageReference := p_msgReference,
rP_UserData := cs_RP_UserData_SUBMIT_REPORT
};
template (present) RP_ACK_Type cr_RP_ACK_DELIVER_REPORT :=
{
spare5 := '00000'B,
rP_MessageTypeIndicator := tsc_MT_RP_ACK_ul,
rP_MessageReference := ?,
rP_UserData := cr_RP_UserData_DELIVER_REPORT
};
/* End SM-RP PDU Constraints */
/* SM-TP Type Constraints */
template (value) TP_ProtocolIdentifier_Type cr_TP_ProtocolIdentifier :=
{
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
};
template (value) TP_ProtocolIdentifier_Type cs_TP_ProtocolIdentifier :=
{
pidType := '01'B,
interworking := '0'B,
pidValue := '00000'B
};
template (value) TP_DataCodingScheme_Type cs_TP_DataCodingScheme :=
{
codingGroup := '0000'B,
codeValue := '0000'B
};
template TP_Address_Type cr_TP_AddressAny :=
{
iel := ?,
typeOfNumberingPlan := cr_TypeOfNumberingPlanAny,
digits := *
};
template (value) TP_Address_Type cs_TP_Address (octetstring p_Digits) :=
{
iel := int2oct(2 * lengthof(p_Digits), 1),
// length is number of useful semi-octets
// as p_digits is declared as octetstring the number must be even
typeOfNumberingPlan := cs_TypeOfNumberingPlan,
digits := p_Digits
};
template (value) TP_ParameterIndicator_Type cs_TP_ParameterIndicator :=
{
extBit1 := '0'B,
spare4 := '0000'B,
tP_UDL := '0'B,
tP_DCS := '0'B,
tP_PID := '1'B
};
/* End SM-TP Type Constraints */
/* SM-TP PDU Constraints */
template (value) SMS_DELIVER_Type cs_SMS_DELIVER (octetstring p_Digits) :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportIndication := '1'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_DELIVER,
tP_OriginatingAddress := cs_TP_Address (p_Digits),
tP_ProtocolIdentifier := cs_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := cs_TP_DataCodingScheme,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_UserDataLength := int2oct(160,1),
tP_UserData := f_IA5_2oct(tsc_Fox)
};
template SMS_DELIVER_REPORT_Type cr_SMS_DELIVER_REPORT :=
{
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := tsc_MT_SMS_DELIVER_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := ?,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := *,
tP_UserDataLength := *,
tP_UserData := *
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '??'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := *,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_NP :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '00'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := omit,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_REF :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '10'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := ?,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_ENH :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '01'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := ?,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template SMS_SUBMIT_Type cr_SMS_SUBMIT_VPF_ABS :=
{
tP_ReplyPath := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportRequest := '1'B,
tP_ValidityPeriodFormat := '11'B,
tP_RejectDuplicates := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT,
tP_MessageReference := ?,
tP_DestinationAddress := cr_TP_AddressAny,
tP_ProtocolIdentifier := cr_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := ?,
tP_ValidityPeriod := ?,
tP_UserDataLength := int2oct(160,1),
tP_UserData := ? // any data will do: 140 octets
};
template (value) SMS_SUBMIT_REPORT_Type cs_SMS_SUBMIT_REPORT :=
{
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
spare4 := '0000'B,
tP_MessageTypeIndicator := tsc_MT_SMS_SUBMIT_REPORT,
tP_FailureCause := omit,
tP_ParameterIndicator := cs_TP_ParameterIndicator,
tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
tP_ProtocolIdentifier := cs_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
};
template (value) SMS_STATUS_REPORT_Type cs_SMS_STATUS_REPORT (
TP_MessageReference_Type p_MessageRef,
TP_Address_Type p_RA,
TP_ServiceCentreTimeStamp_Type p_SCTP
):=
{
// TS 34.229-1 clause A.7.5
spare1 := '0'B,
tP_UserDataHeaderIndicator := '0'B,
tP_StatusReportQualifier := '0'B,
spare2 := '00'B,
tP_MoreMessagesToSend := '0'B,
tP_MessageTypeIndicator := tsc_MT_SMS_STATUS_REPORT,
tP_MessageReference := p_MessageRef,
tP_RecipientAddress := p_RA,
tP_ServiceCentreTimeStamp := p_SCTP,
tP_DischargeTime := '00000000000000'H,
tP_Status := {
reserved := '0'B,
status := '0000000'B
},
tP_ParameterIndicator := cs_TP_ParameterIndicator,
tP_ProtocolIdentifier := cs_TP_ProtocolIdentifier,
tP_DataCodingScheme_Type := omit,
tP_UserDataLength := omit,
tP_UserData := omit
};
/* End SM-TP PDU Constraints */
} // group SMS_Templates_Group
 
} // End of module LibSip_SMSTypesAndValues
/tags/v1.7.0/ttcn/LibSip_SMSTypesAndValues.ttcn
0,0 → 1,327
/******************************************************************************/
// $Date: 2009-11-25 18:40:50 +0100 (Mi, 25 Nov 2009) $
// $Author: STF160 $
// $Rev: 2184 $
/******************************************************************************/
/*
* This module contains the type definitions for SMS messages as specified in
* 3GPP 24.011 and 3GPP 23.040 Rel 8 and 9.
* SMS over IMS is specified in 3GPP 24.341.
*/
 
 
module LibSip_SMSTypesAndValues {
import from LibCommon_DataStrings all;
group SMS_Declarations {
const RP_MessageTypeIndicator_Type tsc_MT_RP_DATA_ul := '000'B; /* RP_DATA_ul */
const RP_MessageTypeIndicator_Type tsc_MT_RP_DATA_dl := '001'B; /* RP_DATA_dl */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ACK_ul := '010'B; /* RP_ACK_ul */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ACK_dl := '011'B; /* RP_ACK_dl */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ERROR_ul := '100'B; /* RP_ERROR_ul */
const RP_MessageTypeIndicator_Type tsc_MT_RP_ERROR_dl := '101'B; /* RP_ERROR_dl */
const RP_MessageTypeIndicator_Type tsc_MT_RP_SMMA := '110'B; /* RP_SMMA */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_DELIVER := '00'B; /* SMS DELIVER */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_DELIVER_REPORT := '00'B; /* SMS DELIVER REPORT */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_STATUS_REPORT := '10'B; /* SMS STATUS REPORT */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_COMMAND := '10'B; /* SMS COMMAND */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_SUBMIT := '01'B; /* SMS SUBMIT, SMS SUBMIT REPORT */
const TP_MessageTypeIndicator_Type tsc_MT_SMS_SUBMIT_REPORT := '01'B; /* SMS SUBMIT, SMS SUBMIT REPORT */
const Bit7 tsc_IEI_RP_UserData := '1000001'B; /* 24.011 cl. 8.2.5.3 */
const charstring tsc_Fox := "The quick brown fox jumps over the lazy dog's back. Kaufen Sie Ihrer Frau vier bequeme Pelze. - 0123456789 - THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'S BACK.";
type record TypeOfNumberingPlan { /* 24.008 cl. 10.5.4.7, 10.5.4.9, 10.5.4.13 */
Bit1 extBit, /* Extension Bit */
Bit3 typeOfNumber, /* Type Of Number */
Bit4 numberingPlanId /* Numbering Plan Identification */
};
/* 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
/tags/v1.7.0/ttcn/LibSip_Templates.ttcn
0,0 → 1,3655
/*
* @author STF 346, STF366, STF368, STF369
* @version $Id$
* @desc This module defines SIP Templates for message, header, and
* structured types. <br>
* Note that any changes made to the definitions in this module
* may be overwritten by future releases of this library
* End users are encouraged to contact the distributers of this
* module regarding their modifications or additions
* @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 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 ModuleParameters {
modulepar boolean MB_LENGTH_FROM_ENCVAL:=false; //* to get length of message body from ecoded value
modulepar boolean USE_FX_FOR_XML_LENGTH:=false; //* To use external functions for calculation of XML message/body length
}//* group ModuleParameters
group SubFields
{
 
template Addr_Union m_AddrUnion_NameAddr(template NameAddr p_nameAddr) :=
{
nameAddr := p_nameAddr
}
 
template Addr_Union m_AddrUnion_DisplayAndSipUrl(template charstring p_displayName, template SipUrl p_addrSpec) :=
{
nameAddr := m_CallingAddr(p_displayName, p_addrSpec)
}
template NameAddr m_CallingAddr(template charstring p_displayName, template SipUrl p_addrSpec) :=
{
displayName := p_displayName,
addrSpec := p_addrSpec
}
 
template CommaParam_List mw_digestResponse(template GenericParam p_genericParam) :=
superset(p_genericParam); //* c_Integrity_protected_yes
 
template SemicolonParam_List m_cpc :=
{{"cpc",PX_SIP_ISUP_CPC_VALUE}};
 
template SemicolonParam_List m_ReasonParams
(template charstring p_cause, template charstring p_text) :=
{m_Cause(p_cause),m_Text(p_text)};
template ReasonValue m_ReasonValue
(template charstring p_cause, template charstring p_text) :=
{
token := "Q.850",
reasonParams := m_ReasonParams(p_cause,p_text)
};
 
template ReasonValue m_ReasonValueSIP
(template charstring p_cause, template charstring p_text) :=
{
token := "SIP",
reasonParams := m_ReasonParams(p_cause,p_text)
};
template RouteBody mw_routeBody (template SipUrl p_sipurl):=
{
nameAddr :=
{
displayName := *,
addrSpec := p_sipurl
},
rrParam := *
}
 
template SentProtocol m_SentProtocol (charstring p_protocol) :=
{protocolName := c_sipName,
protocolVersion:= c_sipVersion,
transport:= p_protocol};
 
template SipUrl m_SipUrl_currDomain(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.homeDomain, //* hostname, IPv4 or IPv6 as a charstring
portField := omit //* p_userprofile.currPort //* optional integer
},
urlParameters := omit,
headers := omit
}
 
template SipUrl m_SipUrl_contactIpaddr(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField := p_userprofile.contactPort //* optional integer
},
urlParameters := omit,
headers := omit
}
 
template SipUrl m_SipUrl_contactIpaddrAndCpc(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername & "; cpc=" & PX_SIP_ISUP_CPC_VALUE,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField := p_userprofile.contactPort //* optional integer
},
urlParameters := omit,
headers := omit
}
 
template SipUrl m_SipUrl_currIpaddr(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_sipScheme, //* contains "sip"
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring
portField := p_userprofile.currPort //* optional integer
},
urlParameters := omit,
headers := omit
}
template SipUrl m_SipUrl_Anonymous := //* SIP-URL with a calles party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo := //* optional
{
userOrTelephoneSubscriber := "Anonymous",//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := "Anonymous.invalid", //* hostname, IPv4 or IPv6 as a charstring
portField := omit //* optional integer
},
urlParameters := omit,
headers := omit
};
template SipUrl m_TelUrl_publUser(in SipUserProfile p_userprofile) := //* SIP-URL of the test system on SIP side
{
scheme := c_telScheme, //* contains "tel"
userInfo := //* optional
{
userOrTelephoneSubscriber := p_userprofile.publUsername,//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := omit, //* hostname, IPv4 or IPv6 as a charstring
portField := omit //* p_userprofile.currPort //* optional integer
},
urlParameters := omit,
headers := omit
}
template SipUrl mw_TelUrl :=
{
scheme := c_telScheme,
userInfo := *,
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl :=
{
scheme := c_sipScheme,
userInfo := *,
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_TelSip_unavailableInvalidUri :=
{
scheme := (c_telScheme,c_sipScheme),
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort},
urlParameters := omit,
headers := omit
};
 
template SipUrl mw_TelSip_unavailableUri (charstring p_host):=
{
scheme := (c_telScheme,c_sipScheme),
userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
hostPort := {host:=p_host, portField:=c_defaultSipPort},
urlParameters := omit,
headers := omit
};
 
template SipUrl mw_SipUrl_Number(charstring p_number) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := ?,
urlParameters := *,
headers := *
};
 
template SipUrl mw_TelSipUrl_Number(template charstring p_number) := //* SIP-URL with a calling party number
{
scheme := (c_telScheme,c_sipScheme), //* contains "sip" or "tel"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*}, //* nat or int format
hostPort := ?,
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl_Host(template charstring p_host) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= *,
hostPort := {host:=p_host, portField:=*},
urlParameters := *,
headers := *
};
 
template SipUrl mw_SipUrl_NumberHost(charstring p_number, charstring p_host) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*},
urlParameters := *,
headers := *
};
template SipUrl mw_SipUrl_NumberHostParam(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*},
urlParameters := p_urlParameters,
headers := *
};
template SipUrl m_SipUrl_NumberHostHeader(charstring p_number, charstring p_host, template AmpersandParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=omit},
urlParameters := omit,
headers := p_urlParameters
};
template SipUrl mw_SipUrl_NumberHostHeader(charstring p_number, charstring p_host, template AmpersandParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
hostPort := {host:=p_host, portField:=*},
urlParameters := *,
headers := p_urlParameters
};
template SipUrl m_SipUrl_NumberHostParam(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=c_defaultSipPort},
urlParameters := p_urlParameters,
headers := omit
};
template SipUrl m_SipUrl_NumberHostParam_woPort(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
hostPort := {host:=p_host, portField:=omit},
urlParameters := p_urlParameters,
headers := omit
};
template SipUrl mw_SipUrl_Anonymous := //* SIP-URL with a calles party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo := //* optional
{
userOrTelephoneSubscriber := pattern "[a,A][n,N][o,O][n,N][y,Y][m,M][o,O][u,U][s,s]",//* charstring
password := omit //* optional charstring
},
hostPort :=
{
host := pattern "[a,A]nonymous.invalid", //* hostname, IPv4 or IPv6 as a charstring
portField := * //* optional integer
},
urlParameters := *,
headers := *
};
 
template SipUrl mw_SipUrl_urlParam(template SemicolonParam_List p_urlParameters) := //* SIP-URL with a calling party number
{
scheme := c_sipScheme, //* contains "sip"
userInfo:= *,
hostPort := *,
urlParameters := p_urlParameters,
headers := *
};
template ContactAddress mw_ContactAddress :=
{
addressField := ?,
contactParams := *
};
 
template HostPort mw_hostPort(template charstring p_host, template integer p_portField) :=
{
host := p_host,
portField := p_portField
};
template StatusLine mw_statusLine1xx := {sipVersion := c_sipNameVersion, statusCode := (100..199), reasonPhrase := ?};
template StatusLine mw_statusLine4xx := {sipVersion := c_sipNameVersion, statusCode := (400..499), reasonPhrase := ?};
template StatusLine mw_statusLine5xx := {sipVersion := c_sipNameVersion, statusCode := (500..599), reasonPhrase := ?};
template StatusLine mw_statusLineFinal := {sipVersion := c_sipNameVersion, statusCode := (200..699), reasonPhrase := ?};
 
template NameAddr mw_NameAddr_DispName_User_Host(template charstring p_dn, template charstring p_user, template charstring p_host) :=
{
displayName := p_dn,
addrSpec :=
{
scheme := c_sipScheme, //* contains "sip"
userInfo := {userOrTelephoneSubscriber :=p_user, password := *},
hostPort :=
{
host := p_host, //* hostname, IPv4 or IPv6 as a charstring
portField := * //* optional integer
},
urlParameters := {m_UserPhone},
headers := *
}
}
template Addr_Union mw_AddrUnion_Nameaddr(template charstring p_dn, template charstring p_user, template charstring p_host):=
{
nameAddr:=mw_NameAddr_DispName_User_Host(p_dn,p_user,p_host)
}
template SipUrl mw_SipUrl_User_Host(template charstring p_user, template charstring p_host) :=
{
scheme := c_sipScheme, //* contains "sip"
userInfo := {userOrTelephoneSubscriber :=p_user, password := *},
hostPort :=
{
host := p_host, //* hostname, IPv4 or IPv6 as a charstring
portField := * //* optional integer
},
urlParameters := {m_UserPhone},
headers := *
}
template Addr_Union mw_AddrUnion_SipUrl(template charstring p_user, template charstring p_host):=
{
addrSpecUnion:=mw_SipUrl_User_Host(p_user,p_host)
}
 
} //* end group Subfields
 
 
 
 
 
group HeaderFieldTemplates {
template LibSip_SIPTypesAndValues.Allow m_Allow (template Method_List p_methods) := {
fieldName := ALLOW_E,
methods := p_methods
}
template LibSip_SIPTypesAndValues.Allow mw_Allow (charstring p_method) := {
fieldName := ALLOW_E,
methods := superset(p_method)
}
 
template GenericParam m_Cause (template charstring p_cause):=
{id:="cause", paramValue:=p_cause}
template GenericParam mw_Cause (template charstring p_cause):=
// {id:=?, paramValue:= p_cause}
{id:=?, paramValue:= pattern "*{p_cause}*"} // TODO - Expression does not work for all TTCN tools
 
template Authorization m_Authorization (template Credentials p_Credentials):=
{
fieldName := AUTHORIZATION_E,
body := {p_Credentials}
}
template Authorization m_Authorization_digest (template CommaParam_List p_CommaParam_List):=
{
fieldName := AUTHORIZATION_E,
body := {{digestResponse := p_CommaParam_List}}
}
 
template Authorization m_add_Authorization_digest (in Authorization p_auth, template CommaParam_List p_CommaParam_List):=
{
fieldName := AUTHORIZATION_E,
body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse,valueof(p_CommaParam_List))}}
}
 
template Authorization m_Authorization_other :=
{
fieldName := AUTHORIZATION_E,
body := {{otherResponse := ?}}
}
 
template Contact m_Contact(template SipUrl p_sipUrl) :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := { addrSpecUnion := p_sipUrl},
contactParams := omit
}
}
} //* end contactBody
}//* end m_Contact
 
template Contact m_Contact_profile(in SipUserProfile p_userprofile) :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := { addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := omit
}
}
} //* end contactBody
}//* end m_Contact
 
 
template Contact m_Contact_profile_expires(in SipUserProfile p_userprofile, in charstring p_expires) :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := { addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
contactParams := {{"expires",p_expires}}
}
}
} //* end contactBody
}//* end m_Contact
template From m_From(template NameAddr p_nameAddr, charstring p_tag_str) :=
{
fieldName := FROM_E,
addressField :=
{nameAddr := p_nameAddr},//* end addressField
fromParams := {{id := c_tagId, paramValue := p_tag_str}}
};
template From m_From_Anonymous(charstring p_tag_str) :=
{
fieldName := FROM_E,
addressField :=
{nameAddr := {
displayName := "Anonymous", //* optional charstring
addrSpec := m_SipUrl_Anonymous //* SipUrl
}},//* end addressField
fromParams := {{id := c_tagId, paramValue := p_tag_str}}
};
template From m_From_SipUrl(template SipUrl p_sipUrl) :=
{
fieldName := FROM_E,
addressField :=
{nameAddr := {
displayName := omit, //* optional charstring
addrSpec := p_sipUrl //* SipUrl
}},//* end addressField
fromParams := omit
};
template Event m_Event_refer :=
{
fieldName := EVENT_E,
eventType := "refer",
eventParams := omit
};
 
template Event m_Event_conference :=
{
fieldName := EVENT_E,
eventType := "conference",
eventParams := omit
};
 
template Event m_Event_presence :=
{
fieldName := EVENT_E,
eventType := "presence",
eventParams := omit
};
 
template Event m_Event_reg :=
{
fieldName := EVENT_E,
eventType := "reg",
eventParams := omit
};
template Event m_Event_cdiv :=
{
fieldName := EVENT_E,
eventType := "comm-div-info",
eventParams := omit
};
template Event m_Event_mcid :=
{
fieldName := EVENT_E,
eventType := "comm-div-info",
eventParams := omit
};
 
template Expires m_Expires_600000 :=
{
fieldName := EXPIRES_E,
deltaSec := "600000"
};
 
template Expires m_Expires (charstring p_deltaSec):=
{
fieldName := EXPIRES_E,
deltaSec := p_deltaSec
};
 
 
template PAssertedID m_PAssertedID(template Addr_Union p_pAssertedIDValue) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
};
 
template HistoryInfo mw_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) :=
{
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
};
 
template HistoryInfoEntry mw_HistoryInfoEntry(template SipUrl p_Url, template StringList p_index, template SemicolonParam_List p_paramlist) :=
{
nameAddr := {displayName:=*, addrSpec:= p_Url},
hiIndex := p_index,
hiExtention := p_paramlist
}
template HistoryInfo m_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) :=
{
fieldName := HISTORY_INFO_E,
historyInfoList := p_HistoryInfo_List
};
template HistoryInfoEntry m_HistoryInfoEntry(template SipUrl p_Url, template StringList p_index, template SemicolonParam_List p_paramlist) :=
{
nameAddr := {displayName:=omit, addrSpec:= p_Url},
hiIndex := p_index,
hiExtention := p_paramlist
}
template PAssertedID m_PAssertedID_2x(template Addr_Union p_pAssertedIDValue1, template Addr_Union p_pAssertedIDValue2) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue1, p_pAssertedIDValue2}
};
template PAssertedID mw_PAssertedID(template PAssertedIDValue p_pAssertedIDValue) :=
{
fieldName := P_ASSERTED_ID_E,
pAssertedIDValueList := {p_pAssertedIDValue}
};
 
template PAssertedIDValue mw_PAssertedIDValue(template SipUrl p_SipUrl) :=
{
nameAddr :={displayName := *, addrSpec:=p_SipUrl}
};
template PPreferredID m_PPreferredID(template Addr_Union p_pPreferredIDValue) :=
{
fieldName := P_PREFERRED_ID_E,
pPreferredIDValueList := {p_pPreferredIDValue}
};
 
template Privacy m_Privacy(PrivacyValue p_privacy) :=
{
fieldName := PRIVACY_E,
privValueList := {p_privacy}
};
template RAck m_RAck(integer p_responseNum, integer p_seqNumber, charstring p_method) :=
{
fieldName := RACK_E,
responseNum := p_responseNum,
seqNumber := p_seqNumber,
method := p_method
};
 
template Reason m_Reason(integer p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(p_cause),"dummy")}
};
 
template Reason m_Reason21 :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(int2str(21),"call reject")}
};
 
template RecordRoute m_recordRoute_currIpAddr (in SipUserProfile p_userprofile):=
{
fieldName := RECORD_ROUTE_E,
routeBody := {{nameAddr := {displayName := omit,
addrSpec := {scheme := c_sipScheme, //* contains "sip"
userInfo := omit,
hostPort := {host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort},
urlParameters := omit,
headers := omit}
},
rrParam := omit}
}};
template ReferredBy m_ReferredBy_SipUrl(template SipUrl p_sipUrl) :=
{
fieldName := REFERRED_BY_E,
nameAddr :={displayName := omit, addrSpec:=p_sipUrl},
referredbyIdParams := omit
}
 
template ReferTo m_ReferTo_SipUrl(template SipUrl p_sipUrl, charstring p_method) :=
{
fieldName := REFER_TO_E,
nameAddr :={displayName := omit, addrSpec:=p_sipUrl},
referToParams := {{id:="method",paramValue :=p_method}}
}
 
template ReferSub m_ReferSub(in boolean p_value) :=
{
fieldName := REFER_SUB_E,
referSubValue :=p_value,
referSubParams := omit
}
 
template Replaces m_Replaces(
charstring p_callId,
charstring p_toTag,
charstring p_fromTag
) := {
fieldName := REPLACES_E,
replacesParams := {
{id := p_callId, paramValue := omit},
{id := "to-tag", paramValue := p_toTag},
{id := "from-tag", paramValue := p_fromTag}
}
}
 
template Require m_Require_replaces :=
{
fieldName := REQUIRE_E,
optionsTags := {c_replaces}
};
 
template Require m_Require_empty :=
{
fieldName := REQUIRE_E,
optionsTags := {""}
};
template Require m_Require_100rel :=
{
fieldName := REQUIRE_E,
optionsTags := {c_tag100rel}
};
template Require m_Require_prec :=
{
fieldName := REQUIRE_E,
optionsTags := {c_tagPrecond}
}
template SubscriptionState m_SubscriptionState_active :=
{
fieldName := SUBSCRIPTION_STATE_E,
subState := "active",
substateParams := {{id:="expires",paramValue:="60000"}}
}
template Supported m_Supported_fromChange :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tagFromChange}
}
template Supported m_Supported_prec :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tagPrecond}
}
template Supported m_Supported_100rel :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tag100rel}
}
template Supported m_Supported_100rel_prec :=
{
fieldName:=SUPPORTED_E,
optionsTags:={c_tag100rel, c_tagPrecond}
}
 
template GenericParam m_Text (template charstring p_text):=
{id:="text", paramValue:=p_text}
template GenericParam m_UserPhone :=
{
id := "user",
paramValue := "phone"
}
template GenericParam m_UserToUserEncodingHex :=
{
id := "encoding",
paramValue := "hex"
}
template UserToUser m_UserToUserData(template charstring p_U2UData):=
{
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := m_UserToUserEncodingHex
}
template To m_To(template SipUrl p_sipUrl) :=
{
fieldName := TO_E,
addressField :=
{nameAddr := {
displayName := "ETSI Tester", //* optional charstring
addrSpec := p_sipUrl //* SipUrl
}},//* end addressField
toParams := omit
};
 
template To m_To_SipUrl(SipUrl p_sipUrl) :=
{
fieldName := TO_E,
addressField :=
{nameAddr := {
displayName := omit, //* optional charstring
addrSpec := p_sipUrl //* SipUrl
}},//* end addressField
toParams := omit
};
 
template To mw_To_NameAddr_SipUrl(template charstring p_dn, template charstring p_user, template charstring p_host) :=
{
fieldName := TO_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn,p_user,p_host),mw_AddrUnion_SipUrl(p_user,p_host)),
toParams := *
}
 
template To mw_To(template SipUrl p_sipUrl) := {
fieldName := TO_E,
addressField := { nameAddr := {displayName := *, addrSpec := p_sipUrl}},
toParams:= *
}
 
template From mw_From(template SipUrl p_sipUrl) := {
fieldName := FROM_E,
addressField := { nameAddr := {displayName := *, addrSpec := p_sipUrl}},
fromParams:= *
}
 
template From mw_From_NameAddr_SipUrl(template charstring p_dn, template charstring p_user, template charstring p_host) :=
{
fieldName := FROM_E,
addressField := (mw_AddrUnion_Nameaddr(p_dn,p_user,p_host),mw_AddrUnion_SipUrl(p_user,p_host)),
fromParams := *
}
template ViaBody m_ViaBody_currIpaddr(charstring branch_val,in SipUserProfile p_userprofile) :=
{
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy:={host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort},
viaParams:={{id :=c_branchId,paramValue :=branch_val}}
}
template ViaBody mw_ViaBody_interface(template HostPort p_hostport) :=
{
sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
sentBy:={host:=p_hostport.host, portField:= p_hostport.portField},
viaParams:=*
}
 
template Via mw_Via(template ViaBody p_viabody) :=
{
fieldName := VIA_E,
viaBody:= ? //* superset(p_viabody)
}
template CallId mw_CallId_any :=
{
fieldName := CALL_ID_E,
callid := ?
}
 
template Privacy mw_Privacy_id :=
{
fieldName := PRIVACY_E,
privValueList := {*,"id",*}
};
 
template Privacy mw_Privacy(template charstring p_value) :=
{
fieldName := PRIVACY_E,
privValueList := {*,p_value,*}
};
 
template Privacy mw_Privacy_user :=
{
fieldName := PRIVACY_E,
privValueList := {*,"user",*}
};
template Reason mw_Reason(template charstring p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValue(p_cause,?)}
};
 
template Reason mw_ReasonSIP(template charstring p_cause) :=
{
fieldName := REASON_E,
reasonValues := {m_ReasonValueSIP(p_cause,?)}
};
template Require mw_Require_not_100rel :=
{
fieldName := REQUIRE_E,
optionsTags := superset(complement(c_tag100rel))
};
template Require mw_require_100rel :=
{
fieldName := REQUIRE_E,
optionsTags := superset(c_tag100rel)
};
 
template RecordRoute mw_recordroute (template RouteBody p_routeBody):=
{
fieldName := RECORD_ROUTE_E,
routeBody := ? //* superset(p_routeBody)
};
template Route mw_route (template RouteBody_List p_routeBody):=
{
fieldName := ROUTE_E,
routeBody := p_routeBody
};
template StatusLine mw_statusLine(template integer p_statusCode) :=
{
sipVersion:=c_sipNameVersion,
statusCode:=p_statusCode,
reasonPhrase:=?
};
template Supported mw_Supported_100rel_prec :=
{
fieldName:=SUPPORTED_E,
optionsTags:= superset(c_tag100rel, c_tagPrecond)
}
template Supported mw_Supported_100rel :=
{
fieldName:=SUPPORTED_E,
optionsTags:= superset(c_tag100rel)
}
 
template Supported mw_Supported_fromChange :=
{
fieldName:=SUPPORTED_E,
optionsTags:= superset(c_tagFromChange)
}
template UserToUser mw_UserToUserData(template charstring p_U2UData):=
{
fieldName := USER_TO_USER_E,
uuiData := p_U2UData,
uuiParam := ?
}
template Contact mw_Contact_conference :=
{
fieldName := CONTACT_E,
contactBody :=
{
contactAddresses :=
{
{
addressField := {
nameAddr := {
displayName := *,
addrSpec := {
scheme := ?,
userInfo := *,
hostPort := *,
urlParameters := {{"isfocus",*},*},
headers := *
}
}
},
contactParams := *
}
}
}
}
template AlertInfo m_AlertInfo(charstring p_urn) := {
fieldName := ALERT_INFO_E,
alertInfoBody := {{p_urn, omit}}
}
template AlertInfo mw_AlertInfo(template charstring p_urn) := {
fieldName := ALERT_INFO_E,
alertInfoBody := superset({p_urn, omit})
}
} //* end of group HeaderFieldTemplates
 
 
group MessageTemplates {
group dummy_templates {
group dummy_parameter_send {
 
template RequestLine m_requestLine_dummy(Method p_method) :=
{
method := p_method,
requestUri := c_unavailableUri,
sipVersion := c_sipNameVersion
}
 
template MessageHeader m_msgHeader_dummy :=
{
accept := omit,
acceptContact := omit,
acceptEncoding := omit,
acceptLanguage := omit,
alertInfo := omit,
allow := omit,
allowEvents := omit, //* RFC3265
authenticationInfo := omit,
authorization := omit,
callId := c_empty_CallId,
callInfo := omit,
contact := omit,
contentDisposition := omit,
contentEncoding := omit,
contentLanguage := omit,
contentLength := {fieldName := CONTENT_LENGTH_E, len:= 0},
contentType := omit, //* if message body present m, else not present
cSeq := c_empty_cSeq,
date := omit,
errorInfo := omit,
event := omit, //* RFC3265
expires := omit,
fromField := c_empty_From,
geolocation := 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
subject := omit,
subscriptionState := omit, //* RFC3265
supported := omit,
timestamp := omit,
toField := c_empty_To,
unsupported := omit,
userToUser := omit,
userAgent := omit,
via := c_empty_Via,
warning := omit,
wwwAuthenticate := omit,
undefinedHeader_List := omit
}
} //* group dummy_parameter_send
group dummy_parameter_receive {
 
template RequestLine mw_requestLine_dummy(Method p_method) :=
{
method := p_method,
requestUri := ?,
sipVersion := c_sipNameVersion
}
 
template MessageHeader mw_msgHeader_dummy :=
{
accept := *,
acceptContact := *,
acceptEncoding := *,
acceptLanguage := *,
alertInfo := *,
allow := *,
allowEvents := *, //* RFC3265
authenticationInfo := *,
authorization := *,
callId := ?,
callInfo := *,
contact := *,
contentDisposition := *,
contentEncoding := *,
contentLanguage := *,
contentLength := ?,
contentType := *,
cSeq := ?,
date := *,
errorInfo := *,
event := *, //* RFC3265
expires := *,
fromField := ?,
geolocation := *,
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
subject := *,
subscriptionState := *, //* RFC3265
supported := *,
timestamp := *,
toField := ?,
unsupported := *,
userToUser := *,
userAgent := *,
via := ?,
warning := *,
wwwAuthenticate := *,
undefinedHeader_List := *
}
}//* end group dummy_parameter_receive
group dummy_request_templates_send {
 
template ACK_Request m_ACK_Dummy :=
{
requestLine := m_requestLine_dummy(ACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template BYE_Request m_BYE_Dummy :=
{
requestLine := m_requestLine_dummy(BYE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template CANCEL_Request m_CANCEL_Dummy :=
{
requestLine := m_requestLine_dummy(CANCEL_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template INFO_Request m_INFO_Dummy :=
{
requestLine := m_requestLine_dummy(INFO_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template INVITE_Request m_INVITE_Dummy :=
{
requestLine := m_requestLine_dummy(INVITE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template MESSAGE_Request m_MESSAGE_Dummy :=
{
requestLine := m_requestLine_dummy(MESSAGE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template NOTIFY_Request m_NOTIFY_Dummy :=
{
requestLine := m_requestLine_dummy(NOTIFY_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
template OPTIONS_Request m_OPTIONS_Dummy :=
{
requestLine := m_requestLine_dummy(OPTIONS_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template PRACK_Request m_PRACK_Dummy :=
{
requestLine := m_requestLine_dummy(PRACK_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template PUBLISH_Request m_PUBLISH_Dummy :=
{
requestLine := m_requestLine_dummy(PUBLISH_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template REGISTER_Request m_REGISTER_Dummy :=
{
requestLine := m_requestLine_dummy(REGISTER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template REFER_Request m_REFER_Dummy :=
{
requestLine := m_requestLine_dummy(REFER_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template SUBSCRIBE_Request m_SUBSCRIBE_Dummy :=
{
requestLine := m_requestLine_dummy(SUBSCRIBE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
 
template UPDATE_Request m_UPDATE_Dummy :=
{
requestLine := m_requestLine_dummy(UPDATE_E),
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
}//* end group dummy_request_templates_send
group dummy_request_templates_receive{
 
template ACK_Request mw_ACK_Dummy :=
{
requestLine := mw_requestLine_dummy(ACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template BYE_Request mw_BYE_Dummy :=
{
requestLine := mw_requestLine_dummy(BYE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template CANCEL_Request mw_CANCEL_Dummy :=
{
requestLine := mw_requestLine_dummy(CANCEL_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template INFO_Request mw_INFO_Dummy :=
{
requestLine := mw_requestLine_dummy(INFO_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template INVITE_Request mw_INVITE_Dummy :=
{
requestLine := mw_requestLine_dummy(INVITE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template MESSAGE_Request mw_MESSAGE_Dummy :=
{
requestLine := mw_requestLine_dummy(MESSAGE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
template OPTIONS_Request mw_OPTIONS_Dummy :=
{
requestLine := mw_requestLine_dummy(OPTIONS_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template NOTIFY_Request mw_NOTIFY_Dummy :=
{
requestLine := mw_requestLine_dummy(NOTIFY_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template PRACK_Request mw_PRACK_Dummy :=
{
requestLine := mw_requestLine_dummy(PRACK_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template PUBLISH_Request mw_PUBLISH_Dummy :=
{
requestLine := mw_requestLine_dummy(PUBLISH_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template REFER_Request mw_REFER_Dummy :=
{
requestLine := mw_requestLine_dummy(REFER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template REGISTER_Request mw_REGISTER_Dummy :=
{
requestLine := mw_requestLine_dummy(REGISTER_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template SUBSCRIBE_Request mw_SUBSCRIBE_Dummy :=
{
requestLine := mw_requestLine_dummy(SUBSCRIBE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
 
template UPDATE_Request mw_UPDATE_Dummy :=
{
requestLine := mw_requestLine_dummy(UPDATE_E),
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
}//* end group dummy_request_templates_receive
group dummy_response_templates_send{
template Response m_Response_Dummy :=
{
statusLine := c_statusLine100,
msgHeader := m_msgHeader_dummy,
messageBody := omit,
payload := omit
}
} //* group dummy_response_templates_send
group dummy_response_templates_receive{
template Response mw_Response_Dummy :=
{
statusLine := ?,
msgHeader := mw_msgHeader_dummy,
messageBody := *,
payload := *
}
} //* group dummy_response_templates_receive
}
 
group base_templates{
group request_send {
template ACK_Request m_ACK_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_ACK_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "ACK"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template BYE_Request m_BYE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via) modifies m_BYE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template CANCEL_Request m_CANCEL_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via) modifies m_CANCEL_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
 
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template INFO_Request m_INFO_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via) modifies m_INFO_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
template INVITE_Request m_INVITE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact) modifies m_INVITE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template MESSAGE_Request m_MESSAGE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, Via p_via) modifies m_MESSAGE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template NOTIFY_Request m_NOTIFY_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_NOTIFY_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "NOTIFY"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template OPTIONS_Request m_OPTIONS_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_OPTIONS_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "OPTIONS"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
template PRACK_Request m_PRACK_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, RAck p_RAck)
modifies m_PRACK_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "PRACK"},
fromField := p_from,
rAck := p_RAck,
toField := p_to,
via := p_via
},
messageBody := omit
}
template PUBLISH_Request m_PUBLISH_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Event p_event, template RAck p_RAck, template MessageBody p_mb)
modifies m_PUBLISH_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_plainText/*c_sdpAplication*/},
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "PUBLISH"},
event := p_event,
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
 
template REFER_Request m_REFER_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, Contact p_contact,
From p_from, template To p_to, Via p_via, template ReferTo p_referTo, template ReferredBy p_referredBy)
modifies m_REFER_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contact := p_contact,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "REFER"},
fromField := p_from,
referTo := p_referTo,
referredBy := p_referredBy,
toField := p_to,
via := p_via
}
}
template REFER_Request m_REFER_Request_replaces (
SipUrl p_requestUri,
CallId p_callId,
CSeq p_cSeq,
Contact p_contact,
From p_from,
template To p_to,
Via p_via,
template ReferTo p_referTo,
template ReferredBy p_referredBy,
template Replaces p_replaces,
template Require p_require
) modifies m_REFER_Request_Base := {
msgHeader :=
{
replaces := p_replaces,
require := p_require
}
}
template REGISTER_Request m_REGISTER_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact, template Authorization p_authorization) modifies m_REGISTER_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
authorization := p_authorization,
callId := p_callId,
contact := p_contact,
cSeq := p_cSeq,
fromField := p_from,
toField := p_to,
supported := {
fieldName := SUPPORTED_E, optionsTags := {"path"}
},
via := p_via
}
}
 
template SUBSCRIBE_Request m_SUBSCRIBE_Request_Base (SipUrl p_requestUri, CallId p_callId,
CSeq p_cSeq, From p_from, To p_to, Via p_via) modifies m_SUBSCRIBE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "SUBSCRIBE"},
fromField := p_from,
toField := p_to,
via := p_via
}
}
 
template UPDATE_Request m_UPDATE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact, template MessageBody p_mb) modifies m_UPDATE_Dummy :=
{
requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
contact := p_contact,
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication},
cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "UPDATE"},
fromField := p_from,
toField := p_to,
via := p_via
},
messageBody := p_mb
}
} //* end of group message_send
 
group request_receive {
template ACK_Request mw_ACK_Request_Base (template CallId p_callId) modifies mw_ACK_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template BYE_Request mw_BYE_Request_Base(template CallId p_callId) modifies mw_BYE_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template CANCEL_Request mw_CANCEL_Request_Base (template CallId p_callId) modifies mw_CANCEL_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template INFO_Request mw_INFO_Request_Base(template CallId p_callId) modifies mw_INFO_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
 
template INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy :=
{
requestLine :=
{
method := INVITE_E
}
}
 
template MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy :=
{
msgHeader :=
{
contact := *
}
}
 
template NOTIFY_Request mw_NOTIFY_Request_Base (template CallId p_callId) modifies mw_NOTIFY_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template OPTIONS_Request mw_OPTIONS_Request_Base (template CallId p_callId) modifies mw_OPTIONS_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template PRACK_Request mw_PRACK_Request_Base(template CallId p_callId) modifies mw_PRACK_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template PUBLISH_Request mw_PUBLISH_Request_Base(template CallId p_callId) modifies mw_PUBLISH_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
 
template REFER_Request mw_REFER_Request_Base (template CallId p_callId) modifies mw_REFER_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
template REFER_Request
mw_REFER_Request(template CallId p_callId, SipUrl p_requestUri,
SipUrl p_referredBy)
modifies mw_REFER_Request_Base := {
requestLine := {requestUri := p_requestUri},
msgHeader := {
callId := p_callId,
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := {displayName := *, addrSpec := p_referredBy},
referredbyIdParams := *
}
}
}
template INVITE_Request mw_INVITE_Request(template Require p_require,
SipUrl p_referredBy) modifies mw_INVITE_Request_Base := {
msgHeader := {
require := p_require,
referredBy := {
fieldName := REFERRED_BY_E,
nameAddr := {displayName := *, addrSpec := p_referredBy},
referredbyIdParams := *
}
}
}
template REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy :=
{
requestLine :=
{
method := REGISTER_E
}
}
 
template SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy :=
{
requestLine :=
{
method := SUBSCRIBE_E
}
}
 
template UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy :=
{
msgHeader :=
{
callId := p_callId
}
}
 
} //* end group request_receive
group response_send {
 
template Response m_Response_Base (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via) modifies m_Response_Dummy:=
{
statusLine := p_statusLine,
msgHeader :=
{
callId := p_callId,
cSeq := p_cSeq,
fromField := p_from,
maxForwards := omit,
toField := p_to,
via := p_via
},
messageBody := omit,
payload := omit
}
 
 
} //* end group response_send
 
group response_receive {
 
template Response mw_Response_Base (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq) modifies mw_Response_Dummy:=
{
statusLine := p_statusLine,
msgHeader :=
{
callId := p_callId,
contentLength := *,
cSeq := p_cSeq,
fromField := ?,
maxForwards := *,
toField := ?,
via := ?
}
}
} //* end group message_receive
 
} //* end group full_templates
 
group modified_templates {
group request_send {
template ACK_Request m_ACK_Request_route (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route)
modifies m_ACK_Request_Base
:=
{
msgHeader :=
{
route := p_route
}
}
 
template ACK_Request m_ACK_Request_sdp (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via,template MessageBody p_mb )
modifies m_ACK_Request_Base
:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication}
},
messageBody := p_mb
}
template BYE_Request m_BYE_Request_cause
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, Via p_via, integer p_cause)
modifies m_BYE_Request_Base
:=
{
msgHeader :=
{
reason := m_Reason(p_cause) //* PIXIT value
}
}
template INVITE_Request m_INVITE_Request_sdp
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via, Contact p_contact, template MessageBody p_mb)
modifies m_INVITE_Request_Base
:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication}
},
messageBody := p_mb
}
template INVITE_Request m_INVITE_Request_ResourceList
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
Via p_via, Contact p_contact, template MessageBody p_mb)
modifies m_INVITE_Request_Base
:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/resource-lists+xml"},
contentDisposition := {
fieldName := CONTENT_DISPOSITION_E,
dispositionType := "recipient-list",
dispositionParams := omit
},
require := {
fieldName := REQUIRE_E,
optionsTags := {"recipient-list-invite"}
}
},
messageBody := p_mb
}
 
template REGISTER_Request m_REGISTER_Request_expires
(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, Contact p_contact,
template Authorization p_authorization, charstring p_expires)
modifies m_REGISTER_Request_Base
:=
{
msgHeader :=
{
authorization := p_authorization,
expires := {
fieldName := EXPIRES_E,
deltaSec := p_expires }
}
}
template NOTIFY_Request m_NOTIFY_Request_contact (
SipUrl p_requestUri,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
Contact p_contact
) modifies m_NOTIFY_Request_Base
:=
{
msgHeader :=
{
contact := p_contact,
event := m_Event_reg,
subscriptionState := m_SubscriptionState_active
}
}
template NOTIFY_Request m_NOTIFY_Request_sipfrag (
SipUrl p_requestUri,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
charstring p_state,
charstring p_sipfrag
) modifies m_NOTIFY_Request_Base := {
requestLine :=
{
method := NOTIFY_E,
requestUri :=
{
hostPort:= p_requestUri.hostPort
}
},
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= lengthof(p_sipfrag)},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := "message/sipfrag"},
subscriptionState := {
fieldName := SUBSCRIPTION_STATE_E,
subState := p_state,
substateParams := omit
},
event := m_Event_refer
},
messageBody := {
sipfrag := p_sipfrag
}
}
 
} //* end group request_send
 
 
group request_receive {
template BYE_Request mw_BYE_Request_Reason(template CallId p_callId, template charstring p_cause) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
reason := mw_Reason(p_cause)
}
}
 
template BYE_Request mw_BYE_Request_ReasonSIP(template CallId p_callId, template charstring p_cause) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
reason := mw_ReasonSIP(p_cause)
}
}
 
template BYE_Request mw_BYE_Request_headerfieldlist
(
template CallId p_callId,
template SipUrl p_requestUri,
template To p_to,
template From p_from,
template CSeq p_cSeq,
template Route p_route,
template RecordRoute p_recordRoute,
template Reason p_reason
) modifies mw_BYE_Request_Base :=
{ requestLine :=
{
requestUri := p_requestUri
},
msgHeader :=
{
callId := p_callId,
toField := p_to,
fromField := p_from,
cSeq := p_cSeq,
route := p_route,
recordRoute := p_recordRoute,
reason := p_reason
}
}
template BYE_Request mw_BYE_Request_UserToUser(template CallId p_callId) modifies mw_BYE_Request_Base :=
{
msgHeader :=
{
userToUser := ?
}
}
 
 
template INVITE_Request mw_INVITE_Request_RequestURI (template SipUrl p_sipUrl) modifies mw_INVITE_Dummy :=
{
requestLine :=
{
requestUri := p_sipUrl,
sipVersion := c_sipNameVersion
}
}
 
template INFO_Request mw_INFO_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INFO_Request_Base :=
{
messageBody := p_mb
}
 
template INVITE_Request mw_INVITE_Request_expires modifies mw_INVITE_Request_Base
:=
{
msgHeader := {expires := ?}
}
template INVITE_Request mw_INVITE_Request_callid(CallId p_callid) modifies mw_INVITE_Request_Base
:=
{
msgHeader := {callId := p_callid}
}
template INVITE_Request mw_INVITE_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INVITE_Request_Base :=
{
msgHeader := {callId := p_callId},
messageBody := p_mb
}
 
template INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo (template CallId p_callId)
modifies mw_INVITE_Request_Base
:=
{
msgHeader := { pAccessNetworkInfo := omit}
}
template INVITE_Request mw_INVITE_Request_PaccessNetworkInfo (template CallId p_callId)
modifies mw_INVITE_Request_Base
:=
{
msgHeader := { pAccessNetworkInfo := ?}
}
 
template INVITE_Request mw_INVITE_MSRP_Session(
in template SDP_media_field p_media_MSRP
) modifies mw_INVITE_Request_Base := {
messageBody := {
sdpMessageBody := {
protocol_version := ?,
origin := ?,
session_name := ?,
information := *,
uri := *,
emails := *,
phone_numbers := *,
connection := *,
bandwidth := *,
times := ?,
timezone_adjustments := *,
key := *,
attributes := *,
media_list := {
{
media_field := p_media_MSRP,
information := *,
connections := *,
bandwidth := *,
key := *,
attributes := {
{
msrp := {
attr_value := pattern "path:msrp://*" // FIXME Shall parse msrp and msrps for secured msrp
}
}
}
}
}
}
}
}
template REGISTER_Request mw_REGISTER_Request_ISC (template PAccessNetworkInfo p_access , template PVisitedNetworkID p_visited )modifies mw_REGISTER_Request_Base :=
{
msgHeader := {
pAccessNetworkInfo := p_access,
pVisitedNetworkID := p_visited
}
 
}
template UPDATE_Request mw_UPDATE_Request_SDP(template CallId p_callId, template MessageBody p_mb) modifies mw_UPDATE_Dummy :=
{
messageBody := p_mb
}
template NOTIFY_Request mw_NOTIFY_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_NOTIFY_Request_Base :=
{
messageBody := p_mb
}
 
} //* end group request_receive
 
group response_send {
template Response m_Response_AlertInfo (
StatusLine p_statusLine,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
Contact p_contact,
template AlertInfo p_alertInfo
) modifies m_Response_Base:= {
msgHeader := {
alertInfo := p_alertInfo,
contact := p_contact
}
}
template Response m_Response_Contact (
StatusLine p_statusLine,
CallId p_callId,
CSeq p_cSeq,
From p_from,
To p_to,
Via p_via,
Contact p_contact
) modifies m_Response_Base:= {
msgHeader := {
contact := p_contact
}
}
 
template Response m_Response_ext (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute) modifies m_Response_Base:=
{
msgHeader :={
route := p_route, //f_route(),
recordRoute := p_recordroute //f_recordroute()
}
}
template Response m_Response_mbody (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template MessageBody p_mb) modifies m_Response_ext:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication}
},
messageBody := p_mb
}
template Response m_Response_PAsserted_Privacy (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template PAssertedID p_pAssertedID, template Privacy p_privacy) modifies m_Response_ext:=
{
msgHeader :=
{
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
template Response mw_Response_PAsserted_Privacy_Supported (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template PAssertedID p_pAssertedID, template Privacy p_privacy, template Supported p_supported) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
pAssertedID := p_pAssertedID,
privacy := p_privacy,
supported := p_supported
}
}
template Response m_Response_PAsserted_Privacy_mbody (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute, template PAssertedID p_pAssertedID, template Privacy p_privacy, MessageBody p_mb) modifies m_Response_ext:=
{
msgHeader :=
{
contentLength := {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
contentType := {fieldName := CONTENT_TYPE_E, mediaType := c_sdpAplication},
pAssertedID := p_pAssertedID,
privacy := p_privacy
},
messageBody := p_mb
}
 
} //* end group response_send
 
 
group response_receive {
 
template Response mw_Response_Expires (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template DeltaSec p_deltaSec) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
expires := {fieldName := EXPIRES_E, deltaSec := p_deltaSec}
}
}
 
template Response mw_Response_PAsserted_Privacy (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template PAssertedID p_pAssertedID, template Privacy p_privacy) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
pAssertedID := p_pAssertedID,
privacy := p_privacy
}
}
 
template Response mw_Response_Reason (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template charstring p_cause) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
reason := mw_Reason(p_cause)
}
}
 
template Response mw_Response_RecordRoute (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template RecordRoute p_recordRoute) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
recordRoute := p_recordRoute
}
}
 
template Response mw_Response_Via (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Via p_via) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
via := p_via
}
}
template Response mw_Response_Contact (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Contact p_contact) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
contact := p_contact
}
}
template Response mw_Response_AlertInfo (
template StatusLine p_statusLine,
template CallId p_callId,
template CSeq p_cSeq,
template AlertInfo p_alertInfo
) modifies mw_Response_Base:= {
statusLine := {
sipVersion := c_sipNameVersion,
statusCode := p_statusLine.statusCode,
reasonPhrase := ?
},
msgHeader :=
{
alertInfo := p_alertInfo
}
}
template Response mw_Response_HistoryInfo (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template HistoryInfo p_historyInfo) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
historyInfo:=p_historyInfo
}
}
template Response mw_Response_messageBody (
template StatusLine p_statusLine,
template CallId p_callId,
template CSeq p_cSeq,
template Require p_require,
template MessageBody p_mb
) modifies mw_Response_Base:= {
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
require := p_require
},
messageBody := p_mb
}
template Response mw_Response_Require (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Require p_require) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
require := p_require
}
}
template Response mw_Response_Require_ifpresent (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Require p_require) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
require := p_require ifpresent
}
}
template Response mw_Response_Supported (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq, template Supported p_supported) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
supported := p_supported
}
}
template Response mw_Response_UserToUser (template StatusLine p_statusLine, template CallId p_callId,
template CSeq p_cSeq) modifies mw_Response_Base:=
{
statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
msgHeader :=
{
userToUser := ?
}
}
} //* end group response_receive
 
} //* end group modified_templates
 
} //* end group MessageTemplates
 
group SDP_Templates {
group SDP_Messages {
 
group base_templates {
template SDP_Message m_SDP(SDP_media_desc p_media, in SipUserProfile p_userprofile) := {
protocol_version := 0, //* v=0
origin := {
user_name := "voicesession",
session_id := "30000",
session_version := "0",
net_type := c_in,
addr_type := c_ip4,
addr := p_userprofile.contactIpaddr },
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
session_name := "Voice Session", //* s=Voice Session
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := { addr:= p_userprofile.bearerIpaddr, ttl:=omit, num_of_addr:=omit }
}, //* c=IN IP4 172.27.1.219
bandwidth := omit,
times := { { time_field := { "0", "0" }, time_repeat:=omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := {p_media}
};
template SDP_Message m_SDP_mediaList(SDP_media_desc_list p_media_list, in SipUserProfile p_userprofile)
:= {
protocol_version := 0, //* v=0
origin := {
user_name := "voicesession",
session_id := "30000",
session_version := "0",
net_type := c_in,
addr_type := c_ip4,
addr := p_userprofile.contactIpaddr },
//* o=voicesession 12345 12345 IN IP4 172.27.1.219
session_name := "Voice Session", //* s=Voice Session
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := {
net_type := c_in,
addr_type := c_ip4,
conn_addr := { addr:= p_userprofile.bearerIpaddr, ttl:=omit, num_of_addr:=omit }
}, //* c=IN IP4 172.27.1.219
bandwidth := omit,
times := { { time_field := { "0", "0" }, time_repeat:=omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := p_media_list
};
 
template SDP_Message m_SDP_media_attr_preconditions(SDP_media_desc p_media, in SipUserProfile p_userprofile, SDP_attribute_list p_attribute_list)
modifies m_SDP
:= {
media_list := {
{
media_field := {
media := c_audio,
ports := { port_number := 8500, num_of_ports:=omit },
transport := c_rtpAvp,
fmts := { "0" }
}, //* m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := p_attribute_list
}}
}
template SDP_Message m_SDP_attribute(SDP_media_desc p_media, in SipUserProfile p_userprofile, SDP_attribute loc_attribute)
modifies m_SDP
:= {
attributes := {loc_attribute}
};
 
template SDP_Message mw_SDP := {
protocol_version := 0, //* v=0
origin := ?,
session_name := ?,
information := omit,
uri := omit,
emails := omit,
phone_numbers := omit,
connection := ?,
bandwidth := omit,
times := { { time_field := { "0", "0" }, time_repeat:=omit
}
}, //* t=0 0
timezone_adjustments := omit,
key := omit,
attributes := omit,
media_list := ?
};
}//* end group base_templates
 
group modified_templates{
template SDP_Message m_SDP_bandwidth(SDP_media_desc p_media, in SipUserProfile p_userprofile)
modifies m_SDP
:= {
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
};
template SDP_Message m_SDP_unacceptable(SDP_media_desc p_media, in SipUserProfile p_userprofile)
modifies m_SDP
:= {
protocol_version := 1, //* v=1 unacceptable version of SDP
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
};
template SDP_Message m_SDP_encrypted(SDP_media_desc p_media, in SipUserProfile p_userprofile)
modifies m_SDP
:= {
protocol_version := 1, //* v=1 unacceptable version of SDP
bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
};
}//* end group modified_templates
} //* end group SDP_Messages
group SDP_Fields {
 
template SDP_media_desc m_media(template SDP_media_field p_mf) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
};
//TODO - delete old
// template SDP_media_desc m_mediaFieldBandwdthAttributes(template SDP_media_field p_mf, template SDP_bandwidth p_bw, template SDP_attribute_list p_attributes) := {
// media_field := p_mf,
// information := omit,
// connections := omit,
// bandwidth := {p_bw},
// key := omit,
// attributes := p_attributes
// };
template SDP_media_desc m_mediaFieldBandwdthAttributes(template SDP_media_field p_mf, template SDP_bandwidth_list p_bw_l, template SDP_attribute_list p_attributes) := {
media_field := p_mf,
information := omit,
connections := omit,
bandwidth := p_bw_l,
key := omit,
attributes := p_attributes
};
template SDP_media_desc m_media_dynPT(charstring p_PT, charstring p_encod) := {
media_field := {
media := c_audio,//* "audio",
ports := { port_number := 8500, num_of_ports:=omit },
transport := c_rtpAvp,//* "RTP/AVP",
fmts := { p_PT }
}, //* m=audio 8500 RTP/AVP 8
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := { { rtpmap := { attr_value := p_PT & " " & p_encod }
}
} //* a=rtpmap:8 PCMA/8000
};
template SDP_media_desc m_media_unsupported := {
media_field := {
media := "video",
ports := { port_number := 11500, num_of_ports:=omit },
transport := "RTP/AVP",
fmts := { "99" }
}, //* m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := { {
rtpmap := { attr_value := "99 X-Experimental/180000"}
}}
};
 
template SDP_bandwidth m_bandwidth(template charstring loc_m, template integer loc_b) := {
modifier:=loc_m,
bandwidth:=loc_b
};
 
template SDP_bandwidth m_bandwidth_as_64:=
{
modifier:="AS",
bandwidth:=64
}
template SDP_bandwidth mw_bandwidth_rs:=
{
modifier:="RS",
bandwidth:=?
}
template SDP_bandwidth mw_bandwidth_rr:=
{
modifier:="RR",
bandwidth:=?
}
 
template SDP_media_field m_media_field(charstring p_media, integer p_portNum, charstring p_transport, charstring p_fmts) :=
{
media := p_media,
ports := { port_number := p_portNum, num_of_ports:=omit },
transport := p_transport,
fmts := { p_fmts }
}
 
template SDP_media_field mw_media_PCMU :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { "0" }
}
 
template SDP_media_field mw_media_PCMA :=
{
media := c_audio,
ports := { port_number := 8500, num_of_ports:=omit },
transport := c_rtpAvp,
fmts := { "8" }
}
template SDP_media_field mw_media_PCMA_U_DPT :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { * }
}
template SDP_media_field mw_media_T38 :=
{
media := c_image,
ports := { port_number := ?, num_of_ports:=* },
transport := pattern "*ptl", //* udptl,tcptl
fmts := { "t38" }
}
 
template SDP_media_field mw_media_G722 :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := "RTP/AVP",
fmts := { "9" }
}
 
template SDP_media_field mw_media_AMR_DPT :=
{
media := c_audio,
ports := { port_number := ?, num_of_ports:=* },
transport := c_rtpAvp,
fmts := { * }
}
template SDP_media_field mw_media_MSRP :=
{
media := c_msrp,
ports := { port_number := ?, num_of_ports:=omit },
transport := c_msrpTcp,
fmts := { * }
}
 
template SDP_attribute m_attribute_sendonly := {sendonly:={}};
template SDP_attribute mw_attribute_sendonly := {sendonly:={}};//MRO
template SDP_attribute m_attribute_recvonly := {recvonly:={}};
template SDP_attribute mw_attribute_recvonly := {recvonly:={}};//MRO
template SDP_attribute m_attribute_sendrecv := {sendrecv:={}};
template SDP_attribute mw_attribute_sendrecv := {sendrecv:={}};//MRO
template SDP_attribute m_attribute_inactive := {inactive:={}};
template SDP_attribute mw_attribute_inactive := {inactive:={}};//MRO
template SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly,mw_attribute_inactive);
template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv,mw_attribute_recvonly,omit);
template SDP_attribute m_attribute_AMR_DPT := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " AMR" }};
template SDP_attribute m_attribute_CLEARMODE_DPT := {rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " CLEARMODE/8000" }};
template SDP_attribute m_attribute_G722 := { rtpmap := { attr_value := "9 G722/8000" }};
template SDP_attribute m_attribute_PCMU := { rtpmap := { attr_value := "0 PCMU/8000" }};
template SDP_attribute m_attribute_PCMU_DPT := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " PCMU/8000" }};
template SDP_attribute m_attribute_PCMA := { rtpmap := { attr_value := "8 PCMA/8000" }};
template SDP_attribute m_attribute_PCMA_DPT := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " PCMA/8000" }};
template SDP_attribute m_attribute_T38 := { unknown := { name:=?, attr_value := pattern "*t38*" }};
template SDP_attribute m_attribute_curr (charstring p_preconditionType, charstring p_statusType, charstring p_direction):=
{
curr:={preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction}
};
template SDP_attribute mw_attribute_curr :=
{
curr := ?
};
template SDP_attribute m_attribute_des (charstring p_preconditionType, charstring p_strength, charstring p_statusType, charstring p_direction):=
{
des:={preconditionType := p_preconditionType,
strength := p_strength,
statusType := p_statusType,
direction := p_direction}
};
template SDP_attribute mw_attribute_des :=
{
des := ?
};
template SDP_attribute m_attribute_conf (charstring p_preconditionType, charstring p_statusType, charstring p_direction):=
{
conf:={preconditionType := p_preconditionType,
statusType := p_statusType,
direction := p_direction}
};
} //* end group SDP_Fields
 
} //* end group SDP_Templates
 
group SimpleMsgSummary_Templates {
template SimpleMsgSummary m_SMS(template Msg_summary_line_list p_summaryLineList, template charstring p_uri) :=
{
msg_status_line := m_msgStatusLine_yes,
msg_account := m_msgAccount(p_uri),
msg_summary_line_list :=p_summaryLineList,
opt_msg_headers := omit
}
template SimpleMsgSummary mw_SMS :=
{
msg_status_line := ?,
msg_account := *,
msg_summary_line_list := *,
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yes :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := *,
msg_summary_line_list := *,
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yesUri :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := mw_msgAccount,
msg_summary_line_list := *,
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yesVoice :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := *,
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)},
opt_msg_headers := *
}
template SimpleMsgSummary mw_SMS_yesUriVoice :=
{
msg_status_line := mw_msgStatusLine_yes,
msg_account := mw_msgAccount,
msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)},
opt_msg_headers := *
}
template Msg_status_line m_msgStatusLine_yes:=
{
msg_type := c_messageWaiting,
msg_status := "yes"
}
template Msg_status_line mw_msgStatusLine_yes:=
{
msg_type := c_messageWaiting,
msg_status := "yes"
}
 
template Msg_account m_msgAccount(template charstring p_uri) :=
{
msg_type_account := c_messageAccount,
account_URI := p_uri//m_SipUrl_NumberHostParam(PX_IMS_SUT_UE2_PUBLIC_USER,PX_IMS_SUT_UE2_HOME_DOMAIN,omit)
}
 
template Msg_account mw_msgAccount :=
{
msg_type_account := c_messageAccount,
account_URI := ?
}
template Msg_summary_line m_msgSummaryLine(template charstring p_msgContexClass,template charstring p_msgs,template charstring p_urgent_msgs) :=
{
msg_context_class := p_msgContexClass,
msgs := p_msgs,
urgent_msgs := p_urgent_msgs
}
template Msg_summary_line mw_msgSummaryLine(template charstring p_msgContexClass) :=
{
msg_context_class := p_msgContexClass,
msgs := ?,
urgent_msgs :=*
}
} //end group Templates_SMS
 
group MessageBodies {
template MessageBody m_MBody_SDP(template SDP_Message p_SDP):=
{
sdpMessageBody := p_SDP
};
template MessageBody m_MBody_XML(template XmlBody p_xmlBody):=
{
xmlBody := p_xmlBody
};
template MessageBody m_mBody_SMS(template SimpleMsgSummary p_SMS):=
{
simpleMsgSummary := p_SMS
};
template MessageBody m_MBody_longPlainText:=
{
textplain := c_longMessageContent_1300Bytes
};
 
template MessageBody m_mBody_plainText(charstring p_plaitext):=
{
textplain := p_plaitext
};
template MessageBody m_MBody_sipfrag(charstring p_sipfrag) := {
sipfrag := p_sipfrag
}
template MessageBody m_MBody_MIMESdpXml(template SDP_Message p_sdp, template XmlBody p_xmlBody):=
{
mimeMessageBody := {boundary:="--boundary1", //"PX_SIP_MIME_Boundary",
mimeEncapsulatedList:= {
{content_type:="application/sdp",//"PX_SIP_SDP_ContentType",
content_disposition:=omit,
mime_encapsulated_part:={sdpMessageBody := p_sdp}},
{content_type:="application/vnd.3gpp.cw+xml",//"PX_SIP_ISUP_ContentType",
content_disposition:=omit,
mime_encapsulated_part:={xmlBody := p_xmlBody}}
}
}
}
template MessageBody mw_MBody_SDP(template SDP_Message p_SDP):=
{
sdpMessageBody := p_SDP
};
template MessageBody mw_MBody_XML(template XmlBody p_xmlBody):=
{
xmlBody := p_xmlBody
};
template MessageBody mw_mBody_SMS(template SimpleMsgSummary p_SMS):=
{
simpleMsgSummary := p_SMS
};
template MessageBody mw_MBody_MIMESdpXml(template SDP_Message p_sdp, template XmlBody p_xmlBody):=
{
mimeMessageBody := {boundary:=?,
mimeEncapsulatedList:= {
{content_type:=?,
content_disposition:=*,
mime_encapsulated_part:={sdpMessageBody := p_sdp}},
{content_type:=?,
content_disposition:=*,
mime_encapsulated_part:={xmlBody := p_xmlBody}}
}
}
}
template MessageBody mw_MBody_MIME_Ims3gpp(
template charstring p_disposition,
template Ims_3gpp p_ims3gpp
):= {
mimeMessageBody := {boundary:=?,
mimeEncapsulatedList:= {
*,
{
content_type:= c_ims3gppAplication,
content_disposition:= p_disposition,
mime_encapsulated_part :={
xmlBody := {
ims3gpp := p_ims3gpp
}
}
},
*
}
}
}
template MessageBody mw_MBody_MIME_Ims3gppCW(
template charstring p_disposition,
template Ims_3gpp p_ims3gpp
):= {
mimeMessageBody := {boundary:=?,
mimeEncapsulatedList:= {
*,
{
content_type:= c_ims3gppCwApplication,
content_disposition:= p_disposition,
mime_encapsulated_part :={
xmlBody := {
ims3gpp := p_ims3gpp
}
}
},
*
}
}
}
}
/*
*
* @desc group TemplatePreparationFunctions contain functions which are used for templates
*/
group TemplatePreparationFunctions {
 
group MessageBody_Calculation{
/**
*
* @desc Calculation of Message Body length
* @param p_mb_par contain message body part
* @return message body length
*/
function f_MessageBodyLength(MessageBody p_mb_par) return integer {
 
var integer v_result:=0;
if (MB_LENGTH_FROM_ENCVAL){ //by default it is set to true
v_result:= lengthof(encvalue(p_mb_par))/8; // length in bypes, let get length of encoded value
}
else{
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb_par.sdpMessageBody))
{
v_result := f_SDPlength(p_mb_par.sdpMessageBody);
};
// assume XML_Body ONLY in the message body
if (ischosen(p_mb_par.xmlBody))
{
v_result := f_XMLBody_Length(p_mb_par.xmlBody, USE_FX_FOR_XML_LENGTH );
};
// assume simpleMsgSummary_Body ONLY in the message body
if (ischosen(p_mb_par.simpleMsgSummary))
{
v_result := f_simpleMsgSummaryBody_Length(p_mb_par.simpleMsgSummary );
};
// assume MIME_Message in the message body
if (ischosen(p_mb_par.mimeMessageBody))
{
v_result := f_MIMElength(p_mb_par.mimeMessageBody);
};
//assume sipfrag in the message body
if (ischosen(p_mb_par.sipfrag))
{
v_result := f_TextPlainLength(p_mb_par); //same function due to same type with textplain
};
//assume textplain in the message body
if (ischosen(p_mb_par.textplain))
{
v_result := f_TextPlainLength(p_mb_par);
};
}
 
return v_result
}
group SDP_Len_calculation {
/**
*
* @desc Calculation of SDP length
* @param p_mb contain sdp message
* @return sdp_lenght
*/
function f_SDPlength(SDP_Message p_mb) return integer
{
var integer v_result:=2; //* due to empty line beginning of message body
var charstring v_auxstring;
v_result := 2 + c_CRlen + lengthof(int2str(p_mb.protocol_version)); //* "v="
v_auxstring := p_mb.origin.user_name & " " & p_mb.origin.session_id & " " & p_mb.origin.session_version & " " & p_mb.origin.net_type & " " & p_mb.origin.addr_type & " " & p_mb.origin.addr;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "o="
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.session_name); //* "s="
if (ispresent(p_mb.information))
{v_auxstring:=p_mb.information; v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);}; //* "i= "
if (ispresent(p_mb.uri))
{v_auxstring:=p_mb.uri; v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);}; //* "u="
if (ispresent(p_mb.emails)) {
for (var integer i:=0; i<sizeof(p_mb.emails); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //* "e="
if (ispresent(p_mb.emails[i].disp_name))
{v_auxstring:=p_mb.emails[i].disp_name; v_result := v_result + 1 + lengthof(v_auxstring);};
};
};
if (ispresent(p_mb.phone_numbers)) {
for (var integer i:=0; i<sizeof(p_mb.phone_numbers); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //* "p= "
if (ispresent(p_mb.phone_numbers[i].disp_name))
{v_auxstring:=p_mb.phone_numbers[i].disp_name; v_result := v_result + 1 + lengthof(v_auxstring);};
};
};
if (ispresent(p_mb.connection))
{
var integer v_len_con0 := f_SDPlength_connection(p_mb.connection);
v_result := v_result + v_len_con0;
}; //* "c="
if (ispresent(p_mb.bandwidth))
{
for (var integer i:=0; i<sizeof(p_mb.bandwidth); i:=i+1) { //* "b= "
v_auxstring:= p_mb.bandwidth[i].modifier & " ";
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring) +
lengthof(int2str(p_mb.bandwidth[i].bandwidth));
};
};
for (var integer i:=0; i<sizeof(p_mb.times); i:=i+1) {
v_auxstring:= p_mb.times[i].time_field.start_time & " " & p_mb.times[i].time_field.stop_time;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);//* "t="
if (ispresent(p_mb.times[i].time_repeat))
{
for (var integer j:=0; j<sizeof(p_mb.times[i].time_repeat); j:=j+1)
{
v_result := v_result + 2 + c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //* "r="
if (ispresent(p_mb.times[i].time_repeat[j].repeat_interval.unit))
{
v_auxstring:=p_mb.times[i].time_repeat[j].repeat_interval.unit;
v_result := v_result + 1 + lengthof(v_auxstring);
};
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time));
if (ispresent(p_mb.times[i].time_repeat[j].active.unit))
{
v_auxstring:=p_mb.times[i].time_repeat[j].active.unit;
v_result := v_result + 1 + lengthof(v_auxstring);
};
for (var integer k:=0; k<sizeof(p_mb.times[i].time_repeat[j].offsets); k:=k+1)
{
v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time));
if (ispresent(p_mb.times[i].time_repeat[j].offsets[k].unit))
{
v_auxstring:=p_mb.times[i].time_repeat[j].offsets[k].unit;
v_result := v_result + 1 + lengthof(v_auxstring);
};
}
}
};
};
 
if (ispresent(p_mb.timezone_adjustments))
{log("timezone adjustments have not been considered in SDP length calculation yet");
}; //* "z="
if (ispresent(p_mb.key)) {
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.key.method); //* "k= "
if (ispresent(p_mb.key.key))
{v_auxstring:=p_mb.key.key; v_result := v_result + 1 + lengthof(v_auxstring);};
};
if (ispresent(p_mb.attributes)) {
for (var integer i:=0; i<sizeof(p_mb.attributes); i:=i+1){ //* "a= "
var integer v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]);
v_result := v_result + v_len_con1;
};
}; //* "a="
 
if (ispresent(p_mb.media_list))
{
for (var integer i:=0; i<sizeof(p_mb.media_list); i:=i+1){ //* "m= "
//* for each media_field
//* log("p_mb.media_list[i] ",p_mb.media_list[i]);
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].media_field.media)
+ 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number));
 
 
if (ispresent(p_mb.media_list[i].media_field.ports.num_of_ports))
{v_result := v_result + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.num_of_ports));};
v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport);
for (var integer j:=0; j<sizeof(p_mb.media_list[i].media_field.fmts); j:=j+1){
v_result := v_result + 1 + lengthof(valueof(p_mb.media_list[i].media_field.fmts[j]));
}
if (ispresent(p_mb.media_list[i].information)) {
v_auxstring:=p_mb.media_list[i].information;
v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "i= "
};
if (ispresent(p_mb.media_list[i].connections)) {
for (var integer j:=0; j<sizeof(p_mb.media_list[i].connections); j:=j+1){
var integer v_len_con2 := f_SDPlength_connection(p_mb.media_list[i].connections[j]);
v_result := v_result + v_len_con2;
}; //* end for
};
if (ispresent(p_mb.media_list[i].bandwidth)) { //* "b= "
for (var integer j:=0; j<sizeof(p_mb.media_list[i].bandwidth); j:=j+1){
v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].bandwidth[j].modifier)
+ 1 + lengthof(int2str(p_mb.media_list[i].bandwidth[j].bandwidth));
}; //* end for
};
if (ispresent(p_mb.media_list[i].key)) { //* "k= "
v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method);
if (ispresent(p_mb.media_list[i].key.key)) {
v_auxstring := p_mb.media_list[i].key.key;
v_result := v_result + 1 + lengthof(v_auxstring);
};
};
if (ispresent(p_mb.media_list[i].attributes)) {
for (var integer j:=0; j<sizeof(p_mb.media_list[i].attributes); j:=j+1){ //* "a= "
var integer v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]);
v_result := v_result + v_len_attr;
} //* end for j
};
}; //* end for i
}; //* end if media_list
 
return v_result;
};//* end function f_SDPlength
 
function f_SDPlength_connection(SDP_connection p_element) return integer //* "c="
{
var integer v_result:=0;
var charstring v_auxstring;
v_result := v_result + 2 + c_CRlen + lengthof(p_element.net_type & " " &
p_element.addr_type & " " &
p_element.conn_addr.addr);
if (ispresent(p_element.conn_addr.ttl) and p_element.conn_addr.ttl>0)
{v_result := v_result + 1 + lengthof(int2str(p_element.conn_addr.ttl));};
if (ispresent(p_element.conn_addr.num_of_addr) and p_element.conn_addr.num_of_addr>0)
{v_result := v_result + 1 + lengthof(int2str(p_element.conn_addr.num_of_addr));};
return v_result
} //* f_SDPlength_connection
 
function f_SDPlength_attribute(SDP_attribute p_element) return integer //* "a="
{
var integer v_result:=0;
var charstring v_auxstring;
if (ischosen(p_element.cat)) {v_result := v_result + 2 + c_CRlen + lengthof("cat:" & p_element.cat.attr_value)};
if (ischosen(p_element.keywds)) {v_result := v_result + 2 + c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value)};
if (ischosen(p_element.tool)) {v_result := v_result + 2 + c_CRlen + lengthof("tool:" & p_element.tool.attr_value)};
if (ischosen(p_element.ptime)) {v_result := v_result + 2 + c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value)};
if (ischosen(p_element.recvonly)) {v_result := v_result +c_CRlen + lengthof("recvonly")};
if (ischosen(p_element.sendrecv)) {v_result := v_result +c_CRlen + lengthof("sendrecv")};
if (ischosen(p_element.sendonly)) {v_result := v_result +c_CRlen + lengthof("sendonly")};
if (ischosen(p_element.inactive)) {v_result := v_result +c_CRlen + lengthof("inactive")};
if (ischosen(p_element.orient)) {v_result := v_result + 2 + c_CRlen + lengthof("orient:" & p_element.orient.attr_value)};
if (ischosen(p_element.sdp_type)) {v_result := v_result + 2 + c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value)};
if (ischosen(p_element.charset)) {v_result := v_result + 2 + c_CRlen + lengthof("charset" & p_element.charset.attr_value)};
if (ischosen(p_element.sdplang)) {v_result := v_result + 2 + c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value)};
if (ischosen(p_element.lang)) {v_result := v_result + 2 + c_CRlen + lengthof("lang:" & p_element.lang.attr_value)};
if (ischosen(p_element.framerate)) {v_result := v_result + 2 + c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value)};
if (ischosen(p_element.quality)) {v_result := v_result + 2 + c_CRlen + lengthof("quality:" & p_element.quality.attr_value)};
if (ischosen(p_element.fmtp)) {v_result := v_result + 2 + c_CRlen + lengthof("fmtp:" & p_element.fmtp.attr_value)};
if (ischosen(p_element.curr)) {v_result := v_result + 2 + c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " "
& p_element.curr.statusType & " " & p_element.curr.direction)};
if (ischosen(p_element.des)) {v_result := v_result + 2 + c_CRlen + lengthof("des:" & p_element.des.preconditionType & " "
& p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction)};
if (ischosen(p_element.conf)) {v_result := v_result + 2 + c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " "
& p_element.des.statusType & " " & p_element.des.direction)};
if (ischosen(p_element.rtpmap)) {v_result := v_result + 2 + c_CRlen + lengthof("rtpmap:" & p_element.rtpmap.attr_value)};
if (ischosen(p_element.rtcp)) {v_result := v_result + 2 + c_CRlen + lengthof("rtcp:" & p_element.rtcp.attr_value)};
if (ischosen(p_element.unknown))
{v_result := v_result + 2 + c_CRlen + lengthof(p_element.unknown.name);
if (ispresent(p_element.unknown.attr_value))
{var charstring aux := p_element.unknown.attr_value;
v_result := v_result + lengthof(":" & p_element.unknown.attr_value);
};
};
//* log("axr: length attribute=", v_result);
return v_result
} //* f_SDPlength_attribute
} //* group SDPlen_calculation
 
group XML_Len_calculation{
/**
* @desc Declaration of external functions to calculate length of message bodies
* switching of internal or external functions are made by boolean module parameter/PIXIT
* USE_FX_FOR_XML_LENGTH declared at top of this module
*/
 
external function fx_calculateXMLBodyLen(XmlBody p_mb) return integer;
/**
*
* @desc Calculation of XML body length
* @param p_mb contain XML body
* @return xml_length
*/
function f_XMLBody_Length(XmlBody p_mb, boolean p_ext_func) return integer
{
var integer v_result:=0;
if ( p_ext_func){
v_result := fx_calculateXMLBodyLen(p_mb);
}else{
// assume ConferenceInfo ONLY in the XML message body
if (ischosen(p_mb.conference))
{
v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conference);
};
// assume CUG ONLY in the XML message body
if (ischosen(p_mb.cug))
{
v_result := f_XMLBody_Cug_Length(p_mb.cug);
};
// assume MCID ONLY in the XML message body
if (ischosen(p_mb.mcid))
{
v_result := f_XMLBody_Mcid_Length(p_mb.mcid);
};
// assume CW ONLY in the XML message body
if (ischosen(p_mb.cw))
{
v_result := f_XMLBody_Cw_Length(p_mb.cw);
};
// assume CDIV ONLY in the XML message body
if (ischosen(p_mb.cdivn))
{
v_result := f_XMLBody_Cdivn_Length(p_mb.cdivn);
};
// assume PSTNTransit ONLY in the XML message body
if (ischosen(p_mb.pstnTransit))
{
v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit);
};
// assume Simservs ONLY in the XML message body
if (ischosen(p_mb.simservs))
{
v_result := f_XMLBody_Simservs_Length(p_mb.simservs);
};
// assume ResourceLists ONLY in the XML message body
if (ischosen(p_mb.resourceLists))
{
v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists);
};
// assume Ims3GPP ONLY in the XML message body
if (ischosen(p_mb.ims3gpp))
{
v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp);
};
/** Add aditional checks regarding to new variants,
* also implement appropriate function for calculation
*/
}
return v_result
} //* f_XMLBodyLength
group XMLBodies_calculation{
/**
*
* @desc Calculation of XML ConferenceInfo element length
* @param p_mb contain XML ConfInfo body
* @return xml_length
*/
function f_XMLBody_ConferenceInfo_Length(Conference_type p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_ConferenceInfo_Length
/**
*
* @desc Calculation of XML CUG element length
* @param p_mb contain XML CUG body
* @return xml_length
*/
function f_XMLBody_Cug_Length(Cug p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Cug_Length
/**
*
* @desc Calculation of XML MCID element length
* @param p_mb contain XML MCID body
* @return xml_length
*/
function f_XMLBody_Mcid_Length(Mcid p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Mcid_Length
/**
*
* @desc Calculation of XML CW element length
* @param p_mb contain XML CW body
* @return xml_length
*/
function f_XMLBody_Cw_Length(Ims_cw p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Cw_Length
/**
*
* @desc Calculation of XML CDIVN element length
* @param p_mb contain XML CDIVN body
* @return xml_length
*/
function f_XMLBody_Cdivn_Length(Comm_div_info_type p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Cdivn_Length
/**
*
* @desc Calculation of XML PSTNTransit element length
* @param p_mb contain XML PSTNTransit body
* @return xml_length
*/
function f_XMLBody_PSTNTransit_Length(PSTN_transit p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_PSTNTransit_Length
/** @desc Calculation of XML Simservs element length
* @param p_mb contain XML Simservs body
* @return xml_length
*/
function f_XMLBody_Simservs_Length(Simservs p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Simservs_Length
/** @desc Calculation of XML ResourceList length
* @param p_mb contain XML ResourceList body
* @return xml_length
*/
function f_XMLBody_ResourceList_Length(Resource_lists p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_ResourceList_Length
/** @desc Calculation of XML Ims3GPP length
* @param p_mb contain XML Ims3GPP body
* @return xml_length
*/
function f_XMLBody_Ims3GPP_Length(TIMS3GPP p_mb) return integer
{
var integer v_result:= lengthof(encvalue(p_mb))/8;
return v_result
} //* f_XMLBody_Ims3GPP_Length
} //* XMLBodies_calculation
}//* group XMLlen_calculation
group simpleMsgSummaryBody_Length{
function f_simpleMsgSummaryBody_Length(SimpleMsgSummary p_mb) return integer
{
var integer v_result:=2; //* due to empty line beginning of message body
var charstring v_auxstring;
v_result := 2+lengthof(p_mb.msg_status_line.msg_type) + 2 + lengthof(p_mb.msg_status_line.msg_status)+c_CRlen; //* "Message-Waiting: yes"
 
if (ispresent(p_mb.msg_account)) //* "Message-Account"
{v_result := v_result + 2 + lengthof(p_mb.msg_account.msg_type_account)+2+lengthof(p_mb.msg_account.account_URI)+c_CRlen;};
if (ispresent(p_mb.msg_summary_line_list)) {
for (var integer i:=0; i<sizeof(p_mb.msg_summary_line_list); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.msg_summary_line_list[i].msg_context_class)+2+lengthof(p_mb.msg_summary_line_list[i].msgs);
if (ispresent(p_mb.msg_summary_line_list[i].urgent_msgs))
{v_auxstring:=p_mb.msg_summary_line_list[i].urgent_msgs; v_result := v_result + 1 + lengthof(v_auxstring);};
};
};
if (ispresent(p_mb.opt_msg_headers)) {
for (var integer i:=0; i<sizeof(p_mb.opt_msg_headers); i:=i+1)
{v_result := v_result + 2 + c_CRlen + lengthof(p_mb.opt_msg_headers[i]);
};
};
return v_result
}
}
 
group MIME_Len_calculation{
/**
*
* @desc Calculation of MIME length
* @param p_mb contain MIME message
* @return xml_length
*/
function f_MIMElength(MIME_Message p_mb) return integer
{
var integer v_result:=2; //0d0a
v_result := v_result + lengthof(p_mb.boundary) + 2/*0d0a*/;
for (var integer i:=0; i<sizeof(p_mb.mimeEncapsulatedList); i:=i+1){
v_result := v_result + lengthof("Content-Type: ")+ lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2/*0d0a*/ ;
if (ispresent(p_mb.mimeEncapsulatedList[i].content_disposition)){
v_result := v_result + lengthof("Content-Disposition: ")+ lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2/*0d0a*/ ;
}
//v_result := v_result +2/*0d0a*/; ??? to check
// assume SDP_Message ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody))
{
v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody);
};
// assume XML_Body ONLY in the message body
if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody))
{
v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, USE_FX_FOR_XML_LENGTH );
};
// //assume XML_Message ONLY in the message body
// if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlMessage))
// {
// v_result := v_result + f_XMLlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlMessage, USE_FX_FOR_XML_LENGTH );
// };
//v_result := v_result +2/*0d0a*/; ??? to check
}
//v_result := v_result +2/*0d0a*/; ??? to check
return v_result
} //* f_MIMElength
}//* group MIMElen_calculation
group TextPlain_Len_calculation{
/**
*
* @desc Calculation of messagebody-textplain type length
* @param p_mb contain textplain message
* @return lenght
*/
function f_TextPlainLength(MessageBody p_mb) return integer
{
var integer v_result:=0;
 
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 RecordRoute
{
template RecordRoute v_recordRoute := omit;
if (vc_boo_recordRoute)
{return vc_recordRoute}
else {return(v_recordRoute)} //* TODO: RecordRoute is not OPTIONAL!!! Check IT!
}
/**
*
* @desc Return component variable of Route header if vc_boo_route is true
* @return component variable of recordRoute header
*/
function f_route() runs on SipComponent return template Route
{
template Route v_route := omit;
if (vc_boo_route)
{return vc_route} //* TODO: Route header need to be in reverse order than RecordRoute, question of return value - RecordRoute
else {return(v_route)} //* TODO: Route is not OPTIONAL!!! Check IT!
}
} //* end group GiveHeaders
group others {
 
/*
*
* @desc function combines two comma parameter lists
* @param p_list1 first list
* @param p_list2 second list
* @return comma parameter list that contains parameters from both input lists
* @verdict
*/
 
function f_merge_CommaParam_List(CommaParam_List p_list1, CommaParam_List p_list2) return template CommaParam_List
{ var template CommaParam_List p_result;
var integer limit1 := sizeof(p_list1);
for (var integer i:=0; i<limit1; i:=i+1) {
p_result[i] := p_list1[i]
};
for (var integer i:=0; i<sizeof(p_list2); i:=i+1) {
p_result[i+limit1] := p_list2[i]
};
return p_result
}
} //* end group others
 
} //* group TemplatePreparationFunctions
} //* end module LibSip_Templates
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/ttcn/LibSip_SIPTypesAndValues.ttcn
===================================================================
--- v1.7.0/ttcn/LibSip_SIPTypesAndValues.ttcn (nonexistent)
+++ v1.7.0/ttcn/LibSip_SIPTypesAndValues.ttcn (revision 524)
@@ -0,0 +1,1870 @@
+/**
+ * @author STF 346, STF366, STF368, STF369
+ * @version $Id$
+ * @desc This module defines message, header, structured and simple SIP
+ * types as well constants used by LipSip constructs. <br>
+ * Note that any changes made to the definitions in this module
+ * may be overwritten by future releases of this library
+ * End users are encouraged to contact the distributers of this
+ * module regarding their modifications or additions
+ * @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_SDPTypes all;
+ import from LibSip_XMLTypes all;
+ import from LibSip_SimpleMsgSummaryTypes all;
+
+group Constants
+{
+group SimpleConstants
+ {
+ // SIP name protocol plus version
+ const charstring c_sipNameVersion := "SIP/2.0";
+
+ // SIP name protocol
+ const charstring c_sipName := "SIP";
+
+ // SIP version
+ const charstring c_sipVersion := "2.0";
+
+ // SIP scheme
+ const charstring c_sipScheme := "sip";
+
+ // TEL scheme
+ const charstring c_telScheme := "tel";
+
+ // TAG_ID
+ const charstring c_tagId := "tag";
+
+ // BRANCH_ID
+ const charstring c_branchId := "branch";
+
+ // BRANCH_COOKIE
+ const charstring c_branchCookie := "z9hG4bK";
+
+ // EXPIRES_ID
+ const charstring c_expiresId := "expires";
+
+ // MADDR_ID
+ const charstring c_maddrId := "maddr";
+
+ // METHOD_ID
+ const charstring c_methodId := "method";
+
+ // RECEIVED_ID
+ const charstring c_receivedId := "received";
+
+ // TTL_ID
+ const charstring c_ttlId := "ttl";
+
+ // USER_ID
+ const charstring c_userId := "user";
+
+ // SDP name application
+ const charstring c_sdpAplication := "application/sdp";
+
+ // XML name application
+ const charstring c_xmlAplication := "application/xml";
+
+ // XML name application
+ const charstring c_xmlreginfoAplication := "application/reginfo+xml";
+
+ // MIME name application
+ const charstring c_mimeMultipart := "multipart/mixed";
+
+ // IMS 3GPP name application
+ const charstring c_ims3gppAplication := "application/3gpp-ims+xml";
+
+ // IMS 3GPP name CW application
+ const charstring c_ims3gppCwApplication := "application/vnd.3gpp.cw+xml";
+
+ // IMS ETSI name MCID application
+ const charstring c_imsEtsiMcidApplication := "application/vnd.etsi.mcid+xml";
+
+ // IMS ETSI name CUG application
+ const charstring c_imsEtsiCugApplication := "application/vnd.etsi.cug+xml";
+
+ // IMS ETSI name Simservs application(TIP/TIR, ACR, CDIV, OIP/OIR, CUG)
+ const charstring c_imsEtsiSimservsApplication := "application/vnd.etsi.simservs+xml";
+
+ // OCTET-STREAM name application
+ const charstring c_octetAplication := "application/octet-stream";
+
+ // PLAIN-TEXT name application
+ const charstring c_plainText := "text/plain";
+
+ //text content of 1300 bytes for messages with message body
+ const charstring c_longMessageContent_1300Bytes :=//"Hello!";
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+ 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";
+
+ // @ (at) sign
+ const charstring c_AT := "@";
+ //MRO
+ const charstring c_SP := oct2char('20'O);
+ const charstring c_SLASH := oct2char('2F'O);
+ const charstring c_LT := oct2char('3C'O);
+ const charstring c_GT := oct2char('3E'O);
+
+ // * (wildchard) sign
+ const charstring c_WILDCARD := "*";
+
+ const integer c_CRlen := 2; // length of new line (0d0a)
+
+ const GenericParam c_Integrity_protected_yes := {"integrity-protected","yes"}
+ const GenericParam c_Integrity_protected_no := {"integrity-protected","no"}
+ const GenericParam c_Integrity_protected_ip_assoc_pending := {"integrity-protected","ip-assoc-pending"}
+
+
+} //end group SimpleConstants
+
+group AuthorizationConstants {
+
+ const charstring c_ik := "";
+ const charstring c_ck := "";
+ const charstring c_algorithm := "MD5";
+ const charstring c_nonce := "";
+ const charstring c_nonce_value := "0edff6c521cc3f407f2d9e01cf6ed82b";
+
+} //end group AuthorizationConstants
+
+group PChargingVectorConstants {
+
+ const charstring c_icid := "icid-value";
+ const charstring c_icid_value := "123abc";
+ const charstring c_icid_generated_at := "icid-generated-at";
+ const charstring c_orig_ioi := "orig-ioi";
+ const charstring c_term_ioi := "term-ioi";
+
+} //end group PChargingVectorConstants
+
+group HeaderFieldConstants {
+
+ const CallId c_empty_CallId :=
+ {
+ fieldName := CALL_ID_E,
+ callid := ""
+ };
+
+ const ContentType c_empty_ContentType :=
+ {
+ fieldName := CONTENT_TYPE_E,
+ mediaType := ""
+ };
+
+ const CSeq c_empty_cSeq := {
+ fieldName := CSEQ_E,
+ seqNumber:=0,
+ method:="EMPTY" };
+
+ const From c_empty_From := {
+ fieldName := FROM_E,
+ addressField := {nameAddr :=
+ {displayName := omit,
+ addrSpec := {
+ scheme := c_sipScheme,
+ userInfo := omit ,
+ hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort},
+ urlParameters := omit,
+ headers := omit
+ }
+ }
+ },
+ fromParams := omit
+ };
+
+ const MaxForwards c_maxForwards70 := {fieldName:=MAX_FORWARDS_E, forwards:=70}
+
+ const SipUrl c_empty_RequestUri :=
+ {
+ scheme := c_sipScheme,
+ userInfo := omit ,
+ hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort},
+ urlParameters := omit,
+ headers := omit
+ };
+
+ const SipUrl c_unavailableUri :=
+ {
+ scheme := c_sipScheme,
+ userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
+ hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort},
+ urlParameters := omit,
+ headers := omit
+ };
+
+ const To c_empty_To :=
+ { // value of To header
+ fieldName := TO_E,
+ addressField :=
+ {
+ nameAddr :=
+ {
+ displayName := omit,
+ addrSpec :=
+ {
+ scheme := c_sipScheme,
+ userInfo := omit ,
+ hostPort := {host:="127.0.0.1", portField:=c_defaultSipPort},
+ urlParameters := omit,
+ headers := omit
+ }
+ }
+ },
+ toParams := omit
+ };
+
+ const Via c_empty_Via := {
+ fieldName := VIA_E,
+ viaBody :={
+ {sentProtocol := {
+ protocolName := c_sipName,
+ protocolVersion := c_sipVersion,
+ transport := c_defaultSipProt
+ },
+ sentBy := {host:="127.0.0.1", portField:=c_defaultSipPort},
+ viaParams:= omit
+ }
+ }};
+
+
+}
+
+
+group UserProfileConstants
+{
+ // number of user profile from 1-10 for SIP profile
+ const integer c_userProfile_SIP1_home := 1;
+ const integer c_userProfile_SIP2_home := 2;
+
+} //end group UserProfileConstants
+
+group StatusLines
+ {
+ const StatusLine c_statusLine100 := {c_sipNameVersion, 100, "Trying"};
+ const StatusLine c_statusLine180 := {c_sipNameVersion, 180, "Ringing"};
+ const StatusLine c_statusLine181 := {c_sipNameVersion, 181, "Call Is Being Forwarded"};
+ const StatusLine c_statusLine182 := {c_sipNameVersion, 182, "Queued"};
+ const StatusLine c_statusLine183 := {c_sipNameVersion, 183, "Session Progress"};
+
+ const StatusLine c_statusLine200 := {c_sipNameVersion, 200, "OK"};
+ const StatusLine c_statusLine202 := {c_sipNameVersion, 202, "Accepted"};
+
+ const StatusLine c_statusLine300 := {c_sipNameVersion, 300, "Multiple Choices"};
+ const StatusLine c_statusLine301 := {c_sipNameVersion, 301, "Moved Permanently"};
+ const StatusLine c_statusLine302 := {c_sipNameVersion, 302, "Moved Temporarily"};
+ const StatusLine c_statusLine305 := {c_sipNameVersion, 305, "Use Proxy"};
+ const StatusLine c_statusLine380 := {c_sipNameVersion, 380, "Alternative Service"};
+
+ const StatusLine c_statusLine400 := {c_sipNameVersion, 400, "Bad Request"};
+ const StatusLine c_statusLine401 := {c_sipNameVersion, 401, "Unauthorized"};
+ const StatusLine c_statusLine402 := {c_sipNameVersion, 402, "Payment Required"};
+ const StatusLine c_statusLine403 := {c_sipNameVersion, 403, "Forbidden"};
+ const StatusLine c_statusLine404 := {c_sipNameVersion, 404, "Not Found"};
+ const StatusLine c_statusLine405 := {c_sipNameVersion, 405, "Method Not Allowed"};
+ const StatusLine c_statusLine406 := {c_sipNameVersion, 406, "Not Acceptable"};
+ const StatusLine c_statusLine407 := {c_sipNameVersion, 407, "Proxy authentication required"};
+ const StatusLine c_statusLine408 := {c_sipNameVersion, 408, "Request Timeout"};
+ const StatusLine c_statusLine410 := {c_sipNameVersion, 410, "Gone"};
+ const StatusLine c_statusLine413 := {c_sipNameVersion, 413, "Request Entity too long"};
+ const StatusLine c_statusLine414 := {c_sipNameVersion, 414, "Request-uri too long"};
+ const StatusLine c_statusLine415 := {c_sipNameVersion, 415, "Unsupported Media type"};
+ const StatusLine c_statusLine416 := {c_sipNameVersion, 416, "Unsupported URI scheme"};
+ const StatusLine c_statusLine420 := {c_sipNameVersion, 420, "Bad Extension"};
+ const StatusLine c_statusLine421 := {c_sipNameVersion, 421, "Extension required"};
+ const StatusLine c_statusLine422 := {c_sipNameVersion, 422, "Session Interval Too Small"};
+ const StatusLine c_statusLine423 := {c_sipNameVersion, 423, "Interval Too Brief"};
+ const StatusLine c_statusLine433 := {c_sipNameVersion, 433, "Anonymity Disallowed"};
+ const StatusLine c_statusLine480 := {c_sipNameVersion, 480, "Temporarily Unavailable"};
+ const StatusLine c_statusLine481 := {c_sipNameVersion, 481, "Call/Transaction doesnot exist"};
+ const StatusLine c_statusLine482 := {c_sipNameVersion, 482, "Loop Detected"};
+ const StatusLine c_statusLine483 := {c_sipNameVersion, 483, "Too many hops"};
+ const StatusLine c_statusLine484 := {c_sipNameVersion, 484, "Address Incomplete"};
+ const StatusLine c_statusLine485 := {c_sipNameVersion, 485, "Ambiguous"};
+ const StatusLine c_statusLine486 := {c_sipNameVersion, 486, "Busy Here"};
+ const StatusLine c_statusLine487 := {c_sipNameVersion, 487, "Request Terminated"};
+ const StatusLine c_statusLine488 := {c_sipNameVersion, 488, "Not acceptable here"};
+ const StatusLine c_statusLine493 := {c_sipNameVersion, 493, "Undecipherable"};
+ const StatusLine c_statusLine500 := {c_sipNameVersion, 500, "Server Internal error"};
+ const StatusLine c_statusLine501 := {c_sipNameVersion, 501, "Not implemented"};
+ const StatusLine c_statusLine502 := {c_sipNameVersion, 502, "Bad Gateway"};
+ const StatusLine c_statusLine503 := {c_sipNameVersion, 503, "Service Unavailable"};
+ const StatusLine c_statusLine504 := {c_sipNameVersion, 504, "Server timeout"};
+ const StatusLine c_statusLine505 := {c_sipNameVersion, 505, "Version not supported"};
+ const StatusLine c_statusLine513 := {c_sipNameVersion, 513, "Message too long"};
+ const StatusLine c_statusLine580 := {c_sipNameVersion, 580, "Precondition failure"};
+ const StatusLine c_statusLine600 := {c_sipNameVersion, 600, "Busy Everywhere"};
+ const StatusLine c_statusLine603 := {c_sipNameVersion, 603, "Decline"};
+ const StatusLine c_statusLine604 := {c_sipNameVersion, 604, "Does not exist anywhere"};
+ const StatusLine c_statusLine606 := {c_sipNameVersion, 606, "Not acceptable"};
+
+} //end StatusLines
+
+group SIPSyncPointNames {
+ const charstring c_Ringing := "Ringing";
+ const charstring c_uPlane := "uPlane";
+ const charstring c_sync1 := "sync1";
+ const charstring c_sync2 := "sync2";
+ const charstring c_sync3 := "sync3";
+ const charstring c_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,
+
+ GEOLOCATION_E // draft-ietf-sipcore-location-conveyance-04
+ }
+
+ // [7.1]
+ type enumerated Method {
+ ACK_E,
+ BYE_E,
+ CANCEL_E,
+ INVITE_E,
+ OPTIONS_E,
+ REGISTER_E,
+ PRACK_E, // Note: this element is not defined in [5]
+ SUBSCRIBE_E, NOTIFY_E, // [3265]
+ PUBLISH_E, // [3903/12]
+ REFER_E, // [3515]
+ UPDATE_E, // [3311]
+ MESSAGE_E, // [3428]
+ INFO_E, // [2976]
+ UNKNOWN_METHOD_E
+ }
+
+ // [20.1, 20.3, 20.4, 20.7, 20.9, 20.10, 20.11, 20.18, 20.20, 20.27, 20.28, 20.30, 20.31,
+ // 20.33, 20.34, 20.39, 20.42, 20.44]
+ type record GenericParam
+ {
+ charstring id,
+ charstring paramValue optional
+ }
+
+ // [?]
+ type set of GenericParam SemicolonParam_List;
+
+ // [?]
+ type set of GenericParam AmpersandParam_List;
+
+ // [?]
+ type set of GenericParam CommaParam_List;
+
+ // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39, 20.42, 20.43]
+ type record HostPort
+ {
+ charstring host optional, // hostname, IPv4 or IPv6
+ integer portField optional // represented as an integer
+ }
+
+ // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
+/**
+ *
+ * @desc identifier for user or telephone subscriber
+ * @member userOrTelephoneSubscriber provides the username or a phone name identifying the subscriber
+ * @member password related password information
+ *
+ */
+ type record UserInfo
+ {
+ charstring userOrTelephoneSubscriber,
+ charstring password optional
+ }
+
+ // [19.1.1 ;used in: 20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
+
+
+/**
+ *
+ * @desc Uniform Resource Identifier (URI)
+ * @member scheme distinguishes call types, e.g. voice, fax etc. or related address scheme, e.g. tel, sip
+ * @member userInfo Contains user information (also in non-SIP URLs) with optional parameter as passwords
+ * @member hostPort Hostname or IP address information and port identifier of the target
+ * @member urlParameters Contains either SIP or TEL URL parameters, separated by semicolons, e.g. transport=tcp or user=phone
+ * @member headers Additional information added after the parameters, e.g. priority=urgent
+ */
+ type record SipUrl
+ {
+ charstring scheme, // e.g "sip" or "tel"
+ UserInfo userInfo optional,
+ HostPort hostPort optional,
+ SemicolonParam_List urlParameters optional,
+ AmpersandParam_List headers optional
+ }
+
+ // [20.1, RFC2616 14.1]
+ type record AcceptBody
+ {
+ charstring mediaRange,
+ SemicolonParam_List acceptParam optional
+ }
+
+ // [20.1, RFC2616 14.1]
+ type set of AcceptBody AcceptBody_List;
+
+ // [20.4]
+ type record AlertInfoBody
+ {
+ charstring url, // any URI
+ SemicolonParam_List genericParams optional
+ }
+
+ // [20.4]
+ type set of AlertInfoBody AlertInfoBody_List;
+
+ // [20.8]
+ type charstring CallidString; // token ["@" token]
+
+ // [20.8]
+ type set of CallidString CallidString_List;
+
+ // [20.9]
+ type record CallInfoBody
+ {
+ charstring url, // any URI
+ SemicolonParam_List infoParams optional
+ }
+
+ // [20.9]
+ type set of CallInfoBody CallInfoBody_List;
+
+ // [20.27, 20.44, .......10.32, 10.48; RFC2616 14.33, 14.47; RFC2617 1.2]
+ type union Challenge
+ {
+ CommaParam_List digestCln,
+ OtherAuth otherChallenge
+ }
+
+ // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
+ type record NameAddr
+ {
+ charstring displayName optional,
+ SipUrl addrSpec
+ }
+
+ // [20.10, 20.20, 20.31, 20.39]
+ type union Addr_Union
+ {
+ NameAddr nameAddr,
+ SipUrl addrSpecUnion // STS: "Union" added to filed name to avoid dangerous name equivalence with 2nd NameAddr field
+ }
+
+ // [20.10]
+ type record ContactAddress
+ {
+ Addr_Union addressField,
+ SemicolonParam_List contactParams optional
+ }
+
+ // [20.10]
+ type set of ContactAddress ContactAddress_List; // 1 or more elements
+
+ // [20.10]
+ type union ContactBody
+ {
+ charstring wildcard,
+ ContactAddress_List contactAddresses
+ }
+
+ // [20.2, 20.12; RFC2616 14.3, 14.11]
+ type charstring ContentCoding;
+
+ // [20.2, 20.12; RFC2616 14.3, 14.11]
+ type set of ContentCoding ContentCoding_List;
+
+ // [20.7, 20.28; RFC2616 14.35 RFC2617 1.2]
+ type union Credentials
+ {
+ CommaParam_List digestResponse,
+ OtherAuth otherResponse
+ }
+
+ // allow multiple Authorization headers due to RFC3261 ch. 20.7 and 20.28
+ type record of Credentials CredentialsList;
+
+ // [20.19, 20.23, 20.33]
+ type charstring DeltaSec; // an external operation can handle this field
+
+ // [20.18]
+ type record ErrorInfoBody
+ {
+ charstring uri, // any URI
+ SemicolonParam_List genericParams optional
+ }
+
+ // [20.18]
+ type set of ErrorInfoBody ErrorInfoBody_List;
+
+ // [20.3 RFC2616 14.4]
+ type record LanguageBody
+ {
+ charstring languageRange,
+ SemicolonParam_List acceptParam optional
+ }
+
+ // [20.3 RFC2616 14.4]
+ type set of LanguageBody LanguageBody_List;
+
+ // [20.13; RFC2616 14.12]
+ type charstring LanguageTag;
+
+ // [20.13; RFC2616 14.12]
+ type set of LanguageTag LanguageTag_List;
+
+ // [20.5]
+ type set of charstring Method_List;
+
+
+ // [20.29, 20.32, 20.37, 20.40]
+ type charstring OptionTag;
+
+ // [20.29, 20.32, 20.37, 20.40]
+ type set of OptionTag OptionTag_List;
+
+
+ // [20.7, 20.27, 20.28, 20.44 ; RFC2616 14.33, 14.47; RFC2617 1.2]
+ type record OtherAuth
+ {
+ charstring authScheme,
+ CommaParam_List authParams
+ }
+
+ type record Payload
+ {
+ integer payloadlength,
+ charstring payloadvalue
+ }
+
+ // [20.30,20.34]
+ type record RouteBody
+ {
+ NameAddr nameAddr,
+ SemicolonParam_List rrParam optional
+ }
+
+ // [20.30,20.34]
+ type record of RouteBody RouteBody_List;
+
+ // [20.42]
+ type record SentProtocol
+ {
+ charstring protocolName,
+ charstring protocolVersion,
+ charstring transport
+ }
+
+ // [20.35, 20.41; RFC2616 14.43]
+ type charstring ServerVal;
+
+ // [20.35, 20.41; RFC2616 14.43]
+ type set of ServerVal ServerVal_List;
+
+ // [20.38]
+ type record TimeValue
+ {
+ integer majorDigit, // represented as an integer
+ integer minorDigit optional // represented as an integer
+ }
+
+ // [20.42]
+ type record ViaBody
+ {
+ SentProtocol sentProtocol,
+ HostPort sentBy,
+ SemicolonParam_List viaParams optional
+ }
+
+ // [20.42]
+ type record of ViaBody ViaBody_List;
+
+ // [20.43]
+ type union WarnAgent
+ {
+ HostPort hostPort,
+ charstring pseudonym
+ }
+
+ // [20.43]
+ type record WarningValue
+ {
+ integer warnCode, // represented as an integer
+ WarnAgent warnAgent,
+ charstring warnText
+ }
+
+ // [20.43]
+ type set of WarningValue WarningValue_List;
+
+ type Addr_Union PAssertedIDValue;
+
+ type record of PAssertedIDValue PAssertedIDValue_List;
+
+ type charstring PAssertedServiceValue;
+
+ type Addr_Union PPreferredIDValue;
+
+ type record of PPreferredIDValue PPreferredIDValue_List;
+
+ type charstring PrivacyValue;
+
+ type record of PrivacyValue PrivacyValue_List;
+
+
+ } // end group TokensType
+
+
+ group HeaderFieldTypes // Header Fields
+ {
+ group CommonHeaderFieldTypes
+ {
+ // [20.1, RFC2616 14.1]
+ type record Accept
+ {
+ FieldName fieldName (ACCEPT_E),
+ AcceptBody_List acceptArgs optional
+ }
+
+ // [20.2, RFC2616 14.3]
+ type record AcceptEncoding
+ {
+ FieldName fieldName (ACCEPT_ENCODING_E),
+ ContentCoding_List contentCoding optional
+ }
+
+ // [20.3, RFC2616 14.4]
+ type record AcceptLanguage
+ {
+ FieldName fieldName (ACCEPT_LANGUAGE_E),
+ LanguageBody_List languageBody optional
+ }
+
+ // [20.4]
+ type record AlertInfo
+ {
+ FieldName fieldName (ALERT_INFO_E),
+ AlertInfoBody_List alertInfoBody optional
+ }
+
+ // [20.5]
+ type record Allow
+ {
+ FieldName fieldName (ALLOW_E),
+ Method_List methods optional
+ }
+
+ // [20.6]
+ type record AuthenticationInfo
+ {
+ FieldName fieldName (AUTHENTICATION_INFO_E),
+ CommaParam_List ainfo
+ }
+
+ // [20.7 RFC2617 3.2.2]
+ type record Authorization
+ {
+ FieldName fieldName (AUTHORIZATION_E),
+ CredentialsList body // changed from Credentials to allow multiple Authorization headers
+ }
+
+ // [20.8]
+ type record CallId
+ {
+ FieldName fieldName (CALL_ID_E),
+ CallidString callid
+ }
+
+ // [20.9]
+ type record CallInfo
+ {
+ FieldName fieldName (CALL_INFO_E),
+ CallInfoBody_List callInfoBody optional
+ }
+
+ // [20.10]
+ type record Contact
+ {
+ FieldName fieldName (CONTACT_E),
+ ContactBody contactBody
+ }
+
+ // [20.11]
+ type record ContentDisposition
+ {
+ FieldName fieldName (CONTENT_DISPOSITION_E),
+ charstring dispositionType,
+ SemicolonParam_List dispositionParams optional
+ }
+
+ // [20.12 RFC2616 14.11]
+ type record ContentEncoding
+ {
+ FieldName fieldName (CONTENT_ENCODING_E),
+ ContentCoding_List contentCoding
+ }
+
+ // [20.13 RFC2616 14.12]
+ type record ContentLanguage
+ {
+ FieldName fieldName (CONTENT_LANGUAGE_E),
+ LanguageTag_List languageTag
+ }
+
+ // [20.14]
+ type record ContentLength
+ {
+ FieldName fieldName (CONTENT_LENGTH_E),
+ integer len // this field is represented as an integer
+ }
+
+ // [20.15]
+ type record ContentType
+ {
+ FieldName fieldName (CONTENT_TYPE_E),
+ charstring mediaType
+ }
+
+ // [20.16]
+ type record CSeq
+ {
+ FieldName fieldName (CSEQ_E),
+ integer seqNumber, // this field is represented as an integer
+ charstring method
+ }
+
+ // [20.17]
+ type record Date
+ {
+ FieldName fieldName (DATE_E),
+ charstring sipDate
+ }
+
+ // [20.18]
+ type record ErrorInfo
+ {
+ FieldName fieldName (ERROR_INFO_E),
+ ErrorInfoBody_List errorInfo optional
+ }
+
+ // [20.19]
+ type record Expires
+ {
+ FieldName fieldName (EXPIRES_E),
+ DeltaSec deltaSec
+ }
+
+ // [20.20]
+ type record From
+ {
+ FieldName fieldName (FROM_E),
+ Addr_Union addressField,
+ SemicolonParam_List fromParams optional
+ }
+
+ // [20.21]
+ type record InReplyTo
+ {
+ FieldName fieldName (IN_REPLY_TO_E),
+ CallidString_List callids
+ }
+
+ // [20.22]
+ type record MaxForwards
+ {
+ FieldName fieldName (MAX_FORWARDS_E),
+ integer forwards // this field is represented as an integer
+ }
+
+ // [20.23]
+ type record MinExpires
+ {
+ FieldName fieldName (MIN_EXPIRES_E),
+ DeltaSec deltaSec
+ }
+
+ // [20.24 RFC2616 19.4.1]
+ type record MimeVersion
+ {
+ FieldName fieldName (MIME_VERSION_E),
+ integer majorNumber, // this field is represented as an integer
+ integer minorNumber // this field is represented as an integer
+ }
+
+ // [20.25]
+ type record Organization
+ {
+ FieldName fieldName (ORGANIZATION_E),
+ charstring organization
+ }
+
+ // [20.26]
+ type record Priority
+ {
+ FieldName fieldName (PRIORITY_E),
+ charstring priorityValue
+ }
+
+ // [20.27 RFC2616 14.33 RFC2617 1.2]
+ type record ProxyAuthenticate
+ {
+ FieldName fieldName (PROXY_AUTHENTICATE_E),
+ Challenge challenge
+ }
+
+ // [20.28 RFC2616 14.35 RFC2617 1.2]
+ type record ProxyAuthorization
+ {
+ FieldName fieldName (PROXY_AUTHORIZATION_E),
+ CredentialsList credentials // changed from Credentials to allow multiple Authorization headers
+ }
+
+ // [20.29]
+ type record ProxyRequire
+ {
+ FieldName fieldName (PROXY_REQUIRE_E),
+ OptionTag_List optionsTags
+ }
+
+ // [20.30]
+ type record RecordRoute
+ {
+ FieldName fieldName (RECORD_ROUTE_E),
+ RouteBody_List routeBody
+ }
+
+ // [20.31]
+ type record ReplyTo
+ {
+ FieldName fieldName (REPLY_TO_E),
+ Addr_Union addressField,
+ SemicolonParam_List replyToParams optional
+ }
+
+ // [20.32]
+ type record Require
+ {
+ FieldName fieldName (REQUIRE_E),
+ OptionTag_List optionsTags
+ }
+
+ // [20.33]
+ type record RetryAfter
+ {
+ FieldName fieldName (RETRY_AFTER_E),
+ DeltaSec deltaSec,
+ charstring comment optional,
+ SemicolonParam_List retryParams optional
+ }
+
+ // [20.34]
+ type record Route
+ {
+ FieldName fieldName (ROUTE_E),
+ RouteBody_List routeBody
+ }
+
+ // [20.35 RFC2616 14.38]
+ type record Server
+ {
+ FieldName fieldName (SERVER_E),
+ ServerVal_List serverBody
+ }
+
+ // [20.36]
+ type record Subject
+ {
+ FieldName fieldName (SUBJECT_E),
+ charstring summary
+ }
+
+ // [20.37]
+ type record Supported
+ {
+ FieldName fieldName (SUPPORTED_E),
+ OptionTag_List optionsTags optional
+ }
+
+ // [20.38]
+ type record Timestamp
+ {
+ FieldName fieldName (TIMESTAMP_E),
+ TimeValue timeValue optional,
+ TimeValue delay optional
+ }
+
+ // [20.39]
+ type record To
+ {
+ FieldName fieldName (TO_E),
+ Addr_Union addressField,
+ SemicolonParam_List toParams optional
+ }
+
+ // [20.40]
+ type record Unsupported
+ {
+ FieldName fieldName (UNSUPPORTED_E),
+ OptionTag_List optionsTags
+ }
+
+ // Undefined header field
+ type record UndefinedHeader
+ {
+ charstring headerName,
+ charstring headerValue
+ }
+
+ type set of UndefinedHeader UndefinedHeader_List;
+
+ // [20.41 RFC2616 14.43]
+ type record UserAgent
+ {
+ FieldName fieldName (USER_AGENT_E),
+ ServerVal_List userAgentBody
+ }
+
+ // [20.42]
+ type record Via
+ {
+ FieldName fieldName (VIA_E),
+ ViaBody_List viaBody
+ }
+
+ // [20.43]
+ type record Warning
+ {
+ FieldName fieldName (WARNING_E),
+ WarningValue_List warningValue
+ }
+
+ // [20.44 RFC2616 14.47 RFC2617 1.2]
+ type record WwwAuthenticate
+ {
+ FieldName fieldName (WWW_AUTHENTICATE_E),
+ Challenge challenge
+ }
+ }//end group CommonHeaderFieldTypes
+ group RFC3262HeaderFieldTypes
+ {
+ // [3262/7.1]
+ type record RSeq {
+ FieldName fieldName(RSEQ_E),
+ integer responseNum
+ }
+
+ // [3262/7.2]
+ type record RAck {
+ FieldName fieldName(RACK_E),
+ integer responseNum,
+ integer seqNumber,
+ charstring method
+ }
+ }//end group RFC3262HeaderFieldTypes
+
+ group RFC3265HeaderFieldTypes
+ {
+ // [3265/7.2]
+ type record AllowEvents {
+ FieldName fieldName(ALLOW_EVENTS_E),
+ EventType_List eventTypes
+ }
+
+ type set of EventType EventType_List;
+ type charstring EventType;
+
+ // [3265/7.2]
+ type record Event {
+ FieldName fieldName(EVENT_E),
+ EventType eventType,
+ SemicolonParam_List eventParams optional
+ }
+
+ // [3265/7.2]
+ type record SubscriptionState {
+ FieldName fieldName(SUBSCRIPTION_STATE_E),
+ SubState subState,
+ SemicolonParam_List substateParams optional
+ }
+
+ type charstring SubState;
+ }//end group RFC3265HeaderFieldTypes
+
+ group RFC3313HeaderFieldTypes
+ {
+ // [3313/5]
+ type record PMediaAuthorization {
+ FieldName fieldName(P_MEDIA_AUTHORIZATION_E),
+ PMediaAuthorization_List pMediaAuthorizations
+ }
+
+ type charstring PMediaAuthValue; //HEXDIG "0"-"9", "A"-"F"
+
+ type record of PMediaAuthValue PMediaAuthorization_List;
+
+ }//end group RFC3265HeaderFieldTypes
+
+ group RFC3323HeaderFieldTypes
+ {
+ // [3323]
+ type record Privacy {
+ FieldName fieldName(PRIVACY_E),
+ PrivacyValue_List privValueList
+ }
+ }//end group RFC3323HeaderFieldTypes
+
+ group RFC3325HeaderFieldTypes
+ {
+ // [3325]
+ type record PAssertedID {
+ FieldName fieldName(P_ASSERTED_ID_E),
+ PAssertedIDValue_List pAssertedIDValueList
+ }
+
+ // [3325]
+ type record PPreferredID {
+ FieldName fieldName(P_PREFERRED_ID_E),
+ PPreferredIDValue_List pPreferredIDValueList
+ }
+ // 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 RFC3329HeaderFieldTypes
+ {
+ // [RFC3329/2.2]
+ type record SecurityMechanism {
+ charstring mechName,
+ SemicolonParam_List mechParams optional
+ }
+
+ type set of SecurityMechanism SecurityMechanism_List;
+
+ type record SecurityClient {
+ FieldName fieldName(SECURITY_CLIENT_E),
+ SecurityMechanism_List securityMech
+ }
+
+ type record SecurityServer {
+ FieldName fieldName(SECURITY_SERVER_E),
+ SecurityMechanism_List securityMech
+ }
+
+ type record SecurityVerify {
+ FieldName fieldName(SECURITY_VERIFY_E),
+ SecurityMechanism_List securityMech
+ }
+ }//end group RFC3329HeaderFieldTypes
+
+ group RFC3455HeaderFieldTypes
+ {
+ type record of NameAddrParam NameAddrParam_List;
+
+ type record NameAddrParam {
+ NameAddr nameAddr,
+ SemicolonParam_List genericParams optional
+ }
+ //[3455/5.1]
+ type record PAssociatedURI {
+ FieldName fieldName(P_ASSOCIATED_URI_E),
+ NameAddrParam_List nameAddrList
+ }
+ //[3455/5.2]
+ type record PCalledPartyID {
+ FieldName fieldName(P_CALLED_PARTY_E),
+ NameAddrParam nameAddParams
+ }
+
+ type record of VnetworkSpec VnetworkSpec_List;
+
+ type record VnetworkSpec {
+ charstring vNetworkSpecToken,
+ SemicolonParam_List genericParams optional
+ }
+
+ //[3455/5.3]
+ type record PVisitedNetworkID {
+ FieldName fieldName(P_VISITED_NETWORK_E),
+ VnetworkSpec_List vNetWorkSpec
+ }
+
+ //[3455/5.4]
+ type record PAccessNetworkInfo {
+ FieldName fieldName(P_ACCESS_NETWORK_INFO_E),
+ charstring accessType,
+ SemicolonParam_List genericParams optional
+ }
+
+ //[3455/5.5]
+ type record PChargingFunctionAddresses {
+ FieldName fieldName(P_CHARGING_FUNCTION_ADDRESSES_E),
+ SemicolonParam_List chargeAddrParams optional
+ }
+
+ //[3455/5.6]
+ type record PChargingVector {
+ FieldName fieldName(P_CHARGING_VECTOR_E),
+ SemicolonParam_List chargeParams optional
+ }
+ }//end group RFC33455HeaderFieldTypes
+
+ group RFC3515HeaderFieldTypes
+ {
+ // [3515]
+ type record ReferTo {
+ FieldName fieldName(REFER_TO_E),
+ NameAddr nameAddr,
+ SemicolonParam_List referToParams optional
+ }
+ }//end group RFC3515HeaderFieldTypes
+
+ group RFC4488HeaderFieldTypes {
+
+ // [4488]
+ type record ReferSub {
+ FieldName fieldName(REFER_SUB_E),
+ boolean referSubValue,
+ SemicolonParam_List referSubParams optional
+ }
+
+ }//end group RFC4488HeaderFieldTypes
+
+ 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),
+ SemicolonParam_List replacesParams
+ }
+ }// end group RFC3891HeaderFieldTypes
+
+ group RFC3892HeaderFieldTypes
+ {
+ // [3892]
+ type record ReferredBy {
+ FieldName fieldName(REFERRED_BY_E),
+ NameAddr nameAddr,
+ SemicolonParam_List referredbyIdParams optional
+ }
+ }//end group RFC3892HeaderFieldTypes
+
+ group RFC4028HeaderFieldTypes
+ {
+ // [4028]
+ type record MinSE {
+ FieldName fieldName(MIN_SE_E),
+ DeltaSec deltaSec,
+ SemicolonParam_List minSeParam optional
+ }
+ // [4028]
+ type record SessionExpires {
+ FieldName fieldName(SESSION_EXPIRES_E),
+ DeltaSec deltaSec,
+ SemicolonParam_List seParam optional
+ }
+ }//end group RFC4028HeaderFieldTypes
+
+ group RFC4244HeaderFieldTypes
+ {
+ // [4244]
+ type record HistoryInfo {
+ FieldName fieldName(HISTORY_INFO_E),
+ HistoryInfo_List historyInfoList
+ }
+
+ type record of HistoryInfoEntry HistoryInfo_List;
+
+ type record of charstring StringList;
+
+ type record HistoryInfoEntry {
+ NameAddr nameAddr,
+ StringList hiIndex optional,
+ SemicolonParam_List hiExtention optional
+ }
+ }//end group RFC4244HeaderFieldTypes
+
+ group RFC5009PEarlyMediaHeader
+ {
+ // [5009]
+ type record PEarlyMedia {
+ FieldName fieldName(P_EARLY_MEDIA_E),
+ EM_List em_param
+ }
+ type record of charstring EM_List;
+ }//end group RFC5009PEarlyMediaHeader
+
+ //http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07, expires 16.Aug.2009
+ //Transporting User to User Call Control Information in SIP for ISDN Interworking
+ //type definition of SIP header mechanism
+ group UserToUser_PreliminaryRFCDraft
+ {
+ type record UserToUser{
+ FieldName fieldName (USER_TO_USER_E),
+ charstring uuiData length(256), /*length limitation due to ISDN, max of allowed 128 hex digits are represented by 256 characters*/
+ GenericParam uuiParam
+ }
+
+ }//end group UserToUser_PreliminaryRFCDraft
+
+ type record PAssertedService {
+ FieldName fieldName(P_ASSERTED_SERVICE_E),
+ PAssertedServiceValue pAssertedServiceValue
+ }
+ type record Geolocation { // draft-ietf-sipcore-location-conveyance-04 clause 4.1
+ FieldName fieldName(GEOLOCATION_E),
+ SipUrl addrSpec,
+ charstring routingAllowed,
+ SemicolonParam_List geolocParam optional
+ }
+
+
+ } // 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, // http://tools.ietf.org/html/draft-ietf-sipcore-location-conveyance-04
+ 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
+ Subject subject optional, // only in requests
+ SubscriptionState subscriptionState optional, // 3265/7.2
+ Supported supported optional,
+ Timestamp timestamp optional,
+ To toField,
+ Unsupported unsupported optional, // only in responses
+ UserToUser userToUser optional,
+ UserAgent userAgent optional,
+ Via via,
+ Warning warning optional, // only in responses
+ WwwAuthenticate wwwAuthenticate optional, // only in responses
+ UndefinedHeader_List undefinedHeader_List optional
+ }
+
+ } // end group MessageHeaderTypes
+
+ group StartLineTypes
+ {
+ // Request-Line [7.1]
+ type record RequestLine
+ {
+ Method method,
+ SipUrl requestUri,
+ charstring sipVersion
+ }
+
+ // Status-Line [7.2]
+ type record StatusLine
+ {
+ charstring sipVersion,
+ integer statusCode,
+ charstring reasonPhrase
+ }
+
+ } // end group StartLineTypes
+
+
+ group otherTypes{
+
+ type record SipUserProfile
+ {
+ /** @desc integer for the userprofile identifier
+ */
+ integer id,
+
+ /** @desc integer for Port number to exchange SIP messages
+ */
+ integer currPort,
+
+ /** @desc charstring for IP address to exchange SIP messages
+ */
+ charstring currIpaddr,
+
+ /** @desc integer for Port number to exchange SIP messages
+ */
+ integer contactPort,
+
+ /** @desc charstring for IP address to exchange SIP messages
+ */
+ charstring contactIpaddr,
+
+ /** @desc charstring for IP address used by the TS to exchange media streams
+ */
+ charstring bearerIpaddr,
+
+ /** @desc charstring for identity of the tester local domain
+ */
+ charstring homeDomain,
+
+ /** @desc charstring for identity of the tester local user
+ */
+ charstring publUsername,
+
+ /** @desc charstring for RFC 2617 3.2.1 qop options:
+ * Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
+ * value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
+ */
+ charstring qop,
+
+ /** @desc charstring for RFC 2617 3.2.2 username for authentication
+ * The name of user in the specified realm
+ */
+ charstring privUsername,
+
+ /** @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
+ */
+ charstring passwd,
+
+ /** @desc charstring for registrar domain for authentication and request line
+ */
+ charstring registrarDomain
+
+ }
+
+
+ } // end group otherTypes
+
+ }// end group Subtypes
+
+
+
+ group MSGtypes{
+
+ group RequestTypes
+ {
+ // [7.1]
+
+ /**
+ *
+ * @desc generic type of a SIP request message
+ * @member statusLine contains a method name, a Request-URI, and the protocol version
+ * @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
+ * @member messageBody depends on the request method, includes e.g. SDP message.
+ * @member payload contains the whole message as it has been received in its text format
+ */
+ type record Request
+ {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ // Note: the introduction of the following specific types is to enable better means for logging
+ // on the other side the generic type is useful for functions dealing with multiple SIP message types
+
+ type record REGISTER_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ type record INVITE_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ type record OPTIONS_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ type record BYE_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ type record CANCEL_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ type record ACK_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec" }
+
+ // [3262/7.1]
+ type record PRACK_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec" }
+
+ // [3265/7.1]
+ type record NOTIFY_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec" }
+
+ // [3265/7.1]
+ type record SUBSCRIBE_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ // [3903/11.1]
+ type record PUBLISH_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec" }
+
+ // [3311/7]
+ type record UPDATE_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec" }
+
+ //
+ type record REFER_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+ //
+ type record MESSAGE_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec" }
+
+ //
+ type record INFO_Request {
+ RequestLine requestLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+
+
+ } //with { encode "SIPCodec" }// end group RequestTypes
+
+ group ResponseTypes
+ {
+ // [7.2]
+
+ /**
+ *
+ * @desc generic type of a SIP response message
+ * @member statusLine consists of the protocol version followed by a numeric Status-Code and its associated textual phrase
+ * @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
+ * @member messageBody depends on the response method, includes e.g. SDP message.
+ * @member payload contains the whole message as it has been received in its text format
+ */
+ type record Response
+ {
+ StatusLine statusLine,
+ MessageHeader msgHeader,
+ MessageBody messageBody optional,
+ Payload payload optional
+ } with { encode "SIPCodec"}
+ } //with { encode "SIPCodec" }// end group ResponseTypes
+
+ // This MSG type is defined for sending synctactic variations, ans syntactically
+ // erroneous messages, and receving messages failed parsing.
+ group SyntacticTypes
+ {
+ type charstring Raw;
+ } // end group SyntacticTypes
+
+ // This type is defined for particular SIP message body types like SDP
+
+ group MessageBodyTypes
+ {
+ type union MessageBody{
+ SDP_Message sdpMessageBody, // if there is only SDP part
+// XMLMessage xmlMessage, // if there is XML message (with header and body)
+ XmlBody xmlBody, // if there is XML body
+ MIME_Message mimeMessageBody, // if there is SDP and encapsulated ISUP part
+ charstring sipfrag, // if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2)
+ charstring textplain, // if content type is text/plain (for testing long messages)
+ SimpleMsgSummary simpleMsgSummary, // RFC 3842
+ octetstring smsMessage // encoded SMS message 3GPP 23.040, 24.011
+ };
+
+ } // end group MessageBodyTypes
+
+ group MIMETypes
+ {
+ group SubMIMETypes
+ {
+
+ type union MIME_Encapsulated_Parts {
+ SDP_Message sdpMessageBody,
+ XmlBody xmlBody // if there is XML body
+// XMLMessage xmlMessage // if there is XML message (with header and body)
+ }
+
+ type record MIME_Encapsulated_Part {
+ charstring content_type,
+ charstring content_disposition optional,
+ MIME_Encapsulated_Parts mime_encapsulated_part
+ }
+ }//end group SubMIMETypes
+
+ group MessageTypes {
+
+ type record MIME_Message {
+ charstring boundary, // len:
+ MimeEncapsulatedList mimeEncapsulatedList
+ } with { encode "MimeBodyCodec" }
+
+ type record of MIME_Encapsulated_Part MimeEncapsulatedList;
+
+ } // group MessageTypes
+ } // group MIMETypes
+
+ }// end group MSGTypes
+}// end group Types
+
+} // end module LibSip_TypesAndValues
/v1.7.0/ttcn/LibSip_SIPTypesAndValues.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/ttcn/LibSip_SDPTypes.ttcn
===================================================================
--- v1.7.0/ttcn/LibSip_SDPTypes.ttcn (nonexistent)
+++ v1.7.0/ttcn/LibSip_SDPTypes.ttcn (revision 524)
@@ -0,0 +1,318 @@
+/**
+ * @author STF 346, STF366, STF368, STF369
+ * @version $Id$
+ * @desc This module defines message, attribute, structured and simple
+ * SDP types as well constants used by LipSip constructs. <br>
+ * Note that any changes made to the definitions in this module
+ * may be overwritten by future releases of this library
+ * End users are encouraged to contact the distributers of this
+ * module regarding their modifications or additions
+ * @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 //MRO
+{
+ 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_msrp := "msrp";
+
+ // SDP_media_desc: transport
+ const charstring c_rtpAvp := "RTP/AVP";
+ 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_none := "none";
+ const charstring c_qos := "qos";
+ const charstring c_remote := "remote";
+ const charstring c_sendrecv := "sendrecv";
+ const charstring c_send := "send";
+ const charstring c_recv := "recv";
+ const charstring c_e2e := "e2e";
+ }
+ }
+ group Types
+ {
+ group SubTypes
+ {
+ group AttributeTypes
+ {
+ type record SDP_attribute_cat {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_keywds {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_tool {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_ptime {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_recvonly {
+ }
+
+ type record SDP_attribute_sendrecv {
+ }
+
+ type record SDP_attribute_sendonly {
+ }
+
+ type record SDP_attribute_inactive {
+ }
+
+ type record SDP_attribute_orient {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_type {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_charset {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_sdplang {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_lang {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_framerate {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_quality {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_fmtp {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_curr {
+ charstring preconditionType,
+ charstring statusType,
+ charstring direction
+ }
+
+ type record SDP_attribute_des {
+ charstring preconditionType,
+ charstring strength,
+ charstring statusType,
+ charstring direction
+ }
+
+ type record SDP_attribute_conf {
+ charstring preconditionType,
+ charstring statusType,
+ charstring direction
+ }
+
+ type record SDP_attribute_rtpmap {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_rtcp {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_msrp {
+ charstring attr_value
+ }
+
+ type record SDP_attribute_unknown {
+ charstring name,
+ charstring attr_value optional
+ }
+
+
+ type union SDP_attribute {
+ SDP_attribute_cat cat,
+ SDP_attribute_keywds keywds,
+ SDP_attribute_tool tool,
+ SDP_attribute_ptime ptime,
+ SDP_attribute_recvonly recvonly,
+ SDP_attribute_sendrecv sendrecv,
+ SDP_attribute_sendonly sendonly,
+ SDP_attribute_inactive inactive,
+ SDP_attribute_orient orient,
+ SDP_attribute_type sdp_type,
+ SDP_attribute_charset charset,
+ SDP_attribute_sdplang sdplang,
+ SDP_attribute_lang lang,
+ SDP_attribute_framerate framerate,
+ SDP_attribute_quality quality,
+ SDP_attribute_fmtp fmtp,
+ SDP_attribute_curr curr,
+ SDP_attribute_des des,
+ SDP_attribute_conf conf,
+ SDP_attribute_rtpmap rtpmap,
+ SDP_attribute_rtcp rtcp,
+ SDP_attribute_msrp msrp,
+
+ //* 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
/v1.7.0/ttcn/LibSip_SDPTypes.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/ttcn/LibSip_Interface.ttcn
===================================================================
--- v1.7.0/ttcn/LibSip_Interface.ttcn (nonexistent)
+++ v1.7.0/ttcn/LibSip_Interface.ttcn (revision 524)
@@ -0,0 +1,185 @@
+/*
+ * @author STF 346, STF366, STF368, STF369
+ * @version $Id$
+ * @desc This module provides the types used by the test component
+ * for SIP-IMS tests. Module become from STF306 and STF334-336
+ */
+
+module LibSip_Interface
+{
+ //LibCommon
+ import from LibCommon_Sync all;
+ import from LibCommon_AbstractData all;
+ import from LibCommon_BasicTypesAndValues all;
+ import from LibCommon_DataStrings all;
+ //LibSip
+ import from LibSip_SIPTypesAndValues all;
+ import from LibSip_SDPTypes all;
+ import from LibSip_XMLTypes all;
+
+ import from LibSip_PIXITS all;
+
+ group AdressTypes
+ {
+ type record address4SIP
+ {
+ //HostPort
+ charstring host optional, // hostname, IPv4 or IPv6
+ integer portField optional // represented as an integer
+ } with { encode "SIPCodec" }
+
+ type address4SIP address;
+
+ }// end group AdressTypes
+
+ type port SipPort message {
+ inout Request,
+ REGISTER_Request,
+ INVITE_Request,
+ OPTIONS_Request,
+ BYE_Request,
+ CANCEL_Request,
+ ACK_Request,
+ PRACK_Request,
+ NOTIFY_Request,
+ SUBSCRIBE_Request,
+ PUBLISH_Request,
+ UPDATE_Request,
+ REFER_Request,
+ MESSAGE_Request,
+ INFO_Request,
+ Response,
+ Raw } with { extension "address" };
+
+ signature s_SIP_conversation (in charstring text, out boolean answer);
+ signature s_SIP_ringing (in charstring text, out boolean answer);
+ signature s_SIP_announcementA (in charstring text, out boolean answer);
+ signature s_SIP_announcementB (in charstring text, out boolean answer);
+ signature s_SIP_announcement (in charstring text, out boolean answer);
+ signature s_SIP_voiceMessage (in charstring text, out boolean answer);
+ signature s_SIP_mediastopped (in charstring text, out boolean answer);
+ type port operatorPort procedure {inout s_SIP_conversation; inout s_SIP_ringing; inout s_SIP_announcementA; inout s_SIP_announcementB; inout s_SIP_announcement; inout s_SIP_voiceMessage; inout s_SIP_mediastopped};
+
+ // Solution for building error problem. (Important for validation)
+ //type component ImsComponent extends SipComponent need to be located in LibIms_Interface and not in LibSip_Interface module
+ //With this solution TAU compiler error.
+// type component ImsComponent extends SipComponent
+// {
+// // general variables
+// var ImsInterfaceProfile vc_interfaceprofile
+// } // end ImsComponent
+
+ type component SipComponent
+ {
+ //port
+ port SipPort SIPP;
+ // used for communication with the operator
+ port operatorPort opPort;
+
+ // current address to send TCP/UDP messages
+ var SipUserProfile vc_userprofile; // PIXIT userinformation
+ var address vc_sent_label;//removed because this value is predefined and used to open socket := {host := PX_SIP_SUT_IPADDR, portField := PX_SIP_SUT_PORT};
+
+ // last incoming message
+ var Response vc_response; // last incoming response message
+ var boolean vc_boo_response := false; // to check if response received or not
+ var Request vc_request; // last incoming request message
+ var boolean vc_boo_request := false; // to check if request received or not
+ var Request vc_requestFor407; // last INVITE request to be authorized if 407/401 received from Proxy
+
+ var SipUrl vc_requestUri := c_empty_RequestUri;
+ var SipUrl vc_requestUri2 := c_empty_RequestUri;//MRO
+ var charstring vc_branch := "";
+ var charstring vc_branch_ICSCF := "";
+ var charstring vc_branch_SCSCF := "";
+
+ // SIP message header fields (for building next message)
+ var CallId vc_callId := c_empty_CallId;
+ var CallId vc_callIdReg := c_empty_CallId;
+ var From vc_from := c_empty_From;
+ var To vc_to := c_empty_To;
+ var To vc_cancel_To := c_empty_To; // used for next CANCEL
+ var Via vc_via := c_empty_Via;
+ var Via vc_via_REG := c_empty_Via; // via used in last REGISTER
+ var ContentType vc_contentType:= c_empty_ContentType;//MRO
+
+ var template RecordRoute vc_recordRoute; // value of RecordRoute header
+ var boolean vc_boo_recordRoute := false; // boolean indicates valid recordRoute
+ var template Route vc_route; // value of Route header
+ var template Route vc_route_REG; // value of Route header from registration ServiceRoute header for initial Requests
+ var boolean vc_boo_route := false; // boolean indicates valid Route
+
+ var Contact vc_contact; // value of Contact header
+ var CSeq vc_cSeq := c_empty_cSeq; // value of CSeq header
+ var RAck vc_rAck := { fieldName := RACK_E, responseNum := 1, seqNumber := 1, method := "INVITE"}; // value of RAck header
+ var HostPort vc_reqHostPort := {host:=PX_SIP_SUT_IPADDR, portField:=PX_SIP_SUT_PORT}; // address to send request
+ var Privacy vc_privacy;
+ var HistoryInfo_List vc_historyInfoList := {}; // value of history list according to RFC4244
+ var SipUrl vc_confURI; // conference URI according to TS124147 ch. 5.3.1.3.2
+ var SDP_Message vc_sdp_remote; // incoming SDP offers
+ var SDP_Message vc_sdp_local; // SDP values to be sent
+ var XmlBody vc_xml_remote; // incoming XML value
+ var template XmlBody vc_xml_local; //SDP values to be sent
+
+ var CSeq vc_iut_CSeq := c_empty_cSeq; // value of last CSeq header used by the IUT in request
+ // To/From header-fields to be used if the callee will release the session
+ var To vc_callee_To := c_empty_To;
+ var From vc_callee_From := c_empty_From;
+ // To/From header-fields to be used if the caller will release the session
+ var To vc_caller_To := c_empty_To;
+ var From vc_caller_From := c_empty_From;
+ var Authorization vc_authorization;
+
+ // variables for storing default references
+ var default vc_default;
+ var default vc_def_catchSyncStop;
+
+ // general timers
+ timer tc_T1 := PX_SIP_T1;
+ timer tc_Tf := PX_SIP_TF;
+ timer tc_wait := PX_SIP_TWAIT;
+ timer tc_ack := PX_SIP_TACK;
+ timer tc_resp := PX_SIP_TRESP;
+ timer tc_noAct := PX_SIP_TNOACT; // time for SUT to get idle state
+// timer TRept;
+// timer TSync := PX_SIP_TSYNC;
+ timer tc_guard := PX_SIP_TGUARD;//MRO
+ timer tc_tDelay := 32.0;
+
+ var float vc_tcRESP := PX_SIP_TRESP; // standard value for TRESP (may be modified in particular tests)
+
+ // indicators set/used parameter status or state handling in default
+ var boolean vc_sdp_remote_is_valid := false; // true if there is a value in v_SDP_remote
+ var boolean vc_history_is_valid := false; // true if there is a HistoryList in response message
+ var boolean vc_send_SDP := false; // send SDP in the next outgoing message
+ var boolean vc_ignore_bye := false; // enable ignore of repeated bye in default
+ var boolean vc_ignore_invite := false; // enable ignore invite in default
+ var boolean vc_ignore_subscribe := false; // enable ignore subscribe in default
+ var boolean vc_ignore181 := false; // enable ignore of 181 in default
+ var boolean vc_ignore484 := false; // enable ignore of 484 in default
+ var boolean vc_ignore4xx := false; // enable ignore of 4xx in default
+ var boolean vc_ignore200OKinv := false; // enable ignore of 200OKinv in default
+ var boolean vc_supported_100rel := false; // true if the received invite contains 100rel
+ var boolean vc_supported_precondition:= false; // true if the received invite contains precondition
+ var boolean vc_MESSAGEreceived := false; // true if MESSAGE received during altstep
+ var boolean vc_first_recv := false; // true after receipt of first incomming SIP message
+ var boolean vc_firstREGISTER_sent := false; // true after sent of first REGISTER message
+ var boolean vc_DeregDone := false; // true after first DeREGISTRATION trail (avoid loop)
+ var boolean vc_interface_isc := false; // true if isc interface is in use
+ var boolean v_white_space := false;//MRO
+
+ // ETS address
+ var address v_ets_label := { host := PX_SIP_TS1_IPADDR, portField := PX_SIP_TS1_PORT};
+
+ // parts needed for Client/SelfSyncComp type compatibility
+ var StringStack v_stateStack := c_initStringStack;
+ port SyncPort syncSendPort;
+ port SyncPort syncPort;
+ timer tc_sync := PX_TSYNC_TIME_LIMIT;
+
+// // used for communication with the operator
+// port operatorPort_SIP opPort;
+
+ } // end SipComponent
+
+} // end module LibSip_Interface
/v1.7.0/ttcn/LibSip_Interface.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/ttcn/LibSip_PIXITS.ttcn
===================================================================
--- v1.7.0/ttcn/LibSip_PIXITS.ttcn (nonexistent)
+++ v1.7.0/ttcn/LibSip_PIXITS.ttcn (revision 524)
@@ -0,0 +1,338 @@
+/*
+ * @author STF 346, STF366, STF368, STF369
+ * @version $Id$
+ * @desc This module provides the types used by the test component
+ * for SIP-IMS tests. Module become from STF306 and STF334-336
+ * NOTE: PIXITS in folowing groups can be ignored if this information
+ * is provided in other modules of the ATS that uses this SIP library
+ * - Ports_and_addresses_of_the_SUT
+ * - PortsAndAddressesOfTheTS1
+ * - PortsAndAddressesOfTheTS2
+ * - PortsAndAddressesOfTheTS3
+ * - ParametersForHTTP_Authentication
+ */
+
+module LibSip_PIXITS //MRO
+{
+ //LibCommon
+ import from LibCommon_BasicTypesAndValues all;
+ import from LibCommon_DataStrings all;
+
+// _____________________________ PIXIT-S_______________________________
+ group SIP_PIXITparameters{
+ group SDPParameter {
+
+ /** @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/8000";
+
+ /** @desc charstring for SDP media attribute encoding unavailable by the IUT
+ */
+ modulepar charstring PX_SIP_SDP_encoding_unavail := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
+
+ /** @desc charstring for SDP media attribute encoding unsupported by the IUT
+ */
+ modulepar charstring PX_SIP_SDP_encoding_unsup := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
+
+ /** @desc charstring for SDP media T.38 transport (used in TC2101_IS___AU__09)
+ */
+ modulepar charstring PX_SIP_SDP_transport := "udptl";
+ } //group SDP Parameter
+
+ group ISUPinterworkingParameters{
+ /** @desc charstring for Used CPC language
+ */
+ modulepar charstring PX_SIP_ISUP_LANGUAGE := "English";
+ /** @desc charstring for Used CPC language
+ */
+ modulepar charstring PX_SIP_ISUP_CPC_VALUE := "prison";
+ } // goup PSTNParameters
+
+ group SupportedOptions{
+
+ /** @desc boolean for True if 100rel mechanism is supported in SIP
+ */
+ modulepar boolean PX_SIP_100rel := false;
+
+ /** @desc boolean for True if precondition mechanism is supported in SIP
+ */
+ modulepar boolean PX_SIP_precondition := false;
+
+ /** @desc boolean for True if UDP Transport is used by the IUT to run campaign
+ */
+ modulepar boolean PX_SIP_UDP := true;
+
+ /** @desc charstring for Used Transport in upper case "UDP"/"TCP"
+ */
+ modulepar charstring PX_SIP_TRANSPORT := "UDP";
+ }// group SupportedOptions{
+
+ // PIXITS in group Ports_and_addresses_of_the_SUT can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+ group Ports_and_addresses_of_the_SUT{
+
+ /** @desc integer for SUT port number to exchange SIP messages
+ */
+ modulepar integer PX_SIP_SUT_PORT := 5060;
+
+ /** @desc charstring for SUT IP address to exchange SIP messages
+ */
+ modulepar charstring PX_SIP_SUT_IPADDR := "172.27.16.115";
+
+ /** @desc charstring for SUT domain
+ */
+ modulepar charstring PX_SIP_SUT_HOME_DOMAIN := "172.27.16.115";
+
+ /** @desc charstring for unknown SUT domain
+ */
+ modulepar charstring PX_SIP_SUT_HOME_DOMAIN_UNKNOWN := "172.88.88.88";
+
+ }
+
+ // PIXITS in group PortsAndAddressesOfTheTS1 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+ group PortsAndAddressesOfTheTS1 {
+// Ports and addresses of the TS1 (tester), first access
+ /** @desc integer for port number used by the TS1 to exchange SIP messages
+ */
+ modulepar integer PX_SIP_TS1_PORT := 5060;
+
+ /** @desc charstring for IP address used by the TS1 to exchange SIP messages
+ */
+ modulepar charstring PX_SIP_TS1_IPADDR := "172.27.1.218";
+
+ /** @desc charstring for identity of the tester local domain
+ */
+ modulepar charstring PX_SIP_TS1_LOCAL_DOMAIN := "172.27.1.218";
+
+ /** @desc charstring for identity of the tester local user
+ */
+ modulepar charstring PX_SIP_TS1_LOCAL_USER := "2910";
+
+ /** @desc charstring for identity of the user with active call diversion service
+ */
+ modulepar charstring PX_SIP_TS1_LOCAL_USER_DIV := "2907";
+
+ /** @desc charstring for identity of the tester local user (format "+"cc+ndc+sn)
+ */
+ modulepar charstring PX_SIP_TS1_LOCAL_USER_FULL := "+ 33492941111";
+
+ /** @desc integer for port number used by the TS to exchange media streams
+ */
+ modulepar integer PX_SIP_TS1_BEARER_PORT := 52000;
+
+ /** @desc charstring for port number used by the TS to exchange media streams
+ */
+ modulepar integer PX_SIP_TS1_BEARER_PORT2 := 62000;
+
+ /** @desc charstring for IP address used by the TS to exchange media streams
+ */
+ modulepar charstring PX_SIP_TS1_BEARER_IPADDR := "172.27.1.218";
+ }// group PortsAndAddressesOfTheTS
+
+ // PIXITS in group PortsAndAddressesOfTheTS2 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+ group PortsAndAddressesOfTheTS2 {
+// Ports and addresses of the TS2 (tester), second access
+
+ /** @desc integer for port number used by the TS2 to exchange SIP messages
+ */
+ modulepar integer PX_SIP_TS2_PORT := 5060;
+
+ /** @desc charstring for IP address used by the TS2 to exchange SIP messages
+ */
+ modulepar charstring PX_SIP_TS2_IPADDR := "172.27.1.219";
+
+ /** @desc charstring for identity of the tester local domain
+ */
+ modulepar charstring PX_SIP_TS2_LOCAL_DOMAIN := "172.27.1.219";
+
+ /** @desc charstring for identity of the tester local user
+ */
+ modulepar charstring PX_SIP_TS2_LOCAL_USER := "2911";
+
+ /** @desc charstring for identity of the user with active call diversion service
+ */
+ modulepar charstring PX_SIP_TS2_LOCAL_USER_DIV := "2011";
+
+ /** @desc charstring for identity of the tester local user (format "+"cc+ndc+sn)
+ */
+ modulepar charstring PX_SIP_TS2_LOCAL_USER_FULL := "+ 33 4 92941111";
+
+ /** @desc integer for port number used by the TS to exchange media streams
+ */
+ modulepar integer PX_SIP_TS2_BEARER_PORT := 53000;
+
+ /** @desc integer for port number used by the TS to exchange media streams
+ */
+ modulepar integer PX_SIP_TS2_BEARER_PORT2 := 63000;
+
+ /** @desc charstring for IP address used by the TS to exchange media streams
+ */
+ modulepar charstring PX_SIP_TS2_BEARER_IPADDR := "172.27.1.218";
+
+ }//group PortsAndAddressesOfTheTS2
+
+ // PIXITS in group PortsAndAddressesOfTheTS3 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+ group PortsAndAddressesOfTheTS3 {
+// Ports and addresses of the TS3 (tester), second access
+ /** @desc integer for Port number used by the TS3 to exchange SIP messages
+ */
+ modulepar integer PX_SIP_TS3_PORT := 5060;
+
+ /** @desc charstring for IP address used by the TS3 to exchange SIP messages
+ */
+ modulepar charstring PX_SIP_TS3_IPADDR := "172.27.1.220";
+
+ /** @desc charstring for identity of the tester local domain
+ */
+ modulepar charstring PX_SIP_TS3_LOCAL_DOMAIN := "172.27.1.220";
+
+ /** @desc charstring for identity of the tester local user
+ */
+ modulepar charstring PX_SIP_TS3_LOCAL_USER := "2012";
+
+ } //group PortsAndAddressesOfTheTS3
+
+ group RegistrationParameters {
+
+ /** @desc boolean for the SIP user if it have to register itself before executing a test case
+ */
+ modulepar boolean PX_SIP_REGISTRATION := false;
+
+ /** @desc integer for the minimun SIP user registration expires-value
+ */
+ modulepar integer PX_SIP_REGISTRATION_exp_min := 3600;
+
+ /** @desc charstring for REGISTRAR domain
+ */
+ modulepar charstring PX_SIP_SUT_REGISTRAR_DOMAIN := "172.27.16.115";
+ }// group Registration parameters
+
+ group ReleaseCause{
+ /** @desc integer for Release cause to be used in BYE and in Failure messages
+ */
+ modulepar integer PX_SIP_BYE_CAUSE := 16;
+ }//group ReleaseCause
+
+ group RTPStreamControlAndCheck{
+ /** @desc boolean for True, if conversation check is implemented.
+ */
+ modulepar boolean PX_SIP_CheckConversation := false;
+
+ /** @desc boolean for True, if DTMF check is implemented.
+ */
+ modulepar boolean PX_SIP_CheckDTMF := false;
+
+ /** @desc boolean for True, if Announcement sending is implemented.
+ */
+ modulepar boolean PX_SIP_SendAnnouncement := false;
+
+ /** @desc boolean for True, if ringing check is implemented.
+ */
+ modulepar boolean PX_SIP_CheckRinging := false;
+ }//group RTPStreamControlAndCheck
+
+ group SwitchToEnableAuthentication {
+ /** @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages
+ */
+ modulepar boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
+
+ /** @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages
+ */
+ modulepar boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
+ }//group SwitchToEnableAuthentication
+
+ // PIXITS in group ParametersForHTTP_Authentication can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+ group ParametersForHTTP_Authentication {
+
+ /** @desc charstring for RFC 2617 clause 3-2-1 qop options:
+ * Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
+ * value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
+ */
+ modulepar charstring PX_SIP_SUT_UE1_QOP := "auth";
+
+ /** @desc charstring for RFC 2617 clause 3-2-2 username:
+ * The name of user in the specified realm
+ */
+ modulepar charstring PX_SIP_SUT_UE1_USERNAME := "abcd";
+
+ /** @desc charstring for RFC 2617 clause 3-2-2-2 passwd: A known shared secret, the password of user of the specified username
+ */
+ modulepar charstring PX_SIP_SUT_UE1_PASSWD := "1234";
+
+ /** @desc charstring for RFC 2617 3-2-1 qop options:
+ * Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
+ * value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
+ */
+ modulepar charstring PX_SIP_SUT_UE2_QOP := "auth";
+
+ /** @desc charstring for RFC 2617 clause 3-2-2 username:
+ * The name of user in the specified realm
+ */
+ modulepar charstring PX_SIP_SUT_UE2_USERNAME := "abcd";
+
+ /** @desc charstring for RFC 2617 clause 3-2-2-2 passwd: A known shared secret, the password of user of the specified username
+ */
+ modulepar charstring PX_SIP_SUT_UE2_PASSWD := "1234";
+
+ }//group ParametersForHTTP_Authentication
+
+ group SIP_Timers {
+ /** @desc float for T1 RTT estimate (500 ms)
+ */
+ modulepar float PX_SIP_T1 := 0.5;
+
+ /** @desc float for T2 Maximum retransmit interval for non-INVITE requests and INVITE response (4000 ms)
+ */
+ modulepar float PX_T2 := 4.0;
+
+ /** @desc float for T4 Maximum duration a message will remain in the network
+ */
+ modulepar float PX_T4 := 1.0;
+
+ /** @desc float for TDELAY default value for timeout on outgoing SIP request (ie 64*T1)
+ */
+ modulepar float PX_SIP_TF := 32.0;
+
+ /** @desc float for TWait default value for waiting an operator action
+ */
+ modulepar float PX_SIP_TWAIT := 30.0;
+
+ /** @desc float for TAck default value for waiting an acknowledgement
+ */
+ modulepar float PX_SIP_TACK := 8.0;
+
+ /** @desc float for TResp default value for waiting for a response from the IUT
+ */
+ modulepar float PX_SIP_TRESP := 15.0;
+
+ /** @desc float for TNoAct default value for waiting no message from the IUT
+ * Value given for PX_TNOACT should be less than value of
+ * SHORT_REGISTRATION constant (which is currently "3" (seconds))
+ */
+ modulepar float PX_SIP_TNOACT := 1.0;
+
+ /** @desc float for TSYNC default value to synchronise ptc
+ */
+ modulepar float PX_SIP_TSYNC := 10.0;
+
+ /** @desc float for TGUARD default value for an extra long timer to limit test execution
+ */
+ modulepar float PX_SIP_TGUARD := 120.0;
+
+ /** @desc float for TRespRetention minimum time that a Proxy will wait before sending a final response
+ */
+ modulepar float PX_TRespRetention := 1.0;
+ }//group SIP_Timers
+ } //group SIP_PIXITparameters
+} // end module LibSip_PIXITS
/v1.7.0/ttcn/LibSip_PIXITS.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/ttcn/LibSip_Steps.ttcn
===================================================================
--- v1.7.0/ttcn/LibSip_Steps.ttcn (nonexistent)
+++ v1.7.0/ttcn/LibSip_Steps.ttcn (revision 524)
@@ -0,0 +1,4352 @@
+/*
+ * @author STF 346, STF366, STF368, STF369
+ * @version $Id$
+ * @desc This module provides the types used by the test component
+ * for SIP-IMS tests.
+ */
+
+module LibSip_Steps //MRO
+{
+ //LibCommon
+ import from LibCommon_Sync all ;
+ import from LibCommon_VerdictControl all ;
+ //LibSip
+ import from LibSip_SIPTypesAndValues all;
+ import from LibSip_SDPTypes all;
+ import from LibSip_Templates all;
+ import from LibSip_Interface all;
+ import from LibSip_PIXITS all;
+ import from LibSip_XMLTypes all;
+
+group externalfunctions {
+
+ //Return random charstring
+ external function fx_rndStr() return charstring;
+ // Return the equivalent string in lower case
+ external function fx_putInLowercase(charstring par_string) return charstring;
+
+ external function fx_getIpAddr(charstring host_name) return charstring;
+
+ // External function to generate a digest response.
+ // References:
+ // * RFC 2617 HTTP Authentication: Basic and Digest Access
+ // Authentication, and
+ // * RFC 1321 The MD5 Message-Digest Algorithm
+ // See RFC 2617, chapter 5 Sample implementation, for example usage, as
+ // the signature of calculateDigestResponse is according to the example
+ // given in the RFC.
+ //
+ external function fx_calculateDigestResponse(
+ charstring nonce,
+ charstring cnonce,
+ charstring user,
+ charstring realm,
+ charstring passwd,
+ charstring alg,
+ charstring nonceCount,
+ charstring method,
+ charstring qop,
+ charstring URI,
+ charstring HEntity) return charstring;
+
+}
+
+group ParameterOperations {
+
+ /**
+ *
+ * @desc function to generate a 32 bits random number as a charstring for tag field
+ * (used as e.g.: tag in from-header field, or branch parameter in via header)
+ * @return random value with at least 32 bits of randomness
+ *
+ */
+ function f_getRndTag() return charstring
+ {
+ var charstring tag_value;
+ //tag_value is initialized with a random value with at least 32 bits of randomness
+ // 4294967296 is a 32 bits integer
+ tag_value := fx_rndStr()&fx_rndStr();
+ return(tag_value);
+ }
+
+ /**
+ *
+ * @desc Function to prepare credentials for request that has an empty
+ * entity body such as a REGISTER message.
+ * @param p_userprofile to get important parameters
+ * @return Credentials field
+ */
+ function f_calculatecCredentials_empty(in SipUserProfile p_userprofile) return Credentials
+ {
+ var template Credentials v_result;
+
+ var charstring v_nonce := "";
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+
+ var charstring v_realm := p_userprofile.registrarDomain;
+
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+ var charstring v_response := "";
+
+ // Construct credentials for an Authorization field of a request.
+ v_result :=
+ {
+ digestResponse :=
+ {
+ { id := "username", paramValue := v_username },
+ { id := "realm", paramValue := v_realm },
+ { id := "uri", paramValue := v_uri },
+ { id := "nonce=""""", paramValue := omit }, // already enclosed to " characters
+ { id := "response=""""", paramValue := omit } // already enclosed to " characters
+ }};
+
+ return valueof(v_result);
+ }
+
+
+ /**
+ *
+ * @desc Function to calculate credentials for request that has an empty
+ * entity body such as a REGISTER message.
+ * @param p_userprofile to get important parameters
+ * @param p_method (can be "REGISTER", "INVITE",....)
+ * @param p_challenge parameter from 4xx response
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecCredentials(in SipUserProfile p_userprofile, in charstring p_method,
+ in CommaParam_List p_challenge) return Credentials
+ {
+ var template Credentials v_result;
+
+ var charstring v_nonce := "";
+
+ // Use a fixed client nonce.
+ var charstring v_cnonce := "1317265";
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+
+ var charstring v_realm;
+
+ // RFC 2617 3.2.2.2 passwd:
+ // A known shared secret, the password of user of the specified
+ // username.
+ var charstring v_passwd := p_userprofile.passwd;
+
+ var charstring v_algorithm;
+
+ // Use a fixed nonce count.
+ const charstring c_nonceCount := "00000002";
+
+ var charstring v_qop := p_userprofile.qop;
+
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+ // MD5 hash of empty entity body.
+ const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+
+ var charstring v_response;
+ var charstring v_opaque;
+
+
+ // extract nonce, realm, algorithm, and opaque from challenge
+
+ v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+ v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+ v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+
+ // calculate a digest response for the Authorize header
+ v_response := fx_calculateDigestResponse(
+ v_nonce,
+ v_cnonce,
+ v_username,
+ v_realm,
+ v_passwd,
+ v_algorithm,
+ c_nonceCount,
+ p_method,
+ v_qop,
+ v_uri,
+ c_hEntity);
+
+ // Construct credentials for an Authorization field of a request.
+ v_result :=
+ {
+ digestResponse :=
+ {
+ { id := "username", paramValue := v_username },
+ { id := "realm", paramValue := v_realm },
+ { id := "nonce", paramValue := v_nonce },
+ { id := "uri", paramValue := v_uri },
+ { id := "response", paramValue := v_response },
+ { id := "algorithm=md5", paramValue := omit }, // algorithm is not enclosed to " characters
+ { id := "cnonce", paramValue := v_cnonce },
+ { id := "opaque", paramValue := v_opaque }, // already enclosed to " characters
+ { id := "qop="&v_qop, paramValue := omit },//qop
+ { id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
+ }
+ };
+
+ return valueof(v_result);
+ }
+
+ /**
+ *
+ * @desc Function to calculate credentials for request that has an empty
+ * entity body such as a REGISTER message. NO RESPONSE value to cause an error!
+ * @param p_userprofile to get important parameters
+ * @param p_method (can be "REGISTER", "INVITE",....)
+ * @param p_challenge parameter from 4xx response
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecCredentials_wo_response(in SipUserProfile p_userprofile, in charstring p_method,
+ in CommaParam_List p_challenge) return Credentials
+ {
+ var Credentials v_result;
+
+ var charstring v_nonce := "";
+
+ // Use a fixed client nonce.
+ var charstring v_cnonce := "1317265";
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+
+ var charstring v_realm;
+
+ // RFC 2617 3.2.2.2 passwd:
+ // A known shared secret, the password of user of the specified
+ // username.
+ var charstring v_passwd := p_userprofile.passwd;
+
+ var charstring v_algorithm;
+
+ // Use a fixed nonce count.
+ const charstring c_nonceCount := "00000002";
+
+ var charstring v_qop := p_userprofile.qop;
+
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+ // MD5 hash of empty entity body.
+ const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+
+ var charstring v_response;
+ var charstring v_opaque;
+
+
+ // extract nonce, realm, algorithm, and opaque from challenge
+
+ v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+ v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+ v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+
+ // calculate a digest response for the Authorize header
+ v_response := fx_calculateDigestResponse(
+ v_nonce,
+ v_cnonce,
+ v_username,
+ v_realm,
+ v_passwd,
+ v_algorithm,
+ c_nonceCount,
+ p_method,
+ v_qop,
+ v_uri,
+ c_hEntity);
+
+ // Construct credentials for an Authorization field of a request.
+ v_result :=
+ {
+ digestResponse :=
+ {
+ { id := "username", paramValue := v_username },
+ { id := "realm", paramValue := v_realm },
+ { id := "nonce", paramValue := v_nonce },
+ { id := "uri", paramValue := v_uri },
+// { id := "response", paramValue := v_response }, // not included to cause an error
+ { id := "algorithm=md5", paramValue := omit }, // algorithm is not enclosed to " characters
+ { id := "cnonce", paramValue := v_cnonce },
+ { id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
+ { id := "qop="&v_qop, paramValue := omit },//qop
+ { id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
+ }
+ };
+
+ return v_result;
+ }
+
+ /**
+ *
+ * @desc Function to calculate credentials for response 401 - WWW-Authorization
+ * @param p_qop of the peer UE (alternatively )
+ * @param p_authorization parameter from 1st REGISTER request
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecChallenge_forWWWAuthorizationBody(in charstring p_qop, in Authorization p_authorization) return Challenge
+ {
+ var CommaParam_List v_challenge;
+
+ if (ischosen(p_authorization.body[0].digestResponse))
+ {v_challenge := p_authorization.body[0].digestResponse}
+ else {v_challenge := p_authorization.body[0].otherResponse.authParams};
+
+ return (f_calculatecChallenge_forWWWAuthorization(p_qop,v_challenge));
+ }
+
+ /**
+ *
+ * @desc Function to calculate credentials for response 401 - WWW-Authorization
+ * @param p_qop of the peer UE (alternatively )
+ * @param p_challenge parameter from 1st REGISTER request
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecChallenge_forWWWAuthorization(in charstring p_qop, in CommaParam_List p_challenge) return Challenge
+ {
+ var Challenge v_result;
+
+ var charstring v_realm;
+
+ var charstring v_qop := p_qop;
+
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+
+ // Construct credentials for an Authorization field of a request.
+ v_result :=
+ {
+ digestCln :=
+ {
+ { id := "realm", paramValue := v_realm },
+ { id := "nonce", paramValue := "0edff6c521cc3f407f2d9e01cf6ed82b"},
+ { id := "algorithm", paramValue := c_algorithm }, // algorithm is not enclosed with " characters
+ { id := "ck", paramValue := "00112233445566778899aabbccddeeff" },
+ { id := "ik", paramValue := "ffeeddccbbaa99887766554433221100" }, // already enclosed to " characters
+ { id := "qop="""&v_qop&"""", paramValue := omit }//qop
+
+ }
+ };
+
+ return v_result;
+ }
+
+ /**
+ *
+ * @desc Function to calculate credentials for request that has an empty
+ * entity body such as a REGISTER message and at the end put different private name
+ * @param p_userprofile to get important parameters
+ * @param p_method (can be "REGISTER", "INVITE",....)
+ * @param p_challenge parameter from 4xx response
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecCredentialsAndChangeUserName(in SipUserProfile p_userprofile, in charstring p_method,
+ in CommaParam_List p_challenge) return Credentials
+ {
+ var Credentials v_result;
+
+ var charstring v_nonce := "";
+
+ // Use a fixed client nonce.
+ var charstring v_cnonce := "1317265";
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+
+ var charstring v_realm;
+
+ // RFC 2617 3.2.2.2 passwd:
+ // A known shared secret, the password of user of the specified
+ // username.
+ var charstring v_passwd := p_userprofile.passwd;
+
+ var charstring v_algorithm;
+
+ // Use a fixed nonce count.
+ const charstring c_nonceCount := "00000002";
+
+ var charstring v_qop := p_userprofile.qop;
+
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+ // MD5 hash of empty entity body.
+ const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+
+ var charstring v_response;
+ var charstring v_opaque;
+
+
+ // extract nonce, realm, algorithm, and opaque from challenge
+
+ v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+ v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+ v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+
+ // calculate a digest response for the Authorize header
+ v_response := fx_calculateDigestResponse(
+ v_nonce,
+ v_cnonce,
+ v_username,
+ v_realm,
+ v_passwd,
+ v_algorithm,
+ c_nonceCount,
+ p_method,
+ v_qop,
+ v_uri,
+ c_hEntity);
+
+ // Construct credentials for an Authorization field of a request.
+ v_result :=
+ {
+ digestResponse :=
+ {
+ { id := "username", paramValue := "DifferentToPrivateUser"},
+ { id := "realm", paramValue := v_realm },
+ { id := "nonce", paramValue := v_nonce },
+ { id := "uri", paramValue := v_uri },
+ { id := "response", paramValue := v_response },
+ { id := "algorithm=md5", paramValue := omit }, // algorithm is not enclosed to " characters
+ { id := "cnonce", paramValue := v_cnonce },
+ { id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
+ { id := "qop="&v_qop, paramValue := omit },//qop
+ { id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
+ }
+ };
+
+ return v_result;
+ }
+
+
+ /**
+ *
+ * @desc Function to check if param related to id from CommanParam_List exist
+ * containing challenge.
+ * @param p_challenge parameter from 4xx response
+ * @param p_id name of parameter("nonce", "realm", "ck", "ik"...)
+ * @return parameter p_id value
+ */
+ function f_checkParamValueFromChallengeIfPresent(in CommaParam_List p_challenge, in charstring p_id) return boolean
+ {
+ var boolean v_result := false;
+ var integer v_len := sizeof(p_challenge);
+ var charstring v_id := fx_putInLowercase(p_id);
+
+ for (var integer i := 0; i < v_len; i := i + 1)
+ {
+ if (fx_putInLowercase(p_challenge[i].id) == v_id)
+ {
+ v_result := true;
+ }
+ }
+
+ return v_result;
+ }
+
+ /**
+ *
+ * @desc Function to check if tag is present in SemicolonParam_List
+ * @param p_param_l SemicolonParam_List
+ * @return boolean true if tag is present
+ */
+ function f_checkTagPresent(SemicolonParam_List p_param_l) runs on SipComponent return boolean {
+ var integer v_numberOfParams;
+ var integer i := 0;
+
+ v_numberOfParams := sizeof (p_param_l);
+ while (i < v_numberOfParams) {
+ if (fx_putInLowercase(p_param_l[i].id) == c_tagId) {
+ return (true);
+ }
+ i := i + 1;
+ }
+ return (false);
+ }
+
+ /**
+ *
+ * @desc Function to extract paramValue related to id from CommanParam_List
+ * containing challenge.
+ * @param p_challenge parameter from 4xx response
+ * @param p_id name of parameter("nonce", "realm",...)
+ * @return parameter p_id value
+ */
+ function f_extractParamValueFromChallenge(in CommaParam_List p_challenge, in charstring p_id) return charstring
+ {
+ var charstring v_result := "";
+ var integer v_len := sizeof(p_challenge);
+ var charstring v_id := fx_putInLowercase(p_id);
+
+ for (var integer i := 0; i < v_len; i := i + 1)
+ {
+ if (fx_putInLowercase(p_challenge[i].id) == v_id)
+ {
+ v_result := p_challenge[i].paramValue;
+ }
+ }
+
+ if (v_result == "")
+ {
+ if(match(p_id,"algorithm"))
+ {
+ v_result := "MD5"
+ }
+ else if(match(p_id,"opaque"))
+ {
+ v_result := ""
+ }
+ else
+ {
+ var charstring v_tmpchar := "Cannot acquire value from credentials.";
+ log ("Cannot acquire value from credentials.");
+ setverdict(inconc);
+ stop;
+ }
+ }
+
+ return v_result;
+ }
+
+}//end group ParameterOperations
+
+group FieldOperations {
+
+ /**
+ *
+ * @desc function adds "Tag"-parameter in "To"-headerfield
+ * @param p_to To header field that should get a Tag parameter
+ *
+ */
+ function f_addTagInTo(inout To p_to) runs on SipComponent
+ {
+ f_addParameterTagIfNotPresent(c_tagId, f_getRndTag(), p_to);
+ }
+
+ /**
+ *
+ * @desc addition of a single parameter in the via header field
+ * @param p_parameter_name name of parameter to be added
+ * @param p_parameter_value value of parameter to be added
+ * @param p_viaBody the via parameter to be extended
+ * @verdict
+ */
+ function f_addParameterIfNotPresent(
+ in charstring p_parameter_name,
+ in charstring p_parameter_value,
+ inout ViaBody p_viaBody)
+
+ {
+ if (ispresent (p_viaBody.viaParams)) {
+ return;
+ }
+ p_viaBody.viaParams := {
+ {
+ p_parameter_name,
+ p_parameter_value
+ }
+ };
+ }
+
+ /**
+ *
+ * @desc function to addd a parameter to the "To" header field (if there is not any parameter)
+ * @param p_parameter_name name of the parameter to be added
+ * @param p_parameter_value value of the paramter to be added
+ * @param p_to "To" header field to be extended
+ * @verdict
+ */
+ function f_addParameterTagIfNotPresent(
+ in charstring p_parameter_name,
+ in charstring p_parameter_value,
+ inout To p_to)
+
+ {
+ if (ispresent (p_to.toParams)) {
+ return;
+ }
+ p_to.toParams := {
+ {
+ p_parameter_name,
+ p_parameter_value
+ }
+ };
+ }
+
+ /**
+ *
+ * @desc function compares the IP address of two hosts
+ * @param p_host1 hostname
+ * @param p_host2 hostname
+ * @return boolean value that is true if the IP addresses are identical
+ * @verdict
+ */
+ function f_equivalentHostAddr(in charstring p_host1, in charstring p_host2) return boolean
+ {
+ //A DNS server may be used
+ return(fx_getIpAddr(p_host1) == fx_getIpAddr(p_host2));
+ }
+
+
+ /**
+ *
+ * @desc function checks if Require contains Precondition
+ * @param p_message (request or response) SIP message to be analysed
+ * @return true if p_id parameter exist
+ */
+ function f_checkRequirePrecondition(in Request p_message)
+ {
+ if (ispresent(p_message.msgHeader.require))
+ {
+ var boolean v_precondition_found:=false;
+ for (var integer v_i:=0; v_i<sizeof(p_message.msgHeader.require.optionsTags); v_i:=v_i+1){
+ if (match(p_message.msgHeader.require.optionsTags[v_i],c_tagPrecond)) {
+ v_precondition_found:=true;
+ }
+ }
+ if (not(v_precondition_found)){
+ setverdict(fail);
+ log("FAIL: precondition not found in Require options list!");
+ }
+ }
+ else
+ {
+ setverdict(fail);
+ log("FAIL: Require options is not present!");
+ }
+ }
+
+ /**
+ *
+ * @desc function checks if P-Charging-Vector contains a particular parameter
+ * @param p_message (request or response) SIP message to be analysed
+ * @param p_id name of parameter
+ * @return true if p_id parameter exist
+ */
+ function f_checkPChargingVectorHeaderParamId(in Request p_message, charstring p_id) return boolean
+ {
+ var integer v_chargeParamsLen;
+
+ if (ispresent(p_message.msgHeader.pChargingVector)) {
+ for (var integer i:=0; i<sizeof(p_message.msgHeader.pChargingVector.chargeParams); i:=i+1)
+ {if(p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id)
+ {return (true)}
+ };
+ }
+ return (false)
+ }
+
+ /**
+ *
+ * @desc function checks if P-Charging-Vector contains a particular parameter
+ * @param p_message (request or response) SIP message to be analysed
+ * @param p_id name of parameter
+ * @return true if p_id parameter exist
+ */
+ function f_checkPChargingVectorHeaderParamIdResponse(in Response p_message, charstring p_id) return boolean
+ {
+ var integer v_chargeParamsLen;
+
+ if (ispresent(p_message.msgHeader.pChargingVector)) {
+ for (var integer i:=0; i<sizeof(p_message.msgHeader.pChargingVector.chargeParams); i:=i+1)
+ {if(p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id)
+ {return (true)}
+ };
+ }
+ return (false)
+ }
+
+ /**
+ *
+ * @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.hostPort.host;
+
+ if (ispresent(v_SipUrl.hostPort.portField))
+ {
+ v_locAddr.portField := v_SipUrl.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 v_chargeParamsLen;
+
+ if (ispresent(p_message.msgHeader.historyInfo)) {
+ for (var integer i:=0; i<sizeof(p_message.msgHeader.historyInfo.historyInfoList); i:=i+1)
+ {if(p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI)
+ {return (true)}
+ };
+ }
+ return (false)
+ }
+
+ /**
+ *
+ * @desc function returns the Userinfo from a given To header field
+ * @param p_to To header field to be analysed
+ * @return Userinfo from the To header field as a charstring
+ */
+ function f_getUserfromTo(in To p_to) runs on SipComponent return charstring
+ {
+ var SipUrl v_SipUrl;
+
+ if (ischosen(p_to.addressField.nameAddr))
+ {
+ v_SipUrl := p_to.addressField.nameAddr.addrSpec;
+ }
+ else
+ {
+ v_SipUrl := p_to.addressField.addrSpecUnion;
+ }
+
+ return(v_SipUrl.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(inout CSeq p_cSeq_s) return charstring
+ {
+ var charstring v_tag_value;
+ v_tag_value := fx_rndStr()&fx_rndStr();
+ //v_tag_value is initialized with a random value with at least 32 bits of randomness
+ // 4294967296 is a 32 bits integer
+ //v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber );
+ return(v_tag_value);
+ }
+
+ /**
+ *
+ * @desc function give access to the top element of the Path header field.
+ * @param p_Request SIP message to be analysed
+ * @return NameAddr (e.g. <sip:p.home.com>) or omit
+ */
+ function f_getPathHeaderTop(inout Request p_Request) return template NameAddr
+ {
+ if (ispresent(p_Request.msgHeader.path)) {
+ if (sizeof(p_Request.msgHeader.path.pathValues)>0) {
+ return(p_Request.msgHeader.path.pathValues[0].nameAddr)}
+ };
+ return(omit)
+ }
+
+ /**
+ *
+ * @desc function updates first element of a Via headerfield list
+ * @param p_viaBody_List address list of a Via header field
+ * @param p_source_address address to be inserted in the top element
+ */
+ function f_getViaReplyAddr(inout ViaBody_List p_viaBody_List, inout address4SIP p_source_address)
+ runs on SipComponent
+ {
+ var ViaBody v_viaBody;
+ var HostPort v_locAddr;
+ // The address to send message shall be updated after getting information
+ // in the Via header fied and according to 18.2.2
+ v_viaBody := p_viaBody_List[0];
+
+ // received parameter has to be addded to the via hader field
+ // Be careful it could be an Host name and not an IP Address
+
+ // TODO produce an error because of unkown host exception
+ //if (not f_equivalentHostAddr(valueof (v_viaBody.sentBy.host),
+ // valueof (p_source_address.host))) {
+ f_addParameterIfNotPresent(
+ c_receivedId,
+ valueof (p_source_address.host),
+ v_viaBody);
+ //}
+ if (ispresent(v_viaBody.sentBy.portField))
+ {
+ p_source_address.portField := valueof(v_viaBody.sentBy.portField);
+ }
+ else
+ {
+ p_source_address.portField := c_defaultSipPort;
+ }
+ }
+
+ /**
+ *
+ * @desc functions give access to an element of the Route header field (record).
+ * @param p_message (request) SIP message to be analysed
+ * @param p_index index of Route record element to be retrieved
+ * @return HostPort value of the Route element or omit
+ */
+ function f_getRouteHeaderElementAddressFromRequest(in Request p_message, in integer p_index) return HostPort
+ {
+ if (ispresent(p_message.msgHeader.route)) {
+ if (sizeof(p_message.msgHeader.route.routeBody)>p_index) {
+ return(p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.hostPort)}
+ };
+ setverdict(fail);
+ return(c_hostport_dummy)
+ }
+
+ /**
+ *
+ * @desc functions give access to an element of the Record-Route header field (record).
+ * @param p_message (request) SIP message to be analysed
+ * @param p_index index of recordRoute record element to be retrieved
+ * @return HostPort value of the Record-Route element or omit
+ */
+ function f_getRecordRouteHeaderElementAddressFromRequest(in Request p_message, in integer p_index) return HostPort
+ {
+ if (ispresent(p_message.msgHeader.recordRoute)) {
+ if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
+ return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.hostPort)}
+ };
+ setverdict(fail);
+ return(c_hostport_dummy)
+ }
+
+ /**
+ *
+ * @desc functions give access to an element of the Record-Route header field (record).
+ * @param p_message (response) SIP message to be analysed
+ * @param p_index index of recordRoute record element to be retrieved
+ * @return HostPort value of the Record-Route element or omit
+ */
+ function f_getRecordRouteHeaderElementAddressFromResponse(in Response p_message, in integer p_index) return HostPort
+ {
+ if (ispresent(p_message.msgHeader.recordRoute)) {
+ if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
+ return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.hostPort)}
+ };
+ setverdict(fail);
+ return(c_hostport_dummy)
+ }
+
+ /**
+ *
+ * @desc functions give access to an element of the Via header field (record).
+ * @param p_message (request) SIP message to be analysed
+ * @param p_index index of via record element to be retrieved
+ * @return HostPort value of the Via element or omit
+ */
+ function f_getViaHeaderElementHostPort(in Request p_message, in integer p_index) return HostPort
+ {
+
+ if (sizeof(p_message.msgHeader.via.viaBody)>p_index) {
+ return(p_message.msgHeader.via.viaBody[p_index].sentBy)}
+ setverdict(fail);
+ return(c_hostport_dummy)
+ }
+
+ /**
+ *
+ * @desc functions give access to an element of the Via header field (record).
+ * @param p_message (response) SIP message to be analysed
+ * @param p_index index of via record element to be retrieved
+ * @return HostPort value of the Via element or omit
+ */ function f_getViaHeaderElementHostPortResponse(in Response p_message, in integer p_index) return HostPort
+ {
+
+ if (sizeof(p_message.msgHeader.via.viaBody)>p_index) {
+ return(p_message.msgHeader.via.viaBody[p_index].sentBy)}
+ setverdict(fail);
+ return(c_hostport_dummy)
+ }
+
+ /**
+ *
+ * @desc function checks indicators if topology hiding (TH) has been applied:
+ * - second element in via-header record has tokenized-by parameter
+ * @param p_Request SIP message to be analysed
+ * @return boolean value (true indicate TH, false otherwise)
+ */
+ function f_topologyHiding(inout Request p_request) runs on SipComponent return boolean
+ {
+ var GenericParam v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0]; // second element
+ if (not v_viaParameter.id == "tokenized-by")
+ {return(false)};
+ return(true)
+ }
+
+ /**
+ *
+ * @desc function checks indicators if topology hiding (TH) has been applied:
+ * - any element in via-header record has tokenized-by parameter
+ * @param Response SIP message to be analysed
+ * @return boolean value (true indicate TH, false otherwise)
+ */
+ function f_topologyHidingResponse(inout Response p_response) runs on SipComponent return boolean
+ {
+ var GenericParam v_viaParameter;
+
+ for (var integer v_i := 0; v_i < sizeof(p_response.msgHeader.via.viaBody); v_i := v_i + 1) {
+
+ v_viaParameter := p_response.msgHeader.via.viaBody[v_i].viaParams[0]; // first parameter
+
+ if (not v_viaParameter.id == "tokenized-by")
+ {return(false)}
+ }
+ return(true);
+
+ }
+
+
+
+group SetHeaders {
+
+
+ /**
+ *
+ * @desc function for setting of component variables related to message header fields
+ * (message type independent: CSeq, contact, via), function uses information from userprofile
+ *
+ * @param p_cSeq_s CSeq parameter
+ * @param p_method method name for cSeq header field
+ */
+ function f_setHeadersGeneral(inout CSeq p_cSeq_s, in charstring p_method) runs on SipComponent
+ {
+ p_cSeq_s.fieldName := CSEQ_E;
+ p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
+ p_cSeq_s.method := p_method ;
+ vc_cSeq := p_cSeq_s;
+
+ vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
+ vc_branch := c_branchCookie & f_getRndTag();
+ vc_via:={
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+ }// end function f_setHeadersGeneral
+
+
+
+ /**
+ *
+ * @desc function for setting of component variables related to message header fields
+ * (message type independent: CSeq, contact, via), function uses information from userprofile
+ *
+ * @param p_cSeq_s CSeq parameter
+ * @param p_method method name for cSeq header field
+ */
+ function f_setHeadersACK() runs on SipComponent
+ {
+ // vc_requestUri.hostPort := vc_reqHostPort;
+ if(vc_response.statusLine.statusCode >= 200 and vc_response.statusLine.statusCode <= 299 ) //ref. RFC3261 8.1.1.7 Via
+ {
+ vc_branch := c_branchCookie & f_getRndTag();
+ }
+ vc_via:={
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+ }// end function f_setHeadersGeneral
+
+ /**
+ *
+ * @desc setting of general and basic Bye header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersBYE(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "BYE"); // cseq, contact, branch, via
+
+ //vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ f_addTagInTo(vc_to);
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersBYE
+
+ /**
+ *
+ * @desc setting of general and basic CANCEL header fields
+ * @param p_cSeq_s
+ */
+ function f_setHeadersCANCEL(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+
+ p_cSeq_s.method := "CANCEL";
+ //vc_branch := c_branchCookie & f_getRndTag(); // STF 406: CANCEL and ACK should have the same branch as the INVITE
+ vc_via:={
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+ }// end function f_setHeadersCANCEL
+
+ /**
+ *
+ * @desc function sets header field for the next outgoing REGISTER message
+ * @param p_cSeq_s CSeq parameter to be applied
+ */
+ function f_setHeaders_REGISTER(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ var SemicolonParam_List v_params;
+
+ f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
+
+ vc_requestUri:=
+ {
+ scheme := c_sipScheme,
+ userInfo := omit,
+ hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit},
+ urlParameters := omit,
+ headers := omit
+ };
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+ vc_callIdReg := vc_callId; //remember callId for de-registration
+
+
+ vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+ vc_cancel_To := vc_to;
+ v_params := {{id:=c_tagId, paramValue:=f_getRndTag()}}
+ vc_from := {fieldName := FROM_E,
+ addressField :=vc_to.addressField,
+ fromParams := v_params
+ };
+
+ if(not vc_firstREGISTER_sent)
+ {
+ v_params := {{id:=c_expiresId, paramValue:=c_shortRegistration}};
+ vc_contact.contactBody.contactAddresses[0].contactParams := v_params;
+ }
+
+ vc_firstREGISTER_sent := true;//f_setHeaders_Register is called in deREGISTER function
+
+ vc_authorization :=
+ {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials_empty(vc_userprofile)}
+ }
+
+ vc_via_REG := vc_via;
+ }// end function setHeaders_REGISTER
+
+ /**
+ *
+ * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
+ * @verdict
+ */
+ function f_setHeaders_2ndREGISTER(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ var CommaParam_List v_challenge;
+
+ //Increment CSeq sequence number
+ p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
+ vc_cSeq := p_cSeq_s;
+
+ vc_requestUri:=
+ {
+ scheme := c_sipScheme,
+ userInfo := omit,
+ hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit},
+ urlParameters := omit,
+ headers := omit
+ };
+
+ //new branch tag due to different branch tag in new REGISTER method
+ vc_branch := c_branchCookie & f_getRndTag();
+
+ vc_via_REG :={
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ // Extract challenge and calculate credentials for a response.
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
+
+
+ // Prepair right answer
+ vc_authorization :=
+ {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)}
+ }
+
+ }// end function f_setHeaders_2ndREGISTER
+
+ /**
+ *
+ * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
+ * NO response in Authorization header to cause an error
+ * @verdict
+ */
+ function f_setHeaders_2ndREGISTER_wo_response() runs on SipComponent
+ {
+ var CommaParam_List v_challenge;
+
+ vc_branch := c_branchCookie & f_getRndTag();
+
+ vc_via_REG :={
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ if(ischosen(vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge))
+ // Extract challenge and calculate credentials for a response.
+ {
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+ }
+ else
+ {
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
+ }
+
+ // Increment CSeq sequence number
+ vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+
+ // Prepair right answer
+ vc_authorization :=
+ {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)}
+ }
+
+ }// end function f_setHeaders_2ndREGISTER_wo_response
+
+ /**
+ *
+ * @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER
+ * @verdict
+ */
+ function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName() runs on SipComponent
+ {
+ var CommaParam_List v_challenge;
+
+ vc_branch := c_branchCookie & f_getRndTag();
+
+ vc_requestUri:=
+ {
+ scheme := c_sipScheme,
+ userInfo := omit,
+ hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit},
+ urlParameters := omit,
+ headers := omit
+ };
+
+ vc_via_REG :={
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ // Extract challenge and calculate credentials for a response.
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+
+ // Increment CSeq sequence number
+ vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+
+ // Prepair right answer
+ vc_authorization :=
+ {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)}
+ }
+
+ }// end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName
+
+
+ /**
+ *
+ * @desc function sets header fields for the next outgoing REGISTER (de-registration)
+ * @param p_cSeq_s cSeq to be used
+ * @verdict
+ */
+ function f_setHeaders_deREGISTER(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ var SemicolonParam_List v_params;
+
+ f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
+
+ vc_requestUri:=
+ {
+ scheme := c_sipScheme,
+ userInfo := omit,
+ hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit},
+ urlParameters := omit,
+ headers := omit
+ };
+ vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+ v_params := {{id:=c_tagId, paramValue:=f_getRndTag()}}
+ vc_from := {fieldName := FROM_E,
+ addressField :=vc_to.addressField,
+ fromParams := v_params
+ };
+
+ vc_contact :=
+ {
+ fieldName := CONTACT_E,
+ contactBody := {wildcard := "*" }
+ };
+ } // end function f_setHeaders_deREGISTER
+
+
+ /**
+ *
+ * @desc setting of general and basic Invite header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersINVITE(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via
+
+ vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersINVITE
+
+ /**
+ *
+ * @desc setting of general and basic Update header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersUPDATE(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "UPDATE"); // cseq, contact, branch, via
+
+ vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersUPDATE
+
+ /**
+ *
+ * @desc setting of general and basic Message header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersMESSAGE(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via
+
+ vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersMESSAGE
+
+ /**
+ *
+ * @desc setting of general and basic Notify header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersNOTIFY(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersNOTIFY
+
+ /**
+ *
+ * @desc setting of general and basic Publish header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersPUBLISH(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "PUBLISH"); // cseq, contact, branch, via
+
+ //after SUBSCRIBE message callid shall be same
+ //vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersPUBLISH
+
+ /**
+ *
+ * @desc function sets header field for the next outgoing SUBSCRIBE message
+ * @param p_cSeq_s CSeq parameter to be applied
+ */
+ function f_setHeaders_SUBSCRIBE(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ var SemicolonParam_List v_params;
+
+ f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
+
+ vc_requestUri:=valueof(m_SipUrl_currDomain(vc_userprofile));
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr
+ }
+
+ vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+ vc_cancel_To := vc_to;
+ v_params := {{id := c_tagId, paramValue := f_getRndTag()}};
+ vc_from := {
+ fieldName := FROM_E,
+ addressField := vc_to.addressField,
+ fromParams := v_params
+ };
+
+ }// end function setHeaders_SUBSCRIBE
+
+ /**
+ *
+ * @desc setting of general and basic Subscribe header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersSUBSCRIBE(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
+
+ vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersMESSAGE
+
+ /**
+ *
+ * @desc setting of general and basic REFER header fields
+ * in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersREFER(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via
+
+ //vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.hostPort;
+
+ }// end function f_setHeadersREFER
+
+ /**
+ *
+ * @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer
+ * @param p_Request REGISTER that has been received
+ */
+ function f_setHeadersOnReceiptOfREGISTER(Request p_Request)
+ runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_callId := p_Request.msgHeader.callId;
+ vc_caller_From := vc_from;
+ f_addTagInTo(vc_to);
+ vc_caller_To := vc_to;
+ vc_requestUri := p_Request.requestLine.requestUri;
+
+ vc_cancel_To := p_Request.msgHeader.toField;
+
+ if (ispresent(p_Request.msgHeader.contact) and (not ischosen(p_Request.msgHeader.contact.contactBody.wildcard))) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams};
+
+ vc_callee_From := {fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams};
+
+ if (ispresent(p_Request.msgHeader.authorization)) {
+ vc_authorization := p_Request.msgHeader.authorization;
+ };
+
+ } // end f_setHeadersOnReceiptOfREGISTER
+
+ /**
+ *
+ * @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer
+ * @param p_Request SUBSCRIBE that has been received
+ */
+ function f_setHeadersOnReceiptOfSUBSCRIBE(Request p_Request)
+ runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_callId := p_Request.msgHeader.callId;
+ vc_caller_From := vc_from;
+ f_addTagInTo(vc_to);
+ vc_caller_To := vc_to;
+ vc_requestUri := p_Request.requestLine.requestUri;
+
+ vc_cancel_To := p_Request.msgHeader.toField;
+
+ if (ispresent(p_Request.msgHeader.contact)) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams};
+
+ vc_callee_From := {fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams};
+
+ } // end f_setHeadersOnReceiptOfSUBSCRIBE
+
+ 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 (ispresent(p_Request.msgHeader.contact)) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams};
+
+ vc_callee_From := {fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams};
+
+ } // end f_setHeadersOnReceiptOfSUBSCRIBE
+
+ /**
+ *
+ * @desc function reads all necessary headers from
+ * the received INVITE message and generate the tag for the answer
+ * @param p_Request received INVITE message
+ * @verdict
+ */
+ function f_setHeadersOnReceiptOfINVITE(Request p_Request) runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_callId := p_Request.msgHeader.callId;
+
+ vc_requestUri2 := p_Request.requestLine.requestUri;
+
+ vc_cancel_To := p_Request.msgHeader.toField;
+ f_addTagInTo(vc_to);
+ vc_caller_From := vc_from;
+ vc_caller_To := vc_to;
+
+ if (ispresent(p_Request.msgHeader.contact)) {
+ vc_reqHostPort :=
+ f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ };
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams};
+
+ vc_callee_From := {fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams};
+
+ if (ispresent(p_Request.msgHeader.privacy)) {
+ vc_privacy := p_Request.msgHeader.privacy;
+ };
+
+ if (ispresent(p_Request.messageBody)) {
+ //cleaning of attributes before assignment
+ if (ispresent(vc_sdp_remote.media_list))
+ {
+ var integer v_length := sizeof(vc_sdp_remote.media_list);
+ for (var integer i:=0; i<v_length; i:=i+1)
+ {
+ if (ispresent(vc_sdp_remote.media_list[i].attributes))
+ {
+ vc_sdp_remote.media_list[i].attributes := omit ;
+ }
+ };
+ }
+
+ // save SDP if present
+ if ( ischosen(p_Request.messageBody.sdpMessageBody))
+ {
+ vc_sdp_remote := p_Request.messageBody.sdpMessageBody;
+ vc_sdp_remote_is_valid := true;
+ f_prepare_SDP_answer();
+ };
+
+ // save XML if present
+ if ( ischosen(p_Request.messageBody.xmlBody))
+ {
+ vc_xml_remote := p_Request.messageBody.xmlBody;
+ }
+
+ if ( ischosen(p_Request.messageBody.mimeMessageBody))
+ {
+
+ for (var integer j:=0; j<sizeof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j:=j+1){
+ if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_sdpAplication))
+ {
+ vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
+ vc_sdp_remote_is_valid := true;
+ f_prepare_SDP_answer();
+ };
+ if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_xmlAplication))
+ {
+ vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
+ };
+ }
+ }
+ };
+
+ if (ispresent(p_Request.msgHeader.supported.optionsTags)) {
+ for (var integer i := sizeof(p_Request.msgHeader.supported.optionsTags); i>0; i:=i-1)
+ {
+ if (p_Request.msgHeader.supported.optionsTags[i-1]=="100rel")
+ { vc_supported_100rel := true };
+ if (p_Request.msgHeader.supported.optionsTags[i-1]=="precondition")
+ { vc_supported_precondition := true }
+ }
+ };
+
+ } // end f_setHeadersOnReceiptOfINVITE
+
+ /**
+ *
+ * @desc function reads header field of a received BYE message
+ * @param p_Request received BYE
+ */
+ function f_setHeadersOnReceiptOfBYE(Request p_BYE_Request)
+ runs on SipComponent
+ {
+
+ f_setHeadersOnReceiptOfRequest(p_BYE_Request);
+ vc_callId := p_BYE_Request.msgHeader.callId;
+
+ } // end f_setHeadersOnReceiptOfBYE
+
+ /**
+ *
+ * @desc function reads header field from an incoming Request message
+ * @param p_Request received Request message
+ */
+ function f_setHeadersOnReceiptOfRequest(Request p_Request) runs on SipComponent {
+ vc_request := p_Request;
+ vc_callId := p_Request.msgHeader.callId;
+ vc_cSeq := p_Request.msgHeader.cSeq;
+ vc_iut_CSeq := p_Request.msgHeader.cSeq;
+ vc_from := p_Request.msgHeader.fromField;
+ vc_caller_From := p_Request.msgHeader.fromField;
+ vc_to := p_Request.msgHeader.toField;
+ vc_caller_To := p_Request.msgHeader.toField;
+ vc_via := p_Request.msgHeader.via;
+ // update sent_label according to received via header field
+ f_getViaReplyAddr(vc_via.viaBody, vc_sent_label);
+
+ // Catch route
+ vc_boo_recordRoute:=false;
+
+ //add tag field into To header if tag is not present
+ if (not(ispresent(p_Request.msgHeader.toField.toParams)))
+ {
+ vc_to.toParams := {{id := c_tagId, paramValue := f_getRndTag()}};
+ vc_caller_To := vc_to;
+ }
+ if (ispresent(p_Request.msgHeader.recordRoute))
+ {
+ vc_boo_recordRoute:=true;
+ vc_recordRoute := p_Request.msgHeader.recordRoute;
+ }
+ } // end f_setHeadersOnReceiptOfRequest
+
+ /**
+ *
+ * @desc functions reads header fields from an incoming Response message
+ * @param p_cSeq
+ * @param p_response received response message
+ * @verdict
+ */
+ function f_setHeadersOnReceiptOfResponse(inout CSeq p_cSeq, Response p_response) runs on SipComponent
+ {
+ var integer v_i, v_j, v_nbroute;
+ var Contact v_contact; //only for local purpose
+
+ vc_response := p_response;
+ //vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq
+ vc_to :=p_response.msgHeader.toField;
+ vc_from :=p_response.msgHeader.fromField;
+ vc_caller_To := vc_to;
+ vc_caller_From := vc_from;
+
+ if (ispresent(p_response.msgHeader.contact))
+ {
+ v_contact := p_response.msgHeader.contact;
+ if (ischosen(v_contact.contactBody.contactAddresses))
+ {
+ vc_reqHostPort := f_getContactAddr(v_contact.contactBody.contactAddresses[0]);
+ vc_requestUri := f_getContactUri(v_contact.contactBody.contactAddresses[0]);
+ }
+ }
+ else
+ {
+ if (ischosen(vc_to.addressField.nameAddr))
+ {
+ vc_reqHostPort := vc_to.addressField.nameAddr.addrSpec.hostPort;
+ vc_requestUri := vc_to.addressField.nameAddr.addrSpec;
+ }
+ else
+ {
+ vc_reqHostPort := vc_to.addressField.addrSpecUnion.hostPort;
+ vc_requestUri := vc_to.addressField.addrSpecUnion;
+ }
+ }
+
+ vc_callee_To:={fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams};
+
+ vc_callee_From:= {fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams};
+
+ vc_via:= p_response.msgHeader.via;
+
+ // Route Management
+ if (ispresent(p_response.msgHeader.recordRoute))
+ {
+ vc_recordRoute := p_response.msgHeader.recordRoute;
+ v_nbroute := sizeof(vc_recordRoute.routeBody);
+ // copy and reverse the order of the routes in route header
+ for (v_i:=0; v_i<=(v_nbroute - 1); v_i:=v_i+1)
+ {
+ v_j:= v_nbroute - 1 - v_i;
+ vc_route.routeBody[v_j]:=vc_recordRoute.routeBody[v_i];
+ }
+ vc_route.fieldName := ROUTE_E;
+ vc_boo_recordRoute := true;
+ vc_boo_route := true;
+ }
+ else
+ {
+ vc_boo_recordRoute := false;
+ vc_boo_route := false;
+ };
+
+
+ // extentions due to new fields in PRACK and UPDATE messages
+ if (ispresent(p_response.msgHeader.rSeq)) {
+ vc_rAck :=
+ { fieldName := RACK_E,
+ responseNum := valueof(p_response.msgHeader.rSeq.responseNum),
+ seqNumber := valueof(p_response.msgHeader.cSeq.seqNumber),
+ method := valueof(p_response.msgHeader.cSeq.method)
+ };
+ };
+
+ // extentions due to new HistoryInfo fields 180 or 200OK messages
+ if (ispresent(p_response.msgHeader.historyInfo)) {
+ vc_historyInfoList := valueof(p_response.msgHeader.historyInfo.historyInfoList);
+ vc_history_is_valid := true
+ }
+ else {vc_history_is_valid := false};
+
+ //sdpMessageBody answer
+ if (ispresent(p_response.messageBody)) {
+ if ( ischosen(p_response.messageBody.sdpMessageBody))
+ {
+ vc_sdp_remote := p_response.messageBody.sdpMessageBody;
+ vc_sdp_remote_is_valid := true;
+ }
+
+ if ( ischosen(p_response.messageBody.xmlBody))
+ {
+ vc_xml_remote := p_response.messageBody.xmlBody;
+ }
+
+ if ( ischosen(p_response.messageBody.mimeMessageBody))
+ {
+
+ for (var integer j:=0; j<sizeof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j:=j+1){
+ if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_sdpAplication))
+ {
+ vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
+ };
+ if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_xmlAplication))
+ {
+ vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
+ };
+ }
+ }
+ };
+
+ }// 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(inout CSeq p_cSeq, Response p_response) runs on SipComponent
+ {
+ var integer v_i, v_j, v_nbroute;
+ var ServiceRoute v_serviceRoute;
+
+ // Route Management
+ if (ispresent(p_response.msgHeader.serviceRoute))
+ {
+ v_serviceRoute := p_response.msgHeader.serviceRoute;
+ v_nbroute := sizeof(v_serviceRoute.routeBody);
+ // copy and reverse the order of the routes in route header
+ for (v_i:=0; v_i<=(v_nbroute - 1); v_i:=v_i+1)
+ {
+ v_j:= v_nbroute - 1 - v_i;
+ vc_route.routeBody[v_j]:=v_serviceRoute.routeBody[v_i];
+ }
+ vc_route.fieldName := ROUTE_E;
+ vc_route_REG := vc_route;
+ vc_boo_route := true;
+ }
+
+ }// 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(inout CSeq p_cSeq, Request p_request) runs on SipComponent
+ {
+ var integer v_i, v_j, v_nbroute;
+ var Route v_route;
+
+ // Route Management
+ if (ispresent(p_request.msgHeader.route))
+ {
+ v_route := p_request.msgHeader.route;
+ v_nbroute := sizeof(v_route.routeBody);
+ // copy and reverse the order of the routes in route header
+ for (v_i:=0; v_i<=(v_nbroute - 1); v_i:=v_i+1)
+ {
+ v_j:= v_nbroute - 1 - v_i;
+ vc_recordRoute.routeBody[v_j]:=v_route.routeBody[v_i];
+ }
+ vc_recordRoute.fieldName := RECORD_ROUTE_E;
+
+ vc_boo_recordRoute := true;
+ }
+
+ }// 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 {
+
+ if (ispresent(p_sdp.media_list)) {
+ for (var integer j:=0; j<sizeof(p_sdp.media_list); j:=j+1){
+ if (ispresent(p_sdp.media_list[j].attributes)) {
+ for (var integer i:=0; i<sizeof(p_sdp.media_list[j].attributes); i:=i+1){
+ if (match(p_sdp.media_list[j].attributes[i],p_attribute))
+ {return(true);};
+ };
+ }
+ };
+ }
+ if (ispresent(p_sdp.attributes)) {
+ for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){
+ if (match(p_sdp.attributes[j],p_attribute)) {return(true);};
+ };
+ }
+
+ return(false);
+ }
+
+ /**
+ * @desc check if message body include SDP (session level) attribute (2nd parameter)
+ * for any media
+ *
+ */
+ function f_check_session_attribute(in SDP_Message p_sdp, in template SDP_attribute p_attribute) runs on SipComponent return boolean {
+
+ if (ispresent(p_sdp.attributes)) {
+ for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){
+ if (match(p_sdp.attributes[j],p_attribute)) {return(true);};
+ };
+ }
+
+ 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 template SDP_attribute v_attribute := p_attribute;
+
+ // check if the selected attribute is included in the SDP offer (session attributes)
+ if (ispresent(p_sdp.attributes)) {
+ for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){
+ if (match(p_sdp.attributes[j],p_attribute)) {v_attribute := p_sdp.attributes[j];};
+ };
+ }
+
+ // check if the selected attribute is included in the SDP offer (any of the media attributes)
+ else {if (ispresent(p_sdp.media_list)) {
+ for (var integer j:=0; j<sizeof(p_sdp.media_list); j:=j+1){
+ if (ispresent(p_sdp.media_list[j].attributes)) {
+ for (var integer i:=0; i<sizeof(p_sdp.media_list[j].attributes); i:=i+1){
+ if (match(p_sdp.media_list[j].attributes[i],p_attribute))
+ {v_attribute := p_sdp.media_list[j].attributes[i];};
+ };
+ }
+ };
+ }};
+
+ select (valueof(v_attribute))
+ {
+ case (mw_attribute_sendonly) {return(valueof(m_attribute_recvonly));}
+ case (mw_attribute_sendrecv) {return(valueof(m_attribute_sendrecv));}//MRO
+ case (mw_attribute_inactive) {return(valueof(m_attribute_inactive));}//MRO
+ case (mw_attribute_recvonly) {return(valueof(m_attribute_sendonly));}//MRO
+ }
+ return(valueof(m_attribute_sendrecv));//the default return value in case of missing attribute offer
+ }
+
+ /**
+ * @desc check if message body include SDP bandwidth (2nd parameter)
+ * either for the session or a media description
+ */
+ function f_check_bandwidth(in SDP_Message loc_sdp, in template SDP_bandwidth loc_bandw) runs on SipComponent return boolean {
+
+ if (ispresent(loc_sdp.bandwidth)) {
+ for (var integer j:=0; j<sizeof(loc_sdp.bandwidth); j:=j+1){
+ if (match(loc_sdp.bandwidth[j],loc_bandw)) {return(true);};
+ };
+ };
+ if (ispresent(loc_sdp.media_list)) {
+ for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
+ if (ispresent(loc_sdp.media_list[j].bandwidth)) {
+ for(var integer i:=0; i< sizeof(loc_sdp.media_list[j].bandwidth); i:=i+1) {
+ if (match(loc_sdp.media_list[j].bandwidth[i],loc_bandw)) {
+ return(true);};
+ }
+ }
+ };
+ };
+
+ return(false);
+ }
+
+ /**
+ * @desc check if message body include SDP media (2nd parameter)
+ *
+ */
+ function f_check_media(in SDP_Message loc_sdp, in template SDP_media_desc loc_media) runs on SipComponent return boolean {
+
+ if (ispresent(loc_sdp.media_list)) {
+ for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
+ if (match(loc_sdp.media_list[j].media_field.transport,loc_media.media_field.transport) and
+ match(loc_sdp.media_list[j].media_field.fmts,loc_media.media_field.fmts))
+ {return(true);};
+ };
+ }
+ return(false);
+ }
+
+ /**
+ * @desc
+ * check if message body include precondition mechanism (a=des and
+ * a=curr) retrun true, else false
+ * @param loc_sdp SDP message
+ */
+ function f_check_precondition(in SDP_Message loc_sdp) runs on SipComponent return boolean {
+ if (f_check_attribute(loc_sdp, mw_attribute_des) or
+ f_check_attribute(loc_sdp, mw_attribute_curr))
+ {return(true);}
+
+ return(false);
+ }
+
+
+ /**
+ * @desc check if message body include SDP media direction return true, else false
+ *
+ */
+ function f_check_media_direction(in SDP_Message loc_sdp) runs on SipComponent return boolean {
+
+ if (f_check_attribute(loc_sdp, mw_attribute_sendonly) or
+ f_check_attribute(loc_sdp, mw_attribute_recvonly) or
+ f_check_attribute(loc_sdp, mw_attribute_sendrecv) or
+ f_check_attribute(loc_sdp, mw_attribute_inactive))
+ {return(true);}
+
+ return(false);
+ }
+
+ /**
+ * @desc copy media/attribute lines from remote to local SDP variable
+ *
+ */
+ function f_check_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
+ return boolean
+ {
+ var SDP_media_desc v_media := f_prepare_media(loc_sdp,loc_codec);
+ log("log0");
+ if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media)
+ { log("log1"); return false };
+ if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport)
+ { log("log2"); return false };
+ if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts)
+ { log("remote:",vc_sdp_remote.media_list[0].media_field.fmts,"expect:",v_media.media_field.fmts); return false };
+
+ return true
+ }
+
+ /**
+ * @desc replace the first curr media attribute with the given value.
+ * @param p_sdp SDP message to modify
+ * @param p_curr new curr attribute
+ */
+ function f_replace_curr_attribute(inout SDP_Message p_sdp, in SDP_attribute_curr p_curr) {
+ if(ispresent(p_sdp.media_list)) {
+ var integer mn := sizeof(p_sdp.media_list[0].attributes);
+ for(var integer i := 0; i<=mn; i := i+1) {
+ if(ischosen(p_sdp.media_list[0].attributes[i].curr)){
+ p_sdp.media_list[0].attributes[i].curr := p_curr;
+ i:=mn;
+ }
+ }
+ }
+ }
+
+ /**
+ * @desc append new media attribute to the first media description.
+ * @param p_sdp SDP message to modify
+ * @param p_att SDP attribute to appand
+ */
+ function f_append_media_attribute(inout SDP_Message p_sdp, in SDP_attribute p_att) {
+ if(ispresent(p_sdp.media_list)) {
+ var integer mn := sizeof(p_sdp.media_list[0].attributes);
+ p_sdp.media_list[0].attributes[mn] := p_att;
+ }
+ }
+
+
+ /**
+ * @desc append new media to the existing media list in SDP
+ *
+ */
+ function f_append_media(inout SDP_Message loc_SDP, in template SDP_media_desc loc_media)
+ {
+ var integer mn := sizeof(loc_SDP.media_list);
+ loc_SDP.media_list[mn] := valueof(loc_media);
+ }
+
+ /**
+ * @desc repare media/attribute lines
+ *
+ */
+ function f_prepare_media(integer loc_sdp, integer loc_codec) runs on SipComponent
+ return SDP_media_desc
+ {
+ var charstring v_codecs[32] := {
+ "PCMU/8000", "GSM/8000", "G723/8000", "DVI4/8000",
+ "DVI4/16000", "LPC/8000", "PCMA/8000", "G722/8000",
+ "L16/44100/2", "L16/44100", "QCELP/8000", "CN/8000",
+ "MPA/90000", "G728/8000", "DVI4/11025", "DVI4/22050",
+ "G729/8000", "G726-40/8000", "G726-32/8000", "G726-24/8000",
+ "G726-16/8000", "G726D/8000", "G726E/8000", "GSM-EFR/8000",
+ "CelB/90000", "JPEG/90000", "Nv/90000", "H261/90000",
+ "MPV/90000", "MP2T/90000", "H263/90000", "H263-1998/90000"
+ }
+ var SDP_media_desc v_media :=
+ {
+ media_field := {
+ media := "audio",
+ ports := {
+ port_number := 10000,
+ num_of_ports:=omit },
+ transport := "RTP/AVP",
+ fmts := { "0" }
+ }, //m=audio 8500 RTP/AVP 0
+ information := omit,
+ connections := omit,
+ bandwidth := omit,
+ key := omit,
+ attributes := omit
+ };
+
+ if (32<loc_codec or loc_codec<1) {
+ log("Unexpected SDP variant");
+ setverdict(inconc);
+ return (v_media)}
+
+ if (loc_sdp == 1) {}
+ else if (loc_sdp == 2) {
+ v_media.media_field.fmts := {PX_SIP_SDP_dyn}; //{ "98", "0" };
+ v_media.attributes := {{
+ rtpmap := { attr_value := PX_SIP_SDP_dyn & " " & v_codecs[loc_codec-1] } // PX_SIP_SDP_dyn := 98
+ }}
+ } else if (loc_sdp == 3) {
+ v_media.media_field.fmts := { "8" }
+ } else if (loc_sdp == 4) {
+ v_media.media_field.fmts := { "99", "8" };
+ v_media.attributes := {{
+ rtpmap := { attr_value := "99 " & v_codecs[loc_codec-1] }
+ }}
+ } else if (loc_sdp == 5) {
+ v_media.media_field.media := "image";
+ v_media.media_field.transport := "udptl";
+ v_media.media_field.fmts := { "t38" }
+ } else if (loc_sdp == 6) {
+ v_media.media_field.media := "image";
+ v_media.media_field.transport := "tcptl";
+ v_media.media_field.fmts := { "t38" }
+ } else {
+ log("Unexpected SDP variant"); setverdict(inconc)
+ };
+
+ return (v_media);
+ }
+
+ /**
+ * @desc repare media/attribute lines
+ *
+ */
+ function f_prepare_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
+ {
+
+ vc_sdp_local.media_list := {f_prepare_media(loc_sdp,loc_codec)};
+ }
+
+ /**
+ *
+ * @desc function that copy media/attribute lines from remote to local SDP variable
+ */
+ function f_prepare_SDP_answer() runs on SipComponent
+ {
+ var integer mn, cn := 0, i, j, k :=0;
+ var charstring v_PT, v_rtpmap := "";
+ var SDP_attribute_list v_mediaAttributes := {};
+ //increase session version
+ vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
+ // if more than one codec, select the firs one
+ mn:= sizeof(vc_sdp_remote.media_list);
+ for (i :=0; i < mn; i := i+1)
+ {
+ //for every single media
+ if (ispresent(vc_sdp_remote.media_list[i].attributes))
+ {
+ cn := sizeof(vc_sdp_remote.media_list[i].attributes);
+ };
+ if (sizeof(vc_sdp_remote.media_list[i].media_field.fmts)>0)
+ {
+ // select the first one
+ v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0];
+ vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
+ for (j :=0; j<cn; j:=j+1)
+ {
+ if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap))
+ {
+ if (v_PT == regexp(vc_sdp_remote.media_list[i].attributes[j].rtpmap.attr_value, "[ \t]#(0,)([\d]+)*", 0))
+ {
+ v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].
+ rtpmap.attr_value;
+ v_mediaAttributes[k] := {rtpmap := {attr_value := v_rtpmap}};
+ k := k+1;
+ } // else line is not copied
+ }
+ else
+ {
+ // simple copy of attribute
+ v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j];
+ k := k+1;
+ }
+ }
+ vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
+
+ if (ispresent(vc_sdp_local.media_list[i].attributes))
+ {
+ cn := sizeof(vc_sdp_local.media_list[i].attributes);
+ for (j :=0; j<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"};
+ }
+ // b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)
+ else if (ischosen(vc_sdp_local.media_list[i].attributes[j].des))
+ {
+ // invert local/remote status tags
+ if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local")
+ {vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote"};
+ if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote")
+ {vc_sdp_local.media_list[i].attributes[j].des.statusType := "local"};
+ // invert send/recv direction tags
+ if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send")
+ {vc_sdp_local.media_list[i].attributes[j].des.direction := "recv"};
+ if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv")
+ {vc_sdp_local.media_list[i].attributes[j].des.direction := "send"};
+ }
+ // c) simplification: assume no SDP_attribute_conf
+ else if (ischosen(vc_sdp_local.media_list[i].attributes[j].conf))
+ {
+ // todo: handle SDP_attribute_conf
+ }
+ }
+ };
+
+ }
+ }
+ // add handling of prenegotiation, change ports if required etc.
+ //if prenegotiation...
+ }
+
+ /**
+ * @desc reject SDP offer by setting media ports to 0
+ *
+ */
+ function f_reject_SDP_offer() runs on SipComponent
+ {
+ var integer mn, i;
+ f_copy_SDP(); // TO BE DONE with more details!
+ //increase session version
+ vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
+ // if more than one codec, select the firs one
+ mn:= sizeof(vc_sdp_local.media_list);
+ for (i :=0; i < mn; i := i+1)
+ {
+ vc_sdp_local.media_list[i].media_field.ports := {0, omit};
+ vc_sdp_local.media_list[i].attributes := omit; //{};
+ };
+ }
+
+ /**
+ *
+ * @desc copies SDP message elements from remote to local component variable:
+ * - bandwidth
+ * - session version (will be incremented)
+ * - media list
+ * modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
+ * @param p_medianum list position number of the media (if value 0 identifies first media list element)
+ * @param p_direction the new direction attribute to be included in the media entry
+ * @verdict
+ */
+ function f_SIP_modMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
+ {
+ var boolean v_set_direction; // flag indicates if direction attribute has been modified
+ var integer v_mn := 0; // length of media list (number of entries)
+ var integer v_cn := 0; // number of attributes of a media entry
+ var integer i, j, k := 0;
+ var SDP_attribute_list v_mediaAttributes := {}; // collect the media attributes (to be assigned at end of function)
+
+ f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
+
+ // increment session version
+ vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
+
+ // if more than one codec, select the first one
+ v_mn:= sizeof(vc_sdp_local.media_list);
+
+ if (p_medianum == 0) //specific media requested
+ {
+ p_medianum := 1; // start checking from first media
+ };
+ if (p_medianum > 0) //specific media requested
+ {
+ if (not(p_medianum > v_mn))
+ {v_mn := p_medianum}
+ };
+
+ // handling of media list elements
+ for (i :=0; i < v_mn; i := i+1)
+ {
+ v_cn := 0; // initialize the number of attributes of the media list entry
+
+ if (ispresent(vc_sdp_local.media_list)) //media_list is optional
+ {
+// log("vc_sdp_local.media_list[i] ",vc_sdp_local.media_list[i]);
+ if (ispresent(vc_sdp_local.media_list[i].attributes))
+ {
+ v_cn := sizeof(vc_sdp_local.media_list[i].attributes);
+ };
+
+ v_set_direction := false;
+
+ //if (sizeof(vc_sdp_local.media_list[i].media_field.fmts)>1)
+ // select the first one
+ for (j :=0; j<v_cn; j:=j+1)
+ {
+ if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly)
+ or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly)
+ or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive)
+ or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv))
+ {
+ v_mediaAttributes[k] := valueof(p_direction);
+ v_set_direction := true;
+ }
+ else // non-direction attributes will be copied
+ {
+ v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
+ k := k+1;
+ }
+ }
+
+ if (not v_set_direction)
+ { v_mediaAttributes[k] := valueof(p_direction)};
+ vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
+
+ // }
+ }
+ }
+ // add handling of prenegotiation, change ports if required etc.
+ //if prenegotiation...
+ }
+
+ /**
+ * @desc modify session and media attributes direction
+ *
+ */
+ function f_SIP_modSessionDirection(template SDP_attribute p_direction) runs on SipComponent
+ {
+ var boolean v_set_direction := false;
+ var integer v_mn:= 0, i:=0;
+
+ if (ispresent(vc_sdp_local.attributes))
+ { v_mn:= sizeof(vc_sdp_local.attributes);
+
+ for (i :=0; i < v_mn; i := i+1)
+ {//for every single attribute (that is not omit)
+ if (ischosen(vc_sdp_local.attributes[i].recvonly)
+ or ischosen(vc_sdp_local.attributes[i].sendonly)
+ or ischosen(vc_sdp_local.attributes[i].inactive)
+ or ischosen(vc_sdp_local.attributes[i].sendrecv))
+ {
+ vc_sdp_local.attributes[i] := valueof(p_direction);
+ v_set_direction := true;
+ }
+ }
+ if (not v_set_direction) // if not sent before
+ {
+ vc_sdp_local.attributes[v_mn] := valueof(p_direction);
+ };
+ }
+ else
+ {vc_sdp_local.attributes[0] := valueof(p_direction)};
+ }
+
+ /**
+ * @desc c
+ *
+ */
+
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session/media attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checksetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
+ { var template SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ log(vc_request.messageBody.sdpMessageBody);log(p_direction_in);
+ if (not (ispresent(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in)
+ )))
+ {log("than branch of if");
+ if (
+ match(valueof(p_direction_in),valueof(mw_attribute_sendrecv)) and
+ not(f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
+ f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendonly) or
+ f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_recvonly) or
+ f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_inactive)
+ )
+ ){
+ log("no direction attributes with expectation: ", p_direction_in)
+ }
+ else {setverdict(fail);};}
+ else {setverdict(pass);log("attribute found in message body");};
+ if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
+ {v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
+ f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session/media attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checkResponsesetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
+ { var template SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ log(vc_response.messageBody.sdpMessageBody);log(p_direction_in);
+ if (not (ispresent(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)
+ )))
+ {log("than branch of if");
+ if (
+ match(valueof(p_direction_in),valueof(mw_attribute_sendrecv)) and
+ not(f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
+ f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendonly) or
+ f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_recvonly) or
+ f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_inactive)
+ )
+ ){
+ log("no direction attributes with expectation: ", p_direction_in)
+ }
+ else {setverdict(fail);};}
+ else {setverdict(pass);log("attribute found in message body");};
+ if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
+ {v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);}
+ f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checksetSDPreqDirectionSession(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
+ { var template SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ if (not (ispresent(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in)
+ )))
+ {if (
+ match(valueof(mw_attribute_sendrecv),valueof(p_direction_in)) and
+ not(f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
+ f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendonly) or
+ f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_recvonly) or
+ f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_inactive)
+ )
+ ){
+ log("no direction attributes with expectation: ", p_direction_in)
+ }
+ else {setverdict(fail);};};
+ if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
+ {v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checkResponsesetSDPreqDirectionSession(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
+ { var template SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ if (not (ispresent(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)
+ )))
+ {if (
+ match(valueof(mw_attribute_sendrecv),valueof(p_direction_in)) and
+ not(f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
+ f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendonly) or
+ f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_recvonly) or
+ f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_inactive)
+ )
+ ){
+ log("no direction attributes with expectation: ", p_direction_in)
+ }
+ else {setverdict(fail);};};
+ if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
+ {v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);}
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+
+ /*
+ *
+ * @desc check (from remote) and set (local)the session/media attribute lines on directions
+ * @param p_direction_in attribute to be check
+ * @param p_direction_out attrubyte to be
+ * @return
+ * @verdict
+ */
+ function f_SIP_checkSDPrespDirection(template SDP_attribute p_direction_in) runs on SipComponent
+ {
+ // check incoming SDP attribute
+ if (not (ispresent(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)))
+ {setverdict(fail);};
+ }
+
+ /**
+ * @desc check media/attribute lines from remote
+ *
+ */
+ function f_SIP_checkMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
+ return boolean
+ {
+ var integer v_mn, v_cn := 0, i, j;
+ var boolean v_result := false;
+ //increase session version
+ vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
+ // if more than one codec, select the firs one
+ v_mn:= sizeof(vc_sdp_remote.media_list);
+ if (p_medianum == 0) //specific media requested
+ {
+ p_medianum := 1; // start checking from first media
+ };
+ if (p_medianum > 0) //specific media requested
+ {
+ if (p_medianum > v_mn) {return false}
+ else {v_mn := p_medianum}
+ };
+ for (i :=p_medianum-1; i < v_mn; i := i+1)
+ {
+ //for every single media
+ if (ispresent(vc_sdp_remote.media_list[i].attributes))
+ {
+ v_cn := sizeof(vc_sdp_remote.media_list[i].attributes);
+ log (v_cn);
+ };
+ if (sizeof(vc_sdp_remote.media_list[i].attributes)>0)
+ {
+ // select the first one
+ log(vc_sdp_remote.media_list[i].attributes);
+ for (j :=0; j<sizeof(vc_sdp_remote.media_list[i].attributes); j:=j+1)
+ {
+ log(vc_sdp_remote.media_list[i].attributes[j]);
+ if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly)
+ or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly)
+ or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive)
+ or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv))
+ {
+ if (match(vc_sdp_remote.media_list[i].attributes[j],p_direction))
+ { v_result := true; }
+ else { return false; }
+ }
+
+ //v_result := true; // TODO This is a shortcut since direction attributes are not decoded
+ }
+ }
+ }
+ return v_result
+ }
+
+ /**
+ * @desc copy media/attribute lines from remote to local SDP variable
+ *
+ */
+ function f_copy_SDP() runs on SipComponent
+ {
+ if (ispresent(vc_sdp_remote.connection))
+ {vc_sdp_local.connection := vc_sdp_remote.connection}
+ else {vc_sdp_local.connection := omit};
+
+ vc_sdp_local.origin := vc_sdp_remote.origin;
+ vc_sdp_local.session_name := vc_sdp_remote.session_name;
+
+ if (ispresent(vc_sdp_remote.bandwidth))
+ {vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth}
+ else {vc_sdp_local.bandwidth := {}};
+
+ if (ispresent(vc_sdp_remote.media_list))
+ {
+ // // cleaning of media before assignment
+ // if (ispresent(vc_sdp_local.media_list))
+ // {
+ // for (var integer i:=0; i<sizeof(vc_sdp_local.media_list); i:=i+1)
+ // {
+ // vc_sdp_local.media_list[i] := omit ;
+ // }
+ // };
+ vc_sdp_local.media_list := vc_sdp_remote.media_list;
+ }
+ }
+}//end group SDPOperations
+
+group AwaitingMessage {
+
+ /**
+ *
+ * @desc Function for time delay
+ */
+ function f_awaitingDelayTimer(float p_delay) runs on SipComponent
+ {
+ tc_tDelay.start(p_delay);
+ alt
+ {
+ [] tc_tDelay.timeout
+ {
+ setverdict (pass);
+ }
+ }
+ } //end f_awaitingDelayTimer
+
+ /**
+ *
+ * @desc Function waiting for any MSG -request/response
+ */
+ function f_awaitingAnyPassOnTimeout() runs on SipComponent
+ {
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive //TAU error if expect (*)
+ {
+ tc_wait.stop;
+ vc_boo_response:=true;
+ vc_boo_request:=true;
+ //setverdict(pass)
+ }
+ [] tc_wait.timeout
+ {
+ vc_boo_response:=false;
+ vc_boo_request:=false;
+ //setverdict (pass)
+ }
+ }
+ } //end f_awaitingResponsePassOnTimeout
+
+ /**
+ *
+ * @desc Function waiting for no MSG -request/response
+ */
+ function f_awaitingNonePassOnTimeout() runs on SipComponent
+ {
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] tc_wait.timeout
+ {
+ setverdict (pass);
+ }
+ }
+ } //end f_awaitingResponsePassOnTimeout
+
+ /**
+ *
+ * @desc function awaits REGISTER
+ * @param p_register expected REGISTER request
+ */
+ function f_awaitingREGISTER(in template REGISTER_Request p_register) runs on SipComponent
+ {
+ var Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_register)-> value v_request sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfREGISTER(v_request);
+ }
+ [] tc_wait.timeout
+ {
+ setverdict (fail);
+ f_componentStop();
+ }
+ }
+ }
+
+ /**
+ *
+ * @desc function awaits SUBSCRIBE
+ * @param p_register expected SUBSCRIBE request
+ */
+ function f_awaitingSUBSCRIBE(in template SUBSCRIBE_Request p_subscribe) runs on SipComponent
+ {
+ var Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_subscribe)-> value v_request sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ }
+ [] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
+ {
+ tc_wait.stop;
+ setverdict(fail);
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ //f_send200OK();
+ }
+ }
+ }
+
+ /**
+ *
+ * @desc function awaits REGISTER and sends a 200 OK response
+ * @param p_reply flag used to avoid the 200OK response sending
+ */
+ function f_awaitingREGISTER_sendReply(in template REGISTER_Request p_register, in boolean p_reply) runs on SipComponent
+ {
+ var Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_register)-> value v_request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_request := v_request;
+ f_setHeadersOnReceiptOfREGISTER(v_request);
+ //Answer to the Request
+ if (p_reply) {f_send200OK();};
+ }
+
+ [] tc_wait.timeout
+ {
+ setverdict (fail);
+ f_componentStop();
+ }
+ }
+ }
+
+
+ /**
+ *
+ * @desc Function waiting for a 200 OK response
+ * @param p_cSeq_s current cSeq expectation
+ */
+ function f_awaitingOkResponse(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response
+ {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+ setverdict(pass)
+ }
+ }
+ } //end awaitingOkResponse
+
+ /**
+ *
+ * @desc Function waiting for a response
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponse(in template Response p_Response) runs on SipComponent
+ {
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (p_Response) -> value vc_response
+ {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+ //setverdict(pass)
+ }
+ }
+ } //end f_awaitingResponse
+
+ /**
+ *
+ * @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponseSendACK(in template Response p_Response) runs on SipComponent
+ {
+ tc_resp.start(PX_SIP_TRESP);
+ alt {
+ [] SIPP.receive (p_Response) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+ LibSip_Steps.f_setHeadersACK();
+ f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+ setverdict(pass);
+ }
+ }
+ } //end f_awaitingResponse
+
+ /**
+ *
+ * @desc Function waiting for a response
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponsePassOnTimeout(in template Response p_Response) runs on SipComponent
+ {
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (p_Response) -> value vc_response
+ {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+ vc_boo_response:=true;
+ //setverdict(pass)
+ }
+ [] tc_resp.timeout
+ {
+ vc_boo_response:=false;
+ //setverdict (pass)
+ }
+ }
+ } //end f_awaitingResponsePassOnTimeout
+
+ /**
+ * @desc await INFO request
+ * reply with 200 OK
+ */
+ function f_awaitingINFO_sendReply(in template INFO_Request p_info) runs on SipComponent
+ {
+ var INFO_Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_info)-> value v_request sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_request);
+ //Answer to the INFO
+ f_send200OK();
+ }
+ }
+ } // end of f_awaitingINFO_sendReply
+
+ /**
+ *
+ * @desc function awaiting for an incoming INVITE
+ * @param p_request expected message
+ */
+ function f_awaitingINVITE(template INVITE_Request p_request) runs on SipComponent
+ {
+ var INVITE_Request v_INVITE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_ignore_invite := true;
+ vc_first_recv:= true; // communication has started
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ }
+ [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 INVITE_Request p_request) runs on SipComponent
+ {
+ var INVITE_Request v_INVITE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_ignore_invite := true;
+ vc_first_recv:= true; // communication has started
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ //SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ }
+ }
+ } //end f_awaitingInviteRequest
+
+ /**
+ *
+ * @desc function awaiting for an incoming INVITE
+ * @param p_request expected message
+ */
+ function f_awaitingINVITE_PassOnTimeout(template INVITE_Request p_request) runs on SipComponent
+ {
+ var INVITE_Request v_INVITE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_ignore_invite := true;
+ vc_first_recv:= true; // communication has started
+ vc_boo_request := true;
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ }
+ []tc_wait.timeout
+ {
+ vc_boo_request := false;
+ }
+ }
+ } //end f_awaitingInviteRequest
+
+ /**
+ *
+ * @desc function awaiting ACK request
+ */
+ function f_awaitingACK(in template ACK_Request p_ACK) runs on SipComponent
+ {
+ var Request v_ACK_Request;
+ tc_ack.start(PX_SIP_TACK);
+
+ alt
+ {
+ [] SIPP.receive(p_ACK) -> value v_ACK_Request
+ {
+ tc_ack.stop;
+ }
+ }
+ } //end f_awaitingAckRequest
+
+ /**
+ *
+ * @desc function awaiting BYE and sending 200OK response
+ * @param p_BYE expected BYE
+ */
+ function f_awaitingBYE(in template BYE_Request p_BYE) runs on SipComponent
+ {
+ var BYE_Request v_BYE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_BYE) -> value v_BYE_Request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_ignore_bye:= true;
+ f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+ //f_send200OK();
+ }
+ }
+ } // end f_awaitingBYE
+
+ /**
+ *
+ * @desc function awaiting BYE and sending 200OK response
+ * @param p_BYE expected BYE
+ */
+ function f_awaitingBYE_sendReply
+ (in template BYE_Request p_BYE) runs on SipComponent
+ {
+ var BYE_Request v_BYE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_BYE) -> value v_BYE_Request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_ignore_bye:= true;
+ f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+ f_send200OK();
+ }
+ }
+ } // end f_awaitingBYE_sendReply
+
+ /**
+ *
+ * @desc function awaiting BYE and sending 200OK response
+ * @param p_BYE expected BYE
+ */
+ function f_awaitingBYE_sendReply_PassOnTimeout(in template BYE_Request p_BYE) runs on SipComponent
+ {
+ var BYE_Request v_BYE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_BYE) -> value v_BYE_Request sender vc_sent_label
+ {
+ tc_wait.stop;
+ vc_ignore_bye:= true;
+ vc_boo_request := true;
+ f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+ f_send200OK();
+ }
+ [] tc_wait.timeout
+ {
+ vc_boo_request := false;
+ }
+ }
+ } // end f_awaitingBYE_sendReply_PassOnTimeout
+
+ /**
+ *
+ * @desc function awaiting CANCEL
+ * @param p_CANCEL expected CANCEL
+ */
+ function f_awaitingCANCEL(in template CANCEL_Request p_CANCEL) runs on SipComponent
+ {
+ var CANCEL_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ []SIPP.receive (p_CANCEL) -> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end f_awaitingCANCEL
+ /**
+ * @desc await MESSAGE request
+ */
+ function f_awaitingMESSAGE(in template MESSAGE_Request p_MSG) runs on SipComponent
+ {
+ var MESSAGE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ [] SIPP.receive(mw_MESSAGE_Request_Base)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ log("Received MESSAGE not as expected!");
+ setverdict (fail);
+ }
+ }
+ } // end of f_awaitingMESSAGE
+
+ /**
+ * @desc await MESSAGE request
+ * reply with 200 OK
+ */
+ function f_awaitingMESSAGE_sendReply() runs on SipComponent
+ {
+ var MESSAGE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(mw_MESSAGE_Request_Base)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ //Answer to the MESSAGE
+ f_send200OK();
+ }
+ }
+
+ } // end of f_awaitingMESSAGE_sendReply
+
+ /**
+ * @desc await MESSAGE request
+ */
+ function f_awaitingMESSAGE_sendReply_PassOnTimeout(in template MESSAGE_Request p_MSG) runs on SipComponent
+ {
+ var MESSAGE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ //Answer to the MESSAGE
+ //f_send200OK();
+ vc_boo_request := true;
+ f_send200OK();
+ //setverdict (pass);
+ }
+ [] tc_wait.timeout
+ {
+ vc_boo_request := false;
+ //setverdict (pass);
+ }
+ }
+ } // end of f_awaitingMESSAGE_PassOnTimeout
+
+ /**
+ * @desc await NOTIFY request
+ */
+ function f_awaitingNOTIFY(in template NOTIFY_Request p_MSG) runs on SipComponent
+ {
+ var NOTIFY_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_getRouteMapIntoRecordRoute(vc_cSeq, v_MSG);
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end of f_awaitingNOTIFY
+
+ /**
+ * @desc await NOTIFY request
+ * reply with 200 OK
+ */
+ function f_awaitingNOTIFY_sendReply(in template NOTIFY_Request p_MSG) runs on SipComponent
+ {
+ var NOTIFY_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_getRouteMapIntoRecordRoute(vc_cSeq, v_MSG);
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ //Answer to the NOTIFY
+ f_send200OK();
+ }
+ }
+ } // end of f_awaitingNOTIFY_sendReply
+
+ /**
+ * @desc await PRACK request
+ * reply with 200 OK
+ */
+ function f_awaitingPRACK_sendReply(in template PRACK_Request p_MSG) runs on SipComponent
+ {
+ var PRACK_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ //Answer to the PRACK
+ f_send200OK();
+ }
+ }
+
+ } // end of f_awaitingPRACK_sendReply
+
+ /**
+ * @desc await PUBLISH request
+ * reply with 200 OK
+ */
+ function f_awaitingPUBLISH_sendReply(in template PUBLISH_Request p_MSG) runs on SipComponent
+ {
+ var PUBLISH_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ //Answer to the PUBLISH
+ f_send200OK();
+ }
+ }
+
+ } // end of f_awaitingPUBLISH_sendReply
+
+ /**
+ * @desc await UPDATE request
+ */
+ function f_awaitingUPDATE(in template UPDATE_Request p_MSG) runs on SipComponent
+ {
+ var UPDATE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end of f_awaitingUPDATE
+
+ /**
+ * @desc await UPDATE request
+ * reply with 200 OK
+ */
+ function f_awaitingUPDATE_sendReply(in template UPDATE_Request p_MSG) runs on SipComponent
+ {
+ var UPDATE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ //Answer to the UPDATE
+ f_send200OK();
+ }
+ }
+
+ } // end of f_awaitingUPDATE_sendReply
+
+
+ /**
+ * @desc await REFER request
+ */
+ function f_awaitingREFER(in template REFER_Request p_MSG) runs on SipComponent
+ {
+ var REFER_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt
+ {
+ [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+ {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfREFER(v_MSG);
+ }
+ }
+ } // end of f_awaitingUPDATE
+
+} // end AwaitingMessage
+
+group SendMessage {
+
+ /**
+ *
+ * @desc send ACK message, update the route and recordRoute header fields depending on boolean flags
+ * @param p_request template of the message to be sent
+ */
+ function f_SendACK(template ACK_Request p_request) runs on SipComponent
+ {
+ //p_request.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
+ // n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send BYE message, update the route and recordRoute header fields depending on boolean flags
+ * @param p_request template of the message to be sent
+ */
+ function f_SendBYE(template BYE_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send CANCEL message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendCANCEL(template CANCEL_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send INFO message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendINFO(template INFO_Request p_request) runs on SipComponent
+ {
+ f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send INVITE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendINVITE(template INVITE_Request p_request) runs on SipComponent
+ {
+ vc_requestFor407 := valueof(p_request);
+ SIPP.send(p_request) to vc_sent_label;
+ if(PX_SIP_INVITE_AUTHENTICATION_ENABLED) {a_altstep_401or407();};
+ }
+
+ /**
+ *
+ * @desc send PRACK message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendPRACK() runs on SipComponent
+ {
+
+ vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
+ f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via
+ SIPP.send(m_PRACK_Request_Base(
+ vc_requestUri,
+ vc_callId,
+ vc_cSeq,
+ vc_from,
+ vc_to,
+ vc_via,
+ vc_rAck
+ )) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send PUBLISH message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendPUBLISH(template PUBLISH_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send REGISTER message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendREGISTER(template REGISTER_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send SUBSCRIBE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendSUBSCRIBE(template SUBSCRIBE_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send UPDATE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendUPDATE(template UPDATE_Request p_request) runs on SipComponent
+ {
+ f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via
+ p_request.msgHeader.cSeq := vc_cSeq;
+ p_request.msgHeader.contact := vc_contact;
+ p_request.msgHeader.via := vc_via;
+ vc_requestFor407 := valueof(p_request);
+ SIPP.send(p_request) to vc_sent_label;
+ if(PX_SIP_INVITE_AUTHENTICATION_ENABLED) {a_altstep_401or407();};
+ }
+
+ /**
+ *
+ * @desc function send MESSAGE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendMESSAGE(template MESSAGE_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc function send NOTIFY message
+ * @param p_request template of the notify to be sent
+ */
+ function f_SendNOTIFY(template NOTIFY_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send REFER message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendREFER(template REFER_Request p_request) runs on SipComponent
+ {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ *
+ * @desc send 200 OK
+ */
+ function f_send200OK() runs on SipComponent
+ {
+ f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
+ }
+
+ /**
+ *
+ * @desc send response
+ * @param p_request template of the message to be sent
+ */
+ function f_sendResponse(template Response p_response) runs on SipComponent
+ {
+ //p_response.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route//TODO check if route header is needed in responses
+ p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+ SIPP.send(p_response) to vc_sent_label;
+ }
+
+} // end SendMessage
+
+group GlobalSteps {
+ /**
+ *
+ * @desc component initialization
+ * @param p_cSeq_s cSeq value to be assigned to the component variable
+ */
+ function f_init_component(inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ //Variables
+ vc_cSeq := p_cSeq_s;
+
+ //Defaults
+ vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
+ vc_default := activate (a_clearRegistration());
+ }
+
+ /**
+ *
+ * @desc component termination
+ */
+ function f_terminate_component() runs on SipComponent
+ {
+ log("component terminated - forced!");
+ deactivate;
+ stop;
+ }
+
+ /**
+ *
+ * @desc component termination
+ */
+ function f_componentStop() runs on SipComponent
+ {
+ syncPort.send(m_syncClientStop);
+ SIPP.clear;
+ stop;
+ }
+
+ /**
+ *
+ * @desc setting of user parameters with PIXIT values
+ * @param p_user identifies the selected user configuration and location
+ */
+ function f_init_userprofile(in integer p_user) runs on SipComponent
+ {
+ vc_userprofile.id := p_user;
+
+ select(p_user){
+ case (c_userProfile_SIP1_home) { //variant c_userProfile_SIP1_home
+ vc_userprofile.currPort := PX_SIP_TS1_PORT;
+ vc_userprofile.currIpaddr := PX_SIP_TS1_IPADDR;
+ vc_userprofile.contactPort := PX_SIP_TS1_PORT;
+ vc_userprofile.contactIpaddr := PX_SIP_TS1_IPADDR;
+ vc_userprofile.bearerIpaddr := PX_SIP_TS1_BEARER_IPADDR;
+ vc_userprofile.homeDomain := PX_SIP_TS1_LOCAL_DOMAIN;
+ vc_userprofile.publUsername := PX_SIP_TS1_LOCAL_USER;
+ vc_userprofile.qop := PX_SIP_SUT_UE1_QOP;
+ vc_userprofile.privUsername := PX_SIP_SUT_UE1_USERNAME;
+ vc_userprofile.passwd := PX_SIP_SUT_UE1_PASSWD;
+ vc_userprofile.registrarDomain := PX_SIP_SUT_REGISTRAR_DOMAIN;
+ }
+ case (c_userProfile_SIP2_home) { //variant c_userProfile_SIP2_home
+ vc_userprofile.currPort := PX_SIP_TS2_PORT;
+ vc_userprofile.currIpaddr := PX_SIP_TS2_IPADDR;
+ vc_userprofile.contactPort := PX_SIP_TS2_PORT;
+ vc_userprofile.contactIpaddr := PX_SIP_TS2_IPADDR;
+ vc_userprofile.bearerIpaddr := PX_SIP_TS2_BEARER_IPADDR;
+ vc_userprofile.homeDomain := PX_SIP_TS2_LOCAL_DOMAIN;
+ vc_userprofile.publUsername := PX_SIP_TS2_LOCAL_USER;
+ vc_userprofile.qop := PX_SIP_SUT_UE2_QOP;
+ vc_userprofile.privUsername := PX_SIP_SUT_UE2_USERNAME;
+ vc_userprofile.passwd := PX_SIP_SUT_UE2_PASSWD;
+ vc_userprofile.registrarDomain := PX_SIP_SUT_REGISTRAR_DOMAIN;
+ }
+
+ }
+ }
+
+ /**
+ *
+ * @desc function waits for particular time that allows the SUT to return to idle state
+ */
+ function f_awaitSUTidle() runs on SipComponent
+ {
+ vc_ignore4xx := true; // allow 4xx in default
+ tc_noAct.start;
+ alt {
+ [] tc_noAct.timeout{}
+ }
+ }
+
+ /**
+ *
+ * @desc function waits for particular time before next expected message
+ */
+ function f_wait(float p_time) runs on SipComponent
+ {
+ tc_noAct.start(p_time);
+ alt {
+ [] tc_noAct.timeout{}
+ }
+ }
+
+ /**
+ *
+ * @desc function cause termination of a PTC
+ * @param p_syncPoint dummy parameter (copied from the common lib)
+ */
+ function f_check2Null(in charstring p_syncPoint) runs on SipComponent
+ {
+ //!= pass does not work, because in case of "none" execution shall continue
+ if (getverdict == inconc or getverdict == fail){
+ log("**** f_check2Null: Verdict evaluated to fail or inconc. Stopping test execution now ");
+ f_selfOrClientSyncAndVerdict (p_syncPoint, e_error) ;
+ }//end if
+ }
+
+/*
+ *
+ * @desc original copied from older LibCommon_VerdictControl
+ */
+ function f_getVerdict()
+ return FncRetCode {
+ var FncRetCode v_ret := e_error;
+ if (getverdict == pass or getverdict == none) {
+ v_ret := e_success;
+ }
+ return v_ret;
+ }
+
+}// end group GlobalSteps
+
+group Registration {
+
+ /**
+ *
+ * @desc registration and authentication with MD5
+ * @param p_cSeq_s cseq parameter
+ * @param p_register register template
+ * @param p_auth flag indicating if authentication is needed
+ */
+ function f_Registration(inout CSeq p_cSeq_s, out template REGISTER_Request p_register, in boolean p_auth) runs on SipComponent
+ {
+ if (PX_SIP_REGISTRATION)
+ {
+ f_setHeaders_REGISTER(p_cSeq_s);
+ p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
+ f_SendREGISTER(p_register); //LibSip
+
+ //awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
+ if (p_auth)
+ {
+ // receiving 401 Unauthorized response.
+ // and Re-send REGISTER request with Authorization header
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response
+ {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(p_cSeq_s, vc_response);
+ // set headers via, cseq and authorization
+ f_setHeaders_2ndREGISTER(p_cSeq_s);
+ p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
+ // Re-send protected REGISTER
+ f_SendREGISTER(p_register);//LibSip
+
+ // awaiting 200 OK REGISTER
+ f_awaitingOkResponse(p_cSeq_s);
+ f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
+ }
+ [] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response
+ {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+ f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
+ log ("Authorization was not requested as expected");
+ }
+ }
+ }
+ else
+ {
+ f_awaitingOkResponse(p_cSeq_s);
+ f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
+ }
+
+ };
+ }//end function f_Registration
+
+
+ /**
+ *
+ * @desc remove registration
+ * @param p_cSeq_s cseq parameter
+ */
+ function f_RemoveRegistration(inout CSeq p_cSeq) runs on SipComponent
+ {
+ var CommaParam_List v_challenge;
+ var Credentials v_credentials;
+ var template REGISTER_Request v_request;
+
+ //
+ if(vc_DeregDone)
+ {
+ f_componentStop();
+ }
+ else {vc_DeregDone := true;}
+
+ if (PX_SIP_REGISTRATION)
+ {
+ f_setHeaders_deREGISTER(p_cSeq);
+ v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg,
+ p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0");
+ v_request.msgHeader.route := f_route();
+
+ f_SendREGISTER(v_request);
+ if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED)
+ {
+ // receiving 401 Unauthorized response.
+ // and Re-send REGISTER request with Authorization header
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response
+ {
+ tc_resp.stop;
+ // set headers via, cseq and authorization
+ f_setHeaders_2ndREGISTER(p_cSeq);
+ v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg,
+ p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0");
+ v_request.msgHeader.route := f_route();
+ // Re-send protected REGISTER
+ f_SendREGISTER(v_request);//LibSip
+
+ // awaiting 200 OK REGISTER
+ f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
+ }
+ [] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq))-> value vc_response
+ {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+ //log ("Authorization was not requested as expected");
+ }
+ }
+ }
+ else
+ {
+ f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
+ }
+ }
+ } // end f_RemoveRegistration
+
+ /**
+ *
+ * @desc remove registration without authorization
+ * @param p_cSeq_s cseq parameter
+ */
+ function f_RemoveRegistration_wo_authorization(inout CSeq p_cSeq) runs on SipComponent
+ {
+ var SemicolonParam_List tmp_params;
+ if (PX_SIP_REGISTRATION)
+ {
+ f_setHeaders_deREGISTER(p_cSeq);
+ f_SendREGISTER(m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq,
+ vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0" ));
+ f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
+ }
+ } // end f_RemoveRegistration_wo_authorization
+
+}//end group Registration
+
+ group Subscription {
+
+ /**
+ *
+ * @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
+ * @param p_cSeq_s cseq parameter
+ * @param p_subscribe subscribe template
+ */
+ function f_Subscription(inout CSeq p_cSeq_s,template SUBSCRIBE_Request p_subscribe) runs on SipComponent
+ {
+ //f_setHeaders_SUBSCRIBE(p_cSeq_s);
+ //send SUBSCRIBE
+ f_SendSUBSCRIBE(p_subscribe);
+ // awaiting 200 OK SUBSCRIBE
+ f_awaitingOkResponse(p_cSeq_s);
+
+ //await NOTIFY and send reply 200 OK
+ f_awaitingNOTIFY_sendReply(mw_NOTIFY_Request_Base(vc_callId));
+
+ }//end function f_Subscription
+
+ /**
+ *
+ * @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
+ * @param p_cSeq_s cseq parameter
+ * @param p_subscribe subscribe template
+ * @param p_notify notify template
+ */
+ function f_SubscriptionWithNotification(inout CSeq p_cSeq_s, template SUBSCRIBE_Request p_subscribe, template NOTIFY_Request p_notify) runs on SipComponent
+ {
+ f_setHeaders_SUBSCRIBE(p_cSeq_s);
+ //send SUBSCRIBE
+ f_SendSUBSCRIBE(p_subscribe);
+ // awaiting 200 OK SUBSCRIBE
+ f_awaitingOkResponse(p_cSeq_s);
+
+ //await NOTIFY and send reply 200 OK
+ f_awaitingNOTIFY_sendReply(p_notify);
+
+ }//end function f_Subscription
+
+ /**
+ *
+ * @desc UE await subscrbe, send on 200 OK; possibility to handle also other SUBSCRIBE methods where event is different than reg
+ * @param p_cSeq_s cseq parameter
+ * @param p_subscribe subscribe template
+ */
+ function f_awaitingSubscription(inout CSeq p_cSeq_s, template SUBSCRIBE_Request p_subscribe) runs on SipComponent
+ {
+ var Request v_request;
+
+ tc_wait.start(2.0);//awaiting of all SUBSCRIBES
+ alt
+ {
+ [] SIPP.receive(p_subscribe)-> value v_request sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ f_send200OK();
+ repeat;
+ }
+ [] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ f_send200OK();
+ repeat;
+ }
+ [] tc_wait.timeout
+ {
+ setverdict(pass);
+ }
+
+
+ }
+ // TODO check how to solve sending of NOTIFY on SUBSCRIBE
+
+ }//end function f_awaitingSubscription
+
+ }//end group Subscription
+
+group Preambles {
+
+ /**
+ *
+ * @desc Set variables and default initialization for user profile
+ * @param p_userprofile user profile of call
+ * @param p_cSeq_s cseq parameter
+ */
+ function f_SIP_preamble_woREG(in integer p_userprofile, inout CSeq p_cSeq_s) runs on SipComponent
+ {
+ //varables and altsteps
+ f_init_component(p_cSeq_s);
+
+ //Preamble
+ f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
+ vc_sdp_local := valueof(m_SDP_bandwidth(valueof(m_media_dynPT(PX_SIP_SDP_dyn, PX_SIP_SDP_encoding)), vc_userprofile));
+ }
+
+ /**
+ *
+ * @desc Set variables and default initialization for user profile and handle registration and authentication with MD5
+ * @param p_userprofile user profile of call
+ * @param p_cSeq_s cseq parameter
+ * @param p_register register template
+ */
+ function f_SIP_preamble_withREG(in integer p_userprofile, inout CSeq p_cSeq_s, template REGISTER_Request p_register) runs on SipComponent
+ {
+ //preamble
+ f_SIP_preamble_woREG(p_userprofile, p_cSeq_s);
+
+ //Registration, Awaiting
+ f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);
+ }
+
+}// end group Preambles
+
+group Postambles {
+
+ /**
+ *
+ * @desc function send BYE and awaits reponse
+ * @param p_CallId parameter for outgoing BYE
+ * @param p_cSeq parameter for outgoing BYE
+ * @param p_from parameter for outgoing BYE
+ * @param p_to parameter for outgoing BYE
+ * @param p_reqHostPort parameter for outgoing BYE
+ */
+ function f_terminateCall(SipUrl p_requestUri, CallId p_CallId, inout CSeq p_cSeq, From p_from,
+ template To p_to) runs on SipComponent
+ {
+ // Sending of a BYE request to release the call and expect a final response
+ f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, PX_SIP_BYE_CAUSE));
+
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq))
+ {
+ repeat;
+ }
+ [] SIPP.receive (mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq))
+ {
+ tc_resp.stop;
+ }
+ }
+ } // end function f_terminateCall
+
+ function f_cancelCall(template CANCEL_Request p_request)
+ runs on SipComponent
+ {
+ // This function is called to bring back the IUT in idle condition
+ // in case of errors or unexpected behaviour.
+
+ // Sending of a CANCEL request with the same Cseq
+ f_setHeadersCANCEL(vc_cSeq);
+ f_SendCANCEL(p_request);
+ tc_resp.start(PX_SIP_TRESP);
+ alt
+ {
+ [] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq))
+ {
+ tc_resp.stop;
+ }
+ }
+ }
+
+ function f_cancelCall_await487(template CANCEL_Request p_request)
+ runs on SipComponent
+ {
+ // This function is called to bring back the IUT in idle condition
+ // in case of errors or unexpected behaviour.
+
+ // Sending of a CANCEL request with the same Cseq
+ f_cancelCall(p_request);
+ // set method on INVITE
+ vc_cSeq.method := "INVITE";
+
+ //await on 487 response and send ACK
+ f_awaitingResponse(mw_Response_Base(c_statusLine487, vc_callId, vc_cSeq));
+ f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+ }
+
+ function f_awaitCancelCall_send487(template CANCEL_Request p_request)
+ runs on SipComponent
+ {
+ f_awaitingCANCEL(p_request);
+ f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via));
+
+ // set method on INVITE
+ vc_cSeq.method := "INVITE";
+
+ //send 487 response and await ACK
+ f_sendResponse(m_Response_Base(c_statusLine487, vc_callId, vc_cSeq,vc_caller_From, vc_caller_To, vc_via));
+ // await ACK
+ f_awaitingACK(mw_ACK_Request_Base(vc_callId));
+ }
+
+} // end group Postambles
+
+group SipChecks
+{
+
+
+ /*
+ * @desc check the presence of conversation at SIP side
+ *
+ */
+ function f_check_Conversation() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if conversation at SIP port";
+
+ if (PX_SIP_CheckConversation) {
+ opPort.call(s_SIP_conversation:{v_question, -})
+ {[] opPort.getreply(s_SIP_conversation:{-, true}) {}
+ [] opPort.getreply(s_SIP_conversation:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_uPlane, f_getVerdict()); // Note: implemented in test bodies
+
+ return
+ } // end of f_check_Conversation
+
+ /*
+ * @desc check the presence of conversation at SIP side
+ *
+ */
+ function f_check_Ringing() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if ringing at SIP port";
+
+ if (PX_SIP_CheckRinging) {
+ opPort.call(s_SIP_ringing:{v_question, -})
+ {[] opPort.getreply(s_SIP_ringing:{-, true}) {}
+ [] opPort.getreply(s_SIP_ringing:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict());
+ return
+ } // end of f_check_Ringing
+
+ /*
+ * @desc check the announcement at SIP side (UE A)
+ *
+ */
+ function f_check_AnnouncementUE_A() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if announcement at UE A";
+
+ if (PX_SIP_CheckConversation) {
+ opPort.call(s_SIP_announcementA:{v_question, -})
+ {[] opPort.getreply(s_SIP_announcementA:{-, true}) {}
+ [] opPort.getreply(s_SIP_announcementA:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict());
+ return
+ } // end of f_check_AnnouncementUE_A
+
+ /*
+ * @desc check the announcement at SIP side (UE B)
+ *
+ */
+ function f_check_AnnouncementUE_B() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if announcement at UE B";
+
+ if (PX_SIP_CheckConversation) {
+ opPort.call(s_SIP_announcementB:{v_question, -})
+ {[] opPort.getreply(s_SIP_announcementB:{-, true}) {}
+ [] opPort.getreply(s_SIP_announcementB:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_annoucB, f_getVerdict());
+ return
+ } // end of f_check_AnnouncementUE_B
+
+ /*
+ * @desc check the announcement at SIP side
+ *
+ */
+ function f_check_Announcement() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if announcement at SIP side";
+
+ if (PX_SIP_CheckConversation) {
+ opPort.call(s_SIP_announcement:{v_question, -})
+ {[] opPort.getreply(s_SIP_announcement:{-, true}) {}
+ [] opPort.getreply(s_SIP_announcement:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict());
+ return
+ } // end of f_check_Announcement
+
+ /*
+ * @desc check the Voice message at SIP side
+ *
+ */
+ function f_check_VoiceMessage() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if voice message at SIP side";
+
+ if (PX_SIP_CheckConversation) {
+ opPort.call(s_SIP_voiceMessage:{v_question, -})
+ {[] opPort.getreply(s_SIP_voiceMessage:{-, true}) {}
+ [] opPort.getreply(s_SIP_voiceMessage:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_voicem, f_getVerdict());
+ return
+ } // end of f_check_Announcement
+
+ /*
+ * @desc check the stop of media stream
+ *
+ */
+ function f_check_MediaStopped() runs on SipComponent
+ {
+ var boolean v_result;
+ var charstring v_question := "confirm if media stream stopped";
+
+ if (PX_SIP_CheckConversation) {
+ opPort.call(s_SIP_mediastopped:{v_question, -})
+ {[] opPort.getreply(s_SIP_mediastopped:{-, true}) {}
+ [] opPort.getreply(s_SIP_mediastopped:{-, false})
+ {all timer.stop;
+ setverdict(fail);
+ syncPort.send(m_syncClientStop);
+ stop;}
+ }
+ }
+
+ f_selfOrClientSyncAndVerdict(c_uPlaneStop, f_getVerdict());
+ return
+ } // end of f_check_MediaStopped
+
+}
+
+group DefaultsTestStep
+{
+
+
+ /**
+ * @desc This default handles receiving of the sync server
+ * STOP message and calls the RT HUT postamble. (copy from common lib)
+ */
+ altstep a_Sip_catchSyncStop() runs on SipComponent
+ {
+ [] syncPort.receive(m_syncServerStop)
+ {
+ tc_sync.stop ;
+ log("**** a_Sip_catchSyncStop: Test component received STOP signal from MTC - going to IDLE state **** ");
+ //TODO complete postamble
+ syncPort.send(m_syncClientStop);
+ //in case if deregistration was not done
+ //f_RemoveRegistration(vc_cSeq);
+ f_terminate_component();
+ log("**** a_Sip_catchSyncStop: TEST COMPONENT NOW STOPPING ITSELF! **** ") ;
+ setverdict(inconc);
+ stop ;
+ }
+ }
+
+
+ /**
+ *
+ * @desc main default altstep to handle unexpected messages and timeout
+ * @verdict fail for all unexpected branches
+ */
+ altstep a_clearRegistration() runs on SipComponent
+ {
+ var Response v_response;
+ var Request v_request;
+
+ [] any timer.timeout
+ {
+ setverdict(fail);
+ all timer.stop;
+ //TODO check how to solve release of call
+ //f_SendCANCEL(m_CANCEL_Request(vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_reqHostPort, vc_via )); // difference between registration state or transaction state
+ vc_callId := vc_callIdReg;
+ f_RemoveRegistration(vc_cSeq);
+ }
+
+ // allow repeated INVITEs
+ [vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base)
+ {
+ repeat
+ }
+
+ // allow repeated BYEs after ack of the first BYE
+ [vc_ignore_bye] SIPP.receive (mw_BYE_Request_Base(?))
+ {
+ repeat
+ }
+ [] SIPP.receive (mw_ACK_Request_Base(?))
+ {
+ repeat
+ }
+ // allow 100 replies
+ [] SIPP.receive(mw_Response_Base(c_statusLine100,?, ?))
+ {
+ repeat
+ }
+
+ // ignore 181 if flag is set (following TS 183004 §4.5.2.1)
+ [vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181,vc_callId, vc_cSeq))-> value v_response sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response);
+ repeat;
+ }
+
+ // according to SIP chap.8.1.3.2
+ [] SIPP.receive(mw_Response_Base(c_statusLine183,vc_callId, vc_cSeq))
+ {
+ repeat;
+ }
+
+ // ignore 484 if flag is set
+ [vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484,vc_callId, vc_cSeq))
+ {
+ repeat
+ }
+
+ [vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx,vc_callId, ?))-> value v_response sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response);
+ f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, valueof(vc_route)));
+ repeat
+ }
+
+ [vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?))
+ {
+ repeat
+ }
+
+ [] SIPP.receive(mw_INFO_Request_Base(vc_callId))->value v_request sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfRequest(v_request);
+ f_send200OK();
+ repeat
+ }
+
+ // awaiting of Notify
+ [] SIPP.receive(mw_NOTIFY_Request_Base(vc_callId))->value v_request sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfRequest(v_request);
+ f_send200OK();
+ repeat
+ }
+ // awaiting of subscribe from UE
+ [vc_ignore_subscribe] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ f_send200OK();
+ repeat;
+ }
+
+ //awaiting of subscribe on proxy
+ [] SIPP.receive(mw_SUBSCRIBE_Request_Base)->value v_request sender vc_sent_label
+ {
+ f_setHeadersOnReceiptOfRequest(v_request);
+ f_sendResponse(m_Response_Contact(c_statusLine200,vc_callId, vc_cSeq,vc_callee_From, vc_callee_To, vc_via,vc_contact));
+ //f_setHeadersGeneral(vc_cSeq, "NOTIFY"); // cseq, contact, branch, via
+ //f_SendNOTIFY(m_NOTIFY_Request_contact(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_contact));
+ log(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec);
+ f_SendNOTIFY(m_NOTIFY_Request_contact(v_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact));
+ f_awaitingOkResponse(vc_cSeq);
+ repeat
+ }
+
+ // unexpected BYE is acknowledged to avoid retransmissions
+ [] SIPP.receive(mw_BYE_Request_Base(?))-> value v_request sender vc_sent_label
+ {
+ setverdict(fail);
+ f_setHeadersOnReceiptOfRequest(v_request);
+ f_send200OK();
+ f_RemoveRegistration(vc_cSeq);
+ }
+
+ // unexpected CANCEL is acknowledged to avoid retransmissions
+ [] SIPP.receive(mw_CANCEL_Request_Base(?))-> value v_request sender vc_sent_label
+ {
+ setverdict(fail);
+ f_setHeadersOnReceiptOfRequest(v_request);
+ //Answer to the CANCEL
+ f_send200OK();
+ f_RemoveRegistration(vc_cSeq);
+ }
+ // catch 4xx response
+ [] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?))-> value v_response sender vc_sent_label
+ {
+ setverdict(fail);
+ f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response);
+ LibSip_Steps.f_setHeadersACK();
+ f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
+ f_RemoveRegistration(vc_cSeq);
+ }
+ // catch 5xx response
+ [] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?))-> value v_response sender vc_sent_label
+ {
+ setverdict(fail);
+ f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response);
+ LibSip_Steps.f_setHeadersACK();
+ f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
+ f_RemoveRegistration(vc_cSeq);
+ }
+ // catch invalid REGISTER
+ [] SIPP.receive(mw_REGISTER_Request_Base)-> value v_request sender vc_sent_label
+ {
+ setverdict(fail);
+ f_componentStop();
+ }
+ // any
+ [] SIPP.receive
+ {
+ setverdict(fail);
+ all timer.stop;
+// f_setHeadersCANCEL(vc_cSeq);
+// f_SendCANCEL(m_CANCEL_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_via )); // difference between registration state or transaction state
+ f_RemoveRegistration(vc_cSeq);
+ }
+ }
+
+ /**
+ *
+ * @desc altstep handle authentication for INVITE message
+ */
+ altstep a_altstep_401or407() runs on SipComponent {
+ [] any port.check (receive) {
+ var CommaParam_List v_challenge;
+ var Credentials v_Credentials;
+ var Response v_Response;
+ var Request v_Request := valueof (vc_requestFor407);
+
+ tc_resp.start (PX_SIP_TRESP);
+ alt {
+ [] SIPP.receive (mw_Response_Base((c_statusLine401,c_statusLine407),
+ vc_callId,
+ vc_cSeq)) -> value v_Response {
+ tc_resp.stop;
+ // get tag from To header if available
+ vc_to := v_Response.msgHeader.toField;
+ if (vc_cSeq.method == "INVITE"){
+ // send ACK
+ f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+ }
+ // resent the INVITE message with Proxyauthorization header include
+ // Extract challenge and calculate credentials for a response.
+ if (ischosen (v_Response
+ .msgHeader
+ .proxyAuthenticate
+ .challenge
+ .otherChallenge // instead of digestCln (changed by axr to comply to alcatel)
+ )) {
+ v_challenge :=
+ v_Response
+ .msgHeader
+ .proxyAuthenticate
+ .challenge
+ .otherChallenge.authParams;
+ v_Credentials :=
+ f_calculatecCredentials(vc_userprofile,
+ vc_requestFor407.msgHeader.cSeq.method,
+ v_challenge);
+ } else {
+ log ("No scheme in Proxy Authenticate header!!");
+ setverdict (inconc);
+ stop;
+ }
+
+ vc_branch := c_branchCookie & f_getRndTag();
+ vc_via := {
+ fieldName := VIA_E,
+ viaBody := {
+ valueof (m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ v_Request.msgHeader.via := vc_via;
+ // Increment CSeq sequence number of and add the credentials
+ // to the original saved INVITE message.
+ vc_cSeq.method := vc_requestFor407.msgHeader.cSeq.method;
+ vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+ v_Request.msgHeader.cSeq.seqNumber :=
+ vc_cSeq.seqNumber;
+ v_Request.msgHeader.proxyAuthorization.fieldName :=
+ PROXY_AUTHORIZATION_E;
+ v_Request.msgHeader.proxyAuthorization.credentials :=
+ {v_Credentials};
+
+ // Re-send the saved INVITE with Authorization header
+ // included.
+ SIPP.send (v_Request) to vc_sent_label;
+ }
+ }
+ }
+ }
+
+
+} // end of group DefaultsTestStep
+} // end module LibSip_Steps
/v1.7.0/ttcn/LibSip_Steps.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/ttcn/LibSip_XMLTypes.ttcn
===================================================================
--- v1.7.0/ttcn/LibSip_XMLTypes.ttcn (nonexistent)
+++ v1.7.0/ttcn/LibSip_XMLTypes.ttcn (revision 524)
@@ -0,0 +1,122 @@
+/**
+ * @author STF 346, STF366, STF368, STF369
+ * @version $Id$
+ * @desc This module provides the XML type system for SIP tests.
+ * The types have been generated automatically, followed by manual modifications:
+ * - bitType substituted by OneBitType
+ * - twobitType substituted by TwoBitType
+ * - addition of pattern for: OneBitType, TwoBitType, ThreeBitType, FourBitType, FourBitType, SixBitType
+ * - application of enumerated for: State_type, Endpoint_status_type, Joining_type, Disconnection_type, Media_status_type,
+ * Originating_identity_presentation_restriction, Terminating_identity_presentation_restriction
+ * - addition of length value: NetworkIdentityType, SixteenbitType
+ * - addition of value restriction: CugIndexType
+ * - substitution of "content" by "choice": Call_type, Mcid
+ * - additional type renaming (upper first letter): AbsService, Anonymous, Busy,
+ * Communication_diverted, Conference_description_type, Conference_info,
+ * Conference_media_type, Conference_medium_type, Conference_state_type,
+ * Conference_type, Cug, CugRequestType, Empty_element_type, Endpoint_type,
+ * Execution_type, Host_type, Keywords_type, Media, Media_type, No_answer,
+ * Not_reachable, Not_registered, Originating_identity_presentation, Presence_status,
+ * Presence_status_activity_type, RequestType, ResponseType, Roaming,
+ * Rule_deactivated, Sidebars_by_val_type, Simservs, SimservType,
+ * Terminating_identity_presentation, Uri_type, Uris_type, User_roles_type,
+ * User_languages_type, User_type, Users_type
+ *
+ * - new group CDIV added by STF369
+ * - new group ACR_CD added by STF38
+ * - new types RegInfo and Pidf_Lo added by STF160
+ */
+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
+ }
+ }
+}
\ No newline at end of file
/v1.7.0/ttcn/LibSip_XMLTypes.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v1.7.0/XSDAUX.ttcn
===================================================================
--- v1.7.0/XSDAUX.ttcn (nonexistent)
+++ v1.7.0/XSDAUX.ttcn (revision 524)
@@ -0,0 +1,150 @@
+module XSDAUX {//MRO
+ /* 0.anySimpleType */
+ type anytype anySimpleType;
+
+ /* 1.string */
+ type charstring string;
+
+ /* 2.boolean */
+ type integer bitXSD (1, 0) ;
+
+ type union booleanXSD {
+ bitXSD bit, boolean bool
+ }
+
+ /* 3.decimal */
+ type float decimal;
+
+ /* 4.float */
+ type float floatXSD;
+
+ /* 5.double */
+ type float double;
+
+ /* 6.duration */
+ type charstring duration;
+
+ /* 7.dateTime */
+ type charstring dateTime;
+
+ /* 8.time */
+ type charstring time;
+
+ /* 9.date */
+ type charstring date;
+
+ /* 10.gYearMonth */
+ type charstring gYearMonth;
+
+ /* 11.gYear */
+ type charstring gYear;
+
+ /* 12.gMonthDay */
+ type charstring gMonthDay;
+
+ /* 13.gDay */
+ type charstring gDay;
+
+ /* 14.gMonth */
+ type charstring gMonth;
+
+ /* 15.hexBinary */
+ type hexstring hexBinary;
+
+ /* 16.base64Binary */
+ type charstring base64Binary;
+
+ /* 17.anyURI */
+ type charstring anyURI;
+
+ /* 18.QName */
+ type charstring QName;
+
+ /* 19.NOTATION */
+ type charstring NOTATION;
+
+ /* 20.normalizedString */
+ type charstring normalizedString;
+
+ /* 21.token */
+ type charstring token;
+
+ /* 22.language */
+ type charstring languageXSD;
+
+ /* 23.NMTOKEN */
+ type charstring NMTOKEN;
+
+ /* 24.NMTOKENS */
+ type set of charstring NMTOKENS;
+
+ /* 25.Name */
+ type charstring Name;
+
+ /* 27.NCName */
+ type charstring NCName;
+
+ /* 28.ID */
+ type charstring ID;
+
+ /* 29.IDREFS */
+ type set of charstring IDREFS;
+
+ /* 30.ENTITY */
+ type charstring ENTITY;
+
+ /* 31.ENTITIES */
+ type set of charstring ENTITIES;
+
+ /* 32.nonPositiveInteger */
+ type integer nonPositiveInteger (- infinity .. 0) ;
+
+ /* 33.negativeInteger */
+ type integer negativeInteger (- infinity .. - 1) ;
+
+ /* 34.long */
+// type integer long (- 9223372036854775808 .. 9223372036854775807) ;//MRO
+
+ /* 35.int */
+ type integer int (- 2147483648 .. 2147483647) ;
+
+ /* 36.short */
+ type integer short (- 32768 .. 32767) ;
+
+ /* 37.byte */
+ type integer byte (- 128 .. 127) ;
+
+ /* 38.nonNegativeInteger */
+ type integer nonNegativeInteger (0 .. infinity) ;
+
+ /* 39.unsignedLong */
+ type integer unsignedLong (0 .. 18446744073709551615) ;//MRO
+
+ /* 40.unsignedInt */
+ type integer unsignedInt (0 .. 4294967295) ;
+
+ /* 41.unsignedShort */
+ type integer unsignedShort (0 .. 65535) ;
+
+ /* 42.unsignedByte */
+ type integer unsignedByte (0 .. 255) ;
+
+ /* 43.positiveInteger */
+ type integer positiveInteger (1 .. infinity) ;
+
+ /* 44.integer */
+ type integer integerXSD;
+
+ /* 45.anyAttributes */
+ type record of record {
+ charstring name,
+ charstring val
+ } anyAttributes;
+
+ /* 46. anyType */
+ /**
+ * This is to represent elements without a given type
+ */
+ type record anyType {
+ }
+}
Index: v1.7.0/codec/c++/sip_codets.cpp
===================================================================
--- v1.7.0/codec/c++/sip_codets.cpp (nonexistent)
+++ v1.7.0/codec/c++/sip_codets.cpp (revision 524)
@@ -0,0 +1,3633 @@
+#include "gen_classes.h"
+#include <boost/regex.hpp>
+
+namespace t3devlib { namespace gen {
+
+class Regex {
+public:
+ typedef std::string::const_iterator iterator;
+
+
+ Regex(const char* regex, int flags = 0)
+ : mSource (regex), mRegex (regex, boost::regex_constants::perl | boost::regex_constants::no_mod_m)
+ {
+ //FIXME: remove flags ?
+ }
+
+ bool Match (Buffer& buffer) {
+ mStart = iterator (reinterpret_cast<const char*> (buffer.GetValueBin()) + (buffer.GetPosition() / 8));
+ mStop = iterator (reinterpret_cast<const char*> (buffer.GetValueBin()) + (buffer.GetEndMarker() / 8));
+
+ int result = boost::regex_search (mStart, mStop, mResults, mRegex);
+
+#if 0
+ boost::match_results<iterator>::iterator it;
+ std::cout << endl << "matching /"<< mSource <<"/" << endl;
+ int id=0;
+ for (it=mResults.begin() ; it!=mResults.end() ; ++it)
+ {
+ std::cout << "first " << id << " *" << &*it->first << "*" << endl;
+ std::cout << "second " << id << " *" << &*it->second << "*" << endl;
+ id++;
+ }
+#endif
+ return result;
+ }
+
+ void AssertMatch (Buffer& buffer, Variable* v) throw (DecodeError) {
+ if (!Match (buffer)) {
+ Error (v, buffer);
+ }
+ }
+
+ int GetMatchedLength(int id = 0) {
+ return mResults[id].length()*8;
+ }
+
+ std::string GetMatchedString(int id = 0) {
+ return std::string (mResults[id].first, mResults[id].second);
+ }
+
+ const char* GetMatchedPosition(int id = 0) {
+ return &*mResults[id].first;
+ }
+
+ const char GetLastMatchedChar(int id = 0) {
+ return *(&*mResults[id].second - 1); // FIXME: how about null match ?
+ }
+
+ void MovePast (Buffer& buffer, int id = 0)
+ {
+ buffer.SetPosition ((&*mResults[id].second - reinterpret_cast<const char*> (buffer.GetValueBin())) * 8);
+ }
+
+ void MoveAt (Buffer& buffer, int id = 0)
+ {
+ buffer.SetPosition ((&*mResults[id].first - reinterpret_cast<const char*> (buffer.GetValueBin())) * 8);
+ }
+
+ void Error (Variable* v, Buffer& buffer) throw (DecodeError) {
+
+ std::string message ("cannot match regex /");
+ message += mSource;
+ message += "/ in '";
+ if ((mStop - mStart) > 40) {
+ message.append (&*mStart, 40);
+ message += "...";
+ } else {
+ message.append (mStart, mStop);
+ }
+ message += "'\n";
+ throw DecodeError (v, message);
+ }
+
+private:
+ const char* mSource;
+ boost::regex mRegex;
+ iterator mStart, mStop;
+ boost::match_results<iterator> mResults;
+};
+
+void normalise_quoted_string (Charstring& cs, bool remove_quotes = false) throw (DecodeError)
+{
+ std::string result;
+
+ //FIXME: how LWS shall be normalised ?
+
+ const unsigned char* p = cs.GetValueBin();
+ const unsigned char* end = p + (cs.GetLength() / 8);
+
+ if (remove_quotes)
+ {
+ if ((end - p) < 2)
+ goto error_malformed;
+
+ if ((*p++ != '"') | (*--end != '"'))
+ goto error_malformed;
+ }
+
+ for ( ; p!=end ; p++)
+ {
+ switch (*p) {
+ case '\r': //LWS
+ case '\n':
+
+ case ' ': //WSP
+ case '\v':
+ case '\t':
+ case '\f':
+
+ case 0x21: //!
+ // plain text
+ result += *p;
+ break;
+
+ case '\\':
+ // escaped character
+ p++;
+ if ((p == end) || ((*p == '\r') | (*p == '\n'))) {
+ // cannot be escaped
+ // (should never happen since we checked it wit a regex before)
+ DecodeError e (&cs);
+ e.Msg() << "Invalid escaped sequence in quoted string: \\\\x" << std::hex << ((int) *p) << std::endl;
+ throw e;
+ }
+
+ // valid escaped character
+ result += *p;
+ break;
+
+ default:
+ if ((*p >= 0x23) && (*p <= 0x7e))
+ {
+ // plain text
+ result += *p;
+
+ } else if (*p > 127) {
+ // UTF-8 character
+ //
+ // FIXME: how to represent UTF-8 chars ? ('%xx' escape sequences are not used here)
+ result += *p;
+
+ } else {
+ // non allowed character
+ // (should never happen since we checked it wit a regex before)
+ DecodeError e (&cs);
+ e.Msg() << "Invalid character in quoted string: \\x" << std::hex << ((int) *p) << std::endl;
+ throw e;
+ }
+ }
+ }
+
+ // replace the string with the quoted string
+ {
+ Bytestring& bs = cs;
+ bs.SetValue (result);
+ }
+ return;
+
+error_malformed:
+ DecodeError e(&cs);
+ e.Msg() << "Malformed quoted string: " << cs.GetValue() << endl;
+ throw e;
+}
+
+static inline bool asciichar_is_displayable (char c)
+{
+ if ((c >= 32) && (c<127))
+ return true;
+ return (c == '\r') | (c == '\n') | (c == '\t') | (c == '%');
+}
+
+void normalise_escaped_string (Charstring& cs) throw (DecodeError)
+{
+ std::string result;
+
+ const unsigned char* p = cs.GetValueBin();
+ const unsigned char* end = p + (cs.GetLength() / 8);
+
+ for ( ; p!=end ; p++)
+ {
+ unsigned char c;
+
+ if (*p == '%') {
+ // escaped char %xx
+
+ if ((end - p) < 3)
+ goto error_malformed;
+
+ char buff[3] = { p[1], p[2], '\0'};
+ p += 2;
+
+ char* next;
+ c = strtol(buff, &next, 16);
+
+ if (next != &buff[2])
+ goto error_malformed;
+ //TODO: check that the result is UTF-8 valid ?
+ } else {
+ c = *p;
+ }
+
+ if (asciichar_is_displayable(c))
+ {
+ // 7-bit character
+ result += c;
+ } else {
+ // 8-bit character and control characters
+ // -> escape it
+ char buff[4];
+ sprintf (buff, "%%%02x", c);
+ result += buff;
+ }
+ }
+
+ // replace the string with the quoted string
+ {
+ Bytestring& bs = cs;
+ bs.SetValue (result);
+ }
+ return;
+
+error_malformed:
+ DecodeError e(&cs);
+ e.Msg() << "Malformed string: " << cs.GetValue() << endl;
+ throw e;
+}
+
+//WSP: space, htab, vtab, form feed
+#define SIPCHARS_WSP " \t\v\f"
+#define SIPREG_LWS "(?:[" SIPCHARS_WSP "]*\\r\\n)?[" SIPCHARS_WSP "]+"
+#define SIPREG_SWS "(?:" SIPREG_LWS ")?"
+
+void remove_whitespace (Buffer & buffer) {
+ static Regex reg_ws ("^" SIPREG_LWS);
+ if (reg_ws.Match (buffer)) {
+ int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength();
+ buffer.SetPosition (nPos);
+ }
+}
+
+void read_sp (Buffer & buffer, Variable* v) {
+ static Regex reg_ws ("^[ \t]+");
+ reg_ws.AssertMatch (buffer, v);
+ int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength();
+ buffer.SetPosition (nPos);
+}
+
+bool is_sip_scheme (const char * pszScheme) {
+ return strcasecmp(pszScheme, "sip") == 0 || strcasecmp(pszScheme, "sips") == 0;
+}
+
+bool is_tel_scheme (const char * pszScheme) {
+ return strcasecmp(pszScheme, "tel") == 0 || strcasecmp(pszScheme, "fax") == 0 ||
+ strcasecmp(pszScheme, "modem") == 0;
+}
+
+//whitespace
+
+
+#define SIPCHARS_MARK "\\-_.!~*'()"
+#define SIPCHARS_ALFA "A-Za-z"
+#define SIPCHARS_ALFANUM "0-9" SIPCHARS_ALFA
+#define SIPCHARS_HEXA "0-9A-Fa-f"
+#define SIPCHARS_UNRESERVED SIPCHARS_ALFANUM SIPCHARS_MARK
+#define SIPCHARS_RESERVED ";/?:@&=+$,"
+#define SIPCHARS_USER_UNRESERVED "&=+$,;?/"
+#define SIPCHARS_UTF8_NONASCII "\x80-\xFD"
+#define SIPCHARS_TEXT_UTF8CHAR "\x21-\xFD"
+#define SIPREG_ESCAPED "(%[0-9A-Fa-f]{2})"
+#define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+"
+#define SIPREG_TOKEN_NODOT "[" SIPCHARS_ALFANUM "!%*_+`'~\\-]+"
+#define SIPREG_WORD "(?:[][" SIPCHARS_ALFANUM "\\-.!%*_+`'~()<>:\\\\\"/?{}])+"
+#define SIPREG_ASCII_WITHOUT_COMMA "[\\x21-\\x2B\\x2D-\\x7E]+"
+#define SIPREG_TEXT_UTF8_TRIM "[\x21-\xFD]([\x21-\xFD]|(" SIPREG_LWS "))*"
+
+
+// sip version
+#define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]"
+
+// header name
+#define SIPREG_HNAME "(?:[][/?:+$" SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")+"
+
+// host name
+#define SIPREG_TOPLABEL "[" SIPCHARS_ALFA "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?"
+#define SIPREG_DOMAINLABEL "[" SIPCHARS_ALFANUM "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?"
+#define SIPREG_HOSTNAME "(" SIPREG_DOMAINLABEL "\\.)*" SIPREG_TOPLABEL "\\.?"
+
+#define SIPREG_HCOLON "[ ]*:" SIPREG_SWS
+#define SIPREG_COMMA SIPREG_SWS "[,]" SIPREG_SWS
+#define SIPREG_SEMI SIPREG_SWS "[;]" SIPREG_SWS
+#define SIPREG_EQUAL SIPREG_SWS "[=]" SIPREG_SWS
+#define SIPREG_SLASH SIPREG_SWS "[/]" SIPREG_SWS
+
+// without leading and trailing whitespace
+#define SIPREG_QUOTED_PAIR "[\\x5C][\\x00-\\x09\\x0B\\x0C\\x0E-\\x7F]"
+#define SIPREG_QUOTED_STRING "[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|(" SIPREG_QUOTED_PAIR "))*[\"]"
+#define SIPREG_DISPLAY_NAME "((" SIPREG_TOKEN "(" SIPREG_LWS SIPREG_TOKEN ")*)|(" SIPREG_QUOTED_STRING "))"
+
+#define SIPREG_COMMENT "[(]((" SIPREG_LWS ")|[\\x021-\\x5B\\x5D-\\xFD]|(" SIPREG_QUOTED_PAIR "))*[)]"
+
+// IPv4
+#define SIPREG_IP4 "([0-9]{1,3}\\.){3}[0-9]{1,3}"
+
+// IPv6
+#define SIPREG_HEX4 "[" SIPCHARS_HEXA "]{1,4}"
+#define SIPREG_HEXSEQ SIPREG_HEX4 "([:]" SIPREG_HEX4 ")*"
+#define SIPREG_HEXPART "(((" SIPREG_HEXSEQ ")?[:]{2}(" SIPREG_HEXSEQ ")?)|(" SIPREG_HEXSEQ "))"
+#define SIPREG_IP6 "[[]" SIPREG_HEXPART "([:]" SIPREG_IP4 ")?[]]"
+
+// host
+#define SIPREG_HOST "((" SIPREG_HOSTNAME ")|(" SIPREG_IP4 ")|(" SIPREG_IP6 "))"
+#define SIPREG_ABSOLUTE_URI "([" SIPCHARS_UNRESERVED "/;?:@&=+$,]|" SIPREG_ESCAPED ")+"
+
+// phone number (global or local)
+#define SIPREG_PHONE_NUMBER "(([+][\\-0-9.()]+)|[\\-0-9()*#A-Da-dPpWw]+)"
+
+#define SIPCHARS_PPARAM_UNRESERVED "][/:&+$"
+#define SIPREG_PPARAM "([" SIPCHARS_PPARAM_UNRESERVED SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")"
+#define SIPREG_PPARAM_ALLOWED "[" SIPCHARS_PPARAM_UNRESERVED SIPCHARS_UNRESERVED ";=%]+"
+
+#define SIPCHARS_HPARAM_UNRESERVED "][/?:+$"
+#define SIPREG_HPARAM "([" SIPCHARS_HPARAM_UNRESERVED SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")"
+#define SIPREG_HPARAM_ALLOWED "[" SIPCHARS_HPARAM_UNRESERVED SIPCHARS_UNRESERVED ";=%]+"
+
+#define SIPREG_TELPARAM_NAME "[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+"
+#define SIPREG_TELPARAM_VALUE "([\\x21\\x23-\\x3A\\x3C-\\x7E]+|(" SIPREG_QUOTED_STRING "))"
+#define SIPREG_TELPARAMS "([;]" SIPREG_TELPARAM_NAME "([=]" SIPREG_TELPARAM_VALUE ")?)+"
+
+#define SIPREG_GPARAM_VALUE "(([" SIPCHARS_ALFANUM ".!%*_+`'~\\-:]+)|(" SIPREG_QUOTED_STRING "))"
+
+// content type parameter
+#define SIPREG_M_PARAMETER SIPREG_TOKEN SIPREG_EQUAL "(?:" SIPREG_TOKEN "|" SIPREG_QUOTED_STRING ")"
+
+
+bool detect_separator(Regex & reg_separator, Buffer & buffer)
+{
+ bool bRes;
+ if (bRes = reg_separator.Match(buffer))
+ reg_separator.MovePast(buffer);
+ return bRes;
+}
+bool detect_comma(Buffer & buffer)
+{
+ Regex reg_comma ("^" SIPREG_COMMA);
+ return detect_separator(reg_comma, buffer);
+}
+
+bool detect_semi(Buffer & buffer) throw (DecodeError)
+{
+ Regex reg_semi ("^" SIPREG_SEMI);
+ return detect_separator(reg_semi, buffer);
+}
+
+void SipUrl::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csColon;
+ csColon.SetValue(":");
+
+ switch(field_id) {
+ case id_scheme:
+ csColon.Encode(buffer);
+ break;
+ default:
+ break;
+ }
+}
+
+void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+
+ static Regex reg_scheme ("^[" SIPCHARS_ALFA "][" SIPCHARS_ALFANUM "+.\\-]*");
+ static Regex reg_colon ("^[:]");
+ static Regex reg_userinfo ("^(?:[" SIPCHARS_UNRESERVED SIPCHARS_USER_UNRESERVED "]|" SIPREG_ESCAPED ")+(?::(?:[" SIPCHARS_UNRESERVED "&=+$,]|"SIPREG_ESCAPED")*)?[@]");
+ static Regex reg_phone ("^" SIPREG_PHONE_NUMBER);
+ static Regex reg_hostport ("^[][" SIPCHARS_ALFANUM ":.\\-]+");
+ static Regex reg_absolute_uri ("^" SIPREG_ABSOLUTE_URI);
+ static Regex reg_urlParams ("^;" SIPREG_PPARAM_ALLOWED);
+ static Regex reg_headers ("^[?]" SIPREG_PPARAM_ALLOWED);
+ static Regex reg_telParams ("^" SIPREG_TELPARAMS);
+
+ const char * pszScheme;
+ switch (id) {
+ case id_scheme:
+ reg_scheme.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_scheme.GetMatchedLength());
+ break;
+
+ case id_userInfo:
+ reg_colon.AssertMatch(buffer, this);
+ buffer.SetPosition(buffer.GetPosition() + 8);
+ pszScheme = Get_scheme().GetValue();
+ SetHypFieldIsPresent (id, 0);
+ // user-info is not decoded in case of absoluteURI
+ if (is_sip_scheme(pszScheme)) {
+ if (reg_userinfo.Match (buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength (id, reg_userinfo.GetMatchedLength() - 8);
+ }
+ }
+ // telephone numbers are decoded to the userInfo field
+ else if (is_tel_scheme(pszScheme)){
+ reg_phone.AssertMatch(buffer, this);
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength (id, reg_phone.GetMatchedLength());
+ }
+ else { // absoluteURI
+ if (reg_absolute_uri.Match (buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength(id, reg_absolute_uri.GetMatchedLength());
+ }
+ }
+ break;
+
+ case id_hostPort:
+ pszScheme = Get_scheme().GetValue();
+ if (is_sip_scheme(pszScheme)) {
+ // remove '@'
+ if (IsPresent (id_userInfo)) {
+ buffer.SetPosition(buffer.GetPosition() + 8);
+ }
+ if (reg_hostport.Match (buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength(id, reg_hostport.GetMatchedLength());
+ } else if (IsPresent (id_userInfo)) {
+ reg_hostport.Error(this, buffer);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ } else { // tel or absoluteURI
+ SetHypFieldIsPresent(id, 0);
+ }
+ break;
+
+ case id_urlParameters:
+ pszScheme = Get_scheme().GetValue();
+ if (is_sip_scheme(pszScheme) && reg_urlParams.Match (buffer)){
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength(id, reg_urlParams.GetMatchedLength());
+ } else if (is_tel_scheme(pszScheme)) {
+ // "tel" parameters have a different syntax (e.g. & is allowed within both id and values)
+ if (reg_telParams.Match (buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength(id, reg_telParams.GetMatchedLength());
+ } else {
+ SetHypFieldIsPresent(id, 0);
+ }
+ }
+ else {
+ SetHypFieldIsPresent(id, 0);
+ }
+ break;
+ case id_headers:
+ pszScheme = Get_scheme().GetValue();
+ if (is_sip_scheme(pszScheme) && reg_headers.Match (buffer)){
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength(id, reg_headers.GetMatchedLength());
+ } else {
+ SetHypFieldIsPresent(id, 0);
+ }
+ break;
+ }
+}
+
+void UserInfo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csColon;
+ csColon.SetValue(":");
+
+ switch(field_id) {
+ case id_password:
+ csColon.Encode(buffer);
+ break;
+ default:
+ break;
+ }
+}
+
+void UserInfo::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ Charstring csAt;
+ csAt.SetValue("@");
+
+ csAt.Encode(buffer);
+}
+
+void UserInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_username ("^([" SIPCHARS_UNRESERVED SIPCHARS_USER_UNRESERVED "]|" SIPREG_ESCAPED ")+");
+ static Regex reg_colon ("^[:]");
+ static Regex reg_password ("^([&=+$," SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")*");
+ static Regex reg_absolute_uri ("^" SIPREG_ABSOLUTE_URI);
+
+ // absoluteURI is mapped into SipUrl.userInfo.userOrTelephoneSubscriber and requires special handling
+ Variable* parent = GetParent();
+ bool bRequestUri = false;
+ if (parent != NULL) {
+ const char * pszParName = parent->GetTypeName();
+ if (strcmp(pszParName, "SipUrl") == 0) {
+ SipUrl * pSipUrl = dynamic_cast<SipUrl*>(parent);
+ const char * pszScheme = pSipUrl->Get_scheme().GetValue();
+ bRequestUri = !is_sip_scheme(pszScheme);
+ }
+ }
+ Regex * pRegex;
+ switch (id) {
+ case id_userOrTelephoneSubscriber:
+ pRegex = bRequestUri ? &reg_absolute_uri : &reg_username;
+ pRegex->AssertMatch (buffer, this);
+ SetHypFieldLength(id, pRegex->GetMatchedLength());
+ break;
+ case id_password:
+ if(!bRequestUri && reg_colon.Match(buffer)) {
+ buffer.SetPosition(buffer.GetPosition() + 8);
+ SetHypFieldIsPresent (id, 1);
+ reg_password.AssertMatch (buffer, this);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ break;
+ }
+}
+
+void UserInfo::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+ if (IsPresent (id_userOrTelephoneSubscriber))
+ normalise_escaped_string (Get_userOrTelephoneSubscriber());
+ if (IsPresent (id_password))
+ normalise_escaped_string (Get_password());
+}
+
+void HostPort::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csColon;
+ csColon.SetValue(":");
+
+ switch(field_id) {
+ case id_portField:
+ if(IsPresent(field_id)) {
+ Get_portField().SetFormat(Integer::AsciiDecimal);
+ csColon.Encode(buffer);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void HostPort::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_host ("^" SIPREG_HOST);
+ static Regex reg_colon ("^:");
+
+ switch (id) {
+ case id_host:
+ // host is always present
+ SetHypFieldIsPresent(id, 1);
+ reg_host.AssertMatch (buffer, this);
+ SetHypFieldLength(id, reg_host.GetMatchedLength());
+ break;
+
+ case id_portField:
+ if(reg_colon.Match (buffer)) {
+ buffer.SetPosition(buffer.GetPosition() + 8);
+ SetHypFieldIsPresent (id, 1);
+ Get_portField().SetFormat(Integer::AsciiDecimal);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ break;
+ }
+}
+
+void SemicolonParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csSemi;
+ csSemi.SetValue(";");
+
+ csSemi.Encode(buffer);
+}
+
+void SemicolonParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_separator ("^" SIPREG_SEMI);
+ if (reg_separator.Match(buffer)) // the separator can be in the beginning
+ reg_separator.MovePast(buffer);
+}
+
+void SemicolonParam_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ if (detect_semi (buffer))
+ SetHypSize (GetSize() + 1);
+ else
+ SetHypSize (-2);
+}
+
+void AmpersandParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csAmpersand, csQuestion;
+ csAmpersand.SetValue("&");
+ csQuestion.SetValue("?");
+
+ if(field_id == 0) {
+ csQuestion.Encode(buffer);
+ }
+ else {
+ csAmpersand.Encode(buffer);
+ }
+}
+
+void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_start ("^[?]");
+ static Regex reg_separator ("^[&]");
+
+ if (!buffer.GetBitsLeft())
+ return;
+ if (GetSize() == 0){
+ reg_start.AssertMatch(buffer, this);
+ buffer.SetPosition(buffer.GetPosition() + 8);
+ }
+ else if (reg_separator.Match(buffer))
+ buffer.SetPosition(buffer.GetPosition() + 8);
+ else
+ SetHypSize(-2);
+}
+
+void CommaParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csComma;
+ csComma.SetValue(",");
+
+ if(field_id != 0) {
+ csComma.Encode(buffer);
+ }
+}
+
+void CommaParam_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+ Variable* parent = GetParent();
+ if (parent != NULL) {
+ const char * pszParName = parent->GetTypeName();
+ if (strcmp(pszParName, "Credentials") == 0 ||
+ strcmp(pszParName, "AuthenticationInfo") == 0){
+ SetHypSize (GetSize() + 1);
+ SetHypAppend (1);
+ }
+ }
+}
+
+void CommaParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+ if (GetSize() > 0 && !reg_content.Match(buffer)) {
+ SetHypSize(-2);
+ }
+}
+
+void CommaParam_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+ if (detect_comma (buffer) && reg_content.Match (buffer))
+ SetHypSize (GetSize() + 1);
+ else
+ SetHypSize (-2);
+}
+
+
+void GenericParam::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csEqual;
+ csEqual.SetValue("=");
+
+ switch(field_id) {
+ case id_paramValue:
+ if(IsPresent(field_id)) {
+ csEqual.Encode(buffer);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_equal ("^" SIPREG_EQUAL);
+
+ static Regex reg_pparname ("^" SIPREG_PPARAM "+");
+ static Regex reg_pparvalue ("^" SIPREG_PPARAM "*");
+
+ static Regex reg_hparname ("^" SIPREG_HPARAM "+");
+ static Regex reg_hparvalue ("^" SIPREG_HPARAM "*");
+
+ static Regex reg_telparname ("^" SIPREG_TELPARAM_NAME);
+ static Regex reg_telparvalue ("^" SIPREG_TELPARAM_VALUE);
+
+ static Regex reg_gparname ("^" SIPREG_TOKEN);
+ static Regex reg_gparvalue ("^" SIPREG_GPARAM_VALUE);
+
+ Regex * preg_name = NULL;
+ Regex * preg_value;
+ bool bMandatoryParam = false;
+
+ Variable* parent = GetParent();
+ if (parent == NULL)
+ throw DecodeError (this, "Parent type cannot be null\n");
+ const char * pszParName = parent->GetTypeName();
+ if (strcmp(pszParName, "SemicolonParam_List") == 0){
+ parent = parent->GetParent();
+ if (parent != NULL && strcmp (parent->GetTypeName(), "SipUrl") == 0) {
+ SipUrl * pSipUrl = dynamic_cast<SipUrl*>(parent);
+ const char * pszScheme = pSipUrl->Get_scheme().GetValue();
+ if (is_sip_scheme(pszScheme)) {
+ preg_name = &reg_pparname;
+ preg_value = &reg_pparvalue;
+ }
+ else if (is_tel_scheme(pszScheme)) {
+ preg_name = &reg_telparname;
+ preg_value = &reg_telparvalue;
+ }
+ }
+ if (preg_name == NULL) {
+ preg_name = &reg_gparname;
+ preg_value = &reg_gparvalue;
+ }
+ }
+ else if (strcmp(pszParName, "AmpersandParam_List") == 0){
+ preg_name = &reg_hparname;
+ preg_value = &reg_hparvalue;
+ bMandatoryParam = true;
+ }
+ else if (strcmp(pszParName, "CommaParam_List") == 0){
+ preg_name = &reg_gparname;
+ preg_value = &reg_gparvalue;
+ }
+ else {
+ std::string message ("Unexpected parent type of parameter record: '");
+ message += pszParName;
+ message += '\n';
+ throw DecodeError (this, message);
+ }
+
+ char c;
+ switch (id) {
+ case id_id:
+ preg_name->AssertMatch (buffer, this);
+ SetHypFieldLength (id, preg_name->GetMatchedLength());
+ break;
+ case id_paramValue:
+ if (bMandatoryParam)
+ reg_equal.AssertMatch(buffer, this);
+ if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equal.Match(buffer))) {
+ buffer.SetPosition(buffer.GetPosition() + reg_equal.GetMatchedLength());
+ preg_value->AssertMatch (buffer, this);
+ SetHypFieldIsPresent (id, 1);
+ SetHypFieldLength (id, preg_value->GetMatchedLength());
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ break;
+ }
+}
+
+
+void RequestLine::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ Charstring cs;
+
+ cs.SetValue("\r\n");
+ cs.Encode(buffer);
+}
+
+void RequestLine::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring cs;
+
+ cs.SetValue(" ");
+
+ switch(field_id) {
+ case id_method:
+ case id_requestUri:
+ cs.Encode(buffer);
+ break;
+ default:
+ break;
+ }
+}
+
+void GenericParam::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+ Variable* param_list = GetParent();
+ if (!param_list)
+ return;
+
+ Variable* parent = param_list->GetParent();
+ if (!parent)
+ return;
+ const char* parent_type = parent->GetTypeName();
+
+ if (strcmp (parent_type, "SipUrl") == 0) {
+ normalise_escaped_string (Get_id());
+ }
+
+ if (IsPresent (id_paramValue))
+ {
+ Charstring& value = Get_paramValue();
+
+ if (value.GetLength() &&
+ (*value.GetValueBin() == '"')) {
+ normalise_quoted_string (value, true);
+ } else {
+ const char* par_name = Get_id().GetValue();
+
+ //TODO: add other unescaped params
+ if (strcmp (parent_type, "ViaBody") == 0) {
+ if ((strcmp (par_name, "branch") == 0)
+ || (strcmp (par_name, "ttl") == 0)
+ || (strcmp (par_name, "maddr") == 0)
+ || (strcmp (par_name, "received") == 0))
+ goto skip_escape;
+ } else if (strcmp (parent_type, "From") == 0) {
+ if (strcmp (par_name, "tag") == 0)
+ goto skip_escape;
+ }
+do_escape:
+ normalise_escaped_string (value);
+skip_escape: ;
+
+ }
+ }
+}
+
+void RequestLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_method ("^" SIPREG_TOKEN);
+ static Regex reg_request_uri ("[^ \t\n\r]+");
+ static Regex reg_sip_version (SIPREG_SIP_VERSION);
+ switch (id) {
+ case id_method:
+ reg_method.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_method.GetMatchedLength());
+ break;
+ case id_requestUri:
+ read_sp (buffer, this);
+ reg_request_uri.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_request_uri.GetMatchedLength());
+ break;
+ case id_sipVersion:
+ read_sp (buffer, this);
+ reg_sip_version.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_sip_version.GetMatchedLength());
+ break;
+ }
+}
+
+void RequestLine::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_crlf ("^\r\n");
+
+ reg_crlf.AssertMatch (buffer, this);
+ buffer.SetPosition(buffer.GetPosition() + reg_crlf.GetMatchedLength());
+}
+
+const char* Method::msSipMethods[] = {
+ "ACK_E",
+ "BYE_E",
+ "CANCEL_E",
+ "INVITE_E",
+ "OPTIONS_E",
+ "REGISTER_E",
+ "PRACK_E",
+ "SUBSCRIBE_E",
+ "NOTIFY_E",
+ "PUBLISH_E",
+ "REFER_E",
+ "UPDATE_E",
+ "MESSAGE_E",
+ "INFO_E",
+ "UNKNOWN_METHOD_E"
+ , "" };
+
+const char* Method::msMethodValues[] = {
+ "ACK",
+ "BYE",
+ "CANCEL",
+ "INVITE",
+ "OPTIONS",
+ "REGISTER",
+ "PRACK",
+ "SUBSCRIBE",
+ "NOTIFY",
+ "PUBLISH",
+ "REFER",
+ "UPDATE",
+ "MESSAGE",
+ "INFO"
+ "UNKNOWN_METHOD"
+ , "" };
+
+void Method::Encode (Buffer& buffer) throw (EncodeError)
+{
+ Charstring c;
+ const char ** ppMethod = msSipMethods;
+ const std::string & val = GetValueString();
+
+ int i = 0;
+ while (*(ppMethod[i]) && strcmp(ppMethod[i], val.c_str()) != 0)
+ i++;
+
+ if (*(ppMethod[i]) == 0) {
+ std::string message ("unsupported enum value '");
+ message += val;
+ message += '\n';
+ throw EncodeError (this, message);
+ }
+
+ c.SetValue(msMethodValues[i]);
+ c.Encode(buffer);
+}
+
+void Method::Decode (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_method ("^" SIPREG_TOKEN);
+
+ reg_method.AssertMatch (buffer, this);
+
+ const char ** ppValue = msMethodValues;
+ const std::string & val = reg_method.GetMatchedString();
+
+ int i = 0;
+ while (*(ppValue[i]) && strcmp(ppValue[i], val.c_str()) != 0) // case sensitive!!!
+ i++;
+
+ if (*(ppValue[i]) == 0) {
+ SetValueString ("UNKNOWN_METHOD_E");
+ } else {
+ SetValueString (msSipMethods[i]);
+ }
+ buffer.SetPosition(buffer.GetPosition() + reg_method.GetMatchedLength());
+}
+
+void StatusLine::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csWS;
+ csWS.SetValue(" ");
+
+ switch(field_id) {
+ case id_statusCode:
+ Get_statusCode().SetFormat(Integer::AsciiDecimal);
+ case id_reasonPhrase:
+ csWS.Encode(buffer);
+ break;
+ default:
+ break;
+ }
+}
+
+void StatusLine::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ Charstring csCRLF;
+ csCRLF.SetValue("\r\n");
+
+ csCRLF.Encode(buffer);
+}
+
+void StatusLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_sip_version (SIPREG_SIP_VERSION);
+ static Regex reg_status_code ("^[0-9]{3}");
+ static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII " \t]|" SIPREG_ESCAPED ")*");
+
+ switch (id) {
+ case id_sipVersion:
+ reg_sip_version.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_sip_version.GetMatchedLength());
+ break;
+ case id_statusCode:
+ read_sp (buffer, this);
+ reg_status_code.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_status_code.GetMatchedLength());
+ Get_statusCode().SetFormat(Integer::AsciiDecimal);
+ break;
+ case id_reasonPhrase:
+ read_sp (buffer, this);
+ reg_phrase.AssertMatch (buffer, this);
+ SetHypFieldLength (id, reg_phrase.GetMatchedLength());
+ break;
+ }
+}
+
+void StatusLine::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_crlf ("^\r\n");
+
+ reg_crlf.AssertMatch(buffer, this);
+ reg_crlf.MovePast(buffer);
+
+ normalise_escaped_string (Get_reasonPhrase());
+}
+
+class SipHeaderMap {
+public:
+ struct Entry {
+ Entry (const char* name, const char* abbrev, int id_msg_hdr, const char* id_fdn)
+ : mName (name), mAbbrev (abbrev), mIdMessageHeader (id_msg_hdr), mIdFieldName (id_fdn)
+ {}
+ const std::string mName;
+ const std::string mAbbrev;
+ const int mIdMessageHeader;
+ const std::string mIdFieldName;
+ };
+
+ static const Entry& GetByName (const std::string& key)
+ {
+ const mMapName_t& m = msInstance.mMapName;
+ mMapName_t::const_iterator it = m.find (key);
+ if (it != m.end()) {
+ return *it->second;
+ } else {
+ return *msInstance.mUndef;
+ }
+ }
+
+ static const Entry& GetByIdFieldName (const std::string& key)
+ {
+ const std::map<std::string, Entry*>& m = msInstance.mMapIdFieldName;
+ std::map <std::string, Entry*>::const_iterator it = m.find (key);
+ if (it != m.end()) {
+ return *it->second;
+ } else {
+ return *msInstance.mUndef;
+ }
+ }
+
+ static const Entry& GetByIdMessageHeader (int key)
+ {
+ const std::map<int, Entry*>& m = msInstance.mMapIdMessageHeader;
+ std::map <int, Entry*>::const_iterator it = m.find (key);
+ if (it != m.end()) {
+ return *it->second;
+ } else {
+ return *msInstance.mUndef;
+ }
+ }
+
+
+private:
+ void AddEntry (const Entry& entry) {
+ mEntries.push_back(entry);
+ Entry& e = *mEntries.rbegin();
+
+ //TODO: check unicity
+ mMapName[e.mName] = &e;
+ mMapName[e.mAbbrev] = &e;
+ mMapIdMessageHeader[e.mIdMessageHeader] = &e;
+ mMapIdFieldName[e.mIdFieldName] = &e;
+ }
+
+ SipHeaderMap() {
+
+#define SIP_HEADER_ADD(name, abbr, msghdr, fdname) AddEntry (Entry (#name, #abbr, MessageHeader::id_ ## msghdr, #fdname));
+
+ // Name Abbrev MessageHeader FieldName
+ // field id field id
+ SIP_HEADER_ADD (From, f, fromField, FROM_E);
+ SIP_HEADER_ADD (Via, v, via, VIA_E);
+ SIP_HEADER_ADD (Accept, , accept, ACCEPT_E);
+ SIP_HEADER_ADD (Call-ID, i, callId, CALL_ID_E);
+ SIP_HEADER_ADD (CSeq, , cSeq, CSEQ_E);
+ SIP_HEADER_ADD (Content-Length, l, contentLength, CONTENT_LENGTH_E);
+ SIP_HEADER_ADD (Content-Type, c, contentType, CONTENT_TYPE_E);
+ SIP_HEADER_ADD (Contact, m, contact, CONTACT_E);
+ SIP_HEADER_ADD (To, t, toField, TO_E);
+ SIP_HEADER_ADD (Accept-Encoding, , acceptEncoding, ACCEPT_ENCODING_E);
+ SIP_HEADER_ADD (Accept-Language, , acceptLanguage, ACCEPT_LANGUAGE_E);
+ SIP_HEADER_ADD (Max-Forwards, , maxForwards, MAX_FORWARDS_E);
+ SIP_HEADER_ADD (Alert-Info, , alertInfo, ALERT_INFO_E);
+ SIP_HEADER_ADD (Require, , require, REQUIRE_E);
+ SIP_HEADER_ADD (Proxy-Require, , proxyRequire, PROXY_REQUIRE_E);
+ SIP_HEADER_ADD (Record-Route, , recordRoute, RECORD_ROUTE_E);
+ SIP_HEADER_ADD (Allow, , allow, ALLOW_E);
+ SIP_HEADER_ADD (Authentication-Info, , authenticationInfo, AUTHENTICATION_INFO_E);
+ SIP_HEADER_ADD (Authorization, , authorization, AUTHORIZATION_E);
+ SIP_HEADER_ADD (Call-Info, , callInfo, CALL_INFO_E);
+ SIP_HEADER_ADD (Content-Disposition, , contentDisposition, CONTENT_DISPOSITION_E);
+ SIP_HEADER_ADD (Content-Encoding, e, contentEncoding, CONTENT_ENCODING_E);
+ SIP_HEADER_ADD (Content-Language, , contentLanguage, CONTENT_LANGUAGE_E);
+ SIP_HEADER_ADD (Date, , date, DATE_E);
+ SIP_HEADER_ADD (Error-Info, , errorInfo, ERROR_INFO_E);
+ SIP_HEADER_ADD (Expires, , expires, EXPIRES_E);
+ SIP_HEADER_ADD (In-Reply-To, , inReplyTo, IN_REPLY_TO_E);
+ SIP_HEADER_ADD (MIME-Version, , mimeVersion, MIME_VERSION_E);
+ SIP_HEADER_ADD (Min-Expires, , minExpires, MIN_EXPIRES_E);
+ SIP_HEADER_ADD (Organization, , organization, ORGANIZATION_E);
+ SIP_HEADER_ADD (Priority, , priority, PRIORITY_E);
+ SIP_HEADER_ADD (Proxy-Authenticate, , proxyAuthenticate, PROXY_AUTHENTICATE_E);
+ SIP_HEADER_ADD (Proxy-Authorization, , proxyAuthorization, PROXY_AUTHORIZATION_E);
+ SIP_HEADER_ADD (Reply-To, , replyTo, REPLY_TO_E);
+ SIP_HEADER_ADD (Retry-After, , retryAfter, RETRY_AFTER_E);
+ SIP_HEADER_ADD (Route, , route, ROUTE_E);
+ SIP_HEADER_ADD (Server, , server, SERVER_E);
+ SIP_HEADER_ADD (Supported, , supported, SUPPORTED_E);
+ SIP_HEADER_ADD (Subject, s, subject, SUBJECT_E);
+ SIP_HEADER_ADD (Timestamp, , timestamp, TIMESTAMP_E);
+ SIP_HEADER_ADD (Unsupported, , unsupported, UNSUPPORTED_E);
+ SIP_HEADER_ADD (User-Agent, , userAgent, USER_AGENT_E);
+ SIP_HEADER_ADD (Warning, , warning, WARNING_E);
+ SIP_HEADER_ADD (WWW-Authenticate, , wwwAuthenticate, WWW_AUTHENTICATE_E);
+ SIP_HEADER_ADD (RSeq, , rSeq, RSEQ_E);
+ SIP_HEADER_ADD (RAck, , rAck, RACK_E);
+ SIP_HEADER_ADD (Allow-Events, u, allowEvents, ALLOW_EVENTS_E);
+ SIP_HEADER_ADD (Event, o, event, EVENT_E);
+ SIP_HEADER_ADD (Subscription-State, , subscriptionState, SUBSCRIPTION_STATE_E);
+ SIP_HEADER_ADD (P-Media-Authorization, , pMediaAuthorization, P_MEDIA_AUTHORIZATION_E);
+ SIP_HEADER_ADD (Privacy, , privacy, PRIVACY_E);
+ SIP_HEADER_ADD (P-Asserted-Identity, , pAssertedID, P_ASSERTED_ID_E);
+ SIP_HEADER_ADD (P-Preferred-Identity, , pPreferredID, P_PREFERRED_ID_E);
+ SIP_HEADER_ADD (Reason, , reason, REASON_E);
+ SIP_HEADER_ADD (Path, , path, PATH_E);
+ SIP_HEADER_ADD (Security-Client, , securityClient, SECURITY_CLIENT_E);
+ SIP_HEADER_ADD (Security-Server, , securityServer, SECURITY_SERVER_E);
+ SIP_HEADER_ADD (Security-Verify, , securityVerify, SECURITY_VERIFY_E);
+ SIP_HEADER_ADD (P-Associated-URI, , pAssociatedURI, P_ASSOCIATED_URI_E);
+ SIP_HEADER_ADD (P-Called-Party-ID, , pCalledPartyID, P_CALLED_PARTY_E);
+ SIP_HEADER_ADD (P-Visited-Network-ID, , pVisitedNetworkID, P_VISITED_NETWORK_E);
+ SIP_HEADER_ADD (P-Access-Network-Info, , pAccessNetworkInfo, P_ACCESS_NETWORK_INFO_E);
+ SIP_HEADER_ADD (P-Charging-Function-Addresses, , pChargingFunctionAddresses, P_CHARGING_FUNCTION_ADDRESSES_E);
+ SIP_HEADER_ADD (P-Charging-Vector, , pChargingVector, P_CHARGING_VECTOR_E);
+ SIP_HEADER_ADD (Refer-To, r, referTo, REFER_TO_E);
+ SIP_HEADER_ADD (Refer-Sub, r, referSub, REFER_SUB_E);
+ SIP_HEADER_ADD (Service-Route, , serviceRoute, SERVICE_ROUTE_E);
+ SIP_HEADER_ADD (Accept-Contact, a, acceptContact, ACCEPT_CONTACT_E);
+ SIP_HEADER_ADD (Referred-By, b, referredBy, REFERRED_BY_E);
+ SIP_HEADER_ADD (Session-Expires, , sessionExpires, SESSION_EXPIRES_E);
+ SIP_HEADER_ADD (Min-SE, , minSE, MIN_SE_E);
+ SIP_HEADER_ADD (History-Info, , historyInfo, HISTORY_INFO_E);
+ SIP_HEADER_ADD (P-Early-Media, , pEarlyMedia, P_EARLY_MEDIA_E);
+ SIP_HEADER_ADD (P-Asserted-Service, , pAssertedService, P_ASSERTED_SERVICE_E);
+ {
+ mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
+ Entry& e = *mEntries.rbegin();
+ mMapIdMessageHeader[e.mIdMessageHeader] = &e;
+ mUndef = &e;
+ }
+ }
+
+ static SipHeaderMap msInstance;
+
+ std::list<Entry> mEntries;
+ Entry* mUndef;
+
+ class StringCaseInsensitiveComparator
+ {
+ public:
+ bool operator() (const std::string& a, const std::string& b) const
+ {
+ return (strcasecmp (a.c_str(), b.c_str()) < 0);
+ }
+ };
+
+ typedef std::map <std::string, Entry*, StringCaseInsensitiveComparator> mMapName_t;
+ mMapName_t mMapName;
+ std::map <std::string, Entry*> mMapIdFieldName;
+ std::map <int, Entry*> mMapIdMessageHeader;
+
+};
+
+SipHeaderMap SipHeaderMap::msInstance;
+
+void MessageHeader::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ Charstring csCRLF;
+ csCRLF.SetValue("\r\n");
+
+ csCRLF.Encode(buffer);
+}
+
+void MessageHeader::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csCRLF;
+ csCRLF.SetValue("\r\n");
+
+ if(IsPresent(field_id)) {
+ csCRLF.Encode(buffer);
+ }
+}
+
+void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_header_name ("^(" SIPREG_TOKEN ")" SIPREG_HCOLON);
+ static Regex reg_crlf ("^\r\n");
+
+ if (reg_crlf.Match (buffer)) {
+ reg_crlf.MovePast (buffer);
+ SetHypNextField (-2); // end of the headers
+ } else {
+ reg_header_name.AssertMatch (buffer, this);
+
+ const SipHeaderMap::Entry& hdr = SipHeaderMap::GetByName(reg_header_name.GetMatchedString (1));
+ int id = hdr.mIdMessageHeader;
+
+ // check that this field is not duplicated
+ if (IsPresent(id)) {
+ switch (id) {
+ case id_accept:
+ case id_acceptEncoding:
+ case id_acceptLanguage:
+ case id_alertInfo:
+ case id_allow:
+ case id_authorization:
+ case id_contact:
+ case id_contentEncoding:
+ case id_contentLanguage:
+ case id_errorInfo:
+ case id_inReplyTo:
+ case id_proxyAuthorization:
+ case id_proxyRequire:
+ case id_recordRoute:
+ case id_require:
+ case id_route:
+ case id_supported:
+ case id_unsupported:
+ case id_via:
+ case id_warning:
+ case id_allowEvents:
+ case id_pMediaAuthorization:
+ case id_pAssertedID:
+ case id_pPreferredID:
+ case id_reason:
+ case id_path:
+ case id_securityClient:
+ case id_securityServer:
+ case id_securityVerify:
+ case id_pAssociatedURI:
+ case id_pCalledPartyID:
+ case id_pVisitedNetworkID:
+ case id_acceptContact:
+ case id_historyInfo:
+ case id_pEarlyMedia:
+ case id_undefinedHeader_List:
+ // these fields can appear multiple times
+ break;
+ default:
+ DecodeError e (this);
+ e.Msg() << "Duplicated field in the message: "
+ << hdr.mName << std::endl;
+ throw (e);
+ }
+ }
+ SetHypNextField (id);
+ }
+}
+
+void MessageHeader::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_crlf ("^\r\n");
+
+ reg_crlf.AssertMatch (buffer, this);
+ buffer.SetPosition(buffer.GetPosition() + reg_crlf.GetMatchedLength());
+}
+
+
+const char* FieldName::msFields[] = {
+ "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",
+ "RACK_E",
+ "RSEQ_E",
+ "ALLOW_EVENTS_E",
+ "EVENT_E",
+ "SUBSCRIPTION_STATE_E",
+ "P_MEDIA_AUTHORIZATION_E",
+ "PRIVACY_E",
+ "P_ASSERTED_ID_E",
+ "P_PREFERRED_ID_E",
+ "REASON_E",
+ "REFER_TO_E",
+ "REFER_SUB_E",
+ "REFERRED_BY_E",
+ "HISTORY_INFO_E",
+ "P_MEDIA_AUTH_E",
+ "PATH_E",
+ "SECURITY_CLIENT_E",
+ "SECURITY_SERVER_E",
+ "SECURITY_VERIFY_E",
+ "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",
+ "SERVICE_ROUTE_E",
+ "ACCEPT_CONTACT_E",
+ "MIN_SE_E",
+ "SESSION_EXPIRES_E",
+ "P_ASSERTED_SERVICE_E",
+ "P_EARLY_MEDIA_E"
+ , "" };
+
+void FieldName::Encode (Buffer& buffer) throw (EncodeError)
+{
+ Charstring c;
+
+ c.SetValue ((SipHeaderMap::GetByIdFieldName(GetValueString()).mName + ": ").c_str());
+ c.Encode(buffer);
+}
+
+void FieldName::Decode (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_header_name ("^([A-Za-z\\-]+)" SIPREG_HCOLON);
+
+ reg_header_name.AssertMatch (buffer, this);
+ SetValueString (SipHeaderMap::GetByName(reg_header_name.GetMatchedString (1)).mIdFieldName.c_str());
+
+ buffer.SetPosition(buffer.GetPosition() + reg_header_name.GetMatchedLength());
+}
+
+void Addr_Union::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_name_addr ("^" SIPREG_DISPLAY_NAME "?" SIPREG_SWS "<[^\\r\\n]*>");
+
+ mPosition = buffer.GetPosition();
+
+ SetHypChosenId (
+ reg_name_addr.Match (buffer)
+ ? id_nameAddr
+ : id_addrSpecUnion
+ );
+}
+
+void Addr_Union::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+ if (GetChosenId() == id_addrSpecUnion) {
+ Variable* parent = GetParent();
+ if (parent && (
+ (strcmp (parent->GetTypeName(), "From") == 0) ||
+ (strcmp (parent->GetTypeName(), "ContactAddress") == 0) ||
+ (strcmp (parent->GetTypeName(), "ReplyTo") == 0) ||
+ (strcmp (parent->GetTypeName(), "To") == 0) ))
+ {
+ // in the case we decoded an address not enclosed in <> in a
+ // From, Contact, Reply-To or To header, then we must ensure
+ // that it does not contain comma, semicolon or question mark
+
+ const unsigned char* start = buffer.GetValueBin() + (mPosition/8);
+ const unsigned char* end = buffer.GetValueBin() + (buffer.GetPosition()/8);
+
+ for (const unsigned char* p=start ; p!=end ; p++) {
+ switch (*p) {
+ case ';':
+ Get_addrSpecUnion().SetField (SipUrl::id_urlParameters, new Undef);
+ case '?':
+ Get_addrSpecUnion().SetField (SipUrl::id_headers, new Undef);
+ buffer.SetPosition ((p-start) * 8 + mPosition);
+ goto finished;
+ case ',':
+ throw DecodeError (this, "Url must not contain unescaped comma, semicolor or question mark if it is not enclosed with <>\n");
+ default: ;
+ }
+ }
+ finished: ;
+ }
+ }
+}
+
+void ContactBody::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_asterisk ("^[*]");
+ if (reg_asterisk.Match (buffer)) {
+ if (GetChosenId() == id_contactAddresses)
+ throw DecodeError (this, "cannot process wildcard; contactAddresses option is already selected\n");
+ SetHypChosenId (id_wildcard);
+ SetHypFieldLength(id_wildcard, 8);
+ } else {
+ if (GetChosenId() == id_wildcard)
+ throw DecodeError (this, "cannot process address list; wildcart option is already selected\n");
+ SetHypChosenId (id_contactAddresses);
+ }
+}
+
+void ContactAddress_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csComma;
+ csComma.SetValue(",");
+
+ if(field_id != 0) {
+ csComma.Encode(buffer);
+ }
+}
+
+void ContactAddress_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+ SetHypSize (GetSize() + 1);
+ SetHypAppend (1);
+}
+
+void ContactAddress_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ if (detect_comma (buffer))
+ SetHypSize (GetSize() + 1);
+ else
+ SetHypSize (-2);
+}
+
+void ContactAddress::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_semicolon ("^" SIPREG_SEMI);
+ if (id == id_contactParams) {
+ if(reg_semicolon.Match(buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_semicolon ("^;");
+ if (id == id_fromParams) {
+ if(reg_semicolon.Match(buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void To::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_semicolon ("^;");
+ if (id == id_toParams) {
+ if(reg_semicolon.Match(buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void ReplyTo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_semicolon ("^;");
+ if (id == id_replyToParams) {
+ if(reg_semicolon.Match(buffer)) {
+ SetHypFieldIsPresent (id, 1);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void Accept::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+ static Regex reg_accept_args ("^[^;,\\r\\n]");
+ if (id == id_acceptArgs){
+ if(reg_accept_args.Match(buffer) || Get_acceptArgs().GetSize() > 0) {
+ SetHypFieldIsPresent (id, 1);
+ } else if (Get_acceptArgs().GetSize() == 0){
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_media_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
+ static Regex reg_semicolon ("^" SIPREG_SEMI);
+ switch (id){
+ case id_mediaRange:
+ reg_media_range.AssertMatch (buffer, this);
+ SetHypFieldLength(id, reg_media_range.GetMatchedLength());
+ break;
+ case id_acceptParam:
+ if (reg_semicolon.Match (buffer) ) {
+ SetHypFieldIsPresent(id, 1);
+ } else {
+ SetHypFieldIsPresent(id, 0);
+ }
+ }
+}
+
+void AcceptBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csComma;
+ csComma.SetValue(",");
+
+ if(field_id != 0) {
+ csComma.Encode(buffer);
+ }
+}
+
+void AcceptBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+ // we assume that we are decoding one field at onece
+ // multiple fields are handled by successively decoding
+ // the via field several times in MessageHeader
+ SetHypSize (GetSize() + 1);
+ SetHypAppend (1);
+}
+
+void AcceptBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+ if (GetSize() > 0 && !reg_content.Match(buffer)) {
+ SetHypSize(-2);
+ }
+}
+
+void AcceptBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+ if (detect_comma (buffer) && reg_content.Match (buffer))
+ SetHypSize (GetSize() + 1);
+ else
+ SetHypSize (-2);
+}
+
+void AcceptEncoding::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+ static Regex reg_content_coding ("^[^,\\r\\n]");
+ if (id == id_contentCoding){
+ if(reg_content_coding.Match(buffer) ||
+ Get_contentCoding().GetSize() > 0) {
+ SetHypFieldIsPresent (id, 1);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void ContentCoding_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csComma;
+ csComma.SetValue(",");
+
+ if(field_id != 0) {
+ csComma.Encode(buffer);
+ }
+}
+
+void ContentCoding_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+ if (GetSize() == 0)
+ reg_content.AssertMatch(buffer, this);
+ else if (!reg_content.Match(buffer)) {
+ SetHypSize(-2);
+ return;
+ }
+ SetHypFieldLength(reg_content.GetMatchedLength());
+}
+
+
+void ContentCoding_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+ if (detect_comma (buffer) && reg_content.Match (buffer))
+ SetHypSize (GetSize() + 1);
+ else
+ SetHypSize (-2);
+}
+
+void AcceptLanguage::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+ static Regex reg_language_body ("^[^;,\\r\\n]");
+ if (id == id_languageBody){
+ if(reg_language_body.Match(buffer) ||
+ Get_languageBody().GetSize() > 0) {
+ SetHypFieldIsPresent (id, 1);
+ } else {
+ SetHypFieldIsPresent (id, 0);
+ }
+ }
+}
+
+void LanguageBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+ static Regex reg_language_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
+ static Regex reg_semicolon ("^" SIPREG_SEMI);
+ switch (id){
+ case id_languageRange:
+ reg_language_range.AssertMatch (buffer, this);
+ SetHypFieldLength(id, reg_language_range.GetMatchedLength());
+ break;
+ case id_acceptParam:
+ if (reg_semicolon.Match (buffer)) {
+ SetHypFieldIsPresent(id, 1);
+ } else {
+ SetHypFieldIsPresent(id, 0);
+ }
+ }
+}
+
+void LanguageBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ Charstring csComma;
+ csComma.SetValue(",");
+
+ if(field_id != 0) {
+ csComma.Encode(buffer);
+ }
+}
+
+void LanguageBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+ // we assume that we are decoding one field at onece
+ // multiple fields are handled by successively decoding
+ // the via field several times in MessageHeader
+ SetHypSize (GetSize() + 1);