Skip to content

Commit dc266d5

Browse files
authored
RTPS: Fix payload_len calculation for DataPacket. (#4545)
Take into account size of `inlineQoS`.
1 parent ef72e1d commit dc266d5

File tree

3 files changed

+107
-3
lines changed

3 files changed

+107
-3
lines changed

scapy/contrib/rtps/common_types.py

Lines changed: 2 additions & 1 deletion
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 - fld.i2len(pkt, val)
165166
_pkt = self.cls(
166167
m,
167168
endianness=self.endianness,

scapy/contrib/rtps/rtps.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ def __init__(self, *args, **kwargs):
197197
writer_entity_id_key = kwargs.pop("writer_entity_id_key", None)
198198
writer_entity_id_kind = kwargs.pop("writer_entity_id_kind", None)
199199
pl_len = kwargs.pop("pl_len", 0)
200-
if writer_entity_id_key == 0x200 and writer_entity_id_kind == 0xC2:
200+
if (writer_entity_id_key == 0x200 or writer_entity_id_key == 0x100) and \
201+
writer_entity_id_kind == 0xC2:
201202
DataPacket._pl_type = "ParticipantMessageData"
202203
else:
203204
DataPacket._pl_type = "SerializedData"

test/contrib/rtps.uts

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ p1 = RTPS(
404404
)
405405
assert p0.build() == d
406406
assert p1.build() == d
407-
assert p1 == p0
408407

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

0 commit comments

Comments
 (0)