///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2019 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:               BSSGP_Types.ttcn
//  Rev:                R2B
//  Prodnr:             CNL 113 833
//  Contact:            http://ttcn.ericsson.se
//  Reference:          3GPP TS 48.018 13.0.0


module BSSGP_Types
{    

import from General_Types all;

external function enc_PDU_BSSGP(in PDU_BSSGP pdu) return octetstring;

external function dec_PDU_BSSGP(in octetstring stream) return PDU_BSSGP;

external function enc_PDU_BSSGP_fast(in PDU_BSSGP pdu, out octetstring stream)
with { extension "prototype(fast) encode(RAW)" }

external function dec_PDU_BSSGP_backtrack(in octetstring stream, out PDU_BSSGP pdu) return integer
with { extension "prototype(backtrack) decode(RAW)" }


//-----------------------------------------------------------------------------
// INFORMATION ELEMENTS
//-----------------------------------------------------------------------------
type union LIN2_2a
{
  integer length1,
  integer length2
} with {
  variant (length1) "FIELDLENGTH(7)";
  variant (length2) "FIELDLENGTH(15)";
  variant (length2) "BYTEORDER(last)";
  variant (length1,length2) "FIELDORDER(msb)";
}   
      
// 11.3.1           
type record Alignment_octets
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            spare_octet  length(0..3)
} with {
  variant "PRESENCE(iEI = '00'O)";
  variant (lengthIndicator) "LENGTHTO (spare_octet)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.2
type record Bmax_default_MS
{
  OCT1                    iEI,
  BIT1                    ext,
  LIN2_2a                 lengthIndicator, 
  OCT2                    bmax  // could be changed to integer input if simpler
} with { 
  variant "PRESENCE(iEI = '01'O)";
  variant (lengthIndicator) "LENGTHTO (bmax)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

// 11.3.3
type record BSS_Area_Indication
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   bSS_indicator
} with { 
  variant "PRESENCE(iEI = '02'O)";
  variant (lengthIndicator) "LENGTHTO (bSS_indicator)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.4
type record Bucket_Leak_Rate
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   r_Value // could be changed to integer input if simpler
} with {
  variant "PRESENCE(iEI = '03'O)";
  variant (lengthIndicator) "LENGTHTO (r_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,   ext = '1'B;
                                       length2,   ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.5
type record BVC_Bucket_Size
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   bmax  
} with { 
  variant "PRESENCE(iEI = '05'O)";
  variant (lengthIndicator) "LENGTHTO (bmax)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.6
type record BVCI
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   unstructured_value
} with { 
  variant "PRESENCE(iEI = '04'O)";
  variant (lengthIndicator) "LENGTHTO (unstructured_value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.7
type record BVC_Measurement
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   delay_Value  
                                   
} with { 
  variant "PRESENCE(iEI = '06'O)";
  variant (lengthIndicator) "LENGTHTO (delay_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};
 
// 11.3.8
type record Cause_BSSGP 
 {
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   cause_Value
 } with { 
  variant "PRESENCE(iEI = '07'O)";
  variant (lengthIndicator) "LENGTHTO (cause_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};
 
// 11.3.9
type record Cell_Identifier
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 HEX1                   mccDigit1 ,
 HEX1                   mccDigit2 ,
 HEX1                   mccDigit3 ,
 HEX1                   mncDigit3 ,
 HEX1                   mncDigit1 ,
 HEX1                   mncDigit2 ,
 OCT2                   lac,
 OCT1                   rac,    
 OCT2                   cI_value
} with { 
  variant "PRESENCE(iEI = '08'O)";
      variant (lengthIndicator) 
     "LENGTHTO(mccDigit1,mccDigit2,mccDigit3,mncDigit3,mncDigit1,
               mncDigit2,lac,rac,cI_value)";
      variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                           length2,         ext = '0'B;)";
      variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


type record Cell_Identifier_V
{ 
 HEX1                   mccDigit1,
 HEX1                   mccDigit2,
 HEX1                   mccDigit3,
 HEX1                   mncDigit3,
 HEX1                   mncDigit1,
 HEX1                   mncDigit2,
 OCT2                   lac,
 OCT1                   rac,    
 OCT2                   cI_value
};

// 11.3.10
// 29.018, 44.018
type record Channel_needed
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 Channel_Needed_Value    channel_Needed_Value
} with { 
  variant "PRESENCE(iEI = '09'O)";
  variant (lengthIndicator) "LENGTHTO (channel_Needed_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

type record Channel_Needed_Value
{
  BIT2   channel_1,
  BIT2   channel_2,
  BIT4   channelNeededIEI     //44.018
}

// 11.3.11
type record DRX_Parameters
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 OCT1                    splitPG_CycleCode,
 BIT3                    nonDRXTimer,
 BIT1                    splitOnCCCH,
 BIT4                    cnSpecificDRXCycleLength
} with { 
  variant "PRESENCE(iEI = '0A'O)";
  variant (lengthIndicator) 
                "LENGTHTO (splitPG_CycleCode,nonDRXTimer,splitOnCCCH,
                   cnSpecificDRXCycleLength)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
        };        

// 11.3.12
type record EMLPP_Priority_BSSGP
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 BIT3                    callPriority,
 BIT5                    spare
} with { 
  variant "PRESENCE(iEI = '0B'O)";
  variant (lengthIndicator) "LENGTHTO (callPriority,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
        };
        
// 11.3.13
type record Flush_Action
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 OCT1                    actionValue
} with { 
  variant "PRESENCE(iEI = '0C'O)";
  variant (lengthIndicator) "LENGTHTO (actionValue)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
        };


// 11.3.14
type record IMSI_BSSGP
{         
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 BIT3                    type_of_Identity,
 BIT1                    oddevenIndicator,      // '1'B or '0'B
 hexstring               digits     length(5..15)                                                                       
} with { 
  variant "PRESENCE(iEI = '0D'O)";
  variant (lengthIndicator) "LENGTHTO (type_of_Identity,
                                             oddevenIndicator,digits)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,   ext = '0'B;)"; 
              //variant (fillerDigit) "PRESENCE (oddevenIndicator   = '0'B) ";
  variant (digits) "HEXORDER(low)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  variant "PADDING(yes)";
  variant "PADDING_PATTERN('1'B)"
                
        };
                
// 11.3.15
//NOTE: lengthIndicator-short form will be converted to long form 
// if needed during encoding
type record LLC_PDU
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 octetstring            lLC_PDU  // Note: this is divided into 2 parts in spec!
} with { 
  variant "PRESENCE(iEI = '0E'O)";
  variant (lengthIndicator) "LENGTHTO (lLC_PDU)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.16
type record LLC_Frames_Discarded
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 hexstring               number_of_frames_discarded length (2)
 } with { 
  variant "PRESENCE(iEI = '0F'O)";
  variant (lengthIndicator) "LENGTHTO (number_of_frames_discarded)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};
    
// 11.3.17
type record Location_Area
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 HEX1                   mccDigit1,
 HEX1                   mccDigit2,
 HEX1                   mccDigit3,
 HEX1                   mncDigit3,
 HEX1                   mncDigit1,
 HEX1                   mncDigit2,
 OCT2                   lac
} with { 
  variant "PRESENCE(iEI = '10'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1,mccDigit2,mccDigit3,
                                 mncDigit3,mncDigit1,mncDigit2,lac)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.18
type record LSA_Identifier_List_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            lSA_Identifier_List   //  encoded LSA Identifier List
} with { 
  variant "PRESENCE(iEI = '26'O)";
  variant (lengthIndicator) "LENGTHTO (lSA_Identifier_List)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.19
type record LSA_Information_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  LSA_Information        lSA_Information   //  encoded LSA Information 48.008
} with { 
  variant "PRESENCE(iEI = '27'O)";
  variant (lengthIndicator) "LENGTHTO (lSA_Information)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record LSA_Information     //  encoded LSA Information 48.008
{
  BIT1                                      lSA_Only,
  BIT7                                      spare,
  LSA_Identification_and_Attributes_List    lSA_Identification_and_Attributes_List
}

type record of LSA_Identification_and_Attributes LSA_Identification_and_Attributes_List; 

type record LSA_Identification_and_Attributes
{
   BIT4                 priority,
   BIT1                 pref,
   BIT1                 act,
   BIT2                 spare, 
   OCT3                 lSA_ID
}


// 11.3.20
type record Mobile_Id_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  MobileIdentityV_BSSGP  mobile_Identity
} with { 
  variant "PRESENCE(iEI = '11'O)";
  variant (lengthIndicator) "LENGTHTO (mobile_Identity)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// MobileIdentityV structure copied from 24.008 MobileL3
type record MobileIdentityV_BSSGP
{
  BIT3                               typeOfIdentity,
  OddEvenInd_Identity_BSSGP          oddEvenInd_identity
} with {
  variant (oddEvenInd_identity) "CROSSTAG
  (
    imei,                     typeOfIdentity ='010'B;
    imsi,                     typeOfIdentity ='001'B;
    imei_sv,                  typeOfIdentity ='011'B;  
  )"
};

type union OddEvenInd_Identity_BSSGP
{
  IMSI_MobileIdentityV                     imsi,  
  IMEI_MobileIdentityV                     imei,     
  IMEI_SV_MobileIdentityV                  imei_sv
};

type record IMSI_MobileIdentityV
{
  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_MobileIdentityV
{
  BIT1               oddevenIndicator,   // '1'B
  hexstring          digits  length(15)
};

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

// 11.3.21
type record MS_Bucket_Size
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 OCT2                    bmax
} with { 
  variant "PRESENCE(iEI = '12'O)";
  variant (lengthIndicator) "LENGTHTO (bmax)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


// 11.3.22
// Note : structure from 24.008 Mobile L3
type record MS_Radio_Access_Capability
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 MSRadioAccessCapabilityV_BSSGP  mSRadioAccessCapabilityV_BSSGP
} with { 
  variant "PRESENCE(iEI = '13'O)";
  variant (lengthIndicator) "LENGTHTO (mSRadioAccessCapabilityV_BSSGP)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant /*(ext,lengthIndicator)*/ "FIELDORDER(msb)";
  variant "PADDING(yes)"
};
             
type record of MSRACapabilityValuesRecord_BSSGP MSRadioAccessCapabilityV_BSSGP
with { variant "EXTENSION_BIT(reverse)";variant "FIELDORDER(msb)" };


type record MSRACapabilityValuesRecord_BSSGP
{
  MSRACapabilityValues_BSSGP   mSRACapabilityValues,
  BIT1                         presenceBitMSRACap
} with { variant "FIELDORDER(msb)" };


type union MSRACapabilityValues_BSSGP
{
  MSRACapabilityValuesExclude1111_BSSGP        mSRACapabilityValuesExclude1111,
  MSRACapabilityValues1111_BSSGP               mSRACapabilityValues1111
} with { variant "FIELDORDER(msb)" };


type record MSRACapabilityValuesExclude1111_BSSGP
{
  BIT4                               accessTechnType,
  AccessCapabilitiesStruct_BSSGP     accessCapabilities
} with {
  variant "PRESENCE (
      accessTechnType = '0000'B,     // GSM P
      accessTechnType = '0001'B,     // GSM E
      accessTechnType = '0010'B,     // GSM R
      accessTechnType = '0011'B,     // GSM 1800
      accessTechnType = '0100'B,     // GSM190
      accessTechnType = '0101'B,     // GSM 450
      accessTechnType = '0110'B,     // GSM480
      accessTechnType = '0111'B,     // GSM 480
      accessTechnType = '1000'B,     // GSM 700
      accessTechnType = '1001'B,     // GSM T 310
      accessTechnType = '1010'B,     // GSM T 410
      accessTechnType = '1011'B      // GSM T 900
  )"
variant (accessTechnType) "BYTEORDER(last)";
  variant "FIELDORDER(msb)"
};


// Access Capabilities Struct
type record AccessCapabilitiesStruct_BSSGP
{
  integer                            lengthIndicator,
  AccessCapabilities_BSSGP           accessCapabilities,
  // spare_bits "expands to the indicated length",
  // i.e. 24.008 spec puts no restriction on number
  // of spare_bits.  The only restriction is that the whole
  // MS Radio Access Capability  IE is less than 52 octets
  bitstring                    spare_bits              optional
} with {
  variant (lengthIndicator) "FIELDLENGTH(7)";
  variant (lengthIndicator) "LENGTHTO(accessCapabilities,spare_bits)";
  variant (lengthIndicator) "UNIT(bits)";
  variant "FIELDORDER(msb)";
  variant (lengthIndicator) "BYTEORDER(last)";
}


//Access Capabilities
type record AccessCapabilities_BSSGP
{
  BIT3                         rfPowerCapability,
  BIT1                         presenceBitA5,
  A5BITS_BSSGP                 a5bits               optional,
  BIT1                         esind,
  BIT1                         psbit,
  BIT1                         vgcs,
  BIT1                         vbs,
  BIT1                         presenceBitMultislot,
  MultislotCap_BSSGP           multislotcap         optional,
  AccessCapAdditionsAfterRel97_BSSGP accessCapAdditionsAfterRel97 optional //opt because of V97
  //Note: AccessCapAdditionsAfterRel97 can include:
  // Rel99 or
  // Rel99 + Rel4 or
  // Rel99 + Rel4 + Rel5 or
  // Rel99 + Rel4 + Rel5  + Rel6
} with {
  variant "FIELDORDER(msb)";
variant(rfPowerCapability) "BYTEORDER(last)";
  variant (a5bits)               "PRESENCE(presenceBitA5 = '1'B)";
  variant (multislotcap)         "PRESENCE(presenceBitMultislot = '1'B)";
}


type record AccessCapAdditionsAfterRel97_BSSGP
{
  AccessCapAdditionsRel99_BSSGP                accessCapAdditionsRel99,
  AccessCapAdditionsAfterRel99_BSSGP           accessCapAdditionsAfterRel99 optional
} with {
  variant "FIELDORDER(msb)";
}


type record AccessCapAdditionsRel99_BSSGP
{
  BIT1               presenceBitPskpow,
  BIT2               pskpowercap                     optional,
  BIT1               compactIntMeasurCap,
  BIT1               revisionLevelInd,
  BIT1               umtsfddRadAccTechCap,
  BIT1               umtstddRadAccTechCap,
  BIT1               cdma2kRadAccTechCap
} with {
  variant "FIELDORDER(msb)";
variant(pskpowercap) "BYTEORDER(last)";
  variant (pskpowercap) "PRESENCE(presenceBitPskpow = '1'B)";
}


type record AccessCapAdditionsAfterRel99_BSSGP
{
  AccessCapAdditionsRel4_BSSGP       accessCapAdditionsRel4,
  AccessCapAdditionsAfterRel4_BSSGP  accessCapAdditionsAfterRel4 optional
} with {
  variant "FIELDORDER(msb)";
}


type record AccessCapAdditionsRel4_BSSGP
{
  BIT1                    umts128RadAccTechCap,
  BIT1                    geranFeaturePackage,
  BIT1                    presenceBitExtendedDTM,
  ExtendedDTM_BSSGP       extendedDTM                       optional,
  BIT1                    modulationBasedMultislotClass
} with {
  variant "FIELDORDER(msb)";
  variant (extendedDTM)          "PRESENCE(presenceBitExtendedDTM = '1'B)";
}


type record AccessCapAdditionsAfterRel4_BSSGP
{
  AccessCapAdditionsRel5_BSSGP       accessCapAdditionsRel5, 
  AccessCapAdditionsAfterRel5_BSSGP  accessCapAdditionsAfterRel5 optional
} with {
  variant "FIELDORDER(msb)";
}


type record AccessCapAdditionsRel5_BSSGP
{
  BIT1                     presenceBitHighMultislotCapability,
  BIT2                     highMultislotCapability            optional,
  BIT1                     presenceBitGeranIuModeCapability,
  GeranIuModeCap_BSSGP     geranIuModeCap                     optional,
  BIT2                     gMSKMultislotPowerProfile,
  BIT2                     eightPSKMultislotPowerProfile
} with {
  variant "FIELDORDER(msb)";
variant(highMultislotCapability) "BYTEORDER(last)";
variant(gMSKMultislotPowerProfile) "BYTEORDER(last)";
variant(eightPSKMultislotPowerProfile) "BYTEORDER(last)";
  variant (highMultislotCapability)
  "PRESENCE(presenceBitHighMultislotCapability = '1'B)";
  variant (geranIuModeCap)"PRESENCE(presenceBitGeranIuModeCapability = '1'B)"
}


type record GeranIuModeCap_BSSGP
{
  integer                      lengthIndicator,
  BIT1                         fLOIuCapability,
  bitstring                    spare_bits
  // spare_bits "expands to the indicated length",
  // i.e. 24.008 spec puts no restriction on number
  // of spare_bits.  The only restriction is that the whole
  // MS Radio Access Capability  IE is less than 52 octets
} with {
  variant "FIELDORDER(msb)";
  variant (lengthIndicator) "FIELDLENGTH(4)";
  variant (lengthIndicator) "LENGTHTO(fLOIuCapability,spare_bits)";
  variant (lengthIndicator) "UNIT(bits)";
}

