/* packet-gsm_rlcmac.h
 * Definitions for GSM RLC MAC control plane message dissection in wireshark.
 * TS 44.060 and 24.008
 * By Vincent Helfre, based on original code by Jari Sassi
 * with the gracious authorization of STE
 * Copyright (c) 2011 ST-Ericsson
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef __PACKET_GSM_RLCMAC_H__
#define __PACKET_GSM_RLCMAC_H__

#ifndef PRE_PACKED
#define PRE_PACKED
#endif

#ifndef POST_PACKED
#define POST_PACKED
#endif

#define GSM_RLC_MAC_MAGIC_NUMBER  0x67707273

typedef uint8_t TFI_t;

typedef uint8_t N32_t;
typedef uint8_t N51_t;
typedef uint8_t N26_t;

/*  Starting Time IE as specified in 04.08 */
typedef struct
{
  N32_t N32;  /* 04.08 refers to T1' := (FN div 1326) mod 32 */
  N51_t N51;  /* 04.08 refers to T3 := FN mod 51 */
  N26_t N26;  /* 04.08 refers to T2 := FN mod 26 */
} StartingTime_t;

typedef struct
{
  uint8_t UnionType;/* UnionType is index */
  union
  {
    uint8_t UPLINK_TFI;
    uint8_t DOWNLINK_TFI;
  } u;
} Global_TFI_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    StartingTime_t StartingTime;
    uint16_t k;
  } u;
} Starting_Frame_Number_t;

typedef struct
{
  uint8_t FINAL_ACK_INDICATION;
  uint8_t STARTING_SEQUENCE_NUMBER;
  uint8_t RECEIVED_BLOCK_BITMAP[64/8];
} Ack_Nack_Description_t;


typedef struct
{
  uint8_t Exist_TIMING_ADVANCE_VALUE;
  uint8_t TIMING_ADVANCE_VALUE;

  uint8_t Exist_IndexAndtimeSlot;
  uint8_t TIMING_ADVANCE_INDEX;
  uint8_t TIMING_ADVANCE_TIMESLOT_NUMBER;
} Packet_Timing_Advance_t;

typedef struct
{
  uint8_t ALPHA;

  struct
  {
    uint8_t Exist;
    uint8_t GAMMA_TN;
  } Slot[8];
} Power_Control_Parameters_t;

typedef struct
{
  uint8_t ALPHA;
  uint8_t T_AVG_W;
  uint8_t T_AVG_T;
  uint8_t Pb;
  uint8_t PC_MEAS_CHAN;
  uint8_t INT_MEAS_CHANNEL_LIST_AVAIL;
  uint8_t N_AVG_I;
} Global_Power_Control_Parameters_t;

typedef struct
{
  uint8_t Exist_TIMING_ADVANCE_VALUE;
  uint8_t TIMING_ADVANCE_VALUE;

  uint8_t Exist_UPLINK_TIMING_ADVANCE;
  uint8_t UPLINK_TIMING_ADVANCE_INDEX;
  uint8_t UPLINK_TIMING_ADVANCE_TIMESLOT_NUMBER;

  uint8_t Exist_DOWNLINK_TIMING_ADVANCE;
  uint8_t DOWNLINK_TIMING_ADVANCE_INDEX;
  uint8_t DOWNLINK_TIMING_ADVANCE_TIMESLOT_NUMBER;
} Global_Packet_Timing_Advance_t;


typedef struct
{
  uint8_t C_VALUE;
  uint8_t RXQUAL;
  uint8_t SIGN_VAR;

  struct
  {
    uint8_t Exist;
    uint8_t I_LEVEL_TN;
  } Slot[8];
} Channel_Quality_Report_t;

typedef enum
{
  RLC_MODE_ACKNOWLEDGED = 0,
  RLC_MODE_UNACKNOWLEDGED = 1
} RLC_MODE_t;

typedef struct
{
  uint8_t PEAK_THROUGHPUT_CLASS;
  uint8_t RADIO_PRIORITY;
  RLC_MODE_t RLC_MODE;
  uint8_t LLC_PDU_TYPE;
  uint16_t RLC_OCTET_COUNT;
} Channel_Request_Description_t;

typedef struct
{
  uint16_t RANDOM_ACCESS_INFORMATION;
  uint8_t FRAME_NUMBER[2];
} Packet_Request_Reference_t;

typedef PRE_PACKED struct
{
  uint8_t nsapi;
  uint8_t value;
} Receive_N_PDU_Number_t POST_PACKED;

typedef PRE_PACKED struct
{
  uint8_t IEI;
  uint8_t Length;

  uint8_t Count_Receive_N_PDU_Number;
  Receive_N_PDU_Number_t Receive_N_PDU_Number[11];
} Receive_N_PDU_Number_list_t POST_PACKED;

/** IMSI length */
#define IMSI_LEN  9

/** TMSI length */
#define TMSI_LEN  4

typedef  struct
{
  uint8_t MCC1;
  uint8_t MCC2;
  uint8_t MCC3;
  uint8_t MNC3;
  uint8_t MNC1;
  uint8_t MNC2;
} PLMN_t;


/** This type is used to describe LAI codes */
typedef PRE_PACKED struct
{
  PLMN_t  PLMN;
  uint16_t LAC;
} LAI_t POST_PACKED;


/** Length of LAI */
#define LAI_LEN  (sizeof(LAI_t))

typedef struct
{
  uint8_t      TMSI[TMSI_LEN];
} TMSI_t;

typedef uint16_t CellId_t;


#define CKSN_NOT_VALID                7

#define IMEI_LEN                      9

#define IMEISV_LEN                    10

#define MAX_ELEMENTS_IN_EQPLMN_LIST   16


typedef struct
{
  uint8_t NUMBER_CELLS;
  uint8_t CCN_SUPPORTED[16];  /* bit (1), max size: 16 x 8 => 128 bits */
} CCN_Support_Description_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    uint8_t LSA_ID;
    uint8_t ShortLSA_ID;
  } u;
} LSA_ID_Info_Element_t;

#define LSA_ID_INFO_ELEMENTS_MAX (16)

typedef struct
{
  uint8_t Count_LSA_ID_Info_Element;
  LSA_ID_Info_Element_t LSA_ID_Info_Elements[LSA_ID_INFO_ELEMENTS_MAX];
} LSA_ID_Info_t;

#define NR_OF_FREQ_OR_CELLS_MAX (32)

typedef struct
{
  uint8_t NR_OF_FREQ_OR_CELLS;
  LSA_ID_Info_t LSA_ID_Info[NR_OF_FREQ_OR_CELLS_MAX];
} LSA_Parameters_t;

#define MAX_REPORT_PRIORITY_CELLS (16)

typedef struct
{
  uint8_t NUMBER_CELLS;
  uint8_t REPORT_PRIORITY[MAX_REPORT_PRIORITY_CELLS];
} ReportPriority_t;

typedef ReportPriority_t GPRSReportPriority_t;

typedef struct
{
  uint8_t REPORTING_OFFSET;
  uint8_t REPORTING_THRESHOLD;
} OffsetThreshold_t;


typedef struct
{
  uint8_t            Exist_MULTI_BAND_REPORTING;
  uint8_t            MULTI_BAND_REPORTING;

  uint8_t            Exist_SERVING_BAND_REPORTING;
  uint8_t            SERVING_BAND_REPORTING;

  /* Warning:
   *
   * SI2quater, MI, PMO, and PCCO always specify Scale Ord.  There is no
   * "exist SCALE_ORD" bit in the CSN.1 descriptions for these messages.
   * However, this struct is shared with the PSI5 message which may or may
   * not specify SCALE_ORD, thus necessitating the inclusion of member
   * Exist_SCALE_ORD in the struct.  This member is never set for SI2quater, MI,
   * PMO, and PCCO so to check it (in these cases) would be erroneous.
   */
  uint8_t            Exist_SCALE_ORD;
  uint8_t            SCALE_ORD;

  uint8_t            Exist_OffsetThreshold900;
  OffsetThreshold_t OffsetThreshold900;

  uint8_t            Exist_OffsetThreshold1800;
  OffsetThreshold_t OffsetThreshold1800;

  uint8_t            Exist_OffsetThreshold400;
  OffsetThreshold_t OffsetThreshold400;

  uint8_t            Exist_OffsetThreshold1900;
  OffsetThreshold_t OffsetThreshold1900;

  uint8_t            Exist_OffsetThreshold850;
  OffsetThreshold_t OffsetThreshold850;

} MeasurementParams_t;

typedef struct
{
  uint8_t Exist_FDD_REPORTING_THRESHOLD_2;
  uint8_t FDD_REPORTING_THRESHOLD_2;
} GPRS_AdditionalMeasurementParams3G_t;


typedef struct
{
  uint8_t NETWORK_CONTROL_ORDER;

  uint8_t Exist_NC;
  uint8_t NC_NON_DRX_PERIOD;
  uint8_t NC_REPORTING_PERIOD_I;
  uint8_t NC_REPORTING_PERIOD_T;
} NC_Measurement_Parameters_t;


/*
**========================================================================
**  Global types
**========================================================================
*/

struct MobileId     /* Mobile id, -> TMSI, IMEI or IMSI */
{
  uint8_t Length;
  uint8_t IdType;
  uint8_t OddEven;
  uint8_t Dig1;
  union
  {
    unsigned char TMSI[TMSI_LEN];
    unsigned char IMEI[IMEI_LEN - 2];
    unsigned char IMSI[IMEI_LEN - 2];
    unsigned char IMEISV[IMEISV_LEN - 2];
  } Id;
};

#if 0
struct OV_MobileId    /* Struct for optional mobile identity */
{
  unsigned char   IEI;
  struct MobileId MV;
};

#define LAC_INVALID 0xFEFF

typedef enum
{
  LAI_PRIORITY_AVAILABLE,
  LAI_PRIORITY_FORBIDDEN,
  LAI_PRIORITY_FORCED
} LAI_Priority_t;

typedef enum
{
  NOM_I,
  NOM_II,
  NOM_III,
  NOM_GSM,
  NOM_PS_ONLY,
  NOM_UNKNOWN
} NMO_t;

typedef enum
{
  COMBINED,
  NOT_COMBINED,
  SAME_AS_BEFORE
} ProcedureMode_t;

typedef struct
{
  uint8_t              Cause;
  LAI_t               LAI;
  struct OV_MobileId  MobileId;
} CombinedResult_t;

typedef enum
{
  R97,
  R99
} MSCR_t, SGSNR_t;

typedef struct
{
  uint8_t   NbrOfElements;
  PLMN_t   Element[MAX_ELEMENTS_IN_EQPLMN_LIST];
} EqPLMN_List_t;
#endif

#define MAX_PCCCH                       16
#define MAX_RFL_LENGTH                  16 /* length of RFL in PSI2 */
#define MAX_RFLS                         4 /* Max number of RFLs */
#define MAX_MA_LISTS_IN_PSI2             8 /* MAX MA lists = 8 */
#define MAX_ALLOCATION_BITMAP_LENGTH   128 /* max length of Fixed Allocation bitmap in BITS (2^7) */
#define MAX_VAR_LENGTH_BITMAP_LENGTH   176 /* max length ever possible for variable length fixed allocation bitmap */


typedef struct
{
  uint8_t MA_LENGTH;/* =(MA_BitLength +7) MA_BitLength_ converted to bytes */
  uint8_t MA_BITMAP[(63+1)/8];/* : bit (val (MA_LENGTH) + 1) > */
  /* The above should not change order! */
  uint8_t MA_BitLength;
} MobileAllocation_t;

typedef struct
{
  uint8_t ElementsOf_ARFCN_INDEX;
  uint8_t ARFCN_INDEX[16];
} ARFCN_index_list_t;

typedef struct
{
  uint8_t HSN;

  uint8_t ElementsOf_RFL_NUMBER;
  uint8_t RFL_NUMBER[4];

  uint8_t UnionType;
  union
  {
    MobileAllocation_t MA;
    ARFCN_index_list_t ARFCN_index_list;
  } u;
} GPRS_Mobile_Allocation_t;

/* < EGPRS Ack/Nack Description >
 * CRBB - Compressed Received Blocks Bitmap
 * URBB - Uncompressed Received Blocks Bitmap
 */
#define EGPRS_ACK_NACK_MAX_BITS 0x0FF /* 255 bits/32 bytes */
#define CRBB_MAX_BITS           0x07F /* 127 bits/16 bytes */
#define URBB_MAX_BITS           0x150 /* 336 bits/42 bytes */

typedef struct
{
  uint8_t  FINAL_ACK_INDICATION;
  uint8_t  BEGINNING_OF_WINDOW;
  uint8_t  END_OF_WINDOW;
  uint16_t STARTING_SEQUENCE_NUMBER;

  bool Exist_CRBB;
  uint8_t  CRBB_LENGTH;
  uint8_t  CRBB_STARTING_COLOR_CODE;
  uint8_t  CRBB[CRBB_MAX_BITS/8 + 1];

  uint16_t URBB_LENGTH;
  uint8_t  URBB[URBB_MAX_BITS/8];
} EGPRS_AckNack_Desc_t;

typedef struct
{
  uint8_t  UnionType;
  EGPRS_AckNack_Desc_t Desc;
} EGPRS_AckNack_t;

typedef struct
{
  uint8_t  LENGTH;
  EGPRS_AckNack_Desc_t Desc;
} EGPRS_AckNack_w_len_t;


/* <P1 Rest Octets>
 * <P2 Rest Octets>
 */
#if 0
#define  SF_VBS  0   /* VBS (broadcast call reference) */
#define  SF_VGCS  1  /* VGCS (group call reference) */

#define  AF_AckIsNotRequired  0  /* acknowledgement is not required */
#define  AF_AckIsRequired     1  /* acknowledgement is required */
#endif

typedef struct
{
  uint32_t value;
  uint8_t SF;
  uint8_t AF;
  uint8_t call_priority;
  uint8_t Ciphering_information;
} Group_Call_Reference_t;

/* Mobile allocation is coded differently but uses the same type! */
typedef struct
{
  uint8_t Length;
  uint8_t MA[8];
} MobileAllocationIE_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    MobileAllocationIE_t MA;
    uint8_t Frequency_Short_List[64/8];
  } u;
} MobileAllocation_or_Frequency_Short_List_t;

typedef struct
{
  uint8_t spare;
  uint16_t ARFCN;
} SingleRFChannel_t;

typedef struct
{
  uint8_t MAIO;
  uint8_t HSN;
} RFHoppingChannel_t;

typedef struct
{
  uint8_t Channel_type_and_TDMA_offset;
  uint8_t TN;
  uint8_t TSC;

  uint8_t UnionType;
  union
  {
    SingleRFChannel_t SingleRFChannel;
    RFHoppingChannel_t RFHoppingChannel;
  } u;
} Channel_Description_t;

typedef struct
{
  Channel_Description_t Channel_Description;

  uint8_t Exist_Hopping;
  MobileAllocation_or_Frequency_Short_List_t MA_or_Frequency_Short_List;

} Group_Channel_Description_t;

typedef struct
{
  Group_Call_Reference_t Group_Call_Reference;

  uint8_t Exist_Group_Channel_Description;
  Group_Channel_Description_t Group_Channel_Description;
} Group_Call_information_t;

typedef struct
{
  uint8_t Exist_NLN_PCH_and_NLN_status;
  uint8_t NLN_PCH;
  uint8_t NLN_status;

  uint8_t Exist_Priority1;
  uint8_t Priority1;

  uint8_t Exist_Priority2;
  uint8_t Priority2;

  uint8_t Exist_Group_Call_information;
  Group_Call_information_t Group_Call_information;

  uint8_t Packet_Page_Indication_1;
  uint8_t Packet_Page_Indication_2;
} P1_Rest_Octets_t;

typedef struct
{
  uint8_t Exist_CN3;
  uint8_t CN3;

  uint8_t Exist_NLN_and_status;
  uint8_t NLN;
  uint8_t NLN_status;

  uint8_t Exist_Priority1;
  uint8_t Priority1;

  uint8_t Exist_Priority2;
  uint8_t Priority2;

  uint8_t Exist_Priority3;
  uint8_t Priority3;

  uint8_t Packet_Page_Indication_3;
} P2_Rest_Octets_t;

/* <IA Rest Octets> incl additions for R99 and EGPRS */

typedef struct
{
  uint8_t USF;
  uint8_t USF_GRANULARITY;

  uint8_t Exist_P0_PR_MODE;
  uint8_t P0;
  uint8_t PR_MODE;
} DynamicAllocation_t;

typedef struct
{
  bool Exist_ALPHA;
  uint8_t  ALPHA;

  uint8_t  GAMMA;
  StartingTime_t TBF_STARTING_TIME;
  uint8_t  NR_OF_RADIO_BLOCKS_ALLOCATED;

  bool Exist_P0_BTS_PWR_CTRL_PR_MODE;
  uint8_t  P0;
  uint8_t  BTS_PWR_CTRL_MODE;
  uint8_t  PR_MODE;
} EGPRS_TwoPhaseAccess_t;

typedef struct
{
  uint8_t TFI_ASSIGNMENT;
  uint8_t POLLING;

  uint8_t UnionType;
  union
  {
    DynamicAllocation_t DynamicAllocation;
    uint8_t              FixedAllocationDummy;   /* Fixed Allocation was removed */
  } Allocation;

  uint8_t  EGPRS_CHANNEL_CODING_COMMAND;
  uint8_t  TLLI_BLOCK_CHANNEL_CODING;

  bool Exist_BEP_PERIOD2;
  uint8_t  BEP_PERIOD2;

  uint8_t  RESEGMENT;
  uint8_t  EGPRS_WindowSize;

  bool Exist_ALPHA;
  uint8_t  ALPHA;

  uint8_t  GAMMA;

  bool Exist_TIMING_ADVANCE_INDEX;
  uint8_t  TIMING_ADVANCE_INDEX;

  bool                Exist_TBF_STARTING_TIME;
  StartingTime_t TBF_STARTING_TIME;
} EGPRS_OnePhaseAccess_t;

#define MAX_ACCESS_TECHOLOGY_TYPES 12

typedef struct
{
  uint8_t ExtendedRA;

  uint8_t NrOfAccessTechnologies;
  uint8_t AccessTechnologyType[MAX_ACCESS_TECHOLOGY_TYPES];

  uint8_t UnionType;
  union
  {
    EGPRS_TwoPhaseAccess_t TwoPhaseAccess; /* 04.18/10.5.2.16 Multiblock allocation */
    EGPRS_OnePhaseAccess_t OnePhaseAccess; /* 04.60/10.5.2.16 TFI using Dynamic or Fixed Allocation */
  } Access;
} IA_EGPRS_00_t;

typedef struct
{
  uint8_t          UnionType;
  union
  {
    IA_EGPRS_00_t IA_EGPRS_PUA; /* 00 < EGPRS Packet Uplink Assignment >*/
    uint8_t        IA_EGPRS_01;  /* 01 reserved for future use */
    uint8_t        IA_EGPRS_1;   /* 1  reserved for future use */
  } u;
} IA_EGPRS_t;

typedef struct
{
  uint8_t Length;
  uint8_t MAIO;
  uint8_t MobileAllocation[62];
} IA_FreqParamsBeforeTime_t;

typedef struct
{
  bool Exist_ALPHA;
  uint8_t  ALPHA;

  uint8_t  GAMMA;
  uint8_t  R97_CompatibilityBits;
  StartingTime_t TBF_STARTING_TIME;

  bool Exist_P0_BTS_PWR_CTRL_PR_MODE;
  uint8_t  P0;
  uint8_t  BTS_PWR_CTRL_MODE;
  uint8_t  PR_MODE;
} GPRS_SingleBlockAllocation_t;

typedef struct
{
  uint8_t TFI_ASSIGNMENT;
  uint8_t POLLING;

  uint8_t UnionType;
  union
  {
    DynamicAllocation_t DynamicAllocation;
    uint8_t              FixedAllocationDummy;
  } Allocation;

  uint8_t             CHANNEL_CODING_COMMAND;
  uint8_t             TLLI_BLOCK_CHANNEL_CODING;

  uint8_t             Exist_ALPHA;
  uint8_t             ALPHA;

  uint8_t             GAMMA;

  uint8_t             Exist_TIMING_ADVANCE_INDEX;
  uint8_t             TIMING_ADVANCE_INDEX;

  uint8_t             Exist_TBF_STARTING_TIME;
  StartingTime_t TBF_STARTING_TIME;
} GPRS_DynamicOrFixedAllocation_t;

typedef struct
{
  bool Exist_ExtendedRA;
  uint8_t  ExtendedRA;
} PU_IA_AdditionsR99_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    GPRS_SingleBlockAllocation_t    SingleBlockAllocation;
    GPRS_DynamicOrFixedAllocation_t DynamicOrFixedAllocation;
  } Access;

  bool                   Exist_AdditionsR99;
  PU_IA_AdditionsR99_t  AdditionsR99;
} Packet_Uplink_ImmAssignment_t;

typedef struct
{
  uint8_t  EGPRS_WindowSize;
  uint8_t  LINK_QUALITY_MEASUREMENT_MODE;

  bool Exist_BEP_PERIOD2;
  uint8_t  BEP_PERIOD2;
} PD_IA_AdditionsR99_t;

typedef struct
{
  uint32_t              TLLI;

  uint8_t               Exist_TFI_to_TA_VALID;
  uint8_t               TFI_ASSIGNMENT;
  uint8_t               RLC_MODE;
  uint8_t               Exist_ALPHA;
  uint8_t               ALPHA;
  uint8_t               GAMMA;
  uint8_t               POLLING;
  uint8_t               TA_VALID;

  uint8_t               Exist_TIMING_ADVANCE_INDEX;
  uint8_t               TIMING_ADVANCE_INDEX;

  uint8_t               Exist_TBF_STARTING_TIME;
  StartingTime_t       TBF_STARTING_TIME;

  uint8_t               Exist_P0_PR_MODE;
  uint8_t               P0;
  uint8_t               BTS_PWR_CTRL_MODE;
  uint8_t               PR_MODE;

  bool                  Exist_AdditionsR99;
  PD_IA_AdditionsR99_t AdditionsR99;
} Packet_Downlink_ImmAssignment_t;

typedef struct
{
  bool Exist_SecondPart;

  bool Exist_ExtendedRA;
  uint8_t  ExtendedRA;
} Second_Part_Packet_Assignment_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Packet_Uplink_ImmAssignment_t   Packet_Uplink_ImmAssignment;
    Packet_Downlink_ImmAssignment_t Packet_Downlink_ImmAssignment;
  } ul_dl;
} IA_PacketAssignment_UL_DL_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    IA_PacketAssignment_UL_DL_t     UplinkDownlinkAssignment;
    Second_Part_Packet_Assignment_t Second_Part_Packet_Assignment;
  } u;
} IA_PacketAssignment_t;

#if 0
typedef struct
{
  uint8_t UnionType;
  union
  {
    IA_FreqParamsBeforeTime_t IA_FrequencyParams;
    IA_PacketAssignment_t     IA_PacketAssignment;
  } u;
} IA_GPRS_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    IA_EGPRS_t IA_EGPRS_Struct;
    IA_GPRS_t  IA_GPRS_Struct;
  } u;
} IA_t;


/* <IAR Rest Octets> ref: 04.18/10.5.2.17 */
typedef struct
{
  uint8_t Exist_ExtendedRA;
  uint8_t ExtendedRA;
} ExtendedRA_Info_t;

typedef ExtendedRA_Info_t ExtendedRA_Info_Array_t[4];

