///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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 CellIdentityTV
{
  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"
}

