mobile: rationalize some decoding routines for 24008 and 24501 IE

This commit is contained in:
mich 2019-12-12 15:00:16 +01:00
parent 16d89a8e63
commit ca9f87abd5
2 changed files with 17 additions and 139 deletions

View File

@ -2146,6 +2146,8 @@ class CodecSysID(Envelope):
l = self[1]()
clen = char._len_bit
char._len_bit = char._cur + 8*l
if char._len_bit > clen:
raise(EltErr('{0} [_from_char]: bit length overflow'.format(self._name)))
if l == 1:
for b in self[8:16]:
b.set_trans(True)
@ -2758,6 +2760,8 @@ class ProtConfigElt(Envelope):
cont = self._ContLUT[ident]('Cont')
ccur, clen = char._cur, char._len_bit
char._len_bit = ccur + 8*self[1].get_val()
if char._len_bit > clen:
raise(EltErr('{0} [_from_char]: bit length overflow'.format(self._name)))
try:
cont._from_char(char)
except Exception:
@ -3324,93 +3328,6 @@ class _CompTrafficClass(Envelope):
Uint8('Mask')
)
'''
class TFTPktFilterComp(Envelope):
_ValueLUT = {
16 : _CompIPv4('IPv4'),
17 : _CompIPv4('IPv4'),
32 : _CompIPv6('IPv6'),
33 : _CompIPv6Pref('IPv6Pref'),
35 : _CompIPv6Pref('IPv6Pref'),
48 : Uint8('ProtId'),
64 : Uint16('Port'),
65 : _CompPortRange('PortRange'),
80 : Uint16('Port'),
81 : _CompPortRange('PortRange'),
96 : Uint32('IPsecSPI'),
112 : _CompTrafficClass('TrafficClass'),
128 : Uint24('FlowLabel')
}
_GEN = (
Uint8('Type', dic=_PktFilterCompType_dict),
Buf('Value', val=b'', rep=REPR_HEX)
)
def set_val(self, vals):
if isinstance(vals, (tuple, list)) and len(vals) > 1 and \
vals[0] in self._ValueLUT and not isinstance(vals[1], bytes_types):
# replace Buf with the specific structure
self.replace(self[1], self._ValueLUT[vals[0]].clone())
elif isinstance(vals, dict) and 'Type' in vals and 'Value' in vals and \
vals['Type'] in self._ValueLUT and not isinstance(vals['Value'], bytes_types):
# replace Buf with the specific structure
self.replace(self[1], self._ValueLUT[vals[0]].clone())
Envelope.set_val(self, vals)
def _from_char(self, char):
self[0]._from_char(char)
t = self[0]()
if t in self._ValueLUT:
self.replace(self[1], self._ValueLUT[t].clone())
self[1]._from_char(char)
class TFTPktFilter(Envelope):
_Cont = Sequence('Cont', GEN=TFTPktFilterComp())
_GEN = (
Uint('spare', bl=2),
Uint('Dir', bl=2, dic=_PktFilterDir_dict),
Uint('Id', bl=4),
Uint8('Precedence'),
Uint8('Len'),
Buf('Cont', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self._Cont = self.__class__._Cont.clone()
self[4].set_valauto(lambda: self[5].get_len())
self[5].set_blauto(lambda: 8*self[4]())
def set_val(self, vals):
if isinstance(vals, (tuple, list)) and len(vals) > 5 and \
not isinstance(vals[5], bytes_types):
# replace Cont with the specific structure
self.replace(self[5], self._Cont)
elif isinstance(vals, dict) and 'Cont' in vals and \
not isinstance(vals['Cont'], bytes_types):
# replace Cont with the specific structure
self.replace(self[5], self._Cont)
Envelope.set_val(self, vals)
def _from_char(self, char):
Envelope._from_char(self, char)
# saves char settings
ccur, clen, cont_bl = char._cur, char._len_bit, self[5].get_bl()
# rewind it to parse again with a sequence of TFTPktFilterComp()
char._len_bit = char._cur
char._cur -= cont_bl
try:
self._Cont._from_char(char)
except Exception:
char._cur, char._len_bit = ccur, clen
else:
if char._cur == ccur:
self.replace(self[5], self._Cont)
else:
char._cur = ccur
char._len_bit = clen
'''
class TFTPktFilterComp(Envelope):
_GEN = (
@ -3448,19 +3365,7 @@ class TFTPktFilter(Envelope):
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Cont'].get_len())
def _from_char(self, char):
if self.get_trans():
return
self[0]._from_char(char)
self[1]._from_char(char)
self[2]._from_char(char)
self[3]._from_char(char)
self[4]._from_char(char)
char_lb = char._len_bit
char._len_bit = char._cur + (self[4].get_val()<<3)
self[5]._from_char(char)
char._len_bit = char_lb
self['Cont'].set_blauto(lambda: self['Len'].get_val()<<3)
class TFTParameter(Envelope):

View File

@ -1063,23 +1063,8 @@ class OperatorAccessCatDef(Envelope):
self['Len'].set_valauto(lambda: 3 + self['LenCriteria'].get_val() if self['StdAccessCat'].get_trans() \
else 4 + self['LenCriteria'].get_val())
self['LenCriteria'].set_valauto(lambda: self['Criteria'].get_len())
self['Criteria'].set_blauto(lambda: self['LenCriteria'].get_val()<<3)
self['StdAccessCat'].set_transauto(lambda: False if self['PSAC'].get_val() else True)
def _from_char(self, char):
if self.get_trans():
return
self[0]._from_char(char)
self[1]._from_char(char)
self[2]._from_char(char)
self[3]._from_char(char)
self[4]._from_char(char)
self[5]._from_char(char)
# truncate char according to LenCriteria
char_lb = char._len_bit
char._len_bit = char._cur + (self[5].get_val()<<3)
self[6]._from_char(char)
char._len_bit = char_lb
self[7]._from_char(char)
class OperatorAccessCatDefs(Sequence):
@ -1173,6 +1158,7 @@ class _PayContOpt(Envelope):
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self[1].set_valauto(lambda: self[2].get_len())
def _from_char(self, char):
if self.get_trans():
@ -1181,6 +1167,8 @@ class _PayContOpt(Envelope):
self[1]._from_char(char)
char_lb = char._len_bit
char._len_bit = char._cur + (self[1].get_val()<<3)
if char._len_bit > char_lb:
raise(EltErr('{0} [_from_char]: bit length overflow'.format(self._name)))
self[2]._from_char(char)
char._len_bit = char_lb
@ -1603,16 +1591,7 @@ class CAGInfo(Envelope):
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self[0].set_valauto(lambda: 3 + self[2].get_len())
def _from_char(self, char):
if self.get_trans():
return
self[0]._from_char(char)
self[1]._from_char(char)
char_lb = char._len_bit
char._len_bit = char._cur + ((self[0].get_val()-3)<<3)
self[2]._from_char(char)
char._len_bit = char_lb
self[2].set_blauto(lambda: (self[0].get_val()-3)<<3)
class CAGInfoList(Sequence):
@ -1899,6 +1878,8 @@ class EPSParam(Envelope):
self[1]._from_char(char)
char_lb = char._len_bit
char._len_bit = char._cur + (self[1].get_val()<<3)
if char._len_bit > char_lb:
raise(EltErr('{0} [_from_char]: bit length overflow'.format(self._name)))
self[2]._from_char(char)
char._len_bit = char_lb
@ -2248,19 +2229,8 @@ class PktFilterAdd(Envelope):
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['PktFilter'].get_len())
def _from_char(self, char):
if self.get_trans():
return
self[0]._from_char(char)
self[1]._from_char(char)
self[2]._from_char(char)
self[3]._from_char(char)
char_lb = char._len_bit
char._len_bit = char._cur + (self[3].get_val()<<3)
self[4]._from_char(char)
char._len_bit = char_lb
self[3].set_valauto(lambda: self[4].get_len())
self[4].set_blauto(lambda: self[3].get_val()<<3)
class QoSRule(Envelope):
@ -2302,6 +2272,8 @@ class QoSRule(Envelope):
self[1]._from_char(char)
char_lb = char._len_bit
char._len_bit = char._cur + (self[1].get_val()<<3)
if char._len_bit > char_lb:
raise(EltErr('{0} [_from_char]: bit length overflow'.format(self._name)))
self[2]._from_char(char)
self[3]._from_char(char)
self[4]._from_char(char)
@ -2312,6 +2284,7 @@ class QoSRule(Envelope):
if char.len_bit() >= 8:
self[7].set_trans(False)
self[7]._from_char(char)
char._len_bit = char_lb
class QoSRules(Sequence):