Skip to content

Commit c0193ed

Browse files
committed
Fix payload_len calculation for DataPacket.
Take into account size of `inlineQoS`.
1 parent 30b0398 commit c0193ed

File tree

2 files changed

+102
-1
lines changed

2 files changed

+102
-1
lines changed

scapy/contrib/rtps/common_types.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ class SerializedDataField(StrLenField):
161161
class DataPacketField(EPacketField):
162162
def m2i(self, pkt, m):
163163
self.set_endianness(pkt)
164-
pl_len = pkt.octetsToNextHeader - 24
164+
fld, val = pkt.getfield_and_val("inlineQoS")
165+
pl_len = pkt.octetsToNextHeader - 24 - len(fld.i2m(pkt, val))
165166
_pkt = self.cls(
166167
m,
167168
endianness=self.endianness,

test/contrib/rtps.uts

+100
Original file line numberDiff line numberDiff line change
@@ -476,3 +476,103 @@ p1 = RTPS(
476476
assert p0.build() == d
477477
assert p1.build() == d
478478
assert p0 == p1
479+
480+
p0 = RTPS(
481+
protocolVersion=ProtocolVersionPacket(major=2, minor=2),
482+
vendorId=VendorIdPacket(vendor_id=0x010f),
483+
guidPrefix=GUIDPrefixPacket(
484+
hostId=0x010f45d2, appId=0xb3f558b9, instanceId=0x01000000
485+
),magic=b"RTPS"
486+
)/RTPSMessage(submessages=[
487+
RTPSSubMessage_INFO_TS(
488+
submessageId=9,
489+
submessageFlags=1,
490+
octetsToNextHeader=8,
491+
ts_seconds=1638425814,
492+
ts_fraction=2083784982,
493+
),
494+
RTPSSubMessage_DATA(
495+
submessageId= 0x15,
496+
submessageFlags= 0x7,
497+
octetsToNextHeader= 54,
498+
extraFlags= 0x0,
499+
octetsToInlineQoS= 16,
500+
readerEntityIdKey= 0x0,
501+
readerEntityIdKind= 0x0,
502+
writerEntityIdKey= 0x0,
503+
writerEntityIdKind= 0x0,
504+
writerSeqNumHi= 0,
505+
writerSeqNumLow= 4,
506+
inlineQoS= InlineQoSPacket(
507+
parameters= [
508+
PID_UNKNOWN(
509+
parameterId= 0x801e,
510+
parameterLength= 4,
511+
parameterData= b'\x00\x00\x00\x00',
512+
),
513+
],
514+
sentinel= PID_SENTINEL(
515+
parameterId= 0x1,
516+
parameterLength= 0,
517+
parameterData= b'',
518+
),
519+
),
520+
data= DataPacket(
521+
encapsulationKind= 0x1,
522+
encapsulationOptions= 0x3,
523+
serializedData= b'=\x00\x00\x00abcdefghij\x00\x00\x00\x00',
524+
),
525+
),
526+
RTPSSubMessage_INFO_TS(
527+
submessageId=9,
528+
submessageFlags=1,
529+
octetsToNextHeader=8,
530+
ts_seconds=1638425814,
531+
ts_fraction=2083784982,
532+
),
533+
RTPSSubMessage_DATA(
534+
submessageId= 0x15,
535+
submessageFlags= 0x7,
536+
octetsToNextHeader= 54,
537+
extraFlags= 0x0,
538+
octetsToInlineQoS= 16,
539+
readerEntityIdKey= 0x0,
540+
readerEntityIdKind= 0x0,
541+
writerEntityIdKey= 0x0,
542+
writerEntityIdKind= 0x0,
543+
writerSeqNumHi= 0,
544+
writerSeqNumLow= 4,
545+
inlineQoS= InlineQoSPacket(
546+
parameters= [
547+
PID_UNKNOWN(
548+
parameterId= 0x801e,
549+
parameterLength= 4,
550+
parameterData= b'\x00\x00\x00\x00',
551+
),
552+
],
553+
sentinel= PID_SENTINEL(
554+
parameterId= 0x1,
555+
parameterLength= 0,
556+
parameterData= b'',
557+
),
558+
),
559+
data= DataPacket(
560+
encapsulationKind= 0x1,
561+
encapsulationOptions= 0x3,
562+
serializedData= b'=\x00\x00\x00abcdefghij\x00\x00\x00\x00',
563+
),
564+
),
565+
])
566+
567+
d = b"\x52\x54\x50\x53\x02\x02\x01\x0f\x01\x0f\x45\xd2\xb3\xf5\x58\xb9" \
568+
b"\x01\x00\x00\x00\x09\x01\x08\x00\xd6\x64\xa8\x61\x16\x09\x34\x7c" \
569+
b"\x15\x07\x36\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
570+
b"\x00\x00\x00\x00\x04\x00\x00\x00\x1e\x80\x04\x00\x00\x00\x00\x00" \
571+
b"\x01\x00\x00\x00\x00\x01\x00\x03\x3d\x00\x00\x00\x61\x62\x63\x64" \
572+
b"\x65\x66\x67\x68\x69\x6a\x00\x00\x00\x00\x09\x01\x08\x00\xd6\x64" \
573+
b"\xa8\x61\x16\x09\x34\x7c\x15\x07\x36\x00\x00\x00\x10\x00\x00\x00" \
574+
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e\x80" \
575+
b"\x04\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x03\x3d\x00" \
576+
b"\x00\x00\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x00\x00\x00\x00"
577+
578+
assert RTPS(d) == p0

0 commit comments

Comments
 (0)