type record AccessCapAdditionsAfterRel5_BSSGP
{
  AccessCapAdditionsRel6_BSSGP      accessCapAdditionsRel6,
  AccessCapAdditionsAfterRel6_BSSGP accessCapAdditionsAfterRel6 optional  
} with {
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsRel6_BSSGP
{
  BIT1                              multipleTBFCapability,
  BIT2                              downlinkAdvancedReceiverPerformance,
  BIT1                              extendedRLCMACCtrlMsgSegmentationCap,
  BIT1                              dTMEnhancementsCapability,
  BIT1                              presenceBitDTMGPRSHighMultiSlotClass,
  DTMGPRSHighMultiSlotClass_BSSGP   dTMGPRSHighMultiSlotClass optional,
  BIT1                              pSHandoverCapability
} with {
  variant "FIELDORDER(msb)";
variant(downlinkAdvancedReceiverPerformance) "BYTEORDER(last)";
  variant (dTMGPRSHighMultiSlotClass)
  "PRESENCE(presenceBitDTMGPRSHighMultiSlotClass = '1'B)"
}


type record DTMGPRSHighMultiSlotClass_BSSGP
{
  BIT3               dTMGPRSHighMultiSlotClassValue,
  BIT1               presenceBitDTMEGPRSHighMultiSlotClass,
  BIT3               dTMEGPRSHighMultiSlotClassValue optional
} with {
  variant "FIELDORDER(msb)";
variant(dTMGPRSHighMultiSlotClassValue) "BYTEORDER(last)";
variant(dTMEGPRSHighMultiSlotClassValue) "BYTEORDER(last)";
  variant (dTMEGPRSHighMultiSlotClassValue)
  "PRESENCE(presenceBitDTMEGPRSHighMultiSlotClass = '1'B)"

}

//New
type record AccessCapAdditionsAfterRel6_BSSGP
{
  AccessCapAdditionsRel7_BSSGP      accessCapAdditionsRel7,
  AccessCapAdditionsAfterRel7_BSSGP accessCapAdditionsAfterRel7 optional 
} with {
  variant "FIELDORDER(msb)";
}


type record AccessCapAdditionsRel7_BSSGP
{
  BIT1                         dTMHandoverCapability,
  BIT1                         presenceBitDownlinkDualCarrier, 
  DownlinkDualCarrier_BSSGP    downlinkDualCarrier optional,
  BIT1                         flexibleTimeslotAssignment,
  BIT1                         gANPSHandoverCapability,
  BIT1                         rLCNonPersistentMode,
  BIT1                         reducedLatencyEGPRSCapability,
  BIT2                         uplinkEGPRS2,
  BIT2                         downlinkEGPRS2 
} with {
  variant "FIELDORDER(msb)";
variant(uplinkEGPRS2) "BYTEORDER(last)";
variant(downlinkEGPRS2) "BYTEORDER(last)";
  variant (downlinkDualCarrier)
  "PRESENCE(presenceBitDownlinkDualCarrier = '1'B)"
}
  
type record AccessCapAdditionsAfterRel7_BSSGP
{
  AccessCapAdditionsRel8_BSSGP       accessCapAdditionsRel8,
  AccessCapAdditionsAfterRel8_BSSGP  accessCapAdditionsAfterRel8 optional
}



type record DownlinkDualCarrier_BSSGP
{
  BIT3  multislotCapReductionforDownLinkDualCarrier,
  BIT1  downlinkDualCarrierforDTMCapability
} with { variant "FIELDORDER(msb)"
variant(multislotCapReductionforDownLinkDualCarrier) "BYTEORDER(last)";
  };


type record  ExtendedDTM_BSSGP
{
  BIT2               ExtendedDTM_GPRSMultislot,
  BIT2               ExtendedDTM_EGPRSMultislot
} with { variant "FIELDORDER(msb)";
variant(ExtendedDTM_GPRSMultislot) "BYTEORDER(last)";
variant(ExtendedDTM_EGPRSMultislot) "BYTEORDER(last)";
};

type record AccessCapAdditionsRel8_BSSGP
{
  BIT1                  eUTRAFDDsupport ,
  BIT1                  eUTRATDDsupport, 
  BIT2                  gERANToEUTRASupportInGERANPacketTransferMode,
  BIT1                  priorityBasedReselectionSupport 
} with {
variant(gERANToEUTRASupportInGERANPacketTransferMode) "BYTEORDER(last)";
  variant "FIELDORDER(msb)"
}

type record AccessCapAdditionsAfterRel8_BSSGP
{
  AccessCapAdditionsRel9_BSSGP       accessCapAdditionsRel9,
  AccessCapAdditionsAfterRel9_BSSGP  accessCapAdditionsAfterRel9 optional
}

type record AccessCapAdditionsRel9_BSSGP
{
  EnhancedFlexTimeslotAssignment_BSSGP   enhancedFlexTimeslotAssignment,
  BIT1                             indicationofUpperLayerPDUStartCapabilityforRLCUM,
  BIT1                             eMSTCapability,
  BIT1                             mTTICapability,
  BIT1                             uTRACSGCellsReporting,
  BIT1                             eUTRACSGCellsReporting
} with {
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsAfterRel9_BSSGP
{
  AccessCapAdditionsRel10_BSSGP       accessCapAdditionsRel10,
  AccessCapAdditionsAfterRel10_BSSGP  accessCapAdditionsAfterRel10 optional
}

type record AccessCapAdditionsRel10_BSSGP
{
  BIT1           dTRCapability,
  BIT1           eMSRCapability,
  BIT1           fastDownlinkFrequencySwitchingCapability,
  BIT2           tIGHTER_Capability  
} with {
variant(tIGHTER_Capability) "BYTEORDER(last)";
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsAfterRel10_BSSGP
{
  AccessCapAdditionsRel11_BSSGP       accessCapAdditionsRel11,
  AccessCapAdditionsAfterRel11_BSSGP  accessCapAdditionsAfterRel11 optional
} with {
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsRel11_BSSGP
{
  BIT1           fANRCapability,
  BIT1           iPACapability,
  BIT1           gERANNetworkSharingSupport,
  BIT1           eUTRAWidebandRSRQMeasurementsSupport  
} with {
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsAfterRel11_BSSGP
{
  AccessCapAdditionsRel12_BSSGP       accessCapAdditionsRel12,
  AccessCapAdditionsAfterRel12_BSSGP  accessCapAdditionsAfterRel12 optional
} with {
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsRel12_BSSGP
{
  BIT1           uTRAMultipleFrequencyBandIndicatorsSupport,
  BIT1           eUTRAMultipleFrequencyBandIndicatorsSupport,
  BIT1           presenceBitDLMCCapability, 
  DLMCCapability_BSSGP dLMCCapability optional,
  BIT1           extendedTSCSetCapabilitySupport 
} with {
  variant "FIELDORDER(msb)";
  variant (dLMCCapability) "PRESENCE(presenceBitDLMCCapability = '1'B)"
}

type record DLMCCapability_BSSGP
{
  BIT1               presenceDLMC,
  DLMCBandReception_BSSGP  dLMCBandReception    optional,
  BIT2               dLMCMaxBandwidth,
  BIT6               dLMCMaxNumOfDownlinkTimeslots,
  BIT3               dLMCMaxNumOfDownlinkCarriers
} with {
  variant "FIELDORDER(msb)";
variant(dLMCMaxBandwidth) "BYTEORDER(last)";
variant(dLMCMaxNumOfDownlinkTimeslots) "BYTEORDER(last)";
variant(dLMCMaxNumOfDownlinkCarriers) "BYTEORDER(last)";
  variant (dLMCBandReception) "PRESENCE(presenceDLMC = '1'B)"
}

type record DLMCBandReception_BSSGP
{
  BIT2  dLMCNonContiguousIntraBandReception,
  BIT1  dLMCInterBandReception
} with {
variant(dLMCNonContiguousIntraBandReception) "BYTEORDER(last)";
  variant "FIELDORDER(msb)";
}

type record AccessCapAdditionsAfterRel12_BSSGP
{
  AccessCapLateAdditionsRel11_BSSGP   accessCapLateAdditionsRel11,
  octetstring                         accessCapLateAdditionsAfterRel11 optional
} with {
  variant "FIELDORDER(msb)";
}

type record AccessCapLateAdditionsRel11_BSSGP
{
  BIT1     extendedEARFCNValueRange
}

type record EnhancedFlexTimeslotAssignment_BSSGP
{
  BIT1                  presenceBitalternativeEFTAMultislotClass,
  BIT4                  alternativeEFTAMultislotClass,
  BIT3                  eFTAMultislotCapabilityReductionforDownlinkDualCarrier
} with {
variant(alternativeEFTAMultislotClass) "BYTEORDER(last)";
variant(eFTAMultislotCapabilityReductionforDownlinkDualCarrier) "BYTEORDER(last)";
  variant "FIELDORDER(msb)"
};



//MultislotCap
type record  MultislotCap_BSSGP
{
  BIT1                                   presenceBitHscsd,
  BIT5                                   hscsdmultislotclass      optional,
  BIT1                                   presenceBitGprs,
  MultislotCap_GPRS_BSSGP                gprsmultislot           optional,
  BIT1                                   presenceBitSms,
  MultislotCap_SMS_BSSGP                 multislotCap_SMS        optional,
  MultislotCapAdditionsAfterRel97_BSSGP  multislotCapAdditionsAfterRel97 optional
} with {
  variant "FIELDORDER(msb)";
  variant (hscsdmultislotclass)     "PRESENCE(presenceBitHscsd = '1'B)";
variant(hscsdmultislotclass) "BYTEORDER(last)";
  variant (gprsmultislot)          "PRESENCE(presenceBitGprs = '1'B)";
  variant (multislotCap_SMS)       "PRESENCE(presenceBitSms = '1'B)";

}


type record MultislotCapAdditionsAfterRel97_BSSGP
{
  BIT1                                   presenceBitEcsdmulti,
  BIT5                                   ecsdmultislotclass      optional,
  BIT1                                   presenceBitEgprsmulti,
  MultislotCap_EGPRS_BSSGP               multislotCap_EGPRS      optional,
  BIT1                                   presenceBitDtmGprsmulti,
  MultislotCap_dtmgprsmultislotsubclass_BSSGP  
                            multislotCapdtmgprsmultislotsubclass optional
} with {
  variant "FIELDORDER(msb)";
  variant (ecsdmultislotclass)     "PRESENCE(presenceBitEcsdmulti = '1'B)";
  variant (multislotCap_EGPRS)     "PRESENCE(presenceBitEgprsmulti = '1'B)" ;
variant(ecsdmultislotclass) "BYTEORDER(last)";
  variant (multislotCapdtmgprsmultislotsubclass)
  "PRESENCE(presenceBitDtmGprsmulti = '1'B)"
}


type record MultislotCap_GPRS_BSSGP
{
  BIT5               gprsmultislotclass,
  BIT1               gprsextendeddynalloccap
} with { variant "FIELDORDER(msb)"; 
variant(gprsmultislotclass) "BYTEORDER(last)"
 };


type record MultislotCap_SMS_BSSGP
{
  BIT4               smsValue,
  BIT4               smValue
} with { variant "FIELDORDER(msb)";
variant(smsValue) "BYTEORDER(last)";
variant(smValue) "BYTEORDER(last)"

};


type record  MultislotCap_EGPRS_BSSGP
{
  BIT5               egprsmultislotclass,
  BIT1               egprsextendeddynalloccap
}  with { variant "FIELDORDER(msb)";
variant(egprsmultislotclass) "BYTEORDER(last)"
  };

type record MultislotCap_dtmgprsmultislotsubclass_BSSGP
{
  BIT2               dtmgprsmultislotsubclass,
  BIT1               singleSlotDTM,
  BIT1               presenceBitDTM_EGPRSMultiSlot,
  BIT2               dTM_EGPRSMultiSlot       optional
} with {
  variant "FIELDORDER(msb)";
variant(dtmgprsmultislotsubclass) "BYTEORDER(last)";
variant(dTM_EGPRSMultiSlot) "BYTEORDER(last)";
  variant (dTM_EGPRSMultiSlot) "PRESENCE(presenceBitDTM_EGPRSMultiSlot = '1'B)"
};


//A5BITS

type record  A5BITS_BSSGP
{
  BIT1       a51 ,
  BIT1       a52 ,
  BIT1       a53 ,
  BIT1       a54 ,
  BIT1       a55 ,
  BIT1       a56 ,
  BIT1       a57
} with { variant "FIELDORDER(msb)" };


type record MSRACapabilityValues1111_BSSGP
{
  BIT4               accessTechnType,    //1111
  integer            lengthIndicator,
  BIT1               presenceIndicator_AdditionalAccessTechnologiesRepetition,
  AdditionalAccessTechnologiesRepetition_BSSGP // coded '1'B if list is not empty
                  additionalAccessTechnologiesRepetition           optional,
  bitstring          spare_bits
} with {
  variant "PRESENCE (accessTechnType = '1111'B)";
variant (accessTechnType) "BYTEORDER(last)";
  variant "FIELDORDER(msb)";
  variant (lengthIndicator) "FIELDLENGTH(7)";
  variant (lengthIndicator) "UNIT(bits)";
  variant (lengthIndicator) "BYTEORDER(last)";
  variant (additionalAccessTechnologiesRepetition)
  "PRESENCE(presenceIndicator_AdditionalAccessTechnologiesRepetition = '1'B)";
  variant (lengthIndicator)
  "LENGTHTO(presenceIndicator_AdditionalAccessTechnologiesRepetition,
             additionalAccessTechnologiesRepetition,spare_bits)";

};

type record of AdditionalAccessTechnologiesRecord_BSSGP
                               AdditionalAccessTechnologiesRepetition_BSSGP
with { variant "EXTENSION_BIT(reverse)" };


type record AdditionalAccessTechnologiesRecord_BSSGP
{
  AdditionalAccessTechnologies_BSSGP additionalAccessTechnologies,
  BIT1                               extensionBit
} with { variant "FIELDORDER(msb)" };


type record  AdditionalAccessTechnologies_BSSGP
{
  BIT4               accessTechnType,
  BIT3               gMSKPowerClass,
  BIT2               psk8PowerClass
} with { variant "FIELDORDER(msb)";
variant (accessTechnType) "BYTEORDER(last)";
variant (gMSKPowerClass) "BYTEORDER(last)";
variant (psk8PowerClass) "BYTEORDER(last)";
 };



// 11.3.23
type record OMC_Id_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT20                  oMC_Identity
} with { 
  variant "PRESENCE(iEI = '14'O)";
  variant (lengthIndicator) "LENGTHTO (oMC_Identity)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

 
// 11.3.24 
//NOTE: lengthIndicator-short form will be converted to 
// long form if needed during encoding
type record PDU_in_Error
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 octetstring            erroneous_BSSGP_PDU
} with { 
  variant "PRESENCE(iEI = '15'O)";
  variant (lengthIndicator) "LENGTHTO (erroneous_BSSGP_PDU)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.25
type record  PDU_Lifetime
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   delay_Value
} with { 
  variant "PRESENCE(iEI = '16'O)";
  variant (lengthIndicator) "LENGTHTO (delay_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.27
type record Priority_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   pvi,  
  BIT1                   qa, 
  BIT4                   priority_Level, //(1..14) 0: spare, 15: not used  
  BIT1                   pci, 
  BIT1                   spare        
} with { 
  variant "PRESENCE(iEI = '17'O)";
  variant (lengthIndicator) "LENGTHTO (pvi,qa,priority_Level,pci,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.28
type record QoS_Profile
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   peak_Bit_Rate,
 BIT3                   precedence,
 BIT1                   a_bit,
 BIT1                   t_bit,
 BIT1                   c_r_bit,
 BIT2                   peakBitRateGranularity
} with {  
  variant "PRESENCE(iEI = '18'O)";
  variant (lengthIndicator) "LENGTHTO (peak_Bit_Rate,precedence,
                                       a_bit,t_bit,c_r_bit,peakBitRateGranularity)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
};
       
       
type record QoS_Profile_V
{ 
 OCT2                   peak_Bit_Rate,
 BIT3                   precedence,
 BIT1                   a_bit,
 BIT1                   t_bit,
 BIT1                   c_r_bit,
 BIT2                   peakBitRateGranularity
}
                       
// 11.3.29
type record Radio_Cause
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   radio_Cause_Value
} with { 
  variant "PRESENCE(iEI = '19'O)";
  variant (lengthIndicator) "LENGTHTO (radio_Cause_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.30
type record  RA_Cap_UPD_CAUSE
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   rA_CAP_UPD_Cause_value
} with { 
  variant "PRESENCE(iEI = '1A'O)";
  variant (lengthIndicator) "LENGTHTO (rA_CAP_UPD_Cause_value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.31
type record  Routeing_Area
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 HEX1                   mccDigit1,
 HEX1                   mccDigit2,
 HEX1                   mccDigit3,
 HEX1                   mncDigit3,
 HEX1                   mncDigit1,
 HEX1                   mncDigit2,
 OCT2                   lac,    
 OCT1                   rac    
} with {
  variant "PRESENCE(iEI = '1B'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1,mccDigit2,mccDigit3,mncDigit3,
         mncDigit1,mncDigit2,lac,rac)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.32
type record R_default_MS
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT2                   r_default_MS_value
} with { 
  variant "PRESENCE(iEI = '1C'O)";
  variant (lengthIndicator) "LENGTHTO (r_default_MS_value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.33
type record Suspend_Reference_Number
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 OCT1                    suspend_Reference_Number_value
} with { 
  variant "PRESENCE(iEI = '1D'O)";
  variant (lengthIndicator) "LENGTHTO (suspend_Reference_Number_value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

// 11.3.34
type record Tag
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   unstructured_Value
} with { 
  variant "PRESENCE(iEI = '1E'O)";
  variant (lengthIndicator) "LENGTHTO (unstructured_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.35        
type record TLLI_BSSGP
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT4                   tLLI_Value
} with { 
  variant "PRESENCE(iEI = '1F'O)";
  variant (lengthIndicator) "LENGTHTO (tLLI_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";        
};

// 11.3.36
// Note : reference in spec is to "TMSI/P-TMSI information element in 
// 3GPP TS 24.008", however this specification has Mobile Identity 
// IE which includes TMSI/P-TMSI
type record TMSI_BSSGP
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT4                   tMSI_Value
} with { 
  variant "PRESENCE(iEI = '20'O)";
  variant (lengthIndicator) "LENGTHTO (tMSI_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


// 11.3.37
type record Trace_Reference_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT2                   trace_Reference
} with { 
  variant "PRESENCE(iEI = '21'O)";
  variant (lengthIndicator) "LENGTHTO (trace_Reference)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.38
type record Trace_Type_BSSGP
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   equipment_Trace
} with { 
  variant "PRESENCE(iEI = '22'O)";
  variant (lengthIndicator) "LENGTHTO (equipment_Trace)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";

};


