#!/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")
|