text: #!/usr/bin/env python
  
  # This file is part of Scapy
  # Scapy is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation, either version 2 of the License, or
  # any later version.
  #
  # Scapy is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with Scapy. If not, see <http://www.gnu.org/licenses/>.
  
  # scapy.contrib.description = PPI
  # scapy.contrib.status = loads
  
      ####################################################################
      # This file holds the GSM UM interface implementation for Scapy    #
      # author: Laurent Weber <k@0xbadcab1e.lu>                          #
      #                                                                  #
      # Some examples on how to use this script:                         #
      #                      http://0xbadcab1e.lu/scapy_gsm_um-howto.txt #
      #                                                                  #
      # tested on: scapy-version: 2.2.0 (dev)                            #
      ####################################################################
  
  from __future__ import print_function
  import logging
  from types import IntType
  from types import NoneType
  from types import StringType
  #from  time import sleep
  import socket
  logging.getLogger("scapy").setLevel(1)
  
  from scapy.packet import *
  from scapy.fields import *
  
  # This method is intended to send gsm air packets. It uses a unix domain
  # socket. It opens a socket, sends the parameter to the socket and
  # closes the socket.
  # typeSock determines the type of the socket, can be:
  #                  0 for UDP Socket
  #                  1 for Unix Domain Socket
  #                  2 for TCP
  
  
  def sendum(x, typeSock=0):
      try:
          if not isinstance(x, str):
              x = str(x)
          if typeSock is 0:
              s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
              host = '127.0.0.1'
              port = 28670       # default for openBTS
              s.connect((host, port))
          elif typeSock is 1:
              s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
              s.connect("/tmp/osmoL")
          elif typeSock is 2:
              s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              host = '127.0.0.1'
              port = 43797
              s.connect((host, port))
          s.send(x)
          s.close()
      except:
          print("[Error]: There was a problem when trying to transmit data.\
                 Please make sure you started the socket server.")
  
  # Known Bugs/Problems:
  # If a message uses multiple times the same IE you cannot set the values
  # of this IE's if you use the preconfigured packets. You need to build
  # the IE's by hand and than assemble them as entire messages.
  
  # The ErrorLength class is a custom exception that gets raised when a
  # packet doesn't have the correct size.
  
  
  class ErrorLength(Exception):
      def __str__(self):
          error = "ERROR: Please make sure you build entire, 8 bit fields."
          return repr(error)
  ###
  # This method computes the length of the actual IE.
  # It computes how many "None" fields have to be removed (if any).
  # The method returns an integer containing the number of bytes that have to be
  # cut off the packet.
  # parameter length contains the max length of the IE can be found in
  # 0408
  # The parameter fields contains the value of the fields (not the default but
  # the real, actual value.
  # The parameter fields2 contains fields_desc.
  # Location contains the location of the length field in the IE. Everything
  # after the the length field has to be counted (04.07 11.2.1.1.2)
  
  
  def adapt(min_length, max_length, fields, fields2, location=2):
      # find out how much bytes there are between min_length and the location of
      # the length field
      location = min_length - location
      i = len(fields) - 1
      rm = mysum = 0
      while i >= 0:
          if fields[i] is None:
              rm += 1
              try:
                  mysum += fields2[i].size
              except AttributeError:  # ByteFields don't have .size
                  mysum += 8
          else:
              break
          i -= 1
      if mysum % 8 is 0:
          length = mysum / 8  # Number of bytes we have to delete
          dyn_length = (max_length - min_length - length)
          if dyn_length < 0:
              dyn_length = 0
          if length is max_length:  # Fix for packets that have all values set
              length -= min_length  # to None
          return [length, dyn_length + location]
      else:
          raise ErrorLength()
  
  
  def examples(example=None):
      if example == None:
          print("""This command presents some example to introduce scapy
  gsm-um to new users.
  The following parameters can be used:
      examples("imsiDetach")
      examples("call")
      examples("dissect")""")
      elif example == "imsiDetach":
          print("""
  >>> a=imsiDetachIndication()
  ... a.typeOfId=1; a.odd=1; a.idDigit1=0xF; 
  ... a.idDigit2_1=2; a.idDigit2=7; a.idDigit3_1=0;
  ... a.idDigit3=7; a.idDigit4_1=7; a.idDigit4=2;
  ... a.idDigit5_1=0; a.idDigit5=0; a.idDigit6_1=0;
  ... a.idDigit6=1; a.idDigit7_1=2; a.idDigit7=7;
  ... a.idDigit8_1=7; a.idDigit8=5; a.idDigit9_1=1; a.idDigit9=4; 
  >>> hexdump(a)
  0000   05 01 00 08 F0 27 07 72  00 01 27 75 14   .....'.r..'u.
  >>> sendum(a)
  """)
      elif example == "call":
          print("""
  If you use an USRP and the testcall function this sets up a phonecall:
  >>> sendum(setupMobileOriginated())
  >>> sendum(connectAcknowledge())
  """)
  
  
  # Section 10.2/3
  class TpPd(Packet):
      """Skip indicator and transaction identifier and Protocol Discriminator"""
      name = "Skip Indicator And Transaction Identifier and Protocol \
  Discriminator"
      fields_desc = [
                 BitField("ti", 0x0, 4),
                 BitField("pd", 0x3, 4)
                 ]
  
  
  class MessageType(Packet):
      """Message Type Section 10.4"""
      name = "Message Type"
      fields_desc = [
                 XByteField("mesType", 0x3C)
                 ]
  
  
  ##
  # Message for Radio Resources management (RR) Section 9.1
  ###
  
  # Network to MS
  def additionalAssignment(MobileAllocation_presence=0,
                           StartingTime_presence=0):
      """ADDITIONAL ASSIGNMENT Section 9.1.1"""
      # Mandatory
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x3B)  # 00111011
      c = ChannelDescription()
      packet = a / b / c
      # Not Mandatory
      if MobileAllocation_presence is 1:
          d = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0)
          packet = packet / d
      if StartingTime_presence is 1:
          e = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0)
          packet = packet / e
      return packet
  
  
  # Network to MS
  def assignmentCommand(FrequencyList_presence=0,
                        CellChannelDescription_presence=0,
                        CellChannelDescription_presence1=0,
                        MultislotAllocation_presence=0,
                        ChannelMode_presence=0, ChannelMode_presence1=0,
                        ChannelMode_presence2=0, ChannelMode_presence3=0,
                        ChannelMode_presence4=0, ChannelMode_presence5=0,
                        ChannelMode_presence6=0, ChannelMode_presence7=0,
                        ChannelDescription=0, ChannelMode2_presence=0,
                        MobileAllocation_presence=0, StartingTime_presence=0,
                        FrequencyList_presence1=0,
                        ChannelDescription2_presence=0,
                        ChannelDescription_presence=0,
                        FrequencyChannelSequence_presence=0,
                        MobileAllocation_presence1=0,
                        CipherModeSetting_presence=0,
                        VgcsTargetModeIdentication_presence=0,
                        MultiRateConfiguration_presence=0):
      """ASSIGNMENT COMMAND Section 9.1.2"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x2e)  # 101110
      c = ChannelDescription2()
      d = PowerCommand()
      packet = a / b / c / d
      if FrequencyList_presence is 1:
          e = FrequencyListHdr(ieiFL=0x05, eightBitFL=0x0)
          packet = packet / e
      if CellChannelDescription_presence is 1:
          f = CellChannelDescriptionHdr(ieiCCD=0x62, eightBitCCD=0x0)
          packet = packet / f
      if MultislotAllocation_presence is 1:
          g = MultislotAllocationHdr(ieiMSA=0x10, eightBitMSA=0x0)
          packet = packet / g
      if ChannelMode_presence is 1:
          h = ChannelModeHdr(ieiCM=0x63, eightBitCM=0x0)
          packet = packet / h
      if ChannelMode_presence1 is 1:
          i = ChannelModeHdr(ieiCM=0x11, eightBitCM=0x0)
          packet = packet / i
      if ChannelMode_presence2 is 1:
          j = ChannelModeHdr(ieiCM=0x13, eightBitCM=0x0)
          packet = packet / j
      if ChannelMode_presence3 is 1:
          k = ChannelModeHdr(ieiCM=0x14, eightBitCM=0x0)
          packet = packet / k
      if ChannelMode_presence4 is 1:
          l = ChannelModeHdr(ieiCM=0x15, eightBitCM=0x0)
          packet = packet / l
      if ChannelMode_presence5 is 1:
          m = ChannelModeHdr(ieiCM=0x16, eightBitCM=0x0)
          packet = packet / m
      if ChannelMode_presence6 is 1:
          n = ChannelModeHdr(ieiCM=0x17, eightBitCM=0x0)
          packet = packet / n
      if ChannelMode_presence7 is 1:
          o = ChannelModeHdr(ieiCM=0x18, eightBitCM=0x0)
          packet = packet / o
      if ChannelDescription_presence is 1:
          p = ChannelDescriptionHdr(ieiCD=0x64, eightBitCD=0x0)
          packet = packet / p
      if ChannelMode2_presence is 1:
          q = ChannelMode2Hdr(ieiCM2=0x66, eightBitCM2=0x0)
          packet = packet / q
      if MobileAllocation_presence is 1:
          r = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0)
          packet = packet / r
      if StartingTime_presence is 1:
          s = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0)
          packet = packet / s
      if FrequencyList_presence1 is 1:
          t = FrequencyListHdr(ieiFL=0x19, eightBitFL=0x0)
          packet = packet / t
      if ChannelDescription2_presence is 1:
          u = ChannelDescription2Hdr(ieiCD2=0x1C, eightBitCD2=0x0)
          packet = packet / u
      if ChannelDescription_presence is 1:
          v = ChannelDescriptionHdr(ieiCD=0x1D, eightBitCD=0x0)
          packet = packet / v
      if FrequencyChannelSequence_presence is 1:
          w = FrequencyChannelSequenceHdr(ieiFCS=0x1E, eightBitFCS=0x0)
          packet = packet / w
      if MobileAllocation_presence1 is 1:
          x = MobileAllocationHdr(ieiMA=0x21, eightBitMA=0x0)
          packet = packet / x
      if CipherModeSetting_presence is 1:
          y = CipherModeSettingHdr(ieiCMS=0x9, eightBitCMS=0x0)
          packet = packet / y
      if VgcsTargetModeIdentication_presence is 1:
          z = VgcsTargetModeIdenticationHdr(ieiVTMI=0x01, eightBitVTMI=0x0)
          packet = packet / z
      if MultiRateConfiguration_presence is 1:
          aa = MultiRateConfigurationHdr(ieiMRC=0x03, eightBitMRC=0x0)
          packet = packet / aa
      return packet
  
  
  # MS to Network
  def assignmentComplete():
      """ASSIGNMENT COMPLETE Section 9.1.3"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x29)  # 00101001
      c = RrCause()
      packet = a / b / c
      return packet
  
  
  # MS to Network
  def assignmentFailure():
      """ASSIGNMENT FAILURE Section 9.1.4"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x2F)  # 00101111
      c = RrCause()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def channelModeModify(VgcsTargetModeIdentication_presence=0,
                        MultiRateConfiguration_presence=0):
      """CHANNEL MODE MODIFY Section 9.1.5"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x8)  # 0001000
      c = ChannelDescription2()
      d = ChannelMode()
      packet = a / b / c / d
      if VgcsTargetModeIdentication is 1:
          e = VgcsTargetModeIdenticationHdr(ieiVTMI=0x01, eightBitVTMI=0x0)
          packet = packet / e
      if MultiRateConfiguration is 1:
          f = MultiRateConfigurationHdr(ieiMRC=0x03, eightBitMRC=0x0)
          packet = packet / f
      return packet
  
  
  def channelModeModifyAcknowledge():
      """CHANNEL MODE MODIFY ACKNOWLEDGE Section 9.1.6"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x17)  # 00010111
      c = ChannelDescription2()
      d = ChannelMode()
      packet = a / b / c / d
      return packet
  
  
  # Network to MS
  def channelRelease(BaRange_presence=0, GroupChannelDescription_presence=0,
                     GroupCipherKeyNumber_presence=0, GprsResumption_presence=0,
                     BaListPref_presence=0):
      """CHANNEL RELEASE  Section 9.1.7"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0xD)  # 00001101
      c = RrCause()
      packet = a / b / c
      if BaRange_presence is 1:
          d = BaRangeHdr(ieiBR=0x73, eightBitBR=0x0)
          packet = packet / d
      if GroupChannelDescription_presence is 1:
          e = GroupChannelDescriptionHdr(ieiGCD=0x74, eightBitGCD=0x0)
          packet = packet / e
      if GroupCipherKeyNumber_presence is 1:
          f = GroupCipherKeyNumber(ieiGCKN=0x8)
          packet = packet / f
      if GprsResumption_presence is 1:
          g = GprsResumptionHdr(ieiGR=0xC, eightBitGR=0x0)
          packet = packet / g
      if BaListPref_presence is 1:
          h = BaListPrefHdr(ieiBLP=0x75, eightBitBLP=0x0)
          packet = packet / h
      return packet
  
  
  class ChannelRequest(Packet):
      """Channel request Section 9.1.8"""
      name = "Channel Request"
      fields_desc = [
               ByteField("estCause", 0x0)
               ]
  
  
  def channelRequest():
      return ChannelRequest()
  
  
  # Network to MS
  def cipheringModeCommand():
      """CIPHERING MODE COMMAND  Section 9.1.9"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x35)  # 00110101
      c = RrCause()
   #d=cipherModeSetting()
   #e=cipherResponse()
   # FIX
      d = CipherModeSettingAndcipherResponse()
      packet = a / b / c / d
      return packet
  
  
  def cipheringModeComplete(MobileId_presence=0):
      """CIPHERING MODE COMPLETE Section 9.1.10"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x32)  # 00110010
      packet = a / b
      if MobileId_presence is 1:
          c = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0)
          packet = packet / c
      return packet
  
  
  # Network to MS
  def classmarkChange(MobileStationClassmark3_presence=0):
      """CLASSMARK CHANGE Section 9.1.11"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x16)  # 00010110
      c = MobileStationClassmark2()
      packet = a / b / c
      if MobileStationClassmark3_presence is 1:
          e = MobileStationClassmark3(ieiMSC3=0x20)
          packet = packet / e
      return packet
  
  
  # Network to MS
  def classmarkEnquiry():
      """CLASSMARK ENQUIRY Section 9.1.12"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x13)  # 00010011
      packet = a / b
      return packet
  # 9.1.12a Spare
  
  
  # Network to MS
  def configurationChangeCommand(ChannelMode_presence=0,
                                 ChannelMode_presence1=0,
                                 ChannelMode_presence2=0,
                                 ChannelMode_presence3=0,
                                 ChannelMode_presence4=0,
                                 ChannelMode_presence5=0,
                                 ChannelMode_presence6=0,
                                 ChannelMode_presence7=0):
      """CONFIGURATION CHANGE COMMAND Section 9.1.12b"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x30)  # 00110000
      c = MultislotAllocation()
      packet = a / b / c
      if ChannelMode_presence is 1:
          d = ChannelModeHdr(ieiCM=0x63, eightBitCM=0x0)
          packet = packet / d
      if ChannelMode_presence1 is 1:
          e = ChannelModeHdr(ieiCM=0x11, eightBitCM=0x0)
          packet = packet / e
      if ChannelMode_presence2 is 1:
          f = ChannelModeHdr(ieiCM=0x13, eightBitCM=0x0)
          packet = packet / f
      if ChannelMode_presence3 is 1:
          g = ChannelModeHdr(ieiCM=0x14, eightBitCM=0x0)
          packet = packet / g
      if ChannelMode_presence4 is 1:
          h = ChannelModeHdr(ieiCM=0x15, eightBitCM=0x0)
          packet = packet / h
      if ChannelMode_presence5 is 1:
          i = ChannelModeHdr(ieiCM=0x16, eightBitCM=0x0)
          packet = packet / i
      if ChannelMode_presence6 is 1:
          j = ChannelModeHdr(ieiCM=0x17, eightBitCM=0x0)
          packet = packet / j
      if ChannelMode_presence7 is 1:
          k = ChannelModeHdr(ieiCM=0x18, eightBitCM=0x0)
          packet = packet / k
      return packet
  
  
  def configurationChangeAcknowledge():
      """CONFIGURATION CHANGE ACKNOWLEDGE Section 9.1.12c"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x31)  # 00110001
      c = MobileId()
      packet = a / b / c
      return packet
  
  
  def configurationChangeReject():
      """CONFIGURATION CHANGE REJECT Section 9.1.12d"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x33)  # 00110011
      c = RrCause()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def frequencyRedefinition(CellChannelDescription_presence=0):
      """Frequency redefinition Section 9.1.13"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x14)  # 00010100
      c = ChannelDescription()
      d = MobileAllocation()
      e = StartingTime()
      packet = a / b / c / d / e
      if CellChannelDescription_presence is 1:
          f = CellChannelDescriptionHdr(ieiCCD=0x62, eightBitCCD=0x0)
          packet = packet / f
      return packet
  
  
  # Network to MS
  def pdchAssignmentCommand(ChannelDescription_presence=0,
                            CellChannelDescription_presence=0,
                            MobileAllocation_presence=0,
                            StartingTime_presence=0, FrequencyList_presence=0,
                            ChannelDescription_presence1=0,
                            FrequencyChannelSequence_presence=0,
                            MobileAllocation_presence1=0,
                            PacketChannelDescription_presence=0,
                            DedicatedModeOrTBF_presence=0):
      """PDCH ASSIGNMENT COMMAND Section 9.1.13a"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x23)  # 00100011
      c = ChannelDescription()
      packet = a / b / c
      if ChannelDescription_presence is 1:
          d = ChannelDescriptionHdr(ieiCD=0x62, eightBitCD=0x0)
          packet = packet / d
      if CellChannelDescription_presence is 1:
          e = CellChannelDescriptionHdr(ieiCCD=0x05, eightBitCCD=0x0)
          packet = packet / e
      if MobileAllocation_presence is 1:
          f = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0)
          packet = packet / f
      if StartingTime_presence is 1:
          g = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0)
          packet = packet / g
      if FrequencyList_presence is 1:
          h = FrequencyListHdr(ieiFL=0x19, eightBitFL=0x0)
          packet = packet / h
      if ChannelDescription_presence1 is 1:
          i = ChannelDescriptionHdr(ieiCD=0x1C, eightBitCD=0x0)
          packet = packet / i
      if FrequencyChannelSequence_presence is 1:
          j = FrequencyChannelSequenceHdr(ieiFCS=0x1E, eightBitFCS=0x0)
          packet = packet / j
      if MobileAllocation_presence1 is 1:
          k = MobileAllocationHdr(ieiMA=0x21, eightBitMA=0x0)
          packet = packet / k
      if PacketChannelDescription_presence is 1:
          l = PacketChannelDescription(ieiPCD=0x22)
          packet = packet / l
      if DedicatedModeOrTBF_presence is 1:
          m = DedicatedModeOrTBFHdr(ieiDMOT=0x23, eightBitDMOT=0x0)
          packet = packet / m
      return packet
  
  
  def gprsSuspensionRequest():
      """GPRS SUSPENSION REQUEST Section 9.1.13b"""
      a = TpPd(pd=0x6)
      b = MessageType()
      c = Tlli()
      d = RoutingAreaIdentification()
      e = SuspensionCause()
      packet = a / b / c / d / e
      return packet
  
  
  class HandoverAccess(Packet):
      name = "Handover Access"  # Section 9.1.14"
      fields_desc = [
               ByteField("handover", None),
               ]
  
  
  # Network to MS
  def handoverCommand(SynchronizationIndication_presence=0,
                      FrequencyShortList_presence=0, FrequencyList_presence=0,
                      CellChannelDescription_presence=0,
                      MultislotAllocation_presence=0,
                      ChannelMode_presence=0, ChannelMode_presence1=0,
                      ChannelMode_presence2=0,
                      ChannelMode_presence3=0, ChannelMode_presence4=0,
                      ChannelMode_presence5=0,
                      ChannelMode_presence6=0, ChannelMode_presence7=0,
                      ChannelDescription_presence1=0, ChannelMode2_presence=0,
                      FrequencyChannelSequence_presence=0,
                      MobileAllocation_presence=0,
                      StartingTime_presence=0, TimeDifference_presence=0,
                      TimingAdvance_presence=0,
                      FrequencyShortList_presence1=0,
                      FrequencyList_presence1=0,
                      ChannelDescription2_presence=0,
                      ChannelDescription_presence2=0,
                      FrequencyChannelSequence_presence1=0,
                      MobileAllocation_presence1=0,
                      CipherModeSetting_presence=0,
                      VgcsTargetModeIdentication_presence=0,
                      MultiRateConfiguration_presence=0):
      """HANDOVER COMMAND Section 9.1.15"""
      name = "Handover Command"
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x2b)  # 00101011
      c = CellDescription()
      d = ChannelDescription2()
      e = HandoverReference()
      f = PowerCommandAndAccessType()
      packet = a / b / c / d / e / f
      if SynchronizationIndication_presence is 1:
          g = SynchronizationIndicationHdr(ieiSI=0xD, eightBitSI=0x0)
          packet = packet / g
      if FrequencyShortList_presence is 1:
          h = FrequencyShortListHdr(ieiFSL=0x02)
          packet = packet / h
      if FrequencyList_presence is 1:
          i = FrequencyListHdr(ieiFL=0x05, eightBitFL=0x0)
          packet = packet / i
      if CellChannelDescription_presence is 1:
          j = CellChannelDescriptionHdr(ieiCCD=0x62, eightBitCCD=0x0)
          packet = packet / j
      if MultislotAllocation_presence is 1:
          k = MultislotAllocationHdr(ieiMSA=0x10, eightBitMSA=0x0)
          packet = packet / k
      if ChannelMode_presence is 1:
          l = ChannelModeHdr(ieiCM=0x63, eightBitCM=0x0)
          packet = packet / l
      if ChannelMode_presence1 is 1:
          m = ChannelModeHdr(ieiCM=0x11, eightBitCM=0x0)
          packet = packet / m
      if ChannelMode_presence2 is 1:
          n = ChannelModeHdr(ieiCM=0x13, eightBitCM=0x0)
          packet = packet / n
      if ChannelMode_presence3 is 1:
          o = ChannelModeHdr(ieiCM=0x14, eightBitCM=0x0)
          packet = packet / o
      if ChannelMode_presence4 is 1:
          p = ChannelModeHdr(ieiCM=0x15, eightBitCM=0x0)
          packet = packet / p
      if ChannelMode_presence5 is 1:
          q = ChannelModeHdr(ieiCM=0x16, eightBitCM=0x0)
          packet = packet / q
      if ChannelMode_presence6 is 1:
          r = ChannelModeHdr(ieiCM=0x17, eightBitCM=0x0)
          packet = packet / r
      if ChannelMode_presence7 is 1:
          s = ChannelModeHdr(ieiCM=0x18, eightBitCM=0x0)
          packet = packet / s
      if ChannelDescription_presence1 is 1:
          s1 = ChannelDescriptionHdr(ieiCD=0x64, eightBitCD=0x0)
          packet = packet / s1
      if ChannelMode2_presence is 1:
          t = ChannelMode2Hdr(ieiCM2=0x66, eightBitCM2=0x0)
          packet = packet / t
      if FrequencyChannelSequence_presence is 1:
          u = FrequencyChannelSequenceHdr(ieiFCS=0x69, eightBitFCS=0x0)
          packet = packet / u
      if MobileAllocation_presence is 1:
          v = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0)
          packet = packet / v
      if StartingTime_presence is 1:
          w = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0)
          packet = packet / w
      if TimeDifference_presence is 1:
          x = TimeDifferenceHdr(ieiTD=0x7B, eightBitTD=0x0)
          packet = packet / x
      if TimingAdvance_presence is 1:
          y = TimingAdvanceHdr(ieiTA=0x7D, eightBitTA=0x0)
          packet = packet / y
      if FrequencyShortList_presence1 is 1:
          z = FrequencyShortListHdr(ieiFSL=0x12)
          packet = packet / z
      if FrequencyList_presence1 is 1:
          aa = FrequencyListHdr(ieiFL=0x19, eightBitFL=0x0)
          packet = packet / aa
      if ChannelDescription2_presence is 1:
          ab = ChannelDescription2Hdr(ieiCD2=0x1C, eightBitCD2=0x0)
          packet = packet / ab
      if ChannelDescription_presence2 is 1:
          ac = ChannelDescriptionHdr(ieiCD=0x1D, eightBitCD=0x0)
          packet = packet / ac
      if FrequencyChannelSequence_presence1 is 1:
          ad = FrequencyChannelSequenceHdr(ieiFCS=0x1E, eightBitFCS=0x0)
          packet = packet / ad
      if MobileAllocation_presence1 is 1:
          ae = MobileAllocationHdr(ieiMA=0x21, eightBitMA=0x0)
          packet = packet / ae
      if CipherModeSetting_presence is 1:
          af = CipherModeSettingHdr(ieiCMS=0x9, eightBitCMS=0x0)
          packet = packet / af
      if VgcsTargetModeIdentication_presence is 1:
          ag = VgcsTargetModeIdenticationHdr(ieiVTMI=0x01, eightBitVTMI=0x0)
          packet = packet / ag
      if MultiRateConfiguration_presence is 1:
          ah = MultiRateConfigurationHdr(ieiMRC=0x03, eightBitMRC=0x0)
          packet = packet / ah
      return packet
  
  
  def handoverComplete(MobileTimeDifference_presence=0):
      """HANDOVER COMPLETE Section 9.1.16"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x2c)  # 00101100
      c = RrCause()
      packet = a / b / c
      if MobileTimeDifference_presence is 1:
          d = MobileTimeDifferenceHdr(ieiMTD=0x77, eightBitMTD=0x0)
          packet = packet / d
      return packet
  
  
  def handoverFailure():
      """HANDOVER FAILURE Section 9.1.17"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x28)  # 00101000
      c = RrCause()
      packet = a / b / c
      return packet
  
  
  #The L2 pseudo length of this message is the sum of lengths of all
  #information elements present in the message except
  #the IA Rest Octets and L2 Pseudo Length information elements.
  # Network to MS
  def immediateAssignment(ChannelDescription_presence=0,
                          PacketChannelDescription_presence=0,
                          StartingTime_presence=0):
      """IMMEDIATE ASSIGNMENT Section 9.1.18"""
      a = L2PseudoLength()
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x3F)  # 00111111
      d = PageModeAndDedicatedModeOrTBF()
      packet = a / b / c / d
      if ChannelDescription_presence is 1:
          f = ChannelDescription()
          packet = packet / f
      if PacketChannelDescription_presence is 1:
          g = PacketChannelDescription()
          packet = packet / g
      h = RequestReference()
      i = TimingAdvance()
      j = MobileAllocation()
      packet = packet / h / i / j
      if StartingTime_presence is 1:
          k = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0)
          packet = packet / k
      l = IaRestOctets()
      packet = packet / l
      return packet
  
  
  #The L2 pseudo length of this message is the sum of lengths of all
  #information elements present in the message except
  #the IAX Rest Octets and L2 Pseudo Length information elements.
  
  # Network to MS
  def immediateAssignmentExtended(StartingTime_presence=0):
      """IMMEDIATE ASSIGNMENT EXTENDED Section 9.1.19"""
      a = L2PseudoLength()
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x39)  # 00111001
      d = PageModeAndSpareHalfOctets()
      f = ChannelDescription()
      g = RequestReference()
      h = TimingAdvance()
      i = MobileAllocation()
      packet = a / b / c / d / f / g / h / i
      if StartingTime_presence is 1:
          j = StartingTimeHdr(ieiST=0x7C, eightBitST=0x0)
          packet = packet / j
      k = IaxRestOctets()
      packet = packet / k
      return packet
  
  
  # This message has L2 pseudo length 19
  # Network to MS
  def immediateAssignmentReject():
      """IMMEDIATE ASSIGNMENT REJECT Section 9.1.20"""
      a = L2PseudoLength(l2pLength=0x13)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x3a)  # 00111010
      d = PageModeAndSpareHalfOctets()
      f = RequestReference()
      g = WaitIndication()
      h = RequestReference()
      i = WaitIndication()
      j = RequestReference()
      k = WaitIndication()
      l = RequestReference()
      m = WaitIndication()
      n = IraRestOctets()
      packet = a / b / c / d / f / g / h / i / j / k / l / m / n
      return packet
  
  
  def measurementReport():
      """MEASUREMENT REPORT Section 9.1.21"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x15)  # 00010101
      c = MeasurementResults()
      packet = a / b / c
      return packet
  
  
  # len max 20
  class NotificationFacch():
      """NOTIFICATION/FACCH Section 9.1.21a"""
      name = "Notification/facch"
      fields_desc = [
               BitField("rr", 0x0, 1),
               BitField("msgTyoe", 0x0, 5),
               BitField("layer2Header", 0x0, 2),
               BitField("frChanDes", 0x0, 24)
               ]
  
  
  # The L2 pseudo length of this message has a value one
  # Network to MS
  def notificationNch():
      """NOTIFICATION/NCH Section 9.1.21b"""
      a = L2PseudoLength(l2pLength=0x01)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x20)  # 00100000
      d = NtNRestOctets()
      packet = a / b / c / d
      return packet
  
  
  def notificationResponse():
      """NOTIFICATION RESPONSE Section 9.1.21d"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x26)  # 00100110
      c = MobileStationClassmark2()
      d = MobileId()
      e = DescriptiveGroupOrBroadcastCallReference()
      packet = a / b / c / d / e
      return packet
  
  
  # Network to MS
  def rrCellChangeOrder():
      """RR-CELL CHANGE ORDER  Section  9.1.21e"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x8)  # 00001000
      c = CellDescription()
      d = NcModeAndSpareHalfOctets()
      packet = a / b / c / d
      return packet
  
  
  # Network to MS
  def pagingRequestType1(MobileId_presence=0):
      """PAGING REQUEST TYPE 1 Section 9.1.22"""
   #The L2 pseudo length of this message is the sum of lengths of all
   #information elements present in the message except
   #the P1 Rest Octets and L2 Pseudo Length information elements.
      a = L2PseudoLength()
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x21)  # 00100001
      d = PageModeAndChannelNeeded()
      f = MobileId()
      packet = a / b / c / d / f
      if MobileId_presence is 1:
          g = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0)
          packet = packet / g
      h = P1RestOctets()
      packet = packet / h
      return packet
  
  
  # The L2 pseudo length of this message is the sum of lengths of all
  # information elements present in the message except
  # Network to MS
  def pagingRequestType2(MobileId_presence=0):
      """PAGING REQUEST TYPE 2  Section 9.1.23"""
      a = L2PseudoLength()
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x22)  # 00100010
      d = PageModeAndChannelNeeded()
      f = MobileId()
      g = MobileId()
      packet = a / b / c / d / f / g
      if MobileId_presence is 1:
          h = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0)
          packet = packet / h
      i = P2RestOctets()
      packet = packet / i
      return packet
  
  
  # Network to MS
  def pagingRequestType3():
      """PAGING REQUEST TYPE 3 Section 9.1.24"""
  # This message has a L2 Pseudo Length of 19
      a = L2PseudoLength(l2pLength=0x13)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x24)  # 00100100
      d = PageModeAndChannelNeeded()
      e = TmsiPTmsi()
      f = TmsiPTmsi()
      g = TmsiPTmsi()
      h = TmsiPTmsi()
      i = P3RestOctets()
      packet = a / b / c / d / e / f / g / h / i
      return packet
  
  
  def pagingResponse():
      """PAGING RESPONSE Section 9.1.25"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x27)  # 00100111
      c = CiphKeySeqNrAndSpareHalfOctets()
      d = MobileStationClassmark2()
      e = MobileId()
      packet = a / b / c / d / e
      return packet
  
  
  # Network to MS
  def partialRelease():
      """PARTIAL RELEASE Section 9.1.26"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0xa)  # 00001010
      c = ChannelDescription()
      packet = a / b / c
      return packet
  
  
  def partialReleaseComplete():
      """PARTIAL RELEASE COMPLETE Section 9.1.27"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0xf)  # 00001111
      packet = a / b
      return packet
  
  
  # Network to MS
  def physicalInformation():
      """PHYSICAL INFORMATION Section 9.1.28"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x2d)  # 00101101
      c = TimingAdvance()
      packet = a / b / c
      return packet
  
  
  def rrInitialisationRequest():
      """RR Initialisation Request Section 9.1.28.a"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x3c)  # 00111100
      c = CiphKeySeqNrAndMacModeAndChannelCodingRequest()
      e = MobileStationClassmark2()
      f = Tlli()
      g = ChannelRequestDescription()
      h = GprsMeasurementResults()
      packet = a / b / c / e / f / g / h
      return packet
  
  
  def rrStatus():
      """RR STATUS Section 9.1.29"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x12)  # 00010010
      c = RrCause()
      packet = a / b / c
      return packet
  
  
  # It does not
  # follow the basic format. Its length is _25_ bits. The
  # order of bit transmission is defined in GSM 04.04.
  # Network to MS
  class SynchronizationChannelInformation():
      """SYNCHRONIZATION CHANNEL INFORMATION Section 9.1.30"""
      name = "Synchronization Channel Information"
      fields_desc = [
               BitField("bsic", 0x0, 5),
               BitField("t1Hi", 0x0, 3),
               ByteField("t1Mi", 0x0),
               BitField("t1Lo", 0x0, 1),
               BitField("t2", 0x0, 5),
               BitField("t3Hi", 0x0, 2),
               BitField("t3Lo", 0x0, 1)
               ]
  
  
  # This message has a L2 Pseudo Length of 21.
  # Network to MS
  def systemInformationType1():
      """SYSTEM INFORMATION TYPE 1 Section 9.1.31"""
      a = L2PseudoLength(l2pLength=0x15)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x19)  # 00011001
      d = CellChannelDescription()
      e = RachControlParameters()
      f = Si1RestOctets()
      packet = a / b / c / d / e / f
      return packet
  
  
  # This message has a L2 Pseudo Length of 22.
  # Network to MS
  def systemInformationType2():
      """SYSTEM INFORMATION TYPE 2 Section 9.1.32"""
      a = L2PseudoLength(l2pLength=0x16)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x1a)  # 00011010
      d = NeighbourCellsDescription()
      e = NccPermitted()
      f = RachControlParameters()
      packet = a / b / c / d / e / f
      return packet
  
  
  # This message has a L2 pseudo length of 21
  # Network to MS
  def systemInformationType2bis():
      """SYSTEM INFORMATION TYPE 2bis Section 9.1.33"""
      a = L2PseudoLength(l2pLength=0x15)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x2)  # 00000010
      d = NeighbourCellsDescription()
      e = RachControlParameters()
      f = Si2bisRestOctets()
      packet = a / b / c / d / e / f
      return packet
  
  
  # This message has a L2 pseudo length of 18
  # Network to MS
  def systemInformationType2ter():
      """SYSTEM INFORMATION TYPE 2ter Section 9.1.34"""
      a = L2PseudoLength(l2pLength=0x12)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x3)  # 00000011
      d = NeighbourCellsDescription2()
      e = Si2terRestOctets()
      packet = a / b / c / d / e
      return packet
  
  
  # This message has a L2 Pseudo Length of 18
  # Network to MS
  def systemInformationType3():
      """SYSTEM INFORMATION TYPE 3 Section 9.1.35"""
      a = L2PseudoLength(l2pLength=0x12)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x1b)  # 00011011
      d = CellIdentity()
      e = LocalAreaId()
      f = ControlChannelDescription()
      g = CellOptionsBCCH()
      h = CellSelectionParameters()
      i = RachControlParameters()
      j = Si3RestOctets()
      packet = a / b / c / d / e / f / g / h / i / j
      return packet
  
  
  #The L2 pseudo length of this message is the
  #sum of lengths of all information elements present in the message except
  #the SI 4 Rest Octets and L2 Pseudo Length
  # Network to MS
  def systemInformationType4(ChannelDescription_presence=0,
                             MobileAllocation_presence=0):
      """SYSTEM INFORMATION TYPE 4 Section 9.1.36"""
      a = L2PseudoLength()
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x1C)  # 000111100
      d = LocalAreaId()
      e = CellSelectionParameters()
      f = RachControlParameters()
      packet = a / b / c / d / e / f
      if ChannelDescription_presence is 1:
          g = ChannelDescriptionHdr(ieiCD=0x64, eightBitCD=0x0)
          packet = packet / g
      if MobileAllocation_presence is 1:
          h = MobileAllocationHdr(ieiMA=0x72, eightBitMA=0x0)
          packet = packet / h
      i = Si4RestOctets()
      packet = packet / i
      return packet
  
  
  #This message has a L2 Pseudo Length of 18
  # Network to MS
  def systemInformationType5():
      """SYSTEM INFORMATION TYPE 5 Section 9.1.37"""
      a = L2PseudoLength(l2pLength=0x12)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x35)  # 000110101
      d = NeighbourCellsDescription()
      packet = a / b / c / d
      return packet
  
  
  #This message has a L2 Pseudo Length of 18
  # Network to MS
  def systemInformationType5bis():
      """SYSTEM INFORMATION TYPE 5bis Section 9.1.38"""
      a = L2PseudoLength(l2pLength=0x12)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x5)  # 00000101
      d = NeighbourCellsDescription()
      packet = a / b / c / d
      return packet
  
  
  # This message has a L2 Pseudo Length of 18
  # Network to MS
  def systemInformationType5ter():
      """SYSTEM INFORMATION TYPE 5ter Section 9.1.39"""
      a = L2PseudoLength(l2pLength=0x12)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x6)  # 00000110
      d = NeighbourCellsDescription2()
      packet = a / b / c / d
      return packet
  
  
  #This message has a L2 Pseudo Length of 11
  # Network to MS
  def systemInformationType6():
      """SYSTEM INFORMATION TYPE 6 Section 9.1.40"""
      a = L2PseudoLength(l2pLength=0x0b)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x1e)  # 00011011
      d = CellIdentity()
      e = LocalAreaId()
      f = CellOptionsBCCH()
      g = NccPermitted()
      h = Si6RestOctets()
      packet = a / b / c / d / e / f / g
      return packet
  
  
  # The L2 pseudo length of this message has the value 1
  # Network to MS
  def systemInformationType7():
      """SYSTEM INFORMATION TYPE 7 Section 9.1.41"""
      a = L2PseudoLength(l2pLength=0x01)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x37)  # 000110111
      d = Si7RestOctets()
      packet = a / b / c / d
      return packet
  
  
  # The L2 pseudo length of this message has the value 1
  # Network to MS
  def systemInformationType8():
      """SYSTEM INFORMATION TYPE 8 Section 9.1.42"""
      a = L2PseudoLength(l2pLength=0x01)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x18)  # 00011000
      d = Si8RestOctets()
      packet = a / b / c / d
      return packet
  
  
  # The L2 pseudo length of this message has the value 1
  # Network to MS
  def systemInformationType9():
      """SYSTEM INFORMATION TYPE 9 Section 9.1.43"""
      a = L2PseudoLength(l2pLength=0x01)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x4)  # 00000100
      d = Si9RestOctets()
      packet = a / b / c / d
      return packet
  
  
  # The L2 pseudo length of this message has the value 0
  # Network to MS
  def systemInformationType13():
      """SYSTEM INFORMATION TYPE 13 Section 9.1.43a"""
      a = L2PseudoLength(l2pLength=0x00)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x0)  # 00000000
      d = Si13RestOctets()
      packet = a / b / c / d
      return packet
  #
  # 9.1.43b / c spare
  #
  
  
  # The L2 pseudo length of this message has the value 1
  # Network to MS
  def systemInformationType16():
      """SYSTEM INFORMATION TYPE 16 Section 9.1.43d"""
      a = L2PseudoLength(l2pLength=0x01)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x3d)  # 00111101
      d = Si16RestOctets()
      packet = a / b / c / d
      return packet
  
  
  # The L2 pseudo length of this message has the value 1
  # Network to MS
  def systemInformationType17():
      """SYSTEM INFORMATION TYPE 17 Section 9.1.43e"""
      a = L2PseudoLength(l2pLength=0x01)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x3e)  # 00111110
      d = Si17RestOctets()
      packet = a / b / c / d
      return packet
  
  
  def talkerIndication():
      """TALKER INDICATION Section 9.1.44"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x11)  # 00010001
      c = MobileStationClassmark2()
      d = MobileId()
      packet = a / b / c / d
      return packet
  
  
  class UplinkAccess():
      """UPLINK ACCESS Section 9.1.45"""
      name = "Uplink Access"
      fields_desc = [
               ByteField("establishment", 0x0)
               ]
  
  
  # Network to MS
  def uplinkBusy():
      """UPLINK BUSY Section 9.1.46"""
      name = "Uplink Busy"
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x2a)  # 00101010
      packet = a / b
      return packet
  
  
  # Network to MS
  class UplinkFree():
      """UPLINK FREE Section 9.1.47"""
      name = "Uplink Free"
      fields_desc = [
               BitField("pd", 0x0, 1),
               BitField("msgType", 0x0, 5),
               BitField("layer2Header", 0x0, 2),
               BitField("uplinkAccess", 0x0, 1),
               BitField("lOrH", 0x0, 1),  # 0 for L, 1 for H
               BitField("upIdCode", 0x0, 6),
               ]
  
  
  def uplinkRelease():
      """UPLINK RELEASE Section 9.1.48"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0xe)  # 00001110
      c = RrCause()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def vgcsUplinkGrant():
      """VGCS UPLINK GRANT Section 9.1.49"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x9)  # 00001001
      c = RrCause()
      d = RequestReference()
      e = TimingAdvance()
      packet = a / b / c / d / e
      return packet
  
  
  # Network to MS
  def systemInformationType10():
      """SYSTEM INFORMATION TYPE 10 Section 9.1.50"""
      name = "SyStem Information Type 10"
      fields_desc = [
               BitField("pd", 0x0, 1),
               BitField("msgType", 0x0, 5),
               BitField("layer2Header", 0x0, 2),
               BitField("si10", 0x0, 160)
               ]
  
  
  # Network to MS
  # The L2 pseudo length of this message has the value 18
  def extendedMeasurementOrder():
      """EXTENDED MEASUREMENT ORDER Section 9.1.51"""
      a = L2PseudoLength(l2pLength=0x12)
      b = TpPd(pd=0x6)
      c = MessageType(mesType=0x37)  # 00110111
      d = ExtendedMeasurementFrequencyList()
      packet = a / b / c / d
      return packet
  
  
  def extendedMeasurementReport():
      """EXTENDED MEASUREMENT REPORT Section 9.1.52"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x36)  # 00110110
      c = ExtendedMeasurementResults()
      packet = a / b / c
      return packet
  
  
  def applicationInformation():
      """APPLICATION INFORMATION Section 9.1.53"""
      a = TpPd(pd=0x6)
      b = MessageType(mesType=0x38)  # 00111000
      c = ApduIDAndApduFlags()
      e = ApduData()
      packet = a / b / c / e
      return packet
  #
  # 9.2 Messages for mobility management
  #
  
  
  # Network to MS
  def authenticationReject():
      """AUTHENTICATION REJECT Section 9.2.1"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x11)  # 00010001
      packet = a / b
      return packet
  
  
  # Network to MS
  def authenticationRequest():
      """AUTHENTICATION REQUEST Section 9.2.2"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x12)  # 00010010
      c = CiphKeySeqNrAndSpareHalfOctets()
      d = AuthenticationParameterRAND()
      packet = a / b / c / d
      return packet
  
  
  def authenticationResponse():
      """AUTHENTICATION RESPONSE Section 9.2.3"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x14)  # 00010100
      c = AuthenticationParameterSRES()
      packet = a / b / c
      return packet
  
  
  def cmReestablishmentRequest(LocalAreaId_presence=0):
      """CM RE-ESTABLISHMENT REQUEST Section 9.2.4"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x28)  # 00101000
      c = CiphKeySeqNrAndSpareHalfOctets()
      e = MobileStationClassmark2()
      f = MobileId()
      if LocalAreaId_presence is 1:
          g = LocalAreaId(iei=0x13, eightbit=0x0)
          packet = packet / g
      packet = a / b / c / e / f
      return packet
  
  
  # Network to MS
  def cmServiceAccept():
      """CM SERVICE ACCEPT Section 9.2.5"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x21)  # 00100001
      packet = a / b
      return packet
  
  
  # Network to MS
  def cmServicePrompt():
      """CM SERVICE PROMPT Section 9.2.5a"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x25)  # 00100101
      c = PdAndSapi()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def cmServiceReject():
      """CM SERVICE REJECT Section 9.2.6"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x22)  # 00100010
      c = RejectCause()
      packet = a / b / c
      return packet
  
  
  def cmServiceAbort():
      """CM SERVICE ABORT Section 9.2.7"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x23)  # 00100011
      packet = a / b
      return packet
  
  
  # Network to MS
  def abort():
      """ABORT Section 9.2.8"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x29)  # 00101001
      c = RejectCause()
      packet = a / b / c
      return packet
  
  
  def cmServiceRequest(PriorityLevel_presence=0):
      """CM SERVICE REQUEST Section 9.2.9"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x24)  # 00100100
      c = CmServiceTypeAndCiphKeySeqNr()
      e = MobileStationClassmark2()
      f = MobileId()
      packet = a / b / c / e / f
      if PriorityLevel_presence is 1:
          g = PriorityLevelHdr(ieiPL=0x8, eightBitPL=0x0)
          packet = packet / g
      return packet
  
  
  # Network to MS
  def identityRequest():
      """IDENTITY REQUEST Section 9.2.10"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x8)  # 00001000
      c = IdentityTypeAndSpareHalfOctets()
      packet = a / b / c
      return packet
  
  
  def identityResponse():
      """IDENTITY RESPONSE Section 9.2.11"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x9)  # 00001001
      c = MobileId()
      packet = a / b / c
      return packet
  
  
  def imsiDetachIndication():
      """IMSI DETACH INDICATION Section 9.2.12"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x1)  # 00000001
      c = MobileStationClassmark1()
      d = MobileId()
      packet = a / b / c / d
      return packet
  
  
  # Network to MS
  def locationUpdatingAccept(MobileId_presence=0,
                             FollowOnProceed_presence=0,
                             CtsPermission_presence=0):
      """LOCATION UPDATING ACCEPT Section 9.2.13"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x02)  # 00000010
      c = LocalAreaId()
      packet = a / b / c
      if MobileId_presence is 1:
          d = MobileIdHdr(ieiMI=0x17, eightBitMI=0x0)
          packet = packet / d
      if FollowOnProceed_presence is 1:
          e = FollowOnProceed(ieiFOP=0xA1)
          packet = packet / e
      if CtsPermission_presence is 1:
          f = CtsPermissionHdr(ieiCP=0xA2, eightBitCP=0x0)
          packet = packet / f
      return packet
  
  
  # Network to MS
  def locationUpdatingReject():
      """LOCATION UPDATING REJECT Section 9.2.14"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x4)  # 0x00000100
      c = RejectCause()
      packet = a / b / c
      return packet
  
  
  def locationUpdatingRequest():
      """LOCATION UPDATING REQUEST Section 9.2.15"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x8)  # 00001000
      c = LocationUpdatingTypeAndCiphKeySeqNr()
      e = LocalAreaId()
      f = MobileStationClassmark1()
      g = MobileId()
      packet = a / b / c / e / f / g
      return packet
  
  
  # Network to MS
  def mmInformation(NetworkName_presence=0, NetworkName_presence1=0,
                    TimeZone_presence=0, TimeZoneAndTime_presence=0,
                    LsaIdentifier_presence=0):
      """MM INFORMATION Section 9.2.15a"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x32)  # 00110010
      packet = a / b
      if NetworkName_presence is 1:
          c = NetworkNameHdr(ieiNN=0x43, eightBitNN=0x0)
          packet = packet / c
      if NetworkName_presence1 is 1:
          d = NetworkNameHdr(ieiNN=0x45, eightBitNN=0x0)
          packet = packet / d
      if TimeZone_presence is 1:
          e = TimeZoneHdr(ieiTZ=0x46, eightBitTZ=0x0)
          packet = packet / e
      if TimeZoneAndTime_presence is 1:
          f = TimeZoneAndTimeHdr(ieiTZAT=0x47, eightBitTZAT=0x0)
          packet = packet / f
      if LsaIdentifier_presence is 1:
          g = LsaIdentifierHdr(ieiLI=0x48, eightBitLI=0x0)
          packet = packet / g
      return packet
  
  
  def mmStatus():
      """MM STATUS Section 9.2.16"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x31)  # 00110001
      c = RejectCause()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def tmsiReallocationCommand():
      """TMSI REALLOCATION COMMAND Section 9.2.17"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x1a)  # 00011010
      c = LocalAreaId()
      d = MobileId()
      packet = a / b / c / d
      return packet
  
  
  def tmsiReallocationComplete():
      """TMSI REALLOCATION COMPLETE Section 9.2.18"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x1b)  # 00011011
      packet = a / b
      return packet
  
  
  def mmNull():
      """MM NULL Section 9.2.19"""
      a = TpPd(pd=0x5)
      b = MessageType(mesType=0x30)  # 00110000
      packet = a / b
      return packet
  
  #
  # 9.3 Messages for circuit-switched call control
  #
  
  
  # Network to MS
  def alertingNetToMs(Facility_presence=0, ProgressIndicator_presence=0,
                      UserUser_presence=0):
      """ALERTING Section 9.3.1.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1)  # 00000001
      packet = a / b
      if Facility_presence is 1:
          c = FacilityHdr(ieiF=0x1C)
          packet = packet / c
      if ProgressIndicator_presence is 1:
          d = ProgressIndicatorHdr(ieiPI=0x1E)
          packet = packet / d
      if UserUser_presence is 1:
          e = UserUserHdr(ieiUU=0x7E)
          packet = packet / e
      return packet
  
  
  def alertingMsToNet(Facility_presence=0, UserUser_presence=0,
                      SsVersionIndicator_presence=0):
      """ALERTING Section 9.3.1.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1)  # 00000001
      packet = a / b
      if Facility_presence is 1:
          c = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / c
      if UserUser_presence is 1:
          d = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / d
      if SsVersionIndicator_presence is 1:
          e = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / e
      return packet
  
  
  def callConfirmed(RepeatIndicator_presence=0,
                    BearerCapability_presence=0, BearerCapability_presence1=0,
                    Cause_presence=0, CallControlCapabilities_presence=0):
      """CALL CONFIRMED Section 9.3.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x8)  # 00001000
      packet = a / b
      if RepeatIndicator_presence is 1:
          c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / c
      if BearerCapability_presence is 1:
          d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / d
      if BearerCapability_presence1 is 1:
          e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / e
      if Cause_presence is 1:
          f = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / f
      if CallControlCapabilities_presence is 1:
          g = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0)
          packet = packet / g
      return packet
  
  
  # Network to MS
  def callProceeding(RepeatIndicator_presence=0,
                     BearerCapability_presence=0,
                     BearerCapability_presence1=0,
                     Facility_presence=0, ProgressIndicator_presence=0,
                     PriorityLevel_presence=0):
      """CALL PROCEEDING Section 9.3.3"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x2)  # 00000010
      packet = a / b
      if RepeatIndicator_presence is 1:
          c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / c
      if BearerCapability_presence is 1:
          d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / d
      if BearerCapability_presence1 is 1:
          e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / e
      if Facility_presence is 1:
          f = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / f
      if ProgressIndicator_presence is 1:
          g = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0)
          packet = packet / g
      if PriorityLevel_presence is 1:
          h = PriorityLevelHdr(ieiPL=0x80, eightBitPL=0x0)
          packet = packet / h
      return packet
  
  
  # Network to MS
  def congestionControl(Cause_presence=0):
      """CONGESTION CONTROL Section 9.3.4"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x39)  # 00111001
      c = CongestionLevelAndSpareHalfOctets()
      packet = a / b / c
      if Cause_presence is 1:
          e = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / e
      return packet
  
  
  # Network to MS
  def connectNetToMs(Facility_presence=0, ProgressIndicator_presence=0,
                     ConnectedNumber_presence=0, ConnectedSubaddress_presence=0,
                     UserUser_presence=0):
      """CONNECT Section 9.3.5.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x7)  # 00000111
      packet = a / b
      if Facility_presence is 1:
          c = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / c
      if ProgressIndicator_presence is 1:
          d = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0)
          packet = packet / d
      if ConnectedNumber_presence is 1:
          e = ConnectedNumberHdr(ieiCN=0x4C, eightBitCN=0x0)
          packet = packet / e
      if ConnectedSubaddress_presence is 1:
          f = ConnectedSubaddressHdr(ieiCS=0x4D, eightBitCS=0x0)
          packet = packet / f
      if UserUser_presence is 1:
          g = UserUserHdr(ieiUU=0x7F, eightBitUU=0x0)
          packet = packet / g
      return packet
  
  
  def connectMsToNet(Facility_presence=0, ConnectedSubaddress_presence=0,
                     UserUser_presence=0, SsVersionIndicator_presence=0):
      """CONNECT Section 9.3.5.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x7)  # 00000111
      packet = a / b
      if Facility_presence is 1:
          c = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / c
      if ConnectedSubaddress_presence is 1:
          d = ConnectedSubaddressHdr(ieiCS=0x4D, eightBitCS=0x0)
          packet = packet / d
      if UserUser_presence is 1:
          e = UserUserHdr(ieiUU=0x7F, eightBitUU=0x0)
          packet = packet / e
      if SsVersionIndicator_presence is 1:
          f = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / f
      return packet
  
  
  def connectAcknowledge():
      """CONNECT ACKNOWLEDGE Section 9.3.6"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0xf)  # 00001111
      packet = a / b
      return packet
  
  
  # Network to MS
  def disconnectNetToMs(Facility_presence=0, ProgressIndicator_presence=0,
                        UserUser_presence=0, AllowedActions_presence=0):
      """DISCONNECT Section 9.3.7.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x25)  # 00100101
      c = Cause()
      packet = a / b / c
      if Facility_presence is 1:
          d = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / d
      if ProgressIndicator_presence is 1:
          e = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0)
          packet = packet / e
      if UserUser_presence is 1:
          f = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / f
      if AllowedActions_presence is 1:
          g = AllowedActionsHdr(ieiAA=0x7B, eightBitAA=0x0)
          packet = packet / g
      return packet
  
  
  def disconnectMsToNet(Facility_presence=0, UserUser_presence=0,
                        SsVersionIndicator_presence=0):
      """Disconnect Section 9.3.7.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x25)  # 00100101
      c = Cause()
      packet = a / b / c
      if Facility_presence is 1:
          d = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / d
      if UserUser_presence is 1:
          e = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / e
      if SsVersionIndicator_presence is 1:
          f = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / f
      return packet
  
  
  def emergencySetup(BearerCapability_presence=0):
      """EMERGENCY SETUP Section 9.3.8"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0xe)  # 00001110
      packet = a / b
      if BearerCapability_presence is 1:
          c = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / c
      return packet
  
  
  # Network to MS
  def facilityNetToMs():
      """FACILITY Section 9.3.9.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x3a)  # 00111010
      c = Facility()
      packet = a / b / c
      return packet
  
  
  def facilityMsToNet(SsVersionIndicator_presence=0):
      """FACILITY Section 9.3.9.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x3a)  # 00111010
      c = Facility()
      packet = a / b / c
      if SsVersionIndicator_presence is 1:
          d = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / d
      return packet
  
  
  def hold():
      """HOLD Section 9.3.10"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x18)  # 00011000
      packet = a / b
      return packet
  
  
  # Network to MS
  def holdAcknowledge():
      """HOLD ACKNOWLEDGE Section 9.3.11"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x19)  # 00011001
      packet = a / b
      return packet
  
  
  # Network to MS
  def holdReject():
      """HOLD REJECT Section 9.3.12"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1a)  # 00011010
      c = Cause()
      packet = a / b / c
      return packet
  
  
  def modify(LowLayerCompatibility_presence=0,
             HighLayerCompatibility_presence=0,
             ReverseCallSetupDirection_presence=0):
      """MODIFY Section 9.3.13"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x17)  # 00010111
      c = BearerCapability()
      packet = a / b / c
      if LowLayerCompatibility_presence is 1:
          d = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / d
      if HighLayerCompatibility_presence is 1:
          e = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / e
      if ReverseCallSetupDirection_presence is 1:
          f = ReverseCallSetupDirectionHdr(ieiRCSD=0xA3)
          packet = packet / f
      return packet
  
  
  def modifyComplete(LowLayerCompatibility_presence=0,
                     HighLayerCompatibility_presence=0,
                     ReverseCallSetupDirection_presence=0):
      """MODIFY COMPLETE Section 9.3.14"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1f)  # 00011111
      c = BearerCapability()
      packet = a / b / c
      if LowLayerCompatibility_presence is 1:
          d = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / d
      if HighLayerCompatibility_presence is 1:
          e = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / e
      if ReverseCallSetupDirection_presence is 1:
          f = ReverseCallSetupDirection(ieiRCSD=0xA3)
          packet = packet / f
      return packet
  
  
  def modifyReject(LowLayerCompatibility_presence=0,
                   HighLayerCompatibility_presence=0):
      """MODIFY REJECT Section 9.3.15"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x13)  # 00010011
      c = BearerCapability()
      d = Cause()
      packet = a / b / c / d
      if LowLayerCompatibility_presence is 1:
          e = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / e
      if HighLayerCompatibility_presence is 1:
          f = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / f
      return packet
  
  
  def notify():
      """NOTIFY Section 9.3.16"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x3e)  # 00111110
      c = NotificationIndicator()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def progress(UserUser_presence=0):
      """PROGRESS Section 9.3.17"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x3)  # 00000011
      c = ProgressIndicator()
      packet = a / b / c
      if UserUser_presence is 1:
          d = UserUserHdr()
          packet = packet / d
      return packet
  
  
  # Network to MS
  def ccEstablishment():
      """CC-ESTABLISHMENT Section 9.3.17a"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x4)  # 00000100
      c = SetupContainer()
      packet = a / b / c
      return packet
  
  
  def ccEstablishmentConfirmed(RepeatIndicator_presence=0,
                               BearerCapability_presence=0,
                               BearerCapability_presence1=0,
                               Cause_presence=0):
      """CC-ESTABLISHMENT CONFIRMED Section 9.3.17b"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x6)  # 00000110
      packet = a / b
      if RepeatIndicator_presence is 1:
          c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / c
      if BearerCapability_presence is 1:
          d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / d
      if BearerCapability_presence1 is 1:
          e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / e
      if Cause_presence is 1:
          f = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / f
      return packet
  
  
  # Network to MS
  def releaseNetToMs():
      """RELEASE Section 9.3.18.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x2d)  # 00101101
      c = CauseHdr(ieiC=0x08, eightBitC=0x0)
      d = CauseHdr(ieiC=0x08, eightBitC=0x0)
      e = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
      f = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
      packet = a / b / c / d / e / f
      return packet
  
  
  def releaseMsToNet(Cause_presence=0, Cause_presence1=0,
                     Facility_presence=0, UserUser_presence=0,
                     SsVersionIndicator_presence=0):
      """RELEASE Section 9.3.18.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x2d)  # 00101101
      packet = a / b
      if Cause_presence is 1:
          c = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / c
      if Cause_presence1 is 1:
          d = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / d
      if Facility_presence is 1:
          e = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / e
      if UserUser_presence is 1:
          f = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / f
      if SsVersionIndicator_presence is 1:
          g = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / g
      return packet
  
  
  # Network to MS
  def recall():
      """RECALL Section 9.3.18a"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0xb)  # 00001011
      c = RecallType()
      d = Facility()
      packet = a / b / c / d
      return packet
  
  
  # Network to MS
  def releaseCompleteNetToMs(Cause_presence=0, Facility_presence=0,
                             UserUser_presence=0):
      """RELEASE COMPLETE Section 9.3.19.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x2a)  # 00101010
      packet = a / b
      if Cause_presence is 1:
          c = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / c
      if Facility_presence is 1:
          d = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / d
      if UserUser_presence is 1:
          e = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / e
      return packet
  
  
  def releaseCompleteMsToNet(Cause_presence=0, Facility_presence=0,
                             UserUser_presence=0, SsVersionIndicator_presence=0):
      """RELEASE COMPLETE Section 9.3.19.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x2a)  # 00101010
      packet = a / b
      if Cause_presence is 1:
          c = CauseHdr(ieiC=0x08, eightBitC=0x0)
          packet = packet / c
      if Facility_presence is 1:
          d = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / d
      if UserUser_presence is 1:
          e = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / e
      if SsVersionIndicator_presence is 1:
          f = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / f
      return packet
  
  
  def retrieve():
      """RETRIEVE Section 9.3.20"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1c)  # 00011100
      packet = a / b
      return packet
  
  
  # Network to MS
  def retrieveAcknowledge():
      """RETRIEVE ACKNOWLEDGE Section 9.3.21"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1d)  # 00011101
      packet = a / b
      return packet
  
  
  # Network to MS
  def retrieveReject():
      """RETRIEVE REJECT Section 9.3.22"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1e)  # 00011110
      c = Cause()
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def setupMobileTerminated(RepeatIndicator_presence=0,
                            BearerCapability_presence=0,
                            BearerCapability_presence1=0,
                            Facility_presence=0, ProgressIndicator_presence=0,
                            Signal_presence=0,
                            CallingPartyBcdNumber_presence=0,
                            CallingPartySubaddress_presence=0,
                            CalledPartyBcdNumber_presence=0,
                            CalledPartySubaddress_presence=0,
  #                          RecallType_presence=0,
                            RedirectingPartyBcdNumber_presence=0,
                            RedirectingPartySubaddress_presence=0,
                            RepeatIndicator_presence1=0,
                            LowLayerCompatibility_presence=0,
                            LowLayerCompatibility_presence1=0,
                            RepeatIndicator_presence2=0,
                            HighLayerCompatibility_presence=0,
                            HighLayerCompatibility_presence1=0,
                            UserUser_presence=0, PriorityLevel_presence=0,
                            AlertingPattern_presence=0):
      """SETUP Section 9.3.23.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x5)  # 00000101
      packet = a / b
      if RepeatIndicator_presence is 1:
          c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / c
      if BearerCapability_presence is 1:
          d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / d
      if BearerCapability_presence1 is 1:
          e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / e
      if Facility_presence is 1:
          f = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / f
      if ProgressIndicator_presence is 1:
          g = ProgressIndicatorHdr(ieiPI=0x1E, eightBitPI=0x0)
          packet = packet / g
      if Signal_presence is 1:
          h = SignalHdr(ieiS=0x34, eightBitS=0x0)
          packet = packet / h
      if CallingPartyBcdNumber_presence is 1:
          i = CallingPartyBcdNumberHdr(ieiCPBN=0x5C, eightBitCPBN=0x0)
          packet = packet / i
      if CallingPartySubaddress_presence is 1:
          j = CallingPartySubaddressHdr(ieiCPS=0x5D, eightBitCPS=0x0)
          packet = packet / j
      if CalledPartyBcdNumber_presence is 1:
          k = CalledPartyBcdNumberHdr(ieiCPBN=0x5E, eightBitCPBN=0x0)
          packet = packet / k
      if CalledPartySubaddress_presence is 1:
          l = CalledPartySubaddressHdr(ieiCPS=0x6D, eightBitCPS=0x0)
          packet = packet / l
      if RedirectingPartyBcdNumber_presence is 1:
          n = RedirectingPartyBcdNumberHdr(ieiRPBN=0x74, eightBitRPBN=0x0)
          packet = packet / n
      if RedirectingPartySubaddress_presence is 1:
          m = RedirectingPartySubaddress_presence(ieiRPBN=0x75, eightBitRPBN=0x0)
          packet = packet / m
      if RepeatIndicator_presence1 is 1:
          o = RepeatIndicatorHdr(ieiRI=0xD0, eightBitRI=0x0)
          packet = packet / o
      if LowLayerCompatibility_presence is 1:
          p = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / p
      if LowLayerCompatibility_presence1 is 1:
          q = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / q
      if RepeatIndicator_presence2 is 1:
          r = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / r
      if HighLayerCompatibility_presence is 1:
          s = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / s
      if HighLayerCompatibility_presence1 is 1:
          t = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / t
      if UserUser_presence is 1:
          u = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / u
      if PriorityLevel_presence is 1:
          v = PriorityLevelHdr(ieiPL=0x8, eightBitPL=0x0)
          packet = packet / v
      if AlertingPattern_presence is 1:
          w = AlertingPatternHdr(ieiAP=0x19, eightBitAP=0x0)
          packet = packet / w
      return packet
  
  
  def setupMobileOriginated(RepeatIndicator_presence=0,
                            BearerCapability_presence=0,
                            BearerCapability_presence1=0,
                            Facility_presence=0,
                            CallingPartySubaddress_presence=0,
                            CalledPartyBcdNumber_presence=0,
                            CalledPartySubaddress_presence=0,
                            RepeatIndicator_presence1=0,
                            LowLayerCompatibility_presence=0,
                            LowLayerCompatibility_presence1=0,
                            RepeatIndicator_presence2=0,
                            HighLayerCompatibility_presence=0,
                            HighLayerCompatibility_presence1=0,
                            UserUser_presence=0, SsVersionIndicator_presence=0,
                            ClirSuppression_presence=0,
                            ClirInvocation_presence=0,
                            CallControlCapabilities_presence=0,
                            Facility_presence1=0,
                            Facility_presence2=0):
      """SETUP Section 9.3.23.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x5)  # 00000101
      packet = a / b
      if RepeatIndicator_presence is 1:
          c = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / c
      if BearerCapability_presence is 1:
          d = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / d
      if BearerCapability_presence1 is 1:
          e = BearerCapabilityHdr(ieiBC=0x04, eightBitBC=0x0)
          packet = packet / e
      if Facility_presence is 1:
          f = FacilityHdr(ieiF=0x1C, eightBitF=0x0)
          packet = packet / f
      if CallingPartySubaddress_presence is 1:
          g = CallingPartySubaddressHdr(ieiCPS=0x5D, eightBitCPS=0x0)
          packet = packet / g
      if CalledPartyBcdNumber_presence is 1:
          h = CalledPartyBcdNumberHdr(ieiCPBN=0x5E, eightBitCPBN=0x0)
          packet = packet / h
      if CalledPartySubaddress_presence is 1:
          i = CalledPartySubaddressHdr(ieiCPS=0x6D, eightBitCPS=0x0)
          packet = packet / i
      if RepeatIndicator_presence1 is 1:
          j = RepeatIndicatorHdr(ieiRI=0xD0, eightBitRI=0x0)
          packet = packet / j
      if LowLayerCompatibility_presence is 1:
          k = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / k
      if LowLayerCompatibility_presence1 is 1:
          l = LowLayerCompatibilityHdr(ieiLLC=0x7C, eightBitLLC=0x0)
          packet = packet / l
      if RepeatIndicator_presence2 is 1:
          m = RepeatIndicatorHdr(ieiRI=0xD, eightBitRI=0x0)
          packet = packet / m
      if HighLayerCompatibility_presence is 1:
          n = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / n
      if HighLayerCompatibility_presence1 is 1:
          o = HighLayerCompatibilityHdr(ieiHLC=0x7D, eightBitHLC=0x0)
          packet = packet / o
      if UserUser_presence is 1:
          p = UserUserHdr(ieiUU=0x7E, eightBitUU=0x0)
          packet = packet / p
      if SsVersionIndicator_presence is 1:
          q = SsVersionIndicatorHdr(ieiSVI=0x7F, eightBitSVI=0x0)
          packet = packet / q
      if ClirSuppression_presence is 1:
          r = ClirSuppressionHdr(ieiCS=0xA1, eightBitCS=0x0)
          packet = packet / r
      if ClirInvocation_presence is 1:
          s = ClirInvocationHdr(ieiCI=0xA2, eightBitCI=0x0)
          packet = packet / s
      if CallControlCapabilities_presence is 1:
          t = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0)
          packet = packet / t
      if Facility_presence1 is 1:
          u = FacilityHdr(ieiF=0x1D, eightBitF=0x0)
          packet = packet / u
      if Facility_presence2 is 1:
          v = FacilityHdr(ieiF=0x1B, eightBitF=0x0)
          packet = packet / v
      return packet
  
  
  def startCc(CallControlCapabilities_presence=0):
      """START CC Section 9.3.23a"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x9)  # 00001001
      packet = a / b
      if CallControlCapabilities_presence is 1:
          c = CallControlCapabilitiesHdr(ieiCCC=0x15, eightBitCCC=0x0)
          packet = packet / c
      return packet
  
  
  def startDtmf():
      """START DTMF Section 9.3.24"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x35)  # 00110101
      c = KeypadFacilityHdr(ieiKF=0x2C, eightBitKF=0x0)
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def startDtmfAcknowledge():
      """START DTMF ACKNOWLEDGE Section 9.3.25"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x32)  # 00110010
      c = KeypadFacilityHdr(ieiKF=0x2C, eightBitKF=0x0)
      packet = a / b / c
      return packet
  
  
  # Network to MS
  def startDtmfReject():
      """ START DTMF REJECT Section 9.3.26"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x37)  # 00110111
      c = Cause()
      packet = a / b / c
      return packet
  
  
  def status(AuxiliaryStates_presence=0):
      """STATUS Section 9.3.27"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x3d)  # 00111101
      c = Cause()
      d = CallState()
      packet = a / b / c / d
      if AuxiliaryStates_presence is 1:
          e = AuxiliaryStatesHdr(ieiAS=0x24, eightBitAS=0x0)
          packet = packet / e
      return packet
  
  
  def statusEnquiry():
      """STATUS ENQUIRY Section 9.3.28"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x34)  # 00110100
      packet = a / b
      return packet
  
  
  def stopDtmf():
      """STOP DTMF Section 9.3.29"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x31)  # 00110001
      packet = a / b
      return packet
  
  
  # Network to MS
  def stopDtmfAcknowledge():
      """STOP DTMF ACKNOWLEDGE Section 9.3.30"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x32)  # 00110010
      packet = a / b
      return packet
  
  
  def userInformation(MoreData_presence=0):
      """USER INFORMATION Section 9.3.31"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x20)  # 000100000
      c = UserUser()
      packet = a / b / c
      if MoreData_presence is 1:
          d = MoreDataHdr(ieiMD=0xA0, eightBitMD=0x0)
          packet = packet / d
      return packet
  
  #
  # 9.4 GPRS Mobility Management Messages
  #
  
  
  def attachRequest(PTmsiSignature_presence=0, GprsTimer_presence=0,
                    TmsiStatus_presence=0):
      """ATTACH REQUEST Section 9.4.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1)  # 0000001
      c = MsNetworkCapability()
      d = AttachTypeAndCiphKeySeqNr()
      f = DrxParameter()
      g = MobileId()
      h = RoutingAreaIdentification()
      i = MsRadioAccessCapability()
      packet = a / b / c / d / f / g / h / i
      if PTmsiSignature_presence is 1:
          j = PTmsiSignature(ieiPTS=0x19)
          packet = packet / j
      if GprsTimer_presence is 1:
          k = GprsTimer(ieiGT=0x17)
          packet = packet / k
      if TmsiStatus_presence is 1:
          l = TmsiStatus(ieiTS=0x9)
          packet = packet / l
      return packet
  
  
  def attachAccept(PTmsiSignature_presence=0, GprsTimer_presence=0,
                   MobileId_presence=0, MobileId_presence1=0,
                   GmmCause_presence=0):
      """ATTACH ACCEPT Section 9.4.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x2)  # 00000010
      c = AttachResult()
      d = ForceToStandby()
      e = GprsTimer()
      f = RadioPriorityAndSpareHalfOctets()
      h = RoutingAreaIdentification()
      packet = a / b / c / d / e / f / h
      if PTmsiSignature_presence is 1:
          i = PTmsiSignature(ieiPTS=0x19)
          packet = packet / i
      if GprsTimer_presence is 1:
          j = GprsTimer(ieiGT=0x17)
          packet = packet / j
      if MobileId_presence is 1:
          k = MobileIdHdr(ieiMI=0x18, eightBitMI=0x0)
          packet = packet / k
      if MobileId_presence1 is 1:
          l = MobileIdHdr(ieiMI=0x23, eightBitMI=0x0)
          packet = packet / l
      if GmmCause_presence is 1:
          m = GmmCause(ieiGC=0x25)
          packet = packet / m
      return packet
  
  
  def attachComplete():
      """ATTACH COMPLETE Section 9.4.3"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x3)  # 00000011
      packet = a / b
      return packet
  
  
  def attachReject():
      """ATTACH REJECT Section 9.4.4"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x1)  # 00000001
      c = GmmCause()
      packet = a / b / c
      return packet
  
  
  def detachRequest(GmmCause_presence=0):
      """DETACH REQUEST Section 9.4.5"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x5)  # 00000101
      c = DetachTypeAndForceToStandby()
      packet = a / b / c
      if GmmCause_presence is 1:
          e = GmmCause(ieiGC=0x25)
          packet = packet / e
      return packet
  
  
  def detachRequestMsOriginating():
      """DETACH REQUEST Section 9.4.5.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x5)  # 00000101
      c = DetachTypeAndSpareHalfOctets()
      packet = a / b / c
      return packet
  
  
  def detachAcceptMsTerminated():
      """DETACH ACCEPT Section 9.4.6.1"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x6)  # 00000110
      packet = a / b
      return packet
  
  
  def detachAcceptMsOriginating():
      """DETACH ACCEPT Section 9.4.6.2"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x6)  # 00000110
      c = ForceToStandbyAndSpareHalfOctets()
      packet = a / b / c
      return packet
  
  
  def ptmsiReallocationCommand(PTmsiSignature_presence=0):
      """P-TMSI REALLOCATION COMMAND Section 9.4.7"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x10)  # 00010000
      c = MobileId()
      d = RoutingAreaIdentification()
      e = ForceToStandbyAndSpareHalfOctets()
      packet = a / b / c / d / e
      if PTmsiSignature_presence is 1:
          g = PTmsiSignature(ieiPTS=0x19)
          packet = packet / g
      return packet
  
  
  def ptmsiReallocationComplete():
      """P-TMSI REALLOCATION COMPLETE Section 9.4.8"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x11)  # 00010001
      packet = a / b
      return packet
  
  
  def authenticationAndCipheringRequest(
                                        AuthenticationParameterRAND_presence=0,
                                        CiphKeySeqNr_presence=0):
      """AUTHENTICATION AND CIPHERING REQUEST Section 9.4.9"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x12)  # 00010010
      d = CipheringAlgorithmAndImeisvRequest()
      e = ForceToStandbyAndAcReferenceNumber()
      packet = a / b / d / e
      if AuthenticationParameterRAND_presence is 1:
          g = AuthenticationParameterRAND(ieiAPR=0x21)
          packet = packet / g
      if CiphKeySeqNr_presence is 1:
          h = CiphKeySeqNrHdr(ieiCKSN=0x08, eightBitCKSN=0x0)
          packet = packet / h
      return packet
  
  
  def authenticationAndCipheringResponse(
                                         AuthenticationParameterSRES_presence=0,
                                         MobileId_presence=0):
      """AUTHENTICATION AND CIPHERING RESPONSE Section 9.4.10"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x13)  # 00010011
      c = AcReferenceNumberAndSpareHalfOctets()
      packet = a / b / c
      if AuthenticationParameterSRES_presence is 1:
          e = AuthenticationParameterSRES(ieiAPS=0x22)
          packet = packet / e
      if MobileId_presence is 1:
          f = MobileIdHdr(ieiMI=0x23, eightBitMI=0x0)
          packet = packet / f
      return packet
  
  
  def authenticationAndCipheringReject():
      """AUTHENTICATION AND CIPHERING REJECT Section 9.4.11"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x14)  # 00010100
      packet = a / b
      return packet
  
  
  def identityRequest():
      """IDENTITY REQUEST Section 9.4.12"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x15)  # 00010101
      c = IdentityType2AndforceToStandby()
      packet = a / b / c
      return packet
  
  
  def identityResponse():
      """IDENTITY RESPONSE Section 9.4.13"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x16)  # 00010110
      c = MobileId()
      packet = a / b / c
      return packet
  
  
  def routingAreaUpdateRequest(PTmsiSignature_presence=0,
                               GprsTimer_presence=0,
                               DrxParameter_presence=0,
                               TmsiStatus_presence=0):
      """ROUTING AREA UPDATE REQUEST Section 9.4.14"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x8)  # 00001000
      c = UpdateTypeAndCiphKeySeqNr()
      e = RoutingAreaIdentification()
      f = MsNetworkCapability()
      packet = a / b / c / e / f
      if PTmsiSignature_presence is 1:
          g = PTmsiSignature(ieiPTS=0x19)
          packet = packet / g
      if GprsTimer_presence is 1:
          h = GprsTimer(ieiGT=0x17)
          packet = packet / h
      if DrxParameter_presence is 1:
          i = DrxParameter(ieiDP=0x27)
          packet = packet / i
      if TmsiStatus_presence is 1:
          j = TmsiStatus(ieiTS=0x9)
          packet = packet / j
      return packet
  
  
  def routingAreaUpdateAccept(PTmsiSignature_presence=0,
                              MobileId_presence=0, MobileId_presence1=0,
                              ReceiveNpduNumbersList_presence=0,
                              GprsTimer_presence=0, GmmCause_presence=0):
      """ROUTING AREA UPDATE ACCEPT Section 9.4.15"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x9)  # 00001001
      c = ForceToStandbyAndUpdateResult()
      e = GprsTimer()
      f = RoutingAreaIdentification()
      packet = a / b / c / e / f
      if PTmsiSignature_presence is 1:
          g = PTmsiSignature(ieiPTS=0x19)
          packet = packet / g
      if MobileId_presence is 1:
          h = MobileIdHdr(ieiMI=0x18, eightBitMI=0x0)
          packet = packet / h
      if MobileId_presence1 is 1:
          i = MobileIdHdr(ieiMI=0x23, eightBitMI=0x0)
          packet = packet / i
      if ReceiveNpduNumbersList_presence is 1:
          j = ReceiveNpduNumbersList(ieiRNNL=0x26)
          packet = packet / j
      if GprsTimer_presence is 1:
          k = GprsTimer(ieiGT=0x17)
          packet = packet / k
      if GmmCause_presence is 1:
          l = GmmCause(ieiGC=0x25)
          packet = packet / l
      return packet
  
  
  def routingAreaUpdateComplete(ReceiveNpduNumbersList_presence=0):
      """ROUTING AREA UPDATE COMPLETE Section 9.4.16"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0xa)  # 00001010
      packet = a / b
      if ReceiveNpduNumbersList_presence is 1:
          c = ReceiveNpduNumbersList(ieiRNNL=0x26)
          packet = packet / c
      return packet
  
  
  def routingAreaUpdateReject():
      """ROUTING AREA UPDATE REJECT Section 9.4.17"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0xb)  # 00001011
      c = GmmCause()
      d = ForceToStandbyAndSpareHalfOctets()
      packet = a / b / c / d
      return packet
  
  
  def gmmStatus():
      """GMM STATUS Section 9.4.18"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x20)  # 00100000
      c = GmmCause()
      packet = a / b / c
      return packet
  
  
  def gmmInformation(NetworkName_presence=0, NetworkName_presence1=0,
                     TimeZone_presence=0, TimeZoneAndTime_presence=0,
                     LsaIdentifier_presence=0):
      """GMM INFORMATION Section 9.4.19"""
      a = TpPd(pd=0x3)
      b = MessageType(mesType=0x21)  # 00100001
      packet = a / b
      if NetworkName_presence is 1:
          c = NetworkNameHdr(ieiNN=0x43, eightBitNN=0x0)
          packet = packet / c
      if NetworkName_presence1 is 1:
          d = NetworkNameHdr(ieiNN=0x45, eightBitNN=0x0)
          packet = packet / d
      if TimeZone_presence is 1:
          e = TimeZoneHdr(ieiTZ=0x46, eightBitTZ=0x0)
          packet = packet / e
      if TimeZoneAndTime_presence is 1:
          f = TimeZoneAndTimeHdr(ieiTZAT=0x47, eightBitTZAT=0x0)
          packet = packet / f
      if LsaIdentifier_presence is 1:
          g = LsaIdentifierHdr(ieiLI=0x48, eightBitLI=0x0)
          packet = packet / g
      return packet
  
  #
  # 9.5 GPRS Session Management Messages
  #
  
  
  def activatePdpContextRequest(AccessPointName_presence=0,
                                ProtocolConfigurationOptions_presence=0):
      """ACTIVATE PDP CONTEXT REQUEST Section 9.5.1"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x41)  # 01000001
      c = NetworkServiceAccessPointIdentifier()
      d = LlcServiceAccessPointIdentifier()
      e = QualityOfService()
      f = PacketDataProtocolAddress()
      packet = a / b / c / d / e / f
      if AccessPointName_presence is 1:
          g = AccessPointName(ieiAPN=0x28)
          packet = packet / g
      if ProtocolConfigurationOptions_presence is 1:
          h = ProtocolConfigurationOptions(ieiPCO=0x27)
          packet = packet / h
      return packet
  
  
  def activatePdpContextAccept(PacketDataProtocolAddress_presence=0,
                               ProtocolConfigurationOptions_presence=0):
      """ACTIVATE PDP CONTEXT ACCEPT Section 9.5.2"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x42)  # 01000010
      c = LlcServiceAccessPointIdentifier()
      d = QualityOfService()
      e = RadioPriorityAndSpareHalfOctets()
      packet = a / b / c / d / e
      if PacketDataProtocolAddress_presence is 1:
          f = PacketDataProtocolAddress(ieiPDPA=0x2B)
          packet = packet / f
      if ProtocolConfigurationOptions_presence is 1:
          g = ProtocolConfigurationOptions(ieiPCO=0x27)
          packet = packet / g
      return packet
  
  
  def activatePdpContextReject(ProtocolConfigurationOptions_presence=0):
      """ACTIVATE PDP CONTEXT REJECT Section 9.5.3"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x43)  # 01000011
      c = SmCause()
      packet = a / b / c
      if ProtocolConfigurationOptions_presence is 1:
          d = ProtocolConfigurationOptions(ieiPCO=0x27)
          packet = packet / d
      return packet
  
  
  def requestPdpContextActivation(AccessPointName_presence=0):
      """REQUEST PDP CONTEXT ACTIVATION Section 9.5.4"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x44)  # 01000100
      c = PacketDataProtocolAddress()
      packet = a / b / c
      if AccessPointName_presence is 1:
          d = AccessPointName(ieiAPN=0x28)
          packet = packet / d
      return packet
  
  
  def requestPdpContextActivationReject():
      """REQUEST PDP CONTEXT ACTIVATION REJECT Section 9.5.5"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x45)  # 01000101
      c = SmCause()
      packet = a / b / c
      return packet
  
  
  def modifyPdpContextRequest():
      """MODIFY PDP CONTEXT REQUEST Section 9.5.6"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x48)  # 01001000
      c = RadioPriorityAndSpareHalfOctets()
      d = LlcServiceAccessPointIdentifier()
      e = QualityOfService()
      packet = a / b / c / d / e
      return packet
  
  
  def modifyPdpContextAccept():
      """MODIFY PDP CONTEXT ACCEPT Section 9.5.7"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x45)  # 01000101
      packet = a / b
      return packet
  
  
  def deactivatePdpContextRequest():
      """DEACTIVATE PDP CONTEXT REQUEST Section 9.5.8"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x46)  # 01000110
      c = SmCause()
      packet = a / b / c
      return packet
  
  
  def deactivatePdpContextAccept():
      """DEACTIVATE PDP CONTEXT ACCEPT Section 9.5.9"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x47)  # 01000111
      packet = a / b
      return packet
  
  
  def activateAaPdpContextRequest(AccessPointName_presence=0,
                                  ProtocolConfigurationOptions_presence=0,
                                  GprsTimer_presence=0):
      """ACTIVATE AA PDP CONTEXT REQUEST Section 9.5.10"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x50)  # 01010000
      c = NetworkServiceAccessPointIdentifier()
      d = LlcServiceAccessPointIdentifier()
      e = QualityOfService()
      f = PacketDataProtocolAddress()
      packet = a / b / c / d / e / f
      if AccessPointName_presence is 1:
          g = AccessPointName(ieiAPN=0x28)
          packet = packet / g
      if ProtocolConfigurationOptions_presence is 1:
          h = ProtocolConfigurationOptions(ieiPCO=0x27)
          packet = packet / h
      if GprsTimer_presence is 1:
          i = GprsTimer(ieiGT=0x29)
          packet = packet / i
      return packet
  
  
  def activateAaPdpContextAccept(ProtocolConfigurationOptions_presence=0,
                                 GprsTimer_presence=0):
      """ACTIVATE AA PDP CONTEXT ACCEPT Section 9.5.11"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x51)  # 01010001
      c = LlcServiceAccessPointIdentifier()
      d = QualityOfService()
      e = MobileId()
      f = PacketDataProtocolAddress()
      g = RadioPriorityAndSpareHalfOctets()
      packet = a / b / c / d / e / f / g
      if ProtocolConfigurationOptions_presence is 1:
          i = ProtocolConfigurationOptions(ieiPCO=0x27)
          packet = packet / i
      if GprsTimer_presence is 1:
          j = GprsTimer(ieiGT=0x29)
          packet = packet / j
      return packet
  
  
  def activateAaPdpContextReject(ProtocolConfigurationOptions_presence=0):
      """ACTIVATE AA PDP CONTEXT REJECT Section 9.5.12"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x52)  # 01010010
      c = SmCause()
      packet = a / b / c
      if ProtocolConfigurationOptions_presence is 1:
          d = ProtocolConfigurationOptions(ieiPCO=0x27)
          packet = packet / d
      return packet
  
  
  def deactivateAaPdpContextRequest():
      """DEACTIVATE AA PDP CONTEXT REQUEST Section 9.5.13"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x53)  # 01010011
      c = AaDeactivationCauseAndSpareHalfOctets()
      packet = a / b / c
      return packet
  
  
  def deactivateAaPdpContextAccept():
      """DEACTIVATE AA PDP CONTEXT ACCEPT Section 9.5.14"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x54)  # 01010100
      packet = a / b
      return packet
  
  
  def smStatus():
      """SM STATUS Section 9.5.15"""
      a = TpPd(pd=0x8)
      b = MessageType(mesType=0x55)  # 01010101
      c = SmCause()
      packet = a / b / c
      return packet
  
  
  # ============================================#
  # Information Elements contents (Section 10)  #
  # =========================================== #
  
  ####
  # This section contains the elements we need to build the messages
  ####
  
  #
  # Common information elements:
  #
  class CellIdentityHdr(Packet):
      """ Cell identity Section 10.5.1.1 """
      name = "Cell Identity"
      fields_desc = [
               BitField("eightBitCI", None, 1),
               XBitField("ieiCI", None, 7),
               ByteField("ciValue1", 0x0),
               ByteField("ciValue2", 0x0)
               ]
  
  
  class CiphKeySeqNrHdr(Packet):
      """ Ciphering Key Sequence Number Section 10.5.1.2 """
      name = "Cipher Key Sequence Number"
      fields_desc = [
               XBitField("ieiCKSN", None, 4),
               BitField("spare", 0x0, 1),
               BitField("keySeq", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class CiphKeySeqNrAndSpareHalfOctets(Packet):
      name = "Cipher Key Sequence Number and Spare Half Octets"
      fields_desc = [
                BitField("spare", 0x0, 1),
                BitField("keySeq", 0x0, 3),
                BitField("spareHalfOctets", 0x0, 4)
                ]
  
  
  # Fix 1/2 len problem
  class CiphKeySeqNrAndMacModeAndChannelCodingRequest(Packet):
      name = "Cipher Key Sequence Number and Mac Mode And Channel Coding Request"
      fields_desc = [
                BitField("spare", 0x0, 1),
                BitField("keySeq", 0x0, 3),
                BitField("macMode", 0x0, 2),
                BitField("cs", 0x0, 2)
                ]
  
  
  class LocalAreaIdHdr(Packet):
      """ Local Area Identification Section 10.5.1.3 """
      name = "Location Area Identification"
      fields_desc = [
               BitField("eightBitLAI", None, 1),
               XBitField("ieiLAI", None, 7),
               BitField("mccDigit2", 0x0, 4),
               BitField("mccDigit1", 0x0, 4),
               BitField("mncDigit3", 0x0, 4),
               BitField("mccDigit3", 0x0, 4),
               BitField("mncDigit2", 0x0, 4),
               BitField("mncDigit1", 0x0, 4),
               ByteField("lac1", 0x0),
               ByteField("lac2", 0x0)
               ]
  #
  # The Mobile Identity is a type 4 information element with a minimum
  # length of 3 octet and 11 octets length maximal.
  #
  
  
  # len 3 - 11
  class MobileIdHdr(Packet):
      """ Mobile Identity  Section 10.5.1.4 """
      name = "Mobile Identity"
      fields_desc = [
               BitField("eightBitMI", 0x0, 1),
               XBitField("ieiMI", 0x0, 7),
  
               XByteField("lengthMI", None),
  
               BitField("idDigit1", 0x0, 4),
               BitField("oddEven", 0x0, 1),
               BitField("typeOfId", 0x0, 3),
  
               BitField("idDigit2_1", None, 4),  # optional
               BitField("idDigit2", None, 4),
  
               BitField("idDigit3_1", None, 4),
               BitField("idDigit3", None, 4),
  
               BitField("idDigit4_1", None, 4),
               BitField("idDigit4", None, 4),
  
               BitField("idDigit5_1", None, 4),
               BitField("idDigit5", None, 4),
  
               BitField("idDigit6_1", None, 4),
               BitField("idDigit6", None, 4),
               BitField("idDigit7_1", None, 4),
               BitField("idDigit7", None, 4),
               BitField("idDigit8_1", None, 4),
               BitField("idDigit8", None, 4),
               BitField("idDigit9_1", None, 4),
               BitField("idDigit9", None, 4),
               ]
  
      def post_build(self, p, pay):
          # this list holds the values of the variables, the
          # INTERESTING value!
          a = [getattr(self, fld.name, None) for fld in self.fields_desc]
          res = adapt(3, 11, a, self.fields_desc)
          if self.lengthMI is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MobileStationClassmark1Hdr(Packet):
      """ Mobile Station Classmark 1 Section 10.5.1.5 """
      name = "Mobile Station Classmark 1"
      fields_desc = [
               BitField("eightBitiMSC1", None, 1),
               XBitField("ieiMSC1", None, 7),
               BitField("spare", 0x0, 1),
               BitField("revisionLvl", 0x0, 2),
               BitField("esInd", 0x0, 1),
               BitField("a51", 0x0, 1),
               BitField("rfPowerCap", 0x0, 3)
               ]
  
  
  class MobileStationClassmark2Hdr(Packet):
      """ Mobile Station Classmark 2 Section 10.5.1.6 """
      name = "Mobile Station Classmark 2"
      fields_desc = [
               BitField("eightBitMSC2", None, 1),
               XBitField("ieiMSC2", None, 7),
               XByteField("lengthMSC2", 0x3),
               BitField("spare", 0x0, 1),
               BitField("revisionLvl", 0x0, 2),
               BitField("esInd", 0x0, 1),
               BitField("a51", 0x0, 1),
               BitField("rfPowerCap", 0x0, 3),
               BitField("spare1", 0x0, 1),
               BitField("psCap", 0x0, 1),
               BitField("ssScreenInd", 0x0, 2),
               BitField("smCaPabi", 0x0, 1),
               BitField("vbs", 0x0, 1),
               BitField("vgcs", 0x0, 1),
               BitField("fc", 0x0, 1),
               BitField("cm3", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("lcsvaCap", 0x0, 1),
               BitField("spare3", 0x0, 1),
               BitField("soLsa", 0x0, 1),
               BitField("cmsp", 0x0, 1),
               BitField("a53", 0x0, 1),
               BitField("a52", 0x0, 1)
               ]
  
  
  # len max 14
  class MobileStationClassmark3(Packet):
      """ Mobile Station Classmark 3 Section 10.5.1.7 """
      name = "Mobile Station Classmark 3"
      fields_desc = [
               # FIXME
               ByteField("ieiMSC3", 0x0),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0)
               ]
  
  
  class SpareHalfOctets(Packet):
      """ Spare Half Octet Section 10.5.1.8 """
      name = "Spare Half Octet"
      fields_desc = [
               BitField("filler", None, 4),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class DescriptiveGroupOrBroadcastCallReferenceHdr(Packet):
      """ Descriptive group or broadcast call reference  Section 10.5.1.9 """
      name = "Descriptive Group or Broadcast Call Reference"
      fields_desc = [
               BitField("eightBitDGOBCR", None, 1),
               XBitField("ieiDGOBCR", None, 7),
               BitField("binCallRef", 0x0, 27),
               BitField("sf", 0x0, 1),
               BitField("fa", 0x0, 1),
               BitField("callPrio", 0x0, 3),
               BitField("cipherInfo", 0x0, 4),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("spare3", 0x0, 1),
               BitField("spare4", 0x0, 1)
               ]
  
  
  class GroupCipherKeyNumber(Packet):
      """ Group Cipher Key Number reference  Section 10.5.1.10 """
      name = "Group Cipher Key Number"
      fields_desc = [
               XBitField("ieiGCKN", None, 4),
               BitField("groupCipher", 0x0, 4)
               ]
  
  
  class PdAndSapiHdr(Packet):
      """ PD and SAPI $(CCBS)$  Section 10.5.1.10a """
      name = "PD and SAPI $(CCBS)$"
      fields_desc = [
               BitField("eightBitPAS", None, 1),
               XBitField("ieiPAS", None, 7),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("sapi", 0x0, 2),
               BitField("pd", 0x0, 4)
               ]
  
  
  class PriorityLevelHdr(Packet):
      """ Priority Level Section 10.5.1.11 """
      name = "Priority Level"
      fields_desc = [
               XBitField("ieiPL", None, 4),
               BitField("spare", 0x0, 1),
               BitField("callPrio", 0x0, 3)
               ]
  
  #
  # Radio Resource management information elements
  #
  
  
  # len 6 to max for L3 message (251)
  class BaRangeHdr(Packet):
      """ BA Range Section 10.5.2.1a """
      name = "BA Range"
      fields_desc = [
               BitField("eightBitBR", None, 1),
               XBitField("ieiBR", None, 7),
  
               XByteField("lengthBR", None),
  #error: byte format requires -128 <= number <= 127
               ByteField("nrOfRanges", 0x0),
  #              # rX = range X
  #              # L o = Lower H i = higher
  #              # H p = high Part Lp = low Part
               ByteField("r1LoHp", 0x0),
  
               BitField("r1LoLp", 0x0, 3),
               BitField("r1HiHp", 0x0, 5),
  
               BitField("r1HiLp", 0x0, 4),
               BitField("r2LoHp", 0x0, 4),
               # optional
               BitField("r2LoLp", None, 5),
               BitField("r2HiHp", None, 3),
  
               ByteField("r2HiLp", None),
               ByteField("r3LoHp", None),
  
               BitField("r3LoLp", None, 5),
               BitField("r3HiHp", None, 3),
  
               ByteField("r3HiLp", None),
               ByteField("r4LoHp", None),
  
               BitField("r4LoLp", None, 5),
               BitField("r4HiHp", None, 3),
               ByteField("r4HiLp", None),
               ByteField("r5LoHp", None),
  
               BitField("r5LoLp", None, 5),
               BitField("r5HiHp", None, 3),
               ByteField("r5HiLp", None),
               ByteField("r6LoHp", None),
  
               BitField("r6LoLp", None, 5),
               BitField("r6HiHp", None, 3),
               ByteField("r6HiLp", None),
               ByteField("r7LoHp", None),
  
               BitField("r7LoLp", None, 5),
               BitField("r7HiHp", None, 3),
               ByteField("r7HiLp", None),
               ByteField("r8LoHp", None),
  
               BitField("r8LoLp", None, 5),
               BitField("r8HiHp", None, 3),
               ByteField("r8HiLp", None),
               ByteField("r9LoHp", None),
  
               BitField("r9LoLp", None, 5),
               BitField("r9HiHp", None, 3),
               ByteField("r9HiLp", None),
               ByteField("r10LoHp", None),
  
               BitField("r10LoLp", None, 5),
               BitField("r10HiHp", None, 3),
               ByteField("r10HiLp", None),
               ByteField("r11LoHp", None),
  
               BitField("r11LoLp", None, 5),
               BitField("r11HiHp", None, 3),
               ByteField("r11HiLp", None),
               ByteField("r12LoHp", None),
  
               BitField("r12LoLp", None, 5),
               BitField("r12HiHp", None, 3),
               ByteField("r12HiLp", None),
               ByteField("r13LoHp", None),
  
               BitField("r13LoLp", None, 5),
               BitField("r13HiHp", None, 3),
               ByteField("r13HiLp", None),
               ByteField("r14LoHp", None),
  
               BitField("r14LoLp", None, 5),
               BitField("r14HiHp", None, 3),
               ByteField("r14HiLp", None),
               ByteField("r15LoHp", None),
  
               BitField("r15LoLp", None, 5),
               BitField("r15HiHp", None, 3),
               ByteField("r15HiLp", None),
               ByteField("r16LoHp", None),
  
               BitField("r16LoLp", None, 5),
               BitField("r16HiHp", None, 3),
               ByteField("r16HiLp", None),
               ByteField("r17LoHp", None),
  
               BitField("r17LoLp", None, 5),
               BitField("r17HiHp", None, 3),
               ByteField("r17HiLp", None),
               ByteField("r18LoHp", None),
  
               BitField("r18LoLp", None, 5),
               BitField("r18HiHp", None, 3),
               ByteField("r18HiLp", None),
               ByteField("r19LoHp", None),
  
               BitField("r19LoLp", None, 5),
               BitField("r19HiHp", None, 3),
               ByteField("r19HiLp", None),
               ByteField("r20LoHp", None),
  
               BitField("r20LoLp", None, 5),
               BitField("r20HiHp", None, 3),
               ByteField("r20HiLp", None),
               ByteField("r21LoHp", None),
  
               BitField("r21LoLp", None, 5),
               BitField("r21HiHp", None, 3),
               ByteField("r21HiLp", None),
               ByteField("r22LoHp", None),
  
               BitField("r22LoLp", None, 5),
               BitField("r22HiHp", None, 3),
               ByteField("r22HiLp", None),
               ByteField("r23LoHp", None),
  
               BitField("r23LoLp", None, 5),
               BitField("r23HiHp", None, 3),
               ByteField("r23HiLp", None),
               ByteField("r24LoHp", None),
  
               BitField("r24LoLp", None, 5),
               BitField("r24HiHp", None, 3),
               ByteField("r24HiLp", None),
               ByteField("r25LoHp", None),
  
               BitField("r25LoLp", None, 5),
               BitField("r25HiHp", None, 3),
               ByteField("r25HiLp", None),
               ByteField("r26LoHp", None),
  
               BitField("r26LoLp", None, 5),
               BitField("r26HiHp", None, 3),
               ByteField("r26HiLp", None),
               ByteField("r27LoHp", None),
  
               BitField("r27LoLp", None, 5),
               BitField("r27HiHp", None, 3),
               ByteField("r27HiLp", None),
               ByteField("r28LoHp", None),
  
               BitField("r28LoLp", None, 5),
               BitField("r28HiHp", None, 3),
               ByteField("r28HiLp", None),
               ByteField("r29LoHp", None),
  
               BitField("r29LoLp", None, 5),
               BitField("r29HiHp", None, 3),
               ByteField("r29HiLp", None),
               ByteField("r30LoHp", None),
  
               BitField("r30LoLp", None, 5),
               BitField("r30HiHp", None, 3),
               ByteField("r30HiLp", None),
               ByteField("r31LoHp", None),
  
               BitField("r31LoLp", None, 5),
               BitField("r31HiHp", None, 3),
               ByteField("r31HiLp", None),
               ByteField("r32LoHp", None),
  
               BitField("r32LoLp", None, 5),
               BitField("r32HiHp", None, 3),
               ByteField("r32HiLp", None),
               ByteField("r33LoHp", None),
  
               BitField("r33LoLp", None, 5),
               BitField("r33HiHp", None, 3),
               ByteField("r33HiLp", None),
               ByteField("r34LoHp", None),
  
               BitField("r34LoLp", None, 5),
               BitField("r34HiHp", None, 3),
               ByteField("r34HiLp", None),
               ByteField("r35LoHp", None),
  
               BitField("r35LoLp", None, 5),
               BitField("r35HiHp", None, 3),
               ByteField("r35HiLp", None),
               ByteField("r36LoHp", None),
  
               BitField("r36LoLp", None, 5),
               BitField("r36HiHp", None, 3),
               ByteField("r36HiLp", None),
               ByteField("r37LoHp", None),
  
               BitField("r37LoLp", None, 5),
               BitField("r37HiHp", None, 3),
               ByteField("r37HiLp", None),
               ByteField("r38LoHp", None),
  
               BitField("r38LoLp", None, 5),
               BitField("r38HiHp", None, 3),
               ByteField("r38HiLp", None),
               ByteField("r39LoHp", None),
  
               BitField("r39LoLp", None, 5),
               BitField("r39HiHp", None, 3),
               ByteField("r39HiLp", None),
               ByteField("r40LoHp", None),
  
               BitField("r40LoLp", None, 5),
               BitField("r40HiHp", None, 3),
               ByteField("r40HiLp", None),
               ByteField("r41LoHp", None),
  
               BitField("r41LoLp", None, 5),
               BitField("r41HiHp", None, 3),
               ByteField("r41HiLp", None),
               ByteField("r42LoHp", None),
  
               BitField("r42LoLp", None, 5),
               BitField("r42HiHp", None, 3),
               ByteField("r42HiLp", None),
               ByteField("r43LoHp", None),
  
               BitField("r43LoLp", None, 5),
               BitField("r43HiHp", None, 3),
               ByteField("r43HiLp", None),
               ByteField("r44LoHp", None),
  
               BitField("r44LoLp", None, 5),
               BitField("r44HiHp", None, 3),
               ByteField("r44HiLp", None),
               ByteField("r45LoHp", None),
  
               BitField("r45LoLp", None, 5),
               BitField("r45HiHp", None, 3),
               ByteField("r45HiLp", None),
               ByteField("r46LoHp", None),
  
               BitField("r46LoLp", None, 5),
               BitField("r46HiHp", None, 3),
               ByteField("r46HiLp", None),
               ByteField("r47LoHp", None),
  
               BitField("r47LoLp", None, 5),
               BitField("r47HiHp", None, 3),
               ByteField("r47HiLp", None),
               ByteField("r48LoHp", None),
  
               BitField("r48LoLp", None, 5),
               BitField("r48HiHp", None, 3),
               ByteField("r48HiLp", None),
               ByteField("r49LoHp", None),
  
               BitField("r49LoLp", None, 5),
               BitField("r49HiHp", None, 3),
               ByteField("r49HiLp", None),
               ByteField("r50LoHp", None),
  
               BitField("r50LoLp", None, 5),
               BitField("r50HiHp", None, 3),
               ByteField("r50HiLp", None),
               ByteField("r51LoHp", None),
  
               BitField("r51LoLp", None, 5),
               BitField("r51HiHp", None, 3),
               ByteField("r51HiLp", None),
               ByteField("r52LoHp", None),
  
               BitField("r52LoLp", None, 5),
               BitField("r52HiHp", None, 3),
               ByteField("r52HiLp", None),
               ByteField("r53LoHp", None),
  
               BitField("r53LoLp", None, 5),
               BitField("r53HiHp", None, 3),
               ByteField("r53HiLp", None),
               ByteField("r54LoHp", None),
  
               BitField("r54LoLp", None, 5),
               BitField("r54HiHp", None, 3),
               ByteField("r54HiLp", None),
               ByteField("r55LoHp", None),
  
               BitField("r55LoLp", None, 5),
               BitField("r55HiHp", None, 3),
               ByteField("r55HiLp", None),
               ByteField("r56LoHp", None),
  
               BitField("r56LoLp", None, 5),
               BitField("r56HiHp", None, 3),
               ByteField("r56HiLp", None),
               ByteField("r57LoHp", None),
  
               BitField("r57LoLp", None, 5),
               BitField("r57HiHp", None, 3),
               ByteField("r57HiLp", None),
               ByteField("r58LoHp", None),
  
               BitField("r58LoLp", None, 5),
               BitField("r58HiHp", None, 3),
               ByteField("r58HiLp", None),
               ByteField("r59LoHp", None),
  
               BitField("r59LoLp", None, 5),
               BitField("r59HiHp", None, 3),
               ByteField("r59HiLp", None),
               ByteField("r60LoHp", None),
  
               BitField("r60LoLp", None, 5),
               BitField("r60HiHp", None, 3),
               ByteField("r60HiLp", None),
               ByteField("r61LoHp", None),
  
               BitField("r61LoLp", None, 5),
               BitField("r61HiHp", None, 3),
               ByteField("r61HiLp", None),
               ByteField("r62LoHp", None),
  
               BitField("r62LoLp", None, 5),
               BitField("r62HiHp", None, 3),
               ByteField("r62HiLp", None),
               ByteField("r63LoHp", None),
  
               BitField("r63LoLp", None, 5),
               BitField("r63HiHp", None, 3),
               ByteField("r63HiLp", None),
               ByteField("r64LoHp", None),
  
               BitField("r64LoLp", None, 5),
               BitField("r64HiHp", None, 3),
               ByteField("r64HiLp", None),
               ByteField("r65LoHp", None),
  
               BitField("r65LoLp", None, 5),
               BitField("r65HiHp", None, 3),
               ByteField("r65HiLp", None),
               ByteField("r66LoHp", None),
  
               BitField("r66LoLp", None, 5),
               BitField("r66HiHp", None, 3),
               ByteField("r66HiLp", None),
               ByteField("r67LoHp", None),
  
               BitField("r67LoLp", None, 5),
               BitField("r67HiHp", None, 3),
               ByteField("r67HiLp", None),
               ByteField("r68LoHp", None),
  
               BitField("r68LoLp", None, 5),
               BitField("r68HiHp", None, 3),
               ByteField("r68HiLp", None),
               ByteField("r69LoHp", None),
  
               BitField("r69LoLp", None, 5),
               BitField("r69HiHp", None, 3),
               ByteField("r69HiLp", None),
               ByteField("r70LoHp", None),
  
               BitField("r70LoLp", None, 5),
               BitField("r70HiHp", None, 3),
               ByteField("r70HiLp", None),
               ByteField("r71LoHp", None),
  
               BitField("r71LoLp", None, 5),
               BitField("r71HiHp", None, 3),
               ByteField("r71HiLp", None),
               ByteField("r72LoHp", None),
  
               BitField("r72LoLp", None, 5),
               BitField("r72HiHp", None, 3),
               ByteField("r72HiLp", None),
               ByteField("r73LoHp", None),
  
               BitField("r73LoLp", None, 5),
               BitField("r73HiHp", None, 3),
               ByteField("r73HiLp", None),
               ByteField("r74LoHp", None),
  
               BitField("r74LoLp", None, 5),
               BitField("r74HiHp", None, 3),
               ByteField("r74HiLp", None),
               ByteField("r75LoHp", None),
  
               BitField("r75LoLp", None, 5),
               BitField("r75HiHp", None, 3),
               ByteField("r75HiLp", None),
               ByteField("r76LoHp", None),
  
               BitField("r76LoLp", None, 5),
               BitField("r76HiHp", None, 3),
               ByteField("r76HiLp", None),
               ByteField("r77LoHp", None),
  
               BitField("r77LoLp", None, 5),
               BitField("r77HiHp", None, 3),
               ByteField("r77HiLp", None),
               ByteField("r78LoHp", None),
  
               BitField("r78LoLp", None, 5),
               BitField("r78HiHp", None, 3),
               ByteField("r78HiLp", None),
               ByteField("r79LoHp", None),
  
               BitField("r79LoLp", None, 5),
               BitField("r79HiHp", None, 3),
               ByteField("r79HiLp", None),
               ByteField("r80LoHp", None),
  
               BitField("r80LoLp", None, 5),
               BitField("r80HiHp", None, 3),
               ByteField("r80HiLp", None),
               ByteField("r81LoHp", None),
  
               BitField("r81LoLp", None, 5),
               BitField("r81HiHp", None, 3),
               ByteField("r81HiLp", None),
               ByteField("r82LoHp", None),
  
               BitField("r82LoLp", None, 5),
               BitField("r82HiHp", None, 3),
               ByteField("r82HiLp", None),
               ByteField("r83LoHp", None),
  
               BitField("r83LoLp", None, 5),
               BitField("r83HiHp", None, 3),
               ByteField("r83HiLp", None),
               ByteField("r84LoHp", None),
  
               BitField("r84LoLp", None, 5),
               BitField("r84HiHp", None, 3),
               ByteField("r84HiLp", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(6, 251, a, self.fields_desc)
          if self.lengthBR is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 3 to max for L3 message (251)
  class BaListPrefHdr(Packet):
      """ BA List Pref Section 10.5.2.1c """
      name = "BA List Pref"
      fields_desc = [
               # FIXME dynamic
               BitField("eightBitBLP", None, 1),
               XBitField("ieiBLP", None, 7),
  
               XByteField("lengthBLP", None),
  
               BitField("fixBit", 0x0, 1),
               BitField("rangeLower", 0x0, 10),
               BitField("fixBit2", 0x0, 1),
               BitField("rangeUpper", 0x0, 10),
               BitField("baFreq", 0x0, 10),
               BitField("sparePad", 0x0, 8)
               ]
  
  
  # len 17 || Have a look at the specs for the field format
  # Bit map 0 format
  # Range 1024 format
  # Range  512 format
  # Range  256 format
  # Range  128 format
  # Variable bit map format
  class CellChannelDescriptionHdr(Packet):
      """ Cell Channel Description  Section 10.5.2.1b """
      name = "Cell Channel Description "
      fields_desc = [
               BitField("eightBitCCD", None, 1),
               XBitField("ieiCCD", None, 7),
               BitField("bit128", 0x0, 1),
               BitField("bit127", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
               ByteField("bit120", 0x0),
               ByteField("bit112", 0x0),
               ByteField("bit104", 0x0),
               ByteField("bit96", 0x0),
               ByteField("bit88", 0x0),
               ByteField("bit80", 0x0),
               ByteField("bit72", 0x0),
               ByteField("bit64", 0x0),
               ByteField("bit56", 0x0),
               ByteField("bit48", 0x0),
               ByteField("bit40", 0x0),
               ByteField("bit32", 0x0),
               ByteField("bit24", 0x0),
               ByteField("bit16", 0x0),
               ByteField("bit8", 0x0)
               ]
  
  
  class CellDescriptionHdr(Packet):
      """ Cell Description  Section 10.5.2.2 """
      name = "Cell Description"
      fields_desc = [
               BitField("eightBitCD", None, 1),
               XBitField("ieiCD", None, 7),
               BitField("bcchHigh", 0x0, 2),
               BitField("ncc", 0x0, 3),
               BitField("bcc", 0x0, 3),
               ByteField("bcchLow", 0x0)
               ]
  
  
  class CellOptionsBCCHHdr(Packet):
      """ Cell Options (BCCH)  Section 10.5.2.3 """
      name = "Cell Options (BCCH)"
      fields_desc = [
               BitField("eightBitCOB", None, 1),
               XBitField("ieiCOB", None, 7),
               BitField("spare", 0x0, 1),
               BitField("pwrc", 0x0, 1),
               BitField("dtx", 0x0, 2),
               BitField("rLinkTout", 0x0, 4)
               ]
  
  
  class CellOptionsSACCHHdr(Packet):
      """ Cell Options (SACCH) Section 10.5.2.3a """
      name = "Cell Options (SACCH)"
      fields_desc = [
               BitField("eightBitCOS", None, 1),
               XBitField("ieiCOS", None, 7),
               BitField("dtx", 0x0, 1),
               BitField("pwrc", 0x0, 1),
               BitField("dtx", 0x0, 1),
               BitField("rLinkTout", 0x0, 4)
               ]
  
  
  class CellSelectionParametersHdr(Packet):
      """ Cell Selection Parameters Section 10.5.2.4 """
      name = "Cell Selection Parameters"
      fields_desc = [
               BitField("eightBitCSP", None, 1),
               XBitField("ieiCSP", None, 7),
               BitField("cellReselect", 0x0, 3),
               BitField("msTxPwrMax", 0x0, 5),
               BitField("acs", None, 1),
               BitField("neci", None, 1),
               BitField("rxlenAccMin", None, 6)
               ]
  
  
  class MacModeAndChannelCodingRequestHdr(Packet):
      """ MAC Mode and Channel Coding Requested Section 10.5.2.4a """
      name = "MAC Mode and Channel Coding Requested"
      fields_desc = [
               XBitField("ieiMMACCR", None, 4),
               BitField("macMode", 0x0, 2),
               BitField("cs", 0x0, 2)
               ]
  
  
  class ChannelDescriptionHdr(Packet):
      """ Channel Description  Section 10.5.2.5 """
      name = "Channel Description"
      fields_desc = [
               BitField("eightBitCD", None, 1),
               XBitField("ieiCD", None, 7),
  
               BitField("channelTyp", 0x0, 5),
               BitField("tn", 0x0, 3),
  
               BitField("tsc", 0x0, 3),
               BitField("h", 0x1, 1),
               # if h=1 maybe we find a better solution here...
               BitField("maioHi", 0x0, 4),
  
               BitField("maioLo", 0x0, 2),
               BitField("hsn", 0x0, 6)
               #BitField("spare", 0x0, 2),
               #BitField("arfcnHigh", 0x0, 2),
               #ByteField("arfcnLow", 0x0)
               ]
  
  
  class ChannelDescription2Hdr(Packet):
      """ Channel Description 2 Section 10.5.2.5a """
      name = "Channel Description 2"
      fields_desc = [
               BitField("eightBitCD2", None, 1),
               XBitField("ieiCD2", None, 7),
               BitField("channelTyp", 0x0, 5),
               BitField("tn", 0x0, 3),
               BitField("tsc", 0x0, 3),
               BitField("h", 0x0, 1),
               # if h=1
               # BitField("maioHi", 0x0, 4),
               # BitField("maioLo", 0x0, 2),
               # BitField("hsn", 0x0, 6)
               BitField("spare", 0x0, 2),
               BitField("arfcnHigh", 0x0, 2),
               ByteField("arfcnLow", 0x0)
               ]
  
  
  class ChannelModeHdr(Packet):
      """ Channel Mode Section 10.5.2.6 """
      name = "Channel Mode"
      fields_desc = [
               BitField("eightBitCM", None, 1),
               XBitField("ieiCM", None, 7),
               ByteField("mode", 0x0)
               ]
  
  
  class ChannelMode2Hdr(Packet):
      """ Channel Mode 2 Section 10.5.2.7 """
      name = "Channel Mode 2"
      fields_desc = [
               BitField("eightBitCM2", None, 1),
               XBitField("ieiCM2", None, 7),
               ByteField("mode", 0x0)
               ]
  
  
  class ChannelNeededHdr(Packet):
      """ Channel Needed Section 10.5.2.8 """
      name = "Channel Needed"
      fields_desc = [
               XBitField("ieiCN", None, 4),
               BitField("channel2", 0x0, 2),
               BitField("channel1", 0x0, 2),
               ]
  
  
  class ChannelRequestDescriptionHdr(Packet):
      """Channel Request Description  Section 10.5.2.8a """
      name = "Channel Request Description"
      fields_desc = [
               BitField("eightBitCRD", None, 1),
               XBitField("ieiCRD", None, 7),
               BitField("mt", 0x0, 1),
               ConditionalField(BitField("spare", 0x0, 39),
                                lambda pkt: pkt.mt == 0),
               ConditionalField(BitField("spare", 0x0, 3),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(BitField("priority", 0x0, 2),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(BitField("rlcMode", 0x0, 1),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(BitField("llcFrame", 0x1, 1),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("reqBandMsb", 0x0),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("reqBandLsb", 0x0),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("rlcMsb", 0x0),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("rlcLsb", 0x0),
                                lambda pkt: pkt.mt == 1)
               ]
  
  
  class CipherModeSettingHdr(Packet):
      """Cipher Mode Setting Section 10.5.2.9 """
      name = "Cipher Mode Setting"
      fields_desc = [
               XBitField("ieiCMS", None, 4),
               BitField("algoId", 0x0, 3),
               BitField("sc", 0x0, 1),
               ]
  
  
  class CipherResponseHdr(Packet):
      """Cipher Response Section 10.5.2.10 """
      name = "Cipher Response"
      fields_desc = [
               XBitField("ieiCR", None, 4),
               BitField("spare", 0x0, 3),
               BitField("cr", 0x0, 1),
               ]
  
  
  # This  packet fixes the problem with the 1/2 Byte length. Concatenation
  # of cipherModeSetting and cipherResponse
  class CipherModeSettingAndcipherResponse(Packet):
      name = "Cipher Mode Setting And Cipher Response"
      fields_desc = [
               BitField("algoId", 0x0, 3),
               BitField("sc", 0x0, 1),
               BitField("spare", 0x0, 3),
               BitField("cr", 0x0, 1)
               ]
  
  
  class ControlChannelDescriptionHdr(Packet):
      """Control Channel Description Section 10.5.2.11 """
      name = "Control Channel Description"
      fields_desc = [
               BitField("eightBitCCD", None, 1),
               XBitField("ieiCCD", None, 7),
  
               BitField("spare", 0x0, 1),
               BitField("att", 0x0, 1),
               BitField("bsAgBlksRes", 0x0, 3),
               BitField("ccchConf", 0x0, 3),
  
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("spare3", 0x0, 1),
               BitField("spare4", 0x0, 1),
               BitField("bsPaMfrms", 0x0, 3),
  
               ByteField("t3212", 0x0)
               ]
  
  
  class FrequencyChannelSequenceHdr(Packet):
      """Frequency Channel Sequence Section 10.5.2.12"""
      name = "Frequency Channel Sequence"
      fields_desc = [
               BitField("eightBitFCS", None, 1),
               XBitField("ieiFCS", None, 7),
               BitField("spare", 0x0, 1),
               BitField("lowestArfcn", 0x0, 7),
               BitField("skipArfcn01", 0x0, 4),
               BitField("skipArfcn02", 0x0, 4),
               BitField("skipArfcn03", 0x0, 4),
               BitField("skipArfcn04", 0x0, 4),
               BitField("skipArfcn05", 0x0, 4),
               BitField("skipArfcn06", 0x0, 4),
               BitField("skipArfcn07", 0x0, 4),
               BitField("skipArfcn08", 0x0, 4),
               BitField("skipArfcn09", 0x0, 4),
               BitField("skipArfcn10", 0x0, 4),
               BitField("skipArfcn11", 0x0, 4),
               BitField("skipArfcn12", 0x0, 4),
               BitField("skipArfcn13", 0x0, 4),
               BitField("skipArfcn14", 0x0, 4),
               BitField("skipArfcn15", 0x0, 4),
               BitField("skipArfcn16", 0x0, 4)
               ]
  
  
  class FrequencyListHdr(Packet):
      """Frequency List Section 10.5.2.13"""
      name = "Frequency List"
   # Problem:
   # There are several formats for the Frequency List information
   # element, distinguished by the "format indicator" subfield.
   # Some formats are frequency bit maps, the others use a special encoding
   # scheme.
      fields_desc = [
               BitField("eightBitFL", None, 1),
               XBitField("ieiFL", None, 7),
               XByteField("lengthFL", None),
  
               BitField("formatID", 0x0, 2),
               BitField("spare", 0x0, 2),
               BitField("arfcn124", 0x0, 1),
               BitField("arfcn123", 0x0, 1),
               BitField("arfcn122", 0x0, 1),
               BitField("arfcn121", 0x0, 1),
  
               ByteField("arfcn120", 0x0),
               ByteField("arfcn112", 0x0),
               ByteField("arfcn104", 0x0),
               ByteField("arfcn96", 0x0),
               ByteField("arfcn88", 0x0),
               ByteField("arfcn80", 0x0),
               ByteField("arfcn72", 0x0),
               ByteField("arfcn64", 0x0),
               ByteField("arfcn56", 0x0),
               ByteField("arfcn48", 0x0),
               ByteField("arfcn40", 0x0),
               ByteField("arfcn32", 0x0),
               ByteField("arfcn24", 0x0),
               ByteField("arfcn16", 0x0),
               ByteField("arfcn8", 0x0)
               ]
  
  
  class FrequencyShortListHdr(Packet):
      """Frequency Short List Section 10.5.2.14"""
      name = "Frequency Short List"
  # len is 10
  #This element is encoded exactly as the Frequency List information element,
  #except that it has a fixed length instead of a
  #variable length and does not contain a length indicator and that it
  #shall not be encoded in bitmap 0 format.
      fields_desc = [
               ByteField("ieiFSL", 0x0),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0)
               ]
  
  
  class FrequencyShortListHdr2(Packet):
      """Frequency Short List2 Section 10.5.2.14a"""
      name = "Frequency Short List 2"
      fields_desc = [
               ByteField("byte1", 0x0),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0)
               ]
  
  
  # len 4 to 13
  class GroupChannelDescriptionHdr(Packet):
      """Group Channel Description Section 10.5.2.14b"""
      name = "Group Channel Description"
      fields_desc = [
               BitField("eightBitGCD", None, 1),
               XBitField("ieiGCD", None, 7),
  
               XByteField("lengthGCD", None),
  
               BitField("channelType", 0x0, 5),
               BitField("tn", 0x0, 3),
  
               BitField("tsc", 0x0, 3),
               BitField("h", 0x0, 1),
               # if  h == 0 the  packet looks the following way:
               ConditionalField(BitField("spare", 0x0, 2),
                                lambda pkt: pkt. h == 0x0),
               ConditionalField(BitField("arfcnHi", 0x0, 2),
                                lambda pkt: pkt. h == 0x0),
               ConditionalField(ByteField("arfcnLo", None),
                                lambda pkt: pkt. h == 0x0),
               # if  h == 1 the  packet looks the following way:
               ConditionalField(BitField("maioHi", 0x0, 4),
                                lambda pkt: pkt. h == 0x1),
               ConditionalField(BitField("maioLo", None, 2),
                                lambda pkt: pkt. h == 0x1),
               ConditionalField(BitField("hsn", None, 6),
                                lambda pkt: pkt. h == 0x1),
               # finished with conditional fields
               ByteField("maC6", None),
               ByteField("maC7", None),
               ByteField("maC8", None),
               ByteField("maC9", None),
               ByteField("maC10", None),
               ByteField("maC11", None),
               ByteField("maC12", None),
               ByteField("maC13", None),
               ByteField("maC14", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 13, a, self.fields_desc)
          if self.lengthGCD is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class GprsResumptionHdr(Packet):
      """GPRS Resumption  Section 10.5.2.14c"""
      name = "GPRS Resumption"
      fields_desc = [
               XBitField("ieiGR", None, 4),
               BitField("spare", 0x0, 3),
               BitField("ack", 0x0, 1)
               ]
  
  
  class HandoverReferenceHdr(Packet):
      """Handover Reference Section 10.5.2.15"""
      name = "Handover Reference"
      fields_desc = [
               BitField("eightBitHR", None, 1),
               XBitField("ieiHR", None, 7),
               ByteField("handoverRef", 0x0)
               ]
  
  
  # len 1-12
  class IaRestOctets(Packet):
      """IA Rest Octets Section 10.5.2.16"""
      name = "IA Rest Octets"
      fields_desc = [
               ByteField("ieiIRO", 0x0),
               # FIXME brainfuck  packet
               XByteField("lengthIRO", None),
               ByteField("byte2", None),
               ByteField("byte3", None),
               ByteField("byte4", None),
               ByteField("byte5", None),
               ByteField("byte6", None),
               ByteField("byte7", None),
               ByteField("byte8", None),
               ByteField("byte9", None),
               ByteField("byte10", None),
               ByteField("byte11", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 12, a, self.fields_desc)
          if self.lengthIRO is None:
              if res[1] < 0: # FIXME better fix
                  res[1] = 0
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class IraRestOctetsHdr(Packet):
      """IAR Rest Octets Section 10.5.2.17"""
      name = "IAR Rest Octets"
      fields_desc = [
               BitField("eightBitIRO", None, 1),
               XBitField("ieiIRO", None, 7),
               BitField("spare01", 0x0, 1),
               BitField("spare02", 0x0, 1),
               BitField("spare03", 0x1, 1),
               BitField("spare04", 0x0, 1),
               BitField("spare05", 0x1, 1),
               BitField("spare06", 0x0, 1),
               BitField("spare07", 0x1, 1),
               BitField("spare08", 0x1, 1),
               BitField("spare09", 0x0, 1),
               BitField("spare10", 0x0, 1),
               BitField("spare11", 0x1, 1),
               BitField("spare12", 0x0, 1),
               BitField("spare13", 0x1, 1),
               BitField("spare14", 0x0, 1),
               BitField("spare15", 0x1, 1),
               BitField("spare16", 0x1, 1),
               BitField("spare17", 0x0, 1),
               BitField("spare18", 0x0, 1),
               BitField("spare19", 0x1, 1),
               BitField("spare20", 0x0, 1),
               BitField("spare21", 0x1, 1),
               BitField("spare22", 0x0, 1),
               BitField("spare23", 0x1, 1),
               BitField("spare24", 0x1, 1)
               ]
  
  
  # len is 1 to 5 what do we do with the variable size? no length
  # field?! WTF
  class IaxRestOctetsHdr(Packet):
      """IAX Rest Octets Section 10.5.2.18"""
      name = "IAX Rest Octets"
      fields_desc = [
               BitField("eightBitIRO", None, 1),
               XBitField("ieiIRO", None, 7),
               BitField("spare01", 0x0, 1),
               BitField("spare02", 0x0, 1),
               BitField("spare03", 0x1, 1),
               BitField("spare04", 0x0, 1),
               BitField("spare05", 0x1, 1),
               BitField("spare06", 0x0, 1),
               BitField("spare07", 0x1, 1),
               BitField("spare08", 0x1, 1),
               ByteField("spareB1", None),
               ByteField("spareB2", None),
               ByteField("spareB3", None)
               ]
  
  
  class L2PseudoLengthHdr(Packet):
      """L2 Pseudo Length Section 10.5.2.19"""
      name = "L2 Pseudo Length"
      fields_desc = [
               BitField("eightBitPL", None, 1),
               XBitField("ieiPL", None, 7),
               BitField("l2pLength", None, 6),
               BitField("bit2", 0x0, 1),
               BitField("bit1", 0x1, 1)
               ]
  
  
  class MeasurementResultsHdr(Packet):
      """Measurement Results Section 10.5.2.20"""
      name = "Measurement Results"
      fields_desc = [
               BitField("eightBitMR", None, 1),
               XBitField("ieiMR", None, 7),
               BitField("baUsed", 0x0, 1),
               BitField("dtxUsed", 0x0, 1),
               BitField("rxLevFull", 0x0, 6),
               BitField("spare", 0x0, 1),
               BitField("measValid", 0x0, 1),
               BitField("rxLevSub", 0x0, 6),
               BitField("spare0", 0x0, 1),
               BitField("rxqualFull", 0x0, 3),
               BitField("rxqualSub", 0x0, 3),
               BitField("noNcellHi", 0x0, 1),
               BitField("noNcellLo", 0x0, 2),
               BitField("rxlevC1", 0x0, 6),
               BitField("bcchC1", 0x0, 5),
               BitField("bsicC1Hi", 0x0, 3),
               BitField("bsicC1Lo", 0x0, 3),
               BitField("rxlevC2", 0x0, 5),
               BitField("rxlevC2Lo", 0x0, 1),
               BitField("bcchC2", 0x0, 5),
               BitField("bsicC1Hi", 0x0, 2),
               BitField("bscicC2Lo", 0x0, 4),
               BitField("bscicC2Hi", 0x0, 4),
  
               BitField("rxlevC3Lo", 0x0, 2),
               BitField("bcchC3", 0x0, 5),
               BitField("rxlevC3Hi", 0x0, 1),
  
               BitField("bsicC3Lo", 0x0, 5),
               BitField("bsicC3Hi", 0x0, 3),
  
               BitField("rxlevC4Lo", 0x0, 3),
               BitField("bcchC4", 0x0, 5),
  
               BitField("bsicC4", 0x0, 6),
               BitField("rxlevC5Hi", 0x0, 2),
  
               BitField("rxlevC5Lo", 0x0, 4),
               BitField("bcchC5Hi", 0x0, 4),
  
               BitField("bcchC5Lo", 0x0, 1),
               BitField("bsicC5", 0x0, 6),
               BitField("rxlevC6", 0x0, 1),
  
               BitField("rxlevC6Lo", 0x0, 5),
               BitField("bcchC6Hi", 0x0, 3),
  
               BitField("bcchC6Lo", 0x0, 3),
               BitField("bsicC6", 0x0, 5)
               ]
  
  
  class GprsMeasurementResultsHdr(Packet):
      """GPRS Measurement Results Section 10.5.2.20a"""
      name = "GPRS Measurement Results"
      fields_desc = [
               BitField("eightBitGMR", None, 1),
               XBitField("ieiGMR", None, 7),
               BitField("cValue", 0x0, 6),
               BitField("rxqualHi", 0x0, 2),
               BitField("rxqL", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("signVar", 0x0, 6)
               ]
  
  
  # len 3 to 10
  class MobileAllocationHdr(Packet):
      """Mobile Allocation Section 10.5.2.21"""
      name = "Mobile Allocation"
      fields_desc = [
               BitField("eightBitMA", None, 1),
               XBitField("ieiMA", None, 7),
               XByteField("lengthMA", None),
               ByteField("maC64", 0x12),
               ByteField("maC56", None),  # optional fields start here
               ByteField("maC48", None),
               ByteField("maC40", None),
               ByteField("maC32", None),
               ByteField("maC24", None),
               ByteField("maC16", None),
               ByteField("maC8", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 10, a, self.fields_desc)
          if self.lengthMA is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MobileTimeDifferenceHdr(Packet):
      """Mobile Time Difference Section 10.5.2.21a"""
      name = "Mobile Time Difference"
      fields_desc = [
               BitField("eightBitMTD", None, 1),
               XBitField("ieiMTD", None, 7),
               XByteField("lengthMTD", 0x5),
               ByteField("valueHi", 0x0),
               ByteField("valueCnt", 0x0),
               BitField("valueLow", 0x0, 5),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1)
               ]
  
  
  # min 4 octets max 8
  class MultiRateConfigurationHdr(Packet):
      """ MultiRate configuration Section 10.5.2.21aa"""
      name = "MultiRate Configuration"
      fields_desc = [
               BitField("eightBitMRC", None, 1),
               XBitField("ieiMRC", None, 7),
  
               XByteField("lengthMRC", None),
  
               BitField("mrVersion", 0x0, 3),
               BitField("spare", 0x0, 1),
               BitField("icmi", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("startMode", 0x0, 2),
  
               ByteField("amrCodec", 0x0),
  
               BitField("spare", None, 2),
               BitField("threshold1", None, 6),
  
               BitField("hysteresis1", None, 4),
               BitField("threshold2", None, 4),
  
               BitField("threshold2cnt", None, 2),
               BitField("hysteresis2", None, 4),
               BitField("threshold3", None, 2),
  
               BitField("threshold3cnt", None, 4),
               BitField("hysteresis3", None, 4)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 8, a, self.fields_desc)
          if self.lengthMRC is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 3 to 12
  class MultislotAllocationHdr(Packet):
      """Multislot Allocation Section 10.5.2.21b"""
      name = "Multislot Allocation"
      fields_desc = [
               BitField("eightBitMSA", None, 1),
               XBitField("ieiMSA", None, 7),
               XByteField("lengthMSA", None),
               BitField("ext0", 0x1, 1),
               BitField("da", 0x0, 7),
               ConditionalField(BitField("ext1", 0x1, 1),  # optional
                                lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("ua", 0x0, 7),
                                lambda pkt: pkt.ext0 == 0),
               ByteField("chan1", None),
               ByteField("chan2", None),
               ByteField("chan3", None),
               ByteField("chan4", None),
               ByteField("chan5", None),
               ByteField("chan6", None),
               ByteField("chan7", None),
               ByteField("chan8", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 12, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthMSA is None:
              p = p[:1] + struct.pack(">B", len(p)-2) + p[2:]
          return p + pay
  
  
  class NcModeHdr(Packet):
      """NC mode Section 10.5.2.21c"""
      name = "NC Mode"
      fields_desc = [
               XBitField("ieiNM", None, 4),
               BitField("spare", 0x0, 2),
               BitField("ncMode", 0x0, 2)
               ]
  
  
  # Fix for len problem
  # concatenation NC Mode And Spare Half Octets
  class NcModeAndSpareHalfOctets(Packet):
      name = "NC Mode And Spare Half Octets"
      fields_desc = [
               BitField("spare", 0x0, 2),
               BitField("ncMode", 0x0, 2),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class NeighbourCellsDescriptionHdr(Packet):
      """Neighbour Cells Description Section 10.5.2.22"""
      name = "Neighbour Cells Description"
      fields_desc = [
               BitField("eightBitNCD", None, 1),
               XBitField("ieiNCD", None, 7),
               BitField("bit128", 0x0, 1),
               BitField("bit127", 0x0, 1),
               BitField("extInd", 0x0, 1),
               BitField("baInd", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
               BitField("120bits", 0x0, 120)
               ]
  
  
  class NeighbourCellsDescription2Hdr(Packet):
      """Neighbour Cells Description 2 Section 10.5.2.22a"""
      name = "Neighbour Cells Description 2"
      fields_desc = [
               BitField("eightBitNCD2", None, 1),
               XBitField("ieiNCD2", None, 7),
               BitField("bit128", 0x0, 1),
               BitField("multiband", 0x0, 2),
               BitField("baInd", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
               BitField("120bits", 0x0, 120)
               ]
  
  
  class NtNRestOctets(Packet):
      """NT/N Rest Octets Section 10.5.2.22c"""
      name = "NT/N Rest Octets"
      fields_desc = [
                BitField("nln", 0x0, 2),
                BitField("ncnInfo", 0x0, 4),
                BitField("spare", 0x0, 2)
                ]
  
  
  #
  # The following  packet has no length info!
  #
  # len 1-18
  class P1RestOctets(Packet):
      """P1 Rest Octets Section 10.5.2.23"""
      name = "P1 Rest Octets"
      fields_desc = [
                BitField("nln", 0x0, 2),
                BitField("nlnStatus", 0x0, 1),
                BitField("prio1", 0x0, 3),
                BitField("prio2", 0x0, 3),
                # optional
                BitField("pageIndication1", 0x0, 1),
                BitField("pageIndication2", 0x0, 1),
                BitField("spare", 0x0, 5),
                ByteField("spareB1", None),
                ByteField("spareB2", None),
                ByteField("spareB3", None),
                ByteField("spareB4", None),
                ByteField("spareB5", None),
                ByteField("spareB6", None),
                ByteField("spareB7", None),
                ByteField("spareB8", None),
                ByteField("spareB9", None),
                ByteField("spareB10", None),
                ByteField("spareB11", None),
                ByteField("spareB12", None),
                ByteField("spareB13", None),
                ByteField("spareB14", None),
                ByteField("spareB15", None),
                ByteField("spareB16", None),
                ]
  
  
  # len 2-12
  class P2RestOctets(Packet):
      """P2 Rest Octets Section 10.5.2.24"""
      name = "P2 Rest Octets"
      fields_desc = [
                BitField("cn3", 0x0, 2),
                BitField("nln", 0x0, 2),
                BitField("nlnStatus", 0x0, 1),
                BitField("prio1", 0x0, 3),
  
                BitField("prio2", 0x0, 3),
                BitField("prio3", 0x0, 3),
                BitField("pageIndication3", 0x0, 1),
                BitField("spare", 0x0, 1),
  
                # optinal (No length field!)
                ByteField("spareB1", None),
                ByteField("spareB2", None),
                ByteField("spareB3", None),
                ByteField("spareB4", None),
  
                ByteField("spareB5", None),
                ByteField("spareB6", None),
                ByteField("spareB7", None),
                ByteField("spareB8", None),
  
                ByteField("spareB9", None),
                ByteField("spareB10", None)
                ]
  
  
  # len 4
  class P3RestOctets(Packet):
      """P3 Rest Octets Section 10.5.2.25"""
      name = "P3 Rest Octets"
      fields_desc = [
                BitField("cn3", 0x0, 2),
                BitField("cn4", 0x0, 2),
                BitField("nln", 0x0, 2),
                BitField("nlnStatus", 0x0, 1),
                BitField("prio1", 0x0, 3),
                BitField("prio2", 0x0, 3),
                BitField("prio3", 0x0, 3),
                BitField("prio4", 0x0, 3),
                BitField("spare", 0x0, 5)
                ]
  
  
  # len 4
  # strange  packet, lots of valid formats
  
  # ideas for the dynamic  packets:
  # 1] for user interaction: Create an interactive "builder" based on a
  # Q/A process (not very scapy like)
  # 2] for usage in scripts, create an alternative  packet for every
  # possible  packet layout
  #
  
  
  class PacketChannelDescription(Packet):
      """Packet Channel Description Section 10.5.2.25a"""
      name = "Packet Channel Description"
      fields_desc = [
                ByteField("ieiPCD", None),
                BitField("chanType", 0x0, 5),  # This  packet has multiple
                                    # possible layouts. I moddeled the first one
                BitField("tn", 0x0, 3),     # maybe build an
                                            #"interactive" builder. Like
                                            # a Q/A then propose a
                                            #  packet?
                BitField("tsc", 0x0, 3),
                BitField("chooser1", 0x0, 1),
                BitField("chooser2", 0x0, 1),
                BitField("spare1", 0x0, 1),
                BitField("arfcn", 0x0, 10),
                ]
  
  
  class DedicatedModeOrTBFHdr(Packet):
      """Dedicated mode or TBF Section 10.5.2.25b"""
      name = "Dedicated Mode or TBF"
      fields_desc = [
               XBitField("ieiDMOT", None, 4),
               BitField("spare", 0x0, 1),
               BitField("tma", 0x0, 1),
               BitField("downlink", 0x0, 1),
               BitField("td", 0x0, 1)
               ]
  
  
  # FIXME add implementation
  class RrPacketUplinkAssignment(Packet):
      """RR Packet Uplink Assignment Section 10.5.2.25c"""
      name = "RR Packet Uplink Assignment"
      fields_desc = [
               # Fill me
               ]
  
  
  class PageModeHdr(Packet):
      """Page Mode Section 10.5.2.26"""
      name = "Page Mode"
      fields_desc = [
               XBitField("ieiPM", None, 4),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("pm", 0x0, 2)
               ]
  
  
  # Fix for 1/2 len problem
  # concatenation: pageMode and dedicatedModeOrTBF
  class PageModeAndDedicatedModeOrTBF(Packet):
      name = "Page Mode and Dedicated Mode Or TBF"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("pm", 0x0, 2),
               BitField("spare", 0x0, 1),
               BitField("tma", 0x0, 1),
               BitField("downlink", 0x0, 1),
               BitField("td", 0x0, 1)
               ]
  
  
  # Fix for 1/2 len problem
  # concatenation: pageMode and spareHalfOctets
  class PageModeAndSpareHalfOctets(Packet):
      name = "Page Mode and Spare Half Octets"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("pm", 0x0, 2),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  # Fix for 1/2 len problem
  # concatenation: pageMode and Channel Needed
  class PageModeAndChannelNeeded(Packet):
      name = "Page Mode and Channel Needed"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("pm", 0x0, 2),
               BitField("channel2", 0x0, 2),
               BitField("channel1", 0x0, 2)
               ]
  
  
  class NccPermittedHdr(Packet):
      """NCC Permitted Section 10.5.2.27"""
      name = "NCC Permitted"
      fields_desc = [
               BitField("eightBitNP", None, 1),
               XBitField("ieiNP", None, 7),
               ByteField("nccPerm", 0x0)
               ]
  
  
  class PowerCommandHdr(Packet):
      """Power Command Section 10.5.2.28"""
      name = "Power Command"
      fields_desc = [
               BitField("eightBitPC", None, 1),
               XBitField("ieiPC", None, 7),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("powerLvl", 0x0, 5)
               ]
  
  
  class PowerCommandAndAccessTypeHdr(Packet):
      """Power Command and access type  Section 10.5.2.28a"""
      name = "Power Command and Access Type"
      fields_desc = [
               BitField("eightBitPCAAT", None, 1),
               XBitField("ieiPCAAT", None, 7),
               BitField("atc", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("powerLvl", 0x0, 5)
               ]
  
  
  class RachControlParametersHdr(Packet):
      """RACH Control Parameters Section 10.5.2.29"""
      name = "RACH Control Parameters"
      fields_desc = [
               BitField("eightBitRCP", None, 1),
               XBitField("ieiRCP", None, 7),
               BitField("maxRetrans", 0x0, 2),
               BitField("txInteger", 0x0, 4),
               BitField("cellBarrAccess", 0x0, 1),
               BitField("re", 0x0, 1),
               BitField("ACC15", 0x0, 1),
               BitField("ACC14", 0x0, 1),
               BitField("ACC13", 0x0, 1),
               BitField("ACC12", 0x0, 1),
               BitField("ACC11", 0x0, 1),
               BitField("ACC10", 0x0, 1),
               BitField("ACC09", 0x0, 1),
               BitField("ACC08", 0x0, 1),
               BitField("ACC07", 0x0, 1),
               BitField("ACC06", 0x0, 1),
               BitField("ACC05", 0x0, 1),
               BitField("ACC04", 0x0, 1),
               BitField("ACC03", 0x0, 1),
               BitField("ACC02", 0x0, 1),
               BitField("ACC01", 0x0, 1),
               BitField("ACC00", 0x0, 1),
               ]
  
  
  class RequestReferenceHdr(Packet):
      """Request Reference  Section 10.5.2.30"""
      name = "Request Reference"
      fields_desc = [
               BitField("eightBitRR", None, 1),
               XBitField("ieiRR", None, 7),
               ByteField("ra", 0x0),
               BitField("t1", 0x0, 5),
               BitField("t3Hi", 0x0, 3),
               BitField("t3Lo", 0x0, 3),
               BitField("t2", 0x0, 5)
               ]
  
  
  class RrCauseHdr(Packet):
      """RR Cause  Section 10.5.2.31"""
      name = "RR Cause"
      fields_desc = [
               BitField("eightBitRC", None, 1),
               XBitField("ieiRC", None, 7),
               ByteField("rrCause", 0x0)
               ]
  
  
  class Si1RestOctets(Packet):
      """SI 1 Rest Octets Section 10.5.2.32"""
      name = "SI 1 Rest Octets"
      fields_desc = [
               ByteField("nchPos", 0x0)
               ]
  
  
  class Si2bisRestOctets(Packet):
      """SI 2bis Rest Octets Section 10.5.2.33"""
      name = "SI 2bis Rest Octets"
      fields_desc = [
               ByteField("spare", 0x0)
               ]
  
  
  class Si2terRestOctets(Packet):
      """SI 2ter Rest Octets Section 10.5.2.33a"""
      name = "SI 2ter Rest Octets"
      fields_desc = [
               ByteField("spare1", 0x0),
               ByteField("spare2", 0x0),
               ByteField("spare3", 0x0),
               ByteField("spare4", 0x0)
               ]
  
  
  # len 5
  class Si3RestOctets(Packet):
      """SI 3 Rest Octets Section 10.5.2.34"""
      name = "SI 3 Rest Octets"
      fields_desc = [
               ByteField("byte1", 0x0),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0)
               ]
  
  
  # len 1 to 11
  class Si4RestOctets(Packet):
      """SI 4 Rest Octets Section 10.5.2.35"""
      name = "SI 4 Rest Octets"
      fields_desc = [
               XByteField("lengthSI4", None),
               ByteField("byte2", None),
               ByteField("byte3", None),
               ByteField("byte4", None),
               ByteField("byte5", None),
               ByteField("byte6", None),
               ByteField("byte7", None),
               ByteField("byte8", None),
               ByteField("byte9", None),
               ByteField("byte10", None),
               ByteField("byte11", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 11, a, self.fields_desc, 1)
          if self.lengthSI4 is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          if len(p) is 1:  # length of this packet can be 0, but packet is
              p = ''       # but the IE is manadatory 0_o
          return p + pay
  
  
  class Si6RestOctets(Packet):
      """SI 6 Rest Octets Section 10.5.2.35a"""
      name = "SI 4 Rest Octets"
      fields_desc = [
               # FIXME
               ]
  
  
  # len 21
  class Si7RestOctets(Packet):
      """SI 7 Rest Octets Section 10.5.2.36"""
      name = "SI 7 Rest Octets"
      fields_desc = [
               # FIXME
               XByteField("lengthSI7", 0x15),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0),
               ByteField("byte15", 0x0),
               ByteField("byte16", 0x0),
               ByteField("byte17", 0x0),
               ByteField("byte18", 0x0),
               ByteField("byte19", 0x0),
               ByteField("byte20", 0x0),
               ByteField("byte21", 0x0)
               ]
  
  
  # len 21
  class Si8RestOctets(Packet):
      """SI 8 Rest Octets Section 10.5.2.37"""
      name = "SI 8 Rest Octets"
      fields_desc = [
               # FIXME
               XByteField("lengthSI8", 0x15),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0),
               ByteField("byte15", 0x0),
               ByteField("byte16", 0x0),
               ByteField("byte17", 0x0),
               ByteField("byte18", 0x0),
               ByteField("byte19", 0x0),
               ByteField("byte20", 0x0),
               ByteField("byte21", 0x0)
               ]
  
  
  #len 17
  class Si9RestOctets(Packet):
      """SI 9 Rest Octets Section 10.5.2.37a"""
      name = "SI 9 Rest Octets"
      fields_desc = [
               # FIXME
               XByteField("lengthSI9", 0x11),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0),
               ByteField("byte15", 0x0),
               ByteField("byte16", 0x0),
               ByteField("byte17", 0x0)
               ]
  
  
  # len 21
  class Si13RestOctets(Packet):
      """SI 13 Rest Octets Section 10.5.2.37b"""
      name = "SI 13 Rest Octets"
      fields_desc = [
               # FIXME
               XByteField("lengthSI3", 0x15),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0),
               ByteField("byte15", 0x0),
               ByteField("byte16", 0x0),
               ByteField("byte17", 0x0),
               ByteField("byte18", 0x0),
               ByteField("byte19", 0x0),
               ByteField("byte20", 0x0),
               ByteField("byte21", 0x0)
               ]
  
  
  # 10.5.2.37c [spare]
  # 10.5.2.37d [spare]
  
  
  # len 21
  class Si16RestOctets(Packet):
      """SI 16 Rest Octets Section 10.5.2.37e"""
      name = "SI 16 Rest Octets"
      fields_desc = [
               # FIXME
               XByteField("lengthSI16", 0x15),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0),
               ByteField("byte15", 0x0),
               ByteField("byte16", 0x0),
               ByteField("byte17", 0x0),
               ByteField("byte18", 0x0),
               ByteField("byte19", 0x0),
               ByteField("byte20", 0x0),
               ByteField("byte21", 0x0)
               ]
  
  
  # len 21
  class Si17RestOctets(Packet):
      """SI 17 Rest Octets Section 10.5.2.37f"""
      name = "SI 17 Rest Octets"
      fields_desc = [
               # FIXME
               XByteField("lengthSI17", 0x15),
               ByteField("byte2", 0x0),
               ByteField("byte3", 0x0),
               ByteField("byte4", 0x0),
               ByteField("byte5", 0x0),
               ByteField("byte6", 0x0),
               ByteField("byte7", 0x0),
               ByteField("byte8", 0x0),
               ByteField("byte9", 0x0),
               ByteField("byte10", 0x0),
               ByteField("byte11", 0x0),
               ByteField("byte12", 0x0),
               ByteField("byte13", 0x0),
               ByteField("byte14", 0x0),
               ByteField("byte15", 0x0),
               ByteField("byte16", 0x0),
               ByteField("byte17", 0x0),
               ByteField("byte18", 0x0),
               ByteField("byte19", 0x0),
               ByteField("byte20", 0x0),
               ByteField("byte21", 0x0)
               ]
  
  
  class StartingTimeHdr(Packet):
      """Starting Time Section 10.5.2.38"""
      name = "Starting Time"
      fields_desc = [
               BitField("eightBitST", None, 1),
               XBitField("ieiST", None, 7),
               ByteField("ra", 0x0),
               BitField("t1", 0x0, 5),
               BitField("t3Hi", 0x0, 3),
               BitField("t3Lo", 0x0, 3),
               BitField("t2", 0x0, 5)
               ]
  
  
  class SynchronizationIndicationHdr(Packet):
      """Synchronization Indication Section 10.5.2.39"""
      name = "Synchronization Indication"
      fields_desc = [
               XBitField("ieiSI", None, 4),
               BitField("nci", 0x0, 1),
               BitField("rot", 0x0, 1),
               BitField("si", 0x0, 2)
               ]
  
  
  class TimingAdvanceHdr(Packet):
      """Timing Advance Section 10.5.2.40"""
      name = "Timing Advance"
      fields_desc = [
               BitField("eightBitTA", None, 1),
               XBitField("ieiTA", None, 7),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("timingVal", 0x0, 6)
               ]
  
  
  class TimeDifferenceHdr(Packet):
      """ Time Difference Section 10.5.2.41"""
      name = "Time Difference"
      fields_desc = [
               BitField("eightBitTD", None, 1),
               XBitField("ieiTD", None, 7),
               XByteField("lengthTD", 0x3),
               ByteField("timeValue", 0x0)
               ]
  
  
  class TlliHdr(Packet):
      """ TLLI Section Section 10.5.2.41a"""
      name = "TLLI"
      fields_desc = [
               BitField("eightBitT", None, 1),
               XBitField("ieiT", None, 7),
               ByteField("value", 0x0),
               ByteField("value1", 0x0),
               ByteField("value2", 0x0),
               ByteField("value3", 0x0)
               ]
  
  
  class TmsiPTmsiHdr(Packet):
      """ TMSI/P-TMSI Section 10.5.2.42"""
      name = "TMSI/P-TMSI"
      fields_desc = [
               BitField("eightBitTPT", None, 1),
               XBitField("ieiTPT", None, 7),
               ByteField("value", 0x0),
               ByteField("value1", 0x0),
               ByteField("value2", 0x0),
               ByteField("value3", 0x0)
               ]
  
  
  class VgcsTargetModeIdenticationHdr(Packet):
      """ VGCS target Mode Indication 10.5.2.42a"""
      name = "VGCS Target Mode Indication"
      fields_desc = [
               BitField("eightBitVTMI", None, 1),
               XBitField("ieiVTMI", None, 7),
               XByteField("lengthVTMI", 0x2),
               BitField("targerMode", 0x0, 2),
               BitField("cipherKeyNb", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1)
               ]
  
  
  class WaitIndicationHdr(Packet):
      """ Wait Indication Section 10.5.2.43"""
      name = "Wait Indication"
      fields_desc = [  # asciiart of specs strange
               BitField("eightBitWI", None, 1),
               XBitField("ieiWI", None, 7),
               ByteField("timeoutVal", 0x0)
               ]
  
  
  # len 17
  class ExtendedMeasurementResultsHdr(Packet):
      """EXTENDED MEASUREMENT RESULTS Section 10.5.2.45"""
      name = "Extended Measurement Results"
      fields_desc = [
               BitField("eightBitEMR", None, 1),
               XBitField("ieiEMR", None, 7),
  
               BitField("scUsed", None, 1),
               BitField("dtxUsed", None, 1),
               BitField("rxLevC0", None, 6),
  
               BitField("rxLevC1", None, 6),
               BitField("rxLevC2Hi", None, 2),
  
               BitField("rxLevC2Lo", None, 4),
               BitField("rxLevC3Hi", None, 4),
  
               BitField("rxLevC3Lo", None, 3),
               BitField("rxLevC4", None, 5),
  
               BitField("rxLevC5", None, 6),
               BitField("rxLevC6Hi", None, 2),
  
               BitField("rxLevC6Lo", None, 4),
               BitField("rxLevC7Hi", None, 4),
  
               BitField("rxLevC7Lo", None, 2),
               BitField("rxLevC8", None, 6),
  
               BitField("rxLevC9", None, 6),
               BitField("rxLevC10Hi", None, 2),
  
               BitField("rxLevC10Lo", None, 4),
               BitField("rxLevC11Hi", None, 4),
  
               BitField("rxLevC13Lo", None, 2),
               BitField("rxLevC12", None, 6),
  
               BitField("rxLevC13", None, 6),
               BitField("rxLevC14Hi", None, 2),
  
               BitField("rxLevC14Lo", None, 4),
               BitField("rxLevC15Hi", None, 4),
  
               BitField("rxLevC15Lo", None, 2),
               BitField("rxLevC16", None, 6),
  
  
               BitField("rxLevC17", None, 6),
               BitField("rxLevC18Hi", None, 2),
  
               BitField("rxLevC18Lo", None, 4),
               BitField("rxLevC19Hi", None, 4),
  
               BitField("rxLevC19Lo", None, 2),
               BitField("rxLevC20", None, 6)
               ]
  
  
  # len 17
  class ExtendedMeasurementFrequencyListHdr(Packet):
      """Extended Measurement Frequency List Section 10.5.2.46"""
      name = "Extended Measurement Frequency List"
      fields_desc = [
               BitField("eightBitEMFL", None, 1),
               XBitField("ieiEMFL", None, 7),
  
               BitField("bit128", 0x0, 1),
               BitField("bit127", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("seqCode", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
  
               BitField("bitsRest", 0x0, 128)
               ]
  
  
  class SuspensionCauseHdr(Packet):
      """Suspension Cause Section 10.5.2.47"""
      name = "Suspension Cause"
      fields_desc = [
               BitField("eightBitSC", None, 1),
               XBitField("ieiSC", None, 7),
               ByteField("suspVal", 0x0)
               ]
  
  
  class ApduIDHdr(Packet):
      """APDU Flags Section 10.5.2.48"""
      name = "Apdu Id"
      fields_desc = [
               XBitField("ieiAI", None, 4),
               BitField("id", None, 4)
               ]
  
  
  class ApduFlagsHdr(Packet):
      """APDU Flags Section 10.5.2.49"""
      name = "Apdu Flags"
      fields_desc = [
               XBitField("iei", None, 4),
               BitField("spare", 0x0, 1),
               BitField("cr", 0x0, 1),
               BitField("firstSeg", 0x0, 1),
               BitField("lastSeg", 0x0, 1)
               ]
  
  
  # Fix 1/2 len problem
  class ApduIDAndApduFlags(Packet):
      name = "Apu Id and Apdu Flags"
      fields_desc = [
               BitField("id", None, 4),
               BitField("spare", 0x0, 1),
               BitField("cr", 0x0, 1),
               BitField("firstSeg", 0x0, 1),
               BitField("lastSeg", 0x0, 1)
               ]
  
  
  # len 2 to max L3 (251) (done)
  class ApduDataHdr(Packet):
      """APDU Data Section 10.5.2.50"""
      name = "Apdu Data"
      fields_desc = [
               BitField("eightBitAD", None, 1),
               XBitField("ieiAD", None, 7),
               XByteField("lengthAD", None),
               #optional
               ByteField("apuInfo1", None),
               ByteField("apuInfo2", None),
               ByteField("apuInfo3", None),
               ByteField("apuInfo4", None),
               ByteField("apuInfo5", None),
               ByteField("apuInfo6", None),
               ByteField("apuInfo7", None),
               ByteField("apuInfo8", None),
               ByteField("apuInfo9", None),
               ByteField("apuInfo10", None),
               ByteField("apuInfo11", None),
               ByteField("apuInfo12", None),
               ByteField("apuInfo13", None),
               ByteField("apuInfo14", None),
               ByteField("apuInfo15", None),
               ByteField("apuInfo16", None),
               ByteField("apuInfo17", None),
               ByteField("apuInfo18", None),
               ByteField("apuInfo19", None),
               ByteField("apuInfo20", None),
               ByteField("apuInfo21", None),
               ByteField("apuInfo22", None),
               ByteField("apuInfo23", None),
               ByteField("apuInfo24", None),
               ByteField("apuInfo25", None),
               ByteField("apuInfo26", None),
               ByteField("apuInfo27", None),
               ByteField("apuInfo28", None),
               ByteField("apuInfo29", None),
               ByteField("apuInfo30", None),
               ByteField("apuInfo31", None),
               ByteField("apuInfo32", None),
               ByteField("apuInfo33", None),
               ByteField("apuInfo34", None),
               ByteField("apuInfo35", None),
               ByteField("apuInfo36", None),
               ByteField("apuInfo37", None),
               ByteField("apuInfo38", None),
               ByteField("apuInfo39", None),
               ByteField("apuInfo40", None),
               ByteField("apuInfo41", None),
               ByteField("apuInfo42", None),
               ByteField("apuInfo43", None),
               ByteField("apuInfo44", None),
               ByteField("apuInfo45", None),
               ByteField("apuInfo46", None),
               ByteField("apuInfo47", None),
               ByteField("apuInfo48", None),
               ByteField("apuInfo49", None),
               ByteField("apuInfo50", None),
               ByteField("apuInfo51", None),
               ByteField("apuInfo52", None),
               ByteField("apuInfo53", None),
               ByteField("apuInfo54", None),
               ByteField("apuInfo55", None),
               ByteField("apuInfo56", None),
               ByteField("apuInfo57", None),
               ByteField("apuInfo58", None),
               ByteField("apuInfo59", None),
               ByteField("apuInfo60", None),
               ByteField("apuInfo61", None),
               ByteField("apuInfo62", None),
               ByteField("apuInfo63", None),
               ByteField("apuInfo64", None),
               ByteField("apuInfo65", None),
               ByteField("apuInfo66", None),
               ByteField("apuInfo67", None),
               ByteField("apuInfo68", None),
               ByteField("apuInfo69", None),
               ByteField("apuInfo70", None),
               ByteField("apuInfo71", None),
               ByteField("apuInfo72", None),
               ByteField("apuInfo73", None),
               ByteField("apuInfo74", None),
               ByteField("apuInfo75", None),
               ByteField("apuInfo76", None),
               ByteField("apuInfo77", None),
               ByteField("apuInfo78", None),
               ByteField("apuInfo79", None),
               ByteField("apuInfo80", None),
               ByteField("apuInfo81", None),
               ByteField("apuInfo82", None),
               ByteField("apuInfo83", None),
               ByteField("apuInfo84", None),
               ByteField("apuInfo85", None),
               ByteField("apuInfo86", None),
               ByteField("apuInfo87", None),
               ByteField("apuInfo88", None),
               ByteField("apuInfo89", None),
               ByteField("apuInfo90", None),
               ByteField("apuInfo91", None),
               ByteField("apuInfo92", None),
               ByteField("apuInfo93", None),
               ByteField("apuInfo94", None),
               ByteField("apuInfo95", None),
               ByteField("apuInfo96", None),
               ByteField("apuInfo97", None),
               ByteField("apuInfo98", None),
               ByteField("apuInfo99", None),
               ByteField("apuInfo100", None),
               ByteField("apuInfo101", None),
               ByteField("apuInfo102", None),
               ByteField("apuInfo103", None),
               ByteField("apuInfo104", None),
               ByteField("apuInfo105", None),
               ByteField("apuInfo106", None),
               ByteField("apuInfo107", None),
               ByteField("apuInfo108", None),
               ByteField("apuInfo109", None),
               ByteField("apuInfo110", None),
               ByteField("apuInfo111", None),
               ByteField("apuInfo112", None),
               ByteField("apuInfo113", None),
               ByteField("apuInfo114", None),
               ByteField("apuInfo115", None),
               ByteField("apuInfo116", None),
               ByteField("apuInfo117", None),
               ByteField("apuInfo118", None),
               ByteField("apuInfo119", None),
               ByteField("apuInfo120", None),
               ByteField("apuInfo121", None),
               ByteField("apuInfo122", None),
               ByteField("apuInfo123", None),
               ByteField("apuInfo124", None),
               ByteField("apuInfo125", None),
               ByteField("apuInfo126", None),
               ByteField("apuInfo127", None),
               ByteField("apuInfo128", None),
               ByteField("apuInfo129", None),
               ByteField("apuInfo130", None),
               ByteField("apuInfo131", None),
               ByteField("apuInfo132", None),
               ByteField("apuInfo133", None),
               ByteField("apuInfo134", None),
               ByteField("apuInfo135", None),
               ByteField("apuInfo136", None),
               ByteField("apuInfo137", None),
               ByteField("apuInfo138", None),
               ByteField("apuInfo139", None),
               ByteField("apuInfo140", None),
               ByteField("apuInfo141", None),
               ByteField("apuInfo142", None),
               ByteField("apuInfo143", None),
               ByteField("apuInfo144", None),
               ByteField("apuInfo145", None),
               ByteField("apuInfo146", None),
               ByteField("apuInfo147", None),
               ByteField("apuInfo148", None),
               ByteField("apuInfo149", None),
               ByteField("apuInfo150", None),
               ByteField("apuInfo151", None),
               ByteField("apuInfo152", None),
               ByteField("apuInfo153", None),
               ByteField("apuInfo154", None),
               ByteField("apuInfo155", None),
               ByteField("apuInfo156", None),
               ByteField("apuInfo157", None),
               ByteField("apuInfo158", None),
               ByteField("apuInfo159", None),
               ByteField("apuInfo160", None),
               ByteField("apuInfo161", None),
               ByteField("apuInfo162", None),
               ByteField("apuInfo163", None),
               ByteField("apuInfo164", None),
               ByteField("apuInfo165", None),
               ByteField("apuInfo166", None),
               ByteField("apuInfo167", None),
               ByteField("apuInfo168", None),
               ByteField("apuInfo169", None),
               ByteField("apuInfo170", None),
               ByteField("apuInfo171", None),
               ByteField("apuInfo172", None),
               ByteField("apuInfo173", None),
               ByteField("apuInfo174", None),
               ByteField("apuInfo175", None),
               ByteField("apuInfo176", None),
               ByteField("apuInfo177", None),
               ByteField("apuInfo178", None),
               ByteField("apuInfo179", None),
               ByteField("apuInfo180", None),
               ByteField("apuInfo181", None),
               ByteField("apuInfo182", None),
               ByteField("apuInfo183", None),
               ByteField("apuInfo184", None),
               ByteField("apuInfo185", None),
               ByteField("apuInfo186", None),
               ByteField("apuInfo187", None),
               ByteField("apuInfo188", None),
               ByteField("apuInfo189", None),
               ByteField("apuInfo190", None),
               ByteField("apuInfo191", None),
               ByteField("apuInfo192", None),
               ByteField("apuInfo193", None),
               ByteField("apuInfo194", None),
               ByteField("apuInfo195", None),
               ByteField("apuInfo196", None),
               ByteField("apuInfo197", None),
               ByteField("apuInfo198", None),
               ByteField("apuInfo199", None),
               ByteField("apuInfo200", None),
               ByteField("apuInfo201", None),
               ByteField("apuInfo202", None),
               ByteField("apuInfo203", None),
               ByteField("apuInfo204", None),
               ByteField("apuInfo205", None),
               ByteField("apuInfo206", None),
               ByteField("apuInfo207", None),
               ByteField("apuInfo208", None),
               ByteField("apuInfo209", None),
               ByteField("apuInfo210", None),
               ByteField("apuInfo211", None),
               ByteField("apuInfo212", None),
               ByteField("apuInfo213", None),
               ByteField("apuInfo214", None),
               ByteField("apuInfo215", None),
               ByteField("apuInfo216", None),
               ByteField("apuInfo217", None),
               ByteField("apuInfo218", None),
               ByteField("apuInfo219", None),
               ByteField("apuInfo220", None),
               ByteField("apuInfo221", None),
               ByteField("apuInfo222", None),
               ByteField("apuInfo223", None),
               ByteField("apuInfo224", None),
               ByteField("apuInfo225", None),
               ByteField("apuInfo226", None),
               ByteField("apuInfo227", None),
               ByteField("apuInfo228", None),
               ByteField("apuInfo229", None),
               ByteField("apuInfo230", None),
               ByteField("apuInfo231", None),
               ByteField("apuInfo232", None),
               ByteField("apuInfo233", None),
               ByteField("apuInfo234", None),
               ByteField("apuInfo235", None),
               ByteField("apuInfo236", None),
               ByteField("apuInfo237", None),
               ByteField("apuInfo238", None),
               ByteField("apuInfo239", None),
               ByteField("apuInfo240", None),
               ByteField("apuInfo241", None),
               ByteField("apuInfo242", None),
               ByteField("apuInfo243", None),
               ByteField("apuInfo244", None),
               ByteField("apuInfo245", None),
               ByteField("apuInfo246", None),
               ByteField("apuInfo247", None),
               ByteField("apuInfo248", None),
               ByteField("apuInfo249", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 251, a, self.fields_desc)
          if self.lengthAD is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  #
  # 10.5.3 Mobility management information elements
  #
  
  
  class AuthenticationParameterRAND(Packet):
      """Authentication parameter RAND Section 10.5.3.1"""
      name = "Authentication Parameter Rand"
      fields_desc = [
               ByteField("ieiAPR", None),
               BitField("randValue", 0x0, 128)
               ]
  
  
  class AuthenticationParameterSRES(Packet):
      """Authentication parameter SRES Section 10.5.3.2"""
      name = "Authentication Parameter Sres"
      fields_desc = [
               ByteField("ieiAPS", None),
               BitField("sresValue", 0x0, 40)
               ]
  
  
  class CmServiceType(Packet):
      """CM service type Section 10.5.3.3"""
      name = "CM Service Type"
      fields_desc = [
               XBitField("ieiCST", 0x0, 4),
               BitField("serviceType", 0x0, 4)
               ]
  
  
  class CmServiceTypeAndCiphKeySeqNr(Packet):
      name = "CM Service Type and Cipher Key Sequence Number"
      fields_desc = [
               BitField("keySeq", 0x0, 3),
               BitField("spare", 0x0, 1),
               BitField("serviceType", 0x0, 4)
               ]
  
  
  class IdentityType(Packet):
      """Identity type Section 10.5.3.4"""
      name = "Identity Type"
      fields_desc = [
               XBitField("ieiIT", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("idType", 0x1, 3)
               ]
  
  
  # Fix 1/2 len problem
  class IdentityTypeAndSpareHalfOctet(Packet):
      name = "Identity Type and Spare Half Octet"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("idType", 0x1, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class LocationUpdatingType(Packet):
      """Location updating type  Section 10.5.3.5"""
      name = "Location Updating Type"
      fields_desc = [
               XBitField("ieiLUT", 0x0, 4),
               BitField("for", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("lut", 0x0, 2)
               ]
  
  
  class LocationUpdatingTypeAndCiphKeySeqNr(Packet):
      name = "Location Updating Type and Cipher Key Sequence Number"
      fields_desc = [
               BitField("for", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("lut", 0x0, 2),
               BitField("spare", 0x0, 1),
               BitField("keySeq", 0x0, 3)
               ]
  
  
  # len 3 to L3 max (251) (done)
  class NetworkNameHdr(Packet):
      """Network Name Section 10.5.3.5a"""
      name = "Network Name"
      fields_desc = [
               BitField("eightBitNN", None, 1),
               XBitField("ieiNN", None, 7),
  
               XByteField("lengthNN", None),
  
               BitField("ext1", 0x1, 1),
               BitField("codingScheme", 0x0, 3),
               BitField("addCi", 0x0, 1),
               BitField("nbSpare", 0x0, 3),
               # optional
               ByteField("txtString1", None),
               ByteField("txtString2", None),
               ByteField("txtString3", None),
               ByteField("txtString4", None),
               ByteField("txtString5", None),
               ByteField("txtString6", None),
               ByteField("txtString7", None),
               ByteField("txtString8", None),
               ByteField("txtString9", None),
               ByteField("txtString10", None),
               ByteField("txtString11", None),
               ByteField("txtString12", None),
               ByteField("txtString13", None),
               ByteField("txtString14", None),
               ByteField("txtString15", None),
               ByteField("txtString16", None),
               ByteField("txtString17", None),
               ByteField("txtString18", None),
               ByteField("txtString19", None),
               ByteField("txtString20", None),
               ByteField("txtString21", None),
               ByteField("txtString22", None),
               ByteField("txtString23", None),
               ByteField("txtString24", None),
               ByteField("txtString25", None),
               ByteField("txtString26", None),
               ByteField("txtString27", None),
               ByteField("txtString28", None),
               ByteField("txtString29", None),
               ByteField("txtString30", None),
               ByteField("txtString31", None),
               ByteField("txtString32", None),
               ByteField("txtString33", None),
               ByteField("txtString34", None),
               ByteField("txtString35", None),
               ByteField("txtString36", None),
               ByteField("txtString37", None),
               ByteField("txtString38", None),
               ByteField("txtString39", None),
               ByteField("txtString40", None),
               ByteField("txtString41", None),
               ByteField("txtString42", None),
               ByteField("txtString43", None),
               ByteField("txtString44", None),
               ByteField("txtString45", None),
               ByteField("txtString46", None),
               ByteField("txtString47", None),
               ByteField("txtString48", None),
               ByteField("txtString49", None),
               ByteField("txtString50", None),
               ByteField("txtString51", None),
               ByteField("txtString52", None),
               ByteField("txtString53", None),
               ByteField("txtString54", None),
               ByteField("txtString55", None),
               ByteField("txtString56", None),
               ByteField("txtString57", None),
               ByteField("txtString58", None),
               ByteField("txtString59", None),
               ByteField("txtString60", None),
               ByteField("txtString61", None),
               ByteField("txtString62", None),
               ByteField("txtString63", None),
               ByteField("txtString64", None),
               ByteField("txtString65", None),
               ByteField("txtString66", None),
               ByteField("txtString67", None),
               ByteField("txtString68", None),
               ByteField("txtString69", None),
               ByteField("txtString70", None),
               ByteField("txtString71", None),
               ByteField("txtString72", None),
               ByteField("txtString73", None),
               ByteField("txtString74", None),
               ByteField("txtString75", None),
               ByteField("txtString76", None),
               ByteField("txtString77", None),
               ByteField("txtString78", None),
               ByteField("txtString79", None),
               ByteField("txtString80", None),
               ByteField("txtString81", None),
               ByteField("txtString82", None),
               ByteField("txtString83", None),
               ByteField("txtString84", None),
               ByteField("txtString85", None),
               ByteField("txtString86", None),
               ByteField("txtString87", None),
               ByteField("txtString88", None),
               ByteField("txtString89", None),
               ByteField("txtString90", None),
               ByteField("txtString91", None),
               ByteField("txtString92", None),
               ByteField("txtString93", None),
               ByteField("txtString94", None),
               ByteField("txtString95", None),
               ByteField("txtString96", None),
               ByteField("txtString97", None),
               ByteField("txtString98", None),
               ByteField("txtString99", None),
               ByteField("txtString100", None),
               ByteField("txtString101", None),
               ByteField("txtString102", None),
               ByteField("txtString103", None),
               ByteField("txtString104", None),
               ByteField("txtString105", None),
               ByteField("txtString106", None),
               ByteField("txtString107", None),
               ByteField("txtString108", None),
               ByteField("txtString109", None),
               ByteField("txtString110", None),
               ByteField("txtString111", None),
               ByteField("txtString112", None),
               ByteField("txtString113", None),
               ByteField("txtString114", None),
               ByteField("txtString115", None),
               ByteField("txtString116", None),
               ByteField("txtString117", None),
               ByteField("txtString118", None),
               ByteField("txtString119", None),
               ByteField("txtString120", None),
               ByteField("txtString121", None),
               ByteField("txtString122", None),
               ByteField("txtString123", None),
               ByteField("txtString124", None),
               ByteField("txtString125", None),
               ByteField("txtString126", None),
               ByteField("txtString127", None),
               ByteField("txtString128", None),
               ByteField("txtString129", None),
               ByteField("txtString130", None),
               ByteField("txtString131", None),
               ByteField("txtString132", None),
               ByteField("txtString133", None),
               ByteField("txtString134", None),
               ByteField("txtString135", None),
               ByteField("txtString136", None),
               ByteField("txtString137", None),
               ByteField("txtString138", None),
               ByteField("txtString139", None),
               ByteField("txtString140", None),
               ByteField("txtString141", None),
               ByteField("txtString142", None),
               ByteField("txtString143", None),
               ByteField("txtString144", None),
               ByteField("txtString145", None),
               ByteField("txtString146", None),
               ByteField("txtString147", None),
               ByteField("txtString148", None),
               ByteField("txtString149", None),
               ByteField("txtString150", None),
               ByteField("txtString151", None),
               ByteField("txtString152", None),
               ByteField("txtString153", None),
               ByteField("txtString154", None),
               ByteField("txtString155", None),
               ByteField("txtString156", None),
               ByteField("txtString157", None),
               ByteField("txtString158", None),
               ByteField("txtString159", None),
               ByteField("txtString160", None),
               ByteField("txtString161", None),
               ByteField("txtString162", None),
               ByteField("txtString163", None),
               ByteField("txtString164", None),
               ByteField("txtString165", None),
               ByteField("txtString166", None),
               ByteField("txtString167", None),
               ByteField("txtString168", None),
               ByteField("txtString169", None),
               ByteField("txtString170", None),
               ByteField("txtString171", None),
               ByteField("txtString172", None),
               ByteField("txtString173", None),
               ByteField("txtString174", None),
               ByteField("txtString175", None),
               ByteField("txtString176", None),
               ByteField("txtString177", None),
               ByteField("txtString178", None),
               ByteField("txtString179", None),
               ByteField("txtString180", None),
               ByteField("txtString181", None),
               ByteField("txtString182", None),
               ByteField("txtString183", None),
               ByteField("txtString184", None),
               ByteField("txtString185", None),
               ByteField("txtString186", None),
               ByteField("txtString187", None),
               ByteField("txtString188", None),
               ByteField("txtString189", None),
               ByteField("txtString190", None),
               ByteField("txtString191", None),
               ByteField("txtString192", None),
               ByteField("txtString193", None),
               ByteField("txtString194", None),
               ByteField("txtString195", None),
               ByteField("txtString196", None),
               ByteField("txtString197", None),
               ByteField("txtString198", None),
               ByteField("txtString199", None),
               ByteField("txtString200", None),
               ByteField("txtString201", None),
               ByteField("txtString202", None),
               ByteField("txtString203", None),
               ByteField("txtString204", None),
               ByteField("txtString205", None),
               ByteField("txtString206", None),
               ByteField("txtString207", None),
               ByteField("txtString208", None),
               ByteField("txtString209", None),
               ByteField("txtString210", None),
               ByteField("txtString211", None),
               ByteField("txtString212", None),
               ByteField("txtString213", None),
               ByteField("txtString214", None),
               ByteField("txtString215", None),
               ByteField("txtString216", None),
               ByteField("txtString217", None),
               ByteField("txtString218", None),
               ByteField("txtString219", None),
               ByteField("txtString220", None),
               ByteField("txtString221", None),
               ByteField("txtString222", None),
               ByteField("txtString223", None),
               ByteField("txtString224", None),
               ByteField("txtString225", None),
               ByteField("txtString226", None),
               ByteField("txtString227", None),
               ByteField("txtString228", None),
               ByteField("txtString229", None),
               ByteField("txtString230", None),
               ByteField("txtString231", None),
               ByteField("txtString232", None),
               ByteField("txtString233", None),
               ByteField("txtString234", None),
               ByteField("txtString235", None),
               ByteField("txtString236", None),
               ByteField("txtString237", None),
               ByteField("txtString238", None),
               ByteField("txtString239", None),
               ByteField("txtString240", None),
               ByteField("txtString241", None),
               ByteField("txtString242", None),
               ByteField("txtString243", None),
               ByteField("txtString244", None),
               ByteField("txtString245", None),
               ByteField("txtString246", None),
               ByteField("txtString247", None),
               ByteField("txtString248", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 251, a, self.fields_desc)
          if self.lengthNN is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class RejectCause(Packet):
      """Reject cause Section 10.5.3.6"""
      name = "Reject Cause"
      fields_desc = [
               ByteField("ieiRC", 0x0),
               ByteField("rejCause", 0x0)
               ]
  
  
  class FollowOnProceed(Packet):
      """Follow-on Proceed Section 10.5.3.7"""
      name = "Follow-on Proceed"
      fields_desc = [
               ByteField("ieiFOP", 0x0),
               ]
  
  
  class TimeZoneHdr(Packet):
      """Time Zone  Section 10.5.3.8"""
      name = "Time Zone"
      fields_desc = [
               BitField("eightBitTZ", None, 1),
               XBitField("ieiTZ", None, 7),
               ByteField("timeZone", 0x0),
               ]
  
  
  class TimeZoneAndTimeHdr(Packet):
      """Time Zone and Time Section 10.5.3.9"""
      name = "Time Zone and Time"
      fields_desc = [
               BitField("eightBitTZAT", None, 1),
               XBitField("ieiTZAT", None, 7),
               ByteField("year", 0x0),
               ByteField("month", 0x0),
               ByteField("day", 0x0),
               ByteField("hour", 0x0),
               ByteField("minute", 0x0),
               ByteField("second", 0x0),
               ByteField("timeZone", 0x0)
               ]
  
  
  class CtsPermissionHdr(Packet):
      """CTS permission Section 10.5.3.10"""
      name = "Cts Permission"
      fields_desc = [
               BitField("eightBitCP", None, 1),
               XBitField("ieiCP", None, 7),
               ]
  
  
  class LsaIdentifierHdr(Packet):
      """LSA Identifier Section 10.5.3.11"""
      name = "Lsa Identifier"
      fields_desc = [
               BitField("eightBitLI", None, 1),
               XBitField("ieiLI", None, 7),
               ByteField("lsaID", 0x0),
               ByteField("lsaID1", 0x0),
               ByteField("lsaID2", 0x0)
               ]
  
  
  #
  # 10.5.4 Call control information elements
  #
  
  #10.5.4.1 Extensions of codesets
  # This is only text and no  packet
  
  class LockingShiftProcedureHdr(Packet):
      """Locking shift procedure Section 10.5.4.2"""
      name = "Locking Shift Procedure"
      fields_desc = [
               XBitField("ieiLSP", None, 4),
               BitField("lockShift", 0x0, 1),
               BitField("codesetId", 0x0, 3)
               ]
  
  
  class NonLockingShiftProcedureHdr(Packet):
      """Non-locking shift procedure Section 10.5.4.3"""
      name = "Non-locking Shift Procedure"
      fields_desc = [
               XBitField("ieiNLSP", None, 4),
               BitField("nonLockShift", 0x1, 1),
               BitField("codesetId", 0x0, 3)
               ]
  
  
  class AuxiliaryStatesHdr(Packet):
      """Auxiliary states Section 10.5.4.4"""
      name = "Auxiliary States"
      fields_desc = [
               BitField("eightBitAS", None, 1),
               XBitField("ieiAS", None, 7),
               XByteField("lengthAS", 0x3),
               BitField("ext", 0x1, 1),
               BitField("spare", 0x0, 3),
               BitField("holdState", 0x0, 2),
               BitField("mptyState", 0x0, 2)
               ]
  
  
  # len 3 to 15
  class BearerCapabilityHdr(Packet):
      """Bearer capability Section 10.5.4.5"""
      name = "Bearer Capability"
      fields_desc = [
               BitField("eightBitBC", None, 1),
               XBitField("ieiBC", None, 7),
  
               XByteField("lengthBC", None),
  
               BitField("ext0", 0x1, 1),
               BitField("radioChReq", 0x1, 2),
               BitField("codingStd", 0x0, 1),
               BitField("transMode", 0x0, 1),
               BitField("infoTransCa", 0x0, 3),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                         lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("coding", None, 1),
                                         lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("spare", None, 2),
                                         lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("speechVers", 0x0, 4),
                                         lambda pkt: pkt.ext0 == 0),
  
               ConditionalField(BitField("ext2", 0x1, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("compress", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("structure", None, 2),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("dupMode", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("config", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("nirr", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("establi", 0x0, 1),
                                         lambda pkt: pkt.ext1 == 0),
  
               BitField("ext3", None, 1),
               BitField("accessId", None, 2),
               BitField("rateAda", None, 2),
               BitField("signaling", None, 3),
  
               ConditionalField(BitField("ext4", None, 1),
                                         lambda pkt: pkt.ext3 == 0),
               ConditionalField(BitField("otherITC", None, 2),
                                         lambda pkt: pkt.ext3 == 0),
               ConditionalField(BitField("otherRate", None, 2),
                                         lambda pkt: pkt.ext3 == 0),
               ConditionalField(BitField("spare1", 0x0, 3),
                                         lambda pkt: pkt.ext3 == 0),
  
               ConditionalField(BitField("ext5", 0x1, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("hdr", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("multiFr", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("mode", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("lli", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("assig", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("inbNeg", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("spare2", 0x0, 1),
                                         lambda pkt: pkt.ext4 == 0),
  
               BitField("ext6", None, 1),
               BitField("layer1Id", None, 2),
               BitField("userInf", None, 4),
               BitField("sync", None, 1),
  
               ConditionalField(BitField("ext7", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("stopBit", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("negoc", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("nbDataBit", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("userRate", None, 4),
                                         lambda pkt: pkt.ext6 == 0),
  
               ConditionalField(BitField("ext8", None, 1),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("interRate", None, 2),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("nicTX", None, 1),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("nicRX", None, 1),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("parity", None, 3),
                                         lambda pkt: pkt.ext7 == 0),
  
               ConditionalField(BitField("ext9", None, 1),
                                         lambda pkt: pkt.ext8 == 0),
               ConditionalField(BitField("connEle", None, 2),
                                         lambda pkt: pkt.ext8 == 0),
               ConditionalField(BitField("modemType", None, 5),
                                         lambda pkt: pkt.ext8 == 0),
  
               ConditionalField(BitField("ext10", None, 1),
                                         lambda pkt: pkt.ext9 == 0),
               ConditionalField(BitField("otherModemType", None, 2),
                                         lambda pkt: pkt.ext9 == 0),
               ConditionalField(BitField("netUserRate", None, 5),
                                         lambda pkt: pkt.ext9 == 0),
  
               ConditionalField(BitField("ext11", None, 1),
                                         lambda pkt: pkt.ext10 == 0),
               ConditionalField(BitField("chanCoding", None, 4),
                                         lambda pkt: pkt.ext10 == 0),
               ConditionalField(BitField("maxTrafficChan", None, 3),
                                         lambda pkt: pkt.ext10 == 0),
  
               ConditionalField(BitField("ext12", None, 1),
                                         lambda pkt: pkt.ext11 == 0),
               ConditionalField(BitField("uimi", None, 3),
                                         lambda pkt: pkt.ext11 == 0),
               ConditionalField(BitField("airInterfaceUserRate", None, 4),
                                         lambda pkt: pkt.ext11 == 0),
  
               ConditionalField(BitField("ext13", 0x1, 1),
                                         lambda pkt: pkt.ext12 == 0),
               ConditionalField(BitField("layer2Ch", None, 2),
                                         lambda pkt: pkt.ext12 == 0),
               ConditionalField(BitField("userInfoL2", 0x0, 5),
                                         lambda pkt: pkt.ext12 == 0)
               ]
  
      # We have a bug here. packet is not working if used in message
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 15, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          # avoids a bug. find better way
          if len(p) is 5:
              p = p[:-2]
          if self.lengthBC is None:
              p = p[:1] + struct.pack(">B", len(p)-3) + p[2:]
          return p + pay
  
  
  class CallControlCapabilitiesHdr(Packet):
      """Call Control Capabilities Section 10.5.4.5a"""
      name = "Call Control Capabilities"
      fields_desc = [
               BitField("eightBitCCC", None, 1),
               XBitField("ieiCCC", None, 7),
               XByteField("lengthCCC", 0x3),
               BitField("spare", 0x0, 6),
               BitField("pcp", 0x0, 1),
               BitField("dtmf", 0x0, 1)
               ]
  
  
  class CallStateHdr(Packet):
      """Call State Section 10.5.4.6"""
      name = "Call State"
      fields_desc = [
               BitField("eightBitCS", None, 1),
               XBitField("ieiCS", None, 7),
               BitField("codingStd", 0x0, 2),
               BitField("stateValue", 0x0, 6)
               ]
  
  
  # len 3 to 43
  class CalledPartyBcdNumberHdr(Packet):
      """Called party BCD number Section 10.5.4.7"""
      name = "Called Party BCD Number"
      fields_desc = [
               BitField("eightBitCPBN", None, 1),
               XBitField("ieiCPBN", None, 7),
               XByteField("lengthCPBN", None),
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("nbPlanId", 0x0, 4),
               # optional
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4),
  
               BitField("nbDigit22", None, 4),
               BitField("nbDigit21", None, 4),
               BitField("nbDigit24", None, 4),
               BitField("nbDigit23", None, 4),
  
               BitField("nbDigit26", None, 4),
               BitField("nbDigit25", None, 4),
               BitField("nbDigit28", None, 4),
               BitField("nbDigit27", None, 4),
  
               BitField("nbDigit30", None, 4),
               BitField("nbDigit29", None, 4),
               BitField("nbDigit32", None, 4),
               BitField("nbDigit31", None, 4),
  
               BitField("nbDigit34", None, 4),
               BitField("nbDigit33", None, 4),
               BitField("nbDigit36", None, 4),
               BitField("nbDigit35", None, 4),
  
               BitField("nbDigit38", None, 4),
               BitField("nbDigit37", None, 4),
               BitField("nbDigit40", None, 4),
               BitField("nbDigit39", None, 4),
  # ^^^^^^ 20 first optional bytes ^^^^^^^^^^^^^^^
               BitField("nbDigit42", None, 4),
               BitField("nbDigit41", None, 4),
               BitField("nbDigit44", None, 4),
               BitField("nbDigit43", None, 4),
  
               BitField("nbDigit46", None, 4),
               BitField("nbDigit45", None, 4),
               BitField("nbDigit48", None, 4),
               BitField("nbDigit47", None, 4),
  
               BitField("nbDigit50", None, 4),
               BitField("nbDigit49", None, 4),
               BitField("nbDigit52", None, 4),
               BitField("nbDigit51", None, 4),
  
               BitField("nbDigit54", None, 4),
               BitField("nbDigit53", None, 4),
               BitField("nbDigit56", None, 4),
               BitField("nbDigit55", None, 4),
  
               BitField("nbDigit58", None, 4),
               BitField("nbDigit57", None, 4),
               BitField("nbDigit60", None, 4),
               BitField("nbDigit59", None, 4),
  
               BitField("nbDigit62", None, 4),
               BitField("nbDigit61", None, 4),
               BitField("nbDigit64", None, 4),
               BitField("nbDigit63", None, 4),
  
               BitField("nbDigit66", None, 4),
               BitField("nbDigit65", None, 4),
               BitField("nbDigit68", None, 4),
               BitField("nbDigit67", None, 4),
  
               BitField("nbDigit70", None, 4),
               BitField("nbDigit69", None, 4),
               BitField("nbDigit72", None, 4),
               BitField("nbDigit71", None, 4),
  
               BitField("nbDigit74", None, 4),
               BitField("nbDigit73", None, 4),
               BitField("nbDigit76", None, 4),
               BitField("nbDigit75", None, 4),
  
               BitField("nbDigit78", None, 4),
               BitField("nbDigit77", None, 4),
               BitField("nbDigit80", None, 4),
               BitField("nbDigit79", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 43, a, self.fields_desc, 2)
          if self.lengthCPBN is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 2 to 23
  class CalledPartySubaddressHdr(Packet):
      """Called party subaddress Section 10.5.4.8"""
      name = "Called Party Subaddress"
      fields_desc = [
               BitField("eightBitCPS", None, 1),
               XBitField("ieiCPS", None, 7),
               XByteField("lengthCPS", None),
               # optional
               BitField("ext", None, 1),
               BitField("subAddr", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 23,  a, self.fields_desc)
          if self.lengthCPS is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 3 to 14
  class CallingPartyBcdNumberHdr(Packet):
      """Called party subaddress Section 10.5.4.9"""
      name = "Called Party Subaddress"
      fields_desc = [
               BitField("eightBitCPBN", None, 1),
               XBitField("ieiCPBN", None, 7),
               XByteField("lengthCPBN", None),
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("nbPlanId", 0x0, 4),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("presId", None, 2),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("spare", None, 3),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("screenId", 0x0, 2),
                                lambda pkt: pkt.ext == 0),
  
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
  
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
  
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
  
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
  
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
  
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 14, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthCPBN is None:
              p = p[:1] + struct.pack(">B", len(p)-2) + p[2:]
          return p + pay
  
  
  # len 2 to 23
  class CallingPartySubaddressHdr(Packet):
      """Calling party subaddress  Section 10.5.4.10"""
      name = "Calling Party Subaddress"
      fields_desc = [
               BitField("eightBitCPS", None, 1),
               XBitField("ieiCPS", None, 7),
               XByteField("lengthCPS", None),
               # optional
               BitField("ext1", None, 1),
               BitField("typeAddr", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 23, a, self.fields_desc)
          if self.lengthCPS is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 4 to 32
  class CauseHdr(Packet):
      """Cause Section 10.5.4.11"""
      name = "Cause"
      fields_desc = [
               BitField("eightBitC", None, 1),
               XBitField("ieiC", None, 7),
  
               XByteField("lengthC", None),
  
               BitField("ext", 0x1, 1),
               BitField("codingStd", 0x0, 2),
               BitField("spare", 0x0, 1),
               BitField("location", 0x0, 4),
  
               ConditionalField(BitField("ext1", 0x1, 1),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("recommendation", 0x0, 7),
                                lambda pkt: pkt.ext == 0),
               # optional
               BitField("ext2", None, 1),
               BitField("causeValue", None, 7),
  
               ByteField("diagnositc0", None),
               ByteField("diagnositc1", None),
               ByteField("diagnositc2", None),
               ByteField("diagnositc3", None),
               ByteField("diagnositc4", None),
               ByteField("diagnositc5", None),
               ByteField("diagnositc6", None),
               ByteField("diagnositc7", None),
               ByteField("diagnositc8", None),
               ByteField("diagnositc9", None),
               ByteField("diagnositc10", None),
               ByteField("diagnositc11", None),
               ByteField("diagnositc12", None),
               ByteField("diagnositc13", None),
               ByteField("diagnositc14", None),
               ByteField("diagnositc15", None),
               ByteField("diagnositc16", None),
               ByteField("diagnositc17", None),
               ByteField("diagnositc18", None),
               ByteField("diagnositc19", None),
               ByteField("diagnositc20", None),
               ByteField("diagnositc21", None),
               ByteField("diagnositc22", None),
               ByteField("diagnositc23", None),
               ByteField("diagnositc24", None),
               ByteField("diagnositc25", None),
               ByteField("diagnositc26", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 32, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthC is None:
              p = p[:1] + struct.pack(">B", len(p)-2) + p[2:]
          return p + pay
  
  
  class ClirSuppressionHdr(Packet):
      """CLIR suppression Section 10.5.4.11a"""
      name = "Clir Suppression"
      fields_desc = [
               BitField("eightBitCS", None, 1),
               XBitField("ieiCS", None, 7),
               ]
  
  
  class ClirInvocationHdr(Packet):
      """CLIR invocation Section 10.5.4.11b"""
      name = "Clir Invocation"
      fields_desc = [
               BitField("eightBitCI", None, 1),
               XBitField("ieiCI", None, 7),
               ]
  
  
  class CongestionLevelHdr(Packet):
      """Congestion level Section 10.5.4.12"""
      name = "Congestion Level"
      fields_desc = [
               XBitField("ieiCL", None, 4),
               BitField("notDef", 0x0, 4) 
               ]
  
  
  # Fix 1/2 len problem
  class CongestionLevelAndSpareHalfOctets(Packet):
      name = "Congestion Level and Spare Half Octets"
      fields_desc = [
               BitField("ieiCL", 0x0, 4),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  # len 3 to 14
  class ConnectedNumberHdr(Packet):
      """Connected number Section 10.5.4.13"""
      name = "Connected Number"
      fields_desc = [
               BitField("eightBitCN", None, 1),
               XBitField("ieiCN", None, 7),
  
               XByteField("lengthCN", None),
  
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("typePlanId", 0x0, 4),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("presId", None, 2),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("spare", None, 3),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("screenId", None, 2),
                                lambda pkt: pkt.ext == 0),
  
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
  
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
  
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
  
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
  
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
  
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 14, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthCN is None:
              p = p[:1] + struct.pack(">B", len(p)-2) + p[2:]
          return p + pay
  
  
  # len 2 to 23
  class ConnectedSubaddressHdr(Packet):
      """Connected subaddress Section 10.5.4.14"""
      name = "Connected Subaddress"
      fields_desc = [
               BitField("eightBitCS", None, 1),
               XBitField("ieiCS", None, 7),
  
               XByteField("lengthCS", None),
               # optional
               BitField("ext", None, 1),
               BitField("typeOfSub", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 23, a, self.fields_desc)
          if self.lengthCS is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 2 to L3 (251) (done)
  class FacilityHdr(Packet):
      """Facility Section 10.5.4.15"""
      name = "Facility"
      fields_desc = [
               BitField("eightBitF", None, 1),
               XBitField("ieiF", None, 7),
               XByteField("lengthF", None),
               # optional
               ByteField("facilityInfo1", None),
               ByteField("facilityInfo2", None),
               ByteField("facilityInfo3", None),
               ByteField("facilityInfo4", None),
               ByteField("facilityInfo5", None),
               ByteField("facilityInfo6", None),
               ByteField("facilityInfo7", None),
               ByteField("facilityInfo8", None),
               ByteField("facilityInfo9", None),
               ByteField("facilityInfo10", None),
               ByteField("facilityInfo11", None),
               ByteField("facilityInfo12", None),
               ByteField("facilityInfo13", None),
               ByteField("facilityInfo14", None),
               ByteField("facilityInfo15", None),
               ByteField("facilityInfo16", None),
               ByteField("facilityInfo17", None),
               ByteField("facilityInfo18", None),
               ByteField("facilityInfo19", None),
               ByteField("facilityInfo20", None),
               ByteField("facilityInfo21", None),
               ByteField("facilityInfo22", None),
               ByteField("facilityInfo23", None),
               ByteField("facilityInfo24", None),
               ByteField("facilityInfo25", None),
               ByteField("facilityInfo26", None),
               ByteField("facilityInfo27", None),
               ByteField("facilityInfo28", None),
               ByteField("facilityInfo29", None),
               ByteField("facilityInfo30", None),
               ByteField("facilityInfo31", None),
               ByteField("facilityInfo32", None),
               ByteField("facilityInfo33", None),
               ByteField("facilityInfo34", None),
               ByteField("facilityInfo35", None),
               ByteField("facilityInfo36", None),
               ByteField("facilityInfo37", None),
               ByteField("facilityInfo38", None),
               ByteField("facilityInfo39", None),
               ByteField("facilityInfo40", None),
               ByteField("facilityInfo41", None),
               ByteField("facilityInfo42", None),
               ByteField("facilityInfo43", None),
               ByteField("facilityInfo44", None),
               ByteField("facilityInfo45", None),
               ByteField("facilityInfo46", None),
               ByteField("facilityInfo47", None),
               ByteField("facilityInfo48", None),
               ByteField("facilityInfo49", None),
               ByteField("facilityInfo50", None),
               ByteField("facilityInfo51", None),
               ByteField("facilityInfo52", None),
               ByteField("facilityInfo53", None),
               ByteField("facilityInfo54", None),
               ByteField("facilityInfo55", None),
               ByteField("facilityInfo56", None),
               ByteField("facilityInfo57", None),
               ByteField("facilityInfo58", None),
               ByteField("facilityInfo59", None),
               ByteField("facilityInfo60", None),
               ByteField("facilityInfo61", None),
               ByteField("facilityInfo62", None),
               ByteField("facilityInfo63", None),
               ByteField("facilityInfo64", None),
               ByteField("facilityInfo65", None),
               ByteField("facilityInfo66", None),
               ByteField("facilityInfo67", None),
               ByteField("facilityInfo68", None),
               ByteField("facilityInfo69", None),
               ByteField("facilityInfo70", None),
               ByteField("facilityInfo71", None),
               ByteField("facilityInfo72", None),
               ByteField("facilityInfo73", None),
               ByteField("facilityInfo74", None),
               ByteField("facilityInfo75", None),
               ByteField("facilityInfo76", None),
               ByteField("facilityInfo77", None),
               ByteField("facilityInfo78", None),
               ByteField("facilityInfo79", None),
               ByteField("facilityInfo80", None),
               ByteField("facilityInfo81", None),
               ByteField("facilityInfo82", None),
               ByteField("facilityInfo83", None),
               ByteField("facilityInfo84", None),
               ByteField("facilityInfo85", None),
               ByteField("facilityInfo86", None),
               ByteField("facilityInfo87", None),
               ByteField("facilityInfo88", None),
               ByteField("facilityInfo89", None),
               ByteField("facilityInfo90", None),
               ByteField("facilityInfo91", None),
               ByteField("facilityInfo92", None),
               ByteField("facilityInfo93", None),
               ByteField("facilityInfo94", None),
               ByteField("facilityInfo95", None),
               ByteField("facilityInfo96", None),
               ByteField("facilityInfo97", None),
               ByteField("facilityInfo98", None),
               ByteField("facilityInfo99", None),
               ByteField("facilityInfo100", None),
               ByteField("facilityInfo101", None),
               ByteField("facilityInfo102", None),
               ByteField("facilityInfo103", None),
               ByteField("facilityInfo104", None),
               ByteField("facilityInfo105", None),
               ByteField("facilityInfo106", None),
               ByteField("facilityInfo107", None),
               ByteField("facilityInfo108", None),
               ByteField("facilityInfo109", None),
               ByteField("facilityInfo110", None),
               ByteField("facilityInfo111", None),
               ByteField("facilityInfo112", None),
               ByteField("facilityInfo113", None),
               ByteField("facilityInfo114", None),
               ByteField("facilityInfo115", None),
               ByteField("facilityInfo116", None),
               ByteField("facilityInfo117", None),
               ByteField("facilityInfo118", None),
               ByteField("facilityInfo119", None),
               ByteField("facilityInfo120", None),
               ByteField("facilityInfo121", None),
               ByteField("facilityInfo122", None),
               ByteField("facilityInfo123", None),
               ByteField("facilityInfo124", None),
               ByteField("facilityInfo125", None),
               ByteField("facilityInfo126", None),
               ByteField("facilityInfo127", None),
               ByteField("facilityInfo128", None),
               ByteField("facilityInfo129", None),
               ByteField("facilityInfo130", None),
               ByteField("facilityInfo131", None),
               ByteField("facilityInfo132", None),
               ByteField("facilityInfo133", None),
               ByteField("facilityInfo134", None),
               ByteField("facilityInfo135", None),
               ByteField("facilityInfo136", None),
               ByteField("facilityInfo137", None),
               ByteField("facilityInfo138", None),
               ByteField("facilityInfo139", None),
               ByteField("facilityInfo140", None),
               ByteField("facilityInfo141", None),
               ByteField("facilityInfo142", None),
               ByteField("facilityInfo143", None),
               ByteField("facilityInfo144", None),
               ByteField("facilityInfo145", None),
               ByteField("facilityInfo146", None),
               ByteField("facilityInfo147", None),
               ByteField("facilityInfo148", None),
               ByteField("facilityInfo149", None),
               ByteField("facilityInfo150", None),
               ByteField("facilityInfo151", None),
               ByteField("facilityInfo152", None),
               ByteField("facilityInfo153", None),
               ByteField("facilityInfo154", None),
               ByteField("facilityInfo155", None),
               ByteField("facilityInfo156", None),
               ByteField("facilityInfo157", None),
               ByteField("facilityInfo158", None),
               ByteField("facilityInfo159", None),
               ByteField("facilityInfo160", None),
               ByteField("facilityInfo161", None),
               ByteField("facilityInfo162", None),
               ByteField("facilityInfo163", None),
               ByteField("facilityInfo164", None),
               ByteField("facilityInfo165", None),
               ByteField("facilityInfo166", None),
               ByteField("facilityInfo167", None),
               ByteField("facilityInfo168", None),
               ByteField("facilityInfo169", None),
               ByteField("facilityInfo170", None),
               ByteField("facilityInfo171", None),
               ByteField("facilityInfo172", None),
               ByteField("facilityInfo173", None),
               ByteField("facilityInfo174", None),
               ByteField("facilityInfo175", None),
               ByteField("facilityInfo176", None),
               ByteField("facilityInfo177", None),
               ByteField("facilityInfo178", None),
               ByteField("facilityInfo179", None),
               ByteField("facilityInfo180", None),
               ByteField("facilityInfo181", None),
               ByteField("facilityInfo182", None),
               ByteField("facilityInfo183", None),
               ByteField("facilityInfo184", None),
               ByteField("facilityInfo185", None),
               ByteField("facilityInfo186", None),
               ByteField("facilityInfo187", None),
               ByteField("facilityInfo188", None),
               ByteField("facilityInfo189", None),
               ByteField("facilityInfo190", None),
               ByteField("facilityInfo191", None),
               ByteField("facilityInfo192", None),
               ByteField("facilityInfo193", None),
               ByteField("facilityInfo194", None),
               ByteField("facilityInfo195", None),
               ByteField("facilityInfo196", None),
               ByteField("facilityInfo197", None),
               ByteField("facilityInfo198", None),
               ByteField("facilityInfo199", None),
               ByteField("facilityInfo200", None),
               ByteField("facilityInfo201", None),
               ByteField("facilityInfo202", None),
               ByteField("facilityInfo203", None),
               ByteField("facilityInfo204", None),
               ByteField("facilityInfo205", None),
               ByteField("facilityInfo206", None),
               ByteField("facilityInfo207", None),
               ByteField("facilityInfo208", None),
               ByteField("facilityInfo209", None),
               ByteField("facilityInfo210", None),
               ByteField("facilityInfo211", None),
               ByteField("facilityInfo212", None),
               ByteField("facilityInfo213", None),
               ByteField("facilityInfo214", None),
               ByteField("facilityInfo215", None),
               ByteField("facilityInfo216", None),
               ByteField("facilityInfo217", None),
               ByteField("facilityInfo218", None),
               ByteField("facilityInfo219", None),
               ByteField("facilityInfo220", None),
               ByteField("facilityInfo221", None),
               ByteField("facilityInfo222", None),
               ByteField("facilityInfo223", None),
               ByteField("facilityInfo224", None),
               ByteField("facilityInfo225", None),
               ByteField("facilityInfo226", None),
               ByteField("facilityInfo227", None),
               ByteField("facilityInfo228", None),
               ByteField("facilityInfo229", None),
               ByteField("facilityInfo230", None),
               ByteField("facilityInfo231", None),
               ByteField("facilityInfo232", None),
               ByteField("facilityInfo233", None),
               ByteField("facilityInfo234", None),
               ByteField("facilityInfo235", None),
               ByteField("facilityInfo236", None),
               ByteField("facilityInfo237", None),
               ByteField("facilityInfo238", None),
               ByteField("facilityInfo239", None),
               ByteField("facilityInfo240", None),
               ByteField("facilityInfo241", None),
               ByteField("facilityInfo242", None),
               ByteField("facilityInfo243", None),
               ByteField("facilityInfo244", None),
               ByteField("facilityInfo245", None),
               ByteField("facilityInfo246", None),
               ByteField("facilityInfo247", None),
               ByteField("facilityInfo248", None),
               ByteField("facilityInfo249", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 251, a, self.fields_desc)
          if self.lengthF is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  #len 2 to 5
  class HighLayerCompatibilityHdr(Packet):
      """High layer compatibility Section 10.5.4.16"""
      name = "High Layer Compatibility"
      fields_desc = [
               BitField("eightBitHLC", None, 1),
               XBitField("ieiHLC", None, 7),
  
               XByteField("lengthHLC", None),
               # optional
               BitField("ext", None, 1),
               BitField("codingStd", None, 2),
               BitField("interpret", None, 3),
               BitField("presMeth", None, 2),
  
               BitField("ext1", None, 1),
               BitField("highLayerId", None, 7),
  
               ConditionalField(BitField("ext2", 0x1, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("exHiLayerId", 0x0, 7),
                                         lambda pkt: pkt.ext1 == 0)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 5, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthHLC is None:
              p = p[:1] + struct.pack(">B", len(p)-2) + p[2:]
          return p + pay
  #
  # 10.5.4.16.1           Static conditions for the high layer
  # compatibility IE contents
  #
  
  
  class KeypadFacilityHdr(Packet):
      """Keypad facility Section 10.5.4.17"""
      name = "Keypad Facility"
      fields_desc = [
               BitField("eightBitKF", None, 1),
               XBitField("ieiKF", None, 7),
               BitField("spare", 0x0, 1),
               BitField("keyPadInfo", 0x0, 7)
               ]
  
  
  # len 2 to 15
  class LowLayerCompatibilityHdr(Packet):
      """Low layer compatibility Section 10.5.4.18"""
      name = "Low Layer Compatibility"
      fields_desc = [
               BitField("eightBitLLC", None, 1),
               XBitField("ieiLLC", None, 7),
  
               XByteField("lengthLLC", None),
               # optional
               ByteField("rest0", None),
               ByteField("rest1", None),
               ByteField("rest2", None),
               ByteField("rest3", None),
               ByteField("rest4", None),
               ByteField("rest5", None),
               ByteField("rest6", None),
               ByteField("rest7", None),
               ByteField("rest8", None),
               ByteField("rest9", None),
               ByteField("rest10", None),
               ByteField("rest11", None),
               ByteField("rest12", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 15, a, self.fields_desc)
          if self.lengthLLC is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MoreDataHdr(Packet):
      """More data Section 10.5.4.19"""
      name = "More Data"
      fields_desc = [
               BitField("eightBitMD", None, 1),
               XBitField("ieiMD", None, 7),
               ]
  
  
  class NotificationIndicatorHdr(Packet):
      """Notification indicator Section 10.5.4.20"""
      name = "Notification Indicator"
      fields_desc = [
               BitField("eightBitNI", None, 1),
               XBitField("ieiNI", None, 7),
               BitField("ext", 0x1, 1),
               BitField("notifDesc", 0x0, 7)
               ]
  
  
  class ProgressIndicatorHdr(Packet):
      """Progress indicator Section 10.5.4.21"""
      name = "Progress Indicator"
      fields_desc = [
               BitField("eightBitPI", None, 1),
               XBitField("ieiPI", None, 7),
               XByteField("lengthPI", 0x2),
               BitField("ext", 0x1, 1),
               BitField("codingStd", 0x0, 2),
               BitField("spare", 0x0, 1),
               BitField("location", 0x0, 4),
               BitField("ext1", 0x1, 1),
               BitField("progressDesc", 0x0, 7)
               ]
  
  
  class RecallTypeHdr(Packet):
      """Recall type $(CCBS)$  Section 10.5.4.21a"""
      name = "Recall Type $(CCBS)$"
      fields_desc = [
               BitField("eightBitRT", None, 1),
               XBitField("ieiRT", None, 7),
               BitField("spare", 0x0, 5),
               BitField("recallType", 0x0, 3)
               ]
  
  
  # len 3 to 19
  class RedirectingPartyBcdNumberHdr(Packet):
      """Redirecting party BCD number  Section 10.5.4.21b"""
      name = "Redirecting Party BCD Number"
      fields_desc = [
               BitField("eightBitRPBN", None, 1),
               XBitField("ieiRPBN", None, 7),
  
               XByteField("lengthRPBN", None),
  
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("numberingPlan", 0x0, 4),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                         lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("presId", None, 2),
                                         lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("spare", None, 3),
                                         lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("screenId", None, 2),
                                         lambda pkt: pkt.ext == 0),
  
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
  
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
  
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
  
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
  
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
  
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4),
  
               BitField("nbDigit22", None, 4),
               BitField("nbDigit21", None, 4),
  
               BitField("nbDigit24", None, 4),
               BitField("nbDigit23", None, 4),
  
               BitField("nbDigit26", None, 4),
               BitField("nbDigit25", None, 4),
  
               BitField("nbDigit28", None, 4),
               BitField("nbDigit27", None, 4),
  
               BitField("nbDigit30", None, 4),
               BitField("nbDigit29", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 19, a, self.fields_desc)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthRPBN is None:
              p = p[:1] + struct.pack(">B", len(p)-2) + p[2:]
          return p + pay
  
  
  # length 2 to 23
  class RedirectingPartySubaddressHdr(Packet):
      """Redirecting party subaddress  Section 10.5.4.21c"""
      name = "Redirecting Party BCD Number"
      fields_desc = [
               BitField("eightBitRPS", None, 1),
               XBitField("ieiRPS", None, 7),
  
               XByteField("lengthRPS", None),
               # optional
               BitField("ext", None, 1),
               BitField("typeSub", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 23, a, self.fields_desc)
          if self.lengthRPS is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class RepeatIndicatorHdr(Packet):
      """Repeat indicator Section 10.5.4.22"""
      name = "Repeat Indicator"
      fields_desc = [
               XBitField("ieiRI", None, 4),
               BitField("repeatIndic", 0x0, 4)
               ]
  
  
  class ReverseCallSetupDirectionHdr(Packet):
      """Reverse call setup direction Section 10.5.4.22a"""
      name = "Reverse Call Setup Direction"
      fields_desc = [
               ByteField("ieiRCSD", 0x0)
               ]
  
  
  # no upper length min 2(max for L3) (251)
  class SetupContainerHdr(Packet):
      """SETUP Container $(CCBS)$ Section 10.5.4.22b"""
      name = "Setup Container $(CCBS)$"
      fields_desc = [
               BitField("eightBitSC", None, 1),
               XBitField("ieiSC", None, 7),
               XByteField("lengthSC", None),
               # optional
               ByteField("mess1", None),
               ByteField("mess2", None),
               ByteField("mess3", None),
               ByteField("mess4", None),
               ByteField("mess5", None),
               ByteField("mess6", None),
               ByteField("mess7", None),
               ByteField("mess8", None),
               ByteField("mess9", None),
               ByteField("mess10", None),
               ByteField("mess11", None),
               ByteField("mess12", None),
               ByteField("mess13", None),
               ByteField("mess14", None),
               ByteField("mess15", None),
               ByteField("mess16", None),
               ByteField("mess17", None),
               ByteField("mess18", None),
               ByteField("mess19", None),
               ByteField("mess20", None),
               ByteField("mess21", None),
               ByteField("mess22", None),
               ByteField("mess23", None),
               ByteField("mess24", None),
               ByteField("mess25", None),
               ByteField("mess26", None),
               ByteField("mess27", None),
               ByteField("mess28", None),
               ByteField("mess29", None),
               ByteField("mess30", None),
               ByteField("mess31", None),
               ByteField("mess32", None),
               ByteField("mess33", None),
               ByteField("mess34", None),
               ByteField("mess35", None),
               ByteField("mess36", None),
               ByteField("mess37", None),
               ByteField("mess38", None),
               ByteField("mess39", None),
               ByteField("mess40", None),
               ByteField("mess41", None),
               ByteField("mess42", None),
               ByteField("mess43", None),
               ByteField("mess44", None),
               ByteField("mess45", None),
               ByteField("mess46", None),
               ByteField("mess47", None),
               ByteField("mess48", None),
               ByteField("mess49", None),
               ByteField("mess50", None),
               ByteField("mess51", None),
               ByteField("mess52", None),
               ByteField("mess53", None),
               ByteField("mess54", None),
               ByteField("mess55", None),
               ByteField("mess56", None),
               ByteField("mess57", None),
               ByteField("mess58", None),
               ByteField("mess59", None),
               ByteField("mess60", None),
               ByteField("mess61", None),
               ByteField("mess62", None),
               ByteField("mess63", None),
               ByteField("mess64", None),
               ByteField("mess65", None),
               ByteField("mess66", None),
               ByteField("mess67", None),
               ByteField("mess68", None),
               ByteField("mess69", None),
               ByteField("mess70", None),
               ByteField("mess71", None),
               ByteField("mess72", None),
               ByteField("mess73", None),
               ByteField("mess74", None),
               ByteField("mess75", None),
               ByteField("mess76", None),
               ByteField("mess77", None),
               ByteField("mess78", None),
               ByteField("mess79", None),
               ByteField("mess80", None),
               ByteField("mess81", None),
               ByteField("mess82", None),
               ByteField("mess83", None),
               ByteField("mess84", None),
               ByteField("mess85", None),
               ByteField("mess86", None),
               ByteField("mess87", None),
               ByteField("mess88", None),
               ByteField("mess89", None),
               ByteField("mess90", None),
               ByteField("mess91", None),
               ByteField("mess92", None),
               ByteField("mess93", None),
               ByteField("mess94", None),
               ByteField("mess95", None),
               ByteField("mess96", None),
               ByteField("mess97", None),
               ByteField("mess98", None),
               ByteField("mess99", None),
               ByteField("mess100", None),
               ByteField("mess101", None),
               ByteField("mess102", None),
               ByteField("mess103", None),
               ByteField("mess104", None),
               ByteField("mess105", None),
               ByteField("mess106", None),
               ByteField("mess107", None),
               ByteField("mess108", None),
               ByteField("mess109", None),
               ByteField("mess110", None),
               ByteField("mess111", None),
               ByteField("mess112", None),
               ByteField("mess113", None),
               ByteField("mess114", None),
               ByteField("mess115", None),
               ByteField("mess116", None),
               ByteField("mess117", None),
               ByteField("mess118", None),
               ByteField("mess119", None),
               ByteField("mess120", None),
               ByteField("mess121", None),
               ByteField("mess122", None),
               ByteField("mess123", None),
               ByteField("mess124", None),
               ByteField("mess125", None),
               ByteField("mess126", None),
               ByteField("mess127", None),
               ByteField("mess128", None),
               ByteField("mess129", None),
               ByteField("mess130", None),
               ByteField("mess131", None),
               ByteField("mess132", None),
               ByteField("mess133", None),
               ByteField("mess134", None),
               ByteField("mess135", None),
               ByteField("mess136", None),
               ByteField("mess137", None),
               ByteField("mess138", None),
               ByteField("mess139", None),
               ByteField("mess140", None),
               ByteField("mess141", None),
               ByteField("mess142", None),
               ByteField("mess143", None),
               ByteField("mess144", None),
               ByteField("mess145", None),
               ByteField("mess146", None),
               ByteField("mess147", None),
               ByteField("mess148", None),
               ByteField("mess149", None),
               ByteField("mess150", None),
               ByteField("mess151", None),
               ByteField("mess152", None),
               ByteField("mess153", None),
               ByteField("mess154", None),
               ByteField("mess155", None),
               ByteField("mess156", None),
               ByteField("mess157", None),
               ByteField("mess158", None),
               ByteField("mess159", None),
               ByteField("mess160", None),
               ByteField("mess161", None),
               ByteField("mess162", None),
               ByteField("mess163", None),
               ByteField("mess164", None),
               ByteField("mess165", None),
               ByteField("mess166", None),
               ByteField("mess167", None),
               ByteField("mess168", None),
               ByteField("mess169", None),
               ByteField("mess170", None),
               ByteField("mess171", None),
               ByteField("mess172", None),
               ByteField("mess173", None),
               ByteField("mess174", None),
               ByteField("mess175", None),
               ByteField("mess176", None),
               ByteField("mess177", None),
               ByteField("mess178", None),
               ByteField("mess179", None),
               ByteField("mess180", None),
               ByteField("mess181", None),
               ByteField("mess182", None),
               ByteField("mess183", None),
               ByteField("mess184", None),
               ByteField("mess185", None),
               ByteField("mess186", None),
               ByteField("mess187", None),
               ByteField("mess188", None),
               ByteField("mess189", None),
               ByteField("mess190", None),
               ByteField("mess191", None),
               ByteField("mess192", None),
               ByteField("mess193", None),
               ByteField("mess194", None),
               ByteField("mess195", None),
               ByteField("mess196", None),
               ByteField("mess197", None),
               ByteField("mess198", None),
               ByteField("mess199", None),
               ByteField("mess200", None),
               ByteField("mess201", None),
               ByteField("mess202", None),
               ByteField("mess203", None),
               ByteField("mess204", None),
               ByteField("mess205", None),
               ByteField("mess206", None),
               ByteField("mess207", None),
               ByteField("mess208", None),
               ByteField("mess209", None),
               ByteField("mess210", None),
               ByteField("mess211", None),
               ByteField("mess212", None),
               ByteField("mess213", None),
               ByteField("mess214", None),
               ByteField("mess215", None),
               ByteField("mess216", None),
               ByteField("mess217", None),
               ByteField("mess218", None),
               ByteField("mess219", None),
               ByteField("mess220", None),
               ByteField("mess221", None),
               ByteField("mess222", None),
               ByteField("mess223", None),
               ByteField("mess224", None),
               ByteField("mess225", None),
               ByteField("mess226", None),
               ByteField("mess227", None),
               ByteField("mess228", None),
               ByteField("mess229", None),
               ByteField("mess230", None),
               ByteField("mess231", None),
               ByteField("mess232", None),
               ByteField("mess233", None),
               ByteField("mess234", None),
               ByteField("mess235", None),
               ByteField("mess236", None),
               ByteField("mess237", None),
               ByteField("mess238", None),
               ByteField("mess239", None),
               ByteField("mess240", None),
               ByteField("mess241", None),
               ByteField("mess242", None),
               ByteField("mess243", None),
               ByteField("mess244", None),
               ByteField("mess245", None),
               ByteField("mess246", None),
               ByteField("mess247", None),
               ByteField("mess248", None),
               ByteField("mess249", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 251, a, self.fields_desc)
          if self.lengthSC is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class SignalHdr(Packet):
      """Signal Section 10.5.4.23"""
      name = "Signal"
      fields_desc = [
               BitField("eightBitS", None, 1),
               XBitField("ieiS", None, 7),
               ByteField("sigValue", 0x0)
               ]
  
  
  # length 2 to max for L3 message (251)
  class SsVersionIndicatorHdr(Packet):
      """SS Version Indicator  Section 10.5.4.24"""
      name = "SS Version Indicator"
      fields_desc = [
               BitField("eightBitSVI", None, 1),
               XBitField("ieiSVI", None, 7),
               XByteField("lengthSVI", None),
               # optional
               ByteField("info1", None),
               ByteField("info2", None),
               ByteField("info3", None),
               ByteField("info4", None),
               ByteField("info5", None),
               ByteField("info6", None),
               ByteField("info7", None),
               ByteField("info8", None),
               ByteField("info9", None),
               ByteField("info10", None),
               ByteField("info11", None),
               ByteField("info12", None),
               ByteField("info13", None),
               ByteField("info14", None),
               ByteField("info15", None),
               ByteField("info16", None),
               ByteField("info17", None),
               ByteField("info18", None),
               ByteField("info19", None),
               ByteField("info20", None),
               ByteField("info21", None),
               ByteField("info22", None),
               ByteField("info23", None),
               ByteField("info24", None),
               ByteField("info25", None),
               ByteField("info26", None),
               ByteField("info27", None),
               ByteField("info28", None),
               ByteField("info29", None),
               ByteField("info30", None),
               ByteField("info31", None),
               ByteField("info32", None),
               ByteField("info33", None),
               ByteField("info34", None),
               ByteField("info35", None),
               ByteField("info36", None),
               ByteField("info37", None),
               ByteField("info38", None),
               ByteField("info39", None),
               ByteField("info40", None),
               ByteField("info41", None),
               ByteField("info42", None),
               ByteField("info43", None),
               ByteField("info44", None),
               ByteField("info45", None),
               ByteField("info46", None),
               ByteField("info47", None),
               ByteField("info48", None),
               ByteField("info49", None),
               ByteField("info50", None),
               ByteField("info51", None),
               ByteField("info52", None),
               ByteField("info53", None),
               ByteField("info54", None),
               ByteField("info55", None),
               ByteField("info56", None),
               ByteField("info57", None),
               ByteField("info58", None),
               ByteField("info59", None),
               ByteField("info60", None),
               ByteField("info61", None),
               ByteField("info62", None),
               ByteField("info63", None),
               ByteField("info64", None),
               ByteField("info65", None),
               ByteField("info66", None),
               ByteField("info67", None),
               ByteField("info68", None),
               ByteField("info69", None),
               ByteField("info70", None),
               ByteField("info71", None),
               ByteField("info72", None),
               ByteField("info73", None),
               ByteField("info74", None),
               ByteField("info75", None),
               ByteField("info76", None),
               ByteField("info77", None),
               ByteField("info78", None),
               ByteField("info79", None),
               ByteField("info80", None),
               ByteField("info81", None),
               ByteField("info82", None),
               ByteField("info83", None),
               ByteField("info84", None),
               ByteField("info85", None),
               ByteField("info86", None),
               ByteField("info87", None),
               ByteField("info88", None),
               ByteField("info89", None),
               ByteField("info90", None),
               ByteField("info91", None),
               ByteField("info92", None),
               ByteField("info93", None),
               ByteField("info94", None),
               ByteField("info95", None),
               ByteField("info96", None),
               ByteField("info97", None),
               ByteField("info98", None),
               ByteField("info99", None),
               ByteField("info100", None),
               ByteField("info101", None),
               ByteField("info102", None),
               ByteField("info103", None),
               ByteField("info104", None),
               ByteField("info105", None),
               ByteField("info106", None),
               ByteField("info107", None),
               ByteField("info108", None),
               ByteField("info109", None),
               ByteField("info110", None),
               ByteField("info111", None),
               ByteField("info112", None),
               ByteField("info113", None),
               ByteField("info114", None),
               ByteField("info115", None),
               ByteField("info116", None),
               ByteField("info117", None),
               ByteField("info118", None),
               ByteField("info119", None),
               ByteField("info120", None),
               ByteField("info121", None),
               ByteField("info122", None),
               ByteField("info123", None),
               ByteField("info124", None),
               ByteField("info125", None),
               ByteField("info126", None),
               ByteField("info127", None),
               ByteField("info128", None),
               ByteField("info129", None),
               ByteField("info130", None),
               ByteField("info131", None),
               ByteField("info132", None),
               ByteField("info133", None),
               ByteField("info134", None),
               ByteField("info135", None),
               ByteField("info136", None),
               ByteField("info137", None),
               ByteField("info138", None),
               ByteField("info139", None),
               ByteField("info140", None),
               ByteField("info141", None),
               ByteField("info142", None),
               ByteField("info143", None),
               ByteField("info144", None),
               ByteField("info145", None),
               ByteField("info146", None),
               ByteField("info147", None),
               ByteField("info148", None),
               ByteField("info149", None),
               ByteField("info150", None),
               ByteField("info151", None),
               ByteField("info152", None),
               ByteField("info153", None),
               ByteField("info154", None),
               ByteField("info155", None),
               ByteField("info156", None),
               ByteField("info157", None),
               ByteField("info158", None),
               ByteField("info159", None),
               ByteField("info160", None),
               ByteField("info161", None),
               ByteField("info162", None),
               ByteField("info163", None),
               ByteField("info164", None),
               ByteField("info165", None),
               ByteField("info166", None),
               ByteField("info167", None),
               ByteField("info168", None),
               ByteField("info169", None),
               ByteField("info170", None),
               ByteField("info171", None),
               ByteField("info172", None),
               ByteField("info173", None),
               ByteField("info174", None),
               ByteField("info175", None),
               ByteField("info176", None),
               ByteField("info177", None),
               ByteField("info178", None),
               ByteField("info179", None),
               ByteField("info180", None),
               ByteField("info181", None),
               ByteField("info182", None),
               ByteField("info183", None),
               ByteField("info184", None),
               ByteField("info185", None),
               ByteField("info186", None),
               ByteField("info187", None),
               ByteField("info188", None),
               ByteField("info189", None),
               ByteField("info190", None),
               ByteField("info191", None),
               ByteField("info192", None),
               ByteField("info193", None),
               ByteField("info194", None),
               ByteField("info195", None),
               ByteField("info196", None),
               ByteField("info197", None),
               ByteField("info198", None),
               ByteField("info199", None),
               ByteField("info200", None),
               ByteField("info201", None),
               ByteField("info202", None),
               ByteField("info203", None),
               ByteField("info204", None),
               ByteField("info205", None),
               ByteField("info206", None),
               ByteField("info207", None),
               ByteField("info208", None),
               ByteField("info209", None),
               ByteField("info210", None),
               ByteField("info211", None),
               ByteField("info212", None),
               ByteField("info213", None),
               ByteField("info214", None),
               ByteField("info215", None),
               ByteField("info216", None),
               ByteField("info217", None),
               ByteField("info218", None),
               ByteField("info219", None),
               ByteField("info220", None),
               ByteField("info221", None),
               ByteField("info222", None),
               ByteField("info223", None),
               ByteField("info224", None),
               ByteField("info225", None),
               ByteField("info226", None),
               ByteField("info227", None),
               ByteField("info228", None),
               ByteField("info229", None),
               ByteField("info230", None),
               ByteField("info231", None),
               ByteField("info232", None),
               ByteField("info233", None),
               ByteField("info234", None),
               ByteField("info235", None),
               ByteField("info236", None),
               ByteField("info237", None),
               ByteField("info238", None),
               ByteField("info239", None),
               ByteField("info240", None),
               ByteField("info241", None),
               ByteField("info242", None),
               ByteField("info243", None),
               ByteField("info244", None),
               ByteField("info245", None),
               ByteField("info246", None),
               ByteField("info247", None),
               ByteField("info248", None),
               ByteField("info249", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 251, a, self.fields_desc)
          if self.lengthSVI is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # length 3 to 35 or 131
  class UserUserHdr(Packet):
      """User-user Section 10.5.4.25"""
      name = "User-User"
      fields_desc = [
               BitField("eightBitUU", None, 1),
               XBitField("ieiUU", None, 7),
  
               XByteField("lengthUU", None),  # dynamic length of field depending
                                             # of the type of message
                                             # let user decide which length he
                                             # wants to take
                                             # => more fuzzing options
               ByteField("userUserPD", 0x0),
               # optional
               ByteField("userUserInfo1", None),
               ByteField("userUserInfo2", None),
               ByteField("userUserInfo3", None),
               ByteField("userUserInfo4", None),
               ByteField("userUserInfo5", None),
               ByteField("userUserInfo6", None),
               ByteField("userUserInfo7", None),
               ByteField("userUserInfo8", None),
               ByteField("userUserInfo9", None),
               ByteField("userUserInfo10", None),
               ByteField("userUserInfo11", None),
               ByteField("userUserInfo12", None),
               ByteField("userUserInfo13", None),
               ByteField("userUserInfo14", None),
               ByteField("userUserInfo15", None),
               ByteField("userUserInfo16", None),
               ByteField("userUserInfo17", None),
               ByteField("userUserInfo18", None),
               ByteField("userUserInfo19", None),
               ByteField("userUserInfo20", None),
               ByteField("userUserInfo21", None),
               ByteField("userUserInfo22", None),
               ByteField("userUserInfo23", None),
               ByteField("userUserInfo24", None),
               ByteField("userUserInfo25", None),
               ByteField("userUserInfo26", None),
               ByteField("userUserInfo27", None),
               ByteField("userUserInfo28", None),
               ByteField("userUserInfo29", None),
               ByteField("userUserInfo30", None),
               ByteField("userUserInfo31", None),
               ByteField("userUserInfo32", None),
               # long  packet
               ByteField("userUserInfo33", None),
               ByteField("userUserInfo34", None),
               ByteField("userUserInfo35", None),
               ByteField("userUserInfo36", None),
               ByteField("userUserInfo37", None),
               ByteField("userUserInfo38", None),
               ByteField("userUserInfo39", None),
               ByteField("userUserInfo40", None),
               ByteField("userUserInfo41", None),
               ByteField("userUserInfo42", None),
               ByteField("userUserInfo43", None),
               ByteField("userUserInfo44", None),
               ByteField("userUserInfo45", None),
               ByteField("userUserInfo46", None),
               ByteField("userUserInfo47", None),
               ByteField("userUserInfo48", None),
               ByteField("userUserInfo49", None),
               ByteField("userUserInfo50", None),
               ByteField("userUserInfo51", None),
               ByteField("userUserInfo52", None),
               ByteField("userUserInfo53", None),
               ByteField("userUserInfo54", None),
               ByteField("userUserInfo55", None),
               ByteField("userUserInfo56", None),
               ByteField("userUserInfo57", None),
               ByteField("userUserInfo58", None),
               ByteField("userUserInfo59", None),
               ByteField("userUserInfo60", None),
               ByteField("userUserInfo61", None),
               ByteField("userUserInfo62", None),
               ByteField("userUserInfo63", None),
               ByteField("userUserInfo64", None),
               ByteField("userUserInfo65", None),
               ByteField("userUserInfo66", None),
               ByteField("userUserInfo67", None),
               ByteField("userUserInfo68", None),
               ByteField("userUserInfo69", None),
               ByteField("userUserInfo70", None),
               ByteField("userUserInfo71", None),
               ByteField("userUserInfo72", None),
               ByteField("userUserInfo73", None),
               ByteField("userUserInfo74", None),
               ByteField("userUserInfo75", None),
               ByteField("userUserInfo76", None),
               ByteField("userUserInfo77", None),
               ByteField("userUserInfo78", None),
               ByteField("userUserInfo79", None),
               ByteField("userUserInfo80", None),
               ByteField("userUserInfo81", None),
               ByteField("userUserInfo82", None),
               ByteField("userUserInfo83", None),
               ByteField("userUserInfo84", None),
               ByteField("userUserInfo85", None),
               ByteField("userUserInfo86", None),
               ByteField("userUserInfo87", None),
               ByteField("userUserInfo88", None),
               ByteField("userUserInfo89", None),
               ByteField("userUserInfo90", None),
               ByteField("userUserInfo91", None),
               ByteField("userUserInfo92", None),
               ByteField("userUserInfo93", None),
               ByteField("userUserInfo94", None),
               ByteField("userUserInfo95", None),
               ByteField("userUserInfo96", None),
               ByteField("userUserInfo97", None),
               ByteField("userUserInfo98", None),
               ByteField("userUserInfo99", None),
               ByteField("userUserInfo100", None),
               ByteField("userUserInfo101", None),
               ByteField("userUserInfo102", None),
               ByteField("userUserInfo103", None),
               ByteField("userUserInfo104", None),
               ByteField("userUserInfo105", None),
               ByteField("userUserInfo106", None),
               ByteField("userUserInfo107", None),
               ByteField("userUserInfo108", None),
               ByteField("userUserInfo109", None),
               ByteField("userUserInfo110", None),
               ByteField("userUserInfo111", None),
               ByteField("userUserInfo112", None),
               ByteField("userUserInfo113", None),
               ByteField("userUserInfo114", None),
               ByteField("userUserInfo115", None),
               ByteField("userUserInfo116", None),
               ByteField("userUserInfo117", None),
               ByteField("userUserInfo118", None),
               ByteField("userUserInfo119", None),
               ByteField("userUserInfo120", None),
               ByteField("userUserInfo121", None),
               ByteField("userUserInfo122", None),
               ByteField("userUserInfo123", None),
               ByteField("userUserInfo124", None),
               ByteField("userUserInfo125", None),
               ByteField("userUserInfo126", None),
               ByteField("userUserInfo127", None),
               ByteField("userUserInfo128", None),
               ByteField("userUserInfo129", None),
               ByteField("userUserInfo130", None),
               ByteField("userUserInfo131", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 131, a, self.fields_desc)
          if self.lengthUU is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class AlertingPatternHdr(Packet):
      """Alerting Pattern 10.5.4.26"""
      name = "Alerting Pattern"
      fields_desc = [
               BitField("eightBitAP", None, 1),
               XBitField("ieiAP", None, 7),
               XByteField("lengthAP", 0x3),
               BitField("spare", 0x0, 4),
               BitField("alertingValue", 0x0, 4)
               ]
  
  
  class AllowedActionsHdr(Packet):
      """Allowed actions $(CCBS)$ Section 10.5.4.26"""
      name = "Allowed Actions $(CCBS)$"
      fields_desc = [
               BitField("eightBitAA", None, 1),
               XBitField("ieiAA", None, 7),
               XByteField("lengthAP", 0x3),
               BitField("CCBS", 0x0, 1),
               BitField("spare", 0x0, 7)
               ]
  
  
  #
  # 10.5.5 GPRS mobility management information elements
  #
  
  class AttachResult(Packet):
      """Attach result Section 10.5.5.1"""
      name = "Attach Result"
      fields_desc = [
               XBitField("ieiAR", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("result", 0x1, 3)
               ]
  
  
  class AttachTypeHdr(Packet):
      """Attach type Section 10.5.5.2"""
      name = "Attach Type"
      fields_desc = [
               XBitField("ieiAT", None, 4),
               BitField("spare", 0x0, 1),
               BitField("type", 0x1, 3)
               ]
  
  
  # Fix 1/2 len problem
  class AttachTypeAndCiphKeySeqNr(Packet):
      name = "Attach Type and Cipher Key Sequence Number"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("type", 0x1, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class CipheringAlgorithm(Packet):
      """Ciphering algorithm Section 10.5.5.3"""
      name = "Ciphering Algorithm"
      fields_desc = [
               XBitField("ieiCA", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("type", 0x1, 3)
               ]
  
  
  # Fix 1/2 len problem
  class CipheringAlgorithmAndImeisvRequest(Packet):
      name = "Ciphering Algorithm and Imeisv Request"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("type", 0x1, 3),
               BitField("spare", 0x0, 1),
               BitField("imeisvVal", 0x0, 3)
               ]
  
  
  # [Spare]
  class TmsiStatus(Packet):
      """[Spare] TMSI status Section 10.5.5.4"""
      name = "[Spare] TMSI Status"
      fields_desc = [
               XBitField("ieiTS", None, 4),
               BitField("spare", 0x0, 3),
               BitField("flag", 0x1, 1)
               ]
  
  
  class DetachType(Packet):
      """Detach type Section 10.5.5.5"""
      name = "Detach Type"
      fields_desc = [
               XBitField("ieiDT", 0x0, 4),
               BitField("poweroff", 0x0, 1),
               BitField("type", 0x1, 3)
               ]
  
  
  # Fix 1/2 len problem
  class DetachTypeAndForceToStandby(Packet):
      name = "Detach Type and Force To Standby"
      fields_desc = [
               BitField("poweroff", 0x0, 1),
               BitField("type", 0x1, 3),
               BitField("spare", 0x0, 1),
               BitField("forceStandby", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class DetachTypeAndSpareHalfOctets(Packet):
      name = "Detach Type and Spare Half Octets"
      fields_desc = [
               BitField("poweroff", 0x0, 1),
               BitField("type", 0x1, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class DrxParameter(Packet):
      """DRX parameter Section 10.5.5.6"""
      name = "DRX Parameter"
      fields_desc = [
               ByteField("ieiDP", 0x0),
               ByteField("splitPG", 0x0),
               BitField("spare", 0x0, 4),
               BitField("splitCCCH", 0x0, 1),
               BitField("NonDrxTimer", 0x1, 3)
               ]
  
  
  class ForceToStandby(Packet):
      """Force to standby Section 10.5.5.7"""
      name = "Force To Standby"
      fields_desc = [
               XBitField("ieiFTS", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("forceStandby", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class ForceToStandbyAndAcReferenceNumber(Packet):
      name = "Force To Standby And Ac Reference Number"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("forceStandby", 0x0, 3),
               BitField("acRefVal", 0x0, 4)
               ]
  
  
  # Fix 1/2 len problem
  class ForceToStandbyAndUpdateResult(Packet):
      name = "Force To Standby And Update Result"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("forceStandby", 0x0, 3),
               BitField("spare", 0x0, 1),
               BitField("updateResVal", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class ForceToStandbyAndSpareHalfOctets(Packet):
      name = "Force To Standby And Spare Half Octets"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("forceStandby", 0x0, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class PTmsiSignature(Packet):
      """P-TMSI signature Section 10.5.5.8"""
      name = "P-TMSI Signature"
      fields_desc = [
               ByteField("ieiPTS", 0x0),
               BitField("signature", 0x0, 24)
               ]
  
  
  class IdentityType2(Packet):
      """Identity type 2 Section 10.5.5.9"""
      name = "Identity Type 2"
      fields_desc = [
               XBitField("ieiIT2", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("typeOfIdentity", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class IdentityType2AndforceToStandby(Packet):
      name = "Identity Type 2 and Force to Standby"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("typeOfIdentity", 0x0, 3),
               BitField("spare", 0x0, 1),
               BitField("forceStandby", 0x0, 3)
               ]
  
  
  class ImeisvRequest(Packet):
      """IMEISV request Section 10.5.5.10"""
      name = "IMEISV Request"
      fields_desc = [
               XBitField("ieiIR", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("imeisvVal", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class ImeisvRequestAndForceToStandby(Packet):
      name = "IMEISV Request and Force To Standby"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("imeisvVal", 0x0, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  # length 4 to 19
  class ReceiveNpduNumbersList(Packet):
      """Receive N-PDU Numbers list Section 10.5.5.11"""
      name = "Receive N-PDU Numbers list"
      fields_desc = [
               ByteField("ieiRNNL", 0x0),
  
               XByteField("lengthRNNL", None),
  
               BitField("nbList0", 0x0, 16),
               # optional
               ByteField("nbList1", None),
               ByteField("nbList2", None),
               ByteField("nbList3", None),
               ByteField("nbList4", None),
               ByteField("nbList5", None),
               ByteField("nbList6", None),
               ByteField("nbList7", None),
               ByteField("nbList8", None),
               ByteField("nbList9", None),
               ByteField("nbList10", None),
               ByteField("nbList11", None),
               ByteField("nbList12", None),
               ByteField("nbList13", None),
               ByteField("nbList14", None),
               ByteField("nbList15", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 19, a, self.fields_desc)
          if self.lengthRNNL is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MsNetworkCapability(Packet):
      """MS network capability Section 10.5.5.12"""
      name = "MS Network Capability"
      fields_desc = [
               ByteField("ieiMNC", 0x0),
               XByteField("lengthMNC", 0x3),
               ByteField("msNetValue", 0x0)
               ]
  
  
  # length 6 to 14
  class MsRadioAccessCapability(Packet):
      """MS Radio Access capability Section 10.5.5.12a"""
      name = "MS Radio Access Capability"
      fields_desc = [
               ByteField("ieiMRAC", 0x24),
  
               XByteField("lengthMRAC", None),
  
               BitField("spare1", 0x0, 1),  # ...
  
               BitField("accessCap", 0x0, 4),
               BitField("accessTechType", 0x0, 4),
               # access capability
               BitField("bool", 0x0, 1),
               BitField("lengthContent", 0x0, 7),
               BitField("spare1", 0x0, 1),  # ...
               # content
               BitField("pwrCap", 0x0, 3),
               BitField("bool1", 0x0, 1),
               BitField("a51", 0x0, 1),
               BitField("a52", 0x0, 1),
               BitField("a53", 0x0, 1),
               BitField("a54", 0x0, 1),
  
               BitField("a55", 0x0, 1),
               BitField("a56", 0x0, 1),
               BitField("a57", 0x0, 1),
               BitField("esInd", 0x0, 1),
               BitField("ps", 0x0, 1),
               BitField("vgcs", 0x0, 1),
               BitField("vbs", 0x0, 1),
               BitField("bool2", 0x0, 1),
               # multislot
               BitField("bool3", 0x0, 1),
               BitField("hscsd", 0x0, 5),
  
               BitField("bool4", 0x0, 1),
               BitField("gprs", 0x0, 5),
               BitField("gprsExt", 0x0, 1),
               BitField("bool5", 0x0, 1),
  
               BitField("smsVal", 0x0, 4),
               BitField("smVal", 0x0, 4)
               ]
  
  
  # 10.5.5.13 Spare
  # This is intentionally left spare.
  
  class GmmCause(Packet):
      """GMM cause Section 10.5.5.14"""
      name = "GMM Cause"
      fields_desc = [
               ByteField("ieiGC", 0x0),
               ByteField("causeValue", 0x0)
               ]
  
  
  class RoutingAreaIdentification(Packet):
      """Routing area identification Section 10.5.5.15"""
      name = "Routing Area Identification"
      fields_desc = [
               ByteField("ieiRAI", 0x0),
               BitField("mccDigit2", 0x0, 4),
               BitField("mccDigit1", 0x0, 4),
               BitField("mncDigit3", 0x0, 4),
               BitField("mccDigit3", 0x0, 4),
               BitField("mccDigit2", 0x0, 4),
               BitField("mccDigit1", 0x0, 4),
               ByteField("LAC", 0x0),
               ByteField("LAC1", 0x0),
               ByteField("LAC", 0x0)
               ]
  # 10.5.5.16 Spare
  # This is intentionally left spare.
  
  
  class UpdateResult(Packet):
      """Update result Section 10.5.5.17"""
      name = "Update Result"
      fields_desc = [
               XBitField("ieiUR", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("updateResVal", 0x0, 3)
               ]
  
  
  class UpdateType(Packet):
      """Update type Section 10.5.5.18"""
      name = "Update Type"
      fields_desc = [
               XBitField("ieiUT", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("updateTypeVal", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class UpdateTypeAndCiphKeySeqNr(Packet):
      name = "Update Type and Cipher Key Sequence Number"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("updateTypeVal", 0x0, 3),
               BitField("spare", 0x0, 1),
               BitField("keySeq", 0x0, 3)
               ]
  
  
  class AcReferenceNumber(Packet):
      """A&C reference number Section 10.5.5.19"""
      name = "A&C Reference Number"
      fields_desc = [
               XBitField("ieiARN", 0x0, 4),
               BitField("acRefVal", 0x0, 4)
               ]
  
  
  # Fix 1/2 len problem
  class AcReferenceNumberAndSpareHalfOctets(Packet):
      name = "A&C Reference Number and Spare Half Octets"
      fields_desc = [
               BitField("acRefVal", 0x0, 4),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  #
  # 10.5.6 Session management information elements
  #
  # length 3 to 102
  
  
  class AccessPointName(Packet):
      """Access Point Name Section 10.5.6.1"""
      name = "Access Point Name"
      fields_desc = [
               ByteField("ieiAPN", 0x0),
               XByteField("lengthAPN", None),
               ByteField("apName", 0x0),
               # optional
               ByteField("apName1", None),
               ByteField("apName2", None),
               ByteField("apName3", None),
               ByteField("apName4", None),
               ByteField("apName5", None),
               ByteField("apName6", None),
               ByteField("apName7", None),
               ByteField("apName8", None),
               ByteField("apName9", None),
               ByteField("apName10", None),
               ByteField("apName11", None),
               ByteField("apName12", None),
               ByteField("apName13", None),
               ByteField("apName14", None),
               ByteField("apName15", None),
               ByteField("apName16", None),
               ByteField("apName17", None),
               ByteField("apName18", None),
               ByteField("apName19", None),
               ByteField("apName20", None),
               ByteField("apName21", None),
               ByteField("apName22", None),
               ByteField("apName23", None),
               ByteField("apName24", None),
               ByteField("apName25", None),
               ByteField("apName26", None),
               ByteField("apName27", None),
               ByteField("apName28", None),
               ByteField("apName29", None),
               ByteField("apName30", None),
               ByteField("apName31", None),
               ByteField("apName32", None),
               ByteField("apName33", None),
               ByteField("apName34", None),
               ByteField("apName35", None),
               ByteField("apName36", None),
               ByteField("apName37", None),
               ByteField("apName38", None),
               ByteField("apName39", None),
               ByteField("apName40", None),
               ByteField("apName41", None),
               ByteField("apName42", None),
               ByteField("apName43", None),
               ByteField("apName44", None),
               ByteField("apName45", None),
               ByteField("apName46", None),
               ByteField("apName47", None),
               ByteField("apName48", None),
               ByteField("apName49", None),
               ByteField("apName50", None),
               ByteField("apName51", None),
               ByteField("apName52", None),
               ByteField("apName53", None),
               ByteField("apName54", None),
               ByteField("apName55", None),
               ByteField("apName56", None),
               ByteField("apName57", None),
               ByteField("apName58", None),
               ByteField("apName59", None),
               ByteField("apName60", None),
               ByteField("apName61", None),
               ByteField("apName62", None),
               ByteField("apName63", None),
               ByteField("apName64", None),
               ByteField("apName65", None),
               ByteField("apName66", None),
               ByteField("apName67", None),
               ByteField("apName68", None),
               ByteField("apName69", None),
               ByteField("apName70", None),
               ByteField("apName71", None),
               ByteField("apName72", None),
               ByteField("apName73", None),
               ByteField("apName74", None),
               ByteField("apName75", None),
               ByteField("apName76", None),
               ByteField("apName77", None),
               ByteField("apName78", None),
               ByteField("apName79", None),
               ByteField("apName80", None),
               ByteField("apName81", None),
               ByteField("apName82", None),
               ByteField("apName83", None),
               ByteField("apName84", None),
               ByteField("apName85", None),
               ByteField("apName86", None),
               ByteField("apName87", None),
               ByteField("apName88", None),
               ByteField("apName89", None),
               ByteField("apName90", None),
               ByteField("apName91", None),
               ByteField("apName92", None),
               ByteField("apName93", None),
               ByteField("apName94", None),
               ByteField("apName95", None),
               ByteField("apName96", None),
               ByteField("apName97", None),
               ByteField("apName98", None),
               ByteField("apName99", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 102, a, self.fields_desc)
          if self.lengthAPN is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class NetworkServiceAccessPointIdentifier(Packet):
      """Network service access point identifier Section 10.5.6.2"""
      name = "Network Service Access Point Identifier"
      fields_desc = [
               ByteField("ieiNSAPI", 0x0),
               BitField("spare", 0x0, 4),
               BitField("nsapiVal", 0x0, 4)
               ]
  
  
  # length 2 to 253
  class ProtocolConfigurationOptions(Packet):
      """Protocol configuration options Section 10.5.6.3"""
      name = "Protocol Configuration Options"
      fields_desc = [
               ByteField("ieiPCO", 0x0),
  
               XByteField("lengthPCO", None),
               # optional
               BitField("ext", None, 1),
               BitField("spare", None, 4),
               BitField("configProto", None, 3),
  
               ByteField("protoId1", None),
               ByteField("lenProto1", None),
               ByteField("proto1Content", None),
  
               ByteField("protoId2", None),
               ByteField("lenProto2", None),
               ByteField("proto2Content", None),
  
               ByteField("protoId3", None),
               ByteField("lenProto3", None),
               ByteField("proto3Content", None),
  
               ByteField("protoId4", None),
               ByteField("lenProto4", None),
               ByteField("proto4Content", None),
  
  
               ByteField("protoId5", None),
               ByteField("lenProto5", None),
               ByteField("proto5Content", None),
  
               ByteField("protoId6", None),
               ByteField("lenProto6", None),
               ByteField("proto6Content", None),
  
               ByteField("protoId7", None),
               ByteField("lenProto7", None),
               ByteField("proto7Content", None),
  
               ByteField("protoId8", None),
               ByteField("lenProto8", None),
               ByteField("proto8Content", None),
  
               ByteField("protoId9", None),
               ByteField("lenProto9", None),
               ByteField("proto9Content", None),
  
               ByteField("protoId10", None),
               ByteField("lenProto10", None),
               ByteField("proto10Content", None),
  
               ByteField("protoId11", None),
               ByteField("lenProto11", None),
               ByteField("proto11Content", None),
  
               ByteField("protoId12", None),
               ByteField("lenProto12", None),
               ByteField("proto12Content", None),
  
               ByteField("protoId13", None),
               ByteField("lenProto13", None),
               ByteField("proto13Content", None),
  
               ByteField("protoId14", None),
               ByteField("lenProto14", None),
               ByteField("proto14Content", None),
  
               ByteField("protoId15", None),
               ByteField("lenProto15", None),
               ByteField("proto15Content", None),
  
               ByteField("protoId16", None),
               ByteField("lenProto16", None),
               ByteField("proto16Content", None),
  
               ByteField("protoId17", None),
               ByteField("lenProto17", None),
               ByteField("proto17Content", None),
  
               ByteField("protoId18", None),
               ByteField("lenProto18", None),
               ByteField("proto18Content", None),
  
               ByteField("protoId19", None),
               ByteField("lenProto19", None),
               ByteField("proto19Content", None),
  
               ByteField("protoId20", None),
               ByteField("lenProto20", None),
               ByteField("proto20Content", None),
  
               ByteField("protoId21", None),
               ByteField("lenProto21", None),
               ByteField("proto21Content", None),
  
               ByteField("protoId22", None),
               ByteField("lenProto22", None),
               ByteField("proto22Content", None),
  
               ByteField("protoId23", None),
               ByteField("lenProto23", None),
               ByteField("proto23Content", None),
  
               ByteField("protoId24", None),
               ByteField("lenProto24", None),
               ByteField("proto24Content", None),
  
               ByteField("protoId25", None),
               ByteField("lenProto25", None),
               ByteField("proto25Content", None),
  
               ByteField("protoId26", None),
               ByteField("lenProto26", None),
               ByteField("proto26Content", None),
  
               ByteField("protoId27", None),
               ByteField("lenProto27", None),
               ByteField("proto27Content", None),
  
               ByteField("protoId28", None),
               ByteField("lenProto28", None),
               ByteField("proto28Content", None),
  
               ByteField("protoId29", None),
               ByteField("lenProto29", None),
               ByteField("proto29Content", None),
  
               ByteField("protoId30", None),
               ByteField("lenProto30", None),
               ByteField("proto30Content", None),
  
               ByteField("protoId31", None),
               ByteField("lenProto31", None),
               ByteField("proto31Content", None),
  
               ByteField("protoId32", None),
               ByteField("lenProto32", None),
               ByteField("proto32Content", None),
  
               ByteField("protoId33", None),
               ByteField("lenProto33", None),
               ByteField("proto33Content", None),
  
               ByteField("protoId34", None),
               ByteField("lenProto34", None),
               ByteField("proto34Content", None),
  
               ByteField("protoId35", None),
               ByteField("lenProto35", None),
               ByteField("proto35Content", None),
  
               ByteField("protoId36", None),
               ByteField("lenProto36", None),
               ByteField("proto36Content", None),
  
               ByteField("protoId37", None),
               ByteField("lenProto37", None),
               ByteField("proto37Content", None),
  
               ByteField("protoId38", None),
               ByteField("lenProto38", None),
               ByteField("proto38Content", None),
  
               ByteField("protoId39", None),
               ByteField("lenProto39", None),
               ByteField("proto39Content", None),
  
               ByteField("protoId40", None),
               ByteField("lenProto40", None),
               ByteField("proto40Content", None),
  
               ByteField("protoId41", None),
               ByteField("lenProto41", None),
               ByteField("proto41Content", None),
  
               ByteField("protoId42", None),
               ByteField("lenProto42", None),
               ByteField("proto42Content", None),
  
               ByteField("protoId43", None),
               ByteField("lenProto43", None),
               ByteField("proto43Content", None),
  
               ByteField("protoId44", None),
               ByteField("lenProto44", None),
               ByteField("proto44Content", None),
  
               ByteField("protoId45", None),
               ByteField("lenProto45", None),
               ByteField("proto45Content", None),
  
               ByteField("protoId46", None),
               ByteField("lenProto46", None),
               ByteField("proto46Content", None),
  
               ByteField("protoId47", None),
               ByteField("lenProto47", None),
               ByteField("proto47Content", None),
  
               ByteField("protoId48", None),
               ByteField("lenProto48", None),
               ByteField("proto48Content", None),
  
               ByteField("protoId49", None),
               ByteField("lenProto49", None),
               ByteField("proto49Content", None),
  
               ByteField("protoId50", None),
               ByteField("lenProto50", None),
               ByteField("proto50Content", None),
  
               ByteField("protoId51", None),
               ByteField("lenProto51", None),
               ByteField("proto51Content", None),
  
               ByteField("protoId52", None),
               ByteField("lenProto52", None),
               ByteField("proto52Content", None),
  
               ByteField("protoId53", None),
               ByteField("lenProto53", None),
               ByteField("proto53Content", None),
  
               ByteField("protoId54", None),
               ByteField("lenProto54", None),
               ByteField("proto54Content", None),
  
               ByteField("protoId55", None),
               ByteField("lenProto55", None),
               ByteField("proto55Content", None),
  
               ByteField("protoId56", None),
               ByteField("lenProto56", None),
               ByteField("proto56Content", None),
  
               ByteField("protoId57", None),
               ByteField("lenProto57", None),
               ByteField("proto57Content", None),
  
               ByteField("protoId58", None),
               ByteField("lenProto58", None),
               ByteField("proto58Content", None),
  
               ByteField("protoId59", None),
               ByteField("lenProto59", None),
               ByteField("proto59Content", None),
  
               ByteField("protoId60", None),
               ByteField("lenProto60", None),
               ByteField("proto60Content", None),
  
               ByteField("protoId61", None),
               ByteField("lenProto61", None),
               ByteField("proto61Content", None),
  
               ByteField("protoId62", None),
               ByteField("lenProto62", None),
               ByteField("proto62Content", None),
  
               ByteField("protoId63", None),
               ByteField("lenProto63", None),
               ByteField("proto63Content", None),
  
               ByteField("protoId64", None),
               ByteField("lenProto64", None),
               ByteField("proto64Content", None),
  
               ByteField("protoId65", None),
               ByteField("lenProto65", None),
               ByteField("proto65Content", None),
  
               ByteField("protoId66", None),
               ByteField("lenProto66", None),
               ByteField("proto66Content", None),
  
               ByteField("protoId67", None),
               ByteField("lenProto67", None),
               ByteField("proto67Content", None),
  
               ByteField("protoId68", None),
               ByteField("lenProto68", None),
               ByteField("proto68Content", None),
  
               ByteField("protoId69", None),
               ByteField("lenProto69", None),
               ByteField("proto69Content", None),
  
               ByteField("protoId70", None),
               ByteField("lenProto70", None),
               ByteField("proto70Content", None),
  
               ByteField("protoId71", None),
               ByteField("lenProto71", None),
               ByteField("proto71Content", None),
  
               ByteField("protoId72", None),
               ByteField("lenProto72", None),
               ByteField("proto72Content", None),
  
               ByteField("protoId73", None),
               ByteField("lenProto73", None),
               ByteField("proto73Content", None),
  
               ByteField("protoId74", None),
               ByteField("lenProto74", None),
               ByteField("proto74Content", None),
  
               ByteField("protoId75", None),
               ByteField("lenProto75", None),
               ByteField("proto75Content", None),
  
               ByteField("protoId76", None),
               ByteField("lenProto76", None),
               ByteField("proto76Content", None),
  
               ByteField("protoId77", None),
               ByteField("lenProto77", None),
               ByteField("proto77Content", None),
  
               ByteField("protoId78", None),
               ByteField("lenProto78", None),
               ByteField("proto78Content", None),
  
               ByteField("protoId79", None),
               ByteField("lenProto79", None),
               ByteField("proto79Content", None),
  
               ByteField("protoId80", None),
               ByteField("lenProto80", None),
               ByteField("proto80Content", None),
  
               ByteField("protoId81", None),
               ByteField("lenProto81", None),
               ByteField("proto81Content", None),
  
               ByteField("protoId82", None),
               ByteField("lenProto82", None),
               ByteField("proto82Content", None),
  
               ByteField("protoId83", None),
               ByteField("lenProto83", None),
               ByteField("proto83Content", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 253, a, self.fields_desc)
          if self.lengthPCO is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 4 to 20
  class PacketDataProtocolAddress(Packet):
      """Packet data protocol address Section 10.5.6.4"""
      name = "Packet Data Protocol Address"
      fields_desc = [
               ByteField("ieiPDPA", 0x0),
  
               XByteField("lengthPDPA", None),
  
               BitField("spare", 0x0, 4),
               BitField("pdpTypeOrga", 0x0, 4),
  
               ByteField("pdpTypeNb", 0x0),
               # optional
               ByteField("addressInfo1", None),
               ByteField("addressInfo2", None),
               ByteField("addressInfo3", None),
               ByteField("addressInfo4", None),
               ByteField("addressInfo5", None),
               ByteField("addressInfo6", None),
               ByteField("addressInfo7", None),
               ByteField("addressInfo8", None),
               ByteField("addressInfo9", None),
               ByteField("addressInfo10", None),
               ByteField("addressInfo11", None),
               ByteField("addressInfo12", None),
               ByteField("addressInfo13", None),
               ByteField("addressInfo14", None),
               ByteField("addressInfo15", None),
               ByteField("addressInfo16", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 20, a, self.fields_desc)
          if self.lengthPDPA is None:
              p = p[:1] + struct.pack(">B", res[1]) + p[2:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class QualityOfService(Packet):
      """Quality of service Section 10.5.6.5"""
      name = "Quality of Service"
      fields_desc = [
               ByteField("ieiQOS", 0x0),
               XByteField("lengthQOS", 0x5),
  
               BitField("spare", 0x0, 2),
               BitField("delayClass", 0x0, 3),
               BitField("reliaClass", 0x0, 3),
  
               BitField("peak", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("precedenceCl", 0x0, 3),
  
               BitField("spare", 0x0, 3),
               BitField("mean", 0x0, 5)
               ]
  
  
  class SmCause(Packet):
      """SM cause Section 10.5.6.6"""
      name = "SM Cause"
      fields_desc = [
               ByteField("ieiSC", 0x0),
               ByteField("causeVal", 0x0)
               ]
  
  # 10.5.6.7 Spare
  # This is intentionally left spare.
  
  
  class AaDeactivationCause(Packet):
      """AA deactivation cause Section 10.5.6.8"""
      name = "AA Deactivation Cause"
      fields_desc = [
               XBitField("ieiADC", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("aaVal", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class AaDeactivationCauseAndSpareHalfOctets(Packet):
      name = "AA Deactivation Cause and Spare Half Octets"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("aaVal", 0x0, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class LlcServiceAccessPointIdentifier(Packet):
      """LLC service access point identifier Section 10.5.6.9"""
      name = "LLC Service Access Point Identifier"
      fields_desc = [
               ByteField("ieiLSAPI", None),
               BitField("spare", 0x0, 4),
               BitField("llcVal", 0x0, 4)
               ]
  
  
  #
  # 10.5.7 GPRS Common information elements
  #
  
  # 10.5.7.1 [Spare]
  
  class RadioPriority(Packet):
      """Radio priority Section 10.5.7.2"""
      name = "Radio Priority"
      fields_desc = [
               XBitField("ieiRP", 0x0, 4),
               BitField("spare", 0x1, 1),
               BitField("rplv", 0x0, 3)
               ]
  
  
  # Fix 1/2 len problem
  class RadioPriorityAndSpareHalfOctets(Packet):
      name = "Radio Priority and Spare Half Octets"
      fields_desc = [
               BitField("spare", 0x1, 1),
               BitField("rplv", 0x0, 3),
               BitField("spareHalfOctets", 0x0, 4)
               ]
  
  
  class GprsTimer(Packet):
      """GPRS Timer Section 10.5.7.3"""
      name = "GPRS Timer"
      fields_desc = [
               ByteField("ieiGT", 0x0),
               BitField("unit", 0x0, 3),
               BitField("timerVal", 0x0, 5)
               ]
  
  
  class CellIdentity(Packet):
      """ Cell identity Section 10.5.1.1 """
      name = "Cell Identity"
      fields_desc = [
               ByteField("ciValue1", 0x0),
               ByteField("ciValue2", 0x0)
               ]
  
  
  class CiphKeySeqNr(Packet):
      """ Ciphering Key Sequence Number Section 10.5.1.2 """
      name = "Cipher Key Sequence Number"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("keySeq", 0x0, 3)
               ]
  
  
  class LocalAreaId(Packet):
      """ Local Area Identification Section 10.5.1.3 """
      name = "Location Area Identification"
      fields_desc = [
               BitField("mccDigit2", 0x0, 4),
               BitField("mccDigit1", 0x0, 4),
               BitField("mncDigit3", 0x0, 4),
               BitField("mccDigit3", 0x0, 4),
               BitField("mncDigit2", 0x0, 4),
               BitField("mncDigit1", 0x0, 4),
               ByteField("lac1", 0x0),
               ByteField("lac2", 0x0)
               ]
  #
  # The Mobile Identity is a type 4 information element with a minimum
  # length of 3 octet and 11 octets length maximal.
  #
  
  
  # len 3 - 11
  class MobileId(Packet):
      """ Mobile Identity  Section 10.5.1.4 """
      name = "Mobile Identity"
      fields_desc = [
               XByteField("lengthMI", None),
               BitField("idDigit1", 0x0, 4),
               BitField("oddEven", 0x0, 1),
               BitField("typeOfId", 0x0, 3),
  
               BitField("idDigit2_1", None, 4),  # optional
               BitField("idDigit2", None, 4),
               BitField("idDigit3_1", None, 4),
               BitField("idDigit3", None, 4),
               BitField("idDigit4_1", None, 4),
               BitField("idDigit4", None, 4),
               BitField("idDigit5_1", None, 4),
               BitField("idDigit5", None, 4),
               BitField("idDigit6_1", None, 4),
               BitField("idDigit6", None, 4),
               BitField("idDigit7_1", None, 4),
               BitField("idDigit7", None, 4),
               BitField("idDigit8_1", None, 4),
               BitField("idDigit8", None, 4),
               BitField("idDigit9_1", None, 4),
               BitField("idDigit9", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 10, a, self.fields_desc, 1)
          if self.lengthMI is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MobileStationClassmark1(Packet):
      """ Mobile Station Classmark 1 Section 10.5.1.5 """
      name = "Mobile Station Classmark 1"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("revisionLvl", 0x0, 2),
               BitField("esInd", 0x0, 1),
               BitField("a51", 0x0, 1),
               BitField("rfPowerCap", 0x0, 3)
               ]
  
  
  class MobileStationClassmark2(Packet):
      """ Mobile Station Classmark 2 Section 10.5.1.6 """
      name = "Mobile Station Classmark 2"
      fields_desc = [
               XByteField("lengthMSC2", 0x3),
               BitField("spare", 0x0, 1),
               BitField("revisionLvl", 0x0, 2),
               BitField("esInd", 0x0, 1),
               BitField("a51", 0x0, 1),
               BitField("rfPowerCap", 0x0, 3),
               BitField("spare1", 0x0, 1),
               BitField("psCap", 0x0, 1),
               BitField("ssScreenInd", 0x0, 2),
               BitField("smCaPabi", 0x0, 1),
               BitField("vbs", 0x0, 1),
               BitField("vgcs", 0x0, 1),
               BitField("fc", 0x0, 1),
               BitField("cm3", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("lcsvaCap", 0x0, 1),
               BitField("spare3", 0x0, 1),
               BitField("soLsa", 0x0, 1),
               BitField("cmsp", 0x0, 1),
               BitField("a53", 0x0, 1),
               BitField("a52", 0x0, 1)
               ]
  
  
  class DescriptiveGroupOrBroadcastCallReference(Packet):
      """ Descriptive group or broadcast call reference  Section 10.5.1.9 """
      name = "Descriptive Group or Broadcast Call Reference"
      fields_desc = [
               BitField("binCallRef", 0x0, 27),
               BitField("sf", 0x0, 1),
               BitField("fa", 0x0, 1),
               BitField("callPrio", 0x0, 3),
               BitField("cipherInfo", 0x0, 4),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("spare3", 0x0, 1),
               BitField("spare4", 0x0, 1)
               ]
  
  
  class PdAndSapi(Packet):
      """ PD and SAPI $(CCBS)$  Section 10.5.1.10a """
      name = "PD and SAPI $(CCBS)$"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("sapi", 0x0, 2),
               BitField("pd", 0x0, 4)
               ]
  
  
  class PriorityLevel(Packet):
      """ Priority Level Section 10.5.1.11 """
      name = "Priority Level"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("callPrio", 0x0, 3)
               ]
  
  #
  # Radio Resource management information elements
  #
  
  
  # len 6 to max for L3 message (251)
  class BaRange(Packet):
      """ BA Range Section 10.5.2.1a """
      name = "BA Range"
      fields_desc = [
  
               XByteField("lengthBR", None),
  #error: byte format requires -128 <= number <= 127
               ByteField("nrOfRanges", 0x0),
  #              # rX = range X
  #              # L o = Lower H i = higher
  #              # H p = high Part Lp = low Part
               ByteField("r1LoHp", 0x0),
  
               BitField("r1LoLp", 0x0, 3),
               BitField("r1HiHp", 0x0, 5),
  
               BitField("r1HiLp", 0x0, 4),
               BitField("r2LoHp", 0x0, 4),
               # optional
               BitField("r2LoLp", None, 5),
               BitField("r2HiHp", None, 3),
  
               ByteField("r2HiLp", None),
               ByteField("r3LoHp", None),
  
               BitField("r3LoLp", None, 5),
               BitField("r3HiHp", None, 3),
  
               ByteField("r3HiLp", None),
               ByteField("r4LoHp", None),
  
               BitField("r4LoLp", None, 5),
               BitField("r4HiHp", None, 3),
               ByteField("r4HiLp", None),
               ByteField("r5LoHp", None),
  
               BitField("r5LoLp", None, 5),
               BitField("r5HiHp", None, 3),
               ByteField("r5HiLp", None),
               ByteField("r6LoHp", None),
  
               BitField("r6LoLp", None, 5),
               BitField("r6HiHp", None, 3),
               ByteField("r6HiLp", None),
               ByteField("r7LoHp", None),
  
               BitField("r7LoLp", None, 5),
               BitField("r7HiHp", None, 3),
               ByteField("r7HiLp", None),
               ByteField("r8LoHp", None),
  
               BitField("r8LoLp", None, 5),
               BitField("r8HiHp", None, 3),
               ByteField("r8HiLp", None),
               ByteField("r9LoHp", None),
  
               BitField("r9LoLp", None, 5),
               BitField("r9HiHp", None, 3),
               ByteField("r9HiLp", None),
               ByteField("r10LoHp", None),
  
               BitField("r10LoLp", None, 5),
               BitField("r10HiHp", None, 3),
               ByteField("r10HiLp", None),
               ByteField("r11LoHp", None),
  
               BitField("r11LoLp", None, 5),
               BitField("r11HiHp", None, 3),
               ByteField("r11HiLp", None),
               ByteField("r12LoHp", None),
  
               BitField("r12LoLp", None, 5),
               BitField("r12HiHp", None, 3),
               ByteField("r12HiLp", None),
               ByteField("r13LoHp", None),
  
               BitField("r13LoLp", None, 5),
               BitField("r13HiHp", None, 3),
               ByteField("r13HiLp", None),
               ByteField("r14LoHp", None),
  
               BitField("r14LoLp", None, 5),
               BitField("r14HiHp", None, 3),
               ByteField("r14HiLp", None),
               ByteField("r15LoHp", None),
  
               BitField("r15LoLp", None, 5),
               BitField("r15HiHp", None, 3),
               ByteField("r15HiLp", None),
               ByteField("r16LoHp", None),
  
               BitField("r16LoLp", None, 5),
               BitField("r16HiHp", None, 3),
               ByteField("r16HiLp", None),
               ByteField("r17LoHp", None),
  
               BitField("r17LoLp", None, 5),
               BitField("r17HiHp", None, 3),
               ByteField("r17HiLp", None),
               ByteField("r18LoHp", None),
  
               BitField("r18LoLp", None, 5),
               BitField("r18HiHp", None, 3),
               ByteField("r18HiLp", None),
               ByteField("r19LoHp", None),
  
               BitField("r19LoLp", None, 5),
               BitField("r19HiHp", None, 3),
               ByteField("r19HiLp", None),
               ByteField("r20LoHp", None),
  
               BitField("r20LoLp", None, 5),
               BitField("r20HiHp", None, 3),
               ByteField("r20HiLp", None),
               ByteField("r21LoHp", None),
  
               BitField("r21LoLp", None, 5),
               BitField("r21HiHp", None, 3),
               ByteField("r21HiLp", None),
               ByteField("r22LoHp", None),
  
               BitField("r22LoLp", None, 5),
               BitField("r22HiHp", None, 3),
               ByteField("r22HiLp", None),
               ByteField("r23LoHp", None),
  
               BitField("r23LoLp", None, 5),
               BitField("r23HiHp", None, 3),
               ByteField("r23HiLp", None),
               ByteField("r24LoHp", None),
  
               BitField("r24LoLp", None, 5),
               BitField("r24HiHp", None, 3),
               ByteField("r24HiLp", None),
               ByteField("r25LoHp", None),
  
               BitField("r25LoLp", None, 5),
               BitField("r25HiHp", None, 3),
               ByteField("r25HiLp", None),
               ByteField("r26LoHp", None),
  
               BitField("r26LoLp", None, 5),
               BitField("r26HiHp", None, 3),
               ByteField("r26HiLp", None),
               ByteField("r27LoHp", None),
  
               BitField("r27LoLp", None, 5),
               BitField("r27HiHp", None, 3),
               ByteField("r27HiLp", None),
               ByteField("r28LoHp", None),
  
               BitField("r28LoLp", None, 5),
               BitField("r28HiHp", None, 3),
               ByteField("r28HiLp", None),
               ByteField("r29LoHp", None),
  
               BitField("r29LoLp", None, 5),
               BitField("r29HiHp", None, 3),
               ByteField("r29HiLp", None),
               ByteField("r30LoHp", None),
  
               BitField("r30LoLp", None, 5),
               BitField("r30HiHp", None, 3),
               ByteField("r30HiLp", None),
               ByteField("r31LoHp", None),
  
               BitField("r31LoLp", None, 5),
               BitField("r31HiHp", None, 3),
               ByteField("r31HiLp", None),
               ByteField("r32LoHp", None),
  
               BitField("r32LoLp", None, 5),
               BitField("r32HiHp", None, 3),
               ByteField("r32HiLp", None),
               ByteField("r33LoHp", None),
  
               BitField("r33LoLp", None, 5),
               BitField("r33HiHp", None, 3),
               ByteField("r33HiLp", None),
               ByteField("r34LoHp", None),
  
               BitField("r34LoLp", None, 5),
               BitField("r34HiHp", None, 3),
               ByteField("r34HiLp", None),
               ByteField("r35LoHp", None),
  
               BitField("r35LoLp", None, 5),
               BitField("r35HiHp", None, 3),
               ByteField("r35HiLp", None),
               ByteField("r36LoHp", None),
  
               BitField("r36LoLp", None, 5),
               BitField("r36HiHp", None, 3),
               ByteField("r36HiLp", None),
               ByteField("r37LoHp", None),
  
               BitField("r37LoLp", None, 5),
               BitField("r37HiHp", None, 3),
               ByteField("r37HiLp", None),
               ByteField("r38LoHp", None),
  
               BitField("r38LoLp", None, 5),
               BitField("r38HiHp", None, 3),
               ByteField("r38HiLp", None),
               ByteField("r39LoHp", None),
  
               BitField("r39LoLp", None, 5),
               BitField("r39HiHp", None, 3),
               ByteField("r39HiLp", None),
               ByteField("r40LoHp", None),
  
               BitField("r40LoLp", None, 5),
               BitField("r40HiHp", None, 3),
               ByteField("r40HiLp", None),
               ByteField("r41LoHp", None),
  
               BitField("r41LoLp", None, 5),
               BitField("r41HiHp", None, 3),
               ByteField("r41HiLp", None),
               ByteField("r42LoHp", None),
  
               BitField("r42LoLp", None, 5),
               BitField("r42HiHp", None, 3),
               ByteField("r42HiLp", None),
               ByteField("r43LoHp", None),
  
               BitField("r43LoLp", None, 5),
               BitField("r43HiHp", None, 3),
               ByteField("r43HiLp", None),
               ByteField("r44LoHp", None),
  
               BitField("r44LoLp", None, 5),
               BitField("r44HiHp", None, 3),
               ByteField("r44HiLp", None),
               ByteField("r45LoHp", None),
  
               BitField("r45LoLp", None, 5),
               BitField("r45HiHp", None, 3),
               ByteField("r45HiLp", None),
               ByteField("r46LoHp", None),
  
               BitField("r46LoLp", None, 5),
               BitField("r46HiHp", None, 3),
               ByteField("r46HiLp", None),
               ByteField("r47LoHp", None),
  
               BitField("r47LoLp", None, 5),
               BitField("r47HiHp", None, 3),
               ByteField("r47HiLp", None),
               ByteField("r48LoHp", None),
  
               BitField("r48LoLp", None, 5),
               BitField("r48HiHp", None, 3),
               ByteField("r48HiLp", None),
               ByteField("r49LoHp", None),
  
               BitField("r49LoLp", None, 5),
               BitField("r49HiHp", None, 3),
               ByteField("r49HiLp", None),
               ByteField("r50LoHp", None),
  
               BitField("r50LoLp", None, 5),
               BitField("r50HiHp", None, 3),
               ByteField("r50HiLp", None),
               ByteField("r51LoHp", None),
  
               BitField("r51LoLp", None, 5),
               BitField("r51HiHp", None, 3),
               ByteField("r51HiLp", None),
               ByteField("r52LoHp", None),
  
               BitField("r52LoLp", None, 5),
               BitField("r52HiHp", None, 3),
               ByteField("r52HiLp", None),
               ByteField("r53LoHp", None),
  
               BitField("r53LoLp", None, 5),
               BitField("r53HiHp", None, 3),
               ByteField("r53HiLp", None),
               ByteField("r54LoHp", None),
  
               BitField("r54LoLp", None, 5),
               BitField("r54HiHp", None, 3),
               ByteField("r54HiLp", None),
               ByteField("r55LoHp", None),
  
               BitField("r55LoLp", None, 5),
               BitField("r55HiHp", None, 3),
               ByteField("r55HiLp", None),
               ByteField("r56LoHp", None),
  
               BitField("r56LoLp", None, 5),
               BitField("r56HiHp", None, 3),
               ByteField("r56HiLp", None),
               ByteField("r57LoHp", None),
  
               BitField("r57LoLp", None, 5),
               BitField("r57HiHp", None, 3),
               ByteField("r57HiLp", None),
               ByteField("r58LoHp", None),
  
               BitField("r58LoLp", None, 5),
               BitField("r58HiHp", None, 3),
               ByteField("r58HiLp", None),
               ByteField("r59LoHp", None),
  
               BitField("r59LoLp", None, 5),
               BitField("r59HiHp", None, 3),
               ByteField("r59HiLp", None),
               ByteField("r60LoHp", None),
  
               BitField("r60LoLp", None, 5),
               BitField("r60HiHp", None, 3),
               ByteField("r60HiLp", None),
               ByteField("r61LoHp", None),
  
               BitField("r61LoLp", None, 5),
               BitField("r61HiHp", None, 3),
               ByteField("r61HiLp", None),
               ByteField("r62LoHp", None),
  
               BitField("r62LoLp", None, 5),
               BitField("r62HiHp", None, 3),
               ByteField("r62HiLp", None),
               ByteField("r63LoHp", None),
  
               BitField("r63LoLp", None, 5),
               BitField("r63HiHp", None, 3),
               ByteField("r63HiLp", None),
               ByteField("r64LoHp", None),
  
               BitField("r64LoLp", None, 5),
               BitField("r64HiHp", None, 3),
               ByteField("r64HiLp", None),
               ByteField("r65LoHp", None),
  
               BitField("r65LoLp", None, 5),
               BitField("r65HiHp", None, 3),
               ByteField("r65HiLp", None),
               ByteField("r66LoHp", None),
  
               BitField("r66LoLp", None, 5),
               BitField("r66HiHp", None, 3),
               ByteField("r66HiLp", None),
               ByteField("r67LoHp", None),
  
               BitField("r67LoLp", None, 5),
               BitField("r67HiHp", None, 3),
               ByteField("r67HiLp", None),
               ByteField("r68LoHp", None),
  
               BitField("r68LoLp", None, 5),
               BitField("r68HiHp", None, 3),
               ByteField("r68HiLp", None),
               ByteField("r69LoHp", None),
  
               BitField("r69LoLp", None, 5),
               BitField("r69HiHp", None, 3),
               ByteField("r69HiLp", None),
               ByteField("r70LoHp", None),
  
               BitField("r70LoLp", None, 5),
               BitField("r70HiHp", None, 3),
               ByteField("r70HiLp", None),
               ByteField("r71LoHp", None),
  
               BitField("r71LoLp", None, 5),
               BitField("r71HiHp", None, 3),
               ByteField("r71HiLp", None),
               ByteField("r72LoHp", None),
  
               BitField("r72LoLp", None, 5),
               BitField("r72HiHp", None, 3),
               ByteField("r72HiLp", None),
               ByteField("r73LoHp", None),
  
               BitField("r73LoLp", None, 5),
               BitField("r73HiHp", None, 3),
               ByteField("r73HiLp", None),
               ByteField("r74LoHp", None),
  
               BitField("r74LoLp", None, 5),
               BitField("r74HiHp", None, 3),
               ByteField("r74HiLp", None),
               ByteField("r75LoHp", None),
  
               BitField("r75LoLp", None, 5),
               BitField("r75HiHp", None, 3),
               ByteField("r75HiLp", None),
               ByteField("r76LoHp", None),
  
               BitField("r76LoLp", None, 5),
               BitField("r76HiHp", None, 3),
               ByteField("r76HiLp", None),
               ByteField("r77LoHp", None),
  
               BitField("r77LoLp", None, 5),
               BitField("r77HiHp", None, 3),
               ByteField("r77HiLp", None),
               ByteField("r78LoHp", None),
  
               BitField("r78LoLp", None, 5),
               BitField("r78HiHp", None, 3),
               ByteField("r78HiLp", None),
               ByteField("r79LoHp", None),
  
               BitField("r79LoLp", None, 5),
               BitField("r79HiHp", None, 3),
               ByteField("r79HiLp", None),
               ByteField("r80LoHp", None),
  
               BitField("r80LoLp", None, 5),
               BitField("r80HiHp", None, 3),
               ByteField("r80HiLp", None),
               ByteField("r81LoHp", None),
  
               BitField("r81LoLp", None, 5),
               BitField("r81HiHp", None, 3),
               ByteField("r81HiLp", None),
               ByteField("r82LoHp", None),
  
               BitField("r82LoLp", None, 5),
               BitField("r82HiHp", None, 3),
               ByteField("r82HiLp", None),
               ByteField("r83LoHp", None),
  
               BitField("r83LoLp", None, 5),
               BitField("r83HiHp", None, 3),
               ByteField("r83HiLp", None),
               ByteField("r84LoHp", None),
  
               BitField("r84LoLp", None, 5),
               BitField("r84HiHp", None, 3),
               ByteField("r84HiLp", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(5, 253, a, self.fields_desc, 1)
          if self.lengthBR is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 3 to max for L3 message (251)
  class BaListPref(Packet):
      """ BA List Pref Section 10.5.2.1c """
      name = "BA List Pref"
      fields_desc = [
               XByteField("lengthBLP", None),
  
               BitField("fixBit", 0x0, 1),
               BitField("rangeLower", 0x0, 10),
               BitField("fixBit2", 0x0, 1),
               BitField("rangeUpper", 0x0, 10),
               BitField("baFreq", 0x0, 10),
               BitField("sparePad", 0x0, 8)
               ]
  
  
  # len 17 || Have a look at the specs for the field format
  # Bit map 0 format
  # Range 1024 format
  # Range  512 format
  # Range  256 format
  # Range  128 format
  # Variable bit map format
  class CellChannelDescription(Packet):
      """ Cell Channel Description  Section 10.5.2.1b """
      name = "Cell Channel Description "
      fields_desc = [
               BitField("bit128", 0x0, 1),
               BitField("bit127", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
               ByteField("bit120", 0x0),
               ByteField("bit112", 0x0),
               ByteField("bit104", 0x0),
               ByteField("bit96", 0x0),
               ByteField("bit88", 0x0),
               ByteField("bit80", 0x0),
               ByteField("bit72", 0x0),
               ByteField("bit64", 0x0),
               ByteField("bit56", 0x0),
               ByteField("bit48", 0x0),
               ByteField("bit40", 0x0),
               ByteField("bit32", 0x0),
               ByteField("bit24", 0x0),
               ByteField("bit16", 0x0),
               ByteField("bit8", 0x0)
               ]
  
  
  class CellDescription(Packet):
      """ Cell Description  Section 10.5.2.2 """
      name = "Cell Description"
      fields_desc = [
               BitField("bcchHigh", 0x0, 2),
               BitField("ncc", 0x0, 3),
               BitField("bcc", 0x0, 3),
               ByteField("bcchLow", 0x0)
               ]
  
  
  class CellOptionsBCCH(Packet):
      """ Cell Options (BCCH)  Section 10.5.2.3 """
      name = "Cell Options (BCCH)"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("pwrc", 0x0, 1),
               BitField("dtx", 0x0, 2),
               BitField("rLinkTout", 0x0, 4)
               ]
  
  
  class CellOptionsSACCH(Packet):
      """ Cell Options (SACCH) Section 10.5.2.3a """
      name = "Cell Options (SACCH)"
      fields_desc = [
               BitField("dtx", 0x0, 1),
               BitField("pwrc", 0x0, 1),
               BitField("dtx", 0x0, 1),
               BitField("rLinkTout", 0x0, 4)
               ]
  
  
  class CellSelectionParameters(Packet):
      """ Cell Selection Parameters Section 10.5.2.4 """
      name = "Cell Selection Parameters"
      fields_desc = [
               BitField("cellReselect", 0x0, 3),
               BitField("msTxPwrMax", 0x0, 5),
               BitField("acs", None, 1),
               BitField("neci", None, 1),
               BitField("rxlenAccMin", None, 6)
               ]
  
  
  class MacModeAndChannelCodingRequest(Packet):
      """ MAC Mode and Channel Coding Requested Section 10.5.2.4a """
      name = "MAC Mode and Channel Coding Requested"
      fields_desc = [
               BitField("macMode", 0x0, 2),
               BitField("cs", 0x0, 2)
               ]
  
  
  class ChannelDescription(Packet):
      """ Channel Description  Section 10.5.2.5 """
      name = "Channel Description"
      fields_desc = [
  
               BitField("channelTyp", 0x0, 5),
               BitField("tn", 0x0, 3),
  
               BitField("tsc", 0x0, 3),
               BitField("h", 0x1, 1),
               BitField("maioHi", 0x0, 4),
  
               BitField("maioLo", 0x0, 2),
               BitField("hsn", 0x0, 6)
               ]
  
  
  class ChannelDescription2(Packet):
      """ Channel Description 2 Section 10.5.2.5a """
      name = "Channel Description 2"
      fields_desc = [
               BitField("channelTyp", 0x0, 5),
               BitField("tn", 0x0, 3),
               BitField("tsc", 0x0, 3),
               BitField("h", 0x0, 1),
               # if h=1
               # BitField("maioHi", 0x0, 4),
               # BitField("maioLo", 0x0, 2),
               # BitField("hsn", 0x0, 6)
               BitField("spare", 0x0, 2),
               BitField("arfcnHigh", 0x0, 2),
               ByteField("arfcnLow", 0x0)
               ]
  
  
  class ChannelMode(Packet):
      """ Channel Mode Section 10.5.2.6 """
      name = "Channel Mode"
      fields_desc = [
               ByteField("mode", 0x0)
               ]
  
  
  class ChannelMode2(Packet):
      """ Channel Mode 2 Section 10.5.2.7 """
      name = "Channel Mode 2"
      fields_desc = [
               ByteField("mode", 0x0)
               ]
  
  
  class ChannelNeeded(Packet):
      """ Channel Needed Section 10.5.2.8 """
      name = "Channel Needed"
      fields_desc = [
               BitField("channel2", 0x0, 2),
               BitField("channel1", 0x0, 2),
               ]
  
  
  class ChannelRequestDescription(Packet):
      """Channel Request Description  Section 10.5.2.8a """
      name = "Channel Request Description"
      fields_desc = [
               BitField("mt", 0x0, 1),
               ConditionalField(BitField("spare", 0x0, 39),
                                lambda pkt: pkt.mt == 0),
               ConditionalField(BitField("spare", 0x0, 3),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(BitField("priority", 0x0, 2),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(BitField("rlcMode", 0x0, 1),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(BitField("llcFrame", 0x1, 1),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("reqBandMsb", 0x0),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("reqBandLsb", 0x0),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("rlcMsb", 0x0),
                                lambda pkt: pkt.mt == 1),
               ConditionalField(ByteField("rlcLsb", 0x0),
                                lambda pkt: pkt.mt == 1)
               ]
  
  
  class CipherModeSetting(Packet):
      """Cipher Mode Setting Section 10.5.2.9 """
      name = "Cipher Mode Setting"
      fields_desc = [
               BitField("algoId", 0x0, 3),
               BitField("sc", 0x0, 1),
               ]
  
  
  class CipherResponse(Packet):
      """Cipher Response Section 10.5.2.10 """
      name = "Cipher Response"
      fields_desc = [
               BitField("spare", 0x0, 3),
               BitField("cr", 0x0, 1),
               ]
  
  
  class ControlChannelDescription(Packet):
      """Control Channel Description Section 10.5.2.11 """
      name = "Control Channel Description"
      fields_desc = [
  
               BitField("spare", 0x0, 1),
               BitField("att", 0x0, 1),
               BitField("bsAgBlksRes", 0x0, 3),
               BitField("ccchConf", 0x0, 3),
  
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("spare3", 0x0, 1),
               BitField("spare4", 0x0, 1),
               BitField("bsPaMfrms", 0x0, 3),
  
               ByteField("t3212", 0x0)
               ]
  
  
  class FrequencyChannelSequence(Packet):
      """Frequency Channel Sequence Section 10.5.2.12"""
      name = "Frequency Channel Sequence"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("lowestArfcn", 0x0, 7),
               BitField("skipArfcn01", 0x0, 4),
               BitField("skipArfcn02", 0x0, 4),
               BitField("skipArfcn03", 0x0, 4),
               BitField("skipArfcn04", 0x0, 4),
               BitField("skipArfcn05", 0x0, 4),
               BitField("skipArfcn06", 0x0, 4),
               BitField("skipArfcn07", 0x0, 4),
               BitField("skipArfcn08", 0x0, 4),
               BitField("skipArfcn09", 0x0, 4),
               BitField("skipArfcn10", 0x0, 4),
               BitField("skipArfcn11", 0x0, 4),
               BitField("skipArfcn12", 0x0, 4),
               BitField("skipArfcn13", 0x0, 4),
               BitField("skipArfcn14", 0x0, 4),
               BitField("skipArfcn15", 0x0, 4),
               BitField("skipArfcn16", 0x0, 4)
               ]
  
  
  class FrequencyList(Packet):
      """Frequency List Section 10.5.2.13"""
      name = "Frequency List"
   # Problem:
   # There are several formats for the Frequency List information
   # element, distinguished by the "format indicator" subfield.
   # Some formats are frequency bit maps, the others use a special encoding
   # scheme.
      fields_desc = [
               XByteField("lengthFL", None),
  
               BitField("formatID", 0x0, 2),
               BitField("spare", 0x0, 2),
               BitField("arfcn124", 0x0, 1),
               BitField("arfcn123", 0x0, 1),
               BitField("arfcn122", 0x0, 1),
               BitField("arfcn121", 0x0, 1),
  
               ByteField("arfcn120", 0x0),
               ByteField("arfcn112", 0x0),
               ByteField("arfcn104", 0x0),
               ByteField("arfcn96", 0x0),
               ByteField("arfcn88", 0x0),
               ByteField("arfcn80", 0x0),
               ByteField("arfcn72", 0x0),
               ByteField("arfcn64", 0x0),
               ByteField("arfcn56", 0x0),
               ByteField("arfcn48", 0x0),
               ByteField("arfcn40", 0x0),
               ByteField("arfcn32", 0x0),
               ByteField("arfcn24", 0x0),
               ByteField("arfcn16", 0x0),
               ByteField("arfcn8", 0x0)
               ]
  
  
  # len 4 to 13
  class GroupChannelDescription(Packet):
      """Group Channel Description Section 10.5.2.14b"""
      name = "Group Channel Description"
      fields_desc = [
               XByteField("lengthGCD", None),
  
               BitField("channelType", 0x0, 5),
               BitField("tn", 0x0, 3),
  
               BitField("tsc", 0x0, 3),
               BitField("h", 0x0, 1),
               # if  h == 0 the  packet looks the following way:
               ConditionalField(BitField("spare", 0x0, 2),
                                lambda pkt: pkt. h == 0x0),
               ConditionalField(BitField("arfcnHi", 0x0, 2),
                                lambda pkt: pkt. h == 0x0),
               ConditionalField(ByteField("arfcnLo", None),
                                lambda pkt: pkt. h == 0x0),
               # if  h == 1 the  packet looks the following way:
               ConditionalField(BitField("maioHi", 0x0, 4),
                                lambda pkt: pkt. h == 0x1),
               ConditionalField(BitField("maioLo", None, 2),
                                lambda pkt: pkt. h == 0x1),
               ConditionalField(BitField("hsn", None, 6),
                                lambda pkt: pkt. h == 0x1),
               # finished with conditional fields
               ByteField("maC6", None),
               ByteField("maC7", None),
               ByteField("maC8", None),
               ByteField("maC9", None),
               ByteField("maC10", None),
               ByteField("maC11", None),
               ByteField("maC12", None),
               ByteField("maC13", None),
               ByteField("maC14", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(4, 13, a, self.fields_desc, 1)
          if self.lengthGCD is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class GprsResumption(Packet):
      """GPRS Resumption  Section 10.5.2.14c"""
      name = "GPRS Resumption"
      fields_desc = [
               BitField("spare", 0x0, 3),
               BitField("ack", 0x0, 1)
               ]
  
  
  class HandoverReference(Packet):
      """Handover Reference Section 10.5.2.15"""
      name = "Handover Reference"
      fields_desc = [
               ByteField("handoverRef", 0x0)
               ]
  
  
  class IraRestOctets(Packet):
      """IAR Rest Octets Section 10.5.2.17"""
      name = "IAR Rest Octets"
      fields_desc = [
               BitField("spare01", 0x0, 1),
               BitField("spare02", 0x0, 1),
               BitField("spare03", 0x1, 1),
               BitField("spare04", 0x0, 1),
               BitField("spare05", 0x1, 1),
               BitField("spare06", 0x0, 1),
               BitField("spare07", 0x1, 1),
               BitField("spare08", 0x1, 1),
               BitField("spare09", 0x0, 1),
               BitField("spare10", 0x0, 1),
               BitField("spare11", 0x1, 1),
               BitField("spare12", 0x0, 1),
               BitField("spare13", 0x1, 1),
               BitField("spare14", 0x0, 1),
               BitField("spare15", 0x1, 1),
               BitField("spare16", 0x1, 1),
               BitField("spare17", 0x0, 1),
               BitField("spare18", 0x0, 1),
               BitField("spare19", 0x1, 1),
               BitField("spare20", 0x0, 1),
               BitField("spare21", 0x1, 1),
               BitField("spare22", 0x0, 1),
               BitField("spare23", 0x1, 1),
               BitField("spare24", 0x1, 1)
               ]
  
  
  # len is 1 to 5 what do we do with the variable size? no length
  # field?! WTF
  class IaxRestOctets(Packet):
      """IAX Rest Octets Section 10.5.2.18"""
      name = "IAX Rest Octets"
      fields_desc = [
               BitField("spare01", 0x0, 1),
               BitField("spare02", 0x0, 1),
               BitField("spare03", 0x1, 1),
               BitField("spare04", 0x0, 1),
               BitField("spare05", 0x1, 1),
               BitField("spare06", 0x0, 1),
               BitField("spare07", 0x1, 1),
               BitField("spare08", 0x1, 1),
               ByteField("spareB1", None),
               ByteField("spareB2", None),
               ByteField("spareB3", None)
               ]
  
  
  class L2PseudoLength(Packet):
      """L2 Pseudo Length Section 10.5.2.19"""
      name = "L2 Pseudo Length"
      fields_desc = [
               BitField("l2pLength", None, 6),
               BitField("bit2", 0x0, 1),
               BitField("bit1", 0x1, 1)
               ]
  
  
  class MeasurementResults(Packet):
      """Measurement Results Section 10.5.2.20"""
      name = "Measurement Results"
      fields_desc = [
               BitField("baUsed", 0x0, 1),
               BitField("dtxUsed", 0x0, 1),
               BitField("rxLevFull", 0x0, 6),
  
               BitField("spare", 0x0, 1),
               BitField("measValid", 0x0, 1),
               BitField("rxLevSub", 0x0, 6),
  
               BitField("spare0", 0x0, 1),
               BitField("rxqualFull", 0x0, 3),
               BitField("rxqualSub", 0x0, 3),
               BitField("noNcellHi", 0x0, 1),
  
               BitField("noNcellLo", 0x0, 2),
               BitField("rxlevC1", 0x0, 6),
  
               BitField("bcchC1", 0x0, 5),
               BitField("bsicC1Hi", 0x0, 3),
  
               BitField("bsicC1Lo", 0x0, 3),
               BitField("rxlevC2", 0x0, 5),
  
               BitField("rxlevC2Lo", 0x0, 1),
               BitField("bcchC2", 0x0, 5),
               BitField("bsicC2Hi", 0x0, 2),
  
               BitField("bscicC2Lo", 0x0, 4),
               BitField("bscicC2Hi", 0x0, 4),
  
               BitField("rxlevC3Lo", 0x0, 2),
               BitField("bcchC3", 0x0, 5),
               BitField("rxlevC3Hi", 0x0, 1),
  
               BitField("bsicC3Lo", 0x0, 5),
               BitField("bsicC3Hi", 0x0, 3),
  
               BitField("rxlevC4Lo", 0x0, 3),
               BitField("bcchC4", 0x0, 5),
  
               BitField("bsicC4", 0x0, 6),
               BitField("rxlevC5Hi", 0x0, 2),
  
               BitField("rxlevC5Lo", 0x0, 4),
               BitField("bcchC5Hi", 0x0, 4),
  
               BitField("bcchC5Lo", 0x0, 1),
               BitField("bsicC5", 0x0, 6),
               BitField("rxlevC6", 0x0, 1),
  
               BitField("rxlevC6Lo", 0x0, 5),
               BitField("bcchC6Hi", 0x0, 3),
  
               BitField("bcchC6Lo", 0x0, 3),
               BitField("bsicC6", 0x0, 5)
               ]
  
  
  class GprsMeasurementResults(Packet):
      """GPRS Measurement Results Section 10.5.2.20a"""
      name = "GPRS Measurement Results"
      fields_desc = [
               BitField("cValue", 0x0, 6),
               BitField("rxqualHi", 0x0, 2),
               BitField("rxqL", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("signVar", 0x0, 6)
               ]
  
  
  # len 3 to 10
  class MobileAllocation(Packet):
      """Mobile Allocation Section 10.5.2.21"""
      name = "Mobile Allocation"
      fields_desc = [
               XByteField("lengthMA", None),
               ByteField("maC64", 0x12),
               ByteField("maC56", None),  # optional fields start here
               ByteField("maC48", None),
               ByteField("maC40", None),
               ByteField("maC32", None),
               ByteField("maC24", None),
               ByteField("maC16", None),
               ByteField("maC8", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 9, a, self.fields_desc, 1)
          if self.lengthMA is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MobileTimeDifference(Packet):
      """Mobile Time Difference Section 10.5.2.21a"""
      name = "Mobile Time Difference"
      fields_desc = [
               XByteField("lengthMTD", 0x5),
               ByteField("valueHi", 0x0),
               ByteField("valueCnt", 0x0),
               BitField("valueLow", 0x0, 5),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1)
               ]
  
  
  # min 4 octets max 8
  class MultiRateConfiguration(Packet):
      """ MultiRate configuration Section 10.5.2.21aa"""
      name = "MultiRate Configuration"
   # This  packet has a variable length and hence structure. This packet
   # implements the longest possible  packet. If you build a shorter
   #  packet, for example having only 6 bytes, the last 4 bytes are  named
   # "Spare" in the specs. Here they are  named "threshold2"
      fields_desc = [
               XByteField("lengthMRC", None),
  
               BitField("mrVersion", 0x0, 3),
               BitField("spare", 0x0, 1),
               BitField("icmi", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("startMode", 0x0, 2),
  
               ByteField("amrCodec", None),
  
               BitField("spare", None, 2),
               BitField("threshold1", None, 6),
  
               BitField("hysteresis1", None, 4),
               BitField("threshold2", None, 4),
  
               BitField("threshold2cnt", None, 2),
               BitField("hysteresis2", None, 4),
               BitField("threshold3", None, 2),
  
               BitField("threshold3cnt", None, 4),
               BitField("hysteresis3", None, 4)
               ]
  
      def post_build(self, p, pay):
          # we set the length
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 7, a, self.fields_desc, 1)
          if self.lengthMRC is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 2 to 11
  class MultislotAllocation(Packet):
      """Multislot Allocation Section 10.5.2.21b"""
      name = "Multislot Allocation"
      fields_desc = [
               XByteField("lengthMSA", None),
               BitField("ext0", 0x1, 1),
               BitField("da", 0x0, 7),
               ConditionalField(BitField("ext1", 0x1, 1),  # optional
                                          lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("ua", 0x0, 7),
                                          lambda pkt: pkt.ext0 == 0),
               ByteField("chan1", None),
               ByteField("chan2", None),
               ByteField("chan3", None),
               ByteField("chan4", None),
               ByteField("chan5", None),
               ByteField("chan6", None),
               ByteField("chan7", None),
               ByteField("chan8", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 11, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthMSA is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  
  
  class NcMode(Packet):
      """NC mode Section 10.5.2.21c"""
      name = "NC Mode"
      fields_desc = [
               BitField("spare", 0x0, 2),
               BitField("ncMode", 0x0, 2)
               ]
  
  
  class NeighbourCellsDescription(Packet):
      """Neighbour Cells Description Section 10.5.2.22"""
      name = "Neighbour Cells Description"
      fields_desc = [
               BitField("bit128", 0x0, 1),
               BitField("bit127", 0x0, 1),
               BitField("extInd", 0x0, 1),
               BitField("baInd", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
               BitField("120bits", 0x0, 120)
               ]
  
  
  class NeighbourCellsDescription2(Packet):
      """Neighbour Cells Description 2 Section 10.5.2.22a"""
      name = "Neighbour Cells Description 2"
      fields_desc = [
               BitField("bit128", 0x0, 1),
               BitField("multiband", 0x0, 2),
               BitField("baInd", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
               BitField("120bits", 0x0, 120)
               ]
  
  
  # len 4
  # strange  packet, lots of valid formats
  
  # ideas for the dynamic  packets:
  # 1] for user interaction: Create an interactive "builder" based on a
  # Q/A process (not very scapy like)
  # 2] for usage in scripts, create an alternative  packet for every
  # possible  packet layout
  #
  
  class DedicatedModeOrTBF(Packet):
      """Dedicated mode or TBF Section 10.5.2.25b"""
      name = "Dedicated Mode or TBF"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("tma", 0x0, 1),
               BitField("downlink", 0x0, 1),
               BitField("td", 0x0, 1)
               ]
  
  
  class PageMode(Packet):
      """Page Mode Section 10.5.2.26"""
      name = "Page Mode"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("pm", 0x0, 2)
               ]
  
  
  class NccPermitted(Packet):
      """NCC Permitted Section 10.5.2.27"""
      name = "NCC Permitted"
      fields_desc = [
               ByteField("nccPerm", 0x0)
               ]
  
  
  class PowerCommand(Packet):
      """Power Command Section 10.5.2.28"""
      name = "Power Command"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("spare2", 0x0, 1),
               BitField("powerLvl", 0x0, 5)
               ]
  
  
  class PowerCommandAndAccessType(Packet):
      """Power Command and access type  Section 10.5.2.28a"""
      name = "Power Command and Access Type"
      fields_desc = [
               BitField("atc", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("powerLvl", 0x0, 5)
               ]
  
  
  class RachControlParameters(Packet):
      """RACH Control Parameters Section 10.5.2.29"""
      name = "RACH Control Parameters"
      fields_desc = [
               BitField("maxRetrans", 0x0, 2),
               BitField("txInteger", 0x0, 4),
               BitField("cellBarrAccess", 0x0, 1),
               BitField("re", 0x0, 1),
               BitField("ACC15", 0x0, 1),
               BitField("ACC14", 0x0, 1),
               BitField("ACC13", 0x0, 1),
               BitField("ACC12", 0x0, 1),
               BitField("ACC11", 0x0, 1),
               BitField("ACC10", 0x0, 1),
               BitField("ACC09", 0x0, 1),
               BitField("ACC08", 0x0, 1),
               BitField("ACC07", 0x0, 1),
               BitField("ACC06", 0x0, 1),
               BitField("ACC05", 0x0, 1),
               BitField("ACC04", 0x0, 1),
               BitField("ACC03", 0x0, 1),
               BitField("ACC02", 0x0, 1),
               BitField("ACC01", 0x0, 1),
               BitField("ACC00", 0x0, 1),
               ]
  
  
  class RequestReference(Packet):
      """Request Reference  Section 10.5.2.30"""
      name = "Request Reference"
      fields_desc = [
               ByteField("ra", 0x0),
               BitField("t1", 0x0, 5),
               BitField("t3Hi", 0x0, 3),
               BitField("t3Lo", 0x0, 3),
               BitField("t2", 0x0, 5)
               ]
  
  
  class RrCause(Packet):
      """RR Cause  Section 10.5.2.31"""
      name = "RR Cause"
      fields_desc = [
               ByteField("rrCause", 0x0)
               ]
  
  
  class StartingTime(Packet):
      """Starting Time Section 10.5.2.38"""
      name = "Starting Time"
      fields_desc = [
               ByteField("ra", 0x0),
               BitField("t1", 0x0, 5),
               BitField("t3Hi", 0x0, 3),
               BitField("t3Lo", 0x0, 3),
               BitField("t2", 0x0, 5)
               ]
  
  
  class SynchronizationIndication(Packet):
      """Synchronization Indication Section 10.5.2.39"""
      name = "Synchronization Indication"
      fields_desc = [
               BitField("nci", 0x0, 1),
               BitField("rot", 0x0, 1),
               BitField("si", 0x0, 2)
               ]
  
  
  class TimingAdvance(Packet):
      """Timing Advance Section 10.5.2.40"""
      name = "Timing Advance"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1),
               BitField("timingVal", 0x0, 6)
               ]
  
  
  class TimeDifference(Packet):
      """ Time Difference Section 10.5.2.41"""
      name = "Time Difference"
      fields_desc = [
               XByteField("lengthTD", 0x3),
               ByteField("timeValue", 0x0)
               ]
  
  
  class Tlli(Packet):
      """ TLLI Section Section 10.5.2.41a"""
      name = "TLLI"
      fields_desc = [
               ByteField("value", 0x0),
               ByteField("value1", 0x0),
               ByteField("value2", 0x0),
               ByteField("value3", 0x0)
               ]
  
  
  class TmsiPTmsi(Packet):
      """ TMSI/P-TMSI Section 10.5.2.42"""
      name = "TMSI/P-TMSI"
      fields_desc = [
               ByteField("value", 0x0),
               ByteField("value1", 0x0),
               ByteField("value2", 0x0),
               ByteField("value3", 0x0)
               ]
  
  
  class VgcsTargetModeIdentication(Packet):
      """ VGCS target Mode Indication 10.5.2.42a"""
      name = "VGCS Target Mode Indication"
      fields_desc = [
               XByteField("lengthVTMI", 0x2),
               BitField("targerMode", 0x0, 2),
               BitField("cipherKeyNb", 0x0, 4),
               BitField("spare", 0x0, 1),
               BitField("spare1", 0x0, 1)
               ]
  
  
  class WaitIndication(Packet):
      """ Wait Indication Section 10.5.2.43"""
      name = "Wait Indication"
      fields_desc = [  # asciiart of specs strange
               ByteField("timeoutVal", 0x0)
               ]
  
  
  #class Si10RestOctets(Packet):
  #     """SI10 rest octets 10.5.2.44"""
  #     name = "SI10 rest octets"
  #     fields_desc = [
  
  
  # len 17
  class ExtendedMeasurementResults(Packet):
      """EXTENDED MEASUREMENT RESULTS Section 10.5.2.45"""
      name = "Extended Measurement Results"
      fields_desc = [
  
               BitField("scUsed", None, 1),
               BitField("dtxUsed", None, 1),
               BitField("rxLevC0", None, 6),
  
               BitField("rxLevC1", None, 6),
               BitField("rxLevC2Hi", None, 2),
  
               BitField("rxLevC2Lo", None, 4),
               BitField("rxLevC3Hi", None, 4),
  
               BitField("rxLevC3Lo", None, 3),
               BitField("rxLevC4", None, 5),
  
               BitField("rxLevC5", None, 6),
               BitField("rxLevC6Hi", None, 2),
  
               BitField("rxLevC6Lo", None, 4),
               BitField("rxLevC7Hi", None, 4),
  
               BitField("rxLevC7Lo", None, 2),
               BitField("rxLevC8", None, 6),
  
               BitField("rxLevC9", None, 6),
               BitField("rxLevC10Hi", None, 2),
  
               BitField("rxLevC10Lo", None, 4),
               BitField("rxLevC11Hi", None, 4),
  
               BitField("rxLevC13Lo", None, 2),
               BitField("rxLevC12", None, 6),
  
               BitField("rxLevC13", None, 6),
               BitField("rxLevC14Hi", None, 2),
  
               BitField("rxLevC14Lo", None, 4),
               BitField("rxLevC15Hi", None, 4),
  
               BitField("rxLevC15Lo", None, 2),
               BitField("rxLevC16", None, 6),
  
  
               BitField("rxLevC17", None, 6),
               BitField("rxLevC18Hi", None, 2),
  
               BitField("rxLevC18Lo", None, 4),
               BitField("rxLevC19Hi", None, 4),
  
               BitField("rxLevC19Lo", None, 2),
               BitField("rxLevC20", None, 6)
               ]
  
  
  # len 17
  class ExtendedMeasurementFrequencyList(Packet):
      """Extended Measurement Frequency List Section 10.5.2.46"""
      name = "Extended Measurement Frequency List"
      fields_desc = [
  
               BitField("bit128", 0x0, 1),
               BitField("bit127", 0x0, 1),
               BitField("spare", 0x0, 1),
               BitField("seqCode", 0x0, 1),
               BitField("bit124", 0x0, 1),
               BitField("bit123", 0x0, 1),
               BitField("bit122", 0x0, 1),
               BitField("bit121", 0x0, 1),
  
               BitField("bitsRest", 0x0, 128)
               ]
  
  
  class SuspensionCause(Packet):
      """Suspension Cause Section 10.5.2.47"""
      name = "Suspension Cause"
      fields_desc = [
               ByteField("suspVal", 0x0)
               ]
  
  
  class ApduID(Packet):
      """APDU Flags Section 10.5.2.48"""
      name = "Apdu Id"
      fields_desc = [
               BitField("id", None, 4)
               ]
  
  
  class ApduFlags(Packet):
      """APDU Flags Section 10.5.2.49"""
      name = "Apdu Flags"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("cr", 0x0, 1),
               BitField("firstSeg", 0x0, 1),
               BitField("lastSeg", 0x0, 1)
               ]
  
  
  # len 1 to max L3 (251) (done)
  class ApduData(Packet):
      """APDU Data Section 10.5.2.50"""
      name = "Apdu Data"
      fields_desc = [
               XByteField("lengthAD", None),
               #optional
               ByteField("apuInfo1", None),
               ByteField("apuInfo2", None),
               ByteField("apuInfo3", None),
               ByteField("apuInfo4", None),
               ByteField("apuInfo5", None),
               ByteField("apuInfo6", None),
               ByteField("apuInfo7", None),
               ByteField("apuInfo8", None),
               ByteField("apuInfo9", None),
               ByteField("apuInfo10", None),
               ByteField("apuInfo11", None),
               ByteField("apuInfo12", None),
               ByteField("apuInfo13", None),
               ByteField("apuInfo14", None),
               ByteField("apuInfo15", None),
               ByteField("apuInfo16", None),
               ByteField("apuInfo17", None),
               ByteField("apuInfo18", None),
               ByteField("apuInfo19", None),
               ByteField("apuInfo20", None),
               ByteField("apuInfo21", None),
               ByteField("apuInfo22", None),
               ByteField("apuInfo23", None),
               ByteField("apuInfo24", None),
               ByteField("apuInfo25", None),
               ByteField("apuInfo26", None),
               ByteField("apuInfo27", None),
               ByteField("apuInfo28", None),
               ByteField("apuInfo29", None),
               ByteField("apuInfo30", None),
               ByteField("apuInfo31", None),
               ByteField("apuInfo32", None),
               ByteField("apuInfo33", None),
               ByteField("apuInfo34", None),
               ByteField("apuInfo35", None),
               ByteField("apuInfo36", None),
               ByteField("apuInfo37", None),
               ByteField("apuInfo38", None),
               ByteField("apuInfo39", None),
               ByteField("apuInfo40", None),
               ByteField("apuInfo41", None),
               ByteField("apuInfo42", None),
               ByteField("apuInfo43", None),
               ByteField("apuInfo44", None),
               ByteField("apuInfo45", None),
               ByteField("apuInfo46", None),
               ByteField("apuInfo47", None),
               ByteField("apuInfo48", None),
               ByteField("apuInfo49", None),
               ByteField("apuInfo50", None),
               ByteField("apuInfo51", None),
               ByteField("apuInfo52", None),
               ByteField("apuInfo53", None),
               ByteField("apuInfo54", None),
               ByteField("apuInfo55", None),
               ByteField("apuInfo56", None),
               ByteField("apuInfo57", None),
               ByteField("apuInfo58", None),
               ByteField("apuInfo59", None),
               ByteField("apuInfo60", None),
               ByteField("apuInfo61", None),
               ByteField("apuInfo62", None),
               ByteField("apuInfo63", None),
               ByteField("apuInfo64", None),
               ByteField("apuInfo65", None),
               ByteField("apuInfo66", None),
               ByteField("apuInfo67", None),
               ByteField("apuInfo68", None),
               ByteField("apuInfo69", None),
               ByteField("apuInfo70", None),
               ByteField("apuInfo71", None),
               ByteField("apuInfo72", None),
               ByteField("apuInfo73", None),
               ByteField("apuInfo74", None),
               ByteField("apuInfo75", None),
               ByteField("apuInfo76", None),
               ByteField("apuInfo77", None),
               ByteField("apuInfo78", None),
               ByteField("apuInfo79", None),
               ByteField("apuInfo80", None),
               ByteField("apuInfo81", None),
               ByteField("apuInfo82", None),
               ByteField("apuInfo83", None),
               ByteField("apuInfo84", None),
               ByteField("apuInfo85", None),
               ByteField("apuInfo86", None),
               ByteField("apuInfo87", None),
               ByteField("apuInfo88", None),
               ByteField("apuInfo89", None),
               ByteField("apuInfo90", None),
               ByteField("apuInfo91", None),
               ByteField("apuInfo92", None),
               ByteField("apuInfo93", None),
               ByteField("apuInfo94", None),
               ByteField("apuInfo95", None),
               ByteField("apuInfo96", None),
               ByteField("apuInfo97", None),
               ByteField("apuInfo98", None),
               ByteField("apuInfo99", None),
               ByteField("apuInfo100", None),
               ByteField("apuInfo101", None),
               ByteField("apuInfo102", None),
               ByteField("apuInfo103", None),
               ByteField("apuInfo104", None),
               ByteField("apuInfo105", None),
               ByteField("apuInfo106", None),
               ByteField("apuInfo107", None),
               ByteField("apuInfo108", None),
               ByteField("apuInfo109", None),
               ByteField("apuInfo110", None),
               ByteField("apuInfo111", None),
               ByteField("apuInfo112", None),
               ByteField("apuInfo113", None),
               ByteField("apuInfo114", None),
               ByteField("apuInfo115", None),
               ByteField("apuInfo116", None),
               ByteField("apuInfo117", None),
               ByteField("apuInfo118", None),
               ByteField("apuInfo119", None),
               ByteField("apuInfo120", None),
               ByteField("apuInfo121", None),
               ByteField("apuInfo122", None),
               ByteField("apuInfo123", None),
               ByteField("apuInfo124", None),
               ByteField("apuInfo125", None),
               ByteField("apuInfo126", None),
               ByteField("apuInfo127", None),
               ByteField("apuInfo128", None),
               ByteField("apuInfo129", None),
               ByteField("apuInfo130", None),
               ByteField("apuInfo131", None),
               ByteField("apuInfo132", None),
               ByteField("apuInfo133", None),
               ByteField("apuInfo134", None),
               ByteField("apuInfo135", None),
               ByteField("apuInfo136", None),
               ByteField("apuInfo137", None),
               ByteField("apuInfo138", None),
               ByteField("apuInfo139", None),
               ByteField("apuInfo140", None),
               ByteField("apuInfo141", None),
               ByteField("apuInfo142", None),
               ByteField("apuInfo143", None),
               ByteField("apuInfo144", None),
               ByteField("apuInfo145", None),
               ByteField("apuInfo146", None),
               ByteField("apuInfo147", None),
               ByteField("apuInfo148", None),
               ByteField("apuInfo149", None),
               ByteField("apuInfo150", None),
               ByteField("apuInfo151", None),
               ByteField("apuInfo152", None),
               ByteField("apuInfo153", None),
               ByteField("apuInfo154", None),
               ByteField("apuInfo155", None),
               ByteField("apuInfo156", None),
               ByteField("apuInfo157", None),
               ByteField("apuInfo158", None),
               ByteField("apuInfo159", None),
               ByteField("apuInfo160", None),
               ByteField("apuInfo161", None),
               ByteField("apuInfo162", None),
               ByteField("apuInfo163", None),
               ByteField("apuInfo164", None),
               ByteField("apuInfo165", None),
               ByteField("apuInfo166", None),
               ByteField("apuInfo167", None),
               ByteField("apuInfo168", None),
               ByteField("apuInfo169", None),
               ByteField("apuInfo170", None),
               ByteField("apuInfo171", None),
               ByteField("apuInfo172", None),
               ByteField("apuInfo173", None),
               ByteField("apuInfo174", None),
               ByteField("apuInfo175", None),
               ByteField("apuInfo176", None),
               ByteField("apuInfo177", None),
               ByteField("apuInfo178", None),
               ByteField("apuInfo179", None),
               ByteField("apuInfo180", None),
               ByteField("apuInfo181", None),
               ByteField("apuInfo182", None),
               ByteField("apuInfo183", None),
               ByteField("apuInfo184", None),
               ByteField("apuInfo185", None),
               ByteField("apuInfo186", None),
               ByteField("apuInfo187", None),
               ByteField("apuInfo188", None),
               ByteField("apuInfo189", None),
               ByteField("apuInfo190", None),
               ByteField("apuInfo191", None),
               ByteField("apuInfo192", None),
               ByteField("apuInfo193", None),
               ByteField("apuInfo194", None),
               ByteField("apuInfo195", None),
               ByteField("apuInfo196", None),
               ByteField("apuInfo197", None),
               ByteField("apuInfo198", None),
               ByteField("apuInfo199", None),
               ByteField("apuInfo200", None),
               ByteField("apuInfo201", None),
               ByteField("apuInfo202", None),
               ByteField("apuInfo203", None),
               ByteField("apuInfo204", None),
               ByteField("apuInfo205", None),
               ByteField("apuInfo206", None),
               ByteField("apuInfo207", None),
               ByteField("apuInfo208", None),
               ByteField("apuInfo209", None),
               ByteField("apuInfo210", None),
               ByteField("apuInfo211", None),
               ByteField("apuInfo212", None),
               ByteField("apuInfo213", None),
               ByteField("apuInfo214", None),
               ByteField("apuInfo215", None),
               ByteField("apuInfo216", None),
               ByteField("apuInfo217", None),
               ByteField("apuInfo218", None),
               ByteField("apuInfo219", None),
               ByteField("apuInfo220", None),
               ByteField("apuInfo221", None),
               ByteField("apuInfo222", None),
               ByteField("apuInfo223", None),
               ByteField("apuInfo224", None),
               ByteField("apuInfo225", None),
               ByteField("apuInfo226", None),
               ByteField("apuInfo227", None),
               ByteField("apuInfo228", None),
               ByteField("apuInfo229", None),
               ByteField("apuInfo230", None),
               ByteField("apuInfo231", None),
               ByteField("apuInfo232", None),
               ByteField("apuInfo233", None),
               ByteField("apuInfo234", None),
               ByteField("apuInfo235", None),
               ByteField("apuInfo236", None),
               ByteField("apuInfo237", None),
               ByteField("apuInfo238", None),
               ByteField("apuInfo239", None),
               ByteField("apuInfo240", None),
               ByteField("apuInfo241", None),
               ByteField("apuInfo242", None),
               ByteField("apuInfo243", None),
               ByteField("apuInfo244", None),
               ByteField("apuInfo245", None),
               ByteField("apuInfo246", None),
               ByteField("apuInfo247", None),
               ByteField("apuInfo248", None),
               ByteField("apuInfo249", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 250, a, self.fields_desc, 1)
          if self.lengthAD is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  #
  # 10.5.3 Mobility management information elements
  #
  
  
  # len 3 to L3 max (251) (done)
  class NetworkName(Packet):
      """Network Name Section 10.5.3.5a"""
      name = "Network Name"
      fields_desc = [
  
               XByteField("lengthNN", None),
  
               BitField("ext", 0x1, 1),
               BitField("codingScheme", 0x0, 3),
               BitField("addCi", 0x0, 1),
               BitField("nbSpare", 0x0, 3),
               # optional
               ByteField("txtString1", None),
               ByteField("txtString2", None),
               ByteField("txtString3", None),
               ByteField("txtString4", None),
               ByteField("txtString5", None),
               ByteField("txtString6", None),
               ByteField("txtString7", None),
               ByteField("txtString8", None),
               ByteField("txtString9", None),
               ByteField("txtString10", None),
               ByteField("txtString11", None),
               ByteField("txtString12", None),
               ByteField("txtString13", None),
               ByteField("txtString14", None),
               ByteField("txtString15", None),
               ByteField("txtString16", None),
               ByteField("txtString17", None),
               ByteField("txtString18", None),
               ByteField("txtString19", None),
               ByteField("txtString20", None),
               ByteField("txtString21", None),
               ByteField("txtString22", None),
               ByteField("txtString23", None),
               ByteField("txtString24", None),
               ByteField("txtString25", None),
               ByteField("txtString26", None),
               ByteField("txtString27", None),
               ByteField("txtString28", None),
               ByteField("txtString29", None),
               ByteField("txtString30", None),
               ByteField("txtString31", None),
               ByteField("txtString32", None),
               ByteField("txtString33", None),
               ByteField("txtString34", None),
               ByteField("txtString35", None),
               ByteField("txtString36", None),
               ByteField("txtString37", None),
               ByteField("txtString38", None),
               ByteField("txtString39", None),
               ByteField("txtString40", None),
               ByteField("txtString41", None),
               ByteField("txtString42", None),
               ByteField("txtString43", None),
               ByteField("txtString44", None),
               ByteField("txtString45", None),
               ByteField("txtString46", None),
               ByteField("txtString47", None),
               ByteField("txtString48", None),
               ByteField("txtString49", None),
               ByteField("txtString50", None),
               ByteField("txtString51", None),
               ByteField("txtString52", None),
               ByteField("txtString53", None),
               ByteField("txtString54", None),
               ByteField("txtString55", None),
               ByteField("txtString56", None),
               ByteField("txtString57", None),
               ByteField("txtString58", None),
               ByteField("txtString59", None),
               ByteField("txtString60", None),
               ByteField("txtString61", None),
               ByteField("txtString62", None),
               ByteField("txtString63", None),
               ByteField("txtString64", None),
               ByteField("txtString65", None),
               ByteField("txtString66", None),
               ByteField("txtString67", None),
               ByteField("txtString68", None),
               ByteField("txtString69", None),
               ByteField("txtString70", None),
               ByteField("txtString71", None),
               ByteField("txtString72", None),
               ByteField("txtString73", None),
               ByteField("txtString74", None),
               ByteField("txtString75", None),
               ByteField("txtString76", None),
               ByteField("txtString77", None),
               ByteField("txtString78", None),
               ByteField("txtString79", None),
               ByteField("txtString80", None),
               ByteField("txtString81", None),
               ByteField("txtString82", None),
               ByteField("txtString83", None),
               ByteField("txtString84", None),
               ByteField("txtString85", None),
               ByteField("txtString86", None),
               ByteField("txtString87", None),
               ByteField("txtString88", None),
               ByteField("txtString89", None),
               ByteField("txtString90", None),
               ByteField("txtString91", None),
               ByteField("txtString92", None),
               ByteField("txtString93", None),
               ByteField("txtString94", None),
               ByteField("txtString95", None),
               ByteField("txtString96", None),
               ByteField("txtString97", None),
               ByteField("txtString98", None),
               ByteField("txtString99", None),
               ByteField("txtString100", None),
               ByteField("txtString101", None),
               ByteField("txtString102", None),
               ByteField("txtString103", None),
               ByteField("txtString104", None),
               ByteField("txtString105", None),
               ByteField("txtString106", None),
               ByteField("txtString107", None),
               ByteField("txtString108", None),
               ByteField("txtString109", None),
               ByteField("txtString110", None),
               ByteField("txtString111", None),
               ByteField("txtString112", None),
               ByteField("txtString113", None),
               ByteField("txtString114", None),
               ByteField("txtString115", None),
               ByteField("txtString116", None),
               ByteField("txtString117", None),
               ByteField("txtString118", None),
               ByteField("txtString119", None),
               ByteField("txtString120", None),
               ByteField("txtString121", None),
               ByteField("txtString122", None),
               ByteField("txtString123", None),
               ByteField("txtString124", None),
               ByteField("txtString125", None),
               ByteField("txtString126", None),
               ByteField("txtString127", None),
               ByteField("txtString128", None),
               ByteField("txtString129", None),
               ByteField("txtString130", None),
               ByteField("txtString131", None),
               ByteField("txtString132", None),
               ByteField("txtString133", None),
               ByteField("txtString134", None),
               ByteField("txtString135", None),
               ByteField("txtString136", None),
               ByteField("txtString137", None),
               ByteField("txtString138", None),
               ByteField("txtString139", None),
               ByteField("txtString140", None),
               ByteField("txtString141", None),
               ByteField("txtString142", None),
               ByteField("txtString143", None),
               ByteField("txtString144", None),
               ByteField("txtString145", None),
               ByteField("txtString146", None),
               ByteField("txtString147", None),
               ByteField("txtString148", None),
               ByteField("txtString149", None),
               ByteField("txtString150", None),
               ByteField("txtString151", None),
               ByteField("txtString152", None),
               ByteField("txtString153", None),
               ByteField("txtString154", None),
               ByteField("txtString155", None),
               ByteField("txtString156", None),
               ByteField("txtString157", None),
               ByteField("txtString158", None),
               ByteField("txtString159", None),
               ByteField("txtString160", None),
               ByteField("txtString161", None),
               ByteField("txtString162", None),
               ByteField("txtString163", None),
               ByteField("txtString164", None),
               ByteField("txtString165", None),
               ByteField("txtString166", None),
               ByteField("txtString167", None),
               ByteField("txtString168", None),
               ByteField("txtString169", None),
               ByteField("txtString170", None),
               ByteField("txtString171", None),
               ByteField("txtString172", None),
               ByteField("txtString173", None),
               ByteField("txtString174", None),
               ByteField("txtString175", None),
               ByteField("txtString176", None),
               ByteField("txtString177", None),
               ByteField("txtString178", None),
               ByteField("txtString179", None),
               ByteField("txtString180", None),
               ByteField("txtString181", None),
               ByteField("txtString182", None),
               ByteField("txtString183", None),
               ByteField("txtString184", None),
               ByteField("txtString185", None),
               ByteField("txtString186", None),
               ByteField("txtString187", None),
               ByteField("txtString188", None),
               ByteField("txtString189", None),
               ByteField("txtString190", None),
               ByteField("txtString191", None),
               ByteField("txtString192", None),
               ByteField("txtString193", None),
               ByteField("txtString194", None),
               ByteField("txtString195", None),
               ByteField("txtString196", None),
               ByteField("txtString197", None),
               ByteField("txtString198", None),
               ByteField("txtString199", None),
               ByteField("txtString200", None),
               ByteField("txtString201", None),
               ByteField("txtString202", None),
               ByteField("txtString203", None),
               ByteField("txtString204", None),
               ByteField("txtString205", None),
               ByteField("txtString206", None),
               ByteField("txtString207", None),
               ByteField("txtString208", None),
               ByteField("txtString209", None),
               ByteField("txtString210", None),
               ByteField("txtString211", None),
               ByteField("txtString212", None),
               ByteField("txtString213", None),
               ByteField("txtString214", None),
               ByteField("txtString215", None),
               ByteField("txtString216", None),
               ByteField("txtString217", None),
               ByteField("txtString218", None),
               ByteField("txtString219", None),
               ByteField("txtString220", None),
               ByteField("txtString221", None),
               ByteField("txtString222", None),
               ByteField("txtString223", None),
               ByteField("txtString224", None),
               ByteField("txtString225", None),
               ByteField("txtString226", None),
               ByteField("txtString227", None),
               ByteField("txtString228", None),
               ByteField("txtString229", None),
               ByteField("txtString230", None),
               ByteField("txtString231", None),
               ByteField("txtString232", None),
               ByteField("txtString233", None),
               ByteField("txtString234", None),
               ByteField("txtString235", None),
               ByteField("txtString236", None),
               ByteField("txtString237", None),
               ByteField("txtString238", None),
               ByteField("txtString239", None),
               ByteField("txtString240", None),
               ByteField("txtString241", None),
               ByteField("txtString242", None),
               ByteField("txtString243", None),
               ByteField("txtString244", None),
               ByteField("txtString245", None),
               ByteField("txtString246", None),
               ByteField("txtString247", None),
               ByteField("txtString248", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 250, a, self.fields_desc, 1)
          if self.lengthNN is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class TimeZone(Packet):
      """Time Zone  Section 10.5.3.8"""
      name = "Time Zone"
      fields_desc = [
               ByteField("timeZone", 0x0),
               ]
  
  
  class TimeZoneAndTime(Packet):
      """Time Zone and Time Section 10.5.3.9"""
      name = "Time Zone and Time"
      fields_desc = [
               ByteField("year", 0x0),
               ByteField("month", 0x0),
               ByteField("day", 0x0),
               ByteField("hour", 0x0),
               ByteField("minute", 0x0),
               ByteField("second", 0x0),
               ByteField("timeZone", 0x0)
               ]
  
  
  class CtsPermission(Packet):
      """CTS permission Section 10.5.3.10"""
      name = "Cts Permission"
      fields_desc = [
               ]
  
  
  class LsaIdentifier(Packet):
      """LSA Identifier Section 10.5.3.11"""
      name = "Lsa Identifier"
      fields_desc = [
               ByteField("lsaID", 0x0),
               ByteField("lsaID1", 0x0),
               ByteField("lsaID2", 0x0)
               ]
  
  
  #
  # 10.5.4 Call control information elements
  #
  
  #10.5.4.1 Extensions of codesets
  # This is only text and no  packet
  
  class LockingShiftProcedure(Packet):
      """Locking shift procedure Section 10.5.4.2"""
      name = "Locking Shift Procedure"
      fields_desc = [
               BitField("lockShift", 0x0, 1),
               BitField("codesetId", 0x0, 3)
               ]
  
  
  class NonLockingShiftProcedure(Packet):
      """Non-locking shift procedure Section 10.5.4.3"""
      name = "Non-locking Shift Procedure"
      fields_desc = [
               BitField("nonLockShift", 0x1, 1),
               BitField("codesetId", 0x0, 3)
               ]
  
  
  class AuxiliaryStates(Packet):
      """Auxiliary states Section 10.5.4.4"""
      name = "Auxiliary States"
      fields_desc = [
               XByteField("lengthAS", 0x3),
               BitField("ext", 0x1, 1),
               BitField("spare", 0x0, 3),
               BitField("holdState", 0x0, 2),
               BitField("mptyState", 0x0, 2)
               ]
  
  
  # len 3 to 15
  class BearerCapability(Packet):
      """Bearer capability Section 10.5.4.5"""
      name = "Bearer Capability"
      fields_desc = [
  
               XByteField("lengthBC", None),
  
               BitField("ext0", 0x1, 1),
               BitField("radioChReq", 0x1, 2),
               BitField("codingStd", 0x0, 1),
               BitField("transMode", 0x0, 1),
               BitField("infoTransCa", 0x0, 3),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                         lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("coding", None, 1),
                                         lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("spare", None, 2),
                                         lambda pkt: pkt.ext0 == 0),
               ConditionalField(BitField("speechVers", 0x0, 4),
                                         lambda pkt: pkt.ext0 == 0),
  
               ConditionalField(BitField("ext2", 0x1, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("compress", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("structure", None, 2),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("dupMode", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("config", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("nirr", None, 1),
                                         lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("establi", 0x0, 1),
                                         lambda pkt: pkt.ext1 == 0),
  
               BitField("ext3", None, 1),
               BitField("accessId", None, 2),
               BitField("rateAda", None, 2),
               BitField("signaling", None, 3),
  
               ConditionalField(BitField("ext4", None, 1),
                                         lambda pkt: pkt.ext3 == 0),
               ConditionalField(BitField("otherITC", None, 2),
                                         lambda pkt: pkt.ext3 == 0),
               ConditionalField(BitField("otherRate", None, 2),
                                         lambda pkt: pkt.ext3 == 0),
               ConditionalField(BitField("spare1", 0x0, 3),
                                         lambda pkt: pkt.ext3 == 0),
  
               ConditionalField(BitField("ext5", 0x1, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("hdr", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("multiFr", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("mode", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("lli", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("assig", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("inbNeg", None, 1),
                                         lambda pkt: pkt.ext4 == 0),
               ConditionalField(BitField("spare2", 0x0, 1),
                                         lambda pkt: pkt.ext4 == 0),
  
               BitField("ext6", None, 1),
               BitField("layer1Id", None, 2),
               BitField("userInf", None, 4),
               BitField("sync", None, 1),
  
               ConditionalField(BitField("ext7", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("stopBit", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("negoc", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("nbDataBit", None, 1),
                                         lambda pkt: pkt.ext6 == 0),
               ConditionalField(BitField("userRate", None, 4),
                                         lambda pkt: pkt.ext6 == 0),
  
               ConditionalField(BitField("ext8", None, 1),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("interRate", None, 2),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("nicTX", None, 1),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("nicRX", None, 1),
                                         lambda pkt: pkt.ext7 == 0),
               ConditionalField(BitField("parity", None, 3),
                                         lambda pkt: pkt.ext7 == 0),
  
               ConditionalField(BitField("ext9", None, 1),
                                         lambda pkt: pkt.ext8 == 0),
               ConditionalField(BitField("connEle", None, 2),
                                         lambda pkt: pkt.ext8 == 0),
               ConditionalField(BitField("modemType", None, 5),
                                         lambda pkt: pkt.ext8 == 0),
  
               ConditionalField(BitField("ext10", None, 1),
                                         lambda pkt: pkt.ext9 == 0),
               ConditionalField(BitField("otherModemType", None, 2),
                                         lambda pkt: pkt.ext9 == 0),
               ConditionalField(BitField("netUserRate", None, 5),
                                         lambda pkt: pkt.ext9 == 0),
  
               ConditionalField(BitField("ext11", None, 1),
                                         lambda pkt: pkt.ext10 == 0),
               ConditionalField(BitField("chanCoding", None, 4),
                                         lambda pkt: pkt.ext10 == 0),
               ConditionalField(BitField("maxTrafficChan", None, 3),
                                         lambda pkt: pkt.ext10 == 0),
  
               ConditionalField(BitField("ext12", None, 1),
                                         lambda pkt: pkt.ext11 == 0),
               ConditionalField(BitField("uimi", None, 3),
                                         lambda pkt: pkt.ext11 == 0),
               ConditionalField(BitField("airInterfaceUserRate", None, 4),
                                         lambda pkt: pkt.ext11 == 0),
  
               ConditionalField(BitField("ext13", 0x1, 1),
                                         lambda pkt: pkt.ext12 == 0),
               ConditionalField(BitField("layer2Ch", None, 2),
                                         lambda pkt: pkt.ext12 == 0),
               ConditionalField(BitField("userInfoL2", 0x0, 5),
                                         lambda pkt: pkt.ext12 == 0)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 15, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthBC is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  
  
  class CallControlCapabilities(Packet):
      """Call Control Capabilities Section 10.5.4.5a"""
      name = "Call Control Capabilities"
      fields_desc = [
               XByteField("lengthCCC", 0x3),
               BitField("spare", 0x0, 6),
               BitField("pcp", 0x0, 1),
               BitField("dtmf", 0x0, 1)
               ]
  
  
  class CallState(Packet):
      """Call State Section 10.5.4.6"""
      name = "Call State"
      fields_desc = [
               BitField("codingStd", 0x0, 2),
               BitField("stateValue", 0x0, 6)
               ]
  
  
  # len 3 to 43
  class CalledPartyBcdNumber(Packet):
      """Called party BCD number Section 10.5.4.7"""
      name = "Called Party BCD Number"
      fields_desc = [
               XByteField("lengthCPBN", None),
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("nbPlanId", 0x0, 4),
               # optional
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4),
  
               BitField("nbDigit22", None, 4),
               BitField("nbDigit21", None, 4),
               BitField("nbDigit24", None, 4),
               BitField("nbDigit23", None, 4),
  
               BitField("nbDigit26", None, 4),
               BitField("nbDigit25", None, 4),
               BitField("nbDigit28", None, 4),
               BitField("nbDigit27", None, 4),
  
               BitField("nbDigit30", None, 4),
               BitField("nbDigit29", None, 4),
               BitField("nbDigit32", None, 4),
               BitField("nbDigit31", None, 4),
  
               BitField("nbDigit34", None, 4),
               BitField("nbDigit33", None, 4),
               BitField("nbDigit36", None, 4),
               BitField("nbDigit35", None, 4),
  
               BitField("nbDigit38", None, 4),
               BitField("nbDigit37", None, 4),
               BitField("nbDigit40", None, 4),
               BitField("nbDigit39", None, 4),
  # ^^^^^^ 20 first optional bytes ^^^^^^^^^^^^^^^
               BitField("nbDigit42", None, 4),
               BitField("nbDigit41", None, 4),
               BitField("nbDigit44", None, 4),
               BitField("nbDigit43", None, 4),
  
               BitField("nbDigit46", None, 4),
               BitField("nbDigit45", None, 4),
               BitField("nbDigit48", None, 4),
               BitField("nbDigit47", None, 4),
  
               BitField("nbDigit50", None, 4),
               BitField("nbDigit49", None, 4),
               BitField("nbDigit52", None, 4),
               BitField("nbDigit51", None, 4),
  
               BitField("nbDigit54", None, 4),
               BitField("nbDigit53", None, 4),
               BitField("nbDigit56", None, 4),
               BitField("nbDigit55", None, 4),
  
               BitField("nbDigit58", None, 4),
               BitField("nbDigit57", None, 4),
               BitField("nbDigit60", None, 4),
               BitField("nbDigit59", None, 4),
  
               BitField("nbDigit62", None, 4),
               BitField("nbDigit61", None, 4),
               BitField("nbDigit64", None, 4),
               BitField("nbDigit63", None, 4),
  
               BitField("nbDigit66", None, 4),
               BitField("nbDigit65", None, 4),
               BitField("nbDigit68", None, 4),
               BitField("nbDigit67", None, 4),
  
               BitField("nbDigit70", None, 4),
               BitField("nbDigit69", None, 4),
               BitField("nbDigit72", None, 4),
               BitField("nbDigit71", None, 4),
  
               BitField("nbDigit74", None, 4),
               BitField("nbDigit73", None, 4),
               BitField("nbDigit76", None, 4),
               BitField("nbDigit75", None, 4),
  
               BitField("nbDigit78", None, 4),
               BitField("nbDigit77", None, 4),
               BitField("nbDigit80", None, 4),
               BitField("nbDigit79", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 42, a, self.fields_desc, 1)
          if self.lengthCPBN is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 2 to 23
  class CalledPartySubaddress(Packet):
      """Called party subaddress Section 10.5.4.8"""
      name = "Called Party Subaddress"
      fields_desc = [
               XByteField("lengthCPS", None),
               # optional
               BitField("ext", None, 1),
               BitField("subAddr", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 23, a, self.fields_desc, 1)
          if self.lengthCPS is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 3 to 14
  class CallingPartyBcdNumber(Packet):
      """Called party subaddress Section 10.5.4.9"""
      name = "Called Party Subaddress"
      fields_desc = [
               XByteField("lengthCPBN", None),
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("nbPlanId", 0x0, 4),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                               lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("presId", None, 2),
                               lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("spare", None, 3),
                               lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("screenId", 0x0, 2),
                               lambda pkt: pkt.ext == 0),
  
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
  
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
  
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
  
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
  
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
  
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 13, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthCPBN is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  
  
  # len 2 to 23
  class CallingPartySubaddress(Packet):
      """Calling party subaddress  Section 10.5.4.10"""
      name = "Calling Party Subaddress"
      fields_desc = [
               XByteField("lengthCPS", None),
               # optional
               BitField("ext1", None, 1),
               BitField("typeAddr", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 22, a, self.fields_desc, 1)
          if self.lengthCPS is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 4 to 32
  class Cause(Packet):
      """Cause Section 10.5.4.11"""
      name = "Cause"
      fields_desc = [
  
               XByteField("lengthC", None),
  
               BitField("ext", 0x1, 1),
               BitField("codingStd", 0x0, 2),
               BitField("spare", 0x0, 1),
               BitField("location", 0x0, 4),
  
               ConditionalField(BitField("ext1", 0x1, 1),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("recommendation", 0x1, 7),
                                lambda pkt: pkt.ext == 0),
               # optional
               BitField("ext2", None, 1),
               BitField("causeValue", None, 7),
  
               ByteField("diagnositc0", None),
               ByteField("diagnositc1", None),
               ByteField("diagnositc2", None),
               ByteField("diagnositc3", None),
               ByteField("diagnositc4", None),
               ByteField("diagnositc5", None),
               ByteField("diagnositc6", None),
               ByteField("diagnositc7", None),
               ByteField("diagnositc8", None),
               ByteField("diagnositc9", None),
               ByteField("diagnositc10", None),
               ByteField("diagnositc11", None),
               ByteField("diagnositc12", None),
               ByteField("diagnositc13", None),
               ByteField("diagnositc14", None),
               ByteField("diagnositc15", None),
               ByteField("diagnositc16", None),
               ByteField("diagnositc17", None),
               ByteField("diagnositc18", None),
               ByteField("diagnositc19", None),
               ByteField("diagnositc20", None),
               ByteField("diagnositc21", None),
               ByteField("diagnositc22", None),
               ByteField("diagnositc23", None),
               ByteField("diagnositc24", None),
               ByteField("diagnositc25", None),
               ByteField("diagnositc26", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(3, 31, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthC is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  
  
  class ClirSuppression(Packet):
      """CLIR suppression Section 10.5.4.11a"""
      name = "Clir Suppression"
      fields_desc = [
               ]
  
  
  class ClirInvocation(Packet):
      """CLIR invocation Section 10.5.4.11b"""
      name = "Clir Invocation"
      fields_desc = [
               ]
  
  
  class CongestionLevel(Packet):
      """Congestion level Section 10.5.4.12"""
      name = "Congestion Level"
      fields_desc = [
               BitField("notDef", 0x0, 4)  # not defined by the std
               ]
  
  
  # len 3 to 14
  class ConnectedNumber(Packet):
      """Connected number Section 10.5.4.13"""
      name = "Connected Number"
      fields_desc = [
  
               XByteField("lengthCN", None),
  
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("typePlanId", 0x0, 4),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("presId", None, 2),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("spare", None, 3),
                                lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("screenId", None, 2),
                                lambda pkt: pkt.ext == 0),
  
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
  
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
  
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
  
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
  
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
  
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 13, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthCN is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  
  
  # len 2 to 23
  class ConnectedSubaddress(Packet):
      """Connected subaddress Section 10.5.4.14"""
      name = "Connected Subaddress"
      fields_desc = [
  
               XByteField("lengthCS", None),
               # optional
               BitField("ext", None, 1),
               BitField("typeOfSub", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 22, a, self.fields_desc, 1)
          if self.lengthCS is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # len 2 to L3 (251) (done)
  class Facility(Packet):
      """Facility Section 10.5.4.15"""
      name = "Facility"
      fields_desc = [
               XByteField("lengthF", None),
               # optional
               ByteField("facilityInfo1", None),
               ByteField("facilityInfo2", None),
               ByteField("facilityInfo3", None),
               ByteField("facilityInfo4", None),
               ByteField("facilityInfo5", None),
               ByteField("facilityInfo6", None),
               ByteField("facilityInfo7", None),
               ByteField("facilityInfo8", None),
               ByteField("facilityInfo9", None),
               ByteField("facilityInfo10", None),
               ByteField("facilityInfo11", None),
               ByteField("facilityInfo12", None),
               ByteField("facilityInfo13", None),
               ByteField("facilityInfo14", None),
               ByteField("facilityInfo15", None),
               ByteField("facilityInfo16", None),
               ByteField("facilityInfo17", None),
               ByteField("facilityInfo18", None),
               ByteField("facilityInfo19", None),
               ByteField("facilityInfo20", None),
               ByteField("facilityInfo21", None),
               ByteField("facilityInfo22", None),
               ByteField("facilityInfo23", None),
               ByteField("facilityInfo24", None),
               ByteField("facilityInfo25", None),
               ByteField("facilityInfo26", None),
               ByteField("facilityInfo27", None),
               ByteField("facilityInfo28", None),
               ByteField("facilityInfo29", None),
               ByteField("facilityInfo30", None),
               ByteField("facilityInfo31", None),
               ByteField("facilityInfo32", None),
               ByteField("facilityInfo33", None),
               ByteField("facilityInfo34", None),
               ByteField("facilityInfo35", None),
               ByteField("facilityInfo36", None),
               ByteField("facilityInfo37", None),
               ByteField("facilityInfo38", None),
               ByteField("facilityInfo39", None),
               ByteField("facilityInfo40", None),
               ByteField("facilityInfo41", None),
               ByteField("facilityInfo42", None),
               ByteField("facilityInfo43", None),
               ByteField("facilityInfo44", None),
               ByteField("facilityInfo45", None),
               ByteField("facilityInfo46", None),
               ByteField("facilityInfo47", None),
               ByteField("facilityInfo48", None),
               ByteField("facilityInfo49", None),
               ByteField("facilityInfo50", None),
               ByteField("facilityInfo51", None),
               ByteField("facilityInfo52", None),
               ByteField("facilityInfo53", None),
               ByteField("facilityInfo54", None),
               ByteField("facilityInfo55", None),
               ByteField("facilityInfo56", None),
               ByteField("facilityInfo57", None),
               ByteField("facilityInfo58", None),
               ByteField("facilityInfo59", None),
               ByteField("facilityInfo60", None),
               ByteField("facilityInfo61", None),
               ByteField("facilityInfo62", None),
               ByteField("facilityInfo63", None),
               ByteField("facilityInfo64", None),
               ByteField("facilityInfo65", None),
               ByteField("facilityInfo66", None),
               ByteField("facilityInfo67", None),
               ByteField("facilityInfo68", None),
               ByteField("facilityInfo69", None),
               ByteField("facilityInfo70", None),
               ByteField("facilityInfo71", None),
               ByteField("facilityInfo72", None),
               ByteField("facilityInfo73", None),
               ByteField("facilityInfo74", None),
               ByteField("facilityInfo75", None),
               ByteField("facilityInfo76", None),
               ByteField("facilityInfo77", None),
               ByteField("facilityInfo78", None),
               ByteField("facilityInfo79", None),
               ByteField("facilityInfo80", None),
               ByteField("facilityInfo81", None),
               ByteField("facilityInfo82", None),
               ByteField("facilityInfo83", None),
               ByteField("facilityInfo84", None),
               ByteField("facilityInfo85", None),
               ByteField("facilityInfo86", None),
               ByteField("facilityInfo87", None),
               ByteField("facilityInfo88", None),
               ByteField("facilityInfo89", None),
               ByteField("facilityInfo90", None),
               ByteField("facilityInfo91", None),
               ByteField("facilityInfo92", None),
               ByteField("facilityInfo93", None),
               ByteField("facilityInfo94", None),
               ByteField("facilityInfo95", None),
               ByteField("facilityInfo96", None),
               ByteField("facilityInfo97", None),
               ByteField("facilityInfo98", None),
               ByteField("facilityInfo99", None),
               ByteField("facilityInfo100", None),
               ByteField("facilityInfo101", None),
               ByteField("facilityInfo102", None),
               ByteField("facilityInfo103", None),
               ByteField("facilityInfo104", None),
               ByteField("facilityInfo105", None),
               ByteField("facilityInfo106", None),
               ByteField("facilityInfo107", None),
               ByteField("facilityInfo108", None),
               ByteField("facilityInfo109", None),
               ByteField("facilityInfo110", None),
               ByteField("facilityInfo111", None),
               ByteField("facilityInfo112", None),
               ByteField("facilityInfo113", None),
               ByteField("facilityInfo114", None),
               ByteField("facilityInfo115", None),
               ByteField("facilityInfo116", None),
               ByteField("facilityInfo117", None),
               ByteField("facilityInfo118", None),
               ByteField("facilityInfo119", None),
               ByteField("facilityInfo120", None),
               ByteField("facilityInfo121", None),
               ByteField("facilityInfo122", None),
               ByteField("facilityInfo123", None),
               ByteField("facilityInfo124", None),
               ByteField("facilityInfo125", None),
               ByteField("facilityInfo126", None),
               ByteField("facilityInfo127", None),
               ByteField("facilityInfo128", None),
               ByteField("facilityInfo129", None),
               ByteField("facilityInfo130", None),
               ByteField("facilityInfo131", None),
               ByteField("facilityInfo132", None),
               ByteField("facilityInfo133", None),
               ByteField("facilityInfo134", None),
               ByteField("facilityInfo135", None),
               ByteField("facilityInfo136", None),
               ByteField("facilityInfo137", None),
               ByteField("facilityInfo138", None),
               ByteField("facilityInfo139", None),
               ByteField("facilityInfo140", None),
               ByteField("facilityInfo141", None),
               ByteField("facilityInfo142", None),
               ByteField("facilityInfo143", None),
               ByteField("facilityInfo144", None),
               ByteField("facilityInfo145", None),
               ByteField("facilityInfo146", None),
               ByteField("facilityInfo147", None),
               ByteField("facilityInfo148", None),
               ByteField("facilityInfo149", None),
               ByteField("facilityInfo150", None),
               ByteField("facilityInfo151", None),
               ByteField("facilityInfo152", None),
               ByteField("facilityInfo153", None),
               ByteField("facilityInfo154", None),
               ByteField("facilityInfo155", None),
               ByteField("facilityInfo156", None),
               ByteField("facilityInfo157", None),
               ByteField("facilityInfo158", None),
               ByteField("facilityInfo159", None),
               ByteField("facilityInfo160", None),
               ByteField("facilityInfo161", None),
               ByteField("facilityInfo162", None),
               ByteField("facilityInfo163", None),
               ByteField("facilityInfo164", None),
               ByteField("facilityInfo165", None),
               ByteField("facilityInfo166", None),
               ByteField("facilityInfo167", None),
               ByteField("facilityInfo168", None),
               ByteField("facilityInfo169", None),
               ByteField("facilityInfo170", None),
               ByteField("facilityInfo171", None),
               ByteField("facilityInfo172", None),
               ByteField("facilityInfo173", None),
               ByteField("facilityInfo174", None),
               ByteField("facilityInfo175", None),
               ByteField("facilityInfo176", None),
               ByteField("facilityInfo177", None),
               ByteField("facilityInfo178", None),
               ByteField("facilityInfo179", None),
               ByteField("facilityInfo180", None),
               ByteField("facilityInfo181", None),
               ByteField("facilityInfo182", None),
               ByteField("facilityInfo183", None),
               ByteField("facilityInfo184", None),
               ByteField("facilityInfo185", None),
               ByteField("facilityInfo186", None),
               ByteField("facilityInfo187", None),
               ByteField("facilityInfo188", None),
               ByteField("facilityInfo189", None),
               ByteField("facilityInfo190", None),
               ByteField("facilityInfo191", None),
               ByteField("facilityInfo192", None),
               ByteField("facilityInfo193", None),
               ByteField("facilityInfo194", None),
               ByteField("facilityInfo195", None),
               ByteField("facilityInfo196", None),
               ByteField("facilityInfo197", None),
               ByteField("facilityInfo198", None),
               ByteField("facilityInfo199", None),
               ByteField("facilityInfo200", None),
               ByteField("facilityInfo201", None),
               ByteField("facilityInfo202", None),
               ByteField("facilityInfo203", None),
               ByteField("facilityInfo204", None),
               ByteField("facilityInfo205", None),
               ByteField("facilityInfo206", None),
               ByteField("facilityInfo207", None),
               ByteField("facilityInfo208", None),
               ByteField("facilityInfo209", None),
               ByteField("facilityInfo210", None),
               ByteField("facilityInfo211", None),
               ByteField("facilityInfo212", None),
               ByteField("facilityInfo213", None),
               ByteField("facilityInfo214", None),
               ByteField("facilityInfo215", None),
               ByteField("facilityInfo216", None),
               ByteField("facilityInfo217", None),
               ByteField("facilityInfo218", None),
               ByteField("facilityInfo219", None),
               ByteField("facilityInfo220", None),
               ByteField("facilityInfo221", None),
               ByteField("facilityInfo222", None),
               ByteField("facilityInfo223", None),
               ByteField("facilityInfo224", None),
               ByteField("facilityInfo225", None),
               ByteField("facilityInfo226", None),
               ByteField("facilityInfo227", None),
               ByteField("facilityInfo228", None),
               ByteField("facilityInfo229", None),
               ByteField("facilityInfo230", None),
               ByteField("facilityInfo231", None),
               ByteField("facilityInfo232", None),
               ByteField("facilityInfo233", None),
               ByteField("facilityInfo234", None),
               ByteField("facilityInfo235", None),
               ByteField("facilityInfo236", None),
               ByteField("facilityInfo237", None),
               ByteField("facilityInfo238", None),
               ByteField("facilityInfo239", None),
               ByteField("facilityInfo240", None),
               ByteField("facilityInfo241", None),
               ByteField("facilityInfo242", None),
               ByteField("facilityInfo243", None),
               ByteField("facilityInfo244", None),
               ByteField("facilityInfo245", None),
               ByteField("facilityInfo246", None),
               ByteField("facilityInfo247", None),
               ByteField("facilityInfo248", None),
               ByteField("facilityInfo249", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(7, 250, a, self.fields_desc, 1)
          if self.lengthF is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  #len 2 to 5
  class HighLayerCompatibility(Packet):
      """High layer compatibility Section 10.5.4.16"""
      name = "High Layer Compatibility"
      fields_desc = [
  
               XByteField("lengthHLC", None),
               # optional
               BitField("ext", None, 1),
               BitField("codingStd", None, 2),
               BitField("interpret", None, 3),
               BitField("presMeth", None, 2),
  
               BitField("ext1", None, 1),
               BitField("highLayerId", None, 7),
  
               ConditionalField(BitField("ext2", 0x1, 1),
                                lambda pkt: pkt.ext1 == 0),
               ConditionalField(BitField("exHiLayerId", 0x0, 7),
                                lambda pkt: pkt.ext1 == 0),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 4, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthHLC is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  #
  # 10.5.4.16.1           Static conditions for the high layer
  # compatibility IE contents 
  #
  
  
  class KeypadFacility(Packet):
      """Keypad facility Section 10.5.4.17"""
      name = "Keypad Facility"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("keyPadInfo", 0x0, 7)
               ]
  
  
  # len 2 to 15
  class LowLayerCompatibility(Packet):
      """Low layer compatibility Section 10.5.4.18"""
      name = "Low Layer Compatibility"
      fields_desc = [
  
               XByteField("lengthLLC", None),
               # optional
               ByteField("rest0", None),
               ByteField("rest1", None),
               ByteField("rest2", None),
               ByteField("rest3", None),
               ByteField("rest4", None),
               ByteField("rest5", None),
               ByteField("rest6", None),
               ByteField("rest7", None),
               ByteField("rest8", None),
               ByteField("rest9", None),
               ByteField("rest10", None),
               ByteField("rest11", None),
               ByteField("rest12", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 14, a, self.fields_desc, 1)
          if self.lengthLLC is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class MoreData(Packet):
      """More data Section 10.5.4.19"""
      name = "More Data"
      fields_desc = [
               ]
  
  
  class NotificationIndicator(Packet):
      """Notification indicator Section 10.5.4.20"""
      name = "Notification Indicator"
      fields_desc = [
               BitField("ext1", 0x1, 1),
               BitField("notifDesc", 0x0, 7)
               ]
  
  
  class ProgressIndicator(Packet):
      """Progress indicator Section 10.5.4.21"""
      name = "Progress Indicator"
      fields_desc = [
               XByteField("lengthPI", 0x2),
               BitField("ext", 0x1, 1),
               BitField("codingStd", 0x0, 2),
               BitField("spare", 0x0, 1),
               BitField("location", 0x0, 4),
               BitField("ext1", 0x1, 1),
               BitField("progressDesc", 0x0, 7)
               ]
  
  
  class RecallType(Packet):
      """Recall type $(CCBS)$  Section 10.5.4.21a"""
      name = "Recall Type $(CCBS)$"
      fields_desc = [
               BitField("spare", 0x0, 5),
               BitField("recallType", 0x0, 3)
               ]
  
  
  # len 3 to 19
  class RedirectingPartyBcdNumber(Packet):
      """Redirecting party BCD number  Section 10.5.4.21b"""
      name = "Redirecting Party BCD Number"
      fields_desc = [
  
               XByteField("lengthRPBN", None),
  
               BitField("ext", 0x1, 1),
               BitField("typeNb", 0x0, 3),
               BitField("numberingPlan", 0x0, 4),
               # optional
               ConditionalField(BitField("ext1", 0x1, 1),
                                         lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("presId", 0x0, 2),
                                         lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("spare", 0x0, 3),
                                         lambda pkt: pkt.ext == 0),
               ConditionalField(BitField("screenId", 0x0, 2),
                                         lambda pkt: pkt.ext == 0),
  
               BitField("nbDigit2", None, 4),
               BitField("nbDigit1", None, 4),
  
               BitField("nbDigit4", None, 4),
               BitField("nbDigit3", None, 4),
  
               BitField("nbDigit6", None, 4),
               BitField("nbDigit5", None, 4),
  
               BitField("nbDigit8", None, 4),
               BitField("nbDigit7", None, 4),
  
               BitField("nbDigit10", None, 4),
               BitField("nbDigit9", None, 4),
  
               BitField("nbDigit12", None, 4),
               BitField("nbDigit11", None, 4),
  
               BitField("nbDigit14", None, 4),
               BitField("nbDigit13", None, 4),
  
               BitField("nbDigit16", None, 4),
               BitField("nbDigit15", None, 4),
  
               BitField("nbDigit18", None, 4),
               BitField("nbDigit17", None, 4),
  
               BitField("nbDigit20", None, 4),
               BitField("nbDigit19", None, 4),
  
               BitField("nbDigit22", None, 4),
               BitField("nbDigit21", None, 4),
  
               BitField("nbDigit24", None, 4),
               BitField("nbDigit23", None, 4),
  
               BitField("nbDigit26", None, 4),
               BitField("nbDigit25", None, 4),
  
               BitField("nbDigit28", None, 4),
               BitField("nbDigit27", None, 4),
  
               BitField("nbDigit30", None, 4),
               BitField("nbDigit29", None, 4),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 18, a, self.fields_desc, 1)
          if res[0] != 0:
              p = p[:-res[0]]
          if self.lengthRPBN is None:
              p = struct.pack(">B", len(p)-1) + p[1:]
          return p + pay
  
  
  # length 2 to 23
  class RedirectingPartySubaddress(Packet):
      """Redirecting party subaddress  Section 10.5.4.21c"""
      name = "Redirecting Party BCD Number"
      fields_desc = [
  
               XByteField("lengthRPS", None),
               # optional
               BitField("ext", None, 1),
               BitField("typeSub", None, 3),
               BitField("oddEven", None, 1),
               BitField("spare", None, 3),
  
               ByteField("subInfo0", None),
               ByteField("subInfo1", None),
               ByteField("subInfo2", None),
               ByteField("subInfo3", None),
               ByteField("subInfo4", None),
               ByteField("subInfo5", None),
               ByteField("subInfo6", None),
               ByteField("subInfo7", None),
               ByteField("subInfo8", None),
               ByteField("subInfo9", None),
               ByteField("subInfo10", None),
               ByteField("subInfo11", None),
               ByteField("subInfo12", None),
               ByteField("subInfo13", None),
               ByteField("subInfo14", None),
               ByteField("subInfo15", None),
               ByteField("subInfo16", None),
               ByteField("subInfo17", None),
               ByteField("subInfo18", None),
               ByteField("subInfo19", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 22, a, self.fields_desc, 1)
          if self.lengthRPS is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class RepeatIndicator(Packet):
      """Repeat indicator Section 10.5.4.22"""
      name = "Repeat Indicator"
      fields_desc = [
               BitField("repeatIndic", 0x0, 4)
               ]
  
  
  # no upper length min 2(max for L3) (251)
  class SetupContainer(Packet):
      """SETUP Container $(CCBS)$ Section 10.5.4.22b"""
      name = "Setup Container $(CCBS)$"
      fields_desc = [
               XByteField("lengthSC", None),
               # optional
               ByteField("mess1", None),
               ByteField("mess2", None),
               ByteField("mess3", None),
               ByteField("mess4", None),
               ByteField("mess5", None),
               ByteField("mess6", None),
               ByteField("mess7", None),
               ByteField("mess8", None),
               ByteField("mess9", None),
               ByteField("mess10", None),
               ByteField("mess11", None),
               ByteField("mess12", None),
               ByteField("mess13", None),
               ByteField("mess14", None),
               ByteField("mess15", None),
               ByteField("mess16", None),
               ByteField("mess17", None),
               ByteField("mess18", None),
               ByteField("mess19", None),
               ByteField("mess20", None),
               ByteField("mess21", None),
               ByteField("mess22", None),
               ByteField("mess23", None),
               ByteField("mess24", None),
               ByteField("mess25", None),
               ByteField("mess26", None),
               ByteField("mess27", None),
               ByteField("mess28", None),
               ByteField("mess29", None),
               ByteField("mess30", None),
               ByteField("mess31", None),
               ByteField("mess32", None),
               ByteField("mess33", None),
               ByteField("mess34", None),
               ByteField("mess35", None),
               ByteField("mess36", None),
               ByteField("mess37", None),
               ByteField("mess38", None),
               ByteField("mess39", None),
               ByteField("mess40", None),
               ByteField("mess41", None),
               ByteField("mess42", None),
               ByteField("mess43", None),
               ByteField("mess44", None),
               ByteField("mess45", None),
               ByteField("mess46", None),
               ByteField("mess47", None),
               ByteField("mess48", None),
               ByteField("mess49", None),
               ByteField("mess50", None),
               ByteField("mess51", None),
               ByteField("mess52", None),
               ByteField("mess53", None),
               ByteField("mess54", None),
               ByteField("mess55", None),
               ByteField("mess56", None),
               ByteField("mess57", None),
               ByteField("mess58", None),
               ByteField("mess59", None),
               ByteField("mess60", None),
               ByteField("mess61", None),
               ByteField("mess62", None),
               ByteField("mess63", None),
               ByteField("mess64", None),
               ByteField("mess65", None),
               ByteField("mess66", None),
               ByteField("mess67", None),
               ByteField("mess68", None),
               ByteField("mess69", None),
               ByteField("mess70", None),
               ByteField("mess71", None),
               ByteField("mess72", None),
               ByteField("mess73", None),
               ByteField("mess74", None),
               ByteField("mess75", None),
               ByteField("mess76", None),
               ByteField("mess77", None),
               ByteField("mess78", None),
               ByteField("mess79", None),
               ByteField("mess80", None),
               ByteField("mess81", None),
               ByteField("mess82", None),
               ByteField("mess83", None),
               ByteField("mess84", None),
               ByteField("mess85", None),
               ByteField("mess86", None),
               ByteField("mess87", None),
               ByteField("mess88", None),
               ByteField("mess89", None),
               ByteField("mess90", None),
               ByteField("mess91", None),
               ByteField("mess92", None),
               ByteField("mess93", None),
               ByteField("mess94", None),
               ByteField("mess95", None),
               ByteField("mess96", None),
               ByteField("mess97", None),
               ByteField("mess98", None),
               ByteField("mess99", None),
               ByteField("mess100", None),
               ByteField("mess101", None),
               ByteField("mess102", None),
               ByteField("mess103", None),
               ByteField("mess104", None),
               ByteField("mess105", None),
               ByteField("mess106", None),
               ByteField("mess107", None),
               ByteField("mess108", None),
               ByteField("mess109", None),
               ByteField("mess110", None),
               ByteField("mess111", None),
               ByteField("mess112", None),
               ByteField("mess113", None),
               ByteField("mess114", None),
               ByteField("mess115", None),
               ByteField("mess116", None),
               ByteField("mess117", None),
               ByteField("mess118", None),
               ByteField("mess119", None),
               ByteField("mess120", None),
               ByteField("mess121", None),
               ByteField("mess122", None),
               ByteField("mess123", None),
               ByteField("mess124", None),
               ByteField("mess125", None),
               ByteField("mess126", None),
               ByteField("mess127", None),
               ByteField("mess128", None),
               ByteField("mess129", None),
               ByteField("mess130", None),
               ByteField("mess131", None),
               ByteField("mess132", None),
               ByteField("mess133", None),
               ByteField("mess134", None),
               ByteField("mess135", None),
               ByteField("mess136", None),
               ByteField("mess137", None),
               ByteField("mess138", None),
               ByteField("mess139", None),
               ByteField("mess140", None),
               ByteField("mess141", None),
               ByteField("mess142", None),
               ByteField("mess143", None),
               ByteField("mess144", None),
               ByteField("mess145", None),
               ByteField("mess146", None),
               ByteField("mess147", None),
               ByteField("mess148", None),
               ByteField("mess149", None),
               ByteField("mess150", None),
               ByteField("mess151", None),
               ByteField("mess152", None),
               ByteField("mess153", None),
               ByteField("mess154", None),
               ByteField("mess155", None),
               ByteField("mess156", None),
               ByteField("mess157", None),
               ByteField("mess158", None),
               ByteField("mess159", None),
               ByteField("mess160", None),
               ByteField("mess161", None),
               ByteField("mess162", None),
               ByteField("mess163", None),
               ByteField("mess164", None),
               ByteField("mess165", None),
               ByteField("mess166", None),
               ByteField("mess167", None),
               ByteField("mess168", None),
               ByteField("mess169", None),
               ByteField("mess170", None),
               ByteField("mess171", None),
               ByteField("mess172", None),
               ByteField("mess173", None),
               ByteField("mess174", None),
               ByteField("mess175", None),
               ByteField("mess176", None),
               ByteField("mess177", None),
               ByteField("mess178", None),
               ByteField("mess179", None),
               ByteField("mess180", None),
               ByteField("mess181", None),
               ByteField("mess182", None),
               ByteField("mess183", None),
               ByteField("mess184", None),
               ByteField("mess185", None),
               ByteField("mess186", None),
               ByteField("mess187", None),
               ByteField("mess188", None),
               ByteField("mess189", None),
               ByteField("mess190", None),
               ByteField("mess191", None),
               ByteField("mess192", None),
               ByteField("mess193", None),
               ByteField("mess194", None),
               ByteField("mess195", None),
               ByteField("mess196", None),
               ByteField("mess197", None),
               ByteField("mess198", None),
               ByteField("mess199", None),
               ByteField("mess200", None),
               ByteField("mess201", None),
               ByteField("mess202", None),
               ByteField("mess203", None),
               ByteField("mess204", None),
               ByteField("mess205", None),
               ByteField("mess206", None),
               ByteField("mess207", None),
               ByteField("mess208", None),
               ByteField("mess209", None),
               ByteField("mess210", None),
               ByteField("mess211", None),
               ByteField("mess212", None),
               ByteField("mess213", None),
               ByteField("mess214", None),
               ByteField("mess215", None),
               ByteField("mess216", None),
               ByteField("mess217", None),
               ByteField("mess218", None),
               ByteField("mess219", None),
               ByteField("mess220", None),
               ByteField("mess221", None),
               ByteField("mess222", None),
               ByteField("mess223", None),
               ByteField("mess224", None),
               ByteField("mess225", None),
               ByteField("mess226", None),
               ByteField("mess227", None),
               ByteField("mess228", None),
               ByteField("mess229", None),
               ByteField("mess230", None),
               ByteField("mess231", None),
               ByteField("mess232", None),
               ByteField("mess233", None),
               ByteField("mess234", None),
               ByteField("mess235", None),
               ByteField("mess236", None),
               ByteField("mess237", None),
               ByteField("mess238", None),
               ByteField("mess239", None),
               ByteField("mess240", None),
               ByteField("mess241", None),
               ByteField("mess242", None),
               ByteField("mess243", None),
               ByteField("mess244", None),
               ByteField("mess245", None),
               ByteField("mess246", None),
               ByteField("mess247", None),
               ByteField("mess248", None),
               ByteField("mess249", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 250, a, self.fields_desc, 1)
          if self.lengthSC is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class Signal(Packet):
      """Signal Section 10.5.4.23"""
      name = "Signal"
      fields_desc = [
               ByteField("sigValue", 0x0)
               ]
  
  
  # length 2 to max for L3 message (251)
  class SsVersionIndicator(Packet):
      """SS Version Indicator  Section 10.5.4.24"""
      name = "SS Version Indicator"
      fields_desc = [
               XByteField("lengthSVI", None),
               # optional
               ByteField("info1", None),
               ByteField("info2", None),
               ByteField("info3", None),
               ByteField("info4", None),
               ByteField("info5", None),
               ByteField("info6", None),
               ByteField("info7", None),
               ByteField("info8", None),
               ByteField("info9", None),
               ByteField("info10", None),
               ByteField("info11", None),
               ByteField("info12", None),
               ByteField("info13", None),
               ByteField("info14", None),
               ByteField("info15", None),
               ByteField("info16", None),
               ByteField("info17", None),
               ByteField("info18", None),
               ByteField("info19", None),
               ByteField("info20", None),
               ByteField("info21", None),
               ByteField("info22", None),
               ByteField("info23", None),
               ByteField("info24", None),
               ByteField("info25", None),
               ByteField("info26", None),
               ByteField("info27", None),
               ByteField("info28", None),
               ByteField("info29", None),
               ByteField("info30", None),
               ByteField("info31", None),
               ByteField("info32", None),
               ByteField("info33", None),
               ByteField("info34", None),
               ByteField("info35", None),
               ByteField("info36", None),
               ByteField("info37", None),
               ByteField("info38", None),
               ByteField("info39", None),
               ByteField("info40", None),
               ByteField("info41", None),
               ByteField("info42", None),
               ByteField("info43", None),
               ByteField("info44", None),
               ByteField("info45", None),
               ByteField("info46", None),
               ByteField("info47", None),
               ByteField("info48", None),
               ByteField("info49", None),
               ByteField("info50", None),
               ByteField("info51", None),
               ByteField("info52", None),
               ByteField("info53", None),
               ByteField("info54", None),
               ByteField("info55", None),
               ByteField("info56", None),
               ByteField("info57", None),
               ByteField("info58", None),
               ByteField("info59", None),
               ByteField("info60", None),
               ByteField("info61", None),
               ByteField("info62", None),
               ByteField("info63", None),
               ByteField("info64", None),
               ByteField("info65", None),
               ByteField("info66", None),
               ByteField("info67", None),
               ByteField("info68", None),
               ByteField("info69", None),
               ByteField("info70", None),
               ByteField("info71", None),
               ByteField("info72", None),
               ByteField("info73", None),
               ByteField("info74", None),
               ByteField("info75", None),
               ByteField("info76", None),
               ByteField("info77", None),
               ByteField("info78", None),
               ByteField("info79", None),
               ByteField("info80", None),
               ByteField("info81", None),
               ByteField("info82", None),
               ByteField("info83", None),
               ByteField("info84", None),
               ByteField("info85", None),
               ByteField("info86", None),
               ByteField("info87", None),
               ByteField("info88", None),
               ByteField("info89", None),
               ByteField("info90", None),
               ByteField("info91", None),
               ByteField("info92", None),
               ByteField("info93", None),
               ByteField("info94", None),
               ByteField("info95", None),
               ByteField("info96", None),
               ByteField("info97", None),
               ByteField("info98", None),
               ByteField("info99", None),
               ByteField("info100", None),
               ByteField("info101", None),
               ByteField("info102", None),
               ByteField("info103", None),
               ByteField("info104", None),
               ByteField("info105", None),
               ByteField("info106", None),
               ByteField("info107", None),
               ByteField("info108", None),
               ByteField("info109", None),
               ByteField("info110", None),
               ByteField("info111", None),
               ByteField("info112", None),
               ByteField("info113", None),
               ByteField("info114", None),
               ByteField("info115", None),
               ByteField("info116", None),
               ByteField("info117", None),
               ByteField("info118", None),
               ByteField("info119", None),
               ByteField("info120", None),
               ByteField("info121", None),
               ByteField("info122", None),
               ByteField("info123", None),
               ByteField("info124", None),
               ByteField("info125", None),
               ByteField("info126", None),
               ByteField("info127", None),
               ByteField("info128", None),
               ByteField("info129", None),
               ByteField("info130", None),
               ByteField("info131", None),
               ByteField("info132", None),
               ByteField("info133", None),
               ByteField("info134", None),
               ByteField("info135", None),
               ByteField("info136", None),
               ByteField("info137", None),
               ByteField("info138", None),
               ByteField("info139", None),
               ByteField("info140", None),
               ByteField("info141", None),
               ByteField("info142", None),
               ByteField("info143", None),
               ByteField("info144", None),
               ByteField("info145", None),
               ByteField("info146", None),
               ByteField("info147", None),
               ByteField("info148", None),
               ByteField("info149", None),
               ByteField("info150", None),
               ByteField("info151", None),
               ByteField("info152", None),
               ByteField("info153", None),
               ByteField("info154", None),
               ByteField("info155", None),
               ByteField("info156", None),
               ByteField("info157", None),
               ByteField("info158", None),
               ByteField("info159", None),
               ByteField("info160", None),
               ByteField("info161", None),
               ByteField("info162", None),
               ByteField("info163", None),
               ByteField("info164", None),
               ByteField("info165", None),
               ByteField("info166", None),
               ByteField("info167", None),
               ByteField("info168", None),
               ByteField("info169", None),
               ByteField("info170", None),
               ByteField("info171", None),
               ByteField("info172", None),
               ByteField("info173", None),
               ByteField("info174", None),
               ByteField("info175", None),
               ByteField("info176", None),
               ByteField("info177", None),
               ByteField("info178", None),
               ByteField("info179", None),
               ByteField("info180", None),
               ByteField("info181", None),
               ByteField("info182", None),
               ByteField("info183", None),
               ByteField("info184", None),
               ByteField("info185", None),
               ByteField("info186", None),
               ByteField("info187", None),
               ByteField("info188", None),
               ByteField("info189", None),
               ByteField("info190", None),
               ByteField("info191", None),
               ByteField("info192", None),
               ByteField("info193", None),
               ByteField("info194", None),
               ByteField("info195", None),
               ByteField("info196", None),
               ByteField("info197", None),
               ByteField("info198", None),
               ByteField("info199", None),
               ByteField("info200", None),
               ByteField("info201", None),
               ByteField("info202", None),
               ByteField("info203", None),
               ByteField("info204", None),
               ByteField("info205", None),
               ByteField("info206", None),
               ByteField("info207", None),
               ByteField("info208", None),
               ByteField("info209", None),
               ByteField("info210", None),
               ByteField("info211", None),
               ByteField("info212", None),
               ByteField("info213", None),
               ByteField("info214", None),
               ByteField("info215", None),
               ByteField("info216", None),
               ByteField("info217", None),
               ByteField("info218", None),
               ByteField("info219", None),
               ByteField("info220", None),
               ByteField("info221", None),
               ByteField("info222", None),
               ByteField("info223", None),
               ByteField("info224", None),
               ByteField("info225", None),
               ByteField("info226", None),
               ByteField("info227", None),
               ByteField("info228", None),
               ByteField("info229", None),
               ByteField("info230", None),
               ByteField("info231", None),
               ByteField("info232", None),
               ByteField("info233", None),
               ByteField("info234", None),
               ByteField("info235", None),
               ByteField("info236", None),
               ByteField("info237", None),
               ByteField("info238", None),
               ByteField("info239", None),
               ByteField("info240", None),
               ByteField("info241", None),
               ByteField("info242", None),
               ByteField("info243", None),
               ByteField("info244", None),
               ByteField("info245", None),
               ByteField("info246", None),
               ByteField("info247", None),
               ByteField("info248", None),
               ByteField("info249", None),
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(1, 250, a, self.fields_desc, 1)
          if self.lengthSVI is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  # length 3 to 35 or 131
  class UserUser(Packet):
      """User-user Section 10.5.4.25"""
      name = "User-User"
      fields_desc = [
  
               XByteField("lengthUU", None),  # dynamic length of field depending
                                             # of the type of message
                                             # let user decide which length he
                                             # wants to take
                                             # => more fuzzing options
               ByteField("userUserPD", 0x0),
               # optional
               ByteField("userUserInfo1", None),
               ByteField("userUserInfo2", None),
               ByteField("userUserInfo3", None),
               ByteField("userUserInfo4", None),
               ByteField("userUserInfo5", None),
               ByteField("userUserInfo6", None),
               ByteField("userUserInfo7", None),
               ByteField("userUserInfo8", None),
               ByteField("userUserInfo9", None),
               ByteField("userUserInfo10", None),
               ByteField("userUserInfo11", None),
               ByteField("userUserInfo12", None),
               ByteField("userUserInfo13", None),
               ByteField("userUserInfo14", None),
               ByteField("userUserInfo15", None),
               ByteField("userUserInfo16", None),
               ByteField("userUserInfo17", None),
               ByteField("userUserInfo18", None),
               ByteField("userUserInfo19", None),
               ByteField("userUserInfo20", None),
               ByteField("userUserInfo21", None),
               ByteField("userUserInfo22", None),
               ByteField("userUserInfo23", None),
               ByteField("userUserInfo24", None),
               ByteField("userUserInfo25", None),
               ByteField("userUserInfo26", None),
               ByteField("userUserInfo27", None),
               ByteField("userUserInfo28", None),
               ByteField("userUserInfo29", None),
               ByteField("userUserInfo30", None),
               ByteField("userUserInfo31", None),
               ByteField("userUserInfo32", None),
               # long  packet
               ByteField("userUserInfo33", None),
               ByteField("userUserInfo34", None),
               ByteField("userUserInfo35", None),
               ByteField("userUserInfo36", None),
               ByteField("userUserInfo37", None),
               ByteField("userUserInfo38", None),
               ByteField("userUserInfo39", None),
               ByteField("userUserInfo40", None),
               ByteField("userUserInfo41", None),
               ByteField("userUserInfo42", None),
               ByteField("userUserInfo43", None),
               ByteField("userUserInfo44", None),
               ByteField("userUserInfo45", None),
               ByteField("userUserInfo46", None),
               ByteField("userUserInfo47", None),
               ByteField("userUserInfo48", None),
               ByteField("userUserInfo49", None),
               ByteField("userUserInfo50", None),
               ByteField("userUserInfo51", None),
               ByteField("userUserInfo52", None),
               ByteField("userUserInfo53", None),
               ByteField("userUserInfo54", None),
               ByteField("userUserInfo55", None),
               ByteField("userUserInfo56", None),
               ByteField("userUserInfo57", None),
               ByteField("userUserInfo58", None),
               ByteField("userUserInfo59", None),
               ByteField("userUserInfo60", None),
               ByteField("userUserInfo61", None),
               ByteField("userUserInfo62", None),
               ByteField("userUserInfo63", None),
               ByteField("userUserInfo64", None),
               ByteField("userUserInfo65", None),
               ByteField("userUserInfo66", None),
               ByteField("userUserInfo67", None),
               ByteField("userUserInfo68", None),
               ByteField("userUserInfo69", None),
               ByteField("userUserInfo70", None),
               ByteField("userUserInfo71", None),
               ByteField("userUserInfo72", None),
               ByteField("userUserInfo73", None),
               ByteField("userUserInfo74", None),
               ByteField("userUserInfo75", None),
               ByteField("userUserInfo76", None),
               ByteField("userUserInfo77", None),
               ByteField("userUserInfo78", None),
               ByteField("userUserInfo79", None),
               ByteField("userUserInfo80", None),
               ByteField("userUserInfo81", None),
               ByteField("userUserInfo82", None),
               ByteField("userUserInfo83", None),
               ByteField("userUserInfo84", None),
               ByteField("userUserInfo85", None),
               ByteField("userUserInfo86", None),
               ByteField("userUserInfo87", None),
               ByteField("userUserInfo88", None),
               ByteField("userUserInfo89", None),
               ByteField("userUserInfo90", None),
               ByteField("userUserInfo91", None),
               ByteField("userUserInfo92", None),
               ByteField("userUserInfo93", None),
               ByteField("userUserInfo94", None),
               ByteField("userUserInfo95", None),
               ByteField("userUserInfo96", None),
               ByteField("userUserInfo97", None),
               ByteField("userUserInfo98", None),
               ByteField("userUserInfo99", None),
               ByteField("userUserInfo100", None),
               ByteField("userUserInfo101", None),
               ByteField("userUserInfo102", None),
               ByteField("userUserInfo103", None),
               ByteField("userUserInfo104", None),
               ByteField("userUserInfo105", None),
               ByteField("userUserInfo106", None),
               ByteField("userUserInfo107", None),
               ByteField("userUserInfo108", None),
               ByteField("userUserInfo109", None),
               ByteField("userUserInfo110", None),
               ByteField("userUserInfo111", None),
               ByteField("userUserInfo112", None),
               ByteField("userUserInfo113", None),
               ByteField("userUserInfo114", None),
               ByteField("userUserInfo115", None),
               ByteField("userUserInfo116", None),
               ByteField("userUserInfo117", None),
               ByteField("userUserInfo118", None),
               ByteField("userUserInfo119", None),
               ByteField("userUserInfo120", None),
               ByteField("userUserInfo121", None),
               ByteField("userUserInfo122", None),
               ByteField("userUserInfo123", None),
               ByteField("userUserInfo124", None),
               ByteField("userUserInfo125", None),
               ByteField("userUserInfo126", None),
               ByteField("userUserInfo127", None),
               ByteField("userUserInfo128", None),
               ByteField("userUserInfo129", None),
               ByteField("userUserInfo130", None),
               ByteField("userUserInfo131", None)
               ]
  
      def post_build(self, p, pay):
          a = [getattr(self, fld.name) for fld in self.fields_desc]
          res = adapt(2, 133, a, self.fields_desc, 1)
          if self.lengthUU is None:
              p = struct.pack(">B", res[1]) + p[1:]
          if res[0] != 0:
              p = p[:-res[0]]
          return p + pay
  
  
  class AlertingPattern(Packet):
      """Alerting Pattern 10.5.4.26"""
      name = "Alerting Pattern"
      fields_desc = [
               XByteField("lengthAP", 0x3),
               BitField("spare", 0x0, 4),
               BitField("alertingValue", 0x0, 4)
               ]
  
  
  class AllowedActions(Packet):
      """Allowed actions $(CCBS)$ Section 10.5.4.26"""
      name = "Allowed Actions $(CCBS)$"
      fields_desc = [
               XByteField("lengthAP", 0x3),
               BitField("CCBS", 0x0, 1),
               BitField("spare", 0x0, 7)
               ]
  
  
  #
  # 10.5.5 GPRS mobility management information elements
  #
  
  
  class AttachType(Packet):
      """Attach type Section 10.5.5.2"""
      name = "Attach Type"
      fields_desc = [
               BitField("spare", 0x0, 1),
               BitField("type", 0x1, 3)
               ]
  
  
  if __name__ == "__main__":
      from scapy.main import interact
      interact(mydict=globals(), mybanner="Scapy GSM-UM (Air) Addon")
  