mobile: adapt 4G and 5G NAS with extended Layer3E class

This commit is contained in:
mich 2020-08-18 19:01:25 +02:00
parent e681930fc5
commit 1ba75e590b
5 changed files with 131 additions and 131 deletions

View File

@ -29,7 +29,7 @@
__all__ = [
'Layer3',
'Layer3EPS',
'Layer3E',
'IE',
'Type1V',
'Type1TV',
@ -185,16 +185,16 @@ class Layer3(Envelope):
def _dec_unk_ie(self, T8, char):
if T8 & 0x80:
# 1 byte IE
log('%s, _dec_unk_ie: unknown Type2 IE, 0x%x' % (self._name, T8))
self.append( Type2('_T_%i' % T8, val=[T8]) )
# Type1TV IE, could also be a Type2 IE
log('%s, _dec_unk_ie: unknown Type1TV IE, 0x%.2x' % (self._name, T8))
self.append( Type1TV('_T_%X' % (T8>>4), val={'T':T8>>4, 'V':T8&0xf}) )
else:
# Type4TLV IE
L = char.get_uint(8)
V = char.get_bytes(8*L)
log('%s, _dec_unk_ie: unknown Type4TLV IE, T: 0x%x, V: 0x%s' \
log('%s, _dec_unk_ie: unknown Type4TLV IE, T: 0x%.2x, V: 0x%s' \
% (self._name, T8, hexlify(V).decode('ascii')))
self.append( Type4TLV('_T_%i' % T8, val=[T8, L, V]) )
self.append( Type4TLV('_T_%X' % T8, val=[T8, L, V]) )
def repr(self):
# element transparency
@ -214,27 +214,27 @@ class Layer3(Envelope):
__repr__ = repr
class Layer3EPS(Layer3):
class Layer3E(Layer3):
def _dec_unk_ie(self, T8, char):
if T8 & 0x80:
# 1 byte IE
log('%s, _dec_unk_ie: unknown Type2 IE, 0x%x' % (self._name, T8))
self.append( Type2('_T_%i' % T8, val=[T8]) )
# Type1TV IE, could also be a Type2 IE
log('%s, _dec_unk_ie: unknown Type1TV IE, 0x%.2x' % (self._name, T8))
self.append( Type1TV('_T_%X' % (T8>>4), val={'T':T8>>4, 'V':T8&0xf}) )
elif T8 & 0x70 == 0x70:
# Type6 TLV IE
# Type6TLV IE
L = char.get_uint(16)
V = char.get_bytes(8*L)
log('%s, _dec_unk_ie: unknown Type6TLVE IE, T: 0x%x, V: 0x%s' \
log('%s, _dec_unk_ie: unknown Type6TLVE IE, T: 0x%.2x, V: 0x%s' \
% (self._name, T8, hexlify(V)))
self.append( Type6TLVE('_T_%i' % T8, val=[T8, L, V]) )
else:
# Type4TLV IE
L = char.get_uint(8)
V = char.get_bytes(8*L)
log('%s, _dec_unk_ie: unknown Type4TLV IE, T: 0x%x, V: 0x%s' \
% (self._name, T8, hexlify(V)))
self.append( Type4TLV('_T_%i' % T8, val=[T8, L, V]) )
log('%s, _dec_unk_ie: unknown Type4TLV IE, T: 0x%.2x, V: 0x%s' \
% (self._name, T8, hexlify(V).decode('ascii')))
self.append( Type4TLV('_T_%X' % T8, val=[T8, L, V]) )
class IE(Envelope):

View File

@ -189,7 +189,7 @@ class EMMHeaderServ(Envelope):
# TS 24.301, section 8.2.1
#------------------------------------------------------------------------------#
class EMMAttachAccept(Layer3):
class EMMAttachAccept(Layer3E):
_GEN = (
EMMHeader(val={'Type':66}),
Uint('spare', bl=4),
@ -227,7 +227,7 @@ class EMMAttachAccept(Layer3):
# TS 24.301, section 8.2.2
#------------------------------------------------------------------------------#
class EMMAttachComplete(Layer3):
class EMMAttachComplete(Layer3E):
_GEN = (
EMMHeader(val={'Type':67}),
Type6LVE('ESMContainer', val={'V':b'\0\0\0'}),
@ -239,7 +239,7 @@ class EMMAttachComplete(Layer3):
# TS 24.301, section 8.2.3
#------------------------------------------------------------------------------#
class EMMAttachReject(Layer3):
class EMMAttachReject(Layer3E):
_GEN = (
EMMHeader(val={'Type':68}),
Type3V('EMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=EMMCause()),
@ -255,7 +255,7 @@ class EMMAttachReject(Layer3):
# TS 24.301, section 8.2.4
#------------------------------------------------------------------------------#
class EMMAttachRequest(Layer3):
class EMMAttachRequest(Layer3E):
_GEN = (
EMMHeader(val={'Type':65}),
Type1V('NAS_KSI', val={'V':7}, IE=NAS_KSI()),
@ -295,7 +295,7 @@ class EMMAttachRequest(Layer3):
# TS 24.301, section 8.2.5
#------------------------------------------------------------------------------#
class EMMAuthenticationFailure(Layer3):
class EMMAuthenticationFailure(Layer3E):
_GEN = (
EMMHeader(val={'Type':92}),
Type3V('EMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=EMMCause()),
@ -308,7 +308,7 @@ class EMMAuthenticationFailure(Layer3):
# TS 24.301, section 8.2.6
#------------------------------------------------------------------------------#
class EMMAuthenticationReject(Layer3):
class EMMAuthenticationReject(Layer3E):
_GEN = (
EMMHeader(val={'Type':84}),
)
@ -319,7 +319,7 @@ class EMMAuthenticationReject(Layer3):
# TS 24.301, section 8.2.7
#------------------------------------------------------------------------------#
class EMMAuthenticationRequest(Layer3):
class EMMAuthenticationRequest(Layer3E):
_GEN = (
EMMHeader(val={'Type':82}),
Uint('spare', bl=4),
@ -334,7 +334,7 @@ class EMMAuthenticationRequest(Layer3):
# TS 24.301, section 8.2.8
#------------------------------------------------------------------------------#
class EMMAuthenticationResponse(Layer3):
class EMMAuthenticationResponse(Layer3E):
_GEN = (
EMMHeader(val={'Type':83}),
Type4LV('RES', val={'V':8*b'\0'})
@ -346,7 +346,7 @@ class EMMAuthenticationResponse(Layer3):
# TS 24.301, section 8.2.9
#------------------------------------------------------------------------------#
class EMMCSServiceNotification(Layer3):
class EMMCSServiceNotification(Layer3E):
_GEN = (
EMMHeader(val={'Type':100}),
Type3V('PagingIdentity', val={'V':b'\x01'}, bl={'V':8}, IE=PagingIdentity()),
@ -362,7 +362,7 @@ class EMMCSServiceNotification(Layer3):
# TS 24.301, 8.2.10
#------------------------------------------------------------------------------#
class EMMDetachAccept(Layer3):
class EMMDetachAccept(Layer3E):
_GEN = (
EMMHeader(val={'Type':70}),
)
@ -373,7 +373,7 @@ class EMMDetachAccept(Layer3):
# TS 24.301, section 8.2.11.1
#------------------------------------------------------------------------------#
class EMMDetachRequestMO(Layer3):
class EMMDetachRequestMO(Layer3E):
_GEN = (
EMMHeader(val={'Type':69}),
Type1V('NAS_KSI', val={'V':7}, IE=NAS_KSI()),
@ -387,7 +387,7 @@ class EMMDetachRequestMO(Layer3):
# TS 24.301, section 8.2.11.2
#------------------------------------------------------------------------------#
class EMMDetachRequestMT(Layer3):
class EMMDetachRequestMT(Layer3E):
_GEN = (
EMMHeader(val={'Type':69}),
Uint('spare', bl=4),
@ -401,7 +401,7 @@ class EMMDetachRequestMT(Layer3):
# TS 24.301, section 8.2.12
#------------------------------------------------------------------------------#
class EMMDLNASTransport(Layer3):
class EMMDLNASTransport(Layer3E):
_GEN = (
EMMHeader(val={'Type':98}),
Type4LV('NASContainer', val={'V':b'\0\0'})
@ -413,7 +413,7 @@ class EMMDLNASTransport(Layer3):
# TS 24.301, section 8.2.13
#------------------------------------------------------------------------------#
class EMMInformation(Layer3):
class EMMInformation(Layer3E):
_GEN = (
EMMHeader(val={'Type':97}),
Type4TLV('NetFullName', val={'T':0x43, 'V':b'\0'}, IE=NetworkName()),
@ -430,7 +430,7 @@ class EMMInformation(Layer3):
# TS 24.301, section 8.2.14
#------------------------------------------------------------------------------#
class EMMStatus(Layer3):
class EMMStatus(Layer3E):
_GEN = (
EMMHeader(val={'Type':96}),
Type3V('EMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=EMMCause())
@ -442,7 +442,7 @@ class EMMStatus(Layer3):
# TS 24.301, section 8.2.15
#------------------------------------------------------------------------------#
class EMMExtServiceRequest(Layer3):
class EMMExtServiceRequest(Layer3E):
_GEN = (
EMMHeader(val={'Type':76}),
Type1V('NAS_KSI', val={'V':7}, IE=NAS_KSI()),
@ -459,7 +459,7 @@ class EMMExtServiceRequest(Layer3):
# TS 24.301, section 8.2.16
#------------------------------------------------------------------------------#
class EMMGUTIReallocCommand(Layer3):
class EMMGUTIReallocCommand(Layer3E):
_GEN = (
EMMHeader(val={'Type':80}),
Type4LV('GUTI', val={'V':b'\xf6'+10*b'\0'}, IE=EPSID()),
@ -473,7 +473,7 @@ class EMMGUTIReallocCommand(Layer3):
# TS 24.301, section 8.2.17
#------------------------------------------------------------------------------#
class EMMGUTIReallocComplete(Layer3):
class EMMGUTIReallocComplete(Layer3E):
_GEN = (
EMMHeader(val={'Type':81}),
)
@ -484,7 +484,7 @@ class EMMGUTIReallocComplete(Layer3):
# TS 24.301, section 8.2.18
#------------------------------------------------------------------------------#
class EMMIdentityRequest(Layer3):
class EMMIdentityRequest(Layer3E):
_GEN = (
EMMHeader(val={'Type':85}),
Uint('spare', bl=4),
@ -497,7 +497,7 @@ class EMMIdentityRequest(Layer3):
# TS 24.301, section 8.2.19
#------------------------------------------------------------------------------#
class EMMIdentityResponse(Layer3):
class EMMIdentityResponse(Layer3E):
_GEN = (
EMMHeader(val={'Type':86}),
Type4LV('ID', val={'V':b'\xf4\0\0\0\0'}, IE=ID())
@ -509,7 +509,7 @@ class EMMIdentityResponse(Layer3):
# TS 24.301, section 8.2.20
#------------------------------------------------------------------------------#
class EMMSecurityModeCommand(Layer3):
class EMMSecurityModeCommand(Layer3E):
_GEN = (
EMMHeader(val={'Type':93}),
Type3V('NASSecAlgo', val={'V':b'\x11'}, bl={'V':8}, IE=NASSecAlgo()),
@ -530,7 +530,7 @@ class EMMSecurityModeCommand(Layer3):
# TS 24.301, section 8.2.21
#------------------------------------------------------------------------------#
class EMMSecurityModeComplete(Layer3):
class EMMSecurityModeComplete(Layer3E):
_GEN = (
EMMHeader(val={'Type':94}),
Type4TLV('IMEISV', val={'T':0x23, 'V':b'\x03\0\0\0\0\0\0\0\xf0'}, IE=ID()),
@ -544,7 +544,7 @@ class EMMSecurityModeComplete(Layer3):
# TS 24.301, section 8.2.22
#------------------------------------------------------------------------------#
class EMMSecurityModeReject(Layer3):
class EMMSecurityModeReject(Layer3E):
_GEN = (
EMMHeader(val={'Type':95}),
Type3V('EMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=EMMCause())
@ -558,7 +558,7 @@ class EMMSecurityModeReject(Layer3):
if _with_cm:
class EMMSecProtNASMessage(Layer3):
class EMMSecProtNASMessage(Layer3E):
_GEN = (
EMMHeaderSec(),
Buf('MAC', val=b'\0\0\0\0', bl=32, rep=REPR_HEX),
@ -691,7 +691,7 @@ if _with_cm:
else:
class EMMSecProtNASMessage(Layer3):
class EMMSecProtNASMessage(Layer3E):
_GEN = (
EMMHeaderSec(),
Buf('MAC', val=b'\0\0\0\0', bl=32, rep=REPR_HEX),
@ -705,7 +705,7 @@ else:
# TS 24.301, section 8.2.24
#------------------------------------------------------------------------------#
class EMMServiceReject(Layer3):
class EMMServiceReject(Layer3E):
_GEN = (
EMMHeader(val={'Type':78}),
Type3V('EMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=EMMCause()),
@ -722,7 +722,7 @@ class EMMServiceReject(Layer3):
if _with_cm:
class EMMServiceRequest(Layer3):
class EMMServiceRequest(Layer3E):
_GEN = (
EMMHeaderServ(val={'SecHdr': 12}),
Uint('KSI', bl=3, dic={7:'no key available'}),
@ -785,7 +785,7 @@ if _with_cm:
else:
class EMMServiceRequest(Layer3):
class EMMServiceRequest(Layer3E):
_GEN = (
EMMHeaderServ(val={'SecHdr': 12}),
Uint('KSI', bl=3, dic={7:'no key available'}),
@ -799,7 +799,7 @@ else:
# TS 24.301, section 8.2.26
#------------------------------------------------------------------------------#
class EMMTrackingAreaUpdateAccept(Layer3):
class EMMTrackingAreaUpdateAccept(Layer3E):
_GEN = (
EMMHeader(val={'Type':73}),
Uint('spare', bl=4),
@ -839,7 +839,7 @@ class EMMTrackingAreaUpdateAccept(Layer3):
# TS 24.301, section 8.2.27
#------------------------------------------------------------------------------#
class EMMTrackingAreaUpdateComplete(Layer3):
class EMMTrackingAreaUpdateComplete(Layer3E):
_GEN = (
EMMHeader(val={'Type':74}),
)
@ -850,7 +850,7 @@ class EMMTrackingAreaUpdateComplete(Layer3):
# TS 24.301, section 8.2.28
#------------------------------------------------------------------------------#
class EMMTrackingAreaUpdateReject(Layer3):
class EMMTrackingAreaUpdateReject(Layer3E):
_GEN = (
EMMHeader(val={'Type':75}),
Type3V('EMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=EMMCause()),
@ -864,7 +864,7 @@ class EMMTrackingAreaUpdateReject(Layer3):
# TS 24.301, section 8.2.29
#------------------------------------------------------------------------------#
class EMMTrackingAreaUpdateRequest(Layer3):
class EMMTrackingAreaUpdateRequest(Layer3E):
_GEN = (
EMMHeader(val={'Type':72}),
Type1V('NAS_KSI', val={'V':7}, IE=NAS_KSI()),
@ -908,7 +908,7 @@ class EMMTrackingAreaUpdateRequest(Layer3):
# TS 24.301, section 8.2.30
#------------------------------------------------------------------------------#
class EMMULNASTransport(Layer3):
class EMMULNASTransport(Layer3E):
_GEN = (
EMMHeader(val={'Type':99}),
Type4LV('NASContainer', val={'V':b'\0\0'})
@ -920,7 +920,7 @@ class EMMULNASTransport(Layer3):
# TS 24.301, section 8.2.31
#------------------------------------------------------------------------------#
class EMMDLGenericNASTransport(Layer3):
class EMMDLGenericNASTransport(Layer3E):
_GEN = (
EMMHeader(val={'Type':104}),
Type3V('GenericContType', val={'V':b'\0'}, bl={'V':8}, IE=GenericContType()),
@ -934,7 +934,7 @@ class EMMDLGenericNASTransport(Layer3):
# TS 24.301, section 8.2.32
#------------------------------------------------------------------------------#
class EMMULGenericNASTransport(Layer3):
class EMMULGenericNASTransport(Layer3E):
_GEN = (
EMMHeader(val={'Type':105}),
Type3V('GenericContType', val={'V':b'\0'}, bl={'V':8}, IE=GenericContType()),
@ -948,7 +948,7 @@ class EMMULGenericNASTransport(Layer3):
# TS 24.301, section 8.2.33
#------------------------------------------------------------------------------#
class EMMCPServiceRequest(Layer3):
class EMMCPServiceRequest(Layer3E):
_GEN = (
EMMHeader(val={'Type':77}),
Type1V('NAS_KSI', val={'V':7}, IE=NAS_KSI()),
@ -965,7 +965,7 @@ class EMMCPServiceRequest(Layer3):
# TS 24.301, section 8.2.34
#------------------------------------------------------------------------------#
class EMMServiceAccept(Layer3):
class EMMServiceAccept(Layer3E):
_GEN = (
EMMHeader(val={'Type':79}),
Type4TLV('EPSBearerCtxtStat', val={'T':0x57, 'V':b'\0\0'}, IE=EPSBearerCtxtStat()),

View File

@ -133,7 +133,7 @@ class ESMHeader(Envelope):
# TS 24.301, section 8.3.1
#------------------------------------------------------------------------------#
class ESMActDediEPSBearerCtxtAccept(Layer3):
class ESMActDediEPSBearerCtxtAccept(Layer3E):
_GEN = (
ESMHeader(val={'Type':198}),
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
@ -147,7 +147,7 @@ class ESMActDediEPSBearerCtxtAccept(Layer3):
# TS 24.301, section 8.3.2
#------------------------------------------------------------------------------#
class ESMActDediEPSBearerCtxtReject(Layer3):
class ESMActDediEPSBearerCtxtReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':199}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -162,7 +162,7 @@ class ESMActDediEPSBearerCtxtReject(Layer3):
# TS 24.301, section 8.3.3
#------------------------------------------------------------------------------#
class ESMActDediEPSBearerCtxtRequest(Layer3):
class ESMActDediEPSBearerCtxtRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':197}),
Uint('spare', bl=4),
@ -187,7 +187,7 @@ class ESMActDediEPSBearerCtxtRequest(Layer3):
# TS 24.301, section 8.3.4
#------------------------------------------------------------------------------#
class ESMActDefaultEPSBearerCtxtAccept(Layer3):
class ESMActDefaultEPSBearerCtxtAccept(Layer3E):
_GEN = (
ESMHeader(val={'Type':194}),
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
@ -200,7 +200,7 @@ class ESMActDefaultEPSBearerCtxtAccept(Layer3):
# TS 24.301, section 8.3.5
#------------------------------------------------------------------------------#
class ESMActDefaultEPSBearerCtxtReject(Layer3):
class ESMActDefaultEPSBearerCtxtReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':195}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -214,7 +214,7 @@ class ESMActDefaultEPSBearerCtxtReject(Layer3):
# TS 24.301, section 8.3.6
#------------------------------------------------------------------------------#
class ESMActDefaultEPSBearerCtxtRequest(Layer3):
class ESMActDefaultEPSBearerCtxtRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':193}),
Type4LV('EPSQoS', val={'V':b'\x09'}, IE=EPSQoS()),
@ -244,7 +244,7 @@ class ESMActDefaultEPSBearerCtxtRequest(Layer3):
# TS 24.301, section 8.3.7
#------------------------------------------------------------------------------#
class ESMBearerResourceAllocReject(Layer3):
class ESMBearerResourceAllocReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':213}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -261,7 +261,7 @@ class ESMBearerResourceAllocReject(Layer3):
# TS 24.301, section 8.3.8
#------------------------------------------------------------------------------#
class ESMBearerResourceAllocRequest(Layer3):
class ESMBearerResourceAllocRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':212}),
Uint('spare', bl=4),
@ -281,7 +281,7 @@ class ESMBearerResourceAllocRequest(Layer3):
# TS 24.301, section 8.3.9
#------------------------------------------------------------------------------#
class ESMBearerResourceModifReject(Layer3):
class ESMBearerResourceModifReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':215}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -298,7 +298,7 @@ class ESMBearerResourceModifReject(Layer3):
# TS 24.301, section 8.3.10
#------------------------------------------------------------------------------#
class ESMBearerResourceModifRequest(Layer3):
class ESMBearerResourceModifRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':214}),
Uint('spare', bl=4),
@ -320,7 +320,7 @@ class ESMBearerResourceModifRequest(Layer3):
# TS 24.301, section 8.3.11
#------------------------------------------------------------------------------#
class ESMDeactEPSBearerCtxtAccept(Layer3):
class ESMDeactEPSBearerCtxtAccept(Layer3E):
_GEN = (
ESMHeader(val={'Type':206}),
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
@ -333,7 +333,7 @@ class ESMDeactEPSBearerCtxtAccept(Layer3):
# TS 24.301, section 8.3.12
#------------------------------------------------------------------------------#
class ESMDeactEPSBearerCtxtRequest(Layer3):
class ESMDeactEPSBearerCtxtRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':205}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -350,7 +350,7 @@ class ESMDeactEPSBearerCtxtRequest(Layer3):
# TS 24.301, section 8.3.12A
#------------------------------------------------------------------------------#
class ESMDummyMessage(Layer3):
class ESMDummyMessage(Layer3E):
_GEN = (
ESMHeader(val={'Type':220}),
)
@ -361,7 +361,7 @@ class ESMDummyMessage(Layer3):
# TS 24.301, section 8.3.13
#------------------------------------------------------------------------------#
class ESMInformationRequest(Layer3):
class ESMInformationRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':217}),
)
@ -372,7 +372,7 @@ class ESMInformationRequest(Layer3):
# TS 24.301, section 8.3.14
#------------------------------------------------------------------------------#
class ESMInformationResponse(Layer3):
class ESMInformationResponse(Layer3E):
_GEN = (
ESMHeader(val={'Type':218}),
Type4TLV('APN', val={'T':0x28, 'V':b'\0'}, IE=APN()),
@ -386,7 +386,7 @@ class ESMInformationResponse(Layer3):
# TS 24.301, section 8.3.15
#------------------------------------------------------------------------------#
class ESMStatus(Layer3):
class ESMStatus(Layer3E):
_GEN = (
ESMHeader(val={'Type':232}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause())
@ -398,7 +398,7 @@ class ESMStatus(Layer3):
# TS 24.301, section 8.3.16
#------------------------------------------------------------------------------#
class ESMModifyEPSBearerCtxtAccept(Layer3):
class ESMModifyEPSBearerCtxtAccept(Layer3E):
_GEN = (
ESMHeader(val={'Type':202}),
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
@ -412,7 +412,7 @@ class ESMModifyEPSBearerCtxtAccept(Layer3):
# TS 24.301, section 8.3.17
#------------------------------------------------------------------------------#
class ESMModifyEPSBearerCtxtReject(Layer3):
class ESMModifyEPSBearerCtxtReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':203}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -427,7 +427,7 @@ class ESMModifyEPSBearerCtxtReject(Layer3):
# TS 24.301, section 8.3.18
#------------------------------------------------------------------------------#
class ESMModifyEPSBearerCtxtRequest(Layer3):
class ESMModifyEPSBearerCtxtRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':201}),
Type4TLV('EPSQoS', val={'T':0x5B, 'V':b'\x09'}, IE=EPSQoS()),
@ -452,7 +452,7 @@ class ESMModifyEPSBearerCtxtRequest(Layer3):
# TS 24.301, section 8.3.18A
#------------------------------------------------------------------------------#
class ESMNotification(Layer3):
class ESMNotification(Layer3E):
_GEN = (
ESMHeader(val={'Type':219}),
Type4LV('NotificationInd', val={'V':b'\0'}, IE=NotificationInd()),
@ -464,7 +464,7 @@ class ESMNotification(Layer3):
# TS 24.301, section 8.3.19
#------------------------------------------------------------------------------#
class ESMPDNConnectivityReject(Layer3):
class ESMPDNConnectivityReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':209}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -481,7 +481,7 @@ class ESMPDNConnectivityReject(Layer3):
# TS 24.301, section 8.3.20
#------------------------------------------------------------------------------#
class ESMPDNConnectivityRequest(Layer3):
class ESMPDNConnectivityRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':208}),
Type1V('PDNType', dic=PDNType_dict),
@ -501,7 +501,7 @@ class ESMPDNConnectivityRequest(Layer3):
# TS 24.301, section 8.3.21
#------------------------------------------------------------------------------#
class ESMPDNDisconnectReject(Layer3):
class ESMPDNDisconnectReject(Layer3E):
_GEN = (
ESMHeader(val={'Type':211}),
Type3V('ESMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=ESMCause()),
@ -516,7 +516,7 @@ class ESMPDNDisconnectReject(Layer3):
# TS 24.301, section 8.3.22
#------------------------------------------------------------------------------#
class ESMPDNDisconnectRequest(Layer3):
class ESMPDNDisconnectRequest(Layer3E):
_GEN = (
ESMHeader(val={'Type':210}),
Uint('spare', bl=4),
@ -531,7 +531,7 @@ class ESMPDNDisconnectRequest(Layer3):
# TS 24.301, section 8.3.23
#------------------------------------------------------------------------------#
class ESMRemoteUEReport(Layer3):
class ESMRemoteUEReport(Layer3E):
_GEN = (
ESMHeader(val={'Type':233}),
Type6TLVE('RemoteUEConnected', val={'T':0x79, 'V':b''}, IE=RemoteUECtxtList()),
@ -545,7 +545,7 @@ class ESMRemoteUEReport(Layer3):
# TS 24.301, section 8.3.24
#------------------------------------------------------------------------------#
class ESMRemoteUEResponse(Layer3):
class ESMRemoteUEResponse(Layer3E):
_GEN = (
ESMHeader(val={'Type':234}),
)
@ -556,7 +556,7 @@ class ESMRemoteUEResponse(Layer3):
# TS 24.301, section 8.3.25
#------------------------------------------------------------------------------#
class ESMDataTransport(Layer3):
class ESMDataTransport(Layer3E):
_GEN = (
ESMHeader(val={'Type':235}),
Type6LVE('UserData', val={'V':b''}),

View File

@ -153,7 +153,7 @@ class FGMMHeaderSec(Envelope):
# TS 24.501, section 8.2.1
#------------------------------------------------------------------------------#
class FGMMAuthenticationRequest(Layer3):
class FGMMAuthenticationRequest(Layer3E):
_name = '5GMMAuthenticationRequest'
_GEN = (
FGMMHeader(val={'Type':86}),
@ -171,7 +171,7 @@ class FGMMAuthenticationRequest(Layer3):
# TS 24.501, section 8.2.2
#------------------------------------------------------------------------------#
class FGMMAuthenticationResponse(Layer3):
class FGMMAuthenticationResponse(Layer3E):
_name = '5GMMAuthenticationResponse'
_GEN = (
FGMMHeader(val={'Type':87}),
@ -185,7 +185,7 @@ class FGMMAuthenticationResponse(Layer3):
# TS 24.501, section 8.2.3
#------------------------------------------------------------------------------#
class FGMMAuthenticationResult(Layer3):
class FGMMAuthenticationResult(Layer3E):
_name = '5GMMAuthenticationResult'
_GEN = (
FGMMHeader(val={'Type':90}),
@ -201,7 +201,7 @@ class FGMMAuthenticationResult(Layer3):
# TS 24.501, section 8.2.4
#------------------------------------------------------------------------------#
class FGMMAuthenticationFailure(Layer3):
class FGMMAuthenticationFailure(Layer3E):
_name = '5GMMAuthenticationFailure'
_GEN = (
FGMMHeader(val={'Type':89}),
@ -215,7 +215,7 @@ class FGMMAuthenticationFailure(Layer3):
# TS 24.501, section 8.2.5
#------------------------------------------------------------------------------#
class FGMMAuthenticationReject(Layer3):
class FGMMAuthenticationReject(Layer3E):
_name = '5GMMAuthenticationReject'
_GEN = (
FGMMHeader(val={'Type':88}),
@ -228,7 +228,7 @@ class FGMMAuthenticationReject(Layer3):
# TS 24.501, section 8.2.6
#------------------------------------------------------------------------------#
class FGMMRegistrationRequest(Layer3):
class FGMMRegistrationRequest(Layer3E):
_name = '5GMMRegistrationRequest'
_GEN = (
FGMMHeader(val={'Type':65}),
@ -275,7 +275,7 @@ class FGMMRegistrationRequest(Layer3):
# TS 24.501, section 8.2.7
#------------------------------------------------------------------------------#
class FGMMRegistrationAccept(Layer3):
class FGMMRegistrationAccept(Layer3E):
_name = '5GMMRegistrationAccept'
_GEN = (
FGMMHeader(val={'Type':66}),
@ -293,7 +293,7 @@ class FGMMRegistrationAccept(Layer3):
Type6TLVE('LADNInfo', val={'T':0x79, 'V':9*b'\0'}, IE=LADNInfo()),
Type1TV('MICOInd', val={'T':0xB, 'V':0}, IE=MICOInd()),
Type1TV('NetSlicingInd', val={'T':0x9, 'V':0}, IE=NetSlicingInd()),
Type6TLVE('SAList', val={'T':0x27, 'V':b'\0\0\0'}, IE=SAList()),
Type4TLV('SAList', val={'T':0x27, 'V':b'\0\0\0'}, IE=SAList()),
Type4TLV('T3512', val={'T':0x5E, 'V':b'\0'}, IE=GPRSTimer3()),
Type4TLV('Non3GPPDeregTimer', val={'T':0x5D, 'V':b'\0'}, IE=GPRSTimer()),
Type4TLV('T3502', val={'T':0x16, 'V':b'\0'}, IE=GPRSTimer()),
@ -326,7 +326,7 @@ class FGMMRegistrationAccept(Layer3):
# TS 24.501, section 8.2.8
#------------------------------------------------------------------------------#
class FGMMRegistrationComplete(Layer3):
class FGMMRegistrationComplete(Layer3E):
_name = '5GMMRegistrationComplete'
_GEN = (
FGMMHeader(val={'Type':67}),
@ -339,7 +339,7 @@ class FGMMRegistrationComplete(Layer3):
# TS 24.501, section 8.2.9
#------------------------------------------------------------------------------#
class FGMMRegistrationReject(Layer3):
class FGMMRegistrationReject(Layer3E):
_name = '5GMMRegistrationReject'
_GEN = (
FGMMHeader(val={'Type':68}),
@ -357,7 +357,7 @@ class FGMMRegistrationReject(Layer3):
# TS 24.501, section 8.2.10
#------------------------------------------------------------------------------#
class FGMMULNASTransport(Layer3):
class FGMMULNASTransport(Layer3E):
_name = '5GMMULNASTransport'
_GEN = (
FGMMHeader(val={'Type':103}),
@ -380,7 +380,7 @@ class FGMMULNASTransport(Layer3):
# TS 24.501, section 8.2.11
#------------------------------------------------------------------------------#
class FGMMDLNASTransport(Layer3):
class FGMMDLNASTransport(Layer3E):
_name = '5GMMDLNASTransport'
_GEN = (
FGMMHeader(val={'Type':104}),
@ -399,7 +399,7 @@ class FGMMDLNASTransport(Layer3):
# TS 24.501, section 8.2.12
#------------------------------------------------------------------------------#
class FGMMMODeregistrationRequest(Layer3):
class FGMMMODeregistrationRequest(Layer3E):
_name = '5GMMMODeregistrationRequest'
_GEN = (
FGMMHeader(val={'Type':69}),
@ -414,7 +414,7 @@ class FGMMMODeregistrationRequest(Layer3):
# TS 24.501, section 8.2.13
#------------------------------------------------------------------------------#
class FGMMMODeregistrationAccept(Layer3):
class FGMMMODeregistrationAccept(Layer3E):
_name = '5GMMMODeregistrationAccept'
_GEN = (
FGMMHeader(val={'Type':70}),
@ -426,7 +426,7 @@ class FGMMMODeregistrationAccept(Layer3):
# TS 24.501, section 8.2.14
#------------------------------------------------------------------------------#
class FGMMMTDeregistrationRequest(Layer3):
class FGMMMTDeregistrationRequest(Layer3E):
_name = '5GMMMTDeregistrationRequest'
_GEN = (
FGMMHeader(val={'Type':71}),
@ -443,7 +443,7 @@ class FGMMMTDeregistrationRequest(Layer3):
# TS 24.501, section 8.2.15
#------------------------------------------------------------------------------#
class FGMMMTDeregistrationAccept(Layer3):
class FGMMMTDeregistrationAccept(Layer3E):
_name = '5GMMMTDeregistrationAccept'
_GEN = (
FGMMHeader(val={'Type':71}),
@ -455,7 +455,7 @@ class FGMMMTDeregistrationAccept(Layer3):
# TS 24.501, section 8.2.16
#------------------------------------------------------------------------------#
class FGMMServiceRequest(Layer3):
class FGMMServiceRequest(Layer3E):
_name = '5GMMServiceRequest'
_GEN = (
FGMMHeader(val={'Type':76}),
@ -474,7 +474,7 @@ class FGMMServiceRequest(Layer3):
# TS 24.501, section 8.2.17
#------------------------------------------------------------------------------#
class FGMMServiceAccept(Layer3):
class FGMMServiceAccept(Layer3E):
_name = '5GMMServiceAccept'
_GEN = (
FGMMHeader(val={'Type':78}),
@ -491,7 +491,7 @@ class FGMMServiceAccept(Layer3):
# TS 24.501, section 8.2.18
#------------------------------------------------------------------------------#
class FGMMServiceReject(Layer3):
class FGMMServiceReject(Layer3E):
_name = '5GMMServiceAccept'
_GEN = (
FGMMHeader(val={'Type':77}),
@ -509,7 +509,7 @@ class FGMMServiceReject(Layer3):
# TS 24.501, section 8.2.19
#------------------------------------------------------------------------------#
class FGMMConfigurationUpdateCommand(Layer3):
class FGMMConfigurationUpdateCommand(Layer3E):
_name = '5GMMConfigurationUpdateCommand'
_GEN = (
FGMMHeader(val={'Type':84}),
@ -517,7 +517,7 @@ class FGMMConfigurationUpdateCommand(Layer3):
Type6TLVE('5GSID', val={'T':0x77, 'V':b'\0\0\0\0'}, IE=FGSID()),
Type4TLV('5GSTAIList', val={'T':0x54, 'V':7*b'\0'}, IE=FGSTAIList()),
Type4TLV('AllowedNSSAI', val={'T':0x15, 'V':b'\0\0'}, IE=NSSAI()),
Type6TLVE('SAList', val={'T':0x27, 'V':b'\0\0\0'}, IE=SAList()),
Type4TLV('SAList', val={'T':0x27, 'V':b'\0\0\0'}, IE=SAList()),
Type4TLV('NetFullName', val={'T':0x43, 'V':b'\0'}, IE=NetworkName()),
Type4TLV('NetShortName', val={'T':0x45, 'V':b'\0'}, IE=NetworkName()),
Type3TV('LocalTimeZone', val={'T':0x46, 'V':b'\0'}, bl={'V':8}, IE=TimeZone()),
@ -545,7 +545,7 @@ class FGMMConfigurationUpdateCommand(Layer3):
# TS 24.501, section 8.2.20
#------------------------------------------------------------------------------#
class FGMMConfigurationUpdateComplete(Layer3):
class FGMMConfigurationUpdateComplete(Layer3E):
_name = '5GMMConfigurationUpdateComplete'
_GEN = (
FGMMHeader(val={'Type':85}),
@ -557,7 +557,7 @@ class FGMMConfigurationUpdateComplete(Layer3):
# TS 24.501, section 8.2.21
#------------------------------------------------------------------------------#
class FGMMIdentityRequest(Layer3):
class FGMMIdentityRequest(Layer3E):
_name = '5GMMIdentityRequest'
_GEN = (
FGMMHeader(val={'Type':91}),
@ -571,7 +571,7 @@ class FGMMIdentityRequest(Layer3):
# TS 24.501, section 8.2.22
#------------------------------------------------------------------------------#
class FGMMIdentityResponse(Layer3):
class FGMMIdentityResponse(Layer3E):
_name = '5GMMIdentityResponse'
_GEN = (
FGMMHeader(val={'Type':92}),
@ -584,7 +584,7 @@ class FGMMIdentityResponse(Layer3):
# TS 24.501, section 8.2.23
#------------------------------------------------------------------------------#
class FGMMNotification(Layer3):
class FGMMNotification(Layer3E):
_name = '5GMMNotification'
_GEN = (
FGMMHeader(val={'Type':101}),
@ -598,7 +598,7 @@ class FGMMNotification(Layer3):
# TS 24.501, section 8.2.24
#------------------------------------------------------------------------------#
class FGMMNotificationResponse(Layer3):
class FGMMNotificationResponse(Layer3E):
_name = '5GMMNotificationResponse'
_GEN = (
FGMMHeader(val={'Type':102}),
@ -611,7 +611,7 @@ class FGMMNotificationResponse(Layer3):
# TS 24.501, section 8.2.25
#------------------------------------------------------------------------------#
class FGMMSecurityModeCommand(Layer3):
class FGMMSecurityModeCommand(Layer3E):
_name = '5GMMSecurityModeCommand'
_GEN = (
FGMMHeader(val={'Type':93}),
@ -633,7 +633,7 @@ class FGMMSecurityModeCommand(Layer3):
# TS 24.501, section 8.2.26
#------------------------------------------------------------------------------#
class FGMMSecurityModeComplete(Layer3):
class FGMMSecurityModeComplete(Layer3E):
_name = '5GMMSecurityModeComplete'
_GEN = (
FGMMHeader(val={'Type':94}),
@ -648,7 +648,7 @@ class FGMMSecurityModeComplete(Layer3):
# TS 24.501, section 8.2.27
#------------------------------------------------------------------------------#
class FGMMSecurityModeReject(Layer3):
class FGMMSecurityModeReject(Layer3E):
_name = '5GMMSecurityModeReject'
_GEN = (
FGMMHeader(val={'Type':95}),
@ -663,7 +663,7 @@ class FGMMSecurityModeReject(Layer3):
if _with_cm:
class FGMMSecProtNASMessage(Layer3):
class FGMMSecProtNASMessage(Layer3E):
_name = '5GMMSecProtNASMessage'
_GEN = (
FGMMHeaderSec(),
@ -798,7 +798,7 @@ if _with_cm:
else:
class FGMMSecProtNASMessage(Layer3):
class FGMMSecProtNASMessage(Layer3E):
_name = '5GMMSecProtNASMessage'
_GEN = (
FGMMHeaderSec(),
@ -813,7 +813,7 @@ else:
# TS 24.501, section 8.2.29
#------------------------------------------------------------------------------#
class FGMMStatus(Layer3):
class FGMMStatus(Layer3E):
_name = '5GMMStatus'
_GEN = (
FGMMHeader(val={'Type':100}),
@ -826,7 +826,7 @@ class FGMMStatus(Layer3):
# TS 24.501, section 8.2.30
#------------------------------------------------------------------------------#
class FGMMControlPlaneServiceRequest(Layer3):
class FGMMControlPlaneServiceRequest(Layer3E):
_name = '5GMMControlPlaneServiceRequest'
_GEN = (
FGMMHeader(val={'Type':79}),
@ -849,7 +849,7 @@ class FGMMControlPlaneServiceRequest(Layer3):
# TS 24.501, section 8.2.31
#------------------------------------------------------------------------------#
class FGMMNetworkSliceSpecAuthCommand(Layer3):
class FGMMNetworkSliceSpecAuthCommand(Layer3E):
_name = '5GMMNetworkSliceSpecAuthCommand'
_GEN = (
FGMMHeader(val={'Type':80}),
@ -863,7 +863,7 @@ class FGMMNetworkSliceSpecAuthCommand(Layer3):
# TS 24.501, section 8.2.31
#------------------------------------------------------------------------------#
class FGMMNetworkSliceSpecAuthComplete(Layer3):
class FGMMNetworkSliceSpecAuthComplete(Layer3E):
_name = '5GMMNetworkSliceSpecAuthComplete'
_GEN = (
FGMMHeader(val={'Type':81}),
@ -877,7 +877,7 @@ class FGMMNetworkSliceSpecAuthComplete(Layer3):
# TS 24.501, section 8.2.31
#------------------------------------------------------------------------------#
class FGMMNetworkSliceSpecAuthResult(Layer3):
class FGMMNetworkSliceSpecAuthResult(Layer3E):
_name = '5GMMNetworkSliceSpecAuthResult'
_GEN = (
FGMMHeader(val={'Type':82}),

View File

@ -94,7 +94,7 @@ class FGSMHeader(Envelope):
# TS 24.501, section 8.3.1
#------------------------------------------------------------------------------#
class FGSMPDUSessionEstabRequest(Layer3):
class FGSMPDUSessionEstabRequest(Layer3E):
_name = '5GSMPDUSessionEstabRequest'
_GEN = (
FGSMHeader(val={'Type':193}),
@ -117,7 +117,7 @@ class FGSMPDUSessionEstabRequest(Layer3):
# TS 24.501, section 8.3.2
#------------------------------------------------------------------------------#
class FGSMPDUSessionEstabAccept(Layer3):
class FGSMPDUSessionEstabAccept(Layer3E):
_name = '5GSMPDUSessionEstabAccept'
_GEN = (
FGSMHeader(val={'Type':194}),
@ -149,7 +149,7 @@ class FGSMPDUSessionEstabAccept(Layer3):
# TS 24.501, section 8.3.3
#------------------------------------------------------------------------------#
class FGSMPDUSessionEstabReject(Layer3):
class FGSMPDUSessionEstabReject(Layer3E):
_name = '5GSMPDUSessionEstabReject'
_GEN = (
FGSMHeader(val={'Type':195}),
@ -168,7 +168,7 @@ class FGSMPDUSessionEstabReject(Layer3):
# TS 24.501, section 8.3.4
#------------------------------------------------------------------------------#
class FGSMPDUSessionAuthentCommand(Layer3):
class FGSMPDUSessionAuthentCommand(Layer3E):
_name = '5GSMPDUSessionAuthentCommand'
_GEN = (
FGSMHeader(val={'Type':197}),
@ -182,7 +182,7 @@ class FGSMPDUSessionAuthentCommand(Layer3):
# TS 24.501, section 8.3.5
#------------------------------------------------------------------------------#
class FGSMPDUSessionAuthentComplete(Layer3):
class FGSMPDUSessionAuthentComplete(Layer3E):
_name = '5GSMPDUSessionAuthentComplete'
_GEN = (
FGSMHeader(val={'Type':198}),
@ -196,7 +196,7 @@ class FGSMPDUSessionAuthentComplete(Layer3):
# TS 24.501, section 8.3.6
#------------------------------------------------------------------------------#
class FGSMPDUSessionAuthentResult(Layer3):
class FGSMPDUSessionAuthentResult(Layer3E):
_name = '5GSMPDUSessionAuthentResult'
_GEN = (
FGSMHeader(val={'Type':199}),
@ -210,7 +210,7 @@ class FGSMPDUSessionAuthentResult(Layer3):
# TS 24.501, section 8.3.7
#------------------------------------------------------------------------------#
class FGSMPDUSessionModifRequest(Layer3):
class FGSMPDUSessionModifRequest(Layer3E):
_name = '5GSMPDUSessionModifRequest'
_GEN = (
FGSMHeader(val={'Type':201}),
@ -232,7 +232,7 @@ class FGSMPDUSessionModifRequest(Layer3):
# TS 24.501, section 8.3.8
#------------------------------------------------------------------------------#
class FGSMPDUSessionModifReject(Layer3):
class FGSMPDUSessionModifReject(Layer3E):
_name = '5GSMPDUSessionModifReject'
_GEN = (
FGSMHeader(val={'Type':202}),
@ -249,7 +249,7 @@ class FGSMPDUSessionModifReject(Layer3):
# TS 24.501, section 8.3.9
#------------------------------------------------------------------------------#
class FGSMPDUSessionModifCommand(Layer3):
class FGSMPDUSessionModifCommand(Layer3E):
_name = '5GSMPDUSessionModifCommand'
_GEN = (
FGSMHeader(val={'Type':203}),
@ -273,7 +273,7 @@ class FGSMPDUSessionModifCommand(Layer3):
# TS 24.501, section 8.3.10
#------------------------------------------------------------------------------#
class FGSMPDUSessionModifComplete(Layer3):
class FGSMPDUSessionModifComplete(Layer3E):
_name = '5GSMPDUSessionModifComplete'
_GEN = (
FGSMHeader(val={'Type':204}),
@ -287,7 +287,7 @@ class FGSMPDUSessionModifComplete(Layer3):
# TS 24.501, section 8.3.11
#------------------------------------------------------------------------------#
class FGSMPDUSessionModifCommandReject(Layer3):
class FGSMPDUSessionModifCommandReject(Layer3E):
_name = '5GSMPDUSessionModifCommandReject'
_GEN = (
FGSMHeader(val={'Type':205}),
@ -301,7 +301,7 @@ class FGSMPDUSessionModifCommandReject(Layer3):
# TS 24.501, section 8.3.12
#------------------------------------------------------------------------------#
class FGSMPDUSessionReleaseRequest(Layer3):
class FGSMPDUSessionReleaseRequest(Layer3E):
_name = '5GSMPDUSessionReleaseRequest'
_GEN = (
FGSMHeader(val={'Type':209}),
@ -315,7 +315,7 @@ class FGSMPDUSessionReleaseRequest(Layer3):
# TS 24.501, section 8.3.13
#------------------------------------------------------------------------------#
class FGSMPDUSessionReleaseReject(Layer3):
class FGSMPDUSessionReleaseReject(Layer3E):
_name = '5GSMPDUSessionReleaseReject'
_GEN = (
FGSMHeader(val={'Type':210}),
@ -329,7 +329,7 @@ class FGSMPDUSessionReleaseReject(Layer3):
# TS 24.501, section 8.3.14
#------------------------------------------------------------------------------#
class FGSMPDUSessionReleaseCommand(Layer3):
class FGSMPDUSessionReleaseCommand(Layer3E):
_name = '5GSMPDUSessionReleaseCommand'
_GEN = (
FGSMHeader(val={'Type':211}),
@ -346,7 +346,7 @@ class FGSMPDUSessionReleaseCommand(Layer3):
# TS 24.501, section 8.3.15
#------------------------------------------------------------------------------#
class FGSMPDUSessionReleaseComplete(Layer3):
class FGSMPDUSessionReleaseComplete(Layer3E):
_name = '5GSMPDUSessionReleaseComplete'
_GEN = (
FGSMHeader(val={'Type':212}),
@ -360,7 +360,7 @@ class FGSMPDUSessionReleaseComplete(Layer3):
# TS 24.501, section 8.3.16
#------------------------------------------------------------------------------#
class FGSMStatus(Layer3):
class FGSMStatus(Layer3E):
_name = '5GSMStatus'
_GEN = (
FGSMHeader(val={'Type':214}),