Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scapy/contrib/isis.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)]


Expand Down
2 changes: 2 additions & 0 deletions scapy/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -1092,6 +1093,7 @@ class LEThreeBytesField(ByteField):
def __init__(self, name, default):
# type: (str, Optional[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
Expand Down
12 changes: 12 additions & 0 deletions test/fields.uts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading