From 76d557c0e21da43e8b44241e068809394db3e095 Mon Sep 17 00:00:00 2001 From: Miguel Company Date: Thu, 2 Jul 2026 12:04:03 +0200 Subject: [PATCH] Serialize encapsulation header on buffer aware topics (#891) * Serialize encapsulation when publishing Signed-off-by: Miguel Company * Read encapsulation when taking Signed-off-by: Miguel Company * Catch and log error when reading encapsulation header. Signed-off-by: Miguel Company * Fix typo Signed-off-by: Miguel Company * Fix linters Signed-off-by: Miguel Company --------- Signed-off-by: Miguel Company (cherry picked from commit 742f7135e1c35e11352f9be45ddb26f68db246dd) --- rmw_fastrtps_cpp/src/rmw_publish.cpp | 1 + rmw_fastrtps_cpp/src/rmw_take.cpp | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/rmw_fastrtps_cpp/src/rmw_publish.cpp b/rmw_fastrtps_cpp/src/rmw_publish.cpp index c4aa47ce1..7e334a033 100644 --- a/rmw_fastrtps_cpp/src/rmw_publish.cpp +++ b/rmw_fastrtps_cpp/src/rmw_publish.cpp @@ -182,6 +182,7 @@ publish_to_buffer_endpoints( fast_buffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::CdrVersion::XCDRv1); ser.set_encoding_flag(eprosima::fastcdr::EncodingAlgorithmFlag::PLAIN_CDR); + ser.serialize_encapsulation(); auto * backend_context = static_cast(info->serialization_context_); diff --git a/rmw_fastrtps_cpp/src/rmw_take.cpp b/rmw_fastrtps_cpp/src/rmw_take.cpp index 74cbb9313..af82350f4 100644 --- a/rmw_fastrtps_cpp/src/rmw_take.cpp +++ b/rmw_fastrtps_cpp/src/rmw_take.cpp @@ -137,9 +137,17 @@ take_buffer_aware( } eprosima::fastcdr::Cdr deser( - receive_buffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, - eprosima::fastcdr::CdrVersion::XCDRv1); - deser.set_encoding_flag(eprosima::fastcdr::EncodingAlgorithmFlag::PLAIN_CDR); + receive_buffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN); + try { + deser.read_encapsulation(); + } catch (...) { + RCUTILS_LOG_ERROR_ONCE_NAMED( + "rmw_fastrtps_cpp", + "Failed to read encapsulation in buffer-aware topic from publisher '%s': " + "Please ensure that the publisher is using the last version of rmw_fastrtps_cpp", + writer_hex.c_str()); + return RMW_RET_OK; + } auto * backend_context = static_cast(info->serialization_context_);