// 11.3.39
type record TransactionId_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT2                   transaction_Id
} with { 
  variant "PRESENCE(iEI = '23'O)";
  variant (lengthIndicator) "LENGTHTO (transaction_Id)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.40
type record Trigger_Id_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT20                  entity_Identity
} with { 
  variant "PRESENCE(iEI = '24'O)";
  variant (lengthIndicator) "LENGTHTO (entity_Identity)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.41
type record Number_of_octets_affected
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT3                   number_of_octets_transfered_or_deleted 
                              // could be changed to integer input if simpler
} with { 
  variant "PRESENCE(iEI = '25'O)";
   variant (lengthIndicator) 
        "LENGTHTO (number_of_octets_transfered_or_deleted)";        
   variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                        length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";                
};


// 11.3.42
type record PFI
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 BIT7                   pFI_Value,
 BIT1                   spare  //  '0'B according to 10.5.6.11 of 24.008

} with { 
  variant "PRESENCE(iEI = '28'O)";
   variant (lengthIndicator) 
        "LENGTHTO (pFI_Value,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";        
};


// 11.3.43
// Note : structure from 24.008
type record ABQP
{
 OCT1                iEI,
 BIT1                ext,
 LIN2_2a             lengthIndicator,
 BIT3                reliabilityClass,
 BIT3                delayClass,
 BIT2                spare1,  // '00'B
 BIT3                precedenceClass,
 BIT1                spare2,
 BIT4                peakThroughput,
 BIT5                meanThroughput,
 BIT3                spare3,
 BIT3                deliverErroneusSDU optional, //opt because of V97
 BIT2                deliveryOrder optional, //opt because of V97
 BIT3                trafficClass optional, //opt because of V97
 OCT1                maxSDUSize optional, //opt because of V97
 OCT1                maxBitrateUplink optional, //opt because of V97
 OCT1                maxBitrateDownlink optional, //opt because of V97
 BIT4                sduErrorRatio optional, //opt because of V97
 BIT4                residualBER optional, //opt because of V97
 BIT2                trafficHandlingPriority optional, //opt because of V97
 BIT6                transferDelay optional, //opt because of V97
 OCT1                guaranteedBitRateUplink optional, //opt because of V97
 OCT1                guaranteedBitRateDownlink optional, //opt because of V97
 BIT4                sourceStatisticsDescriptor optional, //opt because of V97
 BIT1                signallingIndication optional, //opt because of V97
 BIT3                spare4 optional, //opt because of V97
 OCT1                maxBitRateDownlinkExtended optional,
 OCT1                guaranteedBitRateDownlinkExtended optional,
 OCT1                maxBitrateUplinkExtended           optional, //opt because of V97
 OCT1                guaranteedBitRateUplinkExtended    optional  //opt because of V97
} with { 
  variant "PRESENCE(iEI = '3A'O)";
   variant (lengthIndicator) 
        "LENGTHTO (reliabilityClass,delayClass,spare1,precedenceClass,
               spare2,peakThroughput,
         meanThroughput,spare3
         ,deliverErroneusSDU,deliveryOrder,trafficClass,maxSDUSize,
         maxBitrateUplink,maxBitrateDownlink,sduErrorRatio,residualBER,
     trafficHandlingPriority,transferDelay,guaranteedBitRateUplink,
     guaranteedBitRateDownlink,sourceStatisticsDescriptor,
     signallingIndication,spare4,maxBitRateDownlinkExtended,
     guaranteedBitRateDownlinkExtended,maxBitrateUplinkExtended,
     guaranteedBitRateUplinkExtended)";        

   variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,         ext = '0'B;)";  
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
 };


// 11.3.44
type record GPRS_Timer
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 BIT5                   timer_Value,
 BIT3                   unit_Value
} with { 
  variant "PRESENCE(iEI = '29'O)";
   variant (lengthIndicator) 
        "LENGTHTO (timer_Value,unit_Value)";
   variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,         ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

// 11.3.45
type record Feature_bitmap
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 BIT1                   pFC,
 BIT1                   cBL,
 BIT1                   iNR,
 BIT1                   lCS,
 BIT1                   rIM,
 BIT1                   pFC_FC,
 BIT1                   enhancedRadioStatus,
 BIT1                   mBMS
} with { 
  variant "PRESENCE(iEI = '3B'O)";
  variant (lengthIndicator) "LENGTHTO (pFC,cBL,iNR,lCS,rIM,pFC_FC,
                                             enhancedRadioStatus,mBMS)";
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                             length2,        ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.46
type record Bucket_Full_Ratio
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   rate_of_the_Bucket 
                        // could be changed to integer input if simpler
} with { 
  variant "PRESENCE(iEI = '3C'O)";
   variant (lengthIndicator) "LENGTHTO (rate_of_the_Bucket)";
   variant (lengthIndicator) "CROSSTAG( length1,       ext = '1'B;
                                              length2,       ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
        }


// 11.3.47
type record Service_UTRAN_CCO
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 BIT3                   service_UTRAN_CCO_Value,
 BIT2					service_E_UTRAN_CCO_Value,
 BIT3                   spare
} with { 
  variant "PRESENCE(iEI = '3D'O)";
  variant (lengthIndicator) "LENGTHTO (service_UTRAN_CCO_Value,service_E_UTRAN_CCO_Value,spare)";  
   variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// new IE for Wendy Xiang and Freeman Feng
type record Service_Class_Indicator {
  OCT1                    iEI,
  BIT1                    ext,
  LIN2_2a                 lengthIndicator,
  OCT1                    serviceClassIndicator
} with { 
  variant "PRESENCE(iEI = '99'O)";
  variant (lengthIndicator) "LENGTHTO (serviceClassIndicator)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
  length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.48
type record NSEI_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT2                   nSEI 
} with { 
  variant "PRESENCE(iEI = '3E'O)";
  variant (lengthIndicator) "LENGTHTO (nSEI)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.49
type record RRLP_APDU_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            rRLP_Message
} with { 
  variant "PRESENCE(iEI = '3F'O)";
  variant (lengthIndicator) "LENGTHTO (rRLP_Message)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  //variant "PADDING(yes)";
}


// 11.3.50   
// 24.008 -> 49.031
type record LCS_QoS_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,  
  BIT1                   vert,
  BIT1                   vel,
  BIT6                   spare1,  
  BIT7                   horizontal_Accuracy,
  BIT1                   hA_Indicator,         // 1: is specified  
  BIT7                   vertical_Accuracy,
  BIT1                   vA_Indicator,         // 1: is specified  
  BIT6                   spare2,
  BIT2                   response_Time_Category
} with { 
  variant "PRESENCE(iEI = '40'O)";
  variant (lengthIndicator) "LENGTHTO (vert,vel,spare1,horizontal_Accuracy,hA_Indicator,vertical_Accuracy,vA_Indicator,spare2,response_Time_Category)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                         length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.51
// 49.031
type record LCS_Client_Type_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT4                   client_Subtype,
  BIT4                   client_Category
} with { 
  variant "PRESENCE(iEI = '41'O)";
  variant (lengthIndicator) "LENGTHTO (client_Subtype,client_Category)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.52
// 49.031
type record Requested_GPS_Assistance_Data_BSSGP
{
  OCT1                                  iEI,
  BIT1                                  ext,
  LIN2_2a                               lengthIndicator,
  Requested_GPS_Assistance_Data_Value   requested_GPS_Assistance_Data   
} with { 
  variant "PRESENCE(iEI = '42'O)";
  variant (lengthIndicator) "LENGTHTO (requested_GPS_Assistance_Data)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record Requested_GPS_Assistance_Data_Value
{
 OCT1                    bits_H_to_A,
 OCT1                    bits_P_to_I,
 SatelliteRelatedData    satelliteRelatedData
}

type record SatelliteRelatedData
{
  BIT6                       spare,
  BIT10                      gPS_Week,    
  OCT1                       gPS_Toe,
  BIT4                       t_Toe_Limit,
  integer                    nSAT,
  SatID_and_IODE_List        satID_and_IODE_List              
} with { variant(nSAT) "FIELDLENGTH(4)";
  variant(nSAT) "LENGTHTO(satID_and_IODE_List)";
  variant(nSAT) "UNIT(elements)";
}

type record of SatID_and_IODE SatID_and_IODE_List;

type record SatID_and_IODE
{
  BIT6      satID,
  BIT2      spare,
  OCT1      iODE
}

// 11.3.53
// 49.031
type record Location_Type_BSSGP
{
  OCT1                   iEI,                 
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   location_Information,
  OCT1                   positioning_Method optional
} with { 
  variant "PRESENCE(iEI = '43'O)";
  variant (lengthIndicator) "LENGTHTO (location_Information,positioning_Method)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.54
// 48.008 -> 23.03
type record Location_Estimate_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            location   //  encoded location information
} with { 
  variant "PRESENCE(iEI = '44'O)";
  variant (lengthIndicator) "LENGTHTO (location)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.55
// 49.031
type record Positioning_Data_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  PositioningDataValue   positioningDataValue  //  encoded location data
} with { 
  variant "PRESENCE(iEI = '45'O)";
  variant (lengthIndicator) "LENGTHTO (positioningDataValue)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record PositioningDataValue
{
 BIT4                     positioningDataDiscriminator,
 BIT4                     spare,
 PositioningMethod_List   positioningMethod_List 
}

type record of PositioningMethodValue PositioningMethod_List;

type record PositioningMethodValue
{
  BIT3     usage,
  BIT5     positioningMethod
}

// 11.3.56
type record Deciphering_Keys_BSSGP
{
  OCT1                            iEI,
  BIT1                            ext,
  LIN2_2a                         lengthIndicator,
  DecipheringKeysValue            decipheringKeysValue   //  encoded deciphering keys data
} with { 
  variant "PRESENCE(iEI = '46'O)";
  variant (lengthIndicator) "LENGTHTO (decipheringKeysValue)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record DecipheringKeysValue
{
 BIT1                     cipheringkeyFlag,
 BIT7                     spare,
 OCT7                     currentDecipheringKeyValue,
 OCT7                     nextDecipheringKeyValue
}
 
// 11.3.57
// 49.031
type record LCS_Priority_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   priority_Value   // 0: highest, other: normal
} with { 
  variant "PRESENCE(iEI = '47'O)";
  variant (lengthIndicator) "LENGTHTO (priority_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.58
// 49.031
type record LCS_Cause_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   cause_Value,
  OCT1                   diagnostic_Value optional
} with { 
  variant "PRESENCE(iEI = '48'O)";
  variant (lengthIndicator) "LENGTHTO (cause_Value,diagnostic_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.59
// 24.008
type record LCS_Capability_BSSGP
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   gPS_C,
  BIT1                   gPS_B,
  BIT1                   gPS_A,
  BIT1                   oTD_B,
  BIT1                   oTD_A,
  BIT3                   spare
} with { 
  variant "PRESENCE(iEI = '49'O)";
  variant (lengthIndicator) "LENGTHTO (gPS_C,gPS_B,gPS_A,oTD_B,oTD_A,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.60
type record RRLP_Flags_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   flag1,
  BIT7                   spare
} with { 
  variant "PRESENCE(iEI = '4A'O)";
  variant (lengthIndicator) "LENGTHTO (flag1,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


//11.3.61
type record RIM_Application_Identity
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   rIMApplicationIdentity
} with { 
  variant "PRESENCE(iEI = '4B'O)";
   variant (lengthIndicator) "LENGTHTO (rIMApplicationIdentity)";        
   variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


//11.3.62
type record RIM_Sequence_Number
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT4                   rIMSequenceNumber
} with { 
  variant "PRESENCE(iEI = '4C'O)";
   variant (lengthIndicator) "LENGTHTO (rIMSequenceNumber)";        
   variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,         ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


// Table 11.3.62a.1
type record RAN_Information_Request_RIM_Container
{
OCT1                         iEI,
BIT1                         ext,
LIN2_2a                      lengthIndicator,
RIM_Application_Identity     rIM_Application_Identity,
RIM_Sequence_Number          rIM_Sequence_Number,
RIM_PDU_Indications          rIM_PDU_Indications,
RIM_Protocol_Version_Number  rIM_Protocol_Version_Number optional,
RAN_Information_Request_Application_Container  application_Container optional,
SON_Transfer_Application_Identity_TLV  sON_Transfer_Application_Identity_TLV optional
} with { 
  variant "PRESENCE(iEI = '57'O)";
  variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
           rIM_Sequence_Number,rIM_PDU_Indications,rIM_Protocol_Version_Number,
           application_Container,sON_Transfer_Application_Identity_TLV)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)"; 
  variant (application_Container) 
     "PRESENCE
        (rIM_Application_Identity.rIMApplicationIdentity = '01'O,
         rIM_Application_Identity.rIMApplicationIdentity = '02'O,
         rIM_Application_Identity.rIMApplicationIdentity = '03'O)";                           
   variant (application_Container) 
     "CROSSTAG 
         (nacc,rIM_Application_Identity.rIMApplicationIdentity = '01'O;
          si3,rIM_Application_Identity.rIMApplicationIdentity = '02'O;
          mBMS_data_channel,rIM_Application_Identity.rIMApplicationIdentity = '03'O;)"       
};


// Table 11.3.62a.2
type record RAN_Information_RIM_Container
{
OCT1                         iEI,
BIT1                         ext,
LIN2_2a                      lengthIndicator,  
RIM_Application_Identity     rIM_Application_Identity,
RIM_Sequence_Number          rIM_Sequence_Number,
RIM_PDU_Indications          rIM_PDU_Indications,
RIM_Protocol_Version_Number  rIM_Protocol_Version_Number optional,
ApplContainer_or_ApplErrContainer  applContainer_or_ApplErrContainer optional,
SON_Transfer_Application_Identity_TLV  sON_Transfer_Application_Identity optional
}  with { 
  variant "PRESENCE(iEI = '58'O)";
      variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
           rIM_Sequence_Number,rIM_PDU_Indications,rIM_Protocol_Version_Number,
           applContainer_or_ApplErrContainer,sON_Transfer_Application_Identity)";        
      variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                           length2,        ext = '0'B;)";
      variant (ext,lengthIndicator) "FIELDORDER(msb)";
      variant (applContainer_or_ApplErrContainer)
       "PRESENCE
           (rIM_Application_Identity.rIMApplicationIdentity = '01'O,
            rIM_Application_Identity.rIMApplicationIdentity = '02'O,
            rIM_Application_Identity.rIMApplicationIdentity = '03'O)";                
      variant (applContainer_or_ApplErrContainer) 
       "CROSSTAG
            (nacc,rIM_Application_Identity.rIMApplicationIdentity = '01'O;
             si3,rIM_Application_Identity.rIMApplicationIdentity = '02'O;
             mBMS_data_channel,rIM_Application_Identity.rIMApplicationIdentity = '03'O;)" 
};         


