summaryrefslogtreecommitdiff
path: root/maximus/python/lib
diff options
context:
space:
mode:
authorronciere2007-10-22 15:02:48 +0000
committerronciere2007-10-22 15:02:48 +0000
commit4ffdf93a70c8c7760433f6bb32286585fc52ca25 (patch)
tree98f488d13d0ad2f68cc7bc550d3973f880a4a3fd /maximus/python/lib
parentdff364719637f74bb050ae8e5b6ac375bb920d32 (diff)
Firts Python libraries checkin : Constants, fidBody, fidMethod, mmentryFields, mmentryMethod, mmentry, Mme, Mpdu
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@859 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'maximus/python/lib')
-rw-r--r--maximus/python/lib/Constants.py202
-rw-r--r--maximus/python/lib/Mme.py153
-rw-r--r--maximus/python/lib/Mpdu.py156
-rw-r--r--maximus/python/lib/fidBody.py38
-rw-r--r--maximus/python/lib/fidMethod.py409
-rw-r--r--maximus/python/lib/mmentry.py121
-rw-r--r--maximus/python/lib/mmentryFields.py967
-rw-r--r--maximus/python/lib/mmentryMethod.py775
8 files changed, 2821 insertions, 0 deletions
diff --git a/maximus/python/lib/Constants.py b/maximus/python/lib/Constants.py
new file mode 100644
index 0000000000..847eb2038f
--- /dev/null
+++ b/maximus/python/lib/Constants.py
@@ -0,0 +1,202 @@
+# -*- coding:Latin-1 -*-
+#------ Maximus Python's constants -------
+
+#Maximus Simulator 48 bits address
+maxAddress = 0x6D695378614D #="MaxSim"
+
+#Delimiter Type = DT_AV
+ #= First field of the HomePlug AV Frame Control Block
+ #= 3-bits field that identifies the "Frame Type of Message"
+beacon = 0
+sof = 1
+sack = 2
+rtsCts = 3
+sound = 4
+rsof = 5
+rsv0 = 6
+rsv1 = 7
+
+#rx :
+timeOutRx = 5000 #timeOutRx default's value = 5s
+ #time count is here supposed to be in ms
+
+#MAC Frame Type = MFT
+ #= First field of the MAC Frame Header
+ #= 2-bits field that identifies the "MAC Frame Type"
+mfs = 0 #MAC Frame Stream
+msduWOats = 1 #MSDU WithOut ATS
+msduWats = 2 #MSDU With ATS
+mme = 3 #Management Message
+
+#MME Interpretation
+#--- Station – Central Coordination ---
+CC_CCO_APPOINT_REQ = 0x0000 #(See Note #1)
+CC_CCO_APPOINT_CNF = 0x0001 #(See Note #1)
+CC_BACKUP_APPOINT_REQ = 0x0004
+CC_BACKUP_APPOINT_CNF = 0x0005
+CC_LINK_INFO_REQ = 0x0008
+CC_LINK_INFO_CNF = 0x0009
+CC_LINK_INFO_IND = 0x000A #(See Note #3)
+CC_LINK_INFO_RSP = 0x000B #(See Note #3)
+CC_HANDOVER_REQ = 0x000C #(See Note #4)
+CC_HANDOVER_CNF = 0x000D #(See Note #4)
+CC_HANDOVER_INFO_IND = 0x0010 #(See Note #4)
+CC_HANDOVER_INFO_RSP = 0x0011 #(See Note #4)
+CC_DISCOVER_LIST_REQ = 0x0014
+CC_DISCOVER_LIST_CNF = 0x0015
+CC_DISCOVER_LIST_IND = 0x0016
+CC_LINK_NEW_REQ = 0x0018 #(See Note #2)
+CC_LINK_NEW_CNF = 0x0019 #(See Note #2)
+CC_LINK_MOD_REQ = 0x001C #(See Note #2)
+CC_LINK_MOD_CNF = 0x001D #(See Note #2)
+CC_LINK_SQZ_REQ = 0x0020 #(See Note #5)
+CC_LINK_SQZ_CNF = 0x0021 #(See Note #5)
+CC_LINK_REL_REQ = 0x0024 #(See Note #2)
+CC_LINK_REL_IND = 0x0025 #(See Note #2)
+CC_DETECT_REPORT_REQ = 0x0028 #(See Note #6)
+CC_DETECT_REPORT_CNF = 0x0029 #(See Note #6)
+CC_WHO_RU_REQ = 0x002C
+CC_WHO_RU_CNF = 0x002D
+CC_ASSOC_REQ = 0x0030
+CC_ASSOC_CNF = 0x0031
+CC_LEAVE_REQ = 0x0034
+CC_LEAVE_CNF = 0x0035
+CC_LEAVE_IND = 0x0036
+CC_LEAVE_RSP = 0x0037
+CC_SET_TEI_MAP_REQ = 0x0038
+CC_SET_TEI_MAP_IND = 0x0039
+CC_RELAY_REQ = 0x003C #(See Note #7)
+CC_RELAY_IND = 0x003D #(See Note #7)
+CC_BEACON_RELIABILITY_REQ = 0x0040
+CC_BEACON_RELIABILITY_CNF = 0x0041
+CC_ALLOC_MOVE_REQ = 0x0044
+CC_ALLOC_MOVE_CNF = 0x0045
+CC_ACCESS_NEW_REQ = 0x0048
+CC_ACCESS_NEW_CNF = 0x0049
+CC_ACCESS_NEW_IND = 0x004A
+CC_ACCESS_NEW_RSP = 0x004B
+CC_ACCESS_REL_REQ = 0x004C
+CC_ACCESS_REL_CNF = 0x004D
+CC_ACCESS_REL_IND = 0x004E
+CC_ACCESS_REL_RSP = 0x004F
+CC_DCPPC_IND = 0x0050 #(See Note #8)
+CC_DCPPC_RSP = 0x0051 #(See Note #8)
+CC_HP1_DET_REQ = 0x0054
+CC_HP1_DET_CNF = 0x0055
+CC_BLE_UPDATE_IND = 0x0058
+#to 0x1FFC : Reserved for future use = 0x005C
+#--- Proxy Coordinator ---
+CP_PROXY_APPOINT_REQ = 0x2000 #(See Note #9)
+CP_PROXY_APPOINT_CNF = 0x2001 #(See Note #9)
+PH_PROXY_APPOINT_IND = 0x2004 #(See Note #9)
+CP_PROXY_WAKE_REQ = 0x2008 #(See Note #9)
+#to 0x3FFC : Reserved for future use = 0x200C
+#--- CCo – CCo ---
+NN_INL_REQ = 0x4000
+NN_INL_CNF = 0x4001
+NN_NEW_NET_REQ = 0x4004
+NN_NEW_NET_CNF = 0x4005
+NN_NEW_NET_IND = 0x4006
+NN_ADD_ALLOC_REQ = 0x4008
+NN_ADD_ALLOC_CNF = 0x4009
+NN_ADD_ALLOC_IND = 0x400A
+NN_REL_ALLOC_REQ = 0x400C
+NN_REL_ALLOC_CNF = 0x400D
+NN_REL_NET_IND = 0x4010
+#to 0x5FFC : Reserved for future use = 0x4014
+#--- Station – Station ---
+CM_UNASSOCIATED_STA_IND = 0x6000
+CM_ENCRYPTED_PAYLOAD_IND = 0x6004
+CM_ENCRYPTED_PAYLOAD_RSP = 0x6005
+CM_SET_KEY_REQ = 0x6008
+CM_SET_KEY_CNF = 0x6009
+CM_GET_KEY_REQ = 0x600C
+CM_GET_KEY_CNF = 0x600D
+CM_SC_JOIN_REQ = 0x6010
+CM_SC_JOIN_CNF = 0x6011
+CM_CHAN_EST_IND = 0x6014
+CM_TM_UPDATE_IND = 0x6018
+CM_AMP_MAP_REQ = 0x601C
+CM_AMP_MAP_CNF = 0x601D
+CM_BRG_INFO_REQ = 0x6020 #(See Note #10)
+CM_BRG_INFO_CNF = 0x6021 #(See Note #10)
+CM_CONN_NEW_REQ = 0x6024 #(See Note #2)
+CM_CONN_NEW_CNF = 0x6025 #(See Note #2)
+CM_CONN_REL_IND = 0x6028 #(See Note #2)
+CM_CONN_REL_RSP = 0x6029 #(See Note #2)
+CM_CONN_MOD_REQ = 0x602C #(See Note #2)
+CM_CONN_MOD_CNF = 0x602D #(See Note #2)
+CM_CONN_INFO_REQ = 0x6030
+CM_CONN_INFO_CNF = 0x6031
+CM_STA_CAP_REQ = 0x6034
+CM_STA_CAP_CNF = 0x6035
+CM_NW_INFO_REQ = 0x6038
+CM_NW_INFO_CNF = 0x6039
+CM_GET_BEACON_REQ = 0x603C
+CM_GET_BEACON_CNF = 0x603D
+CM_HFID_REQ = 0x6040
+CM_HFID_CNF = 0x6041
+CM_MME_ERROR_IND = 0x6044
+CM_NW_STATS_REQ = 0x6048
+CM_NW_STATS_CNF = 0x6049
+CM_LINK_STATS_REQ = 0x604C
+CM_LINK_STATS_CNF = 0x604D
+#to 0x7FFC : Reserved for future use = 0x6050
+#--- Manufacturer Specific ---
+#to 0x9FFC : Manufacturer Specific Messages = 0x8000
+#--- Vendor Specific ---
+#to 0xBFFC : Vendor-Specific Messages = 0xA000
+
+
+
+#1-octet Field Identifier (FID) field
+#CSPEC_Field
+Delay_Bound = 0x00
+Jitter_Bound = 0x01
+Average_MSDU_Size = 0x02
+Maximum_MSDU_Size = 0x03
+Average_Data_Rate = 0x04
+Minimum_Data_Rate = 0x05
+Maximum_Data_Rate = 0x06
+Maximum_Inter_TXOP_time = 0x07
+Minimum_Inter_TXOP_time = 0x08
+Maximum_Burst_Size = 0x09
+Exception_Policy = 0x0a
+Inactivity_Interval = 0x0b
+MSDU_Error_Rate = 0x0c
+CLST = 0x0d
+CDESC = 0x0e
+Vendor_Specific = 0x0f
+ATS_Tolerance = 0x10
+Smallest_Tolerable_Average_Data_Rate = 0x11
+Original_Average_Data_Rate = 0x12
+#QoS_and_MAC_Parameter_Field_(CM-CM)
+Rx_Window_Size = 0x13
+Smoothing_Buffer_Size = 0x14
+Bidirectional_Burst_CM_CM = 0x15
+#QoS_and_MAC_Parameter_Field_(CM-CCo)
+TXOPs_per_Beacon_Period = 0x80
+Average_Number_of_PBs_per_TXOP = 0x81
+Minimum_Number_of_PBs_per_TXOP = 0x82
+Maximum_Number_of_PBs_per_TXOP = 0x83
+PPB_Threshold = 0x84
+Surplus_Bandwidth = 0x85
+Exception_Policy = 0x0a
+CDESC = 0x0e
+Vendor_Specific = 0x86
+Smallest_Tolerable_Average_Number_of_PBs_per_TXOP = 0x87
+Original_Average_Number_of_PBs_per_TXOP = 0x88
+Bidirectional_Burst_CM_CCO = 0x89
+
+
+
+#Global ID
+globalId = []
+i=0x80
+while i <= 0xF7:
+ globalId.append(i)
+ i=i+1
+i=0xFC
+while i <= 0xFE:
+ globalId.append(i)
+ i=i+1 \ No newline at end of file
diff --git a/maximus/python/lib/Mme.py b/maximus/python/lib/Mme.py
new file mode 100644
index 0000000000..1ba9eaf689
--- /dev/null
+++ b/maximus/python/lib/Mme.py
@@ -0,0 +1,153 @@
+#------ MME Library Prototypes -------
+
+from Mpdu import *
+
+#The MME is composed by :
+
+class MME():
+
+ #MME can be :
+ # Not Fragmented : macFrame1
+ # corresponds to the MAC Frame of the only fragment
+ # Fragmented into 2 parts macFrame1 and macFrame2
+ # correspond to the MAC Frames of the 2 fragments
+ # Fragmented into 3 parts macFrame1, macFrame2 and macFrame3
+ # correspond to the MAC Frames of the 3 fragments
+ macFrame1 = MacFrame() #Mac Frame for fragment 1
+ macFrame2 = MacFrame() #Mac Frame for fragment 2
+ macFrame3 = MacFrame() #Mac Frame for fragment 3
+
+ macFrame1.macFrameType = 3 #MFT Field = 3 for MME Mac Frame
+ macFrame2.macFrameType = 3 #MFT Field = 3 for MME Mac Frame
+ macFrame3.macFrameType = 3 #MFT Field = 3 for MME Mac Frame
+
+ #Original Destination address in the MME is a 6 Bytes field
+ oda = 0
+ odaField = pack('Q',oda)[0:6]
+
+ #Original source address in the MME is a 6 Bytes field
+ # by default equals to the Maximus Simulator Address
+ osa = maxAddress
+ osaField = pack('Q',osa)[0:6]
+
+ #VLAN Tag in the MME is an optional 4 Bytes field
+ vlanTag = 0
+ vlanTagField = pack('I',vlanTag)
+
+ #mtype in the MME is a 2 Bytes Field with Bytes inversion : LSB <-> MSB
+ mtype = 0x88e1 #Default IEEE value
+ mtype = ((mtype%pow(2,8))*pow(2,8))+(mtype/pow(2,8)) #Bytes inversion
+ mtypeField = pack('H',mtype)
+
+ #MMV in the MME is a 1 Byte Field
+ # equals to 0 for HPAV Specification V1.0
+ # equals to 1 for HPAV Specification V1.1
+ # all others values are reserved
+ mmv = 0
+ mmvField = pack('H',mmv)[0]
+
+ #MMTYPE in the MME is a 2 Bytes Field
+ # corresponding to the MME Type
+ # see MME interpretation in the Constants
+ mmtype = 0
+ mmtypeField = pack('H',mmtype)
+
+
+ #FMI in the MME is a 2 Bytes Field composed by :
+ # - MSByte :
+ # - 4 MSBits = NF_MI = Number of fragments
+ # - 4 LSBits = FN_MI = Fragment Number
+ # - LSByte = FMSN = Fragmentation Message Sequence Number
+ nfMi = 0 #by default MMENTRY is not Fragmented
+ fnMi1 = 0 #by default First or Only Fragment
+ fnMi2 = 1 #Second Fragment
+ fnMi3 = 2 #Third Fragment
+ fmsn = 0 #initialized to 0 by default
+ #FMI equals to NF_MI 12 bits left shifted
+ # +FN_MI 4 bits left shifted
+ # +FNSM
+ #First or Only fragment FMI
+ fmi1 = nfMi*pow(2,8+4)+fnMi1*pow(2,8)+fmsn
+ #Second fragment FMI
+ fmi2 = nfMi*pow(2,8+4)+fnMi2*pow(2,8)+fmsn
+ #Third fragment FMI
+ fmi3 = nfMi*pow(2,8+4)+fnMi3*pow(2,8)+fmsn
+ #First or Only fragment FMI Field
+ fmiField1 = pack('H',fmi1)
+ #Second FMI Field
+ fmiField2 = pack('H',fmi2)
+ #Third fragment FMI Field
+ fmiField3 = pack('H',fmi3)
+
+ #MMENTRY in the MME is a m Bytes field
+ mmentry = 0
+ #MMENTRY Field
+ mmentryField = ""
+
+ #createOda creates the Original Destination Address Field in the MME
+ def createOda(self):
+ self.odaField = pack('Q',self.oda)[0:6]
+
+ #createOsa creates the OSA Field of Maximus Simulator in the MME
+ def createOsa(self):
+ self.osa = maxAddress
+ self.osaField = pack('Q',self.osa)[0:6]
+
+ #createVlanTag creates the otional VLAN Tag Field in The MME
+ # by convention if vlanTag = 0, there is no VLAN Tag Field in the MME
+ def createVlanTag(self):
+ if self.vlanTag == 0:
+ self.vlanTagFielf = ""
+ else:
+ self.vlanTagField = pack('I',self.vlanTag)
+
+ #createMtype creates the MTYPE Field in the MME
+ def createMtype(self):
+ #Bytes inversion
+ self.mtype=(self.mtype%pow(2,8))*pow(2,8)+self.mtype/pow(2,8)
+ #Field creation
+ self.mtypeField = pack('H',self.mtype)
+
+ #createMmv creates the MMV Field in the MME
+ def createMmv(self):
+ self.mmvField = pack('H',self.mmv)[0]
+
+ #createMmtype creates the MMTYPE Field in the MME
+ def createMmtype(self):
+ self.mmtypeField = pack('H',self.mmtype)
+
+ #creatFmi creates the FMI Field in the MME
+ def createFmi(self):
+ if len(self.mmentryField)<479+1:#Less than the fragment size
+ self.nfMi = 0 #MMENTRY not fragmented
+ fnsm = 0 #=0 by convention when no fragmentation
+ #FMI1 computation
+ self.fmi1=self.nfMi*pow(2,8+4)+self.fnMi1*pow(2,8)+fmsn
+ #FMI1 Field creation
+ self.fmiField1 = pack('H',self.fmi1)
+ elif len(self.mmentryField)<479*2+1: #2 Fragments
+ self.nfMi = 1 #Fragmented in 2 parts
+ self.fnsm=(self.fnsm+1)%pow(2,8)#FNSM incrementation
+ #FMI1 computation
+ self.fmi1=self.nfMi*pow(2,8+4)+self.fnMi1*pow(2,8)+self.fmsn
+ #FMI2 computation
+ self.fmi2=self.nfMi*pow(2,8+4)+self.fnMi2*pow(2,8)+self.fmsn
+ #FMI1 Field creation
+ self.fmiField1 = pack('H',self.fmi1)
+ #FMI2 Field creation
+ self.fmiField2 = pack('H',self.fmi2)
+ else: #3 Fragments
+ self.nfMi = 2 #Fragmented in 3 parts
+ self.fnsm=(self.fnsm+1)%pow(2,8)#FNSM incrementation
+ #FMI1 computation
+ self.fmi1=self.nfMi*pow(2,8+4)+self.fnMi1*pow(2,8)+self.fmsn
+ #FMI2 computation
+ self.fmi2=self.nfMi*pow(2,8+4)+self.fnMi2*pow(2,8)+self.fmsn
+ #FMI3 computation
+ self.fmi3=self.nfMi*pow(2,8+4)+self.fnMi3*pow(2,8)+self.fmsn
+ #FMI1 Field creation
+ self.fmiField1 = pack('H',self.fmi1)
+ #FMI2 Field creation
+ self.fmiField2 = pack('H',self.fmi2)
+ #FMI3 Field creation
+ self.fmiField3 = pack('H',self.fmi3) \ No newline at end of file
diff --git a/maximus/python/lib/Mpdu.py b/maximus/python/lib/Mpdu.py
new file mode 100644
index 0000000000..87bac1c722
--- /dev/null
+++ b/maximus/python/lib/Mpdu.py
@@ -0,0 +1,156 @@
+#------ MPDU Library Prototypes -------
+
+from random import randrange #random library is used : randrange(),
+from math import * #math library is used : pow(),
+from Constants import * #Constants library is used : mme
+from struct import * #struct library is used : pack(),
+from binascii import * #binascii library is used : crc32(),
+
+#The MPDU Frame (or MAC Frame) is composed by :
+# - The MAC FrameHeader
+# - The Mac Frame Type = MFT
+# = MAC Frame Stream = MFS = 0
+# = MSDU Payload without ATS = 1
+# = MSDU Payload with ATS = 2
+# = MAC Management Message Entry = MME = 3
+# - The Mac Frame Length = MFL
+# = The ATS or Confouder Length = 4 bits
+# + The message Length = Variable
+# = MFS or MSDU Payload or MME Length
+# - 1
+# - The Optional Field
+# = ATS or Confounder
+# - The message
+# = MFS or MSDU Payload (with or without ATS) or MME
+# - The ICV Field
+
+class MacFrame:
+
+ #--- Constants ---
+ macFrameLengthLength = 14 #Length of the MFL field in bits
+
+ #--- Variables ---
+ ats = 0 #Arrival Time Stamp Field
+
+ #--- Frames and Frame Fields ---
+ macFrame = pack('s',"0") #Mac Frame is a N Bytes Field
+ #######################################################################
+ #MFH (2 Bytes)# Option (0 - 4 Bytes)# Message (n Bytes)# ICV (4 Bytes)#
+ #######################################################################
+
+ macFrameHeader = 0 #Mac Frame Header Fields (16 bits)
+ #######################################################################
+ # MFT ( 2 bits ) # MFL ( 14 bits ) #
+ #######################################################################
+
+ #Mac Frame Header Field in the Mac Frame
+ mfhField = pack('H',0) #MFH is a 2 Bytes Field
+
+ macFrameType = 0 #MFT Field
+ # = 0 for MFS Mac Frame
+ # = 1 for MPDU Mac Frame without ATS
+ # = 2 for MPDU Mac Frame with ATS
+ # = 3 for MME Mac Frame
+
+ macFrameLength = 59 #MFL Field in Bytes
+ #MFL equals to the length of
+ #option + message fields - 1
+
+ #Option Field in the Mac Frame, ATS or Confunder or None
+ optionField = pack('I',0) #Option is a 4 Bytes Field
+
+ #Message Field in the Mac Frame, MSDU Payload or MME or MFS
+ messageField = pack('s',"0") #message is a n Bytes Field
+
+ icv = 0 #ICV Field
+ #ICV Field in the Mac Frame
+ icvField = pack('I',0) #ICV is a 4 Bytes Field
+
+ #--- CREATION ---
+ #----- createMacFrameStream creates the Mac Frame Stream
+ #----- from the 4 fields of the MFS :
+ #----- - macFrameHeader
+ #----- - option
+ #----- - message
+ #----- - ICV
+ #----- 1 is always added to macFrameLength
+ #----- because MFL = 0 for a length of 1 Byte
+ #----- and multiplyed by 8 to have a bits number
+ def createMacFrame(self):
+
+ #MFT, messageMFL and message have to be filled in first
+
+ #Creation of the Mac Frame Header Field
+ #and the Option Field in the Mac Frame
+ self.createMacFrameHeaderNOption()
+
+ #Creation of the message field in the Mac Frame
+ self.createIcv()
+
+ #Creation of the Mac Frame
+ self.macFrame=self.mfhField+self.optionField+self.messageField+self.icvField
+
+ #--- createMacFrameHeader creates Mac Frame Header
+ #--- from the 2 fields of the MFH :
+ #--- - macFrameType
+ #--- - macFrameLength
+ def createMacFrameHeaderNOption(self):
+
+ #--- 1) MFT ---
+ #Position of the Mac Frame Type in bits in the Mac Frame Header
+ macFrameTypePosition = pow(2,self.macFrameLengthLength)
+ #Creation of the Mac Frame Header Field in the Mac Frame
+ macFrameTypeField=self.macFrameType*macFrameTypePosition
+
+ #--- 2) MFL ---
+ #Position of the MFL Field in bits in the Mac Frame Header
+ macFrameLengthPosition = pow(2,0)
+ #Creation of the MFL field in the Mac Frame Header
+ self.createMacFrameLengthNOption()
+ macFrameLengthField=self.macFrameLength*macFrameLengthPosition
+
+ #--- 3) MFH ---
+ #Creation of the Mac Frame Header
+ self.macFrameHeader = macFrameTypeField + macFrameLengthField
+ #Creation of the Mac Frame Header Field in the Mac Frame
+ self.mfhField = pack('H',self.macFrameHeader)
+
+ #--- createMacFrameLength creates *MFL field of the Mac Frame Header
+ #--- from the message Field
+ def createMacFrameLengthNOption(self):
+
+ #--- Option ---
+ #For MFT = 0 (MFS message) and MFT = 1 (MSDU without ATS) :
+ if self.macFrameType < 2:
+ optionLength = 0 #No option Field
+ self.optionField = ""
+ #For MFT = 2 (MSDU with ATS) :
+ elif self.macFrameType == 2: #Length of the option field
+ optionLength = 4 # equals to 4 Bytes
+ self.optionField = pack('I',ats)
+ #For MFT = 3 (MME) :
+ else:
+ #Length of the option field = 4 Bytes
+ optionLength = 4
+ #Random Confounder Field (0<RCF<2^32)
+ confounder = randrange(0,pow(2,32)-1,1)
+ self.optionField = pack('I',confounder)
+
+ #Length of the message Field in bits
+ messageLength = len(self.messageField)
+
+ #--- Mac Frame Length ---
+ #Creation of the Mac Frame Length Field
+ # of the Mac Frame Header (in Bytes)
+ self.macFrameLength = optionLength + messageLength - 1
+
+ #--- createIcv creates ICV Field of the Mac Frame
+ #--- from the message field
+ def createIcv(self):
+ self.icv = crc32(self.messageField)
+ #Creation of the ICV field in the Mac Frame
+ self.icvField = pack('i',self.icv)
+
+ #--- FILTERING ---
+ def filterMpduFrame():
+ a = 12 \ No newline at end of file
diff --git a/maximus/python/lib/fidBody.py b/maximus/python/lib/fidBody.py
new file mode 100644
index 0000000000..ea5eff0ed4
--- /dev/null
+++ b/maximus/python/lib/fidBody.py
@@ -0,0 +1,38 @@
+class FidBody():
+ #CSPEC_Field
+ Delay_Bound = "1234"
+ Jitter_Bound = "1234"
+ Average_MSDU_Size = "12"
+ Maximum_MSDU_Size = "12"
+ Average_Data_Rate = "12"
+ Minimum_Data_Rate = "12"
+ Maximum_Data_Rate = "12"
+ Maximum_Inter_TXOP_time = "12"
+ Minimum_Inter_TXOP_time = "12"
+ Maximum_Burst_Size = "12"
+ Exception_Policy = "1"
+ Inactivity_Interval = "1234"
+ MSDU_Error_Rate = "12"
+ CLST = "1"
+ CDESC = "13or37"
+ Vendor_Specific = "Var"
+ ATS_Tolerance = "12"
+ Smallest_Tolerable_Average_Data_Rate = "12"
+ Original_Average_Data_Rate = "12"
+ #QoS_and_MAC_Parameter_Field_(CM-CM)
+ Rx_Window_Size = "12"
+ Smoothing_Buffer_Size = "123"
+ Bidirectional_Burst_CM_CM = "1"
+ #QoS_and_MAC_Parameter_Field_(CM-CCo)
+ TXOPs_per_Beacon_Period = "1"
+ Average_Number_of_PBs_per_TXOP = "12"
+ Minimum_Number_of_PBs_per_TXOP = "12"
+ Maximum_Number_of_PBs_per_TXOP = "12"
+ PPB_Threshold = "12"
+ Surplus_Bandwidth = "12"
+ #Exception_Policy = "1" #Twice Defined
+ #CDESC = "13or37" #Twice Defined
+ #Vendor_Specific = "Var" #Twice Defined ???
+ Smallest_Tolerable_Average_Number_of_PBs_per_TXOP = "12"
+ Original_Average_Number_of_PBs_per_TXOP = "12"
+ Bidirectional_Burst_CM_CCO = "1" \ No newline at end of file
diff --git a/maximus/python/lib/fidMethod.py b/maximus/python/lib/fidMethod.py
new file mode 100644
index 0000000000..354f33a9e9
--- /dev/null
+++ b/maximus/python/lib/fidMethod.py
@@ -0,0 +1,409 @@
+#FID Methods
+
+from fidBody import *
+from struct import *
+from Constants import *
+
+#FidMethod can create every FID Body of CSPEC
+# from FID format
+class FidMethod():
+
+ fidBody = FidBody()
+
+ #createDelay_Bound_FID creates
+ # the FID Field of the CSPEC
+ Delay_Bound = 10000000 #10 seconds by default
+ def createDelay_Bound_FID(self):
+ self.fidBody.Delay_Bound = pack('I',self.Delay_Bound)
+ return self.fidBody.Delay_Bound
+
+ #createJitter_Bound_FID creates
+ # the FID Field of the CSPEC
+ Jitter_Bound = 10000000 #10 seconds by default
+ def createJitter_Bound_FID(self):
+ self.fidBody.Jitter_Bound = pack('I',self.Jitter_Bound)
+ return self.fidBody.Jitter_Bound
+
+ #createAverage_MSDU_Size_FID creates
+ # the FID Field of the CSPEC
+ Average_MSDU_Size = 502 #502 octets by default (ie 1 fragment = 1/3 Max size)
+ def createAverage_MSDU_Size_FID(self):
+ self.fidBody.Average_MSDU_Size = pack('H',self.Average_MSDU_Size)
+ return self.fidBody.Average_MSDU_Size
+
+ #createMaximum_MSDU_Size_FID creates
+ # the FID Field of the CSPEC
+ Maximum_MSDU_Size = 1506 #1506 octets by default (ie 3 fragments)
+ def createMaximum_MSDU_Size_FID(self):
+ self.fidBody.Maximum_MSDU_Size = pack('H',self.Maximum_MSDU_Size)
+ return self.fidBody.Maximum_MSDU_Size
+
+ #createAverage_Data_Rate_FID creates
+ # the FID Field of the CSPEC
+ Average_Data_Rate = 10000 #100 Mbps by default (ie 1/2 Max Rate)
+ def createAverage_Data_Rate_FID(self):
+ self.fidBody.Average_Data_Rate = pack('H',self.Average_Data_Rate)
+ return self.fidBody.Average_Data_Rate
+
+ #createMinimum_Data_Rate_FID creates
+ # the FID Field of the CSPEC
+ Minimum_Data_Rate = 1 #10 Kbps by default (ie Min Rate)
+ def createMinimum_Data_Rate_FID(self):
+ self.fidBody.Minimum_Data_Rate = pack('H',self.Minimum_Data_Rate)
+ return self.fidBody.Minimum_Data_Rate
+
+ #createMaximum_Data_Rate_FID creates
+ # the FID Field of the CSPEC
+ Maximum_Data_Rate = 20000 #200 Mbps by default (ie Max Rate)
+ def createMaximum_Data_Rate_FID(self):
+ self.fidBody.Maximum_Data_Rate = pack('H',self.Maximum_Data_Rate)
+ return self.fidBody.Maximum_Data_Rate
+
+ #createMaximum_Inter-TXOP_time_FID creates
+ # the FID Field of the CSPEC
+ Maximum_Inter_TXOP_time = 10000 #10 milliseconds by default
+ def createMaximum_Inter_TXOP_time_FID(self):
+ self.fidBody.Maximum_Inter_TXOP_time = pack('H',self.Maximum_Inter_TXOP_time)
+ return self.fidBody.Maximum_Inter_TXOP_time
+
+ #createMinimum_Inter-TXOP_time_FID creates
+ # the FID Field of the CSPEC
+ Minimum_Inter_TXOP_time = 40 #40 microseconds by default
+ def createMinimum_Inter_TXOP_time_FID(self):
+ self.fidBody.Minimum_Inter_TXOP_time = pack('H',self.Minimum_Inter_TXOP_time)
+ return self.fidBody.Minimum_Inter_TXOP_time
+
+ #createMaximum_Burst_Size_FID creates
+ # the FID Field of the CSPEC
+ Maximum_Burst_Size = 1506 #1506 octets by default (ie 3 fragments)
+ def createMaximum_Burst_Size_FID(self):
+ self.fidBody.Maximum_Burst_Size = pack('H',self.Maximum_Burst_Size)
+ return self.fidBody.Maximum_Burst_Size
+
+ #createException_Policy_FID creates
+ # the FID Field of the CSPEC
+ Exception_Policy = 0 #0=terminate the connection by default
+ def createException_Policy_FID(self):
+ self.fidBody.Exception_Policy = pack('H',self.Exception_Policy)[0]
+ return self.fidBody.Exception_Policy
+
+ #createInactivity_Interval_FID creates
+ # the FID Field of the CSPEC
+ Inactivity_Interval = 60000000 #60 seconds by default
+ def createInactivity_Interval_FID(self):
+ self.fidBody.Inactivity_Interval = pack('I',self.Inactivity_Interval)
+ return self.fidBody.Inactivity_Interval
+
+ #createMSDU_Error_Rate_FID creates
+ # the FID Field of the CSPEC
+ xMSDU_Error_Rate = 1 #x*10^-y :
+ yMSDU_Error_Rate = 2 #1% by default
+ def createMSDU_Error_Rate_FID(self):
+ self.fidBody.MSDU_Error_Rate = pack('H',self.xMSDU_Error_Rate)[0] + pack('H',self.yMSDU_Error_Rate)[0]
+ return self.fidBody.MSDU_Error_Rate
+
+ #createCLST_FID creates
+ # the FID Field of the CSPEC
+ CLST = 0 #0=IEEE 802.3 SAP by default
+ def createCLST_FID(self):
+ self.fidBody.CLST = pack('H',self.CLST)[0]
+ return self.fidBody.CLST
+
+ #CDESC Fields :
+
+ # IP Protocol Version
+ # =0=IPv4
+ # =1=IPv6
+ ipVersion = 0
+ ipVersionField = pack('H',ipVersion)[0]
+ def createIpVersion(self):
+ self.ipVersionField = pack('H',self.ipVersion)[0]
+
+ # IP Address or Source HLE
+ # 4 octets long for IPv4
+ # 16 octets long for IPv6
+ sourceIpAddress = 0x41424344
+ if ipVersion == 0:
+ sourceIpAddressField = pack('I',sourceIpAddress)
+ else:
+ #if IPv6 : IP Address = "8 MSBytes" + "8 LSBytes"
+ sourceIpAddressField = pack('Q',sourceIpAddress/pow(2,64)) + pack('Q',sourceIpAddress%pow(2,64))
+ def createSourceIpAddress(self):
+ if self.ipVersion == 0:
+ self.sourceIpAddressField = pack('I',self.sourceIpAddress)
+ else:
+ #if IPv6 : IP Address = "8 MSBytes" + "8 LSBytes"
+ self.sourceIpAddressField = pack('Q',self.sourceIpAddress/pow(2,64)) + pack('Q',self.sourceIpAddress%pow(2,64))
+
+ # IP Port Number of Source HLE
+ sourceIpPort = 0x6162
+ sourceIpPortField = pack('H',sourceIpPort)
+ def createSourceIpPort(self):
+ self.sourceIpPortField = pack('H',self.sourceIpPort)
+
+ # IP Address of Destination HLE
+ # 4 octets long for IPv4
+ # 16 octets long for IPv6
+ destinationIpAddress = 0x61626364
+ if ipVersion == 0:
+ destinationIpAddressField = pack('I',destinationIpAddress)
+ else:
+ #if IPv6 : IP Address = "8 MSBytes" + "8 LSBytes"
+ destinationIpAddressField = pack('Q',destinationIpAddress/pow(2,64)) + pack('Q',destinationIpAddress%pow(2,64))
+ def createDestinationIpAddress(self):
+ if self.ipVersion == 0:
+ self.destinationIpAddressField = pack('I',self.destinationIpAddress)
+ else:
+ #if IPv6 : IP Address = "8 MSBytes" + "8 LSBytes"
+ self.destinationIpAddressField = pack('Q',self.destinationIpAddress/pow(2,64)) + pack('Q',self.destinationIpAddress%pow(2,64))
+
+ # IP Port Number of destination HLE
+ destinationIpPort = 0x7879
+ destinationIpPortField = pack('H',destinationIpPort)
+ def createDestinationIpPort(self):
+ self.destinationIpPortField = pack('H',self.destinationIpPort)
+
+ # IP Protocol Type
+ #
+ # ASSIGNED INTERNET PROTOCOL NUMBERS
+ #
+ #In the Internet Protocol (IP) [33] there is a field, called Protocol,
+ #to identify the the next level protocol. This is an 8 bit field.
+ #
+ #Assigned Internet Protocol Numbers
+ #
+ #Decimal Protocol Numbers
+ #------- ----------------
+ #0 Reserved
+ #1 ICMP
+ #2 Unassigned
+ #3 Gateway-to-Gateway
+ #4 CMCC Gateway Monitoring Message
+ #5 ST
+ #6 TCP
+ #7 UCL
+ #8 Unassigned
+ #9 Secure
+ #10 BBN RCC Monitoring
+ #11 NVP
+ #12 PUP
+ #13 Pluribus
+ #14 Telenet
+ #15 XNET
+ #16 Chaos
+ #17 User Datagram
+ #18 Multiplexing
+ #19 DCN
+ #20 TAC Monitoring
+ #21-62 Unassigned
+ #63 any local network
+ #64 SATNET and Backroom EXPAK
+ #65 MIT Subnet Support
+ #66-68 Unassigned
+ #69 SATNET Monitoring
+ #70 Unassigned
+ #71 Internet Packet Core Utility
+ #72-75 Unassigned
+ #76 Backroom SATNET Monitoring
+ #77 Unassigned
+ #78 WIDEBAND Monitoring
+ #79 WIDEBAND EXPAK
+ #80-254 Unassigned
+ #255 Reserved
+ protocolType = 6 #TCP by default
+ protocolTypeField = pack('H',protocolType)[0]
+ def createProtocolType(self):
+ self.protocolTypeField = pack('H',self.protocolType)[0]
+
+ #createCDESC_FID creates
+ # the FID Field of the CSPEC
+ CDESC = 0
+ def createCDESC_FID(self):
+ createIpVersion()
+ createSourceIpAddress()
+ createSourceIpPort()
+ createDestinationIpAddress()
+ createDestinationIpPort()
+ createProtocolType()
+ self.fidBody.CDESC = self.ipVersionField + self.sourceIpAddressField + self.sourceIpPortField + self.destinationIpAddressField + self.destinationIpPortField + self.protocolTypeField
+ return self.fidBody.CDESC
+
+ #Vendor Specific Fields :
+
+ # Organizationally Unique Identifier
+ oui = 0x535043 #OUI = "SPC" = SPiDCOM
+ ouiField = pack('I',oui)[0:3]
+ def createOui(self):
+ self.ouiField = pack('I',self.oui)[0:3]
+
+ # Vendor Defined Fields
+ vendorDefined = 0
+ if vendorDefined == 0:
+ vendorDefinedField = ""
+ else:
+ vendorDefinedField = pack('Q',vendorDefined)
+ def createVendorDefined(self):
+ if self.vendorDefined == 0:
+ self.vendorDefinedField = ""
+ else:
+ self.vendorDefinedField = pack('Q',self.vendorDefined)
+
+ #createVendor_Specific_FID creates
+ # the FID Field of the CSPEC
+ Vendor_Specific = 0
+ def createVendor_Specific_FID(self):
+ createOui()
+ createVendorDefined()
+ self.fidBody.Vendor_Specific = self.ouiField + self.vendorDefinedField
+ return self.fidBody.Vendor_Specific
+
+ #createVendor_Specific_FID creates
+ # the FID Field of the CSPEC
+ ATS_Tolerance = 0 #0 microseconds by default
+ def createATS_Tolerance_FID(self):
+ self.fidBody.ATS_Tolerance = pack('H',self.ATS_Tolerance)
+ return self.fidBody.ATS_Tolerance
+
+ #createSmallest_Tolerable_Average_Data_Rate_FID creates
+ # the FID Field of the CSPEC
+ Smallest_Tolerable_Average_Data_Rate = 1 #10 Kbps by default (ie Min Rate)
+ def createSmallest_Tolerable_Average_Data_Rate_FID(self):
+ self.fidBody.Smallest_Tolerable_Average_Data_Rate = pack('H',self.Smallest_Tolerable_Average_Data_Rate)
+ return self.fidBody.Smallest_Tolerable_Average_Data_Rate
+
+ #createOriginal_Average_Data_Rate_FID creates
+ # the FID Field of the CSPEC
+ Original_Average_Data_Rate = 10000 #100 Mbps by default (ie 1/2 Max Rate)
+ def createOriginal_Average_Data_Rate_FID(self):
+ self.fidBody.Original_Average_Data_Rate = pack('H',self.Original_Average_Data_Rate)
+ return self.fidBody.Original_Average_Data_Rate
+
+ #createRx_Window_Size_FID creates
+ # the FID Field of the CSPEC
+ Rx_Window_Size = 1 #512 octets by default
+ def createRx_Window_Size_FID(self):
+ self.fidBody.Rx_Window_Size = pack('H',self.Rx_Window_Size)
+ return self.fidBody.Rx_Window_Size
+
+ #createSmoothing_Buffer_Size_FID creates
+ # the FID Field of the CSPEC
+ Smoothing_Buffer_Size = 0x100000 #1 Mo by default
+ def createSmoothing_Buffer_Size_FID(self):
+ self.fidBody.Smoothing_Buffer_Size = pack('I',self.Smoothing_Buffer_Size)[0:3]
+ return self.fidBody.Smoothing_Buffer_Size
+
+ #createBidirectional_Burst_CM_CM_FID creates
+ # the FID Field of the CSPEC
+ # 0 : both links are local links
+ # 1 : Bidirectional Bursts in CFP will always end with a SACK
+ # 2 : Bidirectional Burst in CFP may end with a Reverse SOF
+ Bidirectional_Burst_CM_CM = 0 #Local links by default
+ def createBidirectional_Burst_CM_CM_FID(self):
+ self.fidBody.Bidirectional_Burst_CM_CM = pack('H',self.Bidirectional_Burst_CM_CM)[0]
+ return self.fidBody.Bidirectional_Burst_CM_CM
+
+ #createTXOPs_per_Beacon_Period_FID creates
+ # the FID Field of the CSPEC
+ TXOPs_per_Beacon_Period = 0 #1 TXOP per Beacon Period by default
+ def createTXOPs_per_Beacon_Period_FID(self):
+ self.fidBody.TXOPs_per_Beacon_Period = pack('H',self.TXOPs_per_Beacon_Period)[0]
+ return self.fidBody.TXOPs_per_Beacon_Period
+
+ #createAverage_Number_of_PBs_per_TXOP_FID creates
+ # the FID Field of the CSPEC
+ Average_Number_of_PBs_per_TXOP = 2 #2 PB per TXOP by default
+ def createAverage_Number_of_PBs_per_TXOP_FID(self):
+ self.fidBody.Average_Number_of_PBs_per_TXOP = pack('H',self.Average_Number_of_PBs_per_TXOP)
+ return self.fidBody.Average_Number_of_PBs_per_TXOP
+
+ #createMinimum_Number_of_PBs_per_TXOP_FID creates
+ # the FID Field of the CSPEC
+ Minimum_Number_of_PBs_per_TXOP = 1 #1 PB per TXOP by default
+ def createMinimum_Number_of_PBs_per_TXOP_FID(self):
+ self.fidBody.Minimum_Number_of_PBs_per_TXOP = pack('H',self.Minimum_Number_of_PBs_per_TXOP)
+ return self.fidBody.Minimum_Number_of_PBs_per_TXOP
+
+ #createMaximum_Number_of_PBs_per_TXOP_FID creates
+ # the FID Field of the CSPEC
+ Maximum_Number_of_PBs_per_TXOP = 3 #3 PB per TXOP by default
+ def createMaximum_Number_of_PBs_per_TXOP_FID(self):
+ self.fidBody.Maximum_Number_of_PBs_per_TXOP = pack('H',self.Maximum_Number_of_PBs_per_TXOP)
+ return self.fidBody.Maximum_Number_of_PBs_per_TXOP
+
+ #createPPB_Threshold_FID creates
+ # the FID Field of the CSPEC
+ PPB_Threshold = 3 #3 PB by default
+ def createPPB_Threshold_FID(self):
+ self.fidBody.PPB_Threshold = pack('H',self.PPB_Threshold)
+ return self.fidBody.createPPB_Threshold_FID
+
+ #createSurplus_Bandwidth_FID creates
+ # the FID Field of the CSPEC
+ Surplus_Bandwidth = 0 #0 No surplus Bandwith required by default
+ def createSurplus_Bandwidth_FID(self):
+ self.fidBody.Surplus_Bandwidth = pack('H',self.Surplus_Bandwidth)
+ return self.fidBody.createSurplus_Bandwidth_FID
+
+ #createSmallest_Tolerable_Average_Number_of_PBs_per_TXOP_FID creates
+ # the FID Field of the CSPEC
+ Smallest_Tolerable_Average_Number_of_PBs_per_TXOP = 1 #1 PB per TXOP by default
+ def createSmallest_Tolerable_Average_Number_of_PBs_per_TXOP_FID(self):
+ self.fidBody.Smallest_Tolerable_Average_Number_of_PBs_per_TXOP = pack('H',self.Smallest_Tolerable_Average_Number_of_PBs_per_TXOP)
+ return self.fidBody.Smallest_Tolerable_Average_Number_of_PBs_per_TXOP
+
+ #createOriginal_Average_Number_of_PBs_per_TXOP_FID creates
+ # the FID Field of the CSPEC
+ Original_Average_Number_of_PBs_per_TXOP = 2 #2 PB per TXOP by default
+ def createOriginal_Average_Number_of_PBs_per_TXOP_FID(self):
+ self.fidBody.Original_Average_Number_of_PBs_per_TXOP = pack('H',self.Original_Average_Number_of_PBs_per_TXOP)
+ return self.fidBody.Original_Average_Number_of_PBs_per_TXOP
+
+ #createBidirectional_Burst_CM_CM_FID creates
+ # the FID Field of the CSPEC
+ # 0 : Bidirectional Bursts will always end with a SACK
+ # 1 : Bidirectional Burst may end with a Reverse SOF
+ Bidirectional_Burst_CM_CCO = 0 #SACK by default
+ def createBidirectional_Burst_CM_CCO_FID(self):
+ self.fidBody.Bidirectional_Burst_CM_CCO = pack('H',self.Bidirectional_Burst_CM_CCO)[0]
+ return self.fidBody.Bidirectional_Burst_CM_CCO
+
+ #
+ def __init__(self):
+ #CSPEC_Field
+ self.dico = {Delay_Bound:self.createDelay_Bound_FID,
+ Jitter_Bound:self.createJitter_Bound_FID,
+ Average_MSDU_Size:self.createAverage_MSDU_Size_FID,
+ Maximum_MSDU_Size:self.createMaximum_MSDU_Size_FID,
+ Average_Data_Rate:self.createAverage_Data_Rate_FID,
+ Minimum_Data_Rate:self.createMinimum_Data_Rate_FID,
+ Maximum_Data_Rate:self.createMaximum_Data_Rate_FID,
+ Maximum_Inter_TXOP_time:self.createMaximum_Inter_TXOP_time_FID,
+ Minimum_Inter_TXOP_time:self.createMinimum_Inter_TXOP_time_FID,
+ Maximum_Burst_Size:self.createMaximum_Burst_Size_FID,
+ Exception_Policy:self.createException_Policy_FID,
+ Inactivity_Interval:self.createInactivity_Interval_FID,
+ MSDU_Error_Rate:self.createMSDU_Error_Rate_FID,
+ CLST:self.createCLST_FID,
+ CDESC:self.createCDESC_FID,
+ Vendor_Specific:self.createVendor_Specific_FID,
+ ATS_Tolerance:self.createATS_Tolerance_FID,
+ Smallest_Tolerable_Average_Data_Rate:self.createSmallest_Tolerable_Average_Data_Rate_FID,
+ Original_Average_Data_Rate:self.createOriginal_Average_Data_Rate_FID,
+ #QoS_and_MAC_Parameter_Field_(CM_CM):self.createQoS_and_MAC_Parameter_Field_(CM_CM)
+ Rx_Window_Size:self.createRx_Window_Size_FID,
+ Smoothing_Buffer_Size:self.createSmoothing_Buffer_Size_FID,
+ Bidirectional_Burst_CM_CM:self.createBidirectional_Burst_CM_CM_FID,
+ #QoS_and_MAC_Parameter_Field_(CM_CCo):self.createQoS_and_MAC_Parameter_Field_(CM_CCo)
+ TXOPs_per_Beacon_Period:self.createTXOPs_per_Beacon_Period_FID,
+ Average_Number_of_PBs_per_TXOP:self.createAverage_Number_of_PBs_per_TXOP_FID,
+ Minimum_Number_of_PBs_per_TXOP:self.createMinimum_Number_of_PBs_per_TXOP_FID,
+ Maximum_Number_of_PBs_per_TXOP:self.createMaximum_Number_of_PBs_per_TXOP_FID,
+ PPB_Threshold:self.createPPB_Threshold_FID,
+ Surplus_Bandwidth:self.createSurplus_Bandwidth_FID,
+ #Exception_Policy:self.createException_Policy
+ #CDESC:self.createCDESC
+ #Vendor_Specific:self.createVendor_Specific
+ Smallest_Tolerable_Average_Number_of_PBs_per_TXOP:self.createSmallest_Tolerable_Average_Number_of_PBs_per_TXOP_FID,
+ Original_Average_Number_of_PBs_per_TXOP:self.createOriginal_Average_Number_of_PBs_per_TXOP_FID,
+ Bidirectional_Burst_CM_CCO:self.createBidirectional_Burst_CM_CCO_FID
+ } \ No newline at end of file
diff --git a/maximus/python/lib/mmentry.py b/maximus/python/lib/mmentry.py
new file mode 100644
index 0000000000..6768c6d5d9
--- /dev/null
+++ b/maximus/python/lib/mmentry.py
@@ -0,0 +1,121 @@
+# -*- coding:Latin-1 -*-
+
+class Mmentry():
+ #MMENTRY format by MME
+ #--- Station – Central Coordination ---
+ CC_CCO_APPOINT_REQ = "1234567"
+ CC_CCO_APPOINT_CNF = "1"
+ CC_BACKUP_APPOINT_REQ = "1"
+ CC_BACKUP_APPOINT_CNF = "1"
+ CC_LINK_INFO_REQ = ""
+ CC_LINK_INFO_CNF = "1"+"Var"+"*N"+"=b"
+ CC_LINK_INFO_IND = "1"+"Var"+"*N"+"=b"
+ CC_LINK_INFO_RSP = ""
+ CC_HANDOVER_REQ = "12"
+ CC_HANDOVER_CNF = "1"
+ CC_HANDOVER_INFO_IND = "123"+"N*"+"123456789"+"=b"
+ CC_HANDOVER_INFO_RSP = ""
+ CC_DISCOVER_LIST_REQ = ""
+ CC_DISCOVER_LIST_CNF = "1"+"M*"+"123456789ABC"+"N*"+"123456789ABCD"+"=b"
+ CC_DISCOVER_LIST_IND = "1"+"M*"+"123456789ABC"+"N*"+"123456789ABCD"+"=b"
+ CC_LINK_NEW_REQ = "123456789ABCDE"+"Var"+"1"+"123"+"*N"+"1"+"123"+"*K"+"=a"
+ CC_LINK_NEW_CNF = "12345"+"Var"+"=a"
+ CC_LINK_MOD_REQ = "12"+"Var"+"Var"+"Var"+"=a"
+ CC_LINK_MOD_CNF = "123"+"Var"+"=a"
+ CC_LINK_SQZ_REQ = "12"+"Var"+"=a"
+ CC_LINK_SQZ_CNF = "123"+"Var"+"=a"
+ CC_LINK_REL_REQ = "1234"+"Var"+"=a"
+ CC_LINK_REL_IND = "123456789"+"Var"+"Var"+"=a"
+ CC_DETECT_REPORT_REQ = "12"+"N"+"=a"
+ CC_DETECT_REPORT_CNF = "1"+"123456"+"*N"+"=a"
+ CC_WHO_RU_REQ = "1234567"
+ CC_WHO_RU_CNF = "1234567"+"123456"+"12345678*8"
+ CC_ASSOC_REQ = "123456789A"
+ CC_ASSOC_CNF = "123456789ABC"
+ CC_LEAVE_REQ = "1"
+ CC_LEAVE_CNF = ""
+ CC_LEAVE_IND = "12345678"
+ CC_LEAVE_RSP = ""
+ CC_SET_TEI_MAP_REQ = ""
+ CC_SET_TEI_MAP_IND = "12"+"12345678"+"*n"+"=b"
+ CC_RELAY_REQ = "123456789"+"Var"+"=a"
+ CC_RELAY_IND = "123456789"+"Var"+"=a"
+ CC_BEACON_RELIABILITY_REQ = ""
+ CC_BEACON_RELIABILITY_CNF = "1234"
+ CC_ALLOC_MOVE_REQ = "1234"+"Var"+"Var"+"=a"
+ CC_ALLOC_MOVE_CNF = "123"
+ CC_ACCESS_NEW_REQ = "12345678"+"Var"+"Var"+"=a"
+ CC_ACCESS_NEW_CNF = "123456"
+ CC_ACCESS_NEW_IND = "123456789ABC"
+ CC_ACCESS_NEW_RSP = "1234"+"Var"+"Var"+"=a"
+ CC_ACCESS_REL_REQ = "123"
+ CC_ACCESS_REL_CNF = "123"
+ CC_ACCESS_REL_IND = "123"
+ CC_ACCESS_REL_RSP = "123"
+ CC_DCPPC_IND = "1"
+ CC_DCPPC_RSP = ""
+ CC_HP1_DET_REQ = ""
+ CC_HP1_DET_CNF = "123456"
+ CC_BLE_UPDATE_IND = "1"+"Var"+"=a"
+ #to 0x1FFC : Reserved for future use
+ #--- Proxy Coordinator ---
+ CP_PROXY_APPOINT_REQ = "1234"+"12345678"+"*N"+"=b"
+ CP_PROXY_APPOINT_CNF = "12"
+ PH_PROXY_APPOINT_IND = "123456789ABCDEF"
+ CP_PROXY_WAKE_REQ = ""
+ #to 0x3FFC : Reserved for future use
+ #--- CCo – CCo ---
+ NN_INL_REQ = "123456789ABCDE"+"123456789ABCD"+"*N"+"=a"
+ NN_INL_CNF = "123456789ABCDE"+"123456789ABCD"+"*N"+"=a"
+ NN_NEW_NET_REQ = "123456789ABCDE"
+ NN_NEW_NET_CNF = "1234"+"Var"+"=a"
+ NN_NEW_NET_IND = "1234"
+ NN_ADD_ALLOC_REQ = "1234567"+"1234"+"*n"+"=a"
+ NN_ADD_ALLOC_CNF = "1234"
+ NN_ADD_ALLOC_IND = "1234"
+ NN_REL_ALLOC_REQ = "1234567"+"1234"+"*n"+"=a"
+ NN_REL_ALLOC_CNF = "1234"
+ NN_REL_NET_IND = "1234567"+"1234"+"*n"+"=a"
+ #to 0x5FFC : Reserved for future use
+ #--- Station – Station ---
+ CM_UNASSOCIATED_STA_IND = "12345678"
+ CM_ENCRYPTED_PAYLOAD_IND = "123456"+"12345678"+"12345678"+"12"+"0-15"+"Var"+"0or4"+"0or1"+"0or2"+"0or1"+"0-15"+"0or1"+"=a"
+ CM_ENCRYPTED_PAYLOAD_RSP = "1234"
+ CM_SET_KEY_REQ = "123456789ABCDE"+"1234567"+"1"+"12345678"+"12345678"
+ CM_SET_KEY_CNF = "123456789ABCDE"
+ CM_GET_KEY_REQ = "123456789"+"12345678"+"Var"+"=a"
+ CM_GET_KEY_CNF = "123456789A"+"123456789ABC"+"Var"+"=a"
+ CM_SC_JOIN_REQ = "1"
+ CM_SC_JOIN_CNF = "12345678"
+ CM_CHAN_EST_IND = "123456789AB"+"L"+"1"+"123"+"*M"+"1234567"+"N*0_5"+"(N%2)*0_5"
+ CM_TM_UPDATE_IND = "12"+"L"+"1"+"123"+"*M"+"1234567"+"12"+"*N"+"=a"
+ CM_AMP_MAP_REQ = "12"+"N*0_5"+"=a" #+"(N%2)*0_5"???
+ CM_AMP_MAP_CNF = "1"
+ CM_BRG_INFO_REQ = ""
+ CM_BRG_INFO_CNF = "1"+"Var"+"=a"
+ CM_CONN_NEW_REQ = "12"+"Var"+"Var"+"=a"
+ CM_CONN_NEW_CNF = "1234"+"Var"+"=a"
+ CM_CONN_REL_IND = "123"+"Var"+"=a"
+ CM_CONN_REL_RSP = "12"
+ CM_CONN_MOD_REQ = "12"+"Var"+"=a"
+ CM_CONN_MOD_CNF = "123"+"Var"+"=a"
+ CM_CONN_INFO_REQ = "1234"
+ CM_CONN_INFO_CNF = "1"+"Var"+"*N"+"=b"
+ CM_STA_CAP_REQ = ""
+ CM_STA_CAP_CNF = "123456789ABCDEF"+"123456789A"
+ CM_NW_INFO_REQ = ""
+ CM_NW_INFO_CNF = "1"+"Var"+"*N"+"=a"
+ CM_GET_BEACON_REQ = "1234567"
+ CM_GET_BEACON_CNF = "123456789ABC"+"Var"+"=a"
+ CM_HFID_REQ = "1"+"0or6"+"0or64"+"=a"
+ CM_HFID_CNF = "1"+"12345678"+"12345678"+"12345678"+"12345678"+"12345678"+"12345678"+"12345678"+"12345678"
+ CM_MME_ERROR_IND = "123456"
+ CM_NW_STATS_REQ = ""
+ CM_NW_STATS_CNF = "1"+"12345678"+"*L"+"=b"
+ CM_LINK_STATS_REQ = "12345678"+"12345678"+"12"
+ CM_LINK_STATS_CNF = "12"+"Var"+"=a"
+ #to 0x7FFC : Reserved for future use
+ #--- Manufacturer Specific ---
+ #to 0x9FFC : Manufacturer Specific Messages
+ #--- Vendor Specific ---
+ #to 0xBFFC : Vendor-Specific Messages \ No newline at end of file
diff --git a/maximus/python/lib/mmentryFields.py b/maximus/python/lib/mmentryFields.py
new file mode 100644
index 0000000000..3d029b99d5
--- /dev/null
+++ b/maximus/python/lib/mmentryFields.py
@@ -0,0 +1,967 @@
+#MMENTRY Fields
+
+from struct import *
+from fidMethod import *
+from math import *
+
+
+
+
+#CINFO identifies the attributes of the Connection and the MAC and PAL
+# operations required by the Connection at the source and destinations
+# STAs. The format of the CINFO fields is shown in Table 7-145.
+# A separate CINFO field is required for the forward and reverse
+# directions of the Connection.
+# The CINFO, QoS, and MAC parameter fields specifically apply to the
+# forward or Reverse Links, as indicated in the CSPEC.
+class Cinfo():
+ #CINFO :
+
+ # CINFO Validity
+ valid = 1 #1:CINFO is Valid, 0:CINFO is not Valid
+ validField = pack('H',valid)[0]
+ def createValid(self):
+ self.validField = pack('H',self.valid)[0]
+
+ # Connections and Network Modes
+ # 0=contention-free service
+ # 1=contention-based service
+ # 2=contention-free sevice prefered
+ macServiceType = 2
+ if valid == 1:
+ macServiceTypeField = pack('H',macServiceType)[0]
+ else:
+ macServiceTypeField = ""
+ def createMacServiceType(self):
+ if self.valid == 1:
+ self.macServiceTypeField = pack('H',self.macServiceType)[0]
+ else:
+ self.macServiceTypeField = ""
+
+ # Channel Access Priority
+ userPriority = 0
+ if valid == 1:
+ userPriorityField = pack('H',userPriority)[0]
+ else:
+ userPriorityField = ""
+ def createUserPriority(self):
+ if self.valid == 1:
+ self.userPriorityField = pack('H',self.userPriority)[0]
+ else:
+ self.userPriorityField = ""
+
+ # Arrival Time Stamp to HLE
+ # 0=ATS should not be passed to HLE
+ # 1=ATS should be passed to HLE
+ ats = 1
+ if valid == 1:
+ atsField = pack('H',ats)[0]
+ else:
+ atsField = ""
+ def createAts(self):
+ if self.valid == 1:
+ self.atsField = pack('H',self.ats)[0]
+ else:
+ self.atsField = ""
+
+ # Smoothing Requested
+ # 0=Smotthing is not requested
+ # 1=if supported receiver should activate smoothing
+ smoothing = 1
+ if valid == 1:
+ smoothingField = pack('H',smoothing)[0]
+ else:
+ smoothingField = ""
+ def createSmoothing(self):
+ if self.valid == 1:
+ self.smoothingField = pack('H',self.smoothing)[0]
+ else:
+ self.smoothingField = ""
+
+ #CINFO Field :
+ cinfo = validField + macServiceTypeField + userPriorityField + atsField + smoothingField
+ def createCinfo(self):
+ self.createValid()
+ self.createMacServiceType()
+ self.createUserPriority()
+ self.createAts()
+ self.createSmoothing()
+ self.cinfo = self.validField + self.macServiceTypeField + self.userPriorityField + self.atsField + self.smoothingField
+
+#The QoS and MAC parameters identify the QoS requirements (delay, jitter, data
+# rates), as well as MAC parameters that are specific to the particular
+# Connection. The QoS parameters are generated by the Connection Manager using
+# the Auto-Connect function or through PAL-specific primitives exchanged
+# between the higher layer applications and the CM.Each QoS and MAC parameter
+# field consists of a Forward/Reverse (F/R) field, a Length (LEN) field, and a
+# 1-octet Field Identifier (FID) field, followed by the Body of the QoS and MAC
+# Parameter field. Table 7-146 shows the format of a QoS and MAC parameter
+# field. The QMPs exchanged between the HLE and Connection Manager are shown in
+# Table 7-147. The QoS and MAC parameters exchanged between two CMs include the
+# parameters shown in Table 7-147 and Table 7-148. The QoS and MAC parameters
+# exchanged between the CM and CCo are shown in Table 7-149.
+class Qmp():
+ #QMP :
+
+ # Forward/Reverse Field
+ # 0=Forward from source to receiver
+ # 1=Reverse from receiver to source
+ fR = 0
+ fRField = pack('H',fR)[0]
+ def createFR(self):
+ self.fRField = pack('H',self.fR)[0]
+
+ #Length of the Body Field
+ length = 1
+ lengthField = pack('H',length)[0]
+ def createLength(self):
+ self.length = len(self.dataField)
+ self.lengthField = pack('H',self.length)[0]
+
+ #Identifier of the QoS and MAC Parameter Field
+ fid = Delay_Bound #Delay_Bound by default
+ fidField = pack('H',fid)[0]
+ def createFid(self):
+ self.fidField = pack('H',self.fid)[0]
+
+ #Data of the QoS and MAC Parameter Field
+ data = FidMethod()
+ dataField = data.dico[fid]()
+ def createBody(self):
+ self.dataField = self.data.dico[self.fid]()
+ self.createLength()
+
+ #QMP Field :
+ qmp = fRField + lengthField + fidField + dataField
+ def createQmp(self):
+ self.createFR()
+ self.createFid()
+ self.createBody()
+ self.createLength()
+ self.qmp = self.fRField + self.lengthField + self.fidField + self.dataField
+
+#ConnectionSpecification
+class Cspec():
+ #Length of CSPEC including the 2 CSPEC_LEN field octets
+ cspecLen = 2
+ cspecLenField = pack('H',cspecLen)
+ def createCspecLen(self):
+ if self.cspecLen != 0:
+ self.cspecLen = 2 + len(self.cinfoForward.cinfo) + len(self.cinfoReverse.cinfo) + len(self.qmpForward.qmp) + len(self.qmpReverse.qmp)
+ self.cspecLenField = pack('H',self.cspecLen)
+
+ #CINFO Forward Field
+ cinfoForward = Cinfo()
+
+ #CINFO Reverse Field
+ cinfoReverse = Cinfo()
+
+ #QMP Forward Field
+ qmpForward = Qmp()
+
+ #QMP Reverse Field
+ qmpReverse = Qmp()
+
+ #CSPEC Field :
+ cspec = cspecLenField + cinfoForward.cinfo + cinfoReverse.cinfo + qmpForward.qmp + qmpReverse.qmp
+ def createCspec(self):
+ if self.cspecLen != 0:
+ self.cinfoForward.createCinfo()
+ self.cinfoReverse.createCinfo()
+ self.qmpForward.createQmp()
+ self.qmpReverse.createQmp()
+ self.createCspecLen()
+ self.cspec = self.cspecLenField + self.cinfoForward.cinfo + self.cinfoReverse.cinfo + self.qmpForward.qmp + self.qmpReverse.qmp
+ else:
+ self.createCspecLen()
+ self.cspec = self.cspecLenField
+
+#Bit Loading Estimate
+class Ble():
+
+ #Number of intervals
+ num = 256 #By default MAX Bit Loading Estimates are available
+ numField = pack('H',num)[0]
+ def createNum(self):
+ self.numField = pack('H',self.num)[0]
+
+ #Interval End Time #1-N and Bit Loading Estimate #1-N
+ endTime = []
+ endTimeField = []
+ intBle = [] #BLE integer format
+ exponent = []
+ mantissa = []
+ interval = [] #BLE is splited into 5 mantissa MSbits and 3 exponent LSbits
+ intervalField = []
+ i = 0
+ while i < num:
+ endTime.append(0)
+ endTimeField.append(pack('H',endTime[i]))
+ intBle.append(0)
+ exponent.append(max(0,int(log(max(2,intBle[0]),2))-1))
+ mantissa.append(max(0,int(32*(intBle[0]/pow(2,exponent[0]+1)-1))))
+ interval.append(mantissa[i]*pow(2,3)+exponent[i]) #is the Bit Loading Estimate #1-N
+ intervalField.append(pack('H',interval[i])[0])
+ i=i+1
+ num=0
+ def createIntervalEndTimeAndBitLoadingEstimate(self):
+ self.i = 0
+ while self.i < self.num:
+ self.endTime[self.i] = 0
+ self.endTimeField[self.i] = pack('H',self.endTime[self.i])
+ self.intBle[self.i] = 0
+ self.exponent[self.i] = max(0,int(log(max(2,self.intBle[self.i]),2))-1)
+ self.mantissa[self.i] = max(0,int(32*(self.intBle[self.i]/pow(2,self.exponent[self.i]+1)-1)))
+ self.interval[self.i] = int(self.mantissa[self.i]*pow(2,3)+self.exponent[self.i])
+ self.intervalField[self.i] = pack('H',self.interval[self.i])[0]
+ self.i = self.i + 1
+
+ #BLE Field :
+ ble = numField
+ i = 0
+ while i < num:
+ ble = ble + endTimeField[i] + intervalField[i]
+ i = i + 1
+ def createBle(self):
+ self.createNum()
+ self.createIntervalEndTimeAndBitLoadingEstimate()
+ self.ble = self.numField
+ self.i = 0
+ while self.i < self.num:
+ self.ble = self.ble + self.endTimeField[self.i] + self.intervalField[self.i]
+ self.i = self.i + 1
+
+#Connection Identifier
+class Cid():
+ tei = 0
+ teiField = pack('H',tei)[0]
+ def createTei(self):
+ self.teiField = pack('H',self.tei)[0]
+ llidF = 0
+ llidFField = pack('H',llidF)[0]
+ def createLlidF(self):
+ self.llidFField = pack('H',self.llidF)[0]
+ cid = teiField + llidFField
+ def createCid(self):
+ self.createTei()
+ self.createLlidF()
+ self.cid = self.teiField + self.llidFField
+
+#Global Link Informations
+class GlobalLinkInfo():
+ cid = Cid()
+ stei = 0
+ steiField = pack('H',stei)[0]
+ def createStei(self):
+ self.steiField = pack('H',self.stei)[0]
+ dtei = 0
+ dteiField = pack('H',dtei)[0]
+ def createDtei(self):
+ self.dteiField = pack('H',self.dtei)[0]
+ lidF = 0xFF
+ lidFField = pack('H',lidF)[0]
+ def createLidF(self):
+ self.lidFField = pack('H',self.lidF)[0]
+ lidR = 0xFF
+ lidRField = pack('H',lidR)[0]
+ def createLidR(self):
+ self.lidRField = pack('H',self.lidR)[0]
+ cspec = Cspec()
+ bleForward = Ble()
+ bleReverse = Ble()
+
+ globalLinkInfo = cid.cid + steiField + dteiField + lidFField + lidRField + cspec.cspec + bleForward.ble + bleReverse.ble
+ def createGlobalLinkInfo(self):
+ self.cid.createCid()
+ self.createStei()
+ self.createDtei()
+ self.createLidF()
+ self.createLidR()
+ self.cspec.createCspec()
+ self.bleForward.createBle()
+ self.bleReverse.createBle()
+ self.globalLinkInfo = self.cid.cid + self.steiField + self.dteiField + self.lidFField + self.lidRField + self.cspec.cspec + self.bleForward.ble + self.bleReverse.ble
+
+#Station Informations
+class StaInfo():
+ tei = 0
+ teiField = pack('H',tei)[0]
+ def createTei(self):
+ self.teiField = pack('H',self.tei)[0]
+ macAddress = 0
+ macAddressField = pack('Q',macAddress)[0:6]
+ def createMacAddress(self):
+ self.macAddressField = pack('Q',self.macAddress)[0:6]
+ status = 0
+ statusField = pack('H',status)[0]
+ def createStatus(self):
+ self.statusField = pack('H',self.status)[0]
+ ptei = 0
+ pteiField = pack('H',ptei)[0]
+ def createPtei(self):
+ self.pteiField = pack('H',self.ptei)[0]
+ staInfo = teiField + macAddressField + statusField + pteiField
+ def createStaInfo(self):
+ self.createTei()
+ self.createMacAddress()
+ self.createStatus()
+ self.createPtei()
+ self.staInfo = self.teiField + self.macAddressField + self.statusField + self.pteiField
+
+#STA Info
+class StationInfo():
+ macAddress = 0
+ macAddressField = pack('Q',macAddress)[0:6]
+ def createMacAddress(self):
+ self.macAddressField = pack('Q',self.macAddress)[0:6]
+ tei = 0
+ teiField = pack('H',tei)[0]
+ def createTei(self):
+ self.teiField = pack('H',self.tei)[0]
+ sameNetwork = 1 #SameNetwork by default
+ sameNetworkField = pack('H',sameNetwork)[0]
+ def createSameNetwork(self):
+ self.sameNetworkField = pack('H',self.sameNetwork)[0]
+ snid = 0xA
+ access = 0 #in home by default
+ snidAccess = snid + access*pow(2,4)
+ snidAccessField = pack('H',snidAccess)[0]
+ def createSnidAccess(self):
+ self.snidAccessField = pack('H',self.snidAccess)[0]
+ reserved = 0
+ ccoCapability = 0 #does not support QoS and TDMA by default
+ proxyNetworkCapability = 0 #STA does not support Proxy Networking by default
+ backupCcoCapability = 0 #STA does not support the Backup CCo function by default
+ ccoStatus = 0 #STA is not the CCo by default
+ pcoStatus = 0 #STA is not a PCo by default
+ backupCcoStatus = 0 #STA is not a Backup CCo by default
+ ninthOctet = reserved + ccoCapability*pow(2,1) + proxyNetworkCapability*pow(2,3) + backupCcoCapability*pow(2,4) + ccoStatus*pow(2,5) + pcoStatus*pow(2,6) + backupCcoStatus*pow(2,7)
+ ninthOctetField = pack('H',ninthOctet)[0]
+ def createNinthOctet(self):
+ self.ninthOctetField = pack('H',self.ninthOctet)[0]
+ signalLevel = 0 #information not available by default
+ signalLevelField = pack('H',signalLevel)[0]
+ def createSignalLevel(self):
+ self.signalLevelField = pack('H',self.signalLevel)[0]
+ averageBle = Ble()
+ def createAverageBle(self):
+ self.averageBle.num=1
+ self.averageBle.createBle()
+ stationInfo = macAddressField + teiField + sameNetworkField + snidAccessField + ninthOctetField + signalLevelField + averageBle.intervalField[0]
+ def createStationInfo(self):
+ self.createMacAddress()
+ self.createTei()
+ self.createSameNetwork()
+ self.createSnidAccess()
+ self.createNinthOctet()
+ self.createSignalLevel()
+ self.createAverageBle()
+ self.stationInfo = self.macAddressField + self.teiField + self.sameNetworkField + self.snidAccessField + self.ninthOctetField + self.signalLevelField + self.averageBle.intervalField[0]
+
+#Network Info
+class NetworkInfo():
+ reserved = 0
+ securityLevel = 0 #Simple connect by default
+ nidOffset = 0x0f0e0d0c
+ nid = nidOffset + securityLevel*pow(2,52) + reserved*pow(2,54)
+ nidField = pack('Q',nid)[0:7]
+ def createNid(self):
+ self.nid = self.nidOffset + self.securityLevel*pow(2,52) + self.reserved*pow(2,54)
+ self.nidField = pack('Q',self.nid)[0:7]
+ snid = 0xA
+ access = 0 #in home by default
+ snidAccess = snid + access*pow(2,4)
+ snidAccessField = pack('H',snidAccess)[0]
+ def createSnidAccess(self):
+ self.snidAccess = self.snid + self.access*pow(2,4)
+ self.snidAccessField = pack('H',self.snidAccess)[0]
+ hm=0 #AV Only Mode by default
+ hmField = pack('H',hm)[0]
+ def createHm(self):
+ self.hmField = pack('H',self.hm)[0]
+ numSlot = 0 #1 beacon slot by default
+ numSlotField = pack('H',numSlot)[0]
+ def createNumSlot(self):
+ self.numSlotField = pack('H',self.numSlot)[0]
+ coordonatingStatus = 0 #Unknow by default
+ coordonatingStatusField = pack('H',coordonatingStatus)[0]
+ def createCoordonatingStatus(self):
+ self.coordonatingStatusField = pack('H',self.coordonatingStatus)[0]
+ offset = 0 #In the same group by default
+ offsetField = pack('H',offset)
+ def createOffset(self):
+ self.offsetField = pack('H',self.offset)
+ networkInfo = nidField + snidAccessField + hmField + numSlotField + coordonatingStatusField + offsetField
+ def createNetworkInfo(self):
+ self.createNid()
+ self.createSnidAccess()
+ self.createHm()
+ self.createNumSlot()
+ self.createCoordonatingStatus()
+ self.createOffset()
+ self.networkInfo = self.nidField + self.snidAccessField + self.hmField + self.numSlotField + self.coordonatingStatusField + self.offsetField
+
+#GLIDs
+class Glids():
+ glids = []
+ glidsField = []
+ numGlid = 256
+ i = 0
+ while i < numGlid:
+ glids.append(0xFF) #Local CSMA allocation by default
+ glidsField.append(pack('H',glids[i])[0])
+ i=i+1
+ def createGlids(self):
+ self.i = 0
+ while self.i < self.numGlid:
+ self.glidsField[self.i]=pack('H',self.glids[self.i])[0]
+ self.i = self.i + 1
+
+#GLID Info
+class GlidsInfo():
+ glidsInfo = []
+ cfDetecteds = []
+ cfDetectedsField = []
+ csmaDetecteds = []
+ csmaDetectedsField = []
+ hp1Detecteds = []
+ hp1DetectedsField = []
+ othersDetecteds = []
+ othersDetectedsField = []
+ signalLevels = []
+ signalLevelsField = []
+ numGlid = 256
+ glids = Glids()
+ glids.numGlid = numGlid
+ glids.createGlids()
+ def createGlids(self):
+ self.glids.numGlid = self.numGlid
+ self.glids.createGlids()
+ i=0
+ while i<numGlid:
+ cfDetecteds.append(0) #Not detected by default
+ cfDetectedsField.append(pack('H',cfDetecteds[i])[0])
+ i=i+1
+ def createCfDetecteds(self):
+ self.i=0
+ while self.i<self.numGlid:
+ self.cfDetectedsField[self.i] = pack('H',self.cfDetecteds[self.i])[0]
+ self.i=self.i+1
+ i=0
+ while i<numGlid:
+ csmaDetecteds.append(0) #Not detected by default
+ csmaDetectedsField.append(pack('H',csmaDetecteds[i])[0])
+ i=i+1
+ def createCsmaDetecteds(self):
+ self.i=0
+ while self.i<self.numGlid:
+ self.csmaDetectedsField[self.i] = pack('H',self.csmaDetecteds[self.i])[0]
+ self.i=self.i+1
+ i=0
+ while i<numGlid:
+ hp1Detecteds.append(0) #Not detected by default
+ hp1DetectedsField.append(pack('H',hp1Detecteds[i])[0])
+ i=i+1
+ def createHp1Detecteds(self):
+ self.i=0
+ while self.i<self.numGlid:
+ self.hp1DetectedsField[self.i] = pack('H',self.hp1Detecteds[self.i])[0]
+ self.i=self.i+1
+ i=0
+ while i<numGlid:
+ othersDetecteds.append(0) #Not detected by default
+ othersDetectedsField.append(pack('H',othersDetecteds[i])[0])
+ i=i+1
+ def createOthersDetecteds(self):
+ self.i=0
+ while self.i<self.numGlid:
+ self.othersDetectedsField[self.i] = pack('H',self.othersDetecteds[self.i])[0]
+ self.i=self.i+1
+ i=0
+ while i<numGlid:
+ signalLevels.append(0) #Not detected by default
+ signalLevelsField.append(pack('H',signalLevels[i])[0])
+ i=i+1
+ def createSignalLevels(self):
+ self.i=0
+ while self.i<self.numGlid:
+ self.signalLevelsField[self.i] = pack('H',self.signalLevels[self.i])[0]
+ self.i=self.i+1
+ averageBle = Ble()
+ averageBle.num = numGlid
+ averageBle.createBle()
+ def createAverageBles(self):
+ self.averageBle.num = self.numGlid
+ self.averageBle.createBle()
+ i=0
+ while i<numGlid:
+ glidsInfo.append(glids.glidsField[i] + cfDetectedsField[i] + csmaDetectedsField[i] + hp1DetectedsField[i] + othersDetectedsField[i] + signalLevelsField[i] + averageBle.intervalField[i])
+ i=i+1
+ def createGlidsInfo(self):
+ self.createGlids()
+ self.createCfDetecteds()
+ self.createCsmaDetecteds()
+ self.createHp1Detecteds()
+ self.createOthersDetecteds()
+ self.createSignalLevels()
+ self.createAverageBles()
+ self.i=0
+ while self.i<self.numGlid:
+ self.glidsInfo[self.i] = self.glids.glidsField[self.i] + self.cfDetectedsField[self.i] + self.csmaDetectedsField[self.i] + self.hp1DetectedsField[self.i] + self.othersDetectedsField[self.i] + self.signalLevelsField[self.i] + self.averageBle.intervalField[self.i]
+ self.i=self.i+1
+
+
+
+
+
+#MmentryFields lists all fields existing in every MMENTRY
+class MmentryFields():
+
+ #Request Type
+ reqType = 0 #0 is the default processed value
+ reqTypeField = pack('H',reqType)[0]
+ def createReqType(self):
+ self.reqTypeField = pack('H',self.reqType)[0]
+
+ #MAC Address of the STA
+ macAddress = 0
+ macAddressField = pack('Q',macAddress)[0:6]
+ def createMacAddress(self):
+ self.macAddressField = pack('Q',self.macAddress)[0:6]
+
+ #Results Codes
+ result = 0
+ resultField = pack('H',result)[0]
+ def createResult(self):
+ self.resultField = pack('H',self.result)[0]
+
+ #Become Backup CCo or Release Duty
+ appointRelease = 0
+ appointReleaseField = pack('H',appointRelease)[0]
+ def createAppointRelease(self):
+ self.appointReleaseField = pack('H',self.appointRelease)[0]
+
+ #Number
+ num = 256
+ numField = pack('H',num)[0]
+ def createNum(self):
+ self.numField = pack('H',self.num)[0]
+
+ #Link Information of the Global Links
+ globalLinks = []
+ i = 0
+ while i < num:
+ globalLinks.append(GlobalLinkInfo())
+ i=i+1
+ def createGlobalLinks(self):
+ self.i = 0
+ while self.i < self.num:
+ self.globalLinks[self.i].createGlobalLinkInfo()
+ self.i = self.i + 1
+
+ #Soft/Hard
+ softHard = 0 #Soft Handover by default
+ softHardField = pack('H',softHard)[0]
+ def createSoftHard(self):
+ self.softHardField = pack('H',self.softHard)[0]
+
+ #Reason
+ reason = 0 #User-appointed by default
+ reasonField = pack('H',reason)[0]
+ def createReason(self):
+ self.reasonField = pack('H',self.reason)[0]
+
+ #Reason Code indicating the reason for sending CC_HANDOVER_INFO.IND
+ rsc = 0 #Handover in progress by default
+ rscField = pack('H',rsc)[0]
+ def createRsc(self):
+ self.rscField = pack('H',self.rsc)[0]
+
+ #TEI of the Backup CCo
+ backupCco = 0 #no backupCco by default
+ backupCcoField = pack('H',backupCco)[0]
+ def createBackupCco(self):
+ self.backupCcoField = pack('H',self.backupCco)[0]
+
+ #Information of the Stations
+ stasInfo = []
+ i = 0
+ while i < num:
+ stasInfo.append(StaInfo())
+ i=i+1
+ def createStatsInfo(self):
+ self.i = 0
+ while self.i < self.num:
+ self.stasInfo[self.i].createStaInfo()
+ self.i = self.i + 1
+
+ #Number of STA
+ numSta = 256
+ numStaField = pack('H',numSta)[0]
+ def createNumSta(self):
+ self.numStaField = pack('H',self.numSta)[0]
+
+ #Number of Network
+ numNet = 256
+ numNetField = pack('H',numNet)[0]
+ def createNumNet(self):
+ self.numNetField = pack('H',self.numNet)[0]
+
+ #STAs Info
+ stationsInfo = []
+ i = 0
+ while i < numSta:
+ stationsInfo.append(StationInfo())
+ i=i+1
+ def createStationsInfo(self):
+ self.i = 0
+ while self.i < self.numSta:
+ self.stationsInfo[self.i].createStationInfo()
+ self.i = self.i + 1
+
+ #Networks Info
+ networksInfo = []
+ i = 0
+ while i < numNet:
+ networksInfo.append(NetworkInfo())
+ i=i+1
+ def createNetworksInfo(self):
+ self.i = 0
+ while self.i < self.numNet:
+ self.networksInfo[self.i].createNetworkInfo()
+ self.i = self.i + 1
+
+ #Init MAC Address of the STA
+ initMacAddress = 0
+ initMacAddressField = pack('Q',initMacAddress)[0:6]
+ def createInitMacAddress(self):
+ self.initMacAddressField = pack('Q',self.initMacAddress)[0:6]
+
+ #Term MAC Address of the STA
+ termMacAddress = 0
+ termMacAddressField = pack('Q',termMacAddress)[0:6]
+ def createTermMacAddress(self):
+ self.termMacAddressField = pack('Q',self.termMacAddress)[0:6]
+
+ #Connection Identifier
+ cid = Cid()
+
+ #Connection Specification
+ cspec = Cspec()
+
+ #Forward Link Bit Loading Estimates
+ forwardLinkBle = Ble()
+
+ #Reverse Link Bit Loading Estimates
+ reverseLinkBle = Ble()
+
+ #Forward Link GLID
+ glidF = 0xFF #Local CSMA allocation by default
+ glidFField = pack('H',glidF)[0]
+ def createGlidF(self):
+ self.glidFField = pack('H',self.glidF)[0]
+
+ #Reverse Link GLID
+ glidR = 0xFF #Local CSMA allocation by default
+ glidRField = pack('H',glidR)[0]
+ def createGlidR(self):
+ self.glidRField = pack('H',self.glidR)[0]
+
+ #Proposed CSPEC
+ proposedCspec = Cspec()
+
+ #Modified CSPEC
+ modifiedCspec = Cspec()
+
+ #Terminal Equipment identifier
+ tei = 0
+ teiField = pack('H',tei)[0]
+ def createTei(self):
+ self.teiField = pack('H',self.tei)[0]
+
+ #Violated CSPEC
+ violatedCspec = Cspec()
+
+ #Releasing Station MAC Address
+ releasingStationMacAddress = 0
+ releasingStationMacAddressField = pack('Q',releasingStationMacAddress)[0:6]
+ def createReleasingStationMacAddress(self):
+ self.releasingStationMacAddressField = pack('Q',self.releasingStationMacAddress)[0:6]
+
+ #Duration
+ duration = 0 #0 beacon period by default
+ durationField = pack('H',duration)[0]
+ def createDuration(self):
+ self.durationField = pack('H',self.duration)[0]
+
+ #Number of GLID
+ numGlid = 256
+ numGlidField = pack('H',numGlid)[0]
+ def createNumGlid(self):
+ self.numGlidField = pack('H',self.numGlid)[0]
+
+ #GLIDs
+ glids = Glids()
+ glids.numGlid = numGlid
+ glids.createGlids()
+ def createGlids(self):
+ self.glids.numGlid = self.numGlid
+ self.glids.createGlids()
+
+ #GLIDs Info
+ glidsInfo = GlidsInfo()
+ glidsInfo.numGlid = numGlid
+ glidsInfo.createGlidsInfo()
+ def createGlidsInfo(self):
+ self.glidsInfo.numGlid = self.numGlid
+ self.glidsInfo.createGlidsInfo()
+
+ #Network Identifier
+ reserved = 0
+ securityLevel = 0 #Simple connect by default
+ nidOffset = 0x0f0e0d0c
+ nid = nidOffset + securityLevel*pow(2,52) + reserved*pow(2,54)
+ nidField = pack('Q',nid)[0:7]
+ def createNid(self):
+ self.nid = self.nidOffset + self.securityLevel*pow(2,52) + self.reserved*pow(2,54)
+ self.nidField = pack('Q',self.nid)[0:7]
+
+ #CCo's MAC Address
+ cmac = 0x43414D6F4343 #="CCoMAC"
+ cmacField = pack('Q',cmac)[0:6]
+ def createCmac(self):
+ self.cmacField = pack('Q',self.cmac)[0:6]
+
+ #Human Friendly Identifier
+ # Maximus simulator HFID by default :
+ hfid = "SPiDCOM MAXIMUS SIMULATOR HUMAN FRIENDLY IDENTIFIER : " + pack('Q',maxAddress)[0:6]
+ hfidField = hfid
+ while len(hfidField)<64:
+ hfidField = hfidField + pack('H',0)[0]
+ def createHfid(self):
+ self.hfidField = self.hfid
+ while len(self.hfidField)<64:
+ self.hfidField = self.hfidField + pack('H',0)[0]
+
+ #CCo Capability
+ ccoCapability = 0 #level 0 by default
+ ccoCapabilityField = pack('H',ccoCapability)[0]
+ def createCcoCapability(self):
+ self.ccoCapabilityField = pack('H',self.ccoCapability)[0]
+
+ #Proxy Networking Capability
+ proxyNetworkingCapability = 0 #not supported by default
+ proxyNetworkingCapabilityField = pack('H',proxyNetworkingCapability)[0]
+ def createProxyNetworkingCapability(self):
+ self.proxyNetworkingCapabilityField = pack('H',self.proxyNetworkingCapability)[0]
+
+ #SNID
+ snid = 0xA
+ access = 0 #in home by default
+ snidAccess = snid + access*pow(2,4)
+ snidAccessField = pack('H',snidAccess)[0]
+ def createSnidAccess(self):
+ self.snidAccess = self.snid + self.access*pow(2,4)
+ self.snidAccessField = pack('H',self.snidAccess)[0]
+
+ #TEI assigned to the station
+ staTei = 0 #no backupCco by default
+ staTeiField = pack('H',staTei)[0]
+ def createStaTei(self):
+ self.staTeiField = pack('H',self.staTei)[0]
+
+ #Lease Time
+ leaseTime = 0x000F #15min by default
+ leaseTimeField = pack('H',leaseTime)
+ def createLeaseTime(self):
+ self.leaseTimeField = pack('H',self.leaseTime)
+
+ #Mode
+ mode = 0 #Update by default
+ modeField = pack('H',mode)[0]
+ def createMode(self):
+ self.modeField = pack('H',self.mode)[0]
+
+ #TEIs
+ teis = []
+ teisField = []
+ i = 0
+ while i < num:
+ teis.append(i)
+ teisField.append(pack('H',teis[i])[0])
+ i=i+1
+ def createTeis(self):
+ self.i = 0
+ while self.i < self.num:
+ self.teisField.append(pack('H',self.teis[self.i])[0])
+ self.i = self.i + 1
+
+ #MAC Addresses
+ addrs = []
+ addrsField = []
+ i = 0
+ while i < num:
+ addrs.append(i+0x123456)
+ addrsField.append(pack('Q',addrs[i])[0:6])
+ i=i+1
+ def createAddrs(self):
+ self.i = 0
+ while self.i < self.num:
+ self.addrsField.append(pack('Q',self.addrs[self.i])[0:6])
+ self.i = self.i + 1
+
+ #Statuses
+ statuses = []
+ statusesField = []
+ i = 0
+ while i < num:
+ statuses.append(0) #associated by default
+ statusesField.append(pack('H',statuses[i])[0])
+ i=i+1
+ def createStatuses(self):
+ self.i = 0
+ while self.i < self.num:
+ self.statusesField.append(pack('H',self.statuses[self.i])[0])
+ self.i = self.i + 1
+
+ #TEIs + MAC Addresses + Statuses
+ teisAddrsStatuses = []
+ i = 0
+ while i < num:
+ teisAddrsStatuses.append(teisField[i]+addrsField[i]+statusesField[i])
+ i=i+1
+ def createTeisAddrsStatuses(self):
+ self.createTeis()
+ self.createAddrs()
+ self.createStatuses()
+ self.i = 0
+ while self.i < self.num:
+ self.teisAddrsStatuses[self.i]=self.teisField[self.i]+self.addrsField[self.i]+self.statusesField[self.i]
+ self.i = self.i + 1
+
+ #Final STA MAC Address
+ fda = 0x43414D414446 #="FDAMAC"
+ fdaField = pack('Q',fda)[0:6]
+ def createFda(self):
+ self.fdaField = pack('Q',self.fda)[0:6]
+
+ #Final STA TEI
+ fTei = 0 #no backupCco by default
+ fTeiField = pack('H',fTei)[0]
+ def createFTei(self):
+ self.fTeiField = pack('H',self.fTei)[0]
+
+ #Payload
+ payload = "MME"
+
+ #Length of payload
+ length = len(payload)
+ lengthField = pack('H',length)
+ def createLength(self):
+ self.length = len(self.payload)
+ self.lengthField = pack('H',self.length)
+
+ #Original STA MAC Address
+ oda = 0x43414D41444F #="ODAMAC"
+ odaField = pack('Q',oda)[0:6]
+ def createOda(self):
+ self.odaField = pack('Q',self.oda)[0:6]
+
+ #Original STA TEI
+ oTei = 0 #no backupCco by default
+ oTeiField = pack('H',oTei)[0]
+ def createOTei(self):
+ self.oTeiField = pack('H',self.oTei)[0]
+
+ #Number of Beacon Periods
+ nbp = 0
+ nbpField = pack('H',nbp)
+ def createNbp(self):
+ self.nbpField = pack('H',self.nbp)
+
+ #Number of Missed Beacons
+ nmb = 0
+ nmbField = pack('H',nmb)
+ def createNmb(self):
+ self.nmbField = pack('H',self.nmb)
+
+ #STEI
+ stei = 0
+ steiField = pack('H',stei)[0]
+ def createStei(self):
+ self.steiField = pack('H',self.stei)[0]
+
+ #DTEI
+ dtei = 0
+ dteiField = pack('H',dtei)[0]
+ def createDtei(self):
+ self.dteiField = pack('H',self.dtei)[0]
+
+ #DAddr
+ dAddr = 0x644143414D44 #="DMACAd"
+ dAddrField = pack('Q',dAddr)[0:6]
+ def createDAddr(self):
+ self.dAddrField = pack('Q',self.dAddr)[0:6]
+
+ #LLID
+ llid = 0
+ llidField = pack('H',llid)[0]
+ def createLlid(self):
+ self.llidField = pack('H',self.llid)[0]
+
+ #Bit Loading Estimates
+ ble = Ble()
+
+ #GCID-F
+ gcidF = 0xFF #Local CSMA allocation by default
+ gcidFField = pack('H',gcidF)[0]
+ def createGcidF(self):
+ self.gcidFField = pack('H',self.gcidF)[0]
+
+ #GCID-R
+ gcidR = 0xFF #Local CSMA allocation by default
+ gcidRField = pack('H',gcidR)[0]
+ def createGcidR(self):
+ self.gcidRField = pack('H',self.gcidR)[0]
+
+ #ChanEstF
+ chanEstF = 0
+ chanEstFField = pack('H',chanEstF)[0]
+ def createChanEstF(self):
+ self.chanEstFField = pack('H',self.chanEstF)[0]
+
+ #ChanEstR
+ chanEstR = 0
+ chanEstRField = pack('H',chanEstR)[0]
+ def createChanEstR(self):
+ self.chanEstRField = pack('H',self.chanEstR)[0]
+
+ #Bit Loading Estimates Forward
+ bleF = Ble()
+
+ #Bit Loading Estimates Reverse
+ bleR = Ble()
+
+ #Cause
+ cause = 0
+ causeField = pack('H',cause)[0]
+ def createCause(self):
+ self.causeField = pack('H',self.cause)[0]
+
+ #DCPPC
+ dcppc = 0
+ dcppcField = pack('H',dcppc)[0]
+ def createDcppc(self):
+ self.dcppcField = pack('H',self.dcppc)[0]
+
+ #Number of HomePlug 1.0.1 transmission detected
+ nhp10 = 0
+ nhp10Field = pack('H',nhp10)
+ def createNhp10(self):
+ self.nhp10Field = pack('H',self.nhp10)
+
+ #Number of HomePlug 1.1 transmission detected
+ nhp11 = 0
+ nhp11Field = pack('H',nhp11)
+ def createNhp11(self):
+ self.nhp11Field = pack('H',self.nhp11) \ No newline at end of file
diff --git a/maximus/python/lib/mmentryMethod.py b/maximus/python/lib/mmentryMethod.py
new file mode 100644
index 0000000000..e589fc460c
--- /dev/null
+++ b/maximus/python/lib/mmentryMethod.py
@@ -0,0 +1,775 @@
+#MMENTRY Methods
+
+from mmentry import *
+from mmentryFields import *
+
+#MmentryMethod can create every MMENTRY of MME
+# from MMENTRY format and MMENTRY fields
+class MmentryMethod():
+
+ mmentry = Mmentry() #Creates MMENTRY format
+ mmentryFields = MmentryFields() #Creates MMENTRY fields
+
+
+ #createCC_CCO_APPOINT_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_CCO_APPOINT.REQ MME
+ def createCC_CCO_APPOINT_REQ_MMENTRY(self, myReqType=mmentryFields.reqType, myMacAddress=mmentryFields.macAddress):
+ #CC_CCO_APPOINT_REQ_MMENTRY is composed by 2 fields :
+ # - ReqType
+ # - macAddress
+ self.mmentryFields.reqType = myReqType
+ self.mmentryFields.createReqType()
+ #MAC Address field is not present when ReqType = 0x01
+ if self.mmentryFields.reqType == 0x01:
+ myMacAddress = 0
+ self.mmentryFields.macAddress = myMacAddress
+ self.mmentryFields.createMacAddress()
+ self.mmentry.CC_CCO_APPOINT_REQ = self.mmentryFields.reqTypeField + self.mmentryFields.macAddressField
+
+
+ #createCC_CCO_APPOINT_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_CCO_APPOINT.CNF MME
+ def createCC_CCO_APPOINT_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC_CCO_APPOINT_CNF_MMENTRY is composed by 1 field :
+ # - Result
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_CCO_APPOINT_CNF = self.mmentryFields.resultField
+
+
+ #createCC_BACKUP_APPOINT_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_BACKUP_APPOINT.REQ MME
+ def createCC_BACKUP_APPOINT_REQ_MMENTRY(self, myAppointRelease=mmentryFields.appointRelease):
+ #CC_BACKUP_APPOINT_REQ_MMENTRY is composed by 1 field :
+ # - AppointRelease
+ self.mmentryFields.appointRelease = myAppointRelease
+ self.mmentryFields.createAppointRelease()
+ self.mmentry.CC_BACKUP_APPOINT_REQ = self.mmentryFields.appointReleaseField
+
+
+ #createCC_BACKUP_APPOINT_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_BACKUP_APPOINT.CNF MME
+ def createCC_BACKUP_APPOINT_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC_BACKUP_APPOINT_CNF_MMENTRY is composed by 1 field :
+ # - Result
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_BACKUP_APPOINT_CNF = self.mmentryFields.resultField
+
+
+ #CC_LINK_INFO.REQ has no MMENTRY
+
+
+ #createCC_LINK_INFO_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_INFO.CNF MME
+ def createCC_LINK_INFO_CNF_MMENTRY(self, myNum=0):
+ #CC_LINK_INFO_CNF_MMENTRY is composed by 2 fields :
+ # - Num
+ # - GlobalLinkInfo -* Num-
+ self.mmentryFields.num = myNum
+ self.mmentryFields.createNum()
+ self.mmentryFields.createGlobalLinks()
+ self.mmentry.CC_LINK_INFO_CNF = self.mmentryFields.numField
+ i=0
+ while i<self.mmentryFields.num:
+ self.mmentry.CC_LINK_INFO_CNF = self.mmentry.CC_LINK_INFO_CNF + self.mmentryFields.globalLinks[i].globalLinkInfo
+ i=i+1
+
+
+ #createCC_LINK_INFO_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_INFO.IND MME
+ def createCC_LINK_INFO_IND_MMENTRY(self, myNum=0):
+ #CC_LINK_INFO_CNF_MMENTRY is composed by 2 fields :
+ # - Num
+ # - GlobalLinkInfo -* Num-
+ self.mmentryFields.num = myNum
+ self.mmentryFields.createNum()
+ self.mmentryFields.createGlobalLinks()
+ self.mmentry.CC_LINK_INFO_IND = self.mmentryFields.numField
+ i=0
+ while i<self.mmentryFields.num:
+ self.mmentry.CC_LINK_INFO_IND = self.mmentry.CC_LINK_INFO_IND + self.mmentryFields.globalLinks[i].globalLinkInfo
+ i=i+1
+
+
+ #CC_LINK_INFO.RSP has no MMENTRY
+
+
+ #createCC_HANDHOVER_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_HANDHOVER.REQ MME
+ def createCC_HANDHOVER_REQ_MMENTRY(self, mySoftHard=mmentryFields.softHard, myReason=mmentryFields.reason):
+ #CC_HANDHOVER_REQ_MMENTRY is composed by 2 fields :
+ # - Soft/Hard
+ # - Reason
+ self.mmentryFields.softHard = mySoftHard
+ self.mmentryFields.createSoftHard()
+ self.mmentryFields.reason = myReason
+ self.mmentryFields.createReason()
+ self.mmentry.CC_HANDHOVER_REQ = self.mmentryFields.softHardField + self.mmentryFields.reasonField
+
+
+ #createCC_HANDHOVER_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_HANDHOVER.CNF MME
+ def createCC_HANDHOVER_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC_HANDHOVER_CNF_MMENTRY is composed by 1 field :
+ # - Result
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_HANDHOVER_CNF = self.mmentryFields.resultField
+
+
+ #createCC_HANDHOVER_INFO_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_HANDHOVER_INFO.IND MME
+ def createCC_HANDHOVER_INFO_IND_MMENTRY(self, myRsc=mmentryFields.rsc,myBackupCco=mmentryFields.backupCco,myNum=0):
+ #CC_HANDHOVER_INFO_IND_MMENTRY is composed by 4 field :
+ # - RSC
+ # - BackupCCo
+ # - Num
+ # - STA_Info -*Num-
+ self.mmentryFields.rsc = myRsc
+ self.mmentryFields.createRsc()
+ self.mmentryFields.backupCco = myBackupCco
+ self.mmentryFields.createBackupCco()
+ self.mmentryFields.num = myNum
+ self.mmentryFields.createNum()
+ self.mmentry.CC_HANDHOVER_INFO_IND = self.mmentryFields.rscField + self.mmentryFields.backupCcoField + self.mmentryFields.numField
+ i=0
+ while i<self.mmentryFields.num:
+ self.mmentry.CC_HANDHOVER_INFO_IND = self.mmentry.CC_HANDHOVER_INFO_IND + self.mmentryFields.stasInfo[i].staInfo
+ i=i+1
+
+
+ #CC_HANDOVER_INFO.RSP has no MMENTRY
+
+
+ #CC_DISCOVER_LIST.REQ has no MMENTRY
+
+
+ #createCC_DISCOVER_LIST_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_DISCOVER_LIST.CNF MME
+ def createCC_DISCOVER_LIST_CNF_MMENTRY(self, myNumSta=0,myNumNet=0):
+ #CC_DISCOVER_LIST_CNF_MMENTRY is composed by 4 field :
+ # - NumStation
+ # - StationInfo -*NumStation-
+ # - NumNetwork
+ # - NetworkInfo -*NumNetwork-
+ self.mmentryFields.numSta = myNumSta
+ self.mmentryFields.createNumSta()
+ self.mmentryFields.createStationsInfo()
+ self.mmentry.CC_DISCOVER_LIST_CNF = self.mmentryFields.numStaField
+ i=0
+ while i<self.mmentryFields.numSta:
+ self.mmentry.CC_DISCOVER_LIST_CNF = self.mmentry.CC_DISCOVER_LIST_CNF + self.mmentryFields.stationsInfo[i].stationInfo
+ i=i+1
+ self.mmentryFields.numNet = myNumNet
+ self.mmentryFields.createNumNet()
+ self.mmentryFields.createNetworksInfo()
+ self.mmentry.CC_DISCOVER_LIST_CNF = self.mmentry.CC_DISCOVER_LIST_CNF + self.mmentryFields.numNetField
+ i=0
+ while i<self.mmentryFields.numNet:
+ self.mmentry.CC_DISCOVER_LIST_CNF = self.mmentry.CC_DISCOVER_LIST_CNF + self.mmentryFields.networksInfo[i].networkInfo
+ i=i+1
+
+
+ #createCC_DISCOVER_LIST_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_DISCOVER_LIST.IND MME
+ def createCC_DISCOVER_LIST_IND_MMENTRY(self, myNumSta=0,myNumNet=0):
+ #CC_DISCOVER_LIST_IND_MMENTRY is composed by 4 field :
+ # - NumStation
+ # - StationInfo -*NumStation-
+ # - NumNetwork
+ # - NetworkInfo -*NumNetwork-
+ self.mmentryFields.numSta = myNumSta
+ self.mmentryFields.createNumSta()
+ self.mmentryFields.createStationsInfo()
+ self.mmentry.CC_DISCOVER_LIST_IND = self.mmentryFields.numStaField
+ i=0
+ while i<self.mmentryFields.numSta:
+ self.mmentry.CC_DISCOVER_LIST_IND = self.mmentry.CC_DISCOVER_LIST_IND + self.mmentryFields.stationsInfo[i].stationInfo
+ i=i+1
+ self.mmentryFields.numNet = myNumNet
+ self.mmentryFields.createNumNet()
+ self.mmentryFields.createNetworksInfo()
+ self.mmentry.CC_DISCOVER_LIST_IND = self.mmentry.CC_DISCOVER_LIST_IND + self.mmentryFields.numNetField
+ i=0
+ while i<self.mmentryFields.numNet:
+ self.mmentry.CC_DISCOVER_LIST_IND = self.mmentry.CC_DISCOVER_LIST_IND + self.mmentryFields.networksInfo[i].networkInfo
+ i=i+1
+
+
+ #createCC_LINK_NEW_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_NEW.REQ MME
+ def createCC_LINK_NEW_REQ_MMENTRY(self, myInitMacAddress=mmentryFields.initMacAddress, myTermMacAddress=mmentryFields.termMacAddress):
+ #CC_LINK_NEW_REQ_MMENTRY is composed by 6 fields :
+ # - Init MAC Address
+ # - Term MAC Address
+ # - CID
+ # - CSPEC
+ # - Forward Link Bit Loading Estimates
+ # - Reverse Link Bit Loading Estimates
+ self.mmentryFields.initMacAddress = myInitMacAddress
+ self.mmentryFields.createInitMacAddress()
+ self.mmentryFields.termMacAddress = myTermMacAddress
+ self.mmentryFields.createTermMacAddress()
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.cspec.createCspec()
+ self.mmentryFields.forwardLinkBle.createBle()
+ self.mmentryFields.reverseLinkBle.createBle()
+ self.mmentry.CC_LINK_NEW_REQ = self.mmentryFields.initMacAddressField + self.mmentryFields.termMacAddressField + self.mmentryFields.cid.cid + self.mmentryFields.cspec.cspec + self.mmentryFields.forwardLinkBle.ble + self.mmentryFields.reverseLinkBle.ble
+
+
+ #createCC_LINK_NEW_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_NEW.CNF MME
+ def createCC_LINK_NEW_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC_LINK_NEW_CNF_MMENTRY is composed by 5 fields :
+ # - CID
+ # - GLID-F
+ # - GLID-R
+ # - Result
+ # - Proposed CSPEC
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.glidFField
+ self.mmentryFields.glidRField
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_LINK_NEW_CNF = self.mmentryFields.cid.cid + self.mmentryFields.glidFField + self.mmentryFields.glidRField + self.mmentryFields.resultField
+ if self.mmentryFields.result == 1 :
+ self.mmentryFields.proposedCspec.createCspec()
+ self.mmentry.CC_LINK_NEW_CNF = self.mmentry.CC_LINK_NEW_CNF + self.mmentryFields.proposedCspec.cspec
+
+
+ #createCC_LINK_MOD_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_MOD.REQ MME
+ def createCC_LINK_MOD_REQ_MMENTRY(self):
+ #CC_LINK_MOD_REQ_MMENTRY is composed by 4 fields :
+ # - CID
+ # - Modified CSPEC
+ # - Forward Link Bit Loading Estimates
+ # - Reverse Link Bit Loading Estimates
+ #CAREFUL : this MME requires the GLID-F and the GLID-R to be fulfilled
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.modifiedCspec.createCspec()
+ self.mmentry.CC_LINK_MOD_REQ = self.mmentryFields.cid.cid + self.mmentryFields.modifiedCspec.cspec
+ if self.mmentryFields.glidF in globalId:
+ self.mmentryFields.forwardLinkBle.createBle()
+ self.mmentry.CC_LINK_MOD_REQ = self.mmentry.CC_LINK_MOD_REQ + self.mmentryFields.forwardLinkBle.ble
+ if self.mmentryFields.glidR in globalId:
+ self.mmentryFields.reverseLinkBle.createBle()
+ self.mmentry.CC_LINK_MOD_REQ = self.mmentry.CC_LINK_MOD_REQ + self.mmentryFields.reverseLinkBle.ble
+
+
+ #createCC_LINK_MOD_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_MOD.CNF MME
+ def createCC_LINK_MOD_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC_LINK_MOD_CNF_MMENTRY is composed by 3 fields :
+ # - CID
+ # - Result
+ # - Proposed CSPEC
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_LINK_MOD_CNF = self.mmentryFields.cid.cid + self.mmentryFields.resultField
+ if self.mmentryFields.result == 1 :
+ self.mmentryFields.proposedCspec.createCspec()
+ self.mmentry.CC_LINK_MOD_CNF = self.mmentry.CC_LINK_MOD_CNF + self.mmentryFields.proposedCspec.cspec
+
+
+ #createCC_LINK_SQZ_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_SQZ.REQ MME
+ def createCC_LINK_SQZ_REQ_MMENTRY(self):
+ #CC_LINK_SQZ_REQ_MMENTRY is composed by 2 fields :
+ # - CID
+ # - Modified CSPEC
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.modifiedCspec.createCspec()
+ self.mmentry.CC_LINK_SQZ_REQ = self.mmentryFields.cid.cid + self.mmentryFields.modifiedCspec.cspec
+
+
+ #createCC_LINK_SQZ_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_SQZ.CNF MME
+ def createCC_LINK_SQZ_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC_LINK_SQZ_CNF_MMENTRY is composed by 3 fields :
+ # - CID
+ # - Result
+ # - Proposed CSPEC
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_LINK_SQZ_CNF = self.mmentryFields.cid.cid + self.mmentryFields.resultField
+ if self.mmentryFields.result == 1 :
+ self.mmentryFields.proposedCspec.createCspec()
+ self.mmentry.CC_LINK_SQZ_CNF = self.mmentry.CC_LINK_SQZ_CNF + self.mmentryFields.proposedCspec.cspec
+
+
+ #createCC_LINK_REL_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_REL.REQ MME
+ def createCC_LINK_REL_REQ_MMENTRY(self, myTei=mmentryFields.tei, myRsc=mmentryFields.rsc):
+ #CC_LINK_REL_REQ_MMENTRY is composed by 4 fields :
+ # - CID
+ # - TEI
+ # - Reason Code
+ # - Violated CSPEC
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.tei = myTei
+ self.mmentryFields.createTei()
+ self.mmentryFields.rsc = myRsc
+ self.mmentryFields.createRsc()
+ self.mmentry.CC_LINK_REL_REQ = self.mmentryFields.cid.cid + self.mmentryFields.teiField + self.mmentryFields.rscField
+ if self.mmentryFields.rsc == 1 :
+ self.mmentryFields.violatedCspec.createCspec()
+ self.mmentry.CC_LINK_REL_REQ = self.mmentry.CC_LINK_REL_REQ + self.mmentryFields.violatedCspec.cspec
+
+
+ #createCC_LINK_REL_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_LINK_REL.IND MME
+ def createCC_LINK_REL_IND_MMENTRY(self, myReleasingStationMacAddress=mmentryFields.releasingStationMacAddress, myRsc=mmentryFields.rsc):
+ #CC_LINK_REL_IND_MMENTRY is composed by 4 fields :
+ # - CID
+ # - Releasing Station Mac Address
+ # - Reason Code
+ # - Proposed CSPEC or Violated CSPEC
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.releasingStationMacAddress = myReleasingStationMacAddress
+ self.mmentryFields.createReleasingStationMacAddress()
+ self.mmentryFields.rsc = myRsc
+ self.mmentryFields.createRsc()
+ self.mmentry.CC_LINK_REL_IND = self.mmentryFields.cid.cid + self.mmentryFields.releasingStationMacAddressField + self.mmentryFields.rscField
+ if self.mmentryFields.rsc == 1 :
+ self.mmentryFields.proposedCspec.createCspec()
+ self.mmentry.CC_LINK_REL_IND = self.mmentry.CC_LINK_REL_IND + self.mmentryFields.proposedCspec.cspec
+ elif self.mmentryFields.rsc == 2 :
+ self.mmentryFields.violatedCspec.createCspec()
+ self.mmentry.CC_LINK_REL_IND = self.mmentry.CC_LINK_REL_IND + self.mmentryFields.violatedCspec.cspec
+
+
+ #createCC_DETECT_REPORT_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_DETECT_REPORT.REQ MME
+ def createCC_DETECT_REPORT_REQ_MMENTRY(self, myDuration=mmentryFields.duration, myNumGlid=0):
+ #CC_DETECT_REPORT_REQ_MMENTRY is composed by 3 fields :
+ # - Duration
+ # - Number of GLID
+ # - GLID -* NumGlid-
+ self.mmentryFields.duration = myDuration
+ self.mmentryFields.createDuration()
+ self.mmentryFields.numGlid = myNumGlid
+ self.mmentryFields.createNumGlid()
+ self.mmentry.CC_DETECT_REPORT_REQ = self.mmentryFields.durationField + self.mmentryFields.numGlidField
+ self.mmentryFields.createGlids()
+ i=0
+ while i<self.mmentryFields.numGlid:
+ self.mmentry.CC_DETECT_REPORT_REQ = self.mmentry.CC_DETECT_REPORT_REQ + self.mmentryFields.glids.glidsField[i]
+ i=i+1
+
+
+ #createCC_DETECT_REPORT_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_DETECT_REPORT.CNF MME
+ def createCC_DETECT_REPORT_CNF_MMENTRY(self, myNumGlid=0):
+ #CC_DETECT_REPORT_CNF_MMENTRY is composed by 2 fields :
+ # - Number of GLID
+ # - GLID Info -* NumGlid-
+ self.mmentryFields.numGlid = myNumGlid
+ self.mmentryFields.createNumGlid()
+ self.mmentry.CC_DETECT_REPORT_CNF = self.mmentryFields.numGlidField
+ self.mmentryFields.createGlidsInfo()
+ i=0
+ while i<self.mmentryFields.numGlid:
+ self.mmentry.CC_DETECT_REPORT_CNF = self.mmentry.CC_DETECT_REPORT_CNF + self.mmentryFields.glidsInfo.glidsInfo[i]
+ i=i+1
+
+
+ #createCC_WHO_RU_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_WHO_RU.REQ MME
+ def createCC_WHO_RU_REQ_MMENTRY(self):
+ #CC_WHO_RU_REQ_MMENTRY is composed by 1 fields :
+ # - NID
+ self.mmentryFields.createNid()
+ self.mmentry.CC_WHO_RU_REQ = self.mmentryFields.nidField
+
+
+ #createCC_WHO_RU_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_WHO_RU.CNF MME
+ def createCC_WHO_RU_CNF_MMENTRY(self, myCmac=mmentryFields.cmac, myHfid=mmentryFields.hfid):
+ #CC_WHO_RU_CNF_MMENTRY is composed by 3 fields :
+ # - NID
+ # - CMAC
+ # - HFID
+ self.mmentryFields.createNid()
+ self.mmentryFields.cmac = myCmac
+ self.mmentryFields.createCmac()
+ self.mmentryFields.hfid = myHfid
+ self.mmentryFields.createHfid()
+ self.mmentry.CC_WHO_RU_CNF = self.mmentryFields.nidField + self.mmentryFields.cmacField + self.mmentryFields.hfidField
+
+
+ #createCC_ASSOC_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_ASSOC.REQ MME
+ def createCC_ASSOC_REQ_MMENTRY(self, myReqType=mmentryFields.reqType, myCcoCapability=mmentryFields.ccoCapability, myProxyNetworkingCapability=mmentryFields.proxyNetworkingCapability):
+ #CC_ASSOC_REQ_MMENTRY is composed by 4 fields :
+ # - ReqType
+ # - NID
+ # - CCo Capability
+ # - Proxy Networking Capability
+ self.mmentryFields.reqType = myReqType
+ self.mmentryFields.createReqType()
+ self.mmentryFields.createNid()
+ self.mmentryFields.ccoCapability = myCcoCapability
+ self.mmentryFields.createCcoCapability()
+ self.mmentryFields.proxyNetworkingCapability = myProxyNetworkingCapability
+ self.mmentryFields.createProxyNetworkingCapability()
+ self.mmentry.CC_ASSOC_REQ = self.mmentryFields.reqTypeField + self.mmentryFields.nidField + self.mmentryFields.ccoCapabilityField + self.mmentryFields.proxyNetworkingCapabilityField
+
+
+ #createCC_ASSOC_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_ASSOC.CNF MME
+ def createCC_ASSOC_CNF_MMENTRY(self, myResult=mmentryFields.result, myStaTei=mmentryFields.staTei, myLeaseTime=mmentryFields.leaseTime):
+ #CC_ASSOC_CNF_MMENTRY is composed by 5 fields :
+ # - Result
+ # - NID
+ # - SNID
+ # - STA TEI
+ # - Lease Time
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentryFields.createNid()
+ self.mmentryFields.createSnidAccess()
+ self.mmentryFields.staTei = myStaTei
+ self.mmentryFields.createStaTei()
+ self.mmentryFields.leaseTime = myLeaseTime
+ self.mmentryFields.createLeaseTime()
+ self.mmentry.CC_ASSOC_CNF = self.mmentryFields.resultField + self.mmentryFields.nidField + self.mmentryFields.snidAccessField + self.mmentryFields.staTeiField + self.mmentryFields.leaseTimeField
+
+
+ #createCC_LEAVE_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_LEAVE.REQ MME
+ def createCC_LEAVE_REQ_MMENTRY(self, myReason=mmentryFields.reason):
+ #CC_LEAVE_REQ_MMENTRY is composed by 1 fields :
+ # - Reason
+ self.mmentryFields.reason = myReason
+ self.mmentryFields.createReason()
+ self.mmentry.CC_LEAVE_REQ = self.mmentryFields.reasonField
+
+
+ #CC_LEAVE.CNF has no MMENTRY
+
+
+ #createCC_LEAVE_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_LEAVE.IND MME
+ def createCC_LEAVE_IND_MMENTRY(self, myReason=mmentryFields.reason):
+ #CC_LEAVE_IND_MMENTRY is composed by 2 fields :
+ # - Reason
+ # - NID
+ self.mmentryFields.reason = myReason
+ self.mmentryFields.createReason()
+ self.mmentryFields.createNid()
+ self.mmentry.CC_LEAVE_IND = self.mmentryFields.reasonField + self.mmentryFields.nidField
+
+
+ #CC_LEAVE.RSP has no MMENTRY
+
+
+ #CC_SET_TEI_MAP.REQ has no MMENTRY
+
+
+ #createCC_SET_TEI_MAP_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_SET_TEI_MAP.IND MME
+ def createCC_SET_TEI_MAP_IND_MMENTRY(self, myMode=mmentryFields.mode, myNum=0):
+ #CC_SET_TEI_MAP_IND_MMENTRY is composed by 3 fields :
+ # - Mode
+ # - Num
+ # - TEI + MAC Address + Status -*Num-
+ self.mmentryFields.mode = myMode
+ self.mmentryFields.createMode()
+ self.mmentryFields.num = myNum
+ self.mmentryFields.createNum()
+ self.mmentry.CC_SET_TEI_MAP_IND = self.mmentryFields.modeField + self.mmentryFields.numField
+ self.mmentryFields.createTeisAddrsStatuses()
+ i=0
+ while i<self.mmentryFields.num:
+ self.mmentry.CC_SET_TEI_MAP_IND = self.mmentry.CC_SET_TEI_MAP_IND + self.mmentryFields.teisAddrsStatuses[i]
+ i=i+1
+
+
+ #createCC_RELAY_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_RELAY.REQ MME
+ def createCC_RELAY_REQ_MMENTRY(self, myFda=mmentryFields.fda, myFTei=mmentryFields.fTei, myPayload=mmentryFields.payload):
+ #CC_RELAY_REQ_MMENTRY is composed by 4 fields :
+ # - FDA
+ # - FTEI
+ # - Length
+ # - Payload
+ self.mmentryFields.fda = myFda
+ self.mmentryFields.createFda()
+ self.mmentryFields.fTei = myFTei
+ self.mmentryFields.createFTei()
+ self.mmentryFields.payload = myPayload
+ self.mmentryFields.createLength()
+ self.mmentry.CC_RELAY_REQ = self.mmentryFields.fdaField + self.mmentryFields.fTeiField + self.mmentryFields.lengthField + self.mmentryFields.payload
+
+
+ #createCC_RELAY_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_RELAY.IND MME
+ def createCC_RELAY_IND_MMENTRY(self, myOda=mmentryFields.oda, myOTei=mmentryFields.oTei, myPayload=mmentryFields.payload):
+ #CC_RELAY_IND_MMENTRY is composed by 4 fields :
+ # - ODA
+ # - OTEI
+ # - Length
+ # - Payload
+ self.mmentryFields.oda = myOda
+ self.mmentryFields.createOda()
+ self.mmentryFields.oTei = myOTei
+ self.mmentryFields.createOTei()
+ self.mmentryFields.payload = myPayload
+ self.mmentryFields.createLength()
+ self.mmentry.CC_RELAY_IND = self.mmentryFields.odaField + self.mmentryFields.oTeiField + self.mmentryFields.lengthField + self.mmentryFields.payload
+
+
+ #CC_BEACON_RELIABILITY.REQ has no MMENTRY
+
+
+ #createCC_BEACON_RELIABILITY_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_BEACON_RELIABILITY.CNF MME
+ def createCC_BEACON_RELIABILITY_CNF_MMENTRY(self, myNbp=mmentryFields.nbp, myNmb=mmentryFields.nmb):
+ #CC_BEACON_RELIABILITY_CNF_MMENTRY is composed by 2 fields :
+ # - Number of beacon periods
+ # - Number of missed beacons
+ self.mmentryFields.nbp = myNbp
+ self.mmentryFields.createNbp()
+ self.mmentryFields.nmb = myNmb
+ self.mmentryFields.createNmb()
+ self.mmentry.CC_BEACON_RELIABILITY_CNF = self.mmentryFields.nbpField + self.mmentryFields.nmbField
+
+
+ #createCC_ALLOC_MOVE_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_ALLOC_MOVE.REQ MME
+ def createCC_ALLOC_MOVE_REQ_MMENTRY(self):
+ #CC_ALLOC_MOVE_REQ_MMENTRY is composed by 5 fields :
+ # - CID
+ # - GLID-F
+ # - GLID-R
+ # - Forward Link Bit Loading Estimates
+ # - Reverse Link Bit Loading Estimates
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.createGlidF()
+ self.mmentryFields.createGlidR()
+ self.mmentry.CC_ALLOC_MOVE_REQ = self.mmentryFields.cid.cid + self.mmentryFields.glidFField + self.mmentryFields.glidRField
+ if self.mmentryFields.glidF in globalId:
+ self.mmentryFields.forwardLinkBle.createBle()
+ self.mmentry.CC_ALLOC_MOVE_REQ = self.mmentry.CC_ALLOC_MOVE_REQ + self.mmentryFields.forwardLinkBle.ble
+ if self.mmentryFields.glidR in globalId:
+ self.mmentryFields.reverseLinkBle.createBle()
+ self.mmentry.CC_ALLOC_MOVE_REQ = self.mmentry.CC_ALLOC_MOVE_REQ + self.mmentryFields.reverseLinkBle.ble
+
+
+ #createCC__ALLOC_MOVE_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC__ALLOC_MOVE.CNF MME
+ def createCC_ALLOC_MOVE_CNF_MMENTRY(self, myResult=mmentryFields.result):
+ #CC__ALLOC_MOVE_CNF_MMENTRY is composed by 2 fields :
+ # - CID
+ # - Result
+ self.mmentryFields.cid.createCid()
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentry.CC_LINK_SQZ_CNF = self.mmentryFields.cid.cid + self.mmentryFields.resultField
+
+
+ #createCC_ACCESS_NEW_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_NEW.REQ MME
+ def createCC_ACCESS_NEW_REQ_MMENTRY(self, myStei=mmentryFields.stei, myDtei=mmentryFields.dtei, myDAddr=mmentryFields.dAddr, myLlid=mmentryFields.llid):
+ #CC_ACCESS_NEW_REQ_MMENTRY is composed by 6 fields :
+ # - STEI
+ # - DTEI
+ # - DAddr
+ # - LLID
+ # - CSPEC
+ # - Bit Loading Estimates
+ self.mmentryFields.stei = myStei
+ self.mmentryFields.createStei()
+ self.mmentryFields.dtei = myDtei
+ self.mmentryFields.createDtei()
+ self.mmentryFields.dAddr = myDAddr
+ self.mmentryFields.createDAddr()
+ self.mmentryFields.llid = myLlid
+ self.mmentryFields.createLlid()
+ self.mmentryFields.cspec.createCspec()
+ self.mmentryFields.ble.createBle()
+ self.mmentry.CC_ACCESS_NEW_REQ = self.mmentryFields.steiField + self.mmentryFields.dteiField + self.mmentryFields.dAddrField + self.mmentryFields.llidField + self.mmentryFields.cspec.cspec + self.mmentryFields.ble.ble
+
+
+ #createCC_ACCESS_NEW_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_NEW.CNF MME
+ def createCC_ACCESS_NEW_CNF_MMENTRY(self, myResult=mmentryFields.result, myLlid=mmentryFields.llid, myGcidF=mmentryFields.gcidF, myChanEstF=mmentryFields.chanEstF, myGcidR=mmentryFields.gcidR, myChanEstR=mmentryFields.chanEstR):
+ #CC_ACCESS_NEW_CNF_MMENTRY is composed by 6 fields :
+ # - Result
+ # - LLID
+ # - GCID-F
+ # - ChanEstF
+ # - GCID-R
+ # - ChanEstR
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentryFields.llid = myLlid
+ self.mmentryFields.createLlid()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.chanEstF = myChanEstF
+ self.mmentryFields.createChanEstF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentryFields.chanEstR = myChanEstR
+ self.mmentryFields.createChanEstR()
+ self.mmentry.CC_ACCESS_NEW_CNF = self.mmentryFields.resultField + self.mmentryFields.llidField + self.mmentryFields.gcidFField + self.mmentryFields.chanEstFField + self.mmentryFields.gcidRField + self.mmentryFields.chanEstRField
+
+
+ #createCC_ACCESS_NEW_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_NEW.IND MME
+ def createCC_ACCESS_NEW_IND_MMENTRY(self, myResult=mmentryFields.result, myLlid=mmentryFields.llid, myGcidF=mmentryFields.gcidF, myChanEstF=mmentryFields.chanEstF, myGcidR=mmentryFields.gcidR, myChanEstR=mmentryFields.chanEstR):
+ #CC_ACCESS_NEW_IND_MMENTRY is composed by 6 fields :
+ # - Result
+ # - LLID
+ # - GCID-F
+ # - ChanEstF
+ # - GCID-R
+ # - ChanEstR
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentryFields.llid = myLlid
+ self.mmentryFields.createLlid()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.chanEstF = myChanEstF
+ self.mmentryFields.createChanEstF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentryFields.chanEstR = myChanEstR
+ self.mmentryFields.createChanEstR()
+ self.mmentryFields.createNid()
+ self.mmentry.CC_ACCESS_NEW_IND = self.mmentryFields.resultField + self.mmentryFields.llidField + self.mmentryFields.gcidFField + self.mmentryFields.chanEstFField + self.mmentryFields.gcidRField + self.mmentryFields.chanEstRField + self.mmentryFields.nidField
+
+
+ #createCC_ACCESS_NEW_RSP_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_NEW.RSP MME
+ def createCC_ACCESS_NEW_RSP_MMENTRY(self, myResult=mmentryFields.result, myLlid=mmentryFields.llid, myGcidF=mmentryFields.gcidF, myGcidR=mmentryFields.gcidR):
+ #CC_ACCESS_NEW_RSP_MMENTRY is composed by 6 fields :
+ # - Result
+ # - LLID
+ # - GCID-F
+ # - GCID-R
+ # - BLE-F
+ # - BLE-R
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentryFields.llid = myLlid
+ self.mmentryFields.createLlid()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentryFields.bleF.createBle()
+ self.mmentryFields.bleR.createBle()
+ self.mmentry.CC_ACCESS_NEW_RSP = self.mmentryFields.resultField + self.mmentryFields.llidField + self.mmentryFields.gcidFField + self.mmentryFields.gcidRField + self.mmentryFields.bleF.ble + self.mmentryFields.bleR.ble
+
+
+ #createCC_ACCESS_REL_REQ_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_REL.REQ MME
+ def createCC_ACCESS_REL_REQ_MMENTRY(self, myGcidF=mmentryFields.gcidF, myGcidR=mmentryFields.gcidR):
+ #CC_ACCESS_REL_REQ_MMENTRY is composed by 3 fields :
+ # - Cause
+ # - GCID-F
+ # - GCID-R
+ self.mmentryFields.createCause()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentry.CC_ACCESS_REL_REQ = self.mmentryFields.causeField + self.mmentryFields.gcidFField + self.mmentryFields.gcidRField
+
+
+ #createCC_ACCESS_REL_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_REL.CNF MME
+ def createCC_ACCESS_REL_CNF_MMENTRY(self, myResult=mmentryFields.result, myGcidF=mmentryFields.gcidF, myGcidR=mmentryFields.gcidR):
+ #CC_ACCESS_REL_CNF_MMENTRY is composed by 3 fields :
+ # - Result
+ # - GCID-F
+ # - GCID-R
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentry.CC_ACCESS_REL_CNF = self.mmentryFields.resultField + self.mmentryFields.gcidFField + self.mmentryFields.gcidRField
+
+
+ #createCC_ACCESS_REL_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_REL.IND MME
+ def createCC_ACCESS_REL_IND_MMENTRY(self, myGcidF=mmentryFields.gcidF, myGcidR=mmentryFields.gcidR):
+ #CC_ACCESS_REL_IND_MMENTRY is composed by 3 fields :
+ # - Cause
+ # - GCID-F
+ # - GCID-R
+ self.mmentryFields.createCause()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentry.CC_ACCESS_REL_IND = self.mmentryFields.causeField + self.mmentryFields.gcidFField + self.mmentryFields.gcidRField
+
+
+ #createCC_ACCESS_REL_RSP_MMENTRY creates
+ # the MMENTRY Field of the CC_ACCESS_REL.RSP MME
+ def createCC_ACCESS_REL_RSP_MMENTRY(self, myResult=mmentryFields.result, myGcidF=mmentryFields.gcidF, myGcidR=mmentryFields.gcidR):
+ #CC_ACCESS_REL_RSP_MMENTRY is composed by 3 fields :
+ # - Result
+ # - GCID-F
+ # - GCID-R
+ self.mmentryFields.result = myResult
+ self.mmentryFields.createResult()
+ self.mmentryFields.gcidF = myGcidF
+ self.mmentryFields.createGcidF()
+ self.mmentryFields.gcidR = myGcidR
+ self.mmentryFields.createGcidR()
+ self.mmentry.CC_ACCESS_REL_RSP = self.mmentryFields.resultField + self.mmentryFields.gcidFField + self.mmentryFields.gcidRField
+
+
+ #createCC_DCPPC_IND_MMENTRY creates
+ # the MMENTRY Field of the CC_DCPPC.IND MME
+ def createCC_DCPPC_IND_MMENTRY(self, myDcppc=mmentryFields.dcppc):
+ #CC_DCPPC_IND_MMENTRY is composed by 1 fields :
+ # - DCPPC
+ self.mmentryFields.dcppc = myDcppc
+ self.mmentryFields.createDcppc()
+ self.mmentry.CC_DCPPC_IND = self.mmentryFields.dcppcField
+
+
+ #CC_DCPPC.RSP has no MMENTRY
+
+
+ #CC_HP1_DET.REQ has no MMENTRY
+
+
+ #createCC_HP1_DET_CNF_MMENTRY creates
+ # the MMENTRY Field of the CC_HP1_DET.CNF MME
+ def createCC_HP1_DET_CNF_MMENTRY(self, myNbp=mmentryFields.nbp, myNhp10=mmentryFields.nhp10, myNhp11=mmentryFields.nhp11):
+ #CC_HP1_DET_CNF_MMENTRY is composed by 3 fields :
+ # - NBP
+ # - NHP1.0
+ # - NHP1.1
+ self.mmentryFields.nbp = myNbp
+ self.mmentryFields.createNbp()
+ self.mmentryFields.nhp10 = myNhp10
+ self.mmentryFields.createNhp10()
+ self.mmentryFields.nhp11 = myNhp11
+ self.mmentryFields.createNhp11()
+ self.mmentry.CC_HP1_DET_CNF = self.mmentryFields.nbpField + self.mmentryFields.nhp10Field + self.mmentryFields.nhp11Field
+
+
+ #createCC_BLE_UPDATE_BLE_MMENTRY creates
+ # the MMENTRY Field of the CC_BLE_UPDATE.BLE MME
+ def createCC_BLE_UPDATE_BLE_MMENTRY(self):
+ #CC_BLE_UPDATE_BLE_MMENTRY is composed by 2 fields :
+ # - GLID
+ # - Bit Loading Estimates
+ self.mmentryFields.glids.numGlid=1
+ self.mmentryFields.createGlids()
+ self.mmentryFields.ble.createBle()
+ self.mmentry.CC_BLE_UPDATE_BLE = self.mmentryFields.glids.glidsField[0] + self.mmentryFields.ble.ble