typedef struct
{
  ExtendedRA_Info_Array_t ExtendedRA_Info;
} IAR_t;
#endif

/* Packet Polling Request */
typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint32_t TLLI;
    uint16_t TQI;
  } u;
} PacketPollingID_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  PacketPollingID_t ID;
  uint8_t TYPE_OF_ACK;
} Packet_Polling_Request_t;

/* < SI 13 Rest Octets > */
#define MAX_EXTENSION_LENGTH_IN_BYTES (8) /* max value = 64 (coded on 6 bits) */

typedef struct
{
  uint8_t extension_length;
  uint8_t Extension_Info[MAX_EXTENSION_LENGTH_IN_BYTES];/* ( val (extension length)+1 ) 04.60/12.26 */
} Extension_Bits_t;

#if 0
typedef struct
{
  uint8_t DTM_SUPPORT                  : 1;
  uint8_t PFC_FEATURE_MODE             : 1;
  uint8_t BEP_PERIOD                   : 4;
  uint8_t EGPRS_PACKET_CHANNEL_REQUEST : 1;
  uint8_t EGPRS_Support                  : 1;

  uint8_t NotUsed                        : 3;
  uint8_t EXT_UTBF_NODATA              : 1;
  uint8_t MULTIPLE_TBF_CAPABILITY      : 1;
  uint8_t NW_EXT_UTBF                  : 1;
  uint8_t CCN_ACTIVE                   : 1;
  uint8_t BSS_PAGING_COORDINATION      : 1;
} GPRS_ExtensionInfoWithEGPRS_t;

typedef struct
{
  uint8_t EXT_UTBF_NODATA         : 1;
  uint8_t MULTIPLE_TBF_CAPABILITY : 1;
  uint8_t NW_EXT_UTBF             : 1;
  uint8_t CCN_ACTIVE              : 1;
  uint8_t BSS_PAGING_COORDINATION : 1;
  uint8_t DTM_SUPPORT             : 1;
  uint8_t PFC_FEATURE_MODE        : 1;
  uint8_t EGPRS_Support             : 1;
} GPRS_ExtensionInfoWithoutEGPRS_t;

typedef struct
{
  uint8_t NotUsed                   : 7;
  uint8_t EGPRS_Support             : 1;
} EGPRS_Support_t;

typedef struct
{
  uint8_t ECSC    : 1;
  uint8_t ECSR_3G : 1;
} NonGPRS_ExtensionInfo_t;

typedef struct
{
  uint8_t Extension_Length;
  union
  {
    EGPRS_Support_t                  EGPRS_Support;
    GPRS_ExtensionInfoWithEGPRS_t    GPRS_ExtensionInfoWithEGPRS;
    GPRS_ExtensionInfoWithoutEGPRS_t GPRS_ExtensionInfoWithoutEGPRS;
    NonGPRS_ExtensionInfo_t          NonGPRS_ExtensionInfo;
    uint8_t                          Extension_Information[MAX_EXTENSION_LENGTH_IN_BYTES];
  } u;
} Optional_Extension_Information_t;

typedef struct
{
  bool EGPRS_Support;
  uint8_t  BEP_PERIOD;
  bool EGPRS_PACKET_CHANNEL_REQUEST;
} EGPRS_OptionalExtensionInformation_t;
#endif

typedef struct
{
  uint8_t NMO;
  uint8_t T3168;
  uint8_t T3192;
  uint8_t DRX_TIMER_MAX;
  uint8_t ACCESS_BURST_TYPE;
  uint8_t CONTROL_ACK_TYPE;
  uint8_t BS_CV_MAX;

  uint8_t Exist_PAN;
  uint8_t PAN_DEC;
  uint8_t PAN_INC;
  uint8_t PAN_MAX;

  uint8_t Exist_Extension_Bits;
  Extension_Bits_t Extension_Bits;
} GPRS_Cell_Options_t;

typedef struct
{
  uint8_t ALPHA;
  uint8_t T_AVG_W;
  uint8_t T_AVG_T;
  uint8_t PC_MEAS_CHAN;
  uint8_t N_AVG_I;
} GPRS_Power_Control_Parameters_t;

typedef struct
{
  uint8_t RAC;
  uint8_t SPGC_CCCH_SUP;
  uint8_t PRIORITY_ACCESS_THR;
  uint8_t NETWORK_CONTROL_ORDER;
  GPRS_Cell_Options_t GPRS_Cell_Options;
  GPRS_Power_Control_Parameters_t GPRS_Power_Control_Parameters;
} PBCCH_Not_present_t;

typedef struct
{
  uint8_t Pb;
  uint8_t TSC;
  uint8_t TN;

  uint8_t UnionType;
  union
  {
    uint8_t dummy;
    uint16_t ARFCN;
    uint8_t MAIO;
  } u;
} PBCCH_Description_t;

typedef struct
{
  uint8_t PSI1_REPEAT_PERIOD;
  PBCCH_Description_t PBCCH_Description;
} PBCCH_present_t;



/* < Packet TBF Release message content > */
typedef uint8_t TBF_RELEASE_CAUSE_t;
#if 0
#define  TBF_RELEASE_CAUSE_NORMAL (0x00)
#define  TBF_RELEASE_CAUSE_ABNORMAL (0x02)
#endif

typedef struct
{
  uint8_t              MESSAGE_TYPE;
  uint8_t              PAGE_MODE;
  Global_TFI_t         Global_TFI;
  uint8_t              UPLINK_RELEASE;
  uint8_t              DOWNLINK_RELEASE;
  TBF_RELEASE_CAUSE_t TBF_RELEASE_CAUSE;
} Packet_TBF_Release_t;

/* < Packet Control Acknowledgement message content > */
typedef struct
{
  uint8_t Exist_CTRL_ACK_Extension;
  uint16_t CTRL_ACK_Extension;
} Packet_Control_Acknowledgement_AdditionsR6_t;

typedef struct
{
  uint8_t Exist_TN_RRBP;
  uint8_t TN_RRBP;
  uint8_t Exist_G_RNTI_Extension;
  uint8_t G_RNTI_Extension;
  bool Exist_AdditionsR6;
  Packet_Control_Acknowledgement_AdditionsR6_t AdditionsR6;
} Packet_Control_Acknowledgement_AdditionsR5_t;

typedef struct
{  /* Mac header */
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint32_t TLLI;
  uint8_t CTRL_ACK;
  bool Exist_AdditionsR5;
  Packet_Control_Acknowledgement_AdditionsR5_t AdditionsR5;
} Packet_Control_Acknowledgement_t;

typedef Packet_Control_Acknowledgement_t Packet_Ctrl_Ack_t;

#if 0
typedef struct
{
  uint8_t CTRL_ACK;
} Packet_Control_Acknowledgement_11_bit_t, Packet_Control_Acknowledgement_8_bit_t;
#endif

/* < Packet Downlink Dummy Control Block message content > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  uint8_t Exist_PERSISTENCE_LEVEL;
  uint8_t PERSISTENCE_LEVEL[4];
} Packet_Downlink_Dummy_Control_Block_t;

/* < Packet Uplink Dummy Control Block message content > */
typedef struct
{ /* Mac header */
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint32_t TLLI;
} Packet_Uplink_Dummy_Control_Block_t;

/* MS Radio Access capability IE >
 * 24.008 (10.5.5.12a)
 */
typedef struct
{
  uint8_t Exist_DTM_EGPRS_multislot_class;
  uint8_t DTM_EGPRS_multislot_class;
} DTM_EGPRS_t;

typedef struct
{
  uint8_t Exist_DTM_EGPRS_HighMultislotClass;
  uint8_t DTM_EGPRS_HighMultislotClass;
} DTM_EGPRS_HighMultislotClass_t;

typedef struct
{
  uint8_t MultislotCapabilityReductionForDL_DualCarrier;
  uint8_t DL_DualCarrierForDTM;
} DownlinkDualCarrierCapability_r7_t;

typedef struct
{
  uint8_t Exist_HSCSD_multislot_class;
  uint8_t HSCSD_multislot_class;

  uint8_t Exist_GPRS_multislot_class;
  uint8_t GPRS_multislot_class;
  uint8_t GPRS_Extended_Dynamic_Allocation_Capability;

  uint8_t Exist_SM;
  uint8_t SMS_VALUE;
  uint8_t SM_VALUE;

/*-------- Rel 99 additions */
  uint8_t Exist_ECSD_multislot_class;
  uint8_t ECSD_multislot_class;

  uint8_t Exist_EGPRS_multislot_class;
  uint8_t EGPRS_multislot_class;
  uint8_t EGPRS_Extended_Dynamic_Allocation_Capability;

  uint8_t Exist_DTM_GPRS_multislot_class;
  uint8_t DTM_GPRS_multislot_class;
  uint8_t Single_Slot_DTM;
  DTM_EGPRS_t DTM_EGPRS_Params;
} Multislot_capability_t;

typedef struct
{
  uint8_t RF_Power_Capability;

  uint8_t Exist_A5_bits;
  bool A51_bit;
  bool A52_bit;
  bool A53_bit;
  bool A54_bit;
  bool A55_bit;
  bool A56_bit;
  bool A57_bit;
  /*-- zero means that the same values apply for parameters as in the immediately preceding Access capabilities field within this IE
  *-- The presence of the A5 bits is mandatory in the 1st Access capabilies struct within this IE.
  */

  uint8_t ES_IND;
  uint8_t PS;
  uint8_t VGCS;
  uint8_t VBS;

  uint8_t Exist_Multislot_capability;
  Multislot_capability_t Multislot_capability;
  /* -- zero means that the same values apply for multislot parameters as in the immediately preceding Access capabilities field within this IE.
   * -- The presence of the Multislot capability struct is mandatory in the 1st Access capabilites struct within this IE.
   */
  /* -------- Rel 99 additions */
  uint8_t Exist_Eight_PSK_Power_Capability;
  uint8_t Eight_PSK_Power_Capability;

  uint8_t COMPACT_Interference_Measurement_Capability;
  uint8_t Revision_Level_Indicator;
  uint8_t UMTS_FDD_Radio_Access_Technology_Capability;
  uint8_t UMTS_384_TDD_Radio_Access_Technology_Capability;
  uint8_t CDMA2000_Radio_Access_Technology_Capability;

  /* -------- R4 additions */
  uint8_t UMTS_128_TDD_Radio_Access_Technology_Capability;
  uint8_t GERAN_Feature_Package_1;

  uint8_t Exist_Extended_DTM_multislot_class;
  uint8_t Extended_DTM_GPRS_multislot_class;
  uint8_t Extended_DTM_EGPRS_multislot_class;

  uint8_t Modulation_based_multislot_class_support;

  /* -------- R5 additions */
  uint8_t Exist_HighMultislotCapability;
  uint8_t HighMultislotCapability;

  uint8_t Exist_GERAN_lu_ModeCapability;
  uint8_t GERAN_lu_ModeCapability;

  uint8_t GMSK_MultislotPowerProfile;
  uint8_t EightPSK_MultislotProfile;

  /* -------- R6 additions */
  uint8_t MultipleTBF_Capability;
  uint8_t DownlinkAdvancedReceiverPerformance;
  uint8_t ExtendedRLC_MAC_ControlMessageSegmentionsCapability;
  uint8_t DTM_EnhancementsCapability;

  uint8_t Exist_DTM_GPRS_HighMultislotClass;
  uint8_t DTM_GPRS_HighMultislotClass;
  DTM_EGPRS_HighMultislotClass_t DTM_EGPRS_HighMultislotClass;
  uint8_t PS_HandoverCapability;

  /* -------- R7 additions */
  uint8_t DTM_Handover_Capability;
  uint8_t Exist_DownlinkDualCarrierCapability_r7;
  DownlinkDualCarrierCapability_r7_t DownlinkDualCarrierCapability_r7;

  uint8_t FlexibleTimeslotAssignment;
  uint8_t GAN_PS_HandoverCapability;
  uint8_t RLC_Non_persistentMode;
  uint8_t ReducedLatencyCapability;
  uint8_t UplinkEGPRS2;
  uint8_t DownlinkEGPRS2;

  /* -------- R8 additions */
  uint8_t EUTRA_FDD_Support;
  uint8_t EUTRA_TDD_Support;
  uint8_t GERAN_To_EUTRAN_supportInGERAN_PTM;
  uint8_t PriorityBasedReselectionSupport;

} Content_t;

typedef enum
{/* See TS 24.008 table 10.5.146 */
  AccTech_GSMP     = 0x0,
  AccTech_GSME     = 0x1,
  AccTech_GSMR     = 0x2,
  AccTech_GSM1800  = 0x3,
  AccTech_GSM1900  = 0x4,
  AccTech_GSM450   = 0x5,
  AccTech_GSM480   = 0x6,
  AccTech_GSM850   = 0x7,
  AccTech_GSM750   = 0x8,
  AccTech_GSMT830  = 0x9,
  AccTech_GSMT410  = 0xa,
  AccTech_GSMT900  = 0xb,
  AccTech_GSM710   = 0xc,
  AccTech_GSMT810  = 0xd,
  AccTech_GSMOther = 0xf
} AccessTechnology_t;

/* Maximum entries in one message, Enum above, applying restrictions from section
   12.30 "MS Radio Access Capability 2": */
#define MAX_ACCESS_TECHNOLOGIES_COUNT 11

typedef struct
{
  AccessTechnology_t Access_Technology_Type;
  uint8_t             GMSK_Power_class;
  uint8_t             Eight_PSK_Power_class;
} Additional_access_technologies_struct_t;

typedef struct
{
  uint8_t Count_additional_access_technologies;
  /* The value 0xf cannot be set for the first ATT, therefore we can only have
     ABSOLUTE_MAX_BANDS-1 additional access technologies. */
  Additional_access_technologies_struct_t Additional_access_technologies[MAX_ACCESS_TECHNOLOGIES_COUNT-1];
} Additional_access_technologies_t;

typedef struct
{
  uint8_t IndexOfAccTech; /* Position in AccessTechnology_t */
  union
  {
    /* Long Form */
    Content_t                        Content;
    /* Short Form */
    Additional_access_technologies_t Additional_access_technologies;
  } u;
} MS_RA_capability_value_t;

typedef struct
{
  uint8_t Count_MS_RA_capability_value; /* Recursive */
  MS_RA_capability_value_t MS_RA_capability_value[MAX_ACCESS_TECHNOLOGIES_COUNT];
} MS_Radio_Access_capability_t;


typedef struct
{
  uint8_t  ExistEDGE_RF_PwrCap1;
  uint8_t  EDGE_RF_PwrCap1;
  uint8_t  ExistEDGE_RF_PwrCap2;
  uint8_t  EDGE_RF_PwrCap2;
} EDGE_RF_Pwr_t;

typedef struct
{
  uint8_t A5_Bits;
  uint8_t Arc2_Spare;
  uint8_t Arc1;
} ARC_t;

typedef struct
{
  uint8_t  Multiband;
  union
  {
    uint8_t A5_Bits;
    ARC_t ARC;
  } u;
} Multiband_t;

typedef struct              /* MS classmark 3 R99 */
{
  uint8_t        Spare1;
  Multiband_t   Multiband;

  uint8_t        Exist_R_Support;
  uint8_t        R_GSM_Arc;

  uint8_t        Exist_MultiSlotCapability;
  uint8_t        MultiSlotClass;

  uint8_t        UCS2;
  uint8_t        ExtendedMeasurementCapability;

  uint8_t        Exist_MS_MeasurementCapability;
  uint8_t        SMS_VALUE;
  uint8_t        SM_VALUE;

  uint8_t        Exist_MS_PositioningMethodCapability;
  uint8_t        MS_PositioningMethod;

  uint8_t        Exist_EDGE_MultiSlotCapability;
  uint8_t        EDGE_MultiSlotClass;

  uint8_t        Exist_EDGE_Struct;
  uint8_t        ModulationCapability;
  EDGE_RF_Pwr_t EDGE_RF_PwrCaps;

  uint8_t        Exist_GSM400_Info;
  uint8_t        GSM400_Bands;
  uint8_t        GSM400_Arc;

  uint8_t        Exist_GSM850_Arc;
  uint8_t        GSM850_Arc;

  uint8_t        Exist_PCS1900_Arc;
  uint8_t        PCS1900_Arc;

  uint8_t        UMTS_FDD_Radio_Access_Technology_Capability;
  uint8_t        UMTS_384_TDD_Radio_Access_Technology_Capability;
  uint8_t        CDMA2000_Radio_Access_Technology_Capability;

  uint8_t        Exist_DTM_GPRS_multislot_class;
  uint8_t        DTM_GPRS_multislot_class;
  uint8_t        Single_Slot_DTM;
  DTM_EGPRS_t   DTM_EGPRS_Params;

  /* -------- R4 additions */
  uint8_t        Exist_SingleBandSupport;
  uint8_t        GSM_Band;

  uint8_t        Exist_GSM_700_Associated_Radio_Capability;
  uint8_t        GSM_700_Associated_Radio_Capability;

  uint8_t        UMTS_128_TDD_Radio_Access_Technology_Capability;
  uint8_t        GERAN_Feature_Package_1;

  uint8_t        Exist_Extended_DTM_multislot_class;
  uint8_t        Extended_DTM_GPRS_multislot_class;
  uint8_t        Extended_DTM_EGPRS_multislot_class;

  /* -------- R5 additions */
  uint8_t        Exist_HighMultislotCapability;
  uint8_t        HighMultislotCapability;

  uint8_t        Exist_GERAN_lu_ModeCapability;
  uint8_t        GERAN_lu_ModeCapability;

  uint8_t        GERAN_FeaturePackage_2;

  uint8_t        GMSK_MultislotPowerProfile;
  uint8_t        EightPSK_MultislotProfile;

  /* -------- R6 additions */
  uint8_t        Exist_TGSM_400_Bands;
  uint8_t        TGSM_400_BandsSupported;
  uint8_t        TGSM_400_AssociatedRadioCapability;

  uint8_t        Exist_TGSM_900_AssociatedRadioCapability;
  uint8_t        TGSM_900_AssociatedRadioCapability;

  uint8_t        DownlinkAdvancedReceiverPerformance;
  uint8_t        DTM_EnhancementsCapability;

  uint8_t        Exist_DTM_GPRS_HighMultislotClass;
  uint8_t        DTM_GPRS_HighMultislotClass;
  uint8_t        OffsetRequired;
  DTM_EGPRS_HighMultislotClass_t   DTM_EGPRS_HighMultislotClass;
  uint8_t        RepeatedSACCH_Capability;

  uint8_t        Spare2;
} MS_Class3_Unpacked_t;


/* < Packet Resource Request message content > */
typedef struct
{
  bool Exist;
  uint8_t  UnionType;
  union
  {
    uint8_t MEAN_BEP_GMSK;
    uint8_t MEAN_BEP_8PSK;
  } u;
} BEP_MeasurementReport_t;

typedef struct
{
  bool Exist;
  uint8_t  I_LEVEL;
} InterferenceMeasurementReport_t;

typedef struct
{
  bool                     Exist_BEP_MEASUREMENTS;
  BEP_MeasurementReport_t BEP_MEASUREMENTS[8];

  bool                             Exist_INTERFERENCE_MEASUREMENTS;
  InterferenceMeasurementReport_t INTERFERENCE_MEASUREMENTS[8];
} EGPRS_TimeslotLinkQualityMeasurements_t;

typedef struct
{
  bool Exist_MEAN_CV_BEP_GMSK;
  uint8_t  MEAN_BEP_GMSK;
  uint8_t  CV_BEP_GMSK;

  bool Exist_MEAN_CV_BEP_8PSK;
  uint8_t  MEAN_BEP_8PSK;
  uint8_t  CV_BEP_8PSK;
} EGPRS_BEP_LinkQualityMeasurements_t;

typedef struct{
uint8_t RB_ID;
uint8_t RADIO_PRIORITY;

bool      Exist_RLC_BLOCK_COUNT;
uint8_t  RLC_BLOCK_COUNT;

bool      Exist_Iu_Mode_ChRequestDesk;
//IU_Mode_Channel_Request_Desk_t IU_Mode_Channel_Request_Desk1;

}IU_Mode_Channel_Request_Desk_t;

typedef struct{
    bool       Exist_G_RNTI_Extension;
    uint8_t   G_RNTI_Extension;
    IU_Mode_Channel_Request_Desk_t  IU_Mode_Channel_Request_Desk;

}IU_Mode_Channel_Request_Desk_RNTI_t;

typedef struct{
    uint8_t PFI;
    uint8_t RADIO_PRIORITY;
    uint8_t RLC_Mode;

    bool      Exist_LCC_PDU;
    uint8_t LCC_PDU;

    bool Exist_Ext_Channel_Request_desc;

}Ext_Channel_Request_desc_t;


typedef struct{
    bool Exist_GMSK_MEAN_BEP;
    uint8_t GMSK_MEAN_BEP;
    uint8_t GMSK_CV_BEP;

    bool Exist_8PSK_MEAN_BEP;
    uint8_t p8PSK_MEAN_BEP;
    uint8_t p8PSK_CV_BEP;

    bool Exist_QPSK_MEAN_BEP;
    uint8_t QPSK_MEAN_BEP;
    uint8_t QPSK_CV_BEP;

    bool Exist_16QAM_NSR_MEAN_BEP;
    uint8_t p16QAM_NSR_MEAN_BEP;
    uint8_t p16QAM_NSR_CV_BEP;

    bool Exist_32QAM_NSR_MEAN_BEP;
    uint8_t p32QAM_NSR_MEAN_BEP;
    uint8_t p32QAM_NSR_CV_BEP;

    bool Exist_16QAM_HSR_MEAN_BEP;
    uint8_t p16QAM_HSR_MEAN_BEP;
    uint8_t p16QAM_HSR_CV_BEP;

    bool Exist_32QAM_HSR_MEAN_BEP;
    uint8_t p32QAM_HSR_MEAN_BEP;
    uint8_t p32QAM_HSR_CV_BEP;

    }EGPRS_BEP_LinkQualityMeasurements_type2_t;

typedef struct
{
    bool Exist;
    uint8_t REPORTED_MODULATION;
    uint8_t MEAN_BEP_TN;

}BEP_MeasurementReport_type2_t;

typedef struct
{
    bool Exist;
    uint8_t I_LEVEL;
}InterferenceMeasurementReport_type2_t;

typedef struct
{
    bool Exist_BEP_MEASUREMENTS;
    BEP_MeasurementReport_type2_t BEP_MEASUREMENTS[8];

    bool Exist_INTERFERENCE_MEASUREMENTS;
    InterferenceMeasurementReport_type2_t INTERFERENCE_MEASUREMENTS[8];

}EGPRS_TimeslotLinkQualityMeasurements_type2_t;


typedef struct
{
    bool Exist_Downlink_eTFI;
    uint8_t DOWNLINK_ETFI;

}PRR_AdditionsR12_t;

typedef struct
{
    uint8_t LOW_ACCESS_PRIORITY_SIGNALLING;

    bool Exist_AdditionsR12;
    PRR_AdditionsR12_t  AdditionsR12;

}PRR_AdditionsR10_t;

typedef struct
{
    uint8_t EARLY_TBF_ESTABLISHMENT;

    bool Exist_EGPRS_BEP_LinkQualityMeasurements_type2;
    EGPRS_BEP_LinkQualityMeasurements_type2_t EGPRS_BEP_LinkQualityMeasurements_type2;

    bool Exist_EGPRS_TimeslotLinkQualityMeasurements_type2;
    EGPRS_TimeslotLinkQualityMeasurements_type2_t EGPRS_TimeslotLinkQualityMeasurements_type2;

    bool Exist_AdditionsR10;
    PRR_AdditionsR10_t AdditionsR10;

}PRR_AdditionsR7_t;

