From 505314d2a253b49944ac95bc319b1f2ed86d5274 Mon Sep 17 00:00:00 2001 From: eProsima Date: Thu, 17 Oct 2024 16:24:49 +0200 Subject: [PATCH 1/3] Refs #21913: Add check in RTPSParticipant Signed-off-by: eProsima --- src/cpp/rtps/participant/RTPSParticipantImpl.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp index 4d2849a355..e2048aab62 100644 --- a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp +++ b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp @@ -492,15 +492,24 @@ bool RTPSParticipantImpl::setup_transports() transportDescriptor->unlock(); + auto shm_transport_descriptor = dynamic_cast(transportDescriptor.get()); if (transport_registered) { - has_shm_transport_ |= - (dynamic_cast(transportDescriptor.get()) != nullptr); + has_shm_transport_ |= (nullptr != shm_transport_descriptor); + if (nullptr != shm_transport_descriptor) + { + if (shm_transport_descriptor->max_message_size() > 572u) + { + EPROSIMA_LOG_ERROR(RTPS_PARTICIPANT, + "Unable to Register SHM Transport. Maximum message size needs to be" + "equal or higher than the PDP package size."); + } + } } else { // SHM transport could be disabled - if ((dynamic_cast(transportDescriptor.get()) != nullptr)) + if (nullptr != shm_transport_descriptor) { EPROSIMA_LOG_ERROR(RTPS_PARTICIPANT, "Unable to Register SHM Transport. SHM Transport is not supported in" From fbacf460e84df4f11df083538acefbb0a1358752 Mon Sep 17 00:00:00 2001 From: eProsima Date: Thu, 17 Oct 2024 17:28:28 +0200 Subject: [PATCH 2/3] Refs #21913: Revert SHM check Signed-off-by: eProsima --- src/cpp/rtps/participant/RTPSParticipantImpl.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp index e2048aab62..eb09d7f547 100644 --- a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp +++ b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp @@ -492,24 +492,15 @@ bool RTPSParticipantImpl::setup_transports() transportDescriptor->unlock(); - auto shm_transport_descriptor = dynamic_cast(transportDescriptor.get()); if (transport_registered) { - has_shm_transport_ |= (nullptr != shm_transport_descriptor); - if (nullptr != shm_transport_descriptor) - { - if (shm_transport_descriptor->max_message_size() > 572u) - { - EPROSIMA_LOG_ERROR(RTPS_PARTICIPANT, - "Unable to Register SHM Transport. Maximum message size needs to be" - "equal or higher than the PDP package size."); - } - } + has_shm_transport_ |= + (nullptr != dynamic_cast(transportDescriptor.get())); } else { // SHM transport could be disabled - if (nullptr != shm_transport_descriptor) + if (nullptr != dynamic_cast(transportDescriptor.get())) { EPROSIMA_LOG_ERROR(RTPS_PARTICIPANT, "Unable to Register SHM Transport. SHM Transport is not supported in" From 39e45ba31e746934af646c7cb4e49e5733123fe1 Mon Sep 17 00:00:00 2001 From: eProsima Date: Thu, 17 Oct 2024 17:28:59 +0200 Subject: [PATCH 3/3] Refs #21913: Add proper check with transport descriptor and util method Signed-off-by: eProsima --- .../rtps/participant/RTPSParticipantImpl.cpp | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp index eb09d7f547..5ffa8afee0 100644 --- a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp +++ b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp @@ -230,6 +230,25 @@ static bool get_unique_flows_parameters( return true; } +/** + * @brief This method checks if the maximum message size is equal or higher than the PDP package size. + * @return true if the maximum message size is equal or higher than the PDP package size, false otherwise. + */ +static bool is_max_message_size_big_enough( + const uint32_t max_message_size) +{ + constexpr uint32_t info_dst_message_length = 16; + constexpr uint32_t info_ts_message_length = 12; + uint32_t statistics_message_length = 0; +#ifdef FASTDDS_STATISTICS + statistics_message_length = eprosima::fastdds::statistics::rtps::statistics_submessage_length; +#endif // FASTDDS_STATISTICS + + return max_message_size >= + (RTPSMESSAGE_HEADER_SIZE + BUILTIN_DATA_MAX_SIZE + info_dst_message_length + + info_ts_message_length + statistics_message_length); +} + Locator_t& RTPSParticipantImpl::applyLocatorAdaptRule( Locator_t& loc) { @@ -490,6 +509,14 @@ bool RTPSParticipantImpl::setup_transports() socket_descriptor->netmask_filter = socket_descriptor_netmask_filter; } + if (!is_max_message_size_big_enough(transportDescriptor->max_message_size())) + { + EPROSIMA_LOG_ERROR(RTPS_PARTICIPANT, + "User transport failed to register. Maximum message size needs to be equal or higher than " + "the PDP package size."); + register_transport = false; + } + transportDescriptor->unlock(); if (transport_registered)