type union ApplContainer_or_ApplErrContainer
{
  ApplContainer_or_ApplErrContainer_NACC nacc,
  ApplContainer_or_ApplErrContainer_SI3 si3,
  ApplContainer_or_ApplErrContainer_MBMS_data_channel mBMS_data_channel 
}

type union ApplContainer_or_ApplErrContainer_NACC
{
 RAN_Information_Application_Container_NACC   application_Container,
 Application_Error_Container_NACC             application_Error_Container
};

type union ApplContainer_or_ApplErrContainer_SI3
{
 RAN_Information_Application_Container_SI3   application_Container,
 Application_Error_Container_SI3             application_Error_Container
};

type union ApplContainer_or_ApplErrContainer_MBMS_data_channel
{
 RAN_Information_Application_Container_MBMS_data_channel   application_Container,
 Application_Error_Container_MBMS_data_channel             application_Error_Container
};

// Table 11.3.62a.3
type record RAN_Information_Ack_RIM_Container
{
OCT1                         iEI,
BIT1                         ext,
LIN2_2a                      lengthIndicator,  
RIM_Application_Identity     rIM_Application_Identity,
RIM_Sequence_Number          rIM_Sequence_Number,
RIM_Protocol_Version_Number  rIM_Protocol_Version_Number optional,
SON_Transfer_Application_Identity_TLV  sON_Transfer_Application_Identity optional
} with { 
  variant "PRESENCE(iEI = '5A'O)";
  variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
          rIM_Sequence_Number,rIM_Protocol_Version_Number,sON_Transfer_Application_Identity)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


// Table 11.3.62a.4
type record RAN_Information_Error_RIM_Container
{
OCT1                         iEI,
BIT1                         ext,
LIN2_2a                      lengthIndicator,  
RIM_Application_Identity     rIM_Application_Identity,
Cause_BSSGP                  rIM_cause,
RIM_Protocol_Version_Number  rIM_Protocol_Version_Number optional,
PDU_in_Error                 pDU_in_Error,
SON_Transfer_Application_Identity_TLV  sON_Transfer_Application_Identity optional
} with { 
  variant "PRESENCE(iEI = '5B'O)";
  variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
         rIM_cause,rIM_Protocol_Version_Number,pDU_in_Error,sON_Transfer_Application_Identity)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


// Table 11.3.62a.5
type record RAN_Information_Application_Error_RIM_Container
{
OCT1                         iEI,
BIT1                         ext,
LIN2_2a                      lengthIndicator,    
RIM_Application_Identity     rIM_Application_Identity,
RIM_Sequence_Number          rIM_Sequence_Number,
RIM_PDU_Indications          rIM_PDU_Indications,
RIM_Protocol_Version_Number  rIM_Protocol_Version_Number optional,
Application_Error_Container  application_Error_Container,
SON_Transfer_Application_Identity_TLV  sON_Transfer_Application_Identity optional
} with { 
  variant "PRESENCE(iEI = '59'O)";
  variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
    rIM_Sequence_Number,rIM_PDU_Indications,rIM_Protocol_Version_Number,  
    application_Error_Container,sON_Transfer_Application_Identity)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  variant (application_Error_Container)
   "CROSSTAG 
      (nacc,rIM_Application_Identity.rIMApplicationIdentity = '01'O;
       si3,rIM_Application_Identity.rIMApplicationIdentity = '02'O;
       mBMS_data_channel,rIM_Application_Identity.rIMApplicationIdentity = '03'O;)" 
};


// 11.3.63.1
type union RAN_Information_Request_Application_Container
{
RAN_Information_Request_Application_Container_NACC nacc,
RAN_Information_Request_Application_Container_SI3 si3,  
RAN_Information_Request_Application_Container_MBMS_data_channel mBMS_data_channel
}

/* NOTE: 3GPP TS 48.018 V10.6.0 (2012-07), section 11.3.63.1 describes the
 * reporting Cell Identifier IE coding as follows: "Reporting Cell Identifier:
 * This field is encoded as the Cell Identifier defined in sub-clause 11.3.9",
 * but when looking further at 11.3.63.2 the Cell Identifier IE is described
 * as "Reporting Cell Identifier: This field is encoded as the value part of
 * the Cell Identifier IE defined in sub-clause 11.3.9, not including IEI and
 * Length Indicator." The latter description makes more sense, since
 * technically the IE and length of the Cell Identifier from 11.3.9 would be
 * redundant. The same also applies for section 11.3.63.4. */

//Table 11.3.63.1.1
type record RAN_Information_Request_Application_Container_NACC
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 Cell_Identifier_V      reporting_Cell_Identifier
} with { 
  variant "PRESENCE(iEI = '4D'O)";
  variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                      length2,          ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

//Table 11.3.63.1.2
type record RAN_Information_Request_Application_Container_SI3
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 Cell_Identifier_V      reporting_Cell_Identifier
} with { 
  variant "PRESENCE(iEI = '4D'O)";
   variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
   variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,          ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

//Table 11.3.63.1.3
type record RAN_Information_Request_Application_Container_MBMS_data_channel
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 Cell_Identifier_V      reporting_Cell_Identifier
} with { 
  variant "PRESENCE(iEI = '4D'O)";
  variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

//11.3.63.1.4
type record RAN_Information_Request_Application_Container_SON_transfer
{
  OCT1                  iEI,
  BIT1                  ext,
  LIN2_2a               lengthIndicator,
  Cell_Identifier_V     reporting_Cell_Identifier,
  OCTN                  sON_Transfer_Request_Container
} with { 
  variant "PRESENCE(iEI = '4D'O)";
  variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier,sON_Transfer_Request_Container)";     
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

//11.3.63.1.5
type record RAN_Information_Request_Application_Container_UTRA_SI
{
  OCT1                  iEI,
  BIT1                  ext,
  LIN2_2a               lengthIndicator,
  Cell_Identifier_V     reporting_Cell_Identifier
} with { 
  variant "PRESENCE(iEI = '4D'O)";
  variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

//Table 11.3.63.2.1
type record RAN_Information_Application_Container_NACC
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 Cell_Identifier_V      reporting_Cell_Identifier,
 BIT1                   typeBit,
 BIT7                   number_of_SI_PSI,
 octetstring            sI_PSI
} with { 
  variant "PRESENCE(iEI = '4E'O)";
  variant (lengthIndicator) 
    "LENGTHTO (reporting_Cell_Identifier,typeBit,number_of_SI_PSI,sI_PSI)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};  

//Table 11.3.63.2.2
type record RAN_Information_Application_Container_SI3
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 Cell_Identifier_V      reporting_Cell_Identifier,
 SI3                    sI3
} with { 
  variant "PRESENCE(iEI = '4E'O)";
  variant (lengthIndicator) 
    "LENGTHTO (reporting_Cell_Identifier,sI3)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}; 

//44.018 9.1.35
type record SI3
{
 OCT1                              sI3MessageType,    //'1B'O
 OCT2                              cellIdentity,               //10.5.1.1 -> 24.008 
 LocationAreaIdentification        locationAreaIdentification, //10.5.1.3 -> 24.008
 ControlChannelDescription         controlChannelDescription,  //10.5.2.11
 CellOptions                       cellOptions,                //10.5.2.3
 CellSelectionParameters           cellSelectionParameters,    //10.5.2.4
 RACHControlParameters             rACHControlParameters,      //10.5.2.29
 OCT4                              sI3RestOctets               //10.5.2.34, bit encoded
}

type record LocationAreaIdentification
{
  HEX1               mccDigit1,
  HEX1               mccDigit2,
  HEX1               mccDigit3,
  HEX1               mncDigit3,
  HEX1               mncDigit1,
  HEX1               mncDigit2,
  OCT2               lac
}

type record ControlChannelDescription
{
 BIT3          cCCH_Conf,
 BIT3          bS_AG_BLKS_RES,
 BIT1          aTT,
 BIT1          mSCR,
 BIT3          bS_PA_MFRMS,
 BIT2          spare1,   //'00'B
 BIT2          cBQ3,
 BIT1          spare2,  //'0'B
 OCT1          t3212
}

type record CellOptions
{
 BIT4          radioLinkTimeout,
 BIT2          dTX1,
 BIT1          pWRC,
 BIT1          dtx2
}

type record CellSelectionParameters
{
 BIT5          mS_TXPWR_MAX_CCH,
 BIT3          cellReselectHysterisis,
 BIT6          rXLEV_Access_Min,
 BIT1          nECI,
 BIT1          aCS
}

type record RACHControlParameters 
{
 BIT1          rE,
 BIT1          cellBarrAccess,
 BIT4          tX_Integer,
 BIT2          maxRetrans,
 OCT1          aC_15_to_8,
 OCT1          aC_7_to_0    
}

//Table 11.3.63.2.3
type record RAN_Information_Application_Container_MBMS_data_channel
{
 OCT1                      iEI,
 BIT1                      ext,
 LIN2_2a                   lengthIndicator,
 Cell_Identifier_V         reporting_Cell_Identifier,
 octetstring               mBMS_data_channel_report  //bit encoded
} with { 
  variant "PRESENCE(iEI = '4E'O)";
  variant (lengthIndicator) 
    "LENGTHTO (reporting_Cell_Identifier,mBMS_data_channel_report)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

//11.3.63.2.4
type record RAN_Information_Application_Container_SON_transfer
{
  OCT1                     iEI,
  BIT1                     ext,
  LIN2_2a                  lengthIndicator,
  BIT4                     rAT_Discriminator,
  BIT4                     spare,
  Cell_Identifier_V        reporting_Cell_Identifier,
  OCTN                     sON_Transfer_Response_Container
} with { 
  variant "PRESENCE(iEI = '4E'O)";
  variant (lengthIndicator) 
    "LENGTHTO (rAT_Discriminator,spare,reporting_Cell_Identifier,sON_Transfer_Response_Container)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

//11.3.63.2.5
type record RAN_Information_Application_Container_UTRA_SI
{
  OCT1                     iEI,
  BIT1                     ext,
  LIN2_2a                  lengthIndicator,
  Cell_Identifier_V        reporting_Cell_Identifier,
  OCTN                     uTRA_SI_Container
} with { 
  variant "PRESENCE(iEI = '4E'O)";
  variant (lengthIndicator) 
    "LENGTHTO (reporting_Cell_Identifier,uTRA_SI_Container)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

// 11.3.64
type union Application_Error_Container
{
 Application_Error_Container_NACC               nacc,
 Application_Error_Container_SI3                si3,
 Application_Error_Container_MBMS_data_channel  mBMS_data_channel 
} 
      
//11.3.64.1 
type record Application_Error_Container_NACC
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   nACC_cause,
 Application_Container_IE_NACC  erroneousApplicationContainer
} with { 
  variant "PRESENCE(iEI = '56'O)";
  variant (lengthIndicator)
    "LENGTHTO (nACC_cause,erroneousApplicationContainer)"; 
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
 variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

       
type union Application_Container_IE_NACC
{
  RAN_Information_Request_Application_Container_NACC 
                        rAN_Information_Request_Application_Container,
            
  RAN_Information_Application_Container_NACC    
                        rAN_Information_Application_Container
};
     
//11.3.64.2 
type record Application_Error_Container_SI3
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   sI3_cause,
 Application_Container_IE_SI3  erroneousApplicationContainer
} with { 
  variant "PRESENCE(iEI = '56'O)";
  variant (lengthIndicator)
    "LENGTHTO (sI3_cause,erroneousApplicationContainer)"; 
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
 variant (ext,lengthIndicator) "FIELDORDER(msb)";
};     

type union Application_Container_IE_SI3
{
  RAN_Information_Request_Application_Container_SI3 
                        rAN_Information_Request_Application_Container,
            
  RAN_Information_Application_Container_SI3    
                        rAN_Information_Application_Container
};


//11.3.64.3 
type record Application_Error_Container_MBMS_data_channel
{
 OCT1                                        iEI,
 BIT1                                        ext,
 LIN2_2a                                     lengthIndicator,
 OCT1                                        mBMS_data_channel_cause,
 Application_Container_IE_MBMS_data_channel  erroneousApplicationContainer
} with { 
  variant "PRESENCE(iEI = '56'O)";
  variant (lengthIndicator)
    "LENGTHTO (mBMS_data_channel_cause,erroneousApplicationContainer)"; 
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
 variant (ext,lengthIndicator) "FIELDORDER(msb)";
};     

type union Application_Container_IE_MBMS_data_channel
{
  RAN_Information_Request_Application_Container_MBMS_data_channel 
                        rAN_Information_Request_Application_Container,
            
  RAN_Information_Application_Container_MBMS_data_channel    
                        rAN_Information_Application_Container
};

//11.3.64.4
type record Application_Error_Container_SON_transfer
{
 OCT1                                        iEI,
 BIT1                                        ext,
 LIN2_2a                                     lengthIndicator,
 OCT1                                        sON_transfer_cause,
 Application_Container_IE_SON_transfer       erroneousApplicationContainer
};

type union Application_Container_IE_SON_transfer
{
  RAN_Information_Request_Application_Container_SON_transfer
                        rAN_Information_Request_Application_Container,
  RAN_Information_Application_Container_SON_transfer
                        rAN_Information_Application_Container
};

//11.3.64.5
type record Application_Error_Container_UTRA_SI
{
 OCT1                                        iEI,
 BIT1                                        ext,
 LIN2_2a                                     lengthIndicator,
 OCT1                                        uTRA_SI_cause,
 Application_Container_IE_UTRA_SI            erroneousApplicationContainer
};

type union Application_Container_IE_UTRA_SI
{
  RAN_Information_Request_Application_Container_UTRA_SI
                        rAN_Information_Request_Application_Container,
  RAN_Information_Application_Container_UTRA_SI
                        rAN_Information_Application_Container
};

//11.3.65
type record RIM_PDU_Indications
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 BIT1                   ack,
 BIT3                   pDU_Type_Extension,
 BIT4                   reserved
} with { 
  variant "PRESENCE(iEI = '4F'O)";
  variant (lengthIndicator) "LENGTHTO (ack,pDU_Type_Extension,reserved)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};


//11.3.67
type record RIM_Protocol_Version_Number
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 OCT1                   rIMProtocolVersionNumber
} with {
   variant "PRESENCE(iEI = '55'O)";
   variant (lengthIndicator) "LENGTHTO (rIMProtocolVersionNumber)";   
   variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                              length2,        ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

// 11.3.68
type record PFC_flow_control_parameters
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 integer                number_of_PFC (0..11),
 PFCs                   pFCs
} with {
  variant "PRESENCE(iEI = '52'O)";
  variant (lengthIndicator) "LENGTHTO (number_of_PFC,pFCs)"; 
  variant (number_of_PFC) "LENGTHTO (pFCs)";
  variant (number_of_PFC) "UNIT(elements)"
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        

type record length(0..11) of  PFC PFCs;

type record PFC
{
BIT7                    pFI_Value,
BIT1                    spare,  //  '0'B according to 10.5.6.11 of 24.008
OCT2                    bmax_PFC,
OCT2                    r_PFC,
OCT1                    b_PFC
};

// 11.3.69
type record Global_CN_Id_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  Global_CN_Id_Value     global_CN_Id   //  encoded Global CN-Id
} with { 
  variant "PRESENCE(iEI = '53'O)";
  variant (lengthIndicator) "LENGTHTO (global_CN_Id)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record Global_CN_Id_Value
{
 HEX1                    mccDigit1,
 HEX1                    mccDigit2,
 HEX1                    mccDigit3,
 HEX1                    mncDigit3,
 HEX1                    mncDigit1,
 HEX1                    mncDigit2, 
 OCT2                    cN_Id
}


// 11.3.70
type record RIM_Routing_Information
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 HEX1                   rIMRoutingAddressDiscriminator,
 HEX1                   spare,
 RIM_Routing_Address    rIM_Routing_Address 
}  with { 
  variant "PRESENCE(iEI = '54'O)";
  variant (lengthIndicator) 
    "LENGTHTO (rIMRoutingAddressDiscriminator,spare,rIM_Routing_Address)"; 
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  variant (rIM_Routing_Address) 
    "CROSSTAG (cell_Identifier, rIMRoutingAddressDiscriminator = '0'H;
               globalRNCID,     rIMRoutingAddressDiscriminator = '1'H;
               eNB_Identifier,  rIMRoutingAddressDiscriminator = '2'H;
               eHRPD_SectorID,  rIMRoutingAddressDiscriminator = '3'H
               )" 
};

type union RIM_Routing_Address
{
  Cell_Identifier_V   cell_Identifier, 
  GlobalRNC_ID_BSSGP  globalRNCID,
  ENB_Identifier_V    eNB_Identifier,
  octetstring         eHRPD_SectorID
}

type record GlobalRNC_ID_BSSGP
{
 HEX1                   mccDigit1,
 HEX1                   mccDigit2,
 HEX1                   mccDigit3,
 HEX1                   mncDigit3,
 HEX1                   mncDigit1,
 HEX1                   mncDigit2,
 OCT2                   lac,
 OCT1                   rac, 
 HEX1                   spare,
 integer                rNC_ID
}  with { 
    variant (spare,rNC_ID) "FIELDORDER(msb)";
    variant (rNC_ID) "BYTEORDER(last)";  
    variant (rNC_ID) "FIELDLENGTH(12)";
}

type record  ENB_Identifier_V {
  HEX1               mccDigit1,
  HEX1               mccDigit2,
  HEX1               mccDigit3,
  HEX1               mncDigit3,
  HEX1               mncDigit1,
  HEX1               mncDigit2,
  OCT2               tac,  
  octetstring       globaleNBID
}


// 11.3.71 
type record MBMS_Session_Identity
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 OCT1                    mBMS_Session_Identifier_Value
} with { 
  variant "PRESENCE(iEI = '5D'O)";
  variant (lengthIndicator) "LENGTHTO (mBMS_Session_Identifier_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        


// 11.3.72 
// 29.061 

type record MBMS_Session_Duration
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 octetstring            mBMS_Session_Duration_Value
} with { 
  variant "PRESENCE(iEI = '5E'O)";
  variant (lengthIndicator) "LENGTHTO (mBMS_Session_Duration_Value)";  
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,         ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        


// 11.3.73 
type record MBMS_Service_Area_Identity_List
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 octetstring            mBMS_Service_Area_Identity_List_Value       
} with { 
  variant "PRESENCE(iEI = '5F'O)";
  variant (lengthIndicator) 
             "LENGTHTO (mBMS_Service_Area_Identity_List_Value)";        
  variant (lengthIndicator) "CROSSTAG( length1,       ext = '1'B;
                                       length2,       ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        


// 11.3.74
type record MBMS_Response
{
 OCT1                   iEI,
 BIT1                   ext,
 LIN2_2a                lengthIndicator,
 HEX1                   causeValue,
 HEX1                   spare
} with { 
  variant "PRESENCE(iEI = '60'O)";
  variant (lengthIndicator) "LENGTHTO (causeValue,spare)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        


// 11.3.75
type record MBMS_Routing_Area_List
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 HEX1                    spare,
 HEX1                    number_of_Routing_Area_Identifications, 
 octetstring             routing_Area_Identifications optional 

} with { 
  variant "PRESENCE(iEI = '61'O)";
   variant (lengthIndicator) 
     "LENGTHTO (spare,number_of_Routing_Area_Identifications,
      routing_Area_Identifications)";     
   variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                        length2,         ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";        
};


// 11.3.76
type record MBMS_Session_Information
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 BIT1                    bCMC,
 BIT7                    spare
} with { 
  variant "PRESENCE(iEI = '62'O)";
  variant (lengthIndicator) "LENGTHTO (bCMC, spare)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};

//11.3.77 
// 24.008 10.5.6.13
type record TMGI_BSSGP
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 OCT3                    mBMS_Service_ID,
 HEX1                    mccDigit1,
 HEX1                    mccDigit2,
 HEX1                    mccDigit3,
 HEX1                    mncDigit3,
 HEX1                    mncDigit1,
 HEX1                    mncDigit2 
} with { 
  variant "PRESENCE(iEI = '5C'O)";
   variant (lengthIndicator) "LENGTHTO
         (mBMS_Service_ID,mccDigit1,mccDigit2,mccDigit3,mncDigit3,
      mncDigit1,mncDigit2)";        
   variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
                                        length2,         ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
};        
       
