diff --git a/scapy/contrib/isis.py b/scapy/contrib/isis.py index d277a27b568..6ed224835f0 100644 --- a/scapy/contrib/isis.py +++ b/scapy/contrib/isis.py @@ -350,7 +350,7 @@ class ISIS_UnreservedBandwidthSubTlv(ISIS_GenericSubTlv): class ISIS_TEDefaultMetricSubTlv(ISIS_GenericSubTlv): name = "TE Default Metric SubTLV" fields_desc = [ByteEnumField("type", 18, _isis_subtlv_names_1), - FieldLenField("len", None, length_of="temetric", adjust=lambda pkt, x:x - 1, fmt="B"), # noqa: E501 + FieldLenField("len", None, length_of="temetric", fmt="B"), ThreeBytesField("temetric", 1000)] diff --git a/scapy/fields.py b/scapy/fields.py index 23c8fa774c3..02ae4926b89 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -1072,6 +1072,7 @@ class ThreeBytesField(Field[int, int]): def __init__(self, name, default): # type: (str, int) -> None Field.__init__(self, name, default, "!I") + self.sz = 3 # emits/consumes 3 bytes; keep i2len consistent for FieldLenField def addfield(self, pkt, s, val): # type: (Packet, bytes, Optional[int]) -> bytes @@ -1092,6 +1093,7 @@ class LEThreeBytesField(ByteField): def __init__(self, name, default): # type: (str, Optional[int]) -> None Field.__init__(self, name, default, " bytes diff --git a/test/fields.uts b/test/fields.uts index 38263f2a49f..e2d1132d414 100644 --- a/test/fields.uts +++ b/test/fields.uts @@ -174,6 +174,18 @@ print(p.sprintf('%test1% %test2% %test3% %test4%')) assert p.sprintf('%test1% %test2% %test3% %test4%') == '0x123456 123456 0xfedbca 567890' assert repr(p.test1) == '1193046' +# i2len must match the 3 bytes actually emitted, so FieldLenField(length_of=) +# on a 3-byte field computes the right length. +for cls in [ThreeBytesField, X3BytesField, LEThreeBytesField, XLE3BytesField, OUIField]: + f = cls('x', 0) + assert f.i2len(None, 0x010203) == len(f.addfield(None, b'', 0x010203)) == 3, cls + +class ThreeBytesTLV(Packet): + fields_desc = [ FieldLenField('len', None, length_of='oui', fmt='B'), + OUIField('oui', 0x00000c) ] + +assert ThreeBytesTLV(raw(ThreeBytesTLV())).len == 3 + = NBytesField ~ field nbytesfield