typedef struct
{
    bool Exist_Ext_Channel_Request_desc;
    Ext_Channel_Request_desc_t  Ext_Channel_Request_desc;

    uint8_t Exist_AdditionsR7;
    PRR_AdditionsR7_t  AdditionsR7;

} PRR_AdditionsR6_t;

typedef struct
{
    uint8_t Exist_Iu_Mode_ChRequestDesk;
    IU_Mode_Channel_Request_Desk_RNTI_t  IU_Mode_Channel_Request_Desk_RNTI;

    uint8_t Exist_HFN_LSB;
    uint8_t   HFN_LSb;

    uint8_t Exist_AdditionsR6;
    PRR_AdditionsR6_t AdditionsR6;

}PRR_AdditionsR5_t;

typedef struct
{
  bool                                     Exist_EGPRS_BEP_LinkQualityMeasurements;
  EGPRS_BEP_LinkQualityMeasurements_t     EGPRS_BEP_LinkQualityMeasurements;

  bool                                     Exist_EGPRS_TimeslotLinkQualityMeasurements;
  EGPRS_TimeslotLinkQualityMeasurements_t EGPRS_TimeslotLinkQualityMeasurements;

  bool                                     Exist_PFI;
  uint8_t                                  PFI;

  uint8_t                                  MS_RAC_AdditionalInformationAvailable;
  uint8_t                                  RetransmissionOfPRR;

  uint8_t                                  Exist_AdditionsR5;
  PRR_AdditionsR5_t                        AdditionsR5;
} PRR_AdditionsR99_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint32_t TLLI;
  } u;
} PacketResourceRequestID_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint8_t Exist_ACCESS_TYPE;
  uint8_t ACCESS_TYPE;

  PacketResourceRequestID_t ID;

  uint8_t Exist_MS_Radio_Access_capability2;
  MS_Radio_Access_capability_t MS_Radio_Access_capability2;

  Channel_Request_Description_t Channel_Request_Description;

  uint8_t Exist_CHANGE_MARK;
  uint8_t CHANGE_MARK;

  uint8_t C_VALUE;

  uint8_t Exist_SIGN_VAR;
  uint8_t SIGN_VAR;

  InterferenceMeasurementReport_t  I_LEVEL_TN[8];

  uint8_t                           Exist_AdditionsR99;
  PRR_AdditionsR99_t               AdditionsR99;
} Packet_Resource_Request_t;

/* < Packet Mobile TBF Status message content >*/
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  Global_TFI_t Global_TFI;
  uint8_t TBF_CAUSE;

  uint8_t Exist_STATUS_MESSAGE_TYPE;
  uint8_t STATUS_MESSAGE_TYPE;
} Packet_Mobile_TBF_Status_t;

/* < Packet PSI Status message content >*/
typedef struct
{
  uint8_t PSI_MESSAGE_TYPE;
  uint8_t PSIX_CHANGE_MARK;
  uint8_t Exist_PSIX_COUNT_and_Instance_Bitmap;
} PSI_Message_t;

typedef struct
{
  uint8_t Count_PSI_Message;
  PSI_Message_t PSI_Message[10];

  uint8_t ADDITIONAL_MSG_TYPE;
} PSI_Message_List_t;

typedef struct
{
  uint8_t ADDITIONAL_MSG_TYPE;
} Unknown_PSI_Message_List_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  Global_TFI_t Global_TFI;
  uint8_t PBCCH_CHANGE_MARK;

  PSI_Message_List_t PSI_Message_List;
  Unknown_PSI_Message_List_t Unknown_PSI_Message_List;
} Packet_PSI_Status_t;

/* < Packet SI Status message content > */
typedef struct
{
  uint8_t SI_MESSAGE_TYPE;
  uint8_t MESS_REC;
  uint8_t SIX_CHANGE_MARK;

  uint8_t SIX_COUNT;
  uint8_t Instance_bitmap[2];
} SI_Message_t;

typedef struct
{
  uint8_t Count_SI_Message;
  SI_Message_t SI_Message[10];

  uint8_t ADDITIONAL_MSG_TYPE;
} SI_Message_List_t;

typedef struct
{
  uint8_t ADDITIONAL_MSG_TYPE;
} Unknown_SI_Message_List_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  Global_TFI_t Global_TFI;
  uint8_t BCCH_CHANGE_MARK;

  SI_Message_List_t SI_Message_List;
  Unknown_SI_Message_List_t Unknown_SI_Message_List;
} Packet_SI_Status_t;

typedef struct
{
  uint16_t FDD_ARFCN;
  uint8_t DIVERSITY;
  uint8_t Exist_Bandwith_FDD;
  uint8_t BANDWITH_FDD;
  uint16_t SCRAMBLING_CODE;
} FDD_Target_Cell_t;

typedef struct
{
  uint16_t TDD_ARFCN;
  uint8_t DIVERSITY_TDD;
  uint8_t Exist_Bandwith_TDD;
  uint8_t BANDWITH_TDD;
  uint16_t CELL_PARAMETER;
  uint8_t Sync_Case_TSTD;
} TDD_Target_Cell_t;

typedef struct
{
  uint16_t EARFCN;
  uint8_t Exist_Measurement_Bandwidth;
  uint8_t Measurement_Bandwidth;
  uint16_t Physical_Layer_Cell_Identity;
} EUTRAN_Target_Cell_t;

typedef struct
{
  uint32_t UTRAN_CI;
  uint8_t Exist_PLMN_ID;
  PLMN_t  PLMN_ID;
} UTRAN_CSG_Target_Cell_t;

typedef struct
{
  uint32_t EUTRAN_CI;
  uint16_t Tracking_Area_Code;
  uint8_t Exist_PLMN_ID;
  PLMN_t  PLMN_ID;
} EUTRAN_CSG_Target_Cell_t;

typedef struct
{
  uint8_t Exist_UTRAN_CSG_Target_Cell;
  UTRAN_CSG_Target_Cell_t UTRAN_CSG_Target_Cell;
  uint8_t Exist_EUTRAN_CSG_Target_Cell;
  EUTRAN_CSG_Target_Cell_t EUTRAN_CSG_Target_Cell;
} PCCF_AdditionsR9_t;

typedef struct
{
  uint8_t Exist_EUTRAN_Target_Cell;
  EUTRAN_Target_Cell_t EUTRAN_Target_Cell;
  uint8_t Exist_AdditionsR9;
  PCCF_AdditionsR9_t AdditionsR9;
} PCCF_AdditionsR8_t;

typedef struct
{
  uint8_t Exist_G_RNTI_extention;
  uint8_t G_RNTI_extention;
  uint8_t Exist_AdditionsR8;
  PCCF_AdditionsR8_t AdditionsR8;
} PCCF_AdditionsR5_t;

typedef struct
{
  uint8_t Exist_FDD_Description;
  FDD_Target_Cell_t FDD_Target_Cell;
  uint8_t Exist_TDD_Description;
  TDD_Target_Cell_t TDD_Target_Cell;
  uint8_t Exist_AdditionsR5;
  PCCF_AdditionsR5_t AdditionsR5;
} PCCF_AdditionsR99_t;

/* < Packet Cell Change Failure message content > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint32_t TLLI;
  uint16_t ARFCN;
  uint8_t BSIC;
  uint8_t CAUSE;
  bool Exist_AdditionsR99;
  PCCF_AdditionsR99_t AdditionsR99;
} Packet_Cell_Change_Failure_t;

/* < Packet Downlink Ack/Nack message content > */
typedef struct
{
  bool Exist_PFI;
  uint8_t  PFI;
} PD_AckNack_AdditionsR99_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint8_t DOWNLINK_TFI;
  Ack_Nack_Description_t Ack_Nack_Description;

  uint8_t Exist_Channel_Request_Description;
  Channel_Request_Description_t Channel_Request_Description;

  Channel_Quality_Report_t Channel_Quality_Report;

  bool                           Exist_AdditionsR99;
  PD_AckNack_AdditionsR99_t     AdditionsR99;
} Packet_Downlink_Ack_Nack_t;

/* < EGPRS Packet Downlink Ack/Nack message content > */
typedef struct
{
  EGPRS_BEP_LinkQualityMeasurements_t     EGPRS_BEP_LinkQualityMeasurements;
  uint8_t                                  C_VALUE;
  EGPRS_TimeslotLinkQualityMeasurements_t EGPRS_TimeslotLinkQualityMeasurements;
} EGPRS_ChannelQualityReport_t;

typedef struct
{
  uint8_t  MESSAGE_TYPE;
  uint8_t  PayloadType;
  uint8_t  spare;
  uint8_t  R;

  uint8_t  DOWNLINK_TFI;
  uint8_t  MS_OUT_OF_MEMORY;

  bool                           Exist_EGPRS_ChannelQualityReport;
  EGPRS_ChannelQualityReport_t  EGPRS_ChannelQualityReport;

  bool                           Exist_ChannelRequestDescription;
  Channel_Request_Description_t ChannelRequestDescription;

  bool Exist_PFI;
  uint8_t  PFI;

  bool              Exist_ExtensionBits;
  Extension_Bits_t ExtensionBits;

  EGPRS_AckNack_t  EGPRS_AckNack;
} EGPRS_PD_AckNack_t;

/* < Packet Uplink Ack/Nack message content  04.60 sec.11.2.28 > */

typedef struct
{
  uint8_t                     Exist_CONTENTION_RESOLUTION_TLLI;
  uint32_t                    CONTENTION_RESOLUTION_TLLI;

  uint8_t                     Exist_Packet_Timing_Advance;
  Packet_Timing_Advance_t    Packet_Timing_Advance;

  uint8_t                     Exist_Extension_Bits;
  Extension_Bits_t           Extension_Bits;

  uint8_t                     Exist_Power_Control_Parameters;
  Power_Control_Parameters_t Power_Control_Parameters;
} Common_Uplink_Ack_Nack_Data_t;

typedef struct
{
  bool Exist_PacketExtendedTimingAdvance;
  uint8_t  PacketExtendedTimingAdvance;
  uint8_t  TBF_EST;
} PU_AckNack_GPRS_AdditionsR99_t;

/* Table 11.2.28.1: PACKET UPLINK ACK/NACK information elements */
typedef struct
{
    uint8_t Error;
    /* Fixed Allocation Parameters was removed from specs.
     * TODO: implement for old versions of spec.
     */
} Fixed_Allocation_Parameters_t;

typedef struct
{
  uint8_t                 CHANNEL_CODING_COMMAND;
  Ack_Nack_Description_t Ack_Nack_Description;

  bool                            Exist_Fixed_Allocation_Parameters;
  Fixed_Allocation_Parameters_t   Fixed_Allocation_Parameters;

  bool                            Exist_AdditionsR99;
  PU_AckNack_GPRS_AdditionsR99_t AdditionsR99;

  Common_Uplink_Ack_Nack_Data_t Common_Uplink_Ack_Nack_Data;
} PU_AckNack_GPRS_t;

typedef struct
{
  uint8_t  EGPRS_ChannelCodingCommand;
  uint8_t  RESEGMENT;
  uint8_t  PRE_EMPTIVE_TRANSMISSION;
  uint8_t  PRR_RETRANSMISSION_REQUEST;
  uint8_t  ARAC_RETRANSMISSION_REQUEST;

  uint8_t  TBF_EST;

  bool Exist_Packet_Extended_Timing_Advance;
  uint8_t  Packet_Extended_Timing_Advance;

  EGPRS_AckNack_t  EGPRS_AckNack;


  Common_Uplink_Ack_Nack_Data_t Common_Uplink_Ack_Nack_Data;
} PU_AckNack_EGPRS_00_t;

typedef struct
{
  uint8_t  UnionType;
  union
  {
    PU_AckNack_EGPRS_00_t PU_AckNack_EGPRS_00;
    uint8_t                extension_01;
    uint8_t                extension_10;
    uint8_t                extension_11;
  } u;
} PU_AckNack_EGPRS_t;

#if 0
enum PUAN_Type
{
  PUAN_GPRS,
  PUAN_EGPRS
};
#endif

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  uint8_t UPLINK_TFI;

  uint8_t UnionType;
  union
  {
    PU_AckNack_GPRS_t  PU_AckNack_GPRS_Struct;
    PU_AckNack_EGPRS_t PU_AckNack_EGPRS_Struct;
  } u;
} Packet_Uplink_Ack_Nack_t;

/* < Packet Uplink Assignment message content > */
typedef struct
{
  uint8_t CHANGE_MARK_1;
  uint8_t Exist_CHANGE_MARK_2;
  uint8_t CHANGE_MARK_2;
} CHANGE_MARK_t;

typedef struct
{
  uint8_t MAIO;
  uint8_t MA_NUMBER;

  uint8_t Exist_CHANGE_MARK;
  CHANGE_MARK_t CHANGE_MARK;
} Indirect_encoding_t;

typedef struct
{
  uint8_t MAIO;
  GPRS_Mobile_Allocation_t GPRS_Mobile_Allocation;
} Direct_encoding_1_t;

typedef struct
{
  uint8_t MAIO;
  uint8_t HSN;
  uint8_t Length_of_MA_Frequency_List;
  uint8_t MA_Frequency_List[15+3];
} Direct_encoding_2_t;

typedef struct
{
  uint8_t TSC;
  uint8_t UnionType;
  union
  {
    uint16_t ARFCN;
    Indirect_encoding_t Indirect_encoding;
    Direct_encoding_1_t Direct_encoding_1;
    Direct_encoding_2_t Direct_encoding_2;
  } u;
} Frequency_Parameters_t;

typedef struct
{
  uint8_t Exist;
  uint8_t USF_TN;
} Timeslot_Allocation_t;

typedef struct
{
  uint8_t ALPHA;

  struct
  {
    uint8_t Exist;
    uint8_t USF_TN;
    uint8_t GAMMA_TN;
  } Slot[8];
} Timeslot_Allocation_Power_Ctrl_Param_t;

typedef struct
{
  uint8_t Extended_Dynamic_Allocation;

  uint8_t Exist_P0;
  uint8_t P0;
  uint8_t PR_MODE;

  uint8_t USF_GRANULARITY;

  uint8_t Exist_UPLINK_TFI_ASSIGNMENT;
  uint8_t UPLINK_TFI_ASSIGNMENT;

  uint8_t Exist_RLC_DATA_BLOCKS_GRANTED;
  uint8_t RLC_DATA_BLOCKS_GRANTED;

  uint8_t Exist_TBF_Starting_Time;
  Starting_Frame_Number_t TBF_Starting_Time;

  uint8_t UnionType;
  union
  {
    Timeslot_Allocation_t                  Timeslot_Allocation[8];
    Timeslot_Allocation_Power_Ctrl_Param_t Timeslot_Allocation_Power_Ctrl_Param;
  } u;
} Dynamic_Allocation_t;

typedef struct
{
  uint8_t Extended_Dynamic_Allocation;

  uint8_t Exist_P0;
  uint8_t P0;
  uint8_t PR_MODE;

  uint8_t USF_GRANULARITY;

  uint8_t Exist_UPLINK_TFI_ASSIGNMENT;
  uint8_t UPLINK_TFI_ASSIGNMENT;

  uint8_t Exist_RLC_DATA_BLOCKS_GRANTED;
  uint8_t RLC_DATA_BLOCKS_GRANTED;

  uint8_t UnionType;
  union
  {
    Timeslot_Allocation_t Timeslot_Allocation[8];
    Timeslot_Allocation_Power_Ctrl_Param_t Timeslot_Allocation_Power_Ctrl_Param;
  } u;
} DTM_Dynamic_Allocation_t;

typedef struct
{
  uint8_t TIMESLOT_NUMBER;

  uint8_t Exist_ALPHA_and_GAMMA_TN;
  uint8_t ALPHA;
  uint8_t GAMMA_TN;

  uint8_t Exist_P0;
  uint8_t P0;
  uint8_t BTS_PWR_CTRL_MODE;
  uint8_t PR_MODE;

  Starting_Frame_Number_t TBF_Starting_Time;
} Single_Block_Allocation_t;

typedef struct
{
  uint8_t TIMESLOT_NUMBER;

  uint8_t Exist_ALPHA_and_GAMMA_TN;
  uint8_t ALPHA;
  uint8_t GAMMA_TN;

  uint8_t Exist_P0;
  uint8_t P0;
  uint8_t BTS_PWR_CTRL_MODE;
  uint8_t PR_MODE;

} DTM_Single_Block_Allocation_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint32_t TLLI;
    uint16_t TQI;
    Packet_Request_Reference_t Packet_Request_Reference;
  } u;
} PacketUplinkID_t;

typedef struct
{
  bool Exist_Packet_Extended_Timing_Advance;
  uint8_t  Packet_Extended_Timing_Advance;
} PUA_GPRS_AdditionsR99_t;

typedef struct
{
  uint8_t                      CHANNEL_CODING_COMMAND;
  uint8_t                      TLLI_BLOCK_CHANNEL_CODING;
  Packet_Timing_Advance_t     Packet_Timing_Advance;

  uint8_t                      Exist_Frequency_Parameters;
  Frequency_Parameters_t      Frequency_Parameters;

  uint8_t                      UnionType;
  union
  {
    uint8_t                    extension;
    Dynamic_Allocation_t      Dynamic_Allocation;
    Single_Block_Allocation_t Single_Block_Allocation;
    uint8_t                    FixedAllocationDummy;
  } u;

  bool                         Exist_AdditionsR99;
  PUA_GPRS_AdditionsR99_t     AdditionsR99;
} PUA_GPRS_t;

typedef struct
{
  uint8_t  BitmapLength;
  uint8_t  ReducedMA_Bitmap[127 / 8 + 1];

  bool Exist_MAIO_2;
  uint8_t  MAIO_2;
} COMPACT_ReducedMA_t;

typedef struct
{
  uint8_t                  TIMESLOT_NUMBER;

  bool                     Exist_ALPHA_GAMMA_TN;
  uint8_t                  ALPHA;
  uint8_t                  GAMMA_TN;

  bool                     Exist_P0_BTS_PWR_CTRL_PR_MODE;
  uint8_t                  P0;
  uint8_t                  BTS_PWR_CTRL_MODE;
  uint8_t                  PR_MODE;

  Starting_Frame_Number_t TBF_Starting_Time;
  uint8_t                  NUMBER_OF_RADIO_BLOCKS_ALLOCATED;
} MultiBlock_Allocation_t;

typedef struct
{
  bool                         Exist_CONTENTION_RESOLUTION_TLLI;
  uint32_t                     CONTENTION_RESOLUTION_TLLI;

  bool                         Exist_COMPACT_ReducedMA;
  COMPACT_ReducedMA_t         COMPACT_ReducedMA;

  uint8_t                      EGPRS_CHANNEL_CODING_COMMAND;
  uint8_t                      RESEGMENT;
  uint8_t                      EGPRS_WindowSize;

  uint8_t                      NrOfAccessTechnologies;  /* will hold the number of list elements */
  uint8_t                      AccessTechnologyType[MAX_ACCESS_TECHOLOGY_TYPES]; /* for max size of array see 24.008/Table 10.5.146 */

  uint8_t                      ARAC_RETRANSMISSION_REQUEST;
  uint8_t                      TLLI_BLOCK_CHANNEL_CODING;

  bool                         Exist_BEP_PERIOD2;
  uint8_t                      BEP_PERIOD2;

  Packet_Timing_Advance_t     PacketTimingAdvance;

  bool                         Exist_Packet_Extended_Timing_Advance;
  uint8_t                      Packet_Extended_Timing_Advance;

  bool                         Exist_Frequency_Parameters;
  Frequency_Parameters_t      Frequency_Parameters;

  uint8_t                      UnionType;
  union
  {
    uint8_t                    extension;
    Dynamic_Allocation_t      Dynamic_Allocation;
    MultiBlock_Allocation_t   MultiBlock_Allocation;
    uint8_t                    FixedAllocationDummy;/* Fixed Allocation is not used */
  } u;
} PUA_EGPRS_00_t;

typedef struct
{
  uint8_t           UnionType;
  union
  {
    PUA_EGPRS_00_t PUA_EGPRS_00;
    uint8_t         PUA_EGPRS_01;
    uint8_t         PUA_EGPRS_10;
    uint8_t         PUA_EGPRS_11;
  } u;
} PUA_EGPRS_t;

#if 0
enum PUA_Type
{
  PUA_GPRS,
  PUA_EGPRS
};
#endif

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  uint8_t Exist_PERSISTENCE_LEVEL;
  uint8_t PERSISTENCE_LEVEL[4];

  PacketUplinkID_t ID;

  uint8_t UnionType;
  union
  {
    PUA_GPRS_t  PUA_GPRS_Struct;
    PUA_EGPRS_t PUA_EGPRS_Struct;
  } u;
} Packet_Uplink_Assignment_t;


/* < DTM Packet Uplink Assignment message content > */
typedef struct
{
  uint8_t CHANNEL_CODING_COMMAND;
  uint8_t TLLI_BLOCK_CHANNEL_CODING;
  Packet_Timing_Advance_t Packet_Timing_Advance;

  uint8_t UnionType;
  union
  {
    uint8_t extension;
    DTM_Dynamic_Allocation_t DTM_Dynamic_Allocation;
    DTM_Single_Block_Allocation_t DTM_Single_Block_Allocation;
  } u;
  bool Exist_EGPRS_Parameters;
  uint8_t EGPRS_CHANNEL_CODING_COMMAND;
  uint8_t RESEGMENT;
  uint8_t EGPRS_WindowSize;
  bool Exist_Packet_Extended_Timing_Advance;
  uint8_t Packet_Extended_Timing_Advance;
} DTM_Packet_Uplink_Assignment_t;

typedef struct
{
  DTM_Packet_Uplink_Assignment_t DTM_Packet_Uplink_Assignment;
} DTM_UL_t;

/* < DTM Packet Channel Request message content > */
typedef struct
{
  uint8_t DTM_Pkt_Est_Cause;
  Channel_Request_Description_t Channel_Request_Description;
  bool                                     Exist_PFI;
  uint8_t                                  PFI;
} DTM_Channel_Request_Description_t;

/* < Packet Downlink Assignment message content > */
typedef struct
{
  Starting_Frame_Number_t Measurement_Starting_Time;
  uint8_t MEASUREMENT_INTERVAL;
  uint8_t MEASUREMENT_BITMAP;
} Measurement_Mapping_struct_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint32_t TLLI;
  } u;
} PacketDownlinkID_t;