// 11.3.78 MBMS Stop Cause
type record MBMS_Stop_Cause
{
 OCT1                    iEI,
 BIT1                    ext,
 LIN2_2a                 lengthIndicator,
 HEX1                    causeValue,
 HEX1                    spare
} with { 
  variant "PRESENCE(iEI = '63'O)";
  variant (lengthIndicator) "LENGTHTO (causeValue, spare)";        
  variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
                                       length2,        ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
};
 
// 11.3.79
type record Source_BSS_to_Target_BSS_Transparent_Container_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  Source_BSS_to_Target_BSS_Transparent_Container_Contents
      source_BSS_to_Target_BSS_Transparent_Container_Contents
} with { 
  variant "PRESENCE(iEI = '64'O)";
  variant (lengthIndicator) "LENGTHTO (source_BSS_to_Target_BSS_Transparent_Container_Contents)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record Source_BSS_to_Target_BSS_Transparent_Container_Contents
{
  MS_Radio_Access_Capability        mS_Radio_Access_Capability,
  Inter_RAT_Handover_Info_BSSGP     inter_RAT_Handover_Info optional,
  Page_Mode_BSSGP                   page_Mode_BSSGP optional,
  Container_ID_BSSGP                container_ID optional,
  Global_TFI_BSSGP                  global_TFI optional,
  PS_HandoverIndications            pS_HandoverIndications optional,
  CS_Indication                     cS_Indication optional,
  E_UTRAN_Inter_RAT_Handover_Info	e_UTRAN_Inter_RAT_Handover_Info optional,
  IRAT_Measurement_Configuration    iRAT_Measurement_Configuration optional,
  Source_Cell_ID                    source_Cell_ID optional,
  IRAT_Measurement_Configuration_Extended_eARFCNs iRAT_Measurement_Configuration_Extended_eARFCNs optional
};

// 11.3.80
type record Target_BSS_to_Source_BSS_Transparent_Container
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  Target_BSS_to_Source_BSS_Transparent_Container_Contents
                         target_BSS_to_Source_BSS_Transparent_Container_Contents
} with { 
  variant "PRESENCE(iEI = '65'O)";
  variant (lengthIndicator) "LENGTHTO (target_BSS_to_Source_BSS_Transparent_Container_Contents)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}
//Note: Only  PS_Handover_Command_BSSGP or DTM_Handover_Command is present
type record Target_BSS_to_Source_BSS_Transparent_Container_Contents
{
  PS_Handover_Command_BSSGP  pS_Handover_Command optional,
  SI_PSI_Container           sI_PSI_Container optional,    //NEW  
  DTM_Handover_Command       dTM_Handover_Command optional    //NEW  
}

// 11.3.81
type record NAS_container_for_PS_Handover
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  NAS_Container_for_PS_HO            nAS_Container_for_PS_HO
} with { 
  variant "PRESENCE(iEI = '66'O)";
  variant (lengthIndicator) "LENGTHTO (nAS_Container_for_PS_HO)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//24.008 10.5.1.14
type record NAS_Container_for_PS_HO
{
  BIT3          typeOfCipheringAlgorithm,
  BIT1          spare1,
  BIT1          oldXID,
  BIT3          spare2,
  OCT4          iOV_UI
}

// 11.3.82
type record PFCs_to_be_set_up_list
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  integer                number_of_PFCs (1..11),   // note: 0 and 12 .. 255 are reserved!!!
  Multiple_PFCs_BSSGP    pFCs
} with { 
  variant "PRESENCE(iEI = '67'O)";
  variant (lengthIndicator) "LENGTHTO (number_of_PFCs,pFCs)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  variant (number_of_PFCs) "UNIT(elements),LENGTHTO(pFCs),FIELDORDER(msb),FIELDLENGTH(8)";
}

type record Single_PFC_BSSGP
{
  PFI                               pFI,
  GPRS_Timer                        pFT,
  ABQP                              aBQP,
  Priority_BSSGP                    allocation_Retention_Priority optional,
  GPRS_Timer                        t10 optional
}

type record length (1..11) of Single_PFC_BSSGP Multiple_PFCs_BSSGP;


// 11.3.83
type record List_of_set_up_PFCs_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  integer                number_of_PFCs (0..11),   // note: 12 .. 255 are reserved!!!
  Multiple_PFIs_BSSGP    pFIs
} with { 
  variant "PRESENCE(iEI = '68'O)";
  variant (lengthIndicator) "LENGTHTO (number_of_PFCs,pFIs)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  variant (number_of_PFCs) "UNIT(elements),LENGTHTO(pFIs),FIELDORDER(msb),FIELDLENGTH(8)";
}

type record Single_PFI_BSSGP
{
  BIT7  pFI_Value,
  BIT1  spare
}

type record length (0..11) of Single_PFI_BSSGP Multiple_PFIs_BSSGP;


// 11.3.84 Extended Feature Bitmap
type record Extended_Feature_Bitmap
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   pS_Handover,
  BIT1                   gigabitInterface,
  BIT1                   mOCN,
  BIT1                   cS_PS_Coordination_Enhancements,
  BIT4                   spare
} with { 
  variant "PRESENCE(iEI = '69'O)";
  variant (lengthIndicator) "LENGTHTO (pS_Handover,gigabitInterface,mOCN,cS_PS_Coordination_Enhancements,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.85
type record Source_to_Target_Transparent_Container
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring          source_to_Target_Transparent_Container_Contents //RANAP ASN.1 PER
} with { 
  variant "PRESENCE(iEI = '6A'O)";
  variant (lengthIndicator) "LENGTHTO (source_to_Target_Transparent_Container_Contents)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.86
type record Target_to_Source_Transparent_Container
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring          handover_to_UTRAN_or_Radio_Bearer_Reconfiguration_radio_interface_message //ASN.1
} with { 
  variant "PRESENCE(iEI = '6B'O)";
  variant (lengthIndicator) "LENGTHTO (handover_to_UTRAN_or_Radio_Bearer_Reconfiguration_radio_interface_message)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}



// 11.3.87
type record RNC_Identifier_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  HEX1                   mccDigit1,
  HEX1                   mccDigit2,
  HEX1                   mccDigit3,
  HEX1                   mncDigit3,
  HEX1                   mncDigit1,
  HEX1                   mncDigit2,
  OCT2                   lac,
  OCT1                   rac,    
  OCT2               	 rNC_ID
} with { 
  variant "PRESENCE(iEI = '6C'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1, mccDigit2, mccDigit3, mncDigit3, mncDigit1, mncDigit2,
                                        lac, rac, rNC_ID)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

 
// 11.3.88
type record Page_Mode_BSSGP
{
  OCT1                            iEI,
  BIT1                            ext,
  LIN2_2a                         lengthIndicator,
  BIT2                            page_mode,  // specified in 3GPP TS 44.060
  BIT6                            reserved
} with { 
  variant "PRESENCE(iEI = '6D'O)";
  variant (lengthIndicator) "LENGTHTO (page_mode,reserved)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

  
// 11.3.89
type record Container_ID_BSSGP
{
  OCT1                            iEI,
  BIT1                            ext,
  LIN2_2a                         lengthIndicator,
  BIT2                            container_ID,   // specified in 3GPP TS 44.060
  BIT6                            reserved
} with { 
  variant "PRESENCE(iEI = '6E'O)";
  variant (lengthIndicator) "LENGTHTO (container_ID,reserved)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.90
type record Global_TFI_BSSGP
{
  OCT1                            iEI,
  BIT1                            ext,
  LIN2_2a                         lengthIndicator,
  BIT6                            global_TFI,   // specified in 3GPP TS 44.060
  BIT2                            reserved  
} with {
  variant "PRESENCE(iEI = '6F'O)";
  variant (lengthIndicator) "LENGTHTO (global_TFI,reserved)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.91
type record IMEI_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  IMEI_Value             iMEI 
} with { 
  variant "PRESENCE(iEI = '70'O)";
  variant (lengthIndicator) "LENGTHTO (iMEI)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record IMEI_Value
{
 BIT3               typeOfIdentity,
 BIT1               oddevenIndicator,
 hexstring          digits  length(15)
}


// 11.3.92 Time to MBMS Data Transfer
type record Time_To_MBMS_Data_Transfer
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   valuePart
} with { 
  variant "PRESENCE(iEI = '71'O)";
  variant (lengthIndicator) "LENGTHTO (valuePart)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.93 MBMS Session Repetition Number
type record MBMS_Session_Repetition_Number
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            repetitionNumber
} with { 
  variant "PRESENCE(iEI = '72'O)";
  variant (lengthIndicator) "LENGTHTO (repetitionNumber)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.94
type record Inter_RAT_Handover_Info_BSSGP
{
  OCT1                            iEI,
  BIT1                            ext,
  LIN2_2a                         lengthIndicator,
  octetstring                     inter_RAT_Handover_Information //as specified in 3GPP TS 25.331
} with { 
  variant "PRESENCE(iEI = '73'O)";
  variant (lengthIndicator) "LENGTHTO (inter_RAT_Handover_Information)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.95
type record PS_Handover_Command_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            pS_Handover_Command_radio_interface_message
} with { 
  variant "PRESENCE(iEI = '74'O)";
  variant (lengthIndicator) "LENGTHTO (pS_Handover_Command_radio_interface_message)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.95a
type record PS_HandoverIndications
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   sI_PSI,
  BIT2                   dMLC_Carriers,
  BIT5                   spare
} with { 
  variant "PRESENCE(iEI = '75'O)";
  variant (lengthIndicator) "LENGTHTO (sI_PSI,dMLC_Carriers,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


// 11.3.95b
type record  SI_PSI_Container
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   typeField, 
  SI_PSI_ContainerValue  sI_PSI_ContainerValue
} with { 
   variant "PRESENCE(iEI = '76'O)";  
   variant (lengthIndicator) "LENGTHTO (typeField,sI_PSI_ContainerValue)";
   variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                        length2,    ext = '0'B;)";
   variant (ext,lengthIndicator) "FIELDORDER(msb)";
   variant (sI_PSI_ContainerValue) "CROSSTAG 
      (
       sI_message_Container,          typeField ='0'B;
       pSI_message_Container,         typeField ='1'B;
      )"; 
 };   

type union SI_PSI_ContainerValue
{
  SI_message_Container   sI_message_Container,
  PSI_message_Container  pSI_message_Container
}

type record SI_message_Container 
{
  integer           number_of_SI,
  SI_message_List   sI_message_List
} with { 
  variant (number_of_SI) "UNIT(elements),LENGTHTO(sI_message_List),FIELDORDER(msb),FIELDLENGTH(7)";
}

type record PSI_message_Container
{
  integer            number_of_PSI,
  PSI_message_List   pSI_message_List
} with { 
   variant (number_of_PSI) "UNIT(elements),LENGTHTO(pSI_message_List),FIELDORDER(msb),FIELDLENGTH(7)";
}

type record of SI_message  SI_message_List;

type record of PSI_message  PSI_message_List;

type octetstring SI_message length (21);

type octetstring PSI_message length (22);


// 11.3.95c  48.008 CR 240
type record Active_PFCs_List_BSSGP
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  integer                number_of_PFCs (0..11),   // note: 12 .. 255 are reserved!!!
  Multiple_PFIs_BSSGP    pFIs
} with {
  variant "PRESENCE(iEI = '77'O)";
  variant (lengthIndicator) "LENGTHTO (number_of_PFCs,pFIs)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
  variant (number_of_PFCs) "UNIT(elements),LENGTHTO(pFIs),FIELDORDER(msb),FIELDLENGTH(8)";
}

//11.3.96
type record VelocityData
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            velocityDataValue // 23.032
}with { 
  variant "PRESENCE(iEI = '78'O)";
  variant (lengthIndicator) "LENGTHTO (velocityDataValue)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//11.3.97
type record DTM_Handover_Command
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  octetstring            dTM_HandoverCommandValue // 44.060
} with { 
  variant "PRESENCE(iEI = '79'O)";
  variant (lengthIndicator) "LENGTHTO (dTM_HandoverCommandValue)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}
  
//11.3.98
type record CS_Indication 
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   cS_IndicationContents  //48.008
}  with { 
  variant "PRESENCE(iEI = '7A'O)";
  variant (lengthIndicator) "LENGTHTO (cS_IndicationContents)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.99
type record Requested_GANSS_Assistance_Data
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,  
  octetstring            requested_GANSS_Assistance_Data_Value   //49.031
} with { 
  variant "PRESENCE(iEI = '7B'O)";
  variant (lengthIndicator) "LENGTHTO (requested_GANSS_Assistance_Data_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.100
type record GANSS_Location_Type
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,  
  BIT1                   galileo, 
  BIT7                   spare                                        
} with { 
  variant "PRESENCE(iEI = '7C'O)";
  variant (lengthIndicator) "LENGTHTO (galileo,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

// 11.3.101
//49.031
type record GANSS_Positioning_Data
{  
  OCT1                         iEI,
  BIT1                         ext,
  LIN2_2a                      lengthIndicator,
  GANSS_Positioning_DataList   gANSS_Positioning_DataList                                        
} with { 
  variant "PRESENCE(iEI = '7D'O)";
  variant (lengthIndicator) "LENGTHTO (gANSS_Positioning_DataList)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record of GANSS_Positioning_DataValue GANSS_Positioning_DataList

type record GANSS_Positioning_DataValue
{
  BIT3                   usage,
  BIT3                   gANSS_ID,
  BIT2                   method    
}

//11.3.102
type record Flow_Control_Granularity
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT2                   granularity,
  BIT6                   reserved                                           
} with { 
  variant "PRESENCE(iEI = '7E'O)";
  variant (lengthIndicator) "LENGTHTO (granularity,reserved)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


//11.3.103
type record ENB_Identifier
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  HEX1					 mccDigit1,
  HEX1					 mccDigit2,
  HEX1					 mccDigit3,
  HEX1					 mncDigit3,
  HEX1					 mncDigit1,
  HEX1					 mncDigit2,
  OCT2					 tac,
  OCTN					 globalEnbID  
                                      
} with { 
  variant "PRESENCE(iEI = '7F'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1, mccDigit2, mccDigit3, mncDigit3, mncDigit1,
   										mncDigit2, tac, globalEnbID)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


//11.3.104
type record E_UTRAN_Inter_RAT_Handover_Info
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCTN					 ue_EUTRA_Capability
                                      
} with { 
  variant "PRESENCE(iEI = '80'O)";		
  variant (lengthIndicator) "LENGTHTO (ue_EUTRA_Capability)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}


//11.3.105
type record Subscriber_Profile_ID_For_RAT_Priority
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT8					 profile_ID                                                    
} with { 
  variant "PRESENCE(iEI = '81'O)";
  variant (lengthIndicator) "LENGTHTO (profile_ID)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//11.3.106
type record Request_For_Inter_RAT_Handover_Info
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   interRATHandoverInfoRequest,
  BIT1					 eUTRANinterRATHandoverInfoRequest,
  BIT6                   spare                                           
} with { 
  variant "PRESENCE(iEI = '82'O)"; 
  variant (lengthIndicator) "LENGTHTO (interRATHandoverInfoRequest,eUTRANinterRATHandoverInfoRequest,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//11.3.107
type record Reliable_Inter_RAT_Handover_Info
{  
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   reliableInterRATHandoverInfoIndicator,
  BIT7                   spare                                           
} with { 
  variant "PRESENCE(iEI = '83'O)";	
  variant (lengthIndicator) "LENGTHTO (reliableInterRATHandoverInfoIndicator,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//11.3.108
type record SON_Transfer_Application_Identity_TLV
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCTN                   sON_Transfer_Application_Identity  //3GPP TS 36.413 [36]
} with {
  variant "PRESENCE(iEI = '84'O)";
  variant (lengthIndicator) "LENGTHTO (sON_Transfer_Application_Identity)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//11.3.109
type record CSG_Identifier_TLV
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  CSG_Identity           cSG_Identity,  //3GPP TS 23.003, bits 4 to 8 of octet 6 are spare
  BIT1                   cell_Acces_Mode,
  BIT7                   spare
} with {
  variant "PRESENCE(iEI = '85'O)";
  variant (lengthIndicator) "LENGTHTO (cSG_Identity,cell_Acces_Mode,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

type record CSG_Identity
{
  OCT3					cSG_Id24, 
  BIT3					cSG_Id3,
  BIT5					spare // '0'B
};

//11.3.110
type record Tracking_Area_Code_TLV
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT3                   valueField  //3GPP TS 24.301
} with {
  variant "PRESENCE(iEI = '86'O)";
  variant (lengthIndicator) "LENGTHTO (valueField)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";
}

//11.3.111
type record Redirect_Attempt_Flag
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   spare  
} with {
  variant "PRESENCE(iEI = '87'O)";
  variant (lengthIndicator) "LENGTHTO (spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.112
type record Redirection_Indication
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator, 
  BIT8                   reroute_Reject_Cause_value
} with {
  variant "PRESENCE(iEI = '88'O)";
  variant (lengthIndicator) "LENGTHTO (reroute_Reject_Cause_value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				       				       
}

