Skip to content

Commit afe8eec

Browse files
authored
Merge pull request #4139 from gpotter2/bitlenfield
Add BitLenEnumField
2 parents 2a4c4ae + 86a953b commit afe8eec

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

scapy/fields.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2427,7 +2427,7 @@ class BitField(_BitField[int]):
24272427
__doc__ = _BitField.__doc__
24282428

24292429

2430-
class BitFixedLenField(BitField):
2430+
class BitLenField(BitField):
24312431
__slots__ = ["length_from"]
24322432

24332433
def __init__(self,
@@ -2437,15 +2437,15 @@ def __init__(self,
24372437
):
24382438
# type: (...) -> None
24392439
self.length_from = length_from
2440-
super(BitFixedLenField, self).__init__(name, default, 0)
2440+
super(BitLenField, self).__init__(name, default, 0)
24412441

24422442
def getfield(self, # type: ignore
24432443
pkt, # type: Packet
24442444
s, # type: Union[Tuple[bytes, int], bytes]
24452445
):
24462446
# type: (...) -> Union[Tuple[Tuple[bytes, int], int], Tuple[bytes, int]] # noqa: E501
24472447
self.size = self.length_from(pkt)
2448-
return super(BitFixedLenField, self).getfield(pkt, s)
2448+
return super(BitLenField, self).getfield(pkt, s)
24492449

24502450
def addfield(self, # type: ignore
24512451
pkt, # type: Packet
@@ -2454,7 +2454,7 @@ def addfield(self, # type: ignore
24542454
):
24552455
# type: (...) -> Union[Tuple[bytes, int, int], bytes]
24562456
self.size = self.length_from(pkt)
2457-
return super(BitFixedLenField, self).addfield(pkt, s, val)
2457+
return super(BitLenField, self).addfield(pkt, s, val)
24582458

24592459

24602460
class BitFieldLenField(BitField):
@@ -2661,6 +2661,32 @@ def i2repr(self,
26612661
return _EnumField.i2repr(self, pkt, x)
26622662

26632663

2664+
class BitLenEnumField(BitLenField, _EnumField[int]):
2665+
__slots__ = EnumField.__slots__
2666+
2667+
def __init__(self,
2668+
name, # type: str
2669+
default, # type: Optional[int]
2670+
length_from, # type: Callable[[Packet], int]
2671+
enum, # type: Dict[int, str]
2672+
**kwargs, # type: Any
2673+
):
2674+
# type: (...) -> None
2675+
_EnumField.__init__(self, name, default, enum)
2676+
BitLenField.__init__(self, name, default, length_from, **kwargs)
2677+
2678+
def any2i(self, pkt, x):
2679+
# type: (Optional[Packet], Any) -> int
2680+
return _EnumField.any2i(self, pkt, x) # type: ignore
2681+
2682+
def i2repr(self,
2683+
pkt, # type: Optional[Packet]
2684+
x, # type: Union[List[int], int]
2685+
):
2686+
# type: (...) -> Any
2687+
return _EnumField.i2repr(self, pkt, x)
2688+
2689+
26642690
class ShortEnumField(EnumField[int]):
26652691
__slots__ = EnumField.__slots__
26662692

scapy/layers/sixlowpan.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
from scapy.fields import (
5959
BitEnumField,
6060
BitField,
61-
BitFixedLenField,
61+
BitLenField,
6262
BitScalingField,
6363
ByteEnumField,
6464
ByteField,
@@ -282,7 +282,7 @@ class LoWPAN_HC1(Packet):
282282
lambda pkt: pkt.nh == 1 and pkt.hc2
283283
),
284284
# Out of spec
285-
BitFixedLenField("pad", 0, _get_hc1_pad)
285+
BitLenField("pad", 0, _get_hc1_pad)
286286
]
287287

288288
def post_dissect(self, data):

test/fields.uts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,26 @@ p = TestBFLenF(b"\xff\x6fabcdeFGH")
336336
p
337337
assert p.len == 6 and p.str == b"abcde" and Raw in p and p[Raw].load == b"FGH"
338338

339+
= Test BitLenField
340+
~ field
341+
342+
SIZES = {0: 6, 1: 6, 2: 14, 3: 22}
343+
344+
class TestBitLenField(Packet):
345+
fields_desc = [
346+
BitField("mode", 0, 2),
347+
BitLenField("value", 0, length_from=lambda pkt: SIZES[pkt.mode])
348+
]
349+
350+
p = TestBitLenField(mode=1, value=50)
351+
assert bytes(p) == b"r"
352+
353+
p = TestBitLenField(mode=2, value=5000)
354+
assert bytes(p) == b'\x93\x88'
339355

356+
p = TestBitLenField(b'\xc0\x01\xf4')
357+
assert p.mode == 3
358+
assert p.value == 500
340359

341360
############
342361
############

0 commit comments

Comments
 (0)