typedef struct
{
  bool Exist_EGPRS_Params; /* if Exist_EGPRS_Params == false then none of the following 4 vars exist */
  uint8_t  EGPRS_WindowSize;
  uint8_t  LINK_QUALITY_MEASUREMENT_MODE;
  bool Exist_BEP_PERIOD2;
  uint8_t  BEP_PERIOD2;

  bool Exist_Packet_Extended_Timing_Advance;
  uint8_t  Packet_Extended_Timing_Advance;

  bool                 Exist_COMPACT_ReducedMA;
  COMPACT_ReducedMA_t COMPACT_ReducedMA;
} PDA_AdditionsR99_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       PAGE_MODE;

  bool                          Exist_PERSISTENCE_LEVEL;
  uint8_t                       PERSISTENCE_LEVEL[4];

  PacketDownlinkID_t           ID;

  uint8_t                       MAC_MODE;
  uint8_t                       RLC_MODE;
  uint8_t                       CONTROL_ACK;
  uint8_t                       TIMESLOT_ALLOCATION;
  Packet_Timing_Advance_t      Packet_Timing_Advance;

  bool                          Exist_P0_and_BTS_PWR_CTRL_MODE;
  uint8_t                       P0;
  uint8_t                       BTS_PWR_CTRL_MODE;
  uint8_t                       PR_MODE;

  bool                          Exist_Frequency_Parameters;
  Frequency_Parameters_t       Frequency_Parameters;

  bool                          Exist_DOWNLINK_TFI_ASSIGNMENT;
  uint8_t                       DOWNLINK_TFI_ASSIGNMENT;

  bool                          Exist_Power_Control_Parameters;
  Power_Control_Parameters_t   Power_Control_Parameters;

  bool                          Exist_TBF_Starting_Time;
  Starting_Frame_Number_t      TBF_Starting_Time;

  uint8_t                       Exist_Measurement_Mapping;
  Measurement_Mapping_struct_t Measurement_Mapping;

  bool                          Exist_AdditionsR99;
  PDA_AdditionsR99_t           AdditionsR99;
} Packet_Downlink_Assignment_t;

/* < DTM Packet Downlink Assignment message content > */
typedef struct
{
  uint8_t MAC_MODE;
  uint8_t RLC_MODE;
  uint8_t TIMESLOT_ALLOCATION;
  Packet_Timing_Advance_t Packet_Timing_Advance;

  uint8_t Exist_P0_and_BTS_PWR_CTRL_MODE;
  uint8_t P0;
  uint8_t BTS_PWR_CTRL_MODE;
  uint8_t PR_MODE;

  uint8_t Exist_Power_Control_Parameters;
  Power_Control_Parameters_t Power_Control_Parameters;

  uint8_t Exist_DOWNLINK_TFI_ASSIGNMENT;
  uint8_t DOWNLINK_TFI_ASSIGNMENT;

  uint8_t Exist_Measurement_Mapping;
  Measurement_Mapping_struct_t Measurement_Mapping;
  bool EGPRS_Mode;
  uint8_t EGPRS_WindowSize;
  uint8_t LINK_QUALITY_MEASUREMENT_MODE;
  bool Exist_Packet_Extended_Timing_Advance;
  uint8_t  Packet_Extended_Timing_Advance;
} DTM_Packet_Downlink_Assignment_t;

typedef struct
{
  DTM_Packet_Downlink_Assignment_t DTM_Packet_Downlink_Assignment;
} DTM_DL_t;

typedef struct
{
  GPRS_Cell_Options_t GPRS_Cell_Options;
  GPRS_Power_Control_Parameters_t GPRS_Power_Control_Parameters;
} DTM_GPRS_Broadcast_Information_t;

typedef struct
{
  DTM_GPRS_Broadcast_Information_t DTM_GPRS_Broadcast_Information;
} DTM_GPRS_B_t;

/* < Packet Paging Request message content > */
typedef struct
{
  uint8_t UnionType;
  union
  {
    TMSI_t PTMSI;
    struct MobileId Mobile_Identity;
  } u;
} Page_request_for_TBF_establishment_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    TMSI_t TMSI;
    struct MobileId Mobile_Identity;
  } u;

  uint8_t CHANNEL_NEEDED;

  uint8_t Exist_eMLPP_PRIORITY;
  uint8_t eMLPP_PRIORITY;
} Page_request_for_RR_conn_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Page_request_for_TBF_establishment_t Page_req_TBF;
    Page_request_for_RR_conn_t Page_req_RR;
  } u;
} Repeated_Page_info_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  uint8_t Exist_PERSISTENCE_LEVEL;
  uint8_t PERSISTENCE_LEVEL[4];

  uint8_t Exist_NLN;
  uint8_t NLN;

  uint8_t Count_Repeated_Page_info;
  Repeated_Page_info_t Repeated_Page_info[5];
} Packet_Paging_Request_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  uint8_t TIMESLOTS_AVAILABLE;
} Packet_PDCH_Release_t;

/* < Packet Power Control/Timing Advance message content > */
typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint16_t TQI;
    Packet_Request_Reference_t Packet_Request_Reference;
  } u;
} PacketPowerControlTimingAdvanceID_t;

typedef struct
{
  Global_Packet_Timing_Advance_t Global_Packet_Timing_Advance;
  Power_Control_Parameters_t Power_Control_Parameters;
} GlobalTimingAndPower_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_Packet_Timing_Advance_t Global_Packet_Timing_Advance;
    Power_Control_Parameters_t Power_Control_Parameters;
  } u;
} GlobalTimingOrPower_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  PacketPowerControlTimingAdvanceID_t ID;

  /* -- Message escape */
  uint8_t Exist_Global_Power_Control_Parameters;
  Global_Power_Control_Parameters_t Global_Power_Control_Parameters;

  uint8_t UnionType;
  union
  {
    GlobalTimingAndPower_t GlobalTimingAndPower;
    GlobalTimingOrPower_t GlobalTimingOrPower;
  } u;
} Packet_Power_Control_Timing_Advance_t;

/* < Packet Queueing Notification message content > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  /* 111 Fixed */
  Packet_Request_Reference_t Packet_Request_Reference;
  uint16_t TQI;
} Packet_Queueing_Notification_t;

/* < Packet Timeslot Reconfigure message content 04.60 sec. 11.2.31> */

typedef Dynamic_Allocation_t TRDynamic_Allocation_t;

typedef struct
{
  Global_Packet_Timing_Advance_t Global_Packet_Timing_Advance;

  uint8_t                         DOWNLINK_RLC_MODE;
  uint8_t                         CONTROL_ACK;

  uint8_t                         Exist_DOWNLINK_TFI_ASSIGNMENT;
  uint8_t                         DOWNLINK_TFI_ASSIGNMENT;

  uint8_t                         Exist_UPLINK_TFI_ASSIGNMENT;
  uint8_t                         UPLINK_TFI_ASSIGNMENT;

  uint8_t                         DOWNLINK_TIMESLOT_ALLOCATION;

  uint8_t                         Exist_Frequency_Parameters;
  Frequency_Parameters_t         Frequency_Parameters;
} Common_Timeslot_Reconfigure_t;

typedef struct
{
  bool Exist_Packet_Extended_Timing_Advance;
  uint8_t  Packet_Extended_Timing_Advance;
} PTR_GPRS_AdditionsR99_t;

typedef struct
{
  uint8_t                         CHANNEL_CODING_COMMAND;

  Common_Timeslot_Reconfigure_t  Common_Timeslot_Reconfigure_Data;

  uint8_t UnionType;
  union
  {
    TRDynamic_Allocation_t       Dynamic_Allocation;
    uint8_t                       Fixed_AllocationDummy;
  } u;

   bool                           Exist_AdditionsR99;
   PTR_GPRS_AdditionsR99_t       AdditionsR99;
} PTR_GPRS_t;

typedef struct
{
  bool                            Exist_COMPACT_ReducedMA;
  COMPACT_ReducedMA_t            COMPACT_ReducedMA;

  uint8_t                         EGPRS_ChannelCodingCommand;
  uint8_t                         RESEGMENT;

  bool                            Exist_DOWNLINK_EGPRS_WindowSize;
  uint8_t                         DOWNLINK_EGPRS_WindowSize;

  bool                            Exist_UPLINK_EGPRS_WindowSize;
  uint8_t                         UPLINK_EGPRS_WindowSize;

  uint8_t                         LINK_QUALITY_MEASUREMENT_MODE;

  bool                            Exist_Packet_Extended_Timing_Advance;
  uint8_t                         Packet_Extended_Timing_Advance;

  Common_Timeslot_Reconfigure_t  Common_Timeslot_Reconfigure_Data;

  uint8_t                         UnionType;
  union
  {
    TRDynamic_Allocation_t       Dynamic_Allocation;
    uint8_t                       FixedAllocationDummy;
  } u;
} PTR_EGPRS_00_t;

typedef struct
{
  uint8_t           UnionType;
  union
  {
    PTR_EGPRS_00_t PTR_EGPRS_00;
    uint8_t         extension_01;
    uint8_t         extension_10;
    uint8_t         extension_11;
  } u;
} PTR_EGPRS_t;

#if 0
enum PTR_Type
{
  PTR_GPRS,
  PTR_EGPRS
};
#endif

typedef struct
{
  uint8_t         MESSAGE_TYPE;
  uint8_t         PAGE_MODE;

  Global_TFI_t   Global_TFI;

   uint8_t        UnionType;
   union
   {
     PTR_GPRS_t  PTR_GPRS_Struct;
     PTR_EGPRS_t PTR_EGPRS_Struct;
   } u;
} Packet_Timeslot_Reconfigure_t;


/* < PSI1 message content > */
typedef struct
{
  uint8_t ACC_CONTR_CLASS[2];
  uint8_t MAX_RETRANS[4];
  uint8_t S;
  uint8_t TX_INT;

  uint8_t Exist_PERSISTENCE_LEVEL;
  uint8_t PERSISTENCE_LEVEL[4];
} PRACH_Control_t;

typedef struct
{
  uint8_t BS_PCC_REL;
  uint8_t BS_PBCCH_BLKS;
  uint8_t BS_PAG_BLKS_RES;
  uint8_t BS_PRACH_BLKS;
} PCCCH_Organization_t;

typedef struct
{
  uint8_t LB_MS_TXPWR_MAX_CCH;
} PSI1_AdditionsR6_t;

typedef struct
{
  uint8_t            MSCR;
  uint8_t            SGSNR;
  uint8_t            BandIndicator;
  bool               Exist_AdditionsR6;
  PSI1_AdditionsR6_t AdditionsR6;
} PSI1_AdditionsR99_t;

typedef struct
{
  uint8_t                           MESSAGE_TYPE;

  uint8_t                           PAGE_MODE;
  uint8_t                           PBCCH_CHANGE_MARK;
  uint8_t                           PSI_CHANGE_FIELD;
  uint8_t                           PSI1_REPEAT_PERIOD;
  uint8_t                           PSI_COUNT_LR;

  uint8_t                           Exist_PSI_COUNT_HR;
  uint8_t                           PSI_COUNT_HR;

  uint8_t                           MEASUREMENT_ORDER;
  GPRS_Cell_Options_t               GPRS_Cell_Options;
  PRACH_Control_t                   PRACH_Control;
  PCCCH_Organization_t              PCCCH_Organization;
  Global_Power_Control_Parameters_t Global_Power_Control_Parameters;
  uint8_t                           PSI_STATUS_IND;

  bool                              Exist_AdditionsR99;
  PSI1_AdditionsR99_t               AdditionsR99;
} PSI1_t;

/* < PSI2 message content > */
typedef struct
{
  uint8_t NUMBER;

  uint8_t Length;
  uint8_t Contents[15 + 3];/* octet (val(Length of RFL contents) + 3) */
} Reference_Frequency_t;

typedef struct
{
  uint8_t NoOfRFLs;
  uint8_t RFL_Number[MAX_RFLS];
} Cell_Allocation_t;

typedef struct
{
  uint8_t NUMBER;
  GPRS_Mobile_Allocation_t Mobile_Allocation;
} PSI2_MA_t;

typedef struct
{
  uint16_t ARFCN;
  uint8_t TIMESLOT_ALLOCATION;
} Non_Hopping_PCCCH_Carriers_t;

typedef struct
{
  uint8_t Count_Carriers;
  Non_Hopping_PCCCH_Carriers_t Carriers[7];
} NonHoppingPCCCH_t;

typedef struct
{
  uint8_t MAIO;
  uint8_t TIMESLOT_ALLOCATION;
} Hopping_PCCCH_Carriers_t;

typedef struct
{
  uint8_t MA_NUMBER;

  uint8_t Count_Carriers;
  Hopping_PCCCH_Carriers_t Carriers[10];/* MAX_PCCCH but 10 is theoretical max. */
} HoppingPCCCH_t;

typedef struct
{
  uint8_t TSC;

  uint8_t UnionType;
  union
  {
    NonHoppingPCCCH_t NonHopping;
    HoppingPCCCH_t Hopping;
  } u;
} PCCCH_Description_t;

typedef struct
{
  LAI_t LAI;
  uint8_t RAC;
  CellId_t Cell_Identity;
} Cell_Identification_t;

typedef struct
{
  uint8_t ATT;

  uint8_t Exist_T3212;
  uint8_t T3212;

  uint8_t NECI;
  uint8_t PWRC;
  uint8_t DTX;
  uint8_t RADIO_LINK_TIMEOUT;
  uint8_t BS_AG_BLKS_RES;
  uint8_t CCCH_CONF;
  uint8_t BS_PA_MFRMS;
  uint8_t MAX_RETRANS;
  uint8_t TX_INTEGER;
  uint8_t EC;
  uint8_t MS_TXPWR_MAX_CCCH;

  uint8_t Exist_Extension_Bits;
  Extension_Bits_t Extension_Bits;
} Non_GPRS_Cell_Options_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  uint8_t CHANGE_MARK;
  uint8_t INDEX;
  uint8_t COUNT;

  uint8_t Exist_Cell_Identification;
  Cell_Identification_t Cell_Identification;

  uint8_t Exist_Non_GPRS_Cell_Options;
  Non_GPRS_Cell_Options_t Non_GPRS_Cell_Options;

  uint8_t Count_Reference_Frequency;
  Reference_Frequency_t Reference_Frequency[MAX_RFLS];

  Cell_Allocation_t Cell_Allocation;

  uint8_t Count_GPRS_MA;
  PSI2_MA_t GPRS_MA[MAX_MA_LISTS_IN_PSI2];

  uint8_t Count_PCCCH_Description;
  PCCCH_Description_t PCCCH_Description[7];/* MAX_PCCCH but it is impossible that more than 7 can be decoded */
} PSI2_t;

/* < PSI3 message content > */
typedef struct
{
  uint8_t PRIORITY_CLASS;
  uint8_t HCS_THR;
} HCS_t;

typedef struct
{
  uint8_t CELL_BAR_ACCESS_2;
  uint8_t EXC_ACC;
  uint8_t GPRS_RXLEV_ACCESS_MIN;
  uint8_t GPRS_MS_TXPWR_MAX_CCH;

  uint8_t Exist_HCS;
  HCS_t HCS;
  uint8_t MULTIBAND_REPORTING;
} Serving_Cell_params_t;

typedef struct
{
  uint8_t GPRS_CELL_RESELECT_HYSTERESIS;
  uint8_t C31_HYST;
  uint8_t C32_QUAL;
  uint8_t RANDOM_ACCESS_RETRY;

  uint8_t Exist_T_RESEL;
  uint8_t T_RESEL;

  uint8_t Exist_RA_RESELECT_HYSTERESIS;
  uint8_t RA_RESELECT_HYSTERESIS;
} Gen_Cell_Sel_t;

typedef struct
{
  uint8_t PBCCH_LOCATION;
  uint8_t PSI1_REPEAT_PERIOD;
} Location_Repeat_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    uint8_t SI13_LOCATION;
    Location_Repeat_t lr;
  } u;
} SI13_PBCCH_Location_t;

typedef struct
{
  uint8_t BSIC;
  uint8_t CELL_BAR_ACCESS_2;
  uint8_t EXC_ACC;
  uint8_t SAME_RA_AS_SERVING_CELL;

  uint8_t Exist_RXLEV_and_TXPWR;
  uint8_t GPRS_RXLEV_ACCESS_MIN;
  uint8_t GPRS_MS_TXPWR_MAX_CCH;

  uint8_t Exist_OFFSET_and_TIME;
  uint8_t GPRS_TEMPORARY_OFFSET;
  uint8_t GPRS_PENALTY_TIME;

  uint8_t Exist_GPRS_RESELECT_OFFSET;
  uint8_t GPRS_RESELECT_OFFSET;

  uint8_t Exist_HCS;
  HCS_t HCS;

  uint8_t Exist_SI13_PBCCH_Location;
  SI13_PBCCH_Location_t SI13_PBCCH_Location;
} Cell_Selection_t;

/* Neighbour cell list as used in PSI3 and PSI3bis */
typedef struct
{
  uint8_t FREQ_DIFF_LENGTH;
  uint8_t FREQUENCY_DIFF;

  Cell_Selection_t Cell_SelectionParams;
} Cell_Selection_Params_With_FreqDiff_t;

typedef struct
{
  uint16_t START_FREQUENCY;
  Cell_Selection_t Cell_Selection;
  uint8_t NR_OF_REMAINING_CELLS;
  uint8_t FREQ_DIFF_LENGTH;

  Cell_Selection_Params_With_FreqDiff_t Cell_Selection_Params_With_FreqDiff[16];
} NeighbourCellParameters_t;

typedef struct
{
  uint8_t Count;
  NeighbourCellParameters_t Parameters[32];
} NeighbourCellList_t;

/* < PSI3 message content > */

typedef struct
{
  uint8_t bsic;
  uint8_t CELL_BAR_ACCESS_2;
  uint8_t EXC_ACC;
  uint8_t SAME_RA_AS_SERVING_CELL;
  uint8_t Exist_GPRS_RXLEV_ACCESS_MIN;
  uint8_t GPRS_RXLEV_ACCESS_MIN;
  uint8_t GPRS_MS_TXPWR_MAX_CCH;
  uint8_t Exist_GPRS_TEMPORARY_OFFSET;
  uint8_t GPRS_TEMPORARY_OFFSET;
  uint8_t GPRS_PENALTY_TIME;
  uint8_t Exist_GPRS_RESELECT_OFFSET;
  uint8_t GPRS_RESELECT_OFFSET;
  uint8_t Exist_Hcs_Parm;
  HCS_t   HCS_Param;
  uint8_t Exist_TIME_GROUP;
  uint8_t TIME_GROUP;
  uint8_t Exist_GUAR_CONSTANT_PWR_BLKS;
  uint8_t GUAR_CONSTANT_PWR_BLKS;
} COMPACT_Cell_Sel_t;

typedef struct
{
  uint8_t FREQ_DIFF_LENGTH;
  uint16_t FREQUENCY_DIFF;
  COMPACT_Cell_Sel_t  COMPACT_Cell_Sel_Remain_Cells;
} COMPACT_Neighbour_Cell_Param_Remaining_t;

typedef struct
{
  uint16_t START_FREQUENCY;
  COMPACT_Cell_Sel_t COMPACT_Cell_Sel;
  uint8_t NR_OF_REMAINING_CELLS;
  uint8_t FREQ_DIFF_LENGTH;
  COMPACT_Neighbour_Cell_Param_Remaining_t  COMPACT_Neighbour_Cell_Param_Remaining[16];
} COMPACT_Neighbour_Cell_Param_t;

typedef struct
{
  Cell_Identification_t Cell_Identification;
  uint8_t COMPACT_Neighbour_Cell_Param_Count;
  COMPACT_Neighbour_Cell_Param_t COMPACT_Neighbour_Cell_Param[8];
} COMPACT_Info_t;

typedef struct
{
  uint8_t Exist_CCN_Support_Desc;
  CCN_Support_Description_t CCN_Support_Desc;
} PSI3_AdditionR4_t;

typedef struct
{
  uint8_t Exist_COMPACT_Info;
  COMPACT_Info_t COMPACT_Info;
  uint8_t Exist_AdditionR4;
  PSI3_AdditionR4_t AdditionR4;
} PSI3_AdditionR99_t;

typedef struct
{
  LSA_ID_Info_t Scell_LSA_ID_Info;
  uint8_t Exist_LSA_Parameters;
  LSA_Parameters_t LSA_Parameters;
  uint8_t Exist_AdditionR99;
  PSI3_AdditionR99_t AdditionR99;
} PSI3_AdditionR98_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  uint8_t CHANGE_MARK;
  uint8_t BIS_COUNT;

  Serving_Cell_params_t Serving_Cell_params;

  Gen_Cell_Sel_t General_Cell_Selection;
  NeighbourCellList_t NeighbourCellList;

  uint8_t Exist_AdditionR98;
  PSI3_AdditionR98_t AdditionR98;
} PSI3_t;

/* < PSI3_BIS message content > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  uint8_t CHANGE_MARK;
  uint8_t BIS_INDEX;
  uint8_t BIS_COUNT;

  NeighbourCellList_t NeighbourCellList;
} PSI3_BIS_t;

/* < PSI4 message content > */
typedef struct
{
  uint8_t MA_NUMBER;
  uint8_t MAIO;
} h_CG_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    uint16_t ARFCN;
    h_CG_t h_CG;
  } u;

  uint8_t TIMESLOT_ALLOCATION;
} Channel_Group_t;

typedef struct
{
  /* Channel_Group_t Channel_Group
   * At least one
   * the first one is unpacked in the index
   */
  uint8_t Count_Channel_Group;
  Channel_Group_t Channel_Group[8];
} Channel_List_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;

  uint8_t PAGE_MODE;
  uint8_t CHANGE_MARK;
  uint8_t INDEX;
  uint8_t COUNT;

  Channel_List_t Channel_List;

} PSI4_t;


/* < PSI5 message content > */
typedef struct
{
  uint8_t existRepParamsFDD;
  uint8_t RepQuantFDD;
  uint8_t MultiratReportingFDD;

  uint8_t existReportingParamsFDD;
  uint8_t ReportingOffsetFDD;
  uint8_t ReportingThresholdFDD;

  uint8_t existMultiratReportingTDD;
  uint8_t MultiratReportingTDD;

  uint8_t existOffsetThresholdTDD;
  uint8_t ReportingOffsetTDD;
  uint8_t ReportingThresholdTDD;
} GPRSMeasurementParams3G_PSI5_t;

typedef struct
{
  uint8_t  REPORT_TYPE;
  uint8_t  REPORTING_RATE;
  uint8_t  INVALID_BSIC_REPORTING;
  uint8_t Exist_NCC_PERMITTED;
  uint8_t  NCC_PERMITTED;

  bool Exist_GPRSMeasurementParams;
  MeasurementParams_t   GPRSMeasurementParams;
  bool Exist_GPRSMeasurementParams3G;
  GPRSMeasurementParams3G_PSI5_t  GPRSMeasurementParams3G;
} ENH_Reporting_Parameters_t;

typedef struct
{
  uint8_t Exist_OffsetThreshold_700;
  OffsetThreshold_t OffsetThreshold_700;
  uint8_t Exist_OffsetThreshold_810;
  OffsetThreshold_t OffsetThreshold_810;
} PSI5_AdditionsR7;

typedef struct
{
  uint8_t Exist_GPRS_AdditionalMeasurementParams3G;
  GPRS_AdditionalMeasurementParams3G_t GPRS_AdditionalMeasurementParams3G;
  uint8_t Exist_AdditionsR7;
  PSI5_AdditionsR7 AdditionsR7;
} PSI5_AdditionsR5;

typedef struct
{
  uint8_t Exist_ENH_Reporting_Param;
  ENH_Reporting_Parameters_t ENH_Reporting_Param;
  uint8_t Exist_AdditionsR5;
  PSI5_AdditionsR5 AdditionisR5;
} PSI5_AdditionsR99;

typedef struct
{
  uint8_t MESSAGE_TYPE;

  uint8_t PAGE_MODE;
  uint8_t CHANGE_MARK;
  uint8_t INDEX;
  uint8_t COUNT;

  uint8_t Eixst_NC_Meas_Param;
  NC_Measurement_Parameters_t NC_Meas_Param;
  uint8_t Exist_AdditionsR99;
  PSI5_AdditionsR99 AdditionsR99;
} PSI5_t;