//11.3.113
type record Redirection_Completed
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,   
  BIT8                   outcome_value
} with {
  variant "PRESENCE(iEI = '89'O)";
  variant (lengthIndicator) "LENGTHTO (outcome_value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)";
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				                
}
 
//11.3.114
type record Unconfirmed_Send_State_Variable
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator, 
  BIT7                   spare,           
  integer                vU  
} with {
  variant "PRESENCE(iEI = '8A'O)";
  variant (lengthIndicator) "LENGTHTO (spare,vU)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				       
  variant (vU) "FIELDLENGTH(9)";
  variant (vU) "BYTEORDER(last)";				       
  variant (spare,vU) "FIELDORDER(msb)";				       				       
}

//11.3.115
type record IRAT_Measurement_Configuration
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator, 
  INT6b                  reportingThreshold,
  BIT1                   repQuant,
  BIT1                   spare,
  INT1                   measurementDuration,   
  Measurement_List       measurement_List
} with {
  variant "PRESENCE(iEI = '8B'O)";
  variant (lengthIndicator) "LENGTHTO (reportingThreshold,repQuant,spare,measurementDuration,measurement_List)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				       
}				      
				      				      
type record Measurement
{
  LIN2_BO_LAST           e_ARFCN,
  BIT3                   measurementBandwidth,
  BIT5                   spare
}

type record of Measurement Measurement_List;
				       
type record RNC_Id_with_Transparent_Container_BSSGP 
{
  RNC_Identifier_BSSGP  target_RNC_Identifier,
  Source_to_Target_Transparent_Container
                               source_to_Target_Transparent_Container
}

type union Cell_or_RNC_Id_with_Transparent_Container_BSSGP
{
  Cell_Id_with_Transparent_Container_BSSGP  cell_Id_with_Transparent_Container,
  RNC_Id_with_Transparent_Container_BSSGP   rnc_Id_with_Transparent_Container
}

type record Cell_Id_with_Transparent_Container_BSSGP
{
  Cell_Identifier                target_Cell_Identifier,
  Source_BSS_to_Target_BSS_Transparent_Container_BSSGP
      source_BSS_to_Target_BSS_Transparent_Container
}

//11.3.116
type record SCI
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   service_Class_Value
} with {
  variant "PRESENCE(iEI = '8c'O)";
  variant (lengthIndicator) "LENGTHTO (service_Class_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.117
type record GGSN_PGW_Location
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT3                   gGSN_PGW_Location_Value,
  BIT5                   spare
} with {
  variant "PRESENCE(iEI = '8d'O)";
  variant (lengthIndicator) "LENGTHTO (gGSN_PGW_Location_Value)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.118
type record Selected_PLMN_ID
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  HEX1                   mccDigit1,
  HEX1                   mccDigit2,
  HEX1                   mccDigit3,
  HEX1                   mncDigit3,
  HEX1                   mncDigit1,
  HEX1                   mncDigit2 
} with {
  variant "PRESENCE(iEI = '8e'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1,mccDigit2,mccDigit3,mncDigit3,mncDigit1,mncDigit2)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.119
type record Priority_Class_Indicator
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT1                   priority_Class_Indicator_Value,
  BIT7                   spare
} with {
  variant "PRESENCE(iEI = '8f'O)";
  variant (lengthIndicator) "LENGTHTO (priority_Class_Indicator_Value,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.120
type record Source_Cell_ID
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  TrackingAreaIdentity_BSSGP tracking_Area_Identity,
  ECGI_BSSGP             eUTRAN_CGI,
  octetstring            globaleNBID
} with {
  variant "PRESENCE(iEI = '90'O)";
  variant (lengthIndicator) "LENGTHTO (tracking_Area_Identity,eUTRAN_CGI,globaleNBID)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}
type record TrackingAreaIdentity_BSSGP
{
  HEX1               mccDigit1,
  HEX1               mccDigit2,
  HEX1               mccDigit3,
  HEX1               mncDigit3,
  HEX1               mncDigit1,
  HEX1               mncDigit2,
  OCT2               tAC
} 

type record ECGI_BSSGP
{
  HEX1                         mccDigit1,
  HEX1                         mccDigit2,
  HEX1                         mccDigit3,
  HEX1                         mncDigit3,
  HEX1                         mncDigit1,
  HEX1                         mncDigit2,
  HEX1                         spare,     
  integer                      eCI
} with {
  variant (spare,eCI) "FIELDORDER(msb)";     
  variant(eCI) "FIELDLENGTH(28)";
  variant (eCI) "BYTEORDER(last)";
};


//11.3.121
type record IRAT_Measurement_Configuration_Extended_eARFCNs
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  INT6b                  reportingThreshold,
  BIT1                   repQuant,
  BIT1                   spare,
  INT1                   measurementDuration,   
  Measurement_List_Extended measurement_List
} with {
  variant "PRESENCE(iEI = '91'O)";
  variant (lengthIndicator) "LENGTHTO (reportingThreshold,repQuant,spare,measurementDuration,measurement_List)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

type record Measurement_Extended
{
  INT18b_BO_LAST         e_ARFCN,
  BIT3                   spare,
  BIT3                   measurementBandwidth
} with {
  variant (e_ARFCN,spare,measurementBandwidth) "FIELDORDER(msb)";				          
}
type record of Measurement_Extended Measurement_List_Extended;

//11.3.122
type record EDRX_Parameters
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  BIT4                   eDRX_Cycle_Value,
  BIT4                   spare
} with {
  variant "PRESENCE(iEI = '92'O)";
  variant (lengthIndicator) "LENGTHTO (eDRX_Cycle_Value,spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.123
type record Time_Until_Next_Paging_Occasion
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  INT6b                  minutes,
  BIT2                   spare,
  INT6b                  seconds,
  BIT2                   spare2
} with {
  variant "PRESENCE(iEI = '93'O)";
  variant (lengthIndicator) "LENGTHTO (minutes,spare,seconds,spare2)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.124
type record Old_Routing_Area_Identification
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  HEX1                   mccDigit1,
  HEX1                   mccDigit2,
  HEX1                   mccDigit3,
  HEX1                   mncDigit3,
  HEX1                   mncDigit1,
  HEX1                   mncDigit2,
  OCT2                   lac,
  OCT1                   rac
} with {
  variant "PRESENCE(iEI = '94'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1,mccDigit2,mccDigit3,mncDigit3,mncDigit1,mncDigit2,lac,rac)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.125
type record Attach_Indicator
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   spare
} with {
  variant "PRESENCE(iEI = '95'O)";
  variant (lengthIndicator) "LENGTHTO (spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.126
type record PLMN_Identity
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  HEX1                   mccDigit1,
  HEX1                   mccDigit2,
  HEX1                   mccDigit3,
  HEX1                   mncDigit3,
  HEX1                   mncDigit1,
  HEX1                   mncDigit2 
} with {
  variant "PRESENCE(iEI = '96'O)";
  variant (lengthIndicator) "LENGTHTO (mccDigit1,mccDigit2,mccDigit3,mncDigit3,mncDigit1,mncDigit2)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}

//11.3.127
type record MME_Query
{
  OCT1                   iEI,
  BIT1                   ext,
  LIN2_2a                lengthIndicator,
  OCT1                   spare
} with {
  variant "PRESENCE(iEI = '97'O)";
  variant (lengthIndicator) "LENGTHTO (spare)";
  variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
                                       length2,    ext = '0'B;)"; 
  variant (ext,lengthIndicator) "FIELDORDER(msb)";				          
}


//-----------------------------------------------------------------------------
// PDUs
//-----------------------------------------------------------------------------

//10.2.1
type record PDU_BSSGP_DL_UNITDATA 
{
 OCT1                              bssgpPduType,
 OCT4                              tLLI_current,
 QoS_Profile_V                     qoS_Profile,
 PDU_Lifetime                      pDU_Lifetime,
 MS_Radio_Access_Capability        mS_Radio_Access_Capability optional,
 Priority_BSSGP                    priority optional,
 DRX_Parameters                    dRX_Parameters optional,
 IMSI_BSSGP                        iMSI optional,
 TLLI_BSSGP                        tLLI_old optional,
 PFI                               pFI optional,
 LSA_Information_BSSGP             lSA_Information optional,
 Service_UTRAN_CCO                 service_UTRAN_CCO optional,
 Service_Class_Indicator           service_Class_Indicator optional,
 Subscriber_Profile_ID_For_RAT_Priority  subscriber_Profile_ID_For_RAT_Priority optional,
 Redirection_Indication            redirection_Indication optional,
 Redirection_Completed             redirection_Completed optional, 
 Unconfirmed_Send_State_Variable   unconfirmed_Send_State_Variable optional,
 SCI                               sCI optional,
 GGSN_PGW_Location                 gGSN_PGW_Location optional,
 EDRX_Parameters                   eDRX_Paremeters optional,
 Old_Routing_Area_Identification   old_Routing_Area_Identification optional,
 Attach_Indicator                  attach_Indicator optional,
 Alignment_octets                  alignment_octets optional,
 LLC_PDU                           lLC_PDU,
 LLC_PDU                           initialLLC_PDU optional
} with { variant "PRESENCE(bssgpPduType = '00'O)"; };

//10.2.2
type record PDU_BSSGP_UL_UNITDATA
{
 OCT1                              bssgpPduType,
 OCT4                              tLLI,
 QoS_Profile_V                     qoS_Profile,
 Cell_Identifier                   cell_Identifier,
 PFI                               pFI optional,
 LSA_Identifier_List_BSSGP         lSA_Identifier_List optional,
 Redirect_Attempt_Flag             redirect_Attempt_Flag optional,
 IMSI_BSSGP                        iMSI_BSSGP optional,
 Unconfirmed_Send_State_Variable   unconfirmed_Send_State_Variable optional,
 Selected_PLMN_ID                  selected_PLMN_ID optional,
 PLMN_Identity                     selected_Operator optional,
 PLMN_Identity                     cS_Registered_Operator optional, 
 Alignment_octets                  alignment_octets optional,
 LLC_PDU                           lLC_PDU
} with { variant "PRESENCE(bssgpPduType = '01'O)"; };

//10.2.3
type record PDU_BSSGP_RA_CAPABILITY
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,
 MS_Radio_Access_Capability        mS_Radio_Access_Capability
} with { variant "PRESENCE(bssgpPduType = '02'O)"; };

//10.2.5
type record PDU_BSSGP_DL_MBMS_UNITDATA
{
 OCT1                              bssgpPduType,
 PDU_Lifetime                      pDU_Lifetime,
 TMGI_BSSGP                        tMGI,
 MBMS_Session_Identity             mBMS_Session_Identity optional,
 Alignment_octets                  alignment_octets optional,
 LLC_PDU                           lLC_PDU
} with { variant "PRESENCE(bssgpPduType = '04'O)"; };


// 10.2.6; Deleted from spec 7.10.0,kept in prot module for backward compatibility
type record PDU_BSSGP_UL_MBMS_UNITDATA
{
 OCT1                              bssgpPduType,
 TMGI_BSSGP                        tMGI,
 MBMS_Session_Identity             mBMS_Session_Identity optional,
 Alignment_octets                  alignment_octets optional,
 LLC_PDU                           lLC_PDU
} with { variant "PRESENCE(bssgpPduType = '05'O)"; };

// 10.3.1
type record PDU_BSSGP_PAGING_PS 
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 DRX_Parameters                    dRX_Parameters optional,  
 Paging_Field4                     paging_Field4,
 PFI                               pFI optional,
 ABQP                              aBQP optional,
 QoS_Profile                       qoS_Profile,
 TMSI_BSSGP                        pTMSI optional,
 EDRX_Parameters                   eDRX_Paremeters optional
} with { variant "PRESENCE(bssgpPduType = '06'O)"; };

//10.3.2
type record PDU_BSSGP_PAGING_CS
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 DRX_Parameters                    dRX_Parameters,
 Paging_Field4                     paging_Field4,
 TLLI_BSSGP                        tLLI optional,
 Channel_needed                    channel_needed optional,
 EMLPP_Priority_BSSGP              eMLPP_Priority optional,
 TMSI_BSSGP                        tMSI optional,
 Global_CN_Id_BSSGP                global_CN_Id optional
} with { variant "PRESENCE(bssgpPduType = '07'O)"; };


type union Paging_Field4
{
 BVCI                              bVCI,                                      
 Location_Area                     location_Area,                   
 Routeing_Area                     routeing_Area,                   
 BSS_Area_Indication               bSS_Area_Indication                 
};

//10.3.3
type record PDU_BSSGP_RA_CAPABILITY_UPDATE
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,
 Tag                               tag
} with { variant "PRESENCE(bssgpPduType = '08'O)"; };


//10.3.4
type record PDU_BSSGP_RA_CAPABILITY_UPDATE_ACK
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,
 Tag                               tag,
 IMSI_BSSGP                        iMSI optional,
 RA_Cap_UPD_CAUSE                  rA_Cap_UPDATE_CAUSE,
 MS_Radio_Access_Capability        mS_Radio_Access_Capability optional     
} with { variant "PRESENCE(bssgpPduType = '09'O)"; };

//10.3.5
type record PDU_BSSGP_RADIO_STATUS
{
  OCT1                              bssgpPduType,
  TLLI_BSSGP                        tLLI optional,
  TMSI_BSSGP                        tMSI optional,
  IMSI_BSSGP                        iMSI optional,
  Radio_Cause                       radio_Cause
} with { variant "PRESENCE(bssgpPduType = '0A'O)"; };

//10.3.6
type record PDU_BSSGP_SUSPEND
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,        
 Routeing_Area                     routeing_Area  
} with { variant "PRESENCE(bssgpPduType = '0B'O)"; };

