From 06aeab2d102d66bde73e17c9e80d195cea0a5f81 Mon Sep 17 00:00:00 2001 From: Splinter1984 Date: Sat, 21 Sep 2024 14:01:50 +0200 Subject: [PATCH 1/3] Fix payload_len calculation for `DataPacket`. Take into account size of `inlineQoS`. --- scapy/contrib/rtps/common_types.py | 3 +- test/contrib/rtps.uts | 100 +++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/scapy/contrib/rtps/common_types.py b/scapy/contrib/rtps/common_types.py index 38913eff0b8..82d56fda708 100644 --- a/scapy/contrib/rtps/common_types.py +++ b/scapy/contrib/rtps/common_types.py @@ -161,7 +161,8 @@ class SerializedDataField(StrLenField): class DataPacketField(EPacketField): def m2i(self, pkt, m): self.set_endianness(pkt) - pl_len = pkt.octetsToNextHeader - 24 + fld, val = pkt.getfield_and_val("inlineQoS") + pl_len = pkt.octetsToNextHeader - 24 - len(fld.i2m(pkt, val)) _pkt = self.cls( m, endianness=self.endianness, diff --git a/test/contrib/rtps.uts b/test/contrib/rtps.uts index 50bb4b33612..bd69b9262c4 100644 --- a/test/contrib/rtps.uts +++ b/test/contrib/rtps.uts @@ -476,3 +476,103 @@ p1 = RTPS( assert p0.build() == d assert p1.build() == d assert p0 == p1 + +p0 = RTPS( + protocolVersion=ProtocolVersionPacket(major=2, minor=2), + vendorId=VendorIdPacket(vendor_id=0x010f), + guidPrefix=GUIDPrefixPacket( + hostId=0x010f45d2, appId=0xb3f558b9, instanceId=0x01000000 + ),magic=b"RTPS" + )/RTPSMessage(submessages=[ + RTPSSubMessage_INFO_TS( + submessageId=9, + submessageFlags=1, + octetsToNextHeader=8, + ts_seconds=1638425814, + ts_fraction=2083784982, + ), + RTPSSubMessage_DATA( + submessageId= 0x15, + submessageFlags= 0x7, + octetsToNextHeader= 54, + extraFlags= 0x0, + octetsToInlineQoS= 16, + readerEntityIdKey= 0x0, + readerEntityIdKind= 0x0, + writerEntityIdKey= 0x0, + writerEntityIdKind= 0x0, + writerSeqNumHi= 0, + writerSeqNumLow= 4, + inlineQoS= InlineQoSPacket( + parameters= [ + PID_UNKNOWN( + parameterId= 0x801e, + parameterLength= 4, + parameterData= b'\x00\x00\x00\x00', + ), + ], + sentinel= PID_SENTINEL( + parameterId= 0x1, + parameterLength= 0, + parameterData= b'', + ), + ), + data= DataPacket( + encapsulationKind= 0x1, + encapsulationOptions= 0x3, + serializedData= b'=\x00\x00\x00abcdefghij\x00\x00\x00\x00', + ), + ), + RTPSSubMessage_INFO_TS( + submessageId=9, + submessageFlags=1, + octetsToNextHeader=8, + ts_seconds=1638425814, + ts_fraction=2083784982, + ), + RTPSSubMessage_DATA( + submessageId= 0x15, + submessageFlags= 0x7, + octetsToNextHeader= 54, + extraFlags= 0x0, + octetsToInlineQoS= 16, + readerEntityIdKey= 0x0, + readerEntityIdKind= 0x0, + writerEntityIdKey= 0x0, + writerEntityIdKind= 0x0, + writerSeqNumHi= 0, + writerSeqNumLow= 4, + inlineQoS= InlineQoSPacket( + parameters= [ + PID_UNKNOWN( + parameterId= 0x801e, + parameterLength= 4, + parameterData= b'\x00\x00\x00\x00', + ), + ], + sentinel= PID_SENTINEL( + parameterId= 0x1, + parameterLength= 0, + parameterData= b'', + ), + ), + data= DataPacket( + encapsulationKind= 0x1, + encapsulationOptions= 0x3, + serializedData= b'=\x00\x00\x00abcdefghij\x00\x00\x00\x00', + ), + ), +]) + +d = b"\x52\x54\x50\x53\x02\x02\x01\x0f\x01\x0f\x45\xd2\xb3\xf5\x58\xb9" \ + b"\x01\x00\x00\x00\x09\x01\x08\x00\xd6\x64\xa8\x61\x16\x09\x34\x7c" \ + b"\x15\x07\x36\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ + b"\x00\x00\x00\x00\x04\x00\x00\x00\x1e\x80\x04\x00\x00\x00\x00\x00" \ + b"\x01\x00\x00\x00\x00\x01\x00\x03\x3d\x00\x00\x00\x61\x62\x63\x64" \ + b"\x65\x66\x67\x68\x69\x6a\x00\x00\x00\x00\x09\x01\x08\x00\xd6\x64" \ + b"\xa8\x61\x16\x09\x34\x7c\x15\x07\x36\x00\x00\x00\x10\x00\x00\x00" \ + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e\x80" \ + b"\x04\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x03\x3d\x00" \ + b"\x00\x00\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x00\x00\x00\x00" + +assert RTPS(d) == p0 From 7dc1b3331dbe7577a289da49c21eb8602f5345ff Mon Sep 17 00:00:00 2001 From: Splinter1984 Date: Mon, 2 Dec 2024 15:52:19 +0100 Subject: [PATCH 2/3] Fix `BUILTIN_WRITER` `entity_key` for DataPacket. --- scapy/contrib/rtps/rtps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scapy/contrib/rtps/rtps.py b/scapy/contrib/rtps/rtps.py index 134ff7c7b5a..7a148d7a5f4 100644 --- a/scapy/contrib/rtps/rtps.py +++ b/scapy/contrib/rtps/rtps.py @@ -197,7 +197,7 @@ def __init__(self, *args, **kwargs): writer_entity_id_key = kwargs.pop("writer_entity_id_key", None) writer_entity_id_kind = kwargs.pop("writer_entity_id_kind", None) pl_len = kwargs.pop("pl_len", 0) - if writer_entity_id_key == 0x200 and writer_entity_id_kind == 0xC2: + if (writer_entity_id_key == 0x200 or writer_entity_id_key == 0x100) and writer_entity_id_kind == 0xC2: DataPacket._pl_type = "ParticipantMessageData" else: DataPacket._pl_type = "SerializedData" From 20e6eedec9fd6b80c5196f2881122eb62f6a50d1 Mon Sep 17 00:00:00 2001 From: Splinter1984 Date: Wed, 11 Dec 2024 16:00:39 +0100 Subject: [PATCH 3/3] Another fix. --- scapy/contrib/rtps/rtps.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scapy/contrib/rtps/rtps.py b/scapy/contrib/rtps/rtps.py index 7a148d7a5f4..cd5ffda0592 100644 --- a/scapy/contrib/rtps/rtps.py +++ b/scapy/contrib/rtps/rtps.py @@ -258,10 +258,11 @@ class RTPSSubMessage_DATA(EPacket): # fmt="4s", # enum=_rtps_reserved_entity_ids, # ), - EField(IntField("writerSeqNumHi", 0), - endianness_from=e_flags), - EField(IntField("writerSeqNumLow", 0), - endianness_from=e_flags), + EField(IntField("writerSeqNumber", 0), endianness_from=e_flags), + #EField(IntField("writerSeqNumHi", 0), + # endianness_from=e_flags), + #EField(IntField("writerSeqNumLow", 0), + # endianness_from=e_flags), # ------------------------------------- ConditionalField( InlineQoSPacketField("inlineQoS", "", InlineQoSPacket),