/* < PSI13 message content >
 * Combined with SI13
 */
typedef struct
{
  uint8_t Exist_LB_MS_TXPWR_MAX_CCH;
  uint8_t LB_MS_TXPWR_MAX_CCH;
  uint8_t SI2n_SUPPORT;
}PSI13_AdditionsR6;

typedef PSI13_AdditionsR6 SI13_AdditionsR6;

typedef struct
{
  uint8_t               SI_STATUS_IND;
  uint8_t               Exist_AdditionsR6;
  PSI13_AdditionsR6     AdditionsR6;
}PSI13_AdditionsR4;

typedef PSI13_AdditionsR4 SI13_AdditionsR4;

typedef struct
{
  uint8_t               SGSNR;
  bool                  Exist_AdditionsR4;
  PSI13_AdditionsR4     AdditionsR4;
}PSI13_AdditionR99;

typedef PSI13_AdditionR99 SI13_AdditionR99;

typedef struct
{
  uint8_t Exist;
  uint8_t MESSAGE_TYPE;

  uint8_t PAGE_MODE;
  uint8_t BCCH_CHANGE_MARK;
  uint8_t SI_CHANGE_FIELD;

  uint8_t Exist_MA;
  uint8_t SI13_CHANGE_MARK;
  GPRS_Mobile_Allocation_t GPRS_Mobile_Allocation;

  uint8_t UnionType;
  union
  {
    PBCCH_Not_present_t PBCCH_Not_present;
    PBCCH_present_t PBCCH_present;
  } u;

  bool                  Exist_AdditionsR99;
  PSI13_AdditionR99     AdditionsR99;
} PSI13_t;

/* SI_13_t is combined in the PSI13 structure */
typedef PSI13_t SI_13_t;

/* < Packet PRACH Parameters message content > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;


  PRACH_Control_t PRACH_Control;
} Packet_PRACH_Parameters_t;

/* < Packet Access Reject message content > */
typedef struct
{
  uint8_t UnionType;
  union
  {
    uint32_t TLLI;
    Packet_Request_Reference_t Packet_Request_Reference;
    Global_TFI_t Global_TFI;
  } u;
} RejectID_t;

typedef struct
{
  RejectID_t ID;

  uint8_t Exist_Wait;
  uint8_t WAIT_INDICATION;
  uint8_t WAIT_INDICATION_SIZE;
} Reject_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  uint8_t IndexToOur;
  uint8_t Count_Reject;
  Reject_t Reject[5];
} Packet_Access_Reject_t;

/* < Packet Cell Change Order message content > */
typedef struct
{
  uint8_t CELL_BAR_ACCESS_2;
  uint8_t EXC_ACC;
  uint8_t SAME_RA_AS_SERVING_CELL;

  uint8_t Exist_RXLEV_and_TXPWR;
  uint8_t GPRS_RXLEV_ACCESS_MIN;
  uint8_t GPRS_MS_TXPWR_MAX_CCH;

  uint8_t Exist_OFFSET_and_TIME;
  uint8_t GPRS_TEMPORARY_OFFSET;
  uint8_t GPRS_PENALTY_TIME;

  uint8_t Exist_GPRS_RESELECT_OFFSET;
  uint8_t GPRS_RESELECT_OFFSET;

  uint8_t Exist_HCS;
  HCS_t HCS;

  uint8_t Exist_SI13_PBCCH_Location;
  SI13_PBCCH_Location_t SI13_PBCCH_Location;
} Cell_Selection_2_t;

typedef struct
{
  uint8_t FREQUENCY_DIFF;
  uint8_t BSIC;
  Cell_Selection_t Cell_Selection;
} h_FreqBsicCell_t;

typedef struct
{
  uint8_t FREQ_DIFF_LENGTH;
  uint8_t FREQUENCY_DIFF;
  uint8_t BSIC;

  bool Exist_CellSelectionParams;
  Cell_Selection_2_t CellSelectionParams;
} CellSelectionParamsWithFreqDiff_t;

typedef struct
{
  uint16_t START_FREQUENCY;
  uint8_t BSIC;

  uint8_t Exist_Cell_Selection;
  Cell_Selection_2_t Cell_Selection;

  uint8_t NR_OF_FREQUENCIES;
  uint8_t FREQ_DIFF_LENGTH;


  CellSelectionParamsWithFreqDiff_t CellSelectionParamsWithFreqDiff[32];
} Add_Frequency_list_t;

typedef struct
{
  uint8_t REMOVED_FREQ_INDEX;
} Removed_Freq_Index_t;

typedef struct
{
  uint8_t Exist_REMOVED_FREQ;
  uint8_t NR_OF_REMOVED_FREQ;
  Removed_Freq_Index_t Removed_Freq_Index[32];

  uint8_t Count_Add_Frequency;
  Add_Frequency_list_t Add_Frequency[32];
} NC_Frequency_list_t;


typedef struct
{
  uint8_t NETWORK_CONTROL_ORDER;

  uint8_t Exist_NC;
  uint8_t NC_NON_DRX_PERIOD;
  uint8_t NC_REPORTING_PERIOD_I;
  uint8_t NC_REPORTING_PERIOD_T;

  uint8_t Exist_NC_FREQUENCY_LIST;
  NC_Frequency_list_t NC_Frequency_list;
} NC_Measurement_Parameters_with_Frequency_List_t;


typedef struct
{
  uint8_t BA_IND;
  uint8_t BA_IND_3G;
} BA_IND_t;

typedef struct
{
  uint8_t BA_USED;
  uint8_t BA_USED_3G;
} BA_USED_t;

typedef struct
{
  uint8_t RXLEV_SERVING_CELL;
} Serving_Cell_Data_t;

typedef struct
{
  uint8_t FREQUENCY_N;
  uint8_t Exist_BSIC_N;
  uint8_t BSIC_N;
  uint8_t RXLEV_N;
} NC_Measurements_t;

typedef struct
{
  uint8_t BCCH_FREQ_N;
  uint8_t BSIC_N;
  uint8_t RXLEV_N;
} RepeatedInvalid_BSIC_Info_t;

typedef struct
{
  uint8_t Exist_REPORTING_QUANTITY;
  uint8_t REPORTING_QUANTITY;
} REPORTING_QUANTITY_Instance_t;

typedef struct
{
  uint8_t NC_MODE;
  Serving_Cell_Data_t Serving_Cell_Data;

  uint8_t NUMBER_OF_NC_MEASUREMENTS;
  NC_Measurements_t NC_Measurements[6];  /* NC_Measurements * (val(NUMBER_OF_NC_MEASUREMENTS))
                                           Max 7 NC Measurements in one PACKET MEASUREMENT REPORT,
                                           but only 6 cells are updated in PACKET IDLE. */
} NC_Measurement_Report_t;

typedef struct
{
  uint8_t EXT_REPORTING_TYPE;

  uint8_t Exist_I_LEVEL;
  struct
  {
    uint8_t Exist;
    uint8_t I_LEVEL;
  } Slot[8];

  uint8_t NUMBER_OF_EXT_MEASUREMENTS;
  NC_Measurements_t EXT_Measurements[9];  /* EXT_Measurements * (val(NUMBER_OF_NC_MEASUREMENTS))
                                            Max 9 Ext Measurements in one PACKET MEASUREMENT REPORT */
} EXT_Measurement_Report_t;

typedef struct
{
  uint8_t CELL_LIST_INDEX_3G;
  uint8_t REPORTING_QUANTITY;
} Measurements_3G_t;

typedef struct
{
  uint32_t UTRAN_CGI;
  uint8_t Exist_PLMN_ID;
  PLMN_t   Plmn_ID;
  uint32_t CSG_ID;
  bool Access_Mode;
  uint8_t  REPORTING_QUANTITY;
} UTRAN_CSG_Measurement_Report_t;

typedef struct
{
  uint32_t EUTRAN_CGI;
  uint16_t Tracking_Area_Code;
  uint8_t Exist_PLMN_ID;
  PLMN_t   Plmn_ID;
  uint32_t CSG_ID;
  bool Access_Mode;
  uint8_t  REPORTING_QUANTITY;
} EUTRAN_CSG_Measurement_Report_t;

typedef struct
{
  bool      Exist_UTRAN_CSG_Meas_Rpt;
  UTRAN_CSG_Measurement_Report_t  UTRAN_CSG_Meas_Rpt;
  bool      Exist_EUTRAN_CSG_Meas_Rpt;
  EUTRAN_CSG_Measurement_Report_t  EUTRAN_CSG_Meas_Rpt;
} PMR_AdditionsR9_t;

typedef struct
{
  uint8_t EUTRAN_FREQUENCY_INDEX;
  uint16_t CELL_IDENTITY;
  uint8_t REPORTING_QUANTITY;
} EUTRAN_Measurement_Report_Body_t;

typedef struct
{
  uint8_t N_EUTRAN;
  EUTRAN_Measurement_Report_Body_t Report[4];
} EUTRAN_Measurement_Report_t;

typedef struct
{
  bool       Exist_EUTRAN_Meas_Rpt;
  EUTRAN_Measurement_Report_t  EUTRAN_Meas_Rpt;
  bool       Exist_AdditionsR9;
  PMR_AdditionsR9_t  AdditionsR9;
} PMR_AdditionsR8_t;

typedef struct
{
  bool         Exist_GRNTI;
  uint8_t       GRNTI;
  bool         Exist_AdditionsR8;
  PMR_AdditionsR8_t  AdditionsR8;
} PMR_AdditionsR5_t;

typedef struct
{
  bool         Exist_Info3G;
  uint8_t      UnionType;
  union
  {
    BA_USED_t BA_USED;
    uint8_t    PSI3_CHANGE_MARK;
  } u;
  uint8_t      PMO_USED;

  /* N_3G        bit(3): max value 7
   * Report part  (csn): {<3G_CELL_LIST_INDEX:bit(7)><REPORTING_QUANTITY:bit(6)>}*(val(N_3G + 1))
   * Max 6 3G measurement structs in one PMR
   */
  bool         Exist_MeasurementReport3G;
  uint8_t      N_3G;
  Measurements_3G_t Measurements_3G[6];

  bool         Exist_AdditionsR5;
  PMR_AdditionsR5_t  AdditionsR5;
} PMR_AdditionsR99_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint32_t TLLI;
  uint8_t Exist_PSI5_CHANGE_MARK;
  uint8_t PSI5_CHANGE_MARK;

  uint8_t UnionType;
  union
  {
    NC_Measurement_Report_t NC_Measurement_Report;
    EXT_Measurement_Report_t EXT_Measurement_Report;
  } u;

  bool Exist_AdditionsR99;
  PMR_AdditionsR99_t AdditionsR99;
} Packet_Measurement_Report_t;

#define INV_BSIC_LIST_LEN (16)

#define REPORT_QUANTITY_LIST_LEN (96) /* Specification specified up to 96 */

typedef struct
{
  uint8_t NC_MODE;
  uint8_t UnionType;
  union
  {
    BA_USED_t BA_USED;
    uint8_t PSI3_CHANGE_MARK;
  } u;

  uint8_t PMO_USED;
  uint8_t BSIC_Seen;
  uint8_t SCALE;

  uint8_t Exist_Serving_Cell_Data;
  Serving_Cell_Data_t Serving_Cell_Data;

  uint8_t Count_RepeatedInvalid_BSIC_Info;
  RepeatedInvalid_BSIC_Info_t RepeatedInvalid_BSIC_Info[INV_BSIC_LIST_LEN];

  uint8_t Exist_ReportBitmap;
  uint8_t Count_REPORTING_QUANTITY_Instances;
  REPORTING_QUANTITY_Instance_t REPORTING_QUANTITY_Instances[REPORT_QUANTITY_LIST_LEN];

} ENH_NC_Measurement_Report_t;

typedef struct
{
  uint8_t Exist_UTRAN_CSG_Target_Cell;
  UTRAN_CSG_Target_Cell_t UTRAN_CSG_Target_Cell;
  uint8_t Exist_EUTRAN_CSG_Target_Cell;
  EUTRAN_CSG_Target_Cell_t EUTRAN_CSG_Target_Cell;
} PEMR_AdditionsR9_t;

typedef struct
{
  bool      Exist_REPORTING_QUANTITY;
  uint8_t    REPORTING_QUANTITY;
} Bitmap_Report_Quantity_t;

typedef struct
{
  uint8_t BITMAP_LENGTH;
  Bitmap_Report_Quantity_t  Bitmap_Report_Quantity[128];
  bool      Exist_EUTRAN_Meas_Rpt;
  EUTRAN_Measurement_Report_t EUTRAN_Meas_Rpt;
  bool       Exist_AdditionsR9;
  PEMR_AdditionsR9_t AdditionsR9;
} PEMR_AdditionsR8_t;

typedef struct
{
  bool      Exist_GRNTI_Ext;
  uint8_t    GRNTI_Ext;
  bool      Exist_AdditionsR8;
  PEMR_AdditionsR8_t  AdditionsR8;
} PEMR_AdditionsR5_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  uint32_t TLLI;

  ENH_NC_Measurement_Report_t Measurements;

  bool      Exist_AdditionsR5;
  PEMR_AdditionsR5_t  AdditionsR5;
} Packet_Enh_Measurement_Report_t;

typedef struct
{
  uint8_t RXLEV_SERVING_CELL;

  uint8_t NUMBER_OF_NC_MEASUREMENTS;
  NC_Measurements_t NC_Measurements[6];  /* NC_Measurements * (val(NUMBER_OF_NC_MEASUREMENTS))
                                           Max 7 NC Measurements in one PACKET MEASUREMENT REPORT,
                                           but only 6 cells are updated in PACKET IDLE. */
} CCN_Measurement_Report_t;

typedef struct
{
  uint16_t ARFCN;
  uint8_t BSIC;
} Target_Cell_GSM_Notif_t;

typedef struct
{
  uint16_t FDD_ARFCN;
  uint8_t Exist_Bandwith_FDD;
  uint8_t BANDWITH_FDD;
  uint16_t SCRAMBLING_CODE;
} FDD_Target_Cell_Notif_t;

typedef struct
{
  uint16_t TDD_ARFCN;
  uint8_t Exist_Bandwith_TDD;
  uint8_t BANDWITH_TDD;
  uint8_t CELL_PARAMETER;
  uint8_t Sync_Case_TSTD;
} TDD_Target_Cell_Notif_t;

typedef struct
{
  uint8_t Exist_FDD_Description;
  FDD_Target_Cell_Notif_t FDD_Target_Cell_Notif;
  uint8_t Exist_TDD_Description;
  TDD_Target_Cell_Notif_t TDD_Target_Cell;
  uint8_t REPORTING_QUANTITY;
} Target_Cell_3G_Notif_t;

typedef struct
{
  uint16_t EARFCN;
  uint8_t Exist_Measurement_Bandwidth;
  uint8_t Measurement_Bandwidth;
  uint16_t Physical_Layer_Cell_Identity;
  uint8_t Reporting_Quantity;
} Target_EUTRAN_Cell_Notif_t;

typedef struct
{
  uint8_t EUTRAN_FREQUENCY_INDEX;
  uint16_t CELL_IDENTITY;
  uint8_t REPORTING_QUANTITY;
} Eutran_Ccn_Measurement_Report_Cell_t;

typedef struct
{
  bool      ThreeG_BA_USED;
  uint8_t   N_EUTRAN;
  Eutran_Ccn_Measurement_Report_Cell_t Eutran_Ccn_Measurement_Report_Cell[4];
} Eutran_Ccn_Measurement_Report_t;

typedef struct
{
  uint8_t Exist_Arfcn;
  uint16_t Arfcn;
  uint8_t bsic;
  uint8_t Exist_3G_Target_Cell;
  Target_Cell_3G_Notif_t Target_Cell_3G_Notif;
  uint8_t Exist_Eutran_Target_Cell;
  Target_EUTRAN_Cell_Notif_t Target_EUTRAN_Cell;
  uint8_t Exist_Eutran_Ccn_Measurement_Report;
  Eutran_Ccn_Measurement_Report_t Eutran_Ccn_Measurement_Report;
} Target_Cell_4G_Notif_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    UTRAN_CSG_Measurement_Report_t UTRAN_CSG_Measurement_Report;
    EUTRAN_CSG_Measurement_Report_t EUTRAN_CSG_Measurement_Report;
  } u;
  uint8_t Exist_Eutran_Ccn_Measurement_Report;
  Eutran_Ccn_Measurement_Report_t Eutran_Ccn_Measurement_Report;
} Target_Cell_CSG_Notif_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Target_Cell_4G_Notif_t Target_Cell_4G_Notif;
    Target_Cell_CSG_Notif_t Target_Cell_CSG_Notif;
  } u;
} Target_Other_RAT_2_Notif_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Target_Cell_3G_Notif_t Target_Cell_3G_Notif;
    Target_Other_RAT_2_Notif_t Target_Other_RAT_2_Notif;
  } u;
} Target_Other_RAT_Notif_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Target_Cell_GSM_Notif_t Target_Cell_GSM_Notif;
    Target_Other_RAT_Notif_t Target_Other_RAT_Notif;
  } u;
} Target_Cell_t;

typedef struct
{
  uint8_t Exist_BA_USED_3G;
  uint8_t BA_USED_3G;

  uint8_t N_3G;
  Measurements_3G_t Measurements_3G[6];
} PCCN_AdditionsR6_t;

/* < Packet Cell Change Notification message contents > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  Global_TFI_t Global_TFI;

  Target_Cell_t Target_Cell;

  uint8_t UnionType;
  union
  {
    uint8_t BA_IND;
    uint8_t PSI3_CHANGE_MARK;
  } u;
  uint8_t PMO_USED;
  uint8_t PCCN_SENDING;
  CCN_Measurement_Report_t CCN_Measurement_Report;

  bool Exist_AdditionsR6;
  PCCN_AdditionsR6_t AdditionsR6;
} Packet_Cell_Change_Notification_t;

/* < Packet Cell Change Order message contents > */


typedef struct
{
  uint8_t  FrequencyScrolling;
  uint8_t  BSIC;
} BSICDesc_t;


#define MAX_BSIC_DESCS (19) /* Due to message size (23 bytes) and header etc,
                             * there cannot be more than 19 DESCS.
                             */

typedef struct
{
  bool         Exist_IndexStartBA;
  uint8_t      IndexStartBA;
  uint8_t      BSIC;
  uint8_t      NumRemainingBSICs;
  BSICDesc_t  BSICDesc[MAX_BSIC_DESCS];
} BSICList_t;

typedef BSICList_t GPRSBSICList_t;

#define MAX_RTD_VALUES (6)

typedef struct
{
  uint8_t NumRTDValues;
  uint16_t RTD[MAX_RTD_VALUES];
} RTDValues_t;

typedef struct
{
  bool Exist_StartValue;
  uint8_t  StartValue;
} BAIndexStartRTD_t;

#define MAX_RTD_FREQS (32)

typedef struct
{
  BAIndexStartRTD_t BAIndexStart;
  uint8_t NumFreqs;
  RTDValues_t RTD_s[MAX_RTD_FREQS];
} RTDList_t;

typedef struct
{
  bool       Exist_ListRTD6;
  RTDList_t ListRTD6;

  bool       Exist_ListRTD12;
  RTDList_t ListRTD12;
} RealTimeDiffs_t;


typedef MeasurementParams_t GPRSMeasurementParams_PMO_PCCO_t;

typedef struct {
  bool               existMultiratReporting;
  uint8_t            MultiratReporting;

  bool               existOffsetThreshold;
  OffsetThreshold_t OffsetThreshold;
} MultiratParams3G_t;

typedef struct
{
  uint8_t             Qsearch_P;
  uint8_t             SearchPrio3G;

  bool                existRepParamsFDD;
  uint8_t             RepQuantFDD;
  uint8_t             MultiratReportingFDD;

  bool                existOffsetThreshold;
  OffsetThreshold_t  OffsetThreshold;

  MultiratParams3G_t ParamsTDD;
  MultiratParams3G_t ParamsCDMA2000;
} ENH_GPRSMeasurementParams3G_PMO_t;


typedef struct
{
  uint8_t             Qsearch_P;
  uint8_t             SearchPrio3G;

  bool                existRepParamsFDD;
  uint8_t             RepQuantFDD;
  uint8_t             MultiratReportingFDD;

  bool                existOffsetThreshold;
  OffsetThreshold_t  OffsetThreshold;

  MultiratParams3G_t ParamsTDD;
} ENH_GPRSMeasurementParams3G_PCCO_t;


typedef struct
{
  uint8_t Qsearch_p;
  uint8_t SearchPrio3G;

  uint8_t existRepParamsFDD;
  uint8_t RepQuantFDD;
  uint8_t MultiratReportingFDD;

  uint8_t existReportingParamsFDD;
  uint8_t ReportingOffsetFDD;
  uint8_t ReportingThresholdFDD;

  uint8_t existMultiratReportingTDD;
  uint8_t MultiratReportingTDD;

  uint8_t existOffsetThresholdTDD;
  uint8_t ReportingOffsetTDD;
  uint8_t ReportingThresholdTDD;
} GPRSMeasurementParams3G_t;

typedef struct
{
  uint8_t REMOVED_3GCELL_INDEX;
  uint8_t CELL_DIFF_LENGTH_3G;
  uint8_t CELL_DIFF_3G;
} N2_t;

typedef struct
{
  uint8_t N2_Count;
  N2_t N2s[32];
} N1_t;

typedef struct
{
  uint8_t N1_Count;
  N1_t N1s[4];
} Removed3GCellDescription_t;

typedef struct
{
  uint8_t Complete_This;
} CDMA2000_Description_t;

typedef struct {
  uint8_t ZERO;
  uint16_t UARFCN;
  uint8_t Indic0;
  uint8_t NrOfCells;
  uint8_t BitsInCellInfo;
  uint8_t CellInfo[16]; /* bitmap compressed according to "Range 1024" algorithm (04.18/9.1.54) */
} UTRAN_FDD_NeighbourCells_t;

typedef struct {
  bool                            existBandwidth;
  uint8_t                         Bandwidth;
  uint8_t                         NrOfFrequencies;
  UTRAN_FDD_NeighbourCells_t     CellParams[8];
} UTRAN_FDD_Description_t;

typedef struct {
  uint8_t ZERO;
  uint16_t UARFCN;
  uint8_t Indic0;
  uint8_t NrOfCells;
  uint8_t BitsInCellInfo;
  uint8_t CellInfo[16]; /* bitmap compressed according to "Range 512" algorithm */
} UTRAN_TDD_NeighbourCells_t;

typedef struct {
  bool                            existBandwidth;
  uint8_t                         Bandwidth;
  uint8_t                         NrOfFrequencies;
  UTRAN_TDD_NeighbourCells_t    CellParams[8];
} UTRAN_TDD_Description_t;

typedef struct
{
  uint8_t Exist_Index_Start_3G;
  uint8_t Index_Start_3G;
  uint8_t Exist_Absolute_Index_Start_EMR;
  uint8_t Absolute_Index_Start_EMR;
  uint8_t Exist_UTRAN_FDD_Description;
  UTRAN_FDD_Description_t UTRAN_FDD_Description;
  uint8_t Exist_UTRAN_TDD_Description;
  UTRAN_TDD_Description_t UTRAN_TDD_Description;
  uint8_t Exist_CDMA2000_Description;
  CDMA2000_Description_t CDMA2000_Description;
  uint8_t Exist_Removed3GCellDescription;
  Removed3GCellDescription_t Removed3GCellDescription;
} NeighbourCellDescription3G_PMO_t;