// 10.3.7
type record PDU_BSSGP_SUSPEND_ACK
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,        
 Routeing_Area                     routeing_Area ,
 Suspend_Reference_Number          suspend_Reference_Number
} with { variant "PRESENCE(bssgpPduType = '0C'O)"; };

// 10.3.8
type record PDU_BSSGP_SUSPEND_NACK
{
 OCT1                          bssgpPduType,
 TLLI_BSSGP                    tLLI,    
 Routeing_Area                 routeing_Area,
 Cause_BSSGP                   cause optional
} with { variant "PRESENCE(bssgpPduType = '0D'O)"; };

// 10.3.9
type record PDU_BSSGP_RESUME
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,        
 Routeing_Area                     routeing_Area,
 Suspend_Reference_Number          suspend_Reference_Number
} with { variant "PRESENCE(bssgpPduType = '0E'O)"; };

//10.3.10
type record PDU_BSSGP_RESUME_ACK
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,        
 Routeing_Area                     routeing_Area
} with { variant "PRESENCE(bssgpPduType = '0F'O)"; };

// 10.3.11
type record PDU_BSSGP_RESUME_NACK
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,        
 Routeing_Area                     routeing_Area,
 Cause_BSSGP                       cause optional
} with { variant "PRESENCE(bssgpPduType = '10'O)"; };

// 10.3.12
type record PDU_BSSGP_PAGING_PS_REJECT
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 TMSI_BSSGP                        pTMSI optional,
 Time_Until_Next_Paging_Occasion   time_Until_Next_Paging_Occasion
} with { variant "PRESENCE(bssgpPduType = '11'O)"; };

// 10.3.13
type record PDU_BSSGP_DUMMY_PAGING_PS
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 Routeing_Area                     routeing_Area  optional,
 EDRX_Parameters                   eDRX_Paremeters optional
} with { variant "PRESENCE(bssgpPduType = '12'O)"; };

// 10.3.14
type record PDU_BSSGP_DUMMY_PAGING_PS_RESPONSE
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 Time_Until_Next_Paging_Occasion   time_Until_Next_Paging_Occasion
} with { variant "PRESENCE(bssgpPduType = '13'O)"; };

// 10.3.15
type record PDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 PLMN_Identity                     pS_Registered_Operator optional
} with { variant "PRESENCE(bssgpPduType = '15'O)"; };

// 10.3.15
type record PDU_BSSGP_MS_REGISTRATION_ENQUIRY
{
 OCT1                              bssgpPduType,
 IMSI_BSSGP                        iMSI,
 MME_Query                         mME_Query optional
} with { variant "PRESENCE(bssgpPduType = '14'O)"; };

// 10.4.1
type record PDU_BSSGP_FLUSH_LL
{
  OCT1                              bssgpPduType,
  TLLI_BSSGP                        tLLI,        
  BVCI                              bVCI_old,
  BVCI                              bVCI_new optional,
  NSEI_BSSGP                        nSEI optional
} with { variant "PRESENCE(bssgpPduType = '2A'O)"; };

// 10.4.2 
type record PDU_BSSGP_FLUSH_LL_ACK
{
  OCT1                              bssgpPduType,
  TLLI_BSSGP                        tLLI,        
  Flush_Action                      flush_Action,
  BVCI                              bVCI_new optional,
  Number_of_octets_affected         number_of_octets_affected,
  NSEI_BSSGP                        nSEI optional
} with { variant "PRESENCE(bssgpPduType = '2B'O)"; };

// 10.4.3
type record PDU_BSSGP_LLC_DISCARDED
{
 OCT1                        bssgpPduType,
 TLLI_BSSGP                  tLLI,    
 LLC_Frames_Discarded        lLC_Frames_Discarded,
 BVCI                        bVCI,
 Number_of_octets_affected   number_of_octets_deleted,
 PFI                         pFI optional
} with { variant "PRESENCE(bssgpPduType = '2C'O)"; };

// 10.4.4
type record PDU_BSSGP_FLOW_CONTROL_BVC
{
 OCT1                       bssgpPduType,
 Tag                        tag,
 BVC_Bucket_Size            bVC_Bucket_Size,
 Bucket_Leak_Rate           bucket_Leak_Rate,
 Bmax_default_MS            bmax_default_MS,
 R_default_MS               r_default_MS,
 Bucket_Full_Ratio          bucket_Full_Ratio optional,  
 BVC_Measurement            bVC_Measurement optional,
 Flow_Control_Granularity   flow_Control_Granularity optional 
} with { variant "PRESENCE(bssgpPduType = '26'O)"; };

// 10.4.5
type record PDU_BSSGP_FLOW_CONTROL_BVC_ACK
{
 OCT1                        bssgpPduType,
 Tag                         tag
} with { variant "PRESENCE(bssgpPduType = '27'O)"; };

// 10.4.6
type record PDU_BSSGP_FLOW_CONTROL_MS
{
 OCT1                        bssgpPduType,
 TLLI_BSSGP                  tLLI,    
 Tag                         tag,
 MS_Bucket_Size              mS_Bucket_Size,
 Bucket_Leak_Rate            bucket_Leak_Rate,
 Bucket_Full_Ratio           bucket_Full_Ratio optional,
 Flow_Control_Granularity   flow_Control_Granularity optional 
} with { variant "PRESENCE(bssgpPduType = '28'O)"; };        

// 10.4.7
type record PDU_BSSGP_FLOW_CONTROL_MS_ACK
{
 OCT1                         bssgpPduType,
 TLLI_BSSGP                   tLLI,    
 Tag                          tag
} with { variant "PRESENCE(bssgpPduType = '29'O)"; };


// 10.4.8
type record PDU_BSSGP_BVC_BLOCK        
{
 OCT1                          bssgpPduType,
 BVCI                          bVCI,
 Cause_BSSGP                   cause 
} with { variant "PRESENCE(bssgpPduType = '20'O)"; };

// 10.4.9
type record PDU_BSSGP_BVC_BLOCK_ACK
{
 OCT1                         bssgpPduType,
 BVCI                         bVCI
} with { variant "PRESENCE(bssgpPduType = '21'O)"; };

// 10.4.10
type record PDU_BSSGP_BVC_UNBLOCK
{
 OCT1                         bssgpPduType,
 BVCI                         bVCI
} with { variant "PRESENCE(bssgpPduType = '24'O)"; };

// 10.4.11
type record PDU_BSSGP_BVC_UNBLOCK_ACK
{
 OCT1                         bssgpPduType,
 BVCI                         bVCI
} with { variant "PRESENCE(bssgpPduType = '25'O)"; };

// 10.4.12
type record PDU_BSSGP_BVC_RESET
{
 OCT1                              bssgpPduType,
 BVCI                              bVCI,
 Cause_BSSGP                       cause,
 Cell_Identifier                   cell_Identifier optional, 
 Feature_bitmap                    feature_bitmap optional,
 Extended_Feature_Bitmap           extended_Feature_Bitmap optional
} with { variant "PRESENCE(bssgpPduType = '22'O)"; };

// 10.4.13 
type record PDU_BSSGP_BVC_RESET_ACK
{
 OCT1                              bssgpPduType,
 BVCI                              bVCI,
 Cell_Identifier                   cell_Identifier optional,
 Feature_bitmap                    feature_bitmap optional,
 Extended_Feature_Bitmap           extended_Feature_Bitmap optional
} with { variant "PRESENCE(bssgpPduType = '23'O)"; };

// 10.4.14
type record PDU_BSSGP_STATUS
{
 OCT1                              bssgpPduType,
 Cause_BSSGP                       cause,
 BVCI                              bVCI optional,   
 PDU_in_Error                      pDU_in_Error optional 
} with { variant "PRESENCE(bssgpPduType = '41'O)"; };

// 10.4.15
type record PDU_BSSGP_SGSN_INVOKE_TRACE
{
  OCT1                              bssgpPduType,
  Trace_Type_BSSGP                  traceType,
  Trace_Reference_BSSGP             traceReference,
  Trigger_Id_BSSGP                  triggerId optional,
  Mobile_Id_BSSGP                   mobileId optional,
  OMC_Id_BSSGP                      omcId optional,
  TransactionId_BSSGP               transactionId optional
} with { variant "PRESENCE(bssgpPduType = '40'O)"; };

// 10.4.16
type record PDU_BSSGP_DOWNLOAD_BSS_PFC
{
 OCT1                              bssgpPduType,
 TLLI_BSSGP                        tLLI,
 PFI                               pFI         
} with { variant "PRESENCE(bssgpPduType = '50'O)"; };

// 10.4.17
type record PDU_BSSGP_CREATE_BSS_PFC
{
  OCT1                              		bssgpPduType,
  TLLI_BSSGP                       		 	tLLI,
  IMSI_BSSGP                        		iMSI optional,
  PFI                               		pFI,         
  GPRS_Timer                        		pFT,
  ABQP                              		aBQP,
  Service_UTRAN_CCO                 		service_UTRAN_CCO optional,
  MS_Radio_Access_Capability        		mS_Radio_Access_Capability optional,
  Priority_BSSGP                  	  		allocation_Retention_Priority optional, 
  GPRS_Timer                        		t10 optional,
  Inter_RAT_Handover_Info_BSSGP     		inter_RAT_Handover_Info optional,
  E_UTRAN_Inter_RAT_Handover_Info		  	e_UTRAN_Inter_RAT_Handover_Info optional,
  Subscriber_Profile_ID_For_RAT_Priority	subscriber_Profile_ID_For_RAT optional
  
  
} with { variant "PRESENCE(bssgpPduType = '51'O)"; };

// 10.4.18
type record PDU_BSSGP_CREATE_BSS_PFC_ACK
{
 OCT1                             bssgpPduType,
 TLLI_BSSGP                       tLLI,
 PFI                              pFI, 
 ABQP                             aBQP,
 Cause_BSSGP                      cause optional
} with { variant "PRESENCE(bssgpPduType = '52'O)"; };

// 10.4.19
type record PDU_BSSGP_CREATE_BSS_PFC_NACK
{
 OCT1                             bssgpPduType,
 TLLI_BSSGP                       tLLI,
 PFI                              pFI, 
 Cause_BSSGP                      cause
} with { variant "PRESENCE(bssgpPduType = '53'O)"; };

// 10.4.20        
type record PDU_BSSGP_MODIFY_BSS_PFC
{
 OCT1                         bssgpPduType,
 TLLI_BSSGP                   tLLI,
 PFI                          pFI, 
 ABQP                         aBQP
} with { variant "PRESENCE(bssgpPduType = '54'O)"; };
                
// 10.4.21
type record PDU_BSSGP_MODIFY_BSS_PFC_ACK
{
 OCT1                           bssgpPduType,
 TLLI_BSSGP                     tLLI,
 PFI                            pFI, 
 GPRS_Timer                     pFT,
 ABQP                           aBQP
} with { variant "PRESENCE(bssgpPduType = '55'O)"; };

// 10.4.22
type record PDU_BSSGP_DELETE_BSS_PFC
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  PFI                            pFI
} with { variant "PRESENCE(bssgpPduType = '56'O)"; };

// 10.4.23
type record PDU_BSSGP_DELETE_BSS_PFC_ACK
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  PFI                            pFI
} with { variant "PRESENCE(bssgpPduType = '57'O)"; };

// 10.4.24
type record PDU_BSSGP_FLOW_CONTROL_PFC        
{
 OCT1                         bssgpPduType,
 TLLI_BSSGP                   tLLI,
 Tag                          tag,
 MS_Bucket_Size               mS_Bucket_Size optional,
 Bucket_Leak_Rate             bucket_Leak_Rate optional,
 Bucket_Full_Ratio            bucket_Full_Ratio optional,
 PFC_flow_control_parameters  pFC_flow_control_parameters,
 Flow_Control_Granularity     flow_Control_Granularity optional

} with { variant "PRESENCE(bssgpPduType = '2D'O)"; };

// 10.4.25        
type record PDU_BSSGP_FLOW_CONTROL_PFC_ACK
{
 OCT1                           bssgpPduType,
 TLLI_BSSGP                     tLLI,
 Tag                            tag
} with { variant "PRESENCE(bssgpPduType = '2E'O)"; };

// 10.4.26        
type record PDU_BSSGP_DELETE_BSS_PFC_REQ
{
  OCT1                             bssgpPduType,
  TLLI_BSSGP                       tLLI,
  PFI                              pFI,
  Cause_BSSGP                      cause
} with { variant "PRESENCE(bssgpPduType = '58'O)"; };

// 10.4.27
type record PDU_BSSGP_PS_HANDOVER_REQUIRED
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  Cause_BSSGP                    cause,
  Cell_Identifier                source_Cell_Identifier,
  Cell_or_RNC_Id_with_Transparent_Container_BSSGP
                                 cell_or_RNC_Id_with_Transparent_Container,
  Active_PFCs_List_BSSGP         active_PFCs_List,
  ENB_Identifier				 target_ENB_Identifier optional,
  Reliable_Inter_RAT_Handover_Info
  								 reliable_Inter_RAT_Handover_Info optional,
  CSG_Identifier_TLV             cSG_Identifier optional,
  Tracking_Area_Code_TLV         tracking_Area_Code optional
  } with { variant "PRESENCE(bssgpPduType = '59'O)"; };


// 10.4.28
type record PDU_BSSGP_PS_HANDOVER_REQUIRED_ACK
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  List_of_set_up_PFCs_BSSGP      list_of_set_up_PFCs,
  Target_BSS_to_Source_BSS_Transparent_Container
                                 target_BSS_to_Source_BSS_Transparent_Container optional,
  Target_to_Source_Transparent_Container
                                 target_to_Source_Transparent_Container optional
} with { variant "PRESENCE(bssgpPduType = '5A'O)"; };


// 10.4.29
type record PDU_BSSGP_PS_HANDOVER_REQUIRED_NACK
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  Cause_BSSGP                    cause
} with { variant "PRESENCE(bssgpPduType = '5B'O)"; }; 


// 10.4.30
type record PDU_BSSGP_PS_HANDOVER_REQUEST
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  IMSI_BSSGP                     iMSI,
  Cause_BSSGP                    cause,
  Cell_Identifier                source_Cell_Identifier optional,
  RNC_Identifier_BSSGP           source_RNC_Identifier optional,
  Cell_Identifier                target_Cell_Identifier optional, // it is mandatory
  Source_BSS_to_Target_BSS_Transparent_Container_BSSGP
                                 source_BSS_to_Target_BSS_Transparent_Container_BSSGP,
  PFCs_to_be_set_up_list         pFCs_to_be_set_up_list,
  NAS_container_for_PS_Handover  nAS_container_for_PS_Handover optional,
  Service_UTRAN_CCO              service_UTRAN_CCO optional,
  Subscriber_Profile_ID_For_RAT_Priority
  								 subscriber_Profile_ID_For_RAT_Priority optional,
  Reliable_Inter_RAT_Handover_Info
  								 reliable_Inter_RAT_Handover_Info optional
}  with { variant "PRESENCE(bssgpPduType = '5C'O)"; };


// 10.4.31
type record PDU_BSSGP_PS_HANDOVER_REQUEST_ACK
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  List_of_set_up_PFCs_BSSGP      list_of_set_up_PFCs,
  Target_BSS_to_Source_BSS_Transparent_Container
                                 target_BSS_to_Source_BSS_Transparent_Container
} with { variant "PRESENCE(bssgpPduType = '5D'O)"; };


// 10.4.32
type record PDU_BSSGP_PS_HANDOVER_REQUEST_NACK
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  Cause_BSSGP                    cause
} with { variant "PRESENCE(bssgpPduType = '5E'O)"; };


// 10.4.33
type record PDU_BSSGP_PS_HANDOVER_COMPLETE
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  IMSI_BSSGP                     iMSI,
  Cell_Identifier                target_Cell_Identifier optional,
  Request_For_Inter_RAT_Handover_Info
  								 request_For_Inter_RAT_Handover_Info optional
} with { variant "PRESENCE(bssgpPduType = '91'O)"; };


// 10.4.34
type record PDU_BSSGP_PS_HANDOVER_CANCEL
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  Cause_BSSGP                    cause,
  Cell_Identifier                source_Cell_Identifier,
  Cell_Identifier                target_Cell_Identifier optional,
  RNC_Identifier_BSSGP           target_RNC_Identifier optional,
  ENB_Identifier				 target_Enb_Identifier optional
} with { variant "PRESENCE(bssgpPduType = '92'O)"; };

// 10.4.35
type record PDU_BSSGP_PS_HANDOVER_COMPLETE_ACK
{
  OCT1                            bssgpPduType,
  TLLI_BSSGP                      tLLI,
  Inter_RAT_Handover_Info_BSSGP   inter_RAT_Handover_Info_BSSGP,
  E_UTRAN_Inter_RAT_Handover_Info e_UTRAN_Inter_RAT_Handover_Info optional
} with { variant "PRESENCE(bssgpPduType = '93'O)";};

// 10.4.36
type record PDU_BSSGP_OVERLOAD
{
  OCT1                            bssgpPduType,
  Priority_Class_Indicator        priority_Class_Indicator
} with { variant "PRESENCE(bssgpPduType = '42'O)";};

