///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2017 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:               MobileL3_CommonIE_Types.ttcn
//  Rev:                R2A
//  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 R2A"
encode "RAW"
}