typedef struct
{
  uint8_t Exist_Index_Start_3G;
  uint8_t Index_Start_3G;
  uint8_t Exist_Absolute_Index_Start_EMR;
  uint8_t Absolute_Index_Start_EMR;
  uint8_t Exist_UTRAN_FDD_Description;
  UTRAN_FDD_Description_t UTRAN_FDD_Description;
  uint8_t Exist_UTRAN_TDD_Description;
  UTRAN_TDD_Description_t UTRAN_TDD_Description;
  uint8_t Exist_Removed3GCellDescription;
  Removed3GCellDescription_t Removed3GCellDescription;
} NeighbourCellDescription3G_PCCO_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    BA_IND_t BA_IND;
    uint8_t PSI3_CHANGE_MARK;
  } u;

  uint8_t  PMO_IND;

  uint8_t  REPORT_TYPE;
  uint8_t  REPORTING_RATE;
  uint8_t  INVALID_BSIC_REPORTING;

  bool Exist_NeighbourCellDescription3G;
  NeighbourCellDescription3G_PMO_t NeighbourCellDescription3G;

  bool Exist_GPRSReportPriority;
  GPRSReportPriority_t GPRSReportPriority;

  bool Exist_GPRSMeasurementParams;
  GPRSMeasurementParams_PMO_PCCO_t GPRSMeasurementParams;
  bool Exist_GPRSMeasurementParams3G;
  ENH_GPRSMeasurementParams3G_PMO_t GPRSMeasurementParams3G;
} ENH_Measurement_Parameters_PMO_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    BA_IND_t BA_IND;
    uint8_t PSI3_CHANGE_MARK;
  } u;

  uint8_t  PMO_IND;

  uint8_t  REPORT_TYPE;
  uint8_t  REPORTING_RATE;
  uint8_t  INVALID_BSIC_REPORTING;

  bool Exist_NeighbourCellDescription3G;
  NeighbourCellDescription3G_PCCO_t NeighbourCellDescription3G;

  bool Exist_GPRSReportPriority;
  GPRSReportPriority_t GPRSReportPriority;

  bool Exist_GPRSMeasurementParams;
  GPRSMeasurementParams_PMO_PCCO_t GPRSMeasurementParams;
  bool Exist_GPRSMeasurementParams3G;
  ENH_GPRSMeasurementParams3G_PCCO_t GPRSMeasurementParams3G;
} ENH_Measurement_Parameters_PCCO_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint32_t TLLI;
  } u;
} PacketCellChangeOrderID_t;

typedef struct
{
  uint8_t CELL_BAR_QUALIFY_3;
  uint8_t Exist_SI13_Alt_PBCCH_Location;
  SI13_PBCCH_Location_t SI13_Alt_PBCCH_Location;
} lu_ModeCellSelectionParameters_t;

typedef struct
{
  uint8_t Exist_lu_ModeCellSelectionParams;
  lu_ModeCellSelectionParameters_t lu_ModeCellSelectionParameters;
} lu_ModeCellSelectionParams_t;

typedef struct
{
  lu_ModeCellSelectionParams_t lu_ModeCellSelectionParameters;
  uint8_t NR_OF_FREQUENCIES;
  lu_ModeCellSelectionParams_t lu_ModeCellSelectionParams[32];
} lu_ModeNeighbourCellParams_t;

typedef struct
{
  uint8_t CELL_BAR_QUALIFY_3;
  uint8_t SAME_RA_AS_SERVING_CELL;

  uint8_t Exist_RXLEV_and_TXPWR;
  uint8_t GPRS_RXLEV_ACCESS_MIN;
  uint8_t GPRS_MS_TXPWR_MAX_CCH;

  uint8_t Exist_OFFSET_and_TIME;
  uint8_t GPRS_TEMPORARY_OFFSET;
  uint8_t GPRS_PENALTY_TIME;

  uint8_t Exist_GPRS_RESELECT_OFFSET;
  uint8_t GPRS_RESELECT_OFFSET;

  uint8_t Exist_HCS;
  HCS_t HCS;

  uint8_t Exist_SI13_Alt_PBCCH_Location;
  SI13_PBCCH_Location_t SI13_Alt_PBCCH_Location;
} lu_ModeOnlyCellSelection_t;

typedef struct
{
  uint8_t FREQ_DIFF_LENGTH;
  uint8_t FREQUENCY_DIFF;
  uint8_t BSIC;

  bool Exist_lu_ModeOnlyCellSelectionParams;
  lu_ModeOnlyCellSelection_t lu_ModeOnlyCellSelectionParams;
} lu_ModeOnlyCellSelectionParamsWithFreqDiff_t;

typedef struct
{
  uint16_t START_FREQUENCY;
  uint8_t BSIC;

  uint8_t Exist_lu_ModeCellSelection;
  lu_ModeOnlyCellSelection_t lu_ModeOnlyCellSelection;

  uint8_t NR_OF_FREQUENCIES;
  uint8_t FREQ_DIFF_LENGTH;

  lu_ModeOnlyCellSelectionParamsWithFreqDiff_t lu_ModeOnlyCellSelectionParamsWithFreqDiff[32];
} Add_lu_ModeOnlyFrequencyList_t;

typedef struct
{
  uint8_t Count_Add_lu_ModeOnlyFrequencyList;
  Add_lu_ModeOnlyFrequencyList_t Add_lu_ModeOnlyFrequencyList[32];
} NC_lu_ModeOnlyCapableCellList_t;


typedef struct
{
  uint8_t                  NumberOfFrequencyIndexes;
  uint8_t                  UTRAN_FREQUENCY_INDEX_a[18];

  bool                     existUTRAN_PRIORITY;
  uint8_t                  UTRAN_PRIORITY;

  uint8_t                  THRESH_UTRAN_high;

  bool                     existTHRESH_UTRAN_low;
  uint8_t                  THRESH_UTRAN_low;

  bool                     existUTRAN_QRXLEVMIN;
  uint8_t                  UTRAN_QRXLEVMIN;
} RepeatedUTRAN_PriorityParameters_t;

typedef struct
{
  bool                                existDEFAULT_UTRAN_Parameters;
  uint8_t                             DEFAULT_UTRAN_PRIORITY;
  uint8_t                             DEFAULT_THRESH_UTRAN;
  uint8_t                             DEFAULT_UTRAN_QRXLEVMIN;

  uint8_t                             NumberOfPriorityParameters;
  RepeatedUTRAN_PriorityParameters_t  RepeatedUTRAN_PriorityParameters_a[8];
} PriorityParametersDescription3G_PMO_t;

typedef struct
{
  bool existEUTRAN_FDD_REPORTING_THRESHOLD_OFFSET;
  uint8_t  EUTRAN_FDD_REPORTING_THRESHOLD;
  bool existEUTRAN_FDD_REPORTING_THRESHOLD_2;
  uint8_t  EUTRAN_FDD_REPORTING_THRESHOLD_2;
  bool existEUTRAN_FDD_REPORTING_OFFSET;
  uint8_t  EUTRAN_FDD_REPORTING_OFFSET;

  bool existEUTRAN_TDD_REPORTING_THRESHOLD_OFFSET;
  uint8_t  EUTRAN_TDD_REPORTING_THRESHOLD;
  bool existEUTRAN_TDD_REPORTING_THRESHOLD_2;
  uint8_t  EUTRAN_TDD_REPORTING_THRESHOLD_2;
  bool existEUTRAN_TDD_REPORTING_OFFSET;
  uint8_t  EUTRAN_TDD_REPORTING_OFFSET;
} EUTRAN_REPORTING_THRESHOLD_OFFSET_t;

typedef struct
{
  uint8_t                              Qsearch_P_EUTRAN;
  uint8_t                              EUTRAN_REP_QUANT;
  uint8_t                              EUTRAN_MULTIRAT_REPORTING;
  EUTRAN_REPORTING_THRESHOLD_OFFSET_t EUTRAN_REPORTING_THRESHOLD_OFFSET;
} GPRS_EUTRAN_MeasurementParametersDescription_t;

typedef struct
{
  uint16_t EARFCN;
  bool existMeasurementBandwidth;
  uint8_t  MeasurementBandwidth;
} RepeatedEUTRAN_Cells_t;

typedef struct
{
  uint8_t                  nbrOfEUTRAN_Cells;
  RepeatedEUTRAN_Cells_t  EUTRAN_Cells_a[6];

  bool                     existEUTRAN_PRIORITY;
  uint8_t                  EUTRAN_PRIORITY;

  uint8_t                  THRESH_EUTRAN_high;

  bool                     existTHRESH_EUTRAN_low;
  uint8_t                  THRESH_EUTRAN_low;

  bool                     existEUTRAN_QRXLEVMIN;
  uint8_t                  EUTRAN_QRXLEVMIN;
} RepeatedEUTRAN_NeighbourCells_t;

typedef struct
{
  uint16_t PCID;
} PCID_t;

typedef struct
{
  uint8_t PCID_Pattern_length;
  uint8_t PCID_Pattern;
  uint8_t PCID_Pattern_sense;
} PCID_Pattern_t;

typedef struct
{
  uint8_t         NumberOfPCIDs;
  uint16_t        PCID_a[11];

  bool            existPCID_BITMAP_GROUP;
  uint8_t         PCID_BITMAP_GROUP;

  uint8_t         NumberOfPCID_Patterns;
  PCID_Pattern_t PCID_Pattern_a[19];
} PCID_Group_IE_t;

typedef struct
{
  uint8_t EUTRAN_FREQUENCY_INDEX;
} EUTRAN_FREQUENCY_INDEX_t;

typedef struct
{
  PCID_Group_IE_t          NotAllowedCells;
  uint8_t                   NumberOfFrequencyIndexes;
  EUTRAN_FREQUENCY_INDEX_t EUTRAN_FREQUENCY_INDEX_a[28];
} RepeatedEUTRAN_NotAllowedCells_t;

typedef struct
{
  uint8_t                   NumberOfMappings;
  PCID_Group_IE_t          PCID_ToTA_Mapping_a[14];

  uint8_t                   NumberOfFrequencyIndexes;
  EUTRAN_FREQUENCY_INDEX_t EUTRAN_FREQUENCY_INDEX_a[28];
} RepeatedEUTRAN_PCID_to_TA_mapping_t;

typedef struct
{
  uint8_t EUTRAN_CCN_ACTIVE;

  bool                                           existGPRS_EUTRAN_MeasurementParametersDescription;
  GPRS_EUTRAN_MeasurementParametersDescription_t GPRS_EUTRAN_MeasurementParametersDescription;

  uint8_t                                        nbrOfRepeatedEUTRAN_NeighbourCellsStructs;
  RepeatedEUTRAN_NeighbourCells_t                RepeatedEUTRAN_NeighbourCells_a[4];

  uint8_t                                        NumberOfNotAllowedCells;
  RepeatedEUTRAN_NotAllowedCells_t               RepeatedEUTRAN_NotAllowedCells_a[14];

  uint8_t                                        NumberOfMappings;
  RepeatedEUTRAN_PCID_to_TA_mapping_t            RepeatedEUTRAN_PCID_to_TA_mapping_a[19];
} EUTRAN_ParametersDescription_PMO_t;

typedef struct
{
  uint8_t GERAN_PRIORITY;
  uint8_t THRESH_Priority_Search;
  uint8_t THRESH_GSM_low;
  uint8_t H_PRIO;
  uint8_t T_Reselection;
} ServingCellPriorityParametersDescription_t;

typedef struct
{
  bool                                       existServingCellPriorityParametersDescription;
  ServingCellPriorityParametersDescription_t ServingCellPriorityParametersDescription;

  bool                                       existPriorityParametersDescription3G_PMO;
  PriorityParametersDescription3G_PMO_t      PriorityParametersDescription3G_PMO;

  bool                                       existEUTRAN_ParametersDescription_PMO;
  EUTRAN_ParametersDescription_PMO_t         EUTRAN_ParametersDescription_PMO;
} PriorityAndEUTRAN_ParametersDescription_PMO_t;

typedef struct
{
  uint8_t PSC_Pattern_length;
  uint8_t PSC_Pattern;
  bool PSC_Pattern_sense;
} PSC_Pattern_t;

typedef struct
{
  uint8_t PSC_Count;
  uint16_t PSC[32];
  uint8_t PSC_Pattern_Count;
  PSC_Pattern_t PSC_Pattern[32];
} PSC_Group_t;

typedef struct
{
  PSC_Group_t CSG_PSC_SPLIT;
  uint8_t     Count;
  uint8_t     UTRAN_FREQUENCY_INDEX[32];
} ThreeG_CSG_Description_Body_t;

typedef struct
{
  uint8_t Count;
  ThreeG_CSG_Description_Body_t  ThreeG_CSG_Description_Body[32];
} ThreeG_CSG_Description_t;

typedef struct
{
  PSC_Group_t CSG_PCI_SPLIT;
  uint8_t Count;
  uint8_t EUTRAN_FREQUENCY_INDEX[32];
} EUTRAN_CSG_Description_Body_t;

typedef struct
{
  uint8_t Count;
  EUTRAN_CSG_Description_Body_t EUTRAN_CSG_Description_Body[32];
} EUTRAN_CSG_Description_t;

typedef struct
{
  bool      existMeasurement_Control_EUTRAN;
  bool      Measurement_Control_EUTRAN;
  uint8_t   EUTRAN_FREQUENCY_INDEX_top;
  uint8_t   Count_EUTRAN_FREQUENCY_INDEX;
  uint8_t   EUTRAN_FREQUENCY_INDEX[32];

  bool      existMeasurement_Control_UTRAN;
  bool      Measurement_Control_UTRAN;
  uint8_t   UTRAN_FREQUENCY_INDEX_top;
  uint8_t   Count_UTRAN_FREQUENCY_INDEX;
  uint8_t   UTRAN_FREQUENCY_INDEX[32];
} Meas_Ctrl_Param_Desp_t;

typedef struct
{
  uint8_t   THRESH_EUTRAN_high_Q;
  bool existTHRESH_EUTRAN_low_Q;
  uint8_t   THRESH_EUTRAN_low_Q;
  bool existEUTRAN_QQUALMIN;
  uint8_t   EUTRAN_QQUALMIN;
  bool existEUTRAN_RSRPmin;
  uint8_t   EUTRAN_RSRPmin;
} Reselection_Based_On_RSRQ_t;

typedef struct
{
  uint8_t Count_EUTRAN_FREQUENCY_INDEX;
  uint8_t EUTRAN_FREQUENCY_INDEX[32];
  uint8_t UnionType;
  union
  {
    uint8_t          EUTRAN_Qmin;
    Reselection_Based_On_RSRQ_t Reselection_Based_On_RSRQ;
  } u;
} Rept_EUTRAN_Enh_Cell_Resel_Param_t;

typedef struct
{
  uint8_t                            Count;
  Rept_EUTRAN_Enh_Cell_Resel_Param_t  Repeated_EUTRAN_Enhanced_Cell_Reselection_Parameters[32];
} Enh_Cell_Reselect_Param_Desp_t;

typedef struct
{
  bool      existUTRAN_CSG_FDD_REPORTING_THRESHOLD;
  uint8_t    UTRAN_CSG_FDD_REPORTING_THRESHOLD;
  uint8_t    UTRAN_CSG_FDD_REPORTING_THRESHOLD_2;
  bool      existUTRAN_CSG_TDD_REPORTING_THRESHOLD;
  uint8_t    UTRAN_CSG_TDD_REPORTING_THRESHOLD;
} UTRAN_CSG_Cells_Reporting_Desp_t;

typedef struct
{
  bool      existEUTRAN_CSG_FDD_REPORTING_THRESHOLD;
  uint8_t    EUTRAN_CSG_FDD_REPORTING_THRESHOLD;
  uint8_t    EUTRAN_CSG_FDD_REPORTING_THRESHOLD_2;
  bool      existEUTRAN_CSG_TDD_REPORTING_THRESHOLD;
  uint8_t    EUTRAN_CSG_TDD_REPORTING_THRESHOLD;
  uint8_t    EUTRAN_CSG_TDD_REPORTING_THRESHOLD_2;
} EUTRAN_CSG_Cells_Reporting_Desp_t;

typedef struct
{
  bool                              existUTRAN_CSG_Cells_Reporting_Description;
  UTRAN_CSG_Cells_Reporting_Desp_t   UTRAN_CSG_Cells_Reporting_Description;
  bool                              existEUTRAN_CSG_Cells_Reporting_Description;
  EUTRAN_CSG_Cells_Reporting_Desp_t  EUTRAN_CSG_Cells_Reporting_Description;
} CSG_Cells_Reporting_Desp_t;

typedef struct
{
  bool                           existEnhanced_Cell_Reselection_Parameters_Description;
  Enh_Cell_Reselect_Param_Desp_t  Enhanced_Cell_Reselection_Parameters_Description;

  bool                           existCSG_Cells_Reporting_Description;
  CSG_Cells_Reporting_Desp_t      CSG_Cells_Reporting_Description;
} PMO_AdditionsR9_t;

typedef struct
{
  uint8_t dummy;
} Delete_All_Stored_Individual_Priorities_t;

typedef struct
{
  uint8_t Count;
  uint16_t FDD_ARFCN[32];
} Individual_UTRAN_Priority_FDD_t;

typedef struct
{
  uint8_t Count;
  uint16_t TDD_ARFCN[32];
} Individual_UTRAN_Priority_TDD_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Individual_UTRAN_Priority_FDD_t Individual_UTRAN_Priority_FDD;
    Individual_UTRAN_Priority_TDD_t Individual_UTRAN_Priority_TDD;
  } u;
  uint8_t UTRAN_PRIORITY;
} Repeated_Individual_UTRAN_Priority_Parameters_t;

typedef struct
{
  uint8_t Exist_DEFAULT_UTRAN_PRIORITY;
  uint8_t DEFAULT_UTRAN_PRIORITY;
  uint8_t Repeated_Individual_UTRAN_Priority_Parameters_Count;
  Repeated_Individual_UTRAN_Priority_Parameters_t Repeated_Individual_UTRAN_Priority_Parameters[32];
} ThreeG_Individual_Priority_Parameters_Description_t;

typedef struct
{
  uint8_t Count;
  uint16_t EARFCN[32];
  uint8_t EUTRAN_PRIORITY;
} Repeated_Individual_EUTRAN_Priority_Parameters_t;

typedef struct
{
  uint8_t Exist_DEFAULT_EUTRAN_PRIORITY;
  uint8_t DEFAULT_EUTRAN_PRIORITY;
  uint8_t Count;
  Repeated_Individual_EUTRAN_Priority_Parameters_t Repeated_Individual_EUTRAN_Priority_Parameters[32];
} EUTRAN_Individual_Priority_Parameters_Description_t;

typedef struct
{
  uint8_t GERAN_PRIORITY;
  uint8_t Exist_3G_Individual_Priority_Parameters_Description;
  ThreeG_Individual_Priority_Parameters_Description_t ThreeG_Individual_Priority_Parameters_Description;
  uint8_t Exist_EUTRAN_Individual_Priority_Parameters_Description;
  EUTRAN_Individual_Priority_Parameters_Description_t EUTRAN_Individual_Priority_Parameters_Description;
  uint8_t Exist_T3230_timeout_value;
  uint8_t T3230_timeout_value;
} Provide_Individual_Priorities_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    Delete_All_Stored_Individual_Priorities_t Delete_All_Stored_Individual_Priorities;
    Provide_Individual_Priorities_t Provide_Individual_Priorities;
  } u;
} Individual_Priorities_t;

typedef struct
{
  bool              existBA_IND_3G_PMO_IND;
  uint8_t           BA_IND_3G;
  uint8_t           PMO_IND;

  bool              existPriorityAndEUTRAN_ParametersDescription_PMO;
  PriorityAndEUTRAN_ParametersDescription_PMO_t PriorityAndEUTRAN_ParametersDescription_PMO;

  bool              existIndividualPriorities_PMO;
  Individual_Priorities_t  IndividualPriorities_PMO;

  bool              existThreeG_CSG_Description;
  ThreeG_CSG_Description_t  ThreeG_CSG_Description_PMO;

  bool              existEUTRAN_CSG_Description;
  EUTRAN_CSG_Description_t  EUTRAN_CSG_Description_PMO;

  bool              existMeasurement_Control_Parameters_Description;
  Meas_Ctrl_Param_Desp_t Measurement_Control_Parameters_Description_PMO;

  bool              existAdditionsR9;
  PMO_AdditionsR9_t AdditionsR9;
} PMO_AdditionsR8_t;

typedef struct
{
  bool              existREPORTING_OFFSET_THRESHOLD_700;
  uint8_t           REPORTING_OFFSET_700;
  uint8_t           REPORTING_THRESHOLD_700;

  bool              existREPORTING_OFFSET_THRESHOLD_810;
  uint8_t           REPORTING_OFFSET_810;
  uint8_t           REPORTING_THRESHOLD_810;

  uint8_t existAdditionsR8;
  PMO_AdditionsR8_t additionsR8;
} PMO_AdditionsR7_t;

typedef struct
{
  uint8_t CCN_ACTIVE_3G;
  uint8_t existAdditionsR7;
  PMO_AdditionsR7_t additionsR7;
} PMO_AdditionsR6_t;

typedef struct
{
  uint8_t CCN_ACTIVE_3G;
} PCCO_AdditionsR6_t;

typedef struct
{
  uint8_t existGRNTI_Extension;
  uint8_t GRNTI;
  uint8_t exist_lu_ModeNeighbourCellParams;
  uint8_t count_lu_ModeNeighbourCellParams;
  lu_ModeNeighbourCellParams_t lu_ModeNeighbourCellParams[32];
  uint8_t existNC_lu_ModeOnlyCapableCellList;
  NC_lu_ModeOnlyCapableCellList_t NC_lu_ModeOnlyCapableCellList;
  uint8_t existGPRS_AdditionalMeasurementParams3G;
  GPRS_AdditionalMeasurementParams3G_t GPRS_AdditionalMeasurementParams3G;
  uint8_t existAdditionsR6;
  PMO_AdditionsR6_t additionsR6;
} PMO_AdditionsR5_t;

typedef struct
{
  uint8_t existGRNTI_Extension;
  uint8_t GRNTI;
  uint8_t exist_lu_ModeNeighbourCellParams;
  uint8_t count_lu_ModeNeighbourCellParams;
  lu_ModeNeighbourCellParams_t lu_ModeNeighbourCellParams[32];
  uint8_t existNC_lu_ModeOnlyCapableCellList;
  NC_lu_ModeOnlyCapableCellList_t NC_lu_ModeOnlyCapableCellList;
  uint8_t existGPRS_AdditionalMeasurementParams3G;
  GPRS_AdditionalMeasurementParams3G_t GPRS_AdditionalMeasurementParams3G;
  uint8_t existAdditionsR6;
  PCCO_AdditionsR6_t additionsR6;
} PCCO_AdditionsR5_t;

typedef struct
{
  uint8_t CCN_ACTIVE;
  uint8_t Exist_CCN_Support_Description_ID;
  CCN_Support_Description_t CCN_Support_Description;
  uint8_t Exist_AdditionsR5;
  PMO_AdditionsR5_t AdditionsR5;
} PMO_AdditionsR4_t;

typedef struct
{
  uint8_t CCN_ACTIVE;
  uint8_t Exist_Container_ID;
  uint8_t CONTAINER_ID;
  uint8_t Exist_CCN_Support_Description_ID;
  CCN_Support_Description_t CCN_Support_Description;
  uint8_t Exist_AdditionsR5;
  PCCO_AdditionsR5_t AdditionsR5;
} PCCO_AdditionsR4_t;

