///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright Test Competence Center (TCC) ETH 2016                           //
//                                                                           //
// The copyright to the computer  program(s) herein  is the property of TCC. //
// The program(s) may be used and/or copied only with the written permission //
// of TCC or in accordance with  the terms and conditions  stipulated in the //
// agreement/contract under which the program(s) has been supplied.          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
//
//  File:               MobileL3_CommonIE_Types.ttcn
//  Rev:                R1B
//  Prodnr:             CNL 113 832
//  Contact:            http://ttcn.ericsson.se
//  Reference:          3GPP TS 24.008 v13.4.0

module  MobileL3_CommonIE_Types {

import from General_Types all;

// This type is a container for all necessary MS related parameters
type record MS_parameters
{
  integer       imsi_length,  //in
  BIT4          imsi_firstdigit,
  octetstring   imsi,
  octetstring   number,
  integer       SCCP_connId, //connection Id of currently used SCCP connection
  integer       L3_NSD,  // actual value of L3 NSD
  BIT1          tiFlag   // '0'B for call originator, '1' for call destination
  // this is an example how to set the value
  // tsp_imsi_1_firstdigit := '0010'B
  // tsp_imsi_1 :=  '26200103000015'O;   // '262021030000051'O;
  // tsp_calledPartyBCD_Number_digits := '7112300020'O  ;   // '1721030002'O
}

// Use these Types instead of repeating it !

type record Type1_V
{
  BIT4  dummy,
  BIT4  valuePart
};

type record Type1_TV
{
  BIT4  valuePart,
  BIT4  elementIdentifier
};

type record Type2
{
  OCT1  elementIdentifier
};

type record Type3_V
{
  OCTN  valuePart
};

type record Type3_TV
{
  OCT1  elementIdentifier,
  OCTN  valuePart
};

type record Type4_LV
{
  LIN1  lengthIndicator,
  OCTN  valuePart
} with { variant (lengthIndicator) "LENGTHTO (valuePart)"};

type record Type4_TLV
{
  OCT1  elementIdentifier,
  LIN1  lengthIndicator,
  OCTN  valuePart
} with { variant (lengthIndicator) "LENGTHTO (valuePart)"};

///////////////////////////////////////
//   IE Type definitions
///////////////////////////////////////

type record ML3_NotifySS_Arg
{
  OCT1  sequenceTag,
  OCT1  sequenceLength,
  OCT1  ssCodeTag,
  OCT1  ssCodeLength,
  OCT1  ssCodeValue,
  OCT1  ssIndicatorTag,
  OCT1  ssIndicatorLength,
  OCT1  ssIndicatorValue
};


//============================================================================
// 10.5.1 Common Information elements
//============================================================================

// 10.5.1.1 Cell Identity
type record CellIdentity
{
  OCT1  elementIdentifier,
  OCT2  cIvalue
};

// 10.5.1.2 CipheringKeySequenceNumber
type record CipheringKeySequenceNumberTV
{
  CipheringKeySequenceNumberV  keySequence,
  BIT4                         elementIdentifier
} with { variant "PRESENCE (elementIdentifier = '1000'B)"; };

type record CipheringKeySequenceNumberV
{
  BIT3               keySequence,
  BIT1               spare
};

//24.008/10.5.1.3 Location Area Identification
type record LocationAreaIdentification_V
{
  OCT3  mcc_mnc,
  OCT2  lac
};

type record LocationAreaIdentification_TV
{
  OCT1  elementIdentifier,
  OCT3  mcc_mnc,
  OCT2  lac
};

// 24.008/ 10.5.1.4 Mobile Identity
type record MobileIdentityTLV
{
  BIT7               elementIdentifier,
  BIT1               spare1,
  MobileIdentityLV   mobileIdentityLV
};

type record MobileIdentityLV
{
  LIN1               lengthIndicator,
  MobileIdentityV    mobileIdentityV
} with { variant (lengthIndicator) "LENGTHTO (mobileIdentityV)"};

type record MobileIdentityV
{
  BIT3                         typeOfIdentity,
  OddEvenInd_Identity          oddEvenInd_identity
} with { variant (oddEvenInd_identity) "CROSSTAG
  (
  imei,                     typeOfIdentity ='010'B;
  imsi,                     typeOfIdentity ='001'B;
  imei_sv,                  typeOfIdentity ='011'B;
  tmsi_ptmsi,               typeOfIdentity ='100'B;
  tmgi_and_MBMS_SessionID,  typeOfIdentity ='101'B;
  no_identity,              typeOfIdentity ='000'B;
  )"};


type union OddEvenInd_Identity
{
  IMSI_L3                  imsi,  // avoid name conflict with RANAP
  IMEI_L3                  imei,     // avoid name conflict with RANAP
  IMEI_SV                  imei_sv,
  TMSI_PTMSI               tmsi_ptmsi,
  TMGI_and_MBMS_SessionID  tmgi_and_MBMS_SessionID,
  No_Identity              no_identity
};

type record IMSI_L3
{
  BIT1               oddevenIndicator,       // '1'B or '0'B
  hexstring          digits  length(5..15),
  BIT4               fillerDigit  optional   // B'1111, fillerDigit is present
  // if oddevenIndicator=0
} with { variant (fillerDigit) "PRESENCE (oddevenIndicator   = '0'B) ";};

type record IMEI_L3
{
  BIT1               oddevenIndicator,   // '1'B
  hexstring          digits  length(15)
};

type record TMSI_PTMSI
{
  BIT1               oddevenIndicator, // '0'B
  BIT4               fillerDigit, // B'1111
  OCT4               octets
};

type record IMEI_SV
{
  BIT1               oddevenIndicator,  // '0'B
  hexstring          digits length(16),
  BIT4               fillerDigit    // filler '1111'B
};

type record TMGI_and_MBMS_SessionID
{
  BIT1               oddevenIndicator,
  BIT1               mCC_MNCIndicator,  // 1: present
  BIT1               mBMS_SessionIdentityIndicator,  // 1: present
  BIT2               spare,
  OCT3               mBMS_ServiceID,
  HEX1               mccDigit1,
  HEX1               mccDigit2,
  HEX1               mccDigit3,
  HEX1               mncDigit3,
  HEX1               mncDigit1,
  HEX1               mncDigit2,
  OCT1               mBMS_SessionIdentity
}

type record No_Identity
{
  BIT1               oddevenIndicator,  // '0'B (guessed)
  hexstring          fillerDigits length(5) // length to be "3" if the GMM identification procedure is used
};

// 24.008/ 10.5.1.5 MobileStationClassmark1
type record MobileStationClassmark1_TV
{
  OCT1   elementIdentifier, //'???'H
  BIT3   rf_PowerCapability,
  BIT1   a5_1,
  BIT1   esind,
  BIT2   revisionLevel,
  BIT1   spare1_1
};

type record MobileStationClassmark1_V
{
  BIT3  rf_PowerCapability,
  // class1 (000) (for GSM+DCS+PCS)
  // class2 (001) (for GSM+DCS+PCS)
  // class3 (010) (for GSM+DCS+PCS)
  // class4 (011) (only for GSM)
  // class5 (100) (only for GSM)
  BIT1  a5_1,
  // encryption algor. A5/available  1  (1)
  // encryption algor. A5/1 available  not  (0)
  BIT1  esind,
  BIT2  revisionLevel,
  BIT1  spare1_1
};

// 24.008/ 10.5.1.6 MobileStationClassmark2
//4th octet:
type record MobileStationClassmark2_oct4
{
  BIT1  fc, // '0'B no MS support of E/R_GSM
  // '1'B      MS support of E/R_GSM
  ////BIT2  spare1_2, // '00'B  removed by ethbaat
  BIT1  vgcs,//'0'B no VGCS capability
  //'1'B  VGCS capability and notifications wanted
  BIT1  vbs, //'0'B no VBS capability,
  //  '1'B VBS capability and notifications wanted
  BIT1  sm_Capability, // '0'B SM capbility present  not
  // '1'B SM capbility        present
  BIT2 ss_ScreenIndicator,
  // '00'B default value of phase1 (GSM+DCS) reserved or (PCS)
  // '01'B capability of notation  ellipsis
  // '10'B for future use
  // '11'B for use  future
  BIT1  ps_Capability, // 'x'B  ignored, received  if
  BIT1  spare2_1   // '0'B
};


//5th octet ( Table 10.5.6a ):
type record MobileStationClassmark2_oct5
{
  BIT1  a5_2,     // '0'B encryption algorithm A5/2 available not(0)
  // '1'B encryption algorithm A5/available  2  (1)
  BIT1  a5_3,     // '0'B encryption algorithm A5/3 available not(0)
  // '1'B encryption algorithm A5/available  3  (1)
  //removed by ethbaat: BIT5  spare3_5, //   '00000'B
  BIT1  cmsp,
  BIT1  solsa,
  BIT1  ucs2,
  BIT1  lcsva_cap,
  BIT1  spare5_7,
  BIT1  cm3       // '0'B  no additional capability info
  // '1'B The MS supports options that are indicated in classmark 3 IE
  //      (additional info  capability)
};

type record MobileStationClassmark2_LV
{
  LIN1  lengthIndicator, // '01'O..'03'O
  BIT3  rf_PowerCapability, //        '000'B class1 (for GSM+DCS+PCS)
  //        '001'B class2 (for GSM+DCS+PCS)
  //        '010'B class3 (for GSM+DCS+PCS)
  //        '011'class4  B  (only for GSM)
  //        '100'class5  B  (only for GSM)
  BIT1  a5_1, // '0'B encryption algorithm A5/1 available (0)
  // '1'B encryption algorithm A5/1 not available  1  (1)
  BIT1  esind,
  // '0'B controlled early classmark sending option implemented not (0)
  // '1'B controlled early classmark sending implemented option (1)
  BIT2  revisionLevel, //   '00'B reserved for phase1 (GSM+DCS)
  //   '00'B reserved for GSM phase 1 (PCS)
  //   '01'B used by phase2 MSs  (GSM+DCS)
  //   '01'B used by PCS1900 MSs  phase1  (PCS)
  //   '10'B used by  MSs  R99  supporting
  //   '11'B reserved for future use
  BIT1  spare1_1, // '0'B
  MobileStationClassmark2_oct4  mobileStationClassmark2_oct4    optional,
  MobileStationClassmark2_oct5  mobileStationClassmark2_oct5    optional
} with { variant (lengthIndicator) "LENGTHTO (rf_PowerCapability, a5_1, esind,
  revisionLevel, spare1_1,
  mobileStationClassmark2_oct4,
  mobileStationClassmark2_oct5)"};

type record MobileStationClassmark2_TLV
{
  OCT1                        elementIdentifier,
  MobileStationClassmark2_LV  mobileStationClassmark2LV
} with {
  variant "PRESENCE (elementIdentifier = '11'O)";
};



//**********************************************************************
// 24.008/ 10.5.1.6 5th octet ( Table 10.5.6a ):
// almost the same as MobileStationClassmark2_LV, but
// _TLV ie elementIdentifier is present
// oct4 and oct5 is mandatory
// The record name is inherited from (and used in) old test cases
//**********************************************************************
type record ClassmarkInformationType2_forUMTS
{
  OCT1  elementIdentifier,
  //'33'O instead of '12'O (normal Classmark2)
  LIN1  lengthIndicator,
  //always '03'O (unlike normal ClassMark2, which can be 2 or 3)
  BIT3  rf_PowerCapability,   //  '000'B class1 (for GSM+DCS+PCS)
  //      '001'B class2 (for GSM+DCS+PCS)
  //      '010'B class3 (for GSM+DCS+PCS)
  //      '011'class4  B  (only for GSM)
  //      '100'class5  B  (only for GSM)
  BIT1  a5_1, //  '0'B encryption algorithm A5/1 available not (0)
  //  '1'B encryption algorithm A5/available  1  (1)
  BIT1  esind,
  //'0'B controlled early classmark sending option implemented not (0)
  //  '1'B controlled early classmark sending implemented  option  (1)
  BIT2  revisionLevel, //  '00'B reserved for phase1 (GSM+DCS)
  //  '00'reserved  B  (PCS)
  //  '01'B used by phase2 MSs  (GSM+DCS)
  //  '01'B used by PCS1900 MSs  phase1  (PCS)
  BIT1  spare1_1, // '0'B
  BIT1  fc, //         '0'B  no MS' support of E/R_GSM
  //   '1'B       MS' support of E/R_GSM
  BIT1  vgcs,//'0'B no VGCS capability
  //'1'B  VGCS capability and notifications wanted
  BIT1  vbs, //'0'B no VBS capability,
  //  '1'B VBS capability and notifications wanted
  BIT1  sm_Capability, //     '0'B SM capbility present  not
  // '1'B SM capability     present
  BIT2  ss_ScreenIndicator, //  '00'B default value of phase1 (GSM+DCS)
  //  '00'reserved  B  (PCS)
  //  '01'B capability of notation  ellipsis
  //  '10'B for future use
  //  '11'B for use  future
  BIT1  ps_Capability, // '0'B or '1'B ignored, received  if
  BIT1  spare2_1,  // '0'B,
  BIT1  a5_2, // '0'B encryption algorithm A5/2 available  not  (0)
  // '1'B encryption algorithm A5/available  2  (1)
  BIT1  a5_3, // '0'B encryption algorithm A5/3 available  not  (0)
  // '1'B encryption algorithm A5/available  3  (1)
  //BIT5  spare3_5, // '00000'B
  BIT1  cmsp,
  BIT1  solsa,
  BIT1  ucs2,
  BIT1  lcsva_cap,
  BIT1  spare5_7,
  BIT1  cm3   // '0'B no additional capability info
  // '1'B   additional info  capability
} with { variant (lengthIndicator) "LENGTHTO (rf_PowerCapability, a5_1, esind,
  revisionLevel, spare1_1, fc, vgcs, vbs,
  sm_Capability, ss_ScreenIndicator,
  ps_Capability, spare2_1, a5_2, a5_3,
  //spare3_5,
  cmsp,solsa,ucs2,lcsva_cap,spare5_7,
  cm3)"};



//24.008/ 10.5.1.7
type record MobileStationClassmark3_TLV
{
  OCT1  elementIdentifier,
  LIN1  lengthIndicator,
  OCTN  valuePart
} with {
  variant "PRESENCE (elementIdentifier = '20'O)"
  variant (lengthIndicator) "LENGTHTO (valuePart)"
};


type record MobileStationClassmark3_LV
{
  LIN1  lengthIndicator,
  OCTN  valuePart
} with { variant (lengthIndicator) "LENGTHTO (valuePart)"};
// used in: PDU_ML3_Setup_MSC_MS, PDU_ML3_CallProceeding,
//          PDU_ML3_CMServiceRequest

type record UTRACSGCellsReporting
{
  BIT1                  reportingofUTRANCSGCellsSupport
} with {
  variant "FIELDORDER(msb)"
}

type record VAMOSLevel
{
  BIT2                  vAMOSSupport
} with {
  variant "FIELDORDER(msb)"
}

//24.008/ 10.5.1.8 Spare half octet ---- not used

//24.008/ 10.5.1.9 Descriptive group or broadcast call reference
type record DescriptiveGroupOrBroadcastCallReference_V
{
  bitstring         binaryCodingOfGroupOrBroadcastCallReference length (27),
  BIT1              sF,
  BIT1              aF,
  BIT3              callPriority,
  BIT4              cipheringInformation,
  BIT4              spare
} with {  variant (binaryCodingOfGroupOrBroadcastCallReference,sF,aF,
    callPriority,cipheringInformation,spare)  "FIELDORDER(msb)"};

//10.5.1.10 Group Cipher Key Number
type record groupCipherKeyNumber_TV
{
  BIT4 valuePart,
  BIT4 elementIdentifier
};

type BIT4 groupCipherKeyNumber_V;


//24.008/10.5.1.10a
type record PdAndSapi
{
  BIT4 protocolDiscriminator,
  BIT2 sapi,
  BIT2 spare2
};

//10.5.1.11 Priority Level
type record PriorityLevel_ML3
{
  BIT3  callPriority, // B'...._000 no applied  priority
  // B'...._001 call priority level 4
  // B'...._010 call priority level 3
  // B'...._011 call priority level 2
  // B'...._100 call priority level 1
  // B'...._101 call priority level 0
  // B'...._110 call priority level B
  // B'...._111 call priority level A
  BIT1  spare1_1,      // B'....0.._
  // modified by ethbaat:OCT1  elementIdentifier for...
  BIT4  elementIdentifier       // B'1000' type 1 IEI Priority level
};
//ending "_ML3" added, because ambiguities of (RANAP is also using this name)


//10.5.1.12 Core Network System Information
// not implemented yet

//10.5.1.13 PLMN List
type record PLMNListTLV
{
  BIT7               elementIdentifier,
  BIT1               spare1,
  LIN1               lengthIndicator,
  octetstring        digits  length(3..45) // collapsed into one octetstring
  // instead of digits
} with { variant "PRESENCE (elementIdentifier = '1001010'B)";
  variant (lengthIndicator) "LENGTHTO (digits)"};
  
//10.5.1.15
type record MS_NetworkFeatureSupportTV
{
  BIT1      extendedPeriodicTimers,
  BIT3      spare,
  BIT4      elementIdentifier
}

// GPRS Timer3 - 10.5.7.4a
type record GPRSTimer3TLV
{
  OCT1               elementIdentifier,
  LIN1               lengthIndicator,
  GPRSTimer3V        gprsTimer3V
} with { 
   variant (lengthIndicator) "LENGTHTO (gprsTimer3V)"
}; 

type record GPRSTimer3V
{
  BIT5               timerValue,
  BIT3               unit
};

//****************************************************************************
// Common elements in CC and SS:
//****************************************************************************

//24.008/10.5.4.11 Cause
type record Diagnostics
{
  octetstring data   // to split into pieces????
} with { variant "EXTENSION_BIT (yes)"};

// This type is added for handling extension bit in octet 3 of Cause IE
type record ML3_Cause_oct3
{
  BIT4  location,   //      '0000'user  B
  //      '0001'B private network, local user
  //      '0010'B public  network, user  local
  //      '0011'B transit network
  //      '0100'B public  network, user  remote
  //      '0101'B private network, remote user
  //      '0111'B network  international
  //      '1010'B Network beyond interworking pt.
  BIT1  spare1_1, //     '0'B
  BIT2  codingStandard, // '00'B coding according Q.931
  // '01'B reserved for standards  other
  // '10'B National standard
  // '11'B standard  other  (e.g. one defined for GSM PLMNs)
  BIT1  ext1, // '0'B or '1'B
  //octet3a:
  BIT7  recommendation  optional,
  BIT1  ext2            optional // B'1......
} with { variant "EXTENSION_BIT (yes)"};

type record ML3_Cause_oct4
{
  BIT7  causeValue, // see 12/FS
  BIT1  ext3 // B'1......
} with { variant "EXTENSION_BIT (yes)"};

type record ML3_Cause_LV
{
  LIN1  lengthIndicator, // 2..30
  ML3_Cause_oct3 oct3,
  ML3_Cause_oct4 oct4,
  Diagnostics  diagnostics  optional  // size: 1..27
} with { variant (lengthIndicator) "LENGTHTO (oct3, oct4, diagnostics) "};

//24.008/10.5.4.11
type record ML3_Cause_TLV
{
  OCT1   elementIdentifier,
  LIN1  lengthIndicator, // 2..30
  ML3_Cause_oct3 oct3,
  ML3_Cause_oct4 oct4,
  Diagnostics  diagnostics  optional  // size: 1..27
} with { variant (lengthIndicator) "LENGTHTO (oct3, oct4, diagnostics) "};

//10.5.4.15 Facility IE (see also 24.080/3.6)
type record Facility_TLV
{
  OCT1  elementIdentifier, // H'1C
  LIN1  lengthIndicator, // 0..?
  OCTN  facilityInformation  optional //see 24.080/3.6
} with { variant (lengthIndicator) "LENGTHTO (facilityInformation)"};

type record Facility_LV
{
  LIN1  lengthIndicator, // 0..?
  OCTN  facilityInformation  optional  //see 24.080/3.6
} with { variant (lengthIndicator) "LENGTHTO (facilityInformation)"};

//24.008/10.5.4.24 SS Version Indicator
// used by SS and CC
type record SS_VersionIndicator
{
  OCT1  elementIdentifier, // H'7F
  LIN1  lengthIndicator, // 0..?
  OCTN  ss_VersionIndicatorContents  optional //see 24.080 !!!
} with { variant (lengthIndicator) "LENGTHTO (ss_VersionIndicatorContents)"};

//10.5.4.32 Supported Codec List
type record codec
{
  OCT1  systemIdentification1,
  OCT1  lengthOfBitmap1,
  OCT1  codecBitmap1_bits1to8,
  OCT1  codecBitmap1_bits9to16
}; 

type record of codec CodecList_ML3; 

type record SupportedCodecList
{
  OCT1            elementIdentifier,
  LIN1            lengthIndicator, //  
  CodecList_ML3   codecList 
} with {
  variant "PRESENCE (elementIdentifier = '40'O)";
  variant (lengthIndicator) "LENGTHTO( codecList )"
};

// 10.5.7.8
type record DevicePropertiesTV
{  
  BIT1               lowPriority,
  BIT3               spare,
  BIT4               elementIdentifier
}

//****************************************************************************
// Common elements in GMM and MM:
//****************************************************************************
// 10.5.5.8a - P-TMSI Signature 2
type record P_TMSISignature2TLV
{
  OCT1               elementIdentifier,
  LIN1               lengthIndicator,
  OCT3               valueField
} with {
  variant "PRESENCE (elementIdentifier = '19'O)";
  variant (lengthIndicator) "LENGTHTO (valueField)"
};

// 10.5.5.29 - P-TMSI Type
type record P_TMSI_TypeTV
{
  BIT1     pTMSI_TypeValue,
  BIT3     spare,
  BIT4     elementIdentifier
} with { variant "PRESENCE (elementIdentifier = '1110'B)" }; 

//10.5.5.15a - Routing Area Identification
type record RoutingAreaIdentification2TLV
{
  OCT1               elementIdentifier,
  LIN1               lengthIndicator,
  OCT6               routingAreaIdentification2
} with {
  variant "PRESENCE (elementIdentifier = '1B'O)";
  variant (lengthIndicator) "LENGTHTO (routingAreaIdentification2)"
};


//****************************************************************************
// Common elements in RRM and MM:
//****************************************************************************

//10.5.3.14 Additional Update Parameter
type record AdditionalUpdateParameterTV
{
  BIT1               cSMT,
  BIT1               cSMO,
  BIT1               spare2,
  BIT1               spare3,
  BIT4               elementIdentifier
} with {
  variant "PRESENCE (elementIdentifier = '1100'B)"
}

}//end of module
with {
extension "version R1B"
encode "RAW"
}