// 10.5.1
type record PDU_BSSGP_PERFORM_LOCATION_REQUEST
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  IMSI_BSSGP                     iMSI,
  DRX_Parameters                 dRX_Parameters optional,
  BVCI                           bVCI,
  NSEI_BSSGP                     nSEI,
  Location_Type_BSSGP            location_Type,
  Cell_Identifier                cell_Identifier,
  LCS_Capability_BSSGP           lCS_Capability optional,
  LCS_Priority_BSSGP             lCS_Priority optional,
  LCS_QoS_BSSGP                  lCS_QoS optional,
  LCS_Client_Type_BSSGP          lCS_Client_Type optional,
  Requested_GPS_Assistance_Data_BSSGP  requested_GPS_Assistance_Data optional,
  IMEI_BSSGP                     iMEI optional,
  GANSS_Location_Type            gANSS_Location_Type optional,
  Requested_GANSS_Assistance_Data requested_GANSS_Assistance_Data optional,
  EDRX_Parameters                eDRX_Parameters optional
} with { variant "PRESENCE(bssgpPduType = '60'O)"; };


// 10.5.2
type record PDU_BSSGP_PERFORM_LOCATION_RESPONSE
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  BVCI                           bVCI,
  Location_Estimate_BSSGP        location_Estimate optional,
  Positioning_Data_BSSGP         positioning_Data optional,
  Deciphering_Keys_BSSGP         deciphering_Keys optional,
  LCS_Cause_BSSGP                lCS_Cause optional,
  VelocityData                  velocityData optional,
  GANSS_Positioning_Data         gANSS_Positioning_Data optional  
} with { variant "PRESENCE(bssgpPduType = '61'O)"; };


// 10.5.3
type record PDU_BSSGP_PERFORM_LOCATION_ABORT
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  BVCI                           bVCI,
  LCS_Cause_BSSGP                lCS_Cause
} with { variant "PRESENCE(bssgpPduType = '62'O)"; };


// 10.5.4
type record PDU_BSSGP_POSITION_COMMAND
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  BVCI                           bVCI,
  RRLP_Flags_BSSGP               rRLP_Flags,
  RRLP_APDU_BSSGP                rRLP_APDU
} with { variant "PRESENCE(bssgpPduType = '63'O)"; };


// 10.5.5
type record PDU_BSSGP_POSITION_RESPONSE
{
  OCT1                           bssgpPduType,
  TLLI_BSSGP                     tLLI,
  BVCI                           bVCI,
  RRLP_Flags_BSSGP               rRLP_Flags optional,
  RRLP_APDU_BSSGP                rRLP_APDU optional,
  LCS_Cause_BSSGP                lCS_Cause optional  
} with { variant "PRESENCE(bssgpPduType = '64'O)"; };

// 10.6.1  
type record PDU_BSSGP_RAN_INFORMATION_REQUEST
{
 OCT1                            bssgpPduType,
 RIM_Routing_Information         destination_Cell_Identifier,
 RIM_Routing_Information         source_Cell_Identifier,
 RAN_Information_Request_RIM_Container  rIM_Container
} with { variant "PRESENCE(bssgpPduType = '71'O)"; };
      
// 10.6.2
type record PDU_BSSGP_RAN_INFORMATION
{
 OCT1                              bssgpPduType,
 RIM_Routing_Information           destination_Cell_Identifier,
 RIM_Routing_Information           source_Cell_Identifier,
 RAN_Information_RIM_Container     rIM_Container
} with { variant "PRESENCE(bssgpPduType = '70'O)"; };

// 10.6.3
type record PDU_BSSGP_RAN_INFORMATION_ACK
{
 OCT1                              bssgpPduType,
 RIM_Routing_Information           destination_Cell_Identifier,
 RIM_Routing_Information           source_Cell_Identifier,
 RAN_Information_Ack_RIM_Container rIM_Container
} with { variant "PRESENCE(bssgpPduType = '72'O)"; };

// 10.6.4
type record PDU_BSSGP_RAN_INFORMATION_ERROR
{
 OCT1                              bssgpPduType,
 RIM_Routing_Information           destination_Cell_Identifier,
 RIM_Routing_Information           source_Cell_Identifier,
 RAN_Information_Error_RIM_Container  rIM_Container
} with { variant "PRESENCE(bssgpPduType = '73'O)"; };

// 10.6.5
type record PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR
{
 OCT1                              bssgpPduType,
 RIM_Routing_Information           destination_Cell_Identifier,
 RIM_Routing_Information           source_Cell_Identifier,
 RAN_Information_Application_Error_RIM_Container  rIM_Container
} with { variant "PRESENCE(bssgpPduType = '74'O)"; };

// 10.7.1
type record PDU_BSSGP_MBMS_SESSION_START_REQUEST
{
 OCT1                        bssgpPduType,
 TMGI_BSSGP                  tMGI,
 MBMS_Session_Identity       mBMS_Session_Identity optional,
 ABQP                        aBQP,
 MBMS_Service_Area_Identity_List   mBMS_Service_Area_Identity_List,
 MBMS_Routing_Area_List      mBMS_Routing_Area_List,
 MBMS_Session_Duration       mBMS_Session_Duration,
 MBMS_Session_Information    mBMS_Session_Information,
 Time_To_MBMS_Data_Transfer  time_To_MBMS_Data_Transfer,
 Priority_BSSGP              allocation_Retention_Priority optional,
 MBMS_Session_Repetition_Number  mBMS_Session_Repetition_Number optional
} with { variant "PRESENCE(bssgpPduType = '80'O)"; };

// 10.7.2
type record PDU_BSSGP_MBMS_SESSION_START_RESPONSE
{
 OCT1                        bssgpPduType,
 TMGI_BSSGP                  tMGI,
 MBMS_Session_Identity       mBMS_Session_Identity optional,
 MBMS_Response               mBMS_Response
} with { variant "PRESENCE(bssgpPduType = '81'O)"; };

// 10.7.3
type record PDU_BSSGP_MBMS_SESSION_STOP_REQUEST
{
 OCT1                       bssgpPduType,
 TMGI_BSSGP                 tMGI,
 MBMS_Session_Identity      mBMS_Session_Identity optional,
 MBMS_Stop_Cause            mBMS_Stop_Cause
} with { variant "PRESENCE(bssgpPduType = '82'O)"; };

// 10.7.4
type record PDU_BSSGP_MBMS_STOP_RESPONSE
{
 OCT1                              bssgpPduType,
 TMGI_BSSGP                        tMGI,
 MBMS_Session_Identity             mBMS_Session_Identity optional,
 MBMS_Response                     mBMS_Response
} with { variant "PRESENCE(bssgpPduType = '83'O)"; };


// 10.7.5
type record PDU_BSSGP_SESSION_UPDATE_REQUEST
{
 OCT1                            bssgpPduType,
 TMGI_BSSGP                      tMGI,
 MBMS_Session_Identity           mBMS_Session_Identity optional,
 ABQP                            aBQP,
 MBMS_Service_Area_Identity_List mBMS_Service_Area_Identity_List,
 MBMS_Routing_Area_List          mBMS_Routing_Area_List,
 MBMS_Session_Duration           mBMS_Session_Duration,
 MBMS_Session_Information        mBMS_Session_Information,
 Time_To_MBMS_Data_Transfer      time_To_MBMS_Data_Transfer, 
 Priority_BSSGP                  allocation_Retention_Priority optional,
 MBMS_Session_Repetition_Number  mBMS_Session_Repetition_Number optional  
} with { variant "PRESENCE(bssgpPduType = '84'O)"; };


// 10.7.6
type record PDU_BSSGP_SESSION_UPDATE_RESPONSE
{
 OCT1                            bssgpPduType,
 TMGI_BSSGP                      tMGI,
 MBMS_Session_Identity           mBMS_Session_Identity optional, 
 MBMS_Response                   mBMS_Response 
} with { variant "PRESENCE(bssgpPduType = '85'O)"; };



type union PDU_BSSGP
{

  PDU_BSSGP_DL_UNITDATA                   pDU_BSSGP_DL_UNITDATA,
  PDU_BSSGP_UL_UNITDATA                   pDU_BSSGP_UL_UNITDATA,
  PDU_BSSGP_RA_CAPABILITY                 pDU_BSSGP_RA_CAPABILITY,
  PDU_BSSGP_DL_MBMS_UNITDATA              pDU_BSSGP_DL_MBMS_UNITDATA,
  PDU_BSSGP_UL_MBMS_UNITDATA              pDU_BSSGP_UL_MBMS_UNITDATA,
  PDU_BSSGP_PAGING_PS                     pDU_BSSGP_PAGING_PS,
  PDU_BSSGP_PAGING_CS                     pDU_BSSGP_PAGING_CS,
  PDU_BSSGP_RA_CAPABILITY_UPDATE          pDU_BSSGP_RA_CAPABILITY_UPDATE,
  PDU_BSSGP_RA_CAPABILITY_UPDATE_ACK      pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK,
  PDU_BSSGP_RADIO_STATUS                  pDU_BSSGP_RADIO_STATUS,
  PDU_BSSGP_SUSPEND                       pDU_BSSGP_SUSPEND,
  PDU_BSSGP_SUSPEND_ACK                   pDU_BSSGP_SUSPEND_ACK,
  PDU_BSSGP_SUSPEND_NACK                  pDU_BSSGP_SUSPEND_NACK,
  PDU_BSSGP_RESUME                        pDU_BSSGP_RESUME,
  PDU_BSSGP_RESUME_ACK                    pDU_BSSGP_RESUME_ACK,
  PDU_BSSGP_RESUME_NACK                   pDU_BSSGP_RESUME_NACK,
  PDU_BSSGP_PAGING_PS_REJECT              pDU_BSSGP_PAGING_PS_REJECT,
  PDU_BSSGP_DUMMY_PAGING_PS               pDU_BSSGP_DUMMY_PAGING_PS,
  PDU_BSSGP_DUMMY_PAGING_PS_RESPONSE      pDU_BSSGP_DUMMY_PAGING_PS_RESPONSE,
  PDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE pDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE,
  PDU_BSSGP_MS_REGISTRATION_ENQUIRY       pDU_BSSGP_MS_REGISTRATION_ENQUIRY,
  PDU_BSSGP_FLUSH_LL                      pDU_BSSGP_FLUSH_LL,
  PDU_BSSGP_FLUSH_LL_ACK                  pDU_BSSGP_FLUSH_LL_ACK,
  PDU_BSSGP_LLC_DISCARDED                 pDU_BSSGP_LLC_DISCARDED,
  PDU_BSSGP_FLOW_CONTROL_BVC              pDU_BSSGP_FLOW_CONTROL_BVC,
  PDU_BSSGP_FLOW_CONTROL_BVC_ACK          pDU_BSSGP_FLOW_CONTROL_BVC_ACK,
  PDU_BSSGP_FLOW_CONTROL_MS               pDU_BSSGP_FLOW_CONTROL_MS,
  PDU_BSSGP_FLOW_CONTROL_MS_ACK           pDU_BSSGP_FLOW_CONTROL_MS_ACK,
  PDU_BSSGP_FLOW_CONTROL_PFC              pDU_BSSGP_FLOW_CONTROL_PFC,
  PDU_BSSGP_FLOW_CONTROL_PFC_ACK          pDU_BSSGP_FLOW_CONTROL_PFC_ACK,
  PDU_BSSGP_STATUS                        pDU_BSSGP_STATUS,
  PDU_BSSGP_BVC_BLOCK                     pDU_BSSGP_BVC_BLOCK,
  PDU_BSSGP_BVC_BLOCK_ACK                 pDU_BSSGP_BVC_BLOCK_ACK,
  PDU_BSSGP_BVC_UNBLOCK                   pDU_BSSGP_BVC_UNBLOCK,
  PDU_BSSGP_BVC_UNBLOCK_ACK               pDU_BSSGP_BVC_UNBLOCK_ACK,
  PDU_BSSGP_BVC_RESET                     pDU_BSSGP_BVC_RESET,
  PDU_BSSGP_BVC_RESET_ACK                 pDU_BSSGP_BVC_RESET_ACK,
  PDU_BSSGP_SGSN_INVOKE_TRACE             pDU_BSSGP_SGSN_INVOKE_TRACE,
  PDU_BSSGP_DOWNLOAD_BSS_PFC              pDU_BSSGP_DOWNLOAD_BSS_PFC,
  PDU_BSSGP_CREATE_BSS_PFC                pDU_BSSGP_CREATE_BSS_PFC,
  PDU_BSSGP_CREATE_BSS_PFC_ACK            pDU_BSSGP_CREATE_BSS_PFC_ACK,
  PDU_BSSGP_CREATE_BSS_PFC_NACK           pDU_BSSGP_CREATE_BSS_PFC_NACK,
  PDU_BSSGP_MODIFY_BSS_PFC                pDU_BSSGP_MODIFY_BSS_PFC,
  PDU_BSSGP_MODIFY_BSS_PFC_ACK            pDU_BSSGP_MODIFY_BSS_PFC_ACK,
  PDU_BSSGP_DELETE_BSS_PFC                pDU_BSSGP_DELETE_BSS_PFC,
  PDU_BSSGP_DELETE_BSS_PFC_ACK            pDU_BSSGP_DELETE_BSS_PFC_ACK,
  PDU_BSSGP_DELETE_BSS_PFC_REQ            pDU_BSSGP_DELETE_BSS_PFC_REQ,
  PDU_BSSGP_PS_HANDOVER_REQUIRED          pDU_BSSGP_PS_HANDOVER_REQUIRED,
  PDU_BSSGP_PS_HANDOVER_REQUIRED_ACK      pDU_BSSGP_PS_HANDOVER_REQUIRED_ACK,
  PDU_BSSGP_PS_HANDOVER_REQUIRED_NACK     pDU_BSSGP_PS_HANDOVER_REQUIRED_NACK,
  PDU_BSSGP_PS_HANDOVER_REQUEST           pDU_BSSGP_PS_HANDOVER_REQUEST,
  PDU_BSSGP_PS_HANDOVER_REQUEST_ACK       pDU_BSSGP_PS_HANDOVER_REQUEST_ACK, 
  PDU_BSSGP_PS_HANDOVER_REQUEST_NACK      pDU_BSSGP_PS_HANDOVER_REQUEST_NACK,
  PDU_BSSGP_PS_HANDOVER_COMPLETE          pDU_BSSGP_PS_HANDOVER_COMPLETE,
  PDU_BSSGP_PS_HANDOVER_COMPLETE_ACK      pDU_BSSGP_PS_HANDOVER_COMPLETE_ACK,
  PDU_BSSGP_PS_HANDOVER_CANCEL            pDU_BSSGP_PS_HANDOVER_CANCEL,
  PDU_BSSGP_OVERLOAD                      pDU_BSSGP_OVERLOAD,
  PDU_BSSGP_PERFORM_LOCATION_REQUEST      pDU_BSSGP_PERFORM_LOCATION_REQUEST,
  PDU_BSSGP_PERFORM_LOCATION_RESPONSE     pDU_BSSGP_PERFORM_LOCATION_RESPONSE,
  PDU_BSSGP_PERFORM_LOCATION_ABORT        pDU_BSSGP_PERFORM_LOCATION_ABORT,
  PDU_BSSGP_POSITION_COMMAND              pDU_BSSGP_POSITION_COMMAND,
  PDU_BSSGP_POSITION_RESPONSE             pDU_BSSGP_POSITION_RESPONSE,
  PDU_BSSGP_RAN_INFORMATION               pDU_BSSGP_RAN_INFORMATION,
  PDU_BSSGP_RAN_INFORMATION_REQUEST       pDU_BSSGP_RAN_INFORMATION_REQUEST,
  PDU_BSSGP_RAN_INFORMATION_ACK           pDU_BSSGP_RAN_INFORMATION_ACK,
  PDU_BSSGP_RAN_INFORMATION_ERROR         pDU_BSSGP_RAN_INFORMATION_ERROR,
  PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR  
                                    pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR,
  PDU_BSSGP_MBMS_SESSION_START_REQUEST    pDU_BSSGP_MBMS_SESSION_START_REQUEST,
  PDU_BSSGP_MBMS_SESSION_START_RESPONSE   pDU_BSSGP_MBMS_SESSION_START_RESPONSE,
  PDU_BSSGP_MBMS_SESSION_STOP_REQUEST     pDU_BSSGP_MBMS_SESSION_STOP_REQUEST,
  PDU_BSSGP_MBMS_STOP_RESPONSE            pDU_BSSGP_MBMS_STOP_RESPONSE,
  PDU_BSSGP_SESSION_UPDATE_REQUEST        pDU_BSSGP_SESSION_UPDATE_REQUEST,
  PDU_BSSGP_SESSION_UPDATE_RESPONSE       pDU_BSSGP_SESSION_UPDATE_RESPONSE,
  octetstring                             pDU_BSSGP_unknown
} with { variant "" };

}  with {encode "RAW"} // end of module