typedef struct
{
  ENH_Measurement_Parameters_PCCO_t ENH_Measurement_Parameters;
  uint8_t Exist_AdditionsR4;
  PCCO_AdditionsR4_t AdditionsR4;
} PCCO_AdditionsR99_t;

typedef struct
{
  uint8_t Exist_ENH_Measurement_Parameters;
  ENH_Measurement_Parameters_PMO_t ENH_Measurement_Parameters;
  uint8_t Exist_AdditionsR4;
  PMO_AdditionsR4_t AdditionsR4;
} PMO_AdditionsR99_t;

typedef struct
{
  uint8_t Exist_LSA_Parameters;
  LSA_Parameters_t LSA_Parameters;

  uint8_t Exist_AdditionsR99;
  PMO_AdditionsR99_t AdditionsR99;
} PMO_AdditionsR98_t;

typedef struct
{
  uint8_t Exist_LSA_Parameters;
  LSA_Parameters_t LSA_Parameters;

  uint8_t Exist_AdditionsR99;
  PCCO_AdditionsR99_t AdditionsR99;
} PCCO_AdditionsR98_t;

typedef struct
{
  uint8_t IMMEDIATE_REL;
  uint16_t ARFCN;
  uint8_t BSIC;
  NC_Measurement_Parameters_with_Frequency_List_t NC_Measurement_Parameters;

  uint8_t Exist_AdditionsR98;
  PCCO_AdditionsR98_t AdditionsR98;
} Target_Cell_GSM_t;

typedef struct
{
  uint8_t Exist_EUTRAN_Target_Cell;
  EUTRAN_Target_Cell_t EUTRAN_Target_Cell;
  uint8_t Exist_Individual_Priorities;
  Individual_Priorities_t Individual_Priorities;
} Target_Cell_3G_AdditionsR8_t;

typedef struct
{
  uint8_t Exist_G_RNTI_Extention;
  uint8_t G_RNTI_Extention;
  uint8_t Exist_AdditionsR8;
  Target_Cell_3G_AdditionsR8_t AdditionsR8;
} Target_Cell_3G_AdditionsR5_t;

typedef struct
{
  /* 00 -- Message escape */
  uint8_t IMMEDIATE_REL;
  uint8_t Exist_FDD_Description;
  FDD_Target_Cell_t FDD_Target_Cell;
  uint8_t Exist_TDD_Description;
  TDD_Target_Cell_t TDD_Target_Cell;
  uint8_t Exist_AdditionsR5;
  Target_Cell_3G_AdditionsR5_t AdditionsR5;
} Target_Cell_3G_t;

#if 0
#define TARGET_CELL_GSM 0
#define TARGET_CELL_3G 1
#endif

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  PacketCellChangeOrderID_t ID;

  uint8_t UnionType;
  union
  {
    Target_Cell_GSM_t Target_Cell_GSM;
    Target_Cell_3G_t Target_Cell_3G;
  } u;

} Packet_Cell_Change_Order_t;

/* < Packet Cell Change Continue message contents > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  Global_TFI_t Global_TFI;
  uint8_t Exist_ID;
  uint16_t ARFCN;
  uint8_t BSIC;
  uint8_t CONTAINER_ID;
} Packet_Cell_Change_Continue_t;


/* < Packet Neighbour Cell Data message contents > */
typedef struct
{
  uint16_t ARFCN;
  uint8_t BSIC;
  uint8_t CONTAINER[17];     /* PD (3 bits) + CD_LENGTH (5 bits) + 16 bytes of CONTAINER_DATA (max!) */
} PNCD_Container_With_ID_t;

typedef struct
{
  uint8_t CONTAINER[19];     /* PD (3 bits) + CD_LENGTH (5 bits) + 18 bytes of CONTAINER_DATA (max!) */
} PNCD_Container_Without_ID_t;

typedef struct
{
  uint8_t UnionType;
  union
  {
    PNCD_Container_Without_ID_t PNCD_Container_Without_ID;
    PNCD_Container_With_ID_t PNCD_Container_With_ID;
  } u;
} PNCDContainer_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  /* Fixed 0 */
  Global_TFI_t Global_TFI;
  uint8_t CONTAINER_ID;
  uint8_t spare;
  uint8_t CONTAINER_INDEX;

  PNCDContainer_t Container;
} Packet_Neighbour_Cell_Data_t;

/* < Packet Serving Cell Data message contents > */
typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;
  /* Fixed 0 */
  Global_TFI_t Global_TFI;
  uint8_t spare;
  uint8_t CONTAINER_INDEX;
  uint8_t CONTAINER[19];     /* PD (3 bits) + CD_LENGTH (5 bits) + 18 bytes of CONTAINER_DATA (max!) */
} Packet_Serving_Cell_Data_t;

/* < Packet Measurement Order message contents > */
typedef struct
{
  uint16_t START_FREQUENCY;
  uint8_t NR_OF_FREQUENCIES;
  uint8_t FREQ_DIFF_LENGTH;

  uint8_t Count_FREQUENCY_DIFF;
  uint8_t FREQUENCY_DIFF[31];/* bit (FREQ_DIFF_LENGTH) * NR_OF_FREQUENCIES --> MAX is bit(7) * 31 */
} EXT_Frequency_List_t;

typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PAGE_MODE;

  PacketDownlinkID_t ID; /* use the PDA ID as it is the same as the PMO */

  uint8_t PMO_INDEX;
  uint8_t PMO_COUNT;

  uint8_t Exist_NC_Measurement_Parameters;
  NC_Measurement_Parameters_with_Frequency_List_t NC_Measurement_Parameters;

  uint8_t Exist_EXT_Measurement_Parameters;

  uint8_t Exist_AdditionsR98;
  PMO_AdditionsR98_t AdditionsR98;
} Packet_Measurement_Order_t;

/* Enhanced measurement report */

typedef struct
{
  uint8_t  RXLEV_SERVING_CELL;
} ServingCellData_t;

typedef struct
{
  uint8_t  BCCH_FREQ_NCELL;
  uint8_t  BSIC;
  uint8_t  RXLEV_NCELL;
} Repeated_Invalid_BSIC_Info_t;

typedef struct
{
  bool Exist_REPORTING_QUANTITY;
  uint8_t  REPORTING_QUANTITY;
} REPORTING_QUANTITY_t;

typedef struct
{
  uint8_t               NC_MODE;
  uint8_t UnionType;
  union
  {
    BA_USED_t           BA_USED;
    uint8_t             PSI3_CHANGE_MARK;
  } u;
  uint8_t PMO_USED;
  uint8_t SCALE;
  uint8_t Exist_ServingCellData;
  ServingCellData_t   ServingCellData;
  uint8_t  Count_Repeated_Invalid_BSIC_Info;
  Repeated_Invalid_BSIC_Info_t Repeated_Invalid_BSIC_Info[32];

  bool Exist_Repeated_REPORTING_QUANTITY;
  uint8_t  Count_Repeated_Reporting_Quantity;
  REPORTING_QUANTITY_t   Repeated_REPORTING_QUANTITY[96];
} NC_MeasurementReport_t;

/* Packet Handover  PHO ----------------- */

typedef struct
{
  uint8_t UnionType;
  union
  {
    uint8_t MS_TimeslotAllocation;
    Power_Control_Parameters_t Power_Control_Parameters;
  } u;
} GlobalTimeslotDescription_t;

typedef struct
{
  uint8_t TimeslotAllocation;
  uint8_t PFI;
  uint8_t RLC_Mode;
  uint8_t TFI_Assignment;
  uint8_t ControlACK;
  uint8_t Exist_EGPRS_WindowSize;
  uint8_t EGPRS_WindowSize;
} PHO_DownlinkAssignment_t;

typedef struct
{
  bool Exist_USF;
  uint8_t USF;
} PHO_USF_1_7_t;

typedef struct
{
  uint8_t USF_0;
  PHO_USF_1_7_t USF_1_7[7];
  uint8_t NBR_OfAllocatedTimeslots;
} USF_AllocationArray_t;

typedef struct
{
  uint8_t PFI;
  uint8_t RLC_Mode;
  uint8_t TFI_Assignment;
  uint8_t Exist_ChannelCodingCommand;
  uint8_t ChannelCodingCommand;
  uint8_t Exist_EGPRS_ChannelCodingCommand;
  uint8_t EGPRS_ChannelCodingCommand;
  uint8_t Exist_EGPRS_WindowSize;
  uint8_t EGPRS_WindowSize;
  uint8_t USF_Granularity;
  uint8_t Exist_TBF_TimeslotAllocation;
  uint8_t TBF_TimeslotAllocation;
  uint8_t UnionType;
  union
  {
    uint8_t USF_SingleAllocation;
    USF_AllocationArray_t USF_AllocationArray;
  } u;
} PHO_UplinkAssignment_t;

typedef struct
{
  GlobalTimeslotDescription_t GlobalTimeslotDescription;
  uint8_t Exist_PHO_UA;
  PHO_UplinkAssignment_t PHO_UA;
} GlobalTimeslotDescription_UA_t;

typedef struct
{
  uint8_t Exist_ChannelCodingCommand;
  uint8_t ChannelCodingCommand;
  uint8_t Exist_GlobalTimeslotDescription_UA;
  GlobalTimeslotDescription_UA_t GTD_UA;
  uint8_t Exist_DownlinkAssignment;
  PHO_DownlinkAssignment_t DownlinkAssignment;
} PHO_GPRS_t;


typedef struct
{
  uint8_t Exist_EGPRS_WindowSize;
  uint8_t EGPRS_WindowSize;
  uint8_t LinkQualityMeasurementMode;
  uint8_t Exist_BEP_Period2;
  uint8_t BEP_Period2;
} EGPRS_Description_t;

typedef struct
{
  uint8_t Exist_EGPRS_Description;
  EGPRS_Description_t EGPRS_Description;
  uint8_t Exist_DownlinkAssignment;
  PHO_DownlinkAssignment_t DownlinkAssignment;
} DownlinkTBF_t;

typedef struct
{
  uint8_t Exist_EGPRS_WindowSize;
  uint8_t EGPRS_WindowSize;
  uint8_t Exist_EGPRS_ChannelCodingCommand;
  uint8_t EGPRS_ChannelCodingCommand;
  uint8_t Exist_BEP_Period2;
  uint8_t BEP_Period2;
  uint8_t Exist_GlobalTimeslotDescription_UA;
  GlobalTimeslotDescription_UA_t GTD_UA;
  uint8_t Exist_DownlinkTBF;
  DownlinkTBF_t DownlinkTBF;
} PHO_EGPRS_t;

typedef struct
{
  Global_Packet_Timing_Advance_t    GlobalPacketTimingAdvance;
  uint8_t Exist_PacketExtendedTimingAdvance;
  uint8_t PacketExtendedTimingAdvance;
} PHO_TimingAdvance_t;

typedef struct
{
  uint8_t NAS_ContainerLength;
  uint8_t Spare_1a;
  uint8_t Spare_1b;
  uint8_t Spare_1c;
  uint8_t Old_XID;
  uint8_t Spare_1e;
  uint8_t Type_of_Ciphering_Algo;
  uint32_t IOV_UI_value;
} NAS_Container_For_PS_HO_t;

typedef struct
{
  uint8_t RRC_ContainerLength;
} PS_HandoverTo_UTRAN_Payload_t;

typedef struct
{
  uint8_t RRC_ContainerLength;
} PS_HandoverTo_E_UTRAN_Payload_t;

typedef struct
{
  uint8_t Exist_HandoverReference;
  uint8_t HandoverReference;
  uint8_t ARFCN;
  uint8_t SI;
  uint8_t NCI;
  uint8_t BSIC;
  uint8_t Exist_CCN_Active;
  uint8_t CCN_Active;
  uint8_t Exist_CCN_Active_3G;
  uint8_t CCN_Active_3G;
  uint8_t Exist_CCN_Support_Description;
  CCN_Support_Description_t CCN_Support_Description;
  Frequency_Parameters_t    Frequency_Parameters;
  uint8_t NetworkControlOrder;
  uint8_t Exist_PHO_TimingAdvance;
  PHO_TimingAdvance_t PHO_TimingAdvance;
  uint8_t Extended_Dynamic_Allocation;
  uint8_t RLC_Reset;
  uint8_t Exist_PO_PR;
  uint8_t PO;
  uint8_t PR_Mode;
  uint8_t Exist_UplinkControlTimeslot;
  uint8_t UplinkControlTimeslot;
  uint8_t UnionType;
  union
  {
    PHO_GPRS_t  PHO_GPRS_Mode;
    PHO_EGPRS_t PHO_EGPRS_Mode;
  } u;
} PHO_RadioResources_t;

typedef struct
{
  PHO_RadioResources_t PHO_RadioResources;
  uint8_t Exist_NAS_Container;
  NAS_Container_For_PS_HO_t NAS_Container;
} PS_HandoverTo_A_GB_ModePayload_t;

typedef struct
{
  uint8_t MessageType;
  uint8_t PageMode;
  Global_TFI_t Global_TFI;
  uint8_t ContainerID;
  uint8_t UnionType;
  union
  {
    PS_HandoverTo_A_GB_ModePayload_t PS_HandoverTo_A_GB_ModePayload;
    PS_HandoverTo_UTRAN_Payload_t    PS_HandoverTo_UTRAN_Payload;
    PS_HandoverTo_E_UTRAN_Payload_t  PS_HandoverTo_E_UTRAN_Payload;
  } u;
} Packet_Handover_Command_t;

/* End Packet Handover */

/* Packet Physical Information ----------------- */

typedef struct
{
  uint8_t MessageType;
  uint8_t PageMode;
  Global_TFI_t Global_TFI;
  uint8_t TimingAdvance;
} Packet_PhysicalInformation_t;

/* End Packet Physical Information */



/*  ADDITIONAL MS RADIO ACCESS CAPABILITIES -----------------*/
typedef struct
{
  uint8_t UnionType;
  union
  {
    Global_TFI_t Global_TFI;
    uint32_t TLLI;
  } u;
} AdditionalMsRadAccessCapID_t;


typedef struct
{
  uint8_t MESSAGE_TYPE;
  uint8_t PayloadType;
  uint8_t spare;
  uint8_t R;

  AdditionalMsRadAccessCapID_t ID;
  MS_Radio_Access_capability_t MS_Radio_Access_capability2;
} Additional_MS_Rad_Access_Cap_t;

/* End ADDITIONAL MS RADIO ACCESS CAPABILITIES */


/* Packet Pause -----------------*/

typedef struct
{
  uint8_t MESSAGE_TYPE;

  uint32_t TLLI;
  uint8_t RAI[48/8];
} Packet_Pause_t;

/* End Packet Pause */


/* < Payload Type Data MAC Header content > */
typedef struct
{
  uint8_t Payload_Type;
  uint8_t Countdown_Value;
  uint8_t SI;
  uint8_t R;
} UL_Data_Mac_Header_t;

typedef struct
{
  UL_Data_Mac_Header_t UL_Data_Mac_Header;
  uint8_t Spare;
  uint8_t PI;
  uint8_t TFI;
  uint8_t TI;
  uint8_t BSN;
  uint8_t E;
} UL_Data_Block_GPRS_t;

typedef struct
{
   uint8_t MESSAGE_TYPE;
   uint8_t CTRL_ACK;
}UL_Packet_Control_Ack_11_t;

typedef struct
{
   uint8_t MESSAGE_TYPE;
   uint8_t TN_RRBP;
   uint8_t CTRL_ACK;
}UL_Packet_Control_Ack_TN_RRBP_11_t;

typedef struct
{
   uint8_t MESSAGE_TYPE;
   uint8_t CTRL_ACK;
}UL_Packet_Control_Ack_8_t;

typedef struct
{
   uint8_t MESSAGE_TYPE;
   uint8_t TN_RRBP;
   uint8_t CTRL_ACK;
}UL_Packet_Control_Ack_TN_RRBP_8_t;

typedef struct
{
  uint8_t Payload_Type;
  uint8_t RRBP;
  uint8_t S_P;
  uint8_t USF;
} DL_Data_Mac_Header_t;

typedef struct
{
  DL_Data_Mac_Header_t DL_Data_Mac_Header;
  uint8_t Power_Reduction;
  uint8_t TFI;
  uint8_t FBI;
  uint8_t BSN;
  uint8_t E;
} DL_Data_Block_GPRS_t;

typedef struct
{
  uint8_t TFI;
  uint8_t RRBP;
  uint8_t ES_P;
  uint8_t USF;
  uint16_t BSN1;
  uint16_t BSN2_offset;
  uint8_t Power_Reduction;
  uint8_t SPB;
  uint8_t CPS;
  uint8_t PI;
  uint8_t ECS_P;
  uint8_t CC;
  uint8_t SPARE1;
  uint8_t SPARE2;
  uint8_t SPARE3;
} DL_Data_Block_EGPRS_Header_t;

typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EGPRS_Header_Type1_t;
typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EGPRS_Header_Type2_t;
typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EGPRS_Header_Type3_t;
typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EC_EGPRS_Header_Type1_t;
typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EC_EGPRS_Header_Type2_t;
typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EC_EGPRS_Header_Type3_t;

typedef DL_Data_Block_EGPRS_Header_t DL_Data_Block_EGPRS_Header_Type1_EC_t;

typedef struct
{
  uint8_t TFI;
  uint8_t Countdown_Value;
  uint8_t SI;
  uint8_t R;
  uint16_t BSN1;
  uint16_t BSN2_offset;
  uint8_t PI;
  uint8_t RSB;
  uint8_t SPB;
  uint8_t CPS;
  uint8_t FOI;
  uint8_t RI;
  uint8_t DL_CC_EST;
  uint8_t RTLLI;
  uint8_t SPARE1;
  uint8_t SPARE2;
  uint8_t dummy;
} UL_Data_Block_EGPRS_Header_t;

typedef UL_Data_Block_EGPRS_Header_t UL_Data_Block_EGPRS_Header_Type1_t;
typedef UL_Data_Block_EGPRS_Header_t UL_Data_Block_EGPRS_Header_Type2_t;
typedef UL_Data_Block_EGPRS_Header_t UL_Data_Block_EGPRS_Header_Type3_t;
typedef UL_Data_Block_EGPRS_Header_t UL_Data_Block_EC_EGPRS_Header_Type1_t;
typedef UL_Data_Block_EGPRS_Header_t UL_Data_Block_EC_EGPRS_Header_Type2_t;
typedef UL_Data_Block_EGPRS_Header_t UL_Data_Block_EC_EGPRS_Header_Type3_t;

typedef struct
{
  uint8_t                       DOWNLINK_TFI;
  uint8_t                       Exist_Wait;
  uint8_t                       WAIT_INDICATION;
  uint8_t                       WAIT_INDICATION_SIZE;
}
EC_Reject_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  uint8_t                       Reject_Count;
  EC_Reject_t                   Reject[16];
}
EC_Packet_Access_Reject_t;

typedef struct
{
  uint8_t                       EC_MA_NUMBER;
  uint8_t                       TSC;
  uint8_t                       Primary_TSC_Set;
}
EC_Frequency_Parameters_t;

typedef struct {
  uint8_t                       TIMING_ADVANCE_VALUE;
} EC_Packet_Timing_Advance_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  Global_TFI_t                  Global_TFI;
  uint8_t                       CONTROL_ACK;

  bool                          Exist_Frequency_Parameters;
  EC_Frequency_Parameters_t     Frequency_Parameters;

  uint8_t                       DL_COVERAGE_CLASS;
  uint8_t                       STARTING_DL_TIMESLOT;
  uint8_t                       TIMESLOT_MULTIPLICATOR;
  uint8_t                       DOWNLINK_TFI_ASSIGNMENT;
  uint8_t                       UL_COVERAGE_CLASS;
  uint8_t                       STARTING_UL_TIMESLOT_OFFSET;

  bool                          Exist_EC_Packet_Timing_Advance;
  EC_Packet_Timing_Advance_t    EC_Packet_Timing_Advance;

  bool                          Exist_P0_and_PR_MODE;
  uint8_t                       P0;
  uint8_t                       PR_MODE;

  bool                          Exist_GAMMA;
  uint8_t                       GAMMA;

  uint8_t                       ALPHA_Enable;

}
EC_Packet_Downlink_Assignment_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  Global_TFI_t                  Global_TFI;
  uint8_t                       TYPE_OF_ACK;
}
EC_Packet_Polling_Req_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  Global_TFI_t                  Global_TFI;

  bool                          Exist_T_AVG_T;
  uint8_t                       T_AVG_T;

  bool                          Exist_EC_Packet_Timing_Advance;
  EC_Packet_Timing_Advance_t    EC_Packet_Timing_Advance;

  bool                          Exist_GAMMA;
  uint8_t                       GAMMA;
}
EC_Packet_Power_Control_Timing_Advance_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  Global_TFI_t                  Global_TFI;
  uint8_t                       TBF_RELEASE_CAUSE;

  uint8_t                       Exist_Wait;
  uint8_t                       WAIT_INDICATION;
  uint8_t                       WAIT_INDICATION_SIZE;
}
EC_Packet_Tbf_Release_t;

typedef struct{
  bool                          Exist_DELAY_NEXT_UL_RLC_DATA_BLOCK;
  uint8_t                       DELAY_NEXT_UL_RLC_DATA_BLOCK;
}
FUA_Delay_t;

typedef struct
{
  bool                          Exist_BSN_OFFSET;
  uint8_t                       BSN_OFFSET;
  uint8_t                       START_FIRST_UL_RLC_DATA_BLOCK;
  uint8_t                       Count_FUA_Delay;
  FUA_Delay_t                   FUA_Delay[16]; /* Max RLC window size */
}
PUAN_Fixed_Uplink_Allocation_t;

typedef struct{
  uint8_t                       STARTING_SEQUENCE_NUMBER;
  uint16_t                      RECEIVED_BLOCK_BITMAP;
}
EC_AckNack_Description_t;

typedef struct{
  uint8_t                       STARTING_SEQUENCE_NUMBER;
  uint8_t                       RECEIVED_BLOCK_BITMAP;
}
EC_Primary_AckNack_Description_t;

typedef struct{
  uint32_t                          CONTENTION_RESOLUTION_TLLI;
  EC_Primary_AckNack_Description_t  EC_AckNack_Description;
}
EC_Primary_AckNack_Description_TLLI_t;

typedef struct{
  uint32_t                          CONTENTION_RESOLUTION_rTLLI;
  EC_Primary_AckNack_Description_t  EC_AckNack_Description;
}
EC_Primary_AckNack_Description_rTLLI_t;

typedef struct{
  uint8_t                         EC_AckNack_Description_Type;
  union
  {
    EC_AckNack_Description_t      EC_AckNack_Description;
    EC_Primary_AckNack_Description_TLLI_t  EC_Primary_AckNack_Description_TLLI;
    EC_Primary_AckNack_Description_rTLLI_t EC_Primary_AckNack_Description_rTLLI;
  } u;

  PUAN_Fixed_Uplink_Allocation_t  PUAN_Fixed_Uplink_Allocation;
  uint8_t                       RESEGMENT;

  bool                          Exist_EGPRS_Channel_Coding_Command;
  uint8_t                       EGPRS_Channel_Coding_Command;

  bool                          Exist_CC_TS;
  uint8_t                       UL_COVERAGE_CLASS;
  uint8_t                       STARTING_UL_TIMESLOT;
  uint8_t                       DL_COVERAGE_CLASS;
  uint8_t                       STARTING_DL_TIMESLOT_OFFSET;
  uint8_t                       TIMESLOT_MULTIPLICATOR;
} EC_Packet_Uplink_Ack_Nack_fai0_t;
typedef struct{
  bool                          Exist_CONTENTION_RESOLUTION_TLLI;
  uint32_t                      CONTENTION_RESOLUTION_TLLI;

  bool                          Exist_MONITOR_EC_PACCH;
  uint8_t                       T3238;
  uint8_t                       Initial_Waiting_Time;
  uint8_t                       EC_PACCH_Monitoring_Pattern;

} EC_Packet_Uplink_Ack_Nack_fai1_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  uint8_t                       UPLINK_TFI;
  uint8_t                       Final_Ack_Indicator;
  union
  {
    EC_Packet_Uplink_Ack_Nack_fai0_t fai0;
    EC_Packet_Uplink_Ack_Nack_fai1_t fai1;
  } u;

  bool                          Exist_EC_Packet_Timing_Advance;
  EC_Packet_Timing_Advance_t    EC_Packet_Timing_Advance;

  bool                          Exist_GAMMA;
  uint8_t                       GAMMA;
  uint8_t                       ALPHA_Enable;
}
EC_Packet_Uplink_Ack_Nack_t;

typedef struct
{
  uint8_t                       START_FIRST_UL_RLC_DATA_BLOCK;
  uint8_t                       Count_FUA_Delay;
  FUA_Delay_t                   FUA_Delay[16]; /* Max RLC window size */
}
Fixed_Uplink_Allocation_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
  Global_TFI_t                  Global_TFI;

  bool                          Exist_UPLINK_TFI_ASSIGNMENT;
  uint8_t                       UPLINK_TFI_ASSIGNMENT;

  bool                          Exist_EGPRS_Channel_Coding_Command;
  uint8_t                       EGPRS_Channel_Coding_Command;

  uint8_t                       Overlaid_CDMA_Code;

  bool                          Exist_EC_Packet_Timing_Advance;
  EC_Packet_Timing_Advance_t    EC_Packet_Timing_Advance;

  bool                          Exist_Frequency_Parameters;
  EC_Frequency_Parameters_t     Frequency_Parameters;

  uint8_t                       UL_COVERAGE_CLASS;
  uint8_t                       STARTING_UL_TIMESLOT;
  uint8_t                       TIMESLOT_MULTIPLICATOR;

  Fixed_Uplink_Allocation_t     Fixed_Uplink_Allocation;

  bool                          Exist_P0_and_PR_MODE;
  uint8_t                       P0;
  uint8_t                       PR_MODE;

  bool                          Exist_GAMMA;
  uint8_t                       GAMMA;
  uint8_t                       ALPHA_Enable;

  uint8_t                       DL_COVERAGE_CLASS;
  uint8_t                       STARTING_DL_TIMESLOT_OFFSET;

}
EC_Packet_Uplink_Assignment_t;

typedef struct
{
  uint8_t                          MESSAGE_TYPE;
  uint8_t                          USED_DL_COVERAGE_CLASS;
  uint8_t                          UPLINK_TFI;
  uint32_t                         CONTENTION_RESOLUTION_TLLI;
  EC_Primary_AckNack_Description_t EC_AckNack_Description;

  Fixed_Uplink_Allocation_t        PUANCR_Fixed_Uplink_Allocation;
  uint8_t                          RESEGMENT;
}
EC_Packet_Uplink_Ack_Nack_And_Contention_Resolution_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       USED_DL_COVERAGE_CLASS;
}
EC_Packet_Downlink_Dummy_Control_Block_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint32_t                      TLLI;
  uint8_t                       CTRL_ACK;
  uint8_t                       DL_CC_EST;
}
EC_Packet_Control_Acknowledgement_t;

typedef struct
{
  uint8_t                       PRIORITY;
  uint8_t                       NUMBER_OF_UL_DATA_BLOCKS;
}
EC_Channel_Request_Description_t;

typedef struct
{
  bool                          Exist_GMSK;
  uint8_t                       GMSK_MEAN_BEP;
  uint8_t                       GMSK_CV_BEP;
  bool                          Exist_8PSK;
  uint8_t                       PSK_MEAN_BEP;
  uint8_t                       PSK_CV_BEP;
  uint8_t                       C_VALUE;
}
EC_Channel_Quality_Report_t;

typedef struct
{
  uint8_t                       MESSAGE_TYPE;
  uint8_t                       DOWNLINK_TFI;
  uint8_t                       MS_OUT_OF_MEMORY;
  uint8_t                       Final_Ack_Indicator;

  EC_AckNack_Description_t      EC_AckNack_Description;

  bool                          Exist_EC_Channel_Quality_Report; /* DL CC EST is also conditional on this */
  EC_Channel_Quality_Report_t   EC_Channel_Quality_Report;
  uint8_t                       DL_CC_EST;

  bool                             Exist_EC_Channel_Request_Description;
  EC_Channel_Request_Description_t EC_Channel_Request_Description;
}
EC_Packet_Downlink_Ack_Nack_t;

/*
< NC Measurement Parameters struct > ::=
                                        < NETWORK_CONTROL_ORDER : bit (2) >
                                        { 0 | 1 < NC_ NON_DRX_PERIOD : bit (3) >
                                        < NC_REPORTING_PERIOD_I : bit (3) >
                                        < NC_REPORTING_PERIOD_T : bit (3) > } ;
< Cell Selection struct > ::=
                             < EXC_ACC : bit >
                             < CELL_BAR_ACCESS_2 : bit (1) >
                             < SAME_RA_AS_SERVING_CELL : bit (1) >
                             { 0 | 1  < GPRS_RXLEV_ACCESS_MIN : bit (6) >
                             < GPRS_MS_TXPWR_MAX_CCH : bit (5) > }
{ 0 | 1 < GPRS_TEMPORARY_OFFSET : bit (3) >
   < GPRS_PENALTY_TIME : bit (5) > }
Table 25 (concluded): PACKET CELL CHANGE ORDER message content
   { 0 | 1  < GPRS_RESELECT_OFFSET : bit (5) > }
{ 0 | 1  < HCS params : < HCS struct > > }
{ 0 | 1 < SI13_PBCCH_LOCATION : < SI13_PBCCH_LOCATION struct > > } ;

< SI13_PBCCH_LOCATION struct > ::=
                                  { 0  < SI13_LOCATION : bit (1) >
                                  | 1  < PBCCH_LOCATION : bit (2) >
                                  < PSI1_REPEAT_PERIOD : bit (4) > } ;

< HCS struct > ::=
                  < GPRS_PRIORITY_CLASS : bit (3) >
                  < GPRS_HCS_THR : bit (5) > ;
*/

/* < Downlink RLC/MAC control message > */
#define MT_PACKET_CELL_CHANGE_ORDER            0x01
#define MT_PACKET_DOWNLINK_ASSIGNMENT          0x02
#define MT_PACKET_MEASUREMENT_ORDER            0x03
#define MT_PACKET_POLLING_REQ                  0x04
#define MT_PACKET_POWER_CONTROL_TIMING_ADVANCE 0x05
#define MT_PACKET_QUEUEING_NOTIFICATION        0x06
#define MT_PACKET_TIMESLOT_RECONFIGURE         0x07
#define MT_PACKET_TBF_RELEASE                  0x08
#define MT_PACKET_UPLINK_ACK_NACK              0x09
#define MT_PACKET_UPLINK_ASSIGNMENT            0x0A
#define MT_PACKET_CELL_CHANGE_CONTINUE         0x0B
#define MT_PACKET_NEIGHBOUR_CELL_DATA          0x0C
#define MT_PACKET_SERVING_CELL_DATA            0x0D
#define MT_PACKET_HANDOVER_COMMAND             0x15
#define MT_PACKET_PHYSICAL_INFORMATION         0x16
#define MT_PACKET_ACCESS_REJECT                0x21
#define MT_PACKET_PAGING_REQUEST               0x22
#define MT_PACKET_PDCH_RELEASE                 0x23
#define MT_PACKET_PRACH_PARAMETERS             0x24
#define MT_PACKET_DOWNLINK_DUMMY_CONTROL_BLOCK 0x25
#define MT_PACKET_SYSTEM_INFO_6                0x30
#define MT_PACKET_SYSTEM_INFO_1                0x31
#define MT_PACKET_SYSTEM_INFO_2                0x32
#define MT_PACKET_SYSTEM_INFO_3                0x33
#define MT_PACKET_SYSTEM_INFO_3_BIS            0x34
#define MT_PACKET_SYSTEM_INFO_4                0x35
#define MT_PACKET_SYSTEM_INFO_5                0x36
#define MT_PACKET_SYSTEM_INFO_13               0x37
#define MT_PACKET_SYSTEM_INFO_7                0x38
#define MT_PACKET_SYSTEM_INFO_8                0x39
#define MT_PACKET_SYSTEM_INFO_14               0x3A
#define MT_PACKET_SYSTEM_INFO_3_TER            0x3C
#define MT_PACKET_SYSTEM_INFO_3_QUATER         0x3D
#define MT_PACKET_SYSTEM_INFO_15               0x3E

/* < Uplink RLC/MAC control message > */
#define MT_PACKET_CELL_CHANGE_FAILURE          0x00
#define MT_PACKET_CONTROL_ACK                  0x01
#define MT_PACKET_DOWNLINK_ACK_NACK            0x02
#define MT_PACKET_UPLINK_DUMMY_CONTROL_BLOCK   0x03
#define MT_PACKET_MEASUREMENT_REPORT           0x04
#define MT_PACKET_RESOURCE_REQUEST             0x05
#define MT_PACKET_MOBILE_TBF_STATUS            0x06
#define MT_PACKET_PSI_STATUS                   0x07
#define MT_EGPRS_PACKET_DOWNLINK_ACK_NACK      0x08
#define MT_PACKET_PAUSE                        0x09
#define MT_PACKET_ENHANCED_MEASUREMENT_REPORT  0x0A
#define MT_ADDITIONAL_MS_RAC                   0x0B
#define MT_PACKET_CELL_CHANGE_NOTIFICATION     0x0C
#define MT_PACKET_SI_STATUS                    0x0D
#define MT_ENHANCED_MEASUREMENT_REPORT         0x04

/* < Downlink EC-GSM-IoT RLC/MAC control messages > */
#define MT_EC_PACKET_ACCESS_REJECT                               0x11
#define MT_EC_PACKET_DOWNLINK_ASSIGNMENT                         0x01
#define MT_EC_PACKET_POLLING_REQ                                 0x02
#define MT_EC_PACKET_POWER_CONTROL_TIMING_ADVANCE                0x03
#define MT_EC_PACKET_TBF_RELEASE                                 0x04
#define MT_EC_PACKET_UPLINK_ACK_NACK                             0x05
#define MT_EC_PACKET_UPLINK_ASSIGNMENT                           0x06
#define MT_EC_PACKET_UPLINK_ACK_NACK_AND_CONTENTION_RESOLUTION   0x07
#define MT_EC_PACKET_DOWNLINK_DUMMY_CONTROL_BLOCK                0x12

/* < Uplink EC-GSM-IoT RLC/MAC control messages > */
#define MT_EC_PACKET_CONTROL_ACKNOWLEDGEMENT      0x01
#define MT_EC_PACKET_DOWNLINK_ACK_NACK            0x02

typedef enum
{
    RLCMAC_PRACH = 0x20,
    RLCMAC_CS1 = 0x21,
    RLCMAC_CS2 = 0x22,
    RLCMAC_CS3 = 0x23,
    RLCMAC_CS4 = 0x24,
    RLCMAC_HDR_TYPE_1 = 0x31,
    RLCMAC_HDR_TYPE_2 = 0x32,
    RLCMAC_HDR_TYPE_3 = 0x33,
    RLCMAC_HDR_TYPE_4 = 0x34,
    RLCMAC_HDR_TYPE_5 = 0x35,
    RLCMAC_HDR_TYPE_6 = 0x36,
    RLCMAC_HDR_TYPE_7 = 0x37,
    RLCMAC_HDR_TYPE_8 = 0x38,
    RLCMAC_HDR_TYPE_9 = 0x39,
    RLCMAC_HDR_TYPE_10 = 0x3a,
    RLCMAC_EC_CS1 = 0x40,
    RLCMAC_HDR_TYPE_1_EC   = 0x41,
    RLCMAC_HDR_TYPE_2_EC   = 0x42,
    RLCMAC_HDR_TYPE_3_EC   = 0x43
}RLCMAC_block_format_t;

/* < Downlink RLC/MAC control message > */
typedef struct
{
  union
  {
    uint8_t                                  MESSAGE_TYPE;
    DL_Data_Block_GPRS_t                     DL_Data_Block_GPRS;
    DL_Data_Block_EGPRS_Header_t             DL_Data_Block_EGPRS_Header;
    Packet_Access_Reject_t                   Packet_Access_Reject;
    Packet_Cell_Change_Order_t               Packet_Cell_Change_Order;
    Packet_Cell_Change_Continue_t            Packet_Cell_Change_Continue;
    Packet_Downlink_Assignment_t             Packet_Downlink_Assignment;
    Packet_Measurement_Order_t               Packet_Measurement_Order;
    Packet_Neighbour_Cell_Data_t             Packet_Neighbour_Cell_Data;
    Packet_Serving_Cell_Data_t               Packet_Serving_Cell_Data;
    Packet_Paging_Request_t                  Packet_Paging_Request;
    Packet_PDCH_Release_t                    Packet_PDCH_Release;
    Packet_Polling_Request_t                 Packet_Polling_Request;
    Packet_Power_Control_Timing_Advance_t    Packet_Power_Control_Timing_Advance;
    Packet_PRACH_Parameters_t                Packet_PRACH_Parameters;
    Packet_Queueing_Notification_t           Packet_Queueing_Notification;
    Packet_Timeslot_Reconfigure_t            Packet_Timeslot_Reconfigure;
    Packet_TBF_Release_t                     Packet_TBF_Release;
    Packet_Uplink_Ack_Nack_t                 Packet_Uplink_Ack_Nack;
    Packet_Uplink_Assignment_t               Packet_Uplink_Assignment;
    Packet_Handover_Command_t                Packet_Handover_Command;
    Packet_PhysicalInformation_t             Packet_PhysicalInformation;
    Packet_Downlink_Dummy_Control_Block_t    Packet_Downlink_Dummy_Control_Block;
    PSI1_t                                   PSI1;
    PSI2_t                                   PSI2;
    PSI3_t                                   PSI3;
    PSI5_t                                   PSI5;
    PSI13_t                                  PSI13;
    EC_Packet_Access_Reject_t                EC_Packet_Access_Reject;
    EC_Packet_Downlink_Assignment_t          EC_Packet_Downlink_Assignment;
    EC_Packet_Polling_Req_t                  EC_Packet_Polling_Req;
    EC_Packet_Power_Control_Timing_Advance_t EC_Packet_Power_Control_Timing_Advance;
    EC_Packet_Tbf_Release_t                  EC_Packet_Tbf_Release;
    EC_Packet_Uplink_Ack_Nack_t              EC_Packet_Uplink_Ack_Nack;
    EC_Packet_Uplink_Assignment_t            EC_Packet_Uplink_Assignment;
    EC_Packet_Uplink_Ack_Nack_And_Contention_Resolution_t EC_Packet_Uplink_Ack_Nack_And_Contention_Resolution;
    EC_Packet_Downlink_Dummy_Control_Block_t EC_Packet_Downlink_Dummy_Control_Block;
  } u;

  RLCMAC_block_format_t block_format;
  unsigned         flags;
} RlcMacDownlink_t;

typedef int16_t MSGGPRS_Status_t;
/* < Uplink RLC/MAC control message > */
typedef struct
{
  union
  {
    uint8_t MESSAGE_TYPE;
    Packet_Cell_Change_Failure_t          Packet_Cell_Change_Failure;
    Packet_Control_Acknowledgement_t      Packet_Control_Acknowledgement;
    Packet_Downlink_Ack_Nack_t            Packet_Downlink_Ack_Nack;
    Packet_Uplink_Dummy_Control_Block_t   Packet_Uplink_Dummy_Control_Block;
    Packet_Measurement_Report_t           Packet_Measurement_Report;
    Packet_Resource_Request_t             Packet_Resource_Request;
    Packet_Mobile_TBF_Status_t            Packet_Mobile_TBF_Status;
    Packet_PSI_Status_t                   Packet_PSI_Status;
    EGPRS_PD_AckNack_t                    Egprs_Packet_Downlink_Ack_Nack;
    Packet_Pause_t                        Packet_Pause;
    Packet_Enh_Measurement_Report_t       Packet_Enh_Measurement_Report;
    Additional_MS_Rad_Access_Cap_t        Additional_MS_Rad_Access_Cap;
    Packet_Cell_Change_Notification_t     Packet_Cell_Change_Notification;
    Packet_SI_Status_t                    Packet_SI_Status;
    UL_Data_Block_GPRS_t                  UL_Data_Block_GPRS;
    UL_Data_Block_EGPRS_Header_t          UL_Data_Block_EGPRS_Header;
    UL_Packet_Control_Ack_11_t            UL_Packet_Control_Ack_11;
    UL_Packet_Control_Ack_TN_RRBP_11_t    UL_Packet_Control_Ack_TN_RRBP_11;
    UL_Packet_Control_Ack_8_t             UL_Packet_Control_Ack_8;
    UL_Packet_Control_Ack_TN_RRBP_8_t     UL_Packet_Control_Ack_TN_RRBP_8;
    EC_Packet_Control_Acknowledgement_t   EC_Packet_Control_Acknowledgement;
    EC_Packet_Downlink_Ack_Nack_t         EC_Packet_Downlink_Ack_Nack;
  } u;
  RLCMAC_block_format_t block_format;
  unsigned         flags;
} RlcMacUplink_t;

typedef struct
{
   uint16_t bsn1;
   uint16_t bsn2;
   uint8_t pi;
}egprs_ul_header_info_t;

typedef struct
{
   uint16_t bsn1;
   uint16_t bsn2;
}egprs_dl_header_info_t;

typedef struct
{
   unsigned         magic;
   RLCMAC_block_format_t block_format;
   uint8_t          mcs;
   unsigned         frame_number;
#define GSM_RLC_MAC_EGPRS_BLOCK1 0x01
#define GSM_RLC_MAC_EGPRS_BLOCK2 0x02
#define GSM_RLC_MAC_EGPRS_FANR_FLAG 0x08
   unsigned         flags;
   union
   {
      egprs_ul_header_info_t egprs_ul_header_info;
      egprs_dl_header_info_t egprs_dl_header_info;
   }u;
} RlcMacPrivateData_t;


#if 0
void GPRSMSG_Profile(int16_t i);
#endif

/* SI1_RestOctet_t */

typedef struct
{
  bool                Exist_NCH_Position;
  uint8_t             NCH_Position;

  uint8_t             BandIndicator;
} SI1_RestOctet_t;

/* SI3_Rest_Octet_t */
typedef struct
{
  uint8_t CBQ;
  uint8_t CELL_RESELECT_OFFSET;
  uint8_t TEMPORARY_OFFSET;
  uint8_t PENALTY_TIME;
} Selection_Parameters_t;

typedef struct
{
  uint8_t Exist_Selection_Parameters;
  Selection_Parameters_t Selection_Parameters;

  uint8_t Exist_Power_Offset;
  uint8_t Power_Offset;

  uint8_t System_Information_2ter_Indicator;
  uint8_t Early_Classmark_Sending_Control;

  uint8_t Exist_WHERE;
  uint8_t WHERE;

  uint8_t Exist_GPRS_Indicator;
  uint8_t RA_COLOUR;
  uint8_t SI13_POSITION;
  uint8_t ECS_Restriction3G;
  uint8_t ExistSI2quaterIndicator;
  uint8_t SI2quaterIndicator;
} SI3_Rest_Octet_t;

typedef struct
{
  uint8_t Exist_Selection_Parameters;
  Selection_Parameters_t Selection_Parameters;

  uint8_t Exist_Power_Offset;
  uint8_t Power_Offset;

  uint8_t Exist_GPRS_Indicator;
  uint8_t RA_COLOUR;
  uint8_t SI13_POSITION;
} SI4_Rest_Octet_t;

#if 0
typedef SI4_Rest_Octet_t SI7_Rest_Octet_t;
typedef SI4_Rest_Octet_t SI8_Rest_Octet_t;
#endif

/* SI6_RestOctet_t */

typedef struct
{
  uint8_t  PagingChannelRestructuring;
  uint8_t  NLN_SACCH;

  bool Exist_CallPriority;
  uint8_t  CallPriority;

  uint8_t  NLN_Status;
} PCH_and_NCH_Info_t;

typedef struct
{
  bool                Exist_PCH_and_NCH_Info;
  PCH_and_NCH_Info_t PCH_and_NCH_Info;

  bool                Exist_VBS_VGCS_Options;
  uint8_t             VBS_VGCS_Options;

  /* The meaning of Exist_DTM_Support is as follows:
   * false => DTM is not supported in the serving cell, RAC and MAX_LAPDm are absent in bitstream
   * true  => DTM is supported in the serving cell, RAC and MAX_LAPDm are present in bitstream
   */
  bool                Exist_DTM_Support;
  uint8_t             RAC;
  uint8_t             MAX_LAPDm;

  uint8_t             BandIndicator; /* bit(1) L/H, L => ARFCN in 1800 band H => ARFCN in 1900 band */
} SI6_RestOctet_t;

/*************************************************
 * Enhanced Measurement Report. TS 04.18 9.1.55. *
 *************************************************/

typedef struct
{
  uint8_t       DTX_USED;
  uint8_t       RXLEV_VAL;
  uint8_t       RX_QUAL_FULL;
  uint8_t       MEAN_BEP;
  uint8_t       CV_BEP;
  uint8_t       NBR_RCVD_BLOCKS;
} EMR_ServingCell_t;

typedef struct
{
  uint8_t RR_Short_PD;
  uint8_t MESSAGE_TYPE;
  uint8_t ShortLayer2_Header;

  BA_USED_t BA_USED;
  uint8_t BSIC_Seen;

  uint8_t SCALE;

  uint8_t Exist_ServingCellData;
  EMR_ServingCell_t ServingCellData;

  uint8_t Count_RepeatedInvalid_BSIC_Info; /* Number of instances */
  RepeatedInvalid_BSIC_Info_t RepeatedInvalid_BSIC_Info[INV_BSIC_LIST_LEN];

  uint8_t Exist_ReportBitmap;
  uint8_t Count_REPORTING_QUANTITY_Instances; /* Number of instances */
  REPORTING_QUANTITY_Instance_t REPORTING_QUANTITY_Instances[REPORT_QUANTITY_LIST_LEN];

} EnhancedMeasurementReport_t;

extern const uint8_t gsm_rlcmac_gprs_cs_to_block_length[];
extern const uint8_t gsm_rlcmac_egprs_header_type_to_dl_header_block_length[];
extern const uint8_t gsm_rlcmac_egprs_header_type_to_ul_header_block_length[];
extern const uint8_t gsm_rlcmac_egprs_mcs_to_data_block_length[];

#endif /* __PACKET_GSM_RLCMAC_H__ */

/*
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
 *
 * Local Variables:
 * c-basic-offset: 2
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * vi: set shiftwidth=2 tabstop=8 expandtab:
 * :indentSize=2:tabSize=8:noTabs=true:
 */
