Skip to content

Commit

Permalink
Refs #20972. Applying changes on CreateInputChannelResource.
Browse files Browse the repository at this point in the history
Signed-off-by: Miguel Company <miguelcompany@eprosima.com>
  • Loading branch information
MiguelCompany committed May 9, 2024
1 parent 8bf50e5 commit ed848e9
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 20 deletions.
55 changes: 43 additions & 12 deletions src/cpp/rtps/transport/UDPTransportInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,35 @@ static uint32_t try_setting_send_buffer_size(
return minimum_buffer_value;
}

/**
* @brief Set the receive buffer size of the socket to the highest possible value the system allows.
*
* @param socket The socket on which to set the receive buffer size.
* @param initial_buffer_value The initial value to try to set.
* @param minimum_buffer_value The minimum value to set.
*
* @return The final value set.
*/
static uint32_t try_setting_receive_buffer_size(
asio::ip::udp::socket& socket,
uint32_t initial_buffer_value,
uint32_t minimum_buffer_value)
{
// Try to set the highest possible value the system allows
for (auto recv_size = initial_buffer_value; recv_size >= minimum_buffer_value; recv_size /= 2)
{
asio::error_code ec;
socket_base::receive_buffer_size option(static_cast<int32_t>(recv_size));
socket.set_option(option, ec);
if (!ec)
{
return recv_size;
}
}

return minimum_buffer_value;
}

void UDPTransportInterface::configure_send_buffer_size()
{
asio::error_code ec;
Expand Down Expand Up @@ -221,23 +250,14 @@ void UDPTransportInterface::configure_receive_buffer_size()
if (receive_buffer_size < minimum_socket_buffer)
{
receive_buffer_size = minimum_socket_buffer;
set_receive_buffer_size(receive_buffer_size);
}

// Try to set the highest possible value the system allows
for (; receive_buffer_size >= minimum_socket_buffer; receive_buffer_size /= 2)
{
socket_base::receive_buffer_size option(static_cast<int32_t>(receive_buffer_size));
socket.set_option(option, ec);
if (!ec)
{
set_receive_buffer_size(receive_buffer_size);
break;
}
}
receive_buffer_size = try_setting_receive_buffer_size(socket, receive_buffer_size, minimum_socket_buffer);
set_receive_buffer_size(receive_buffer_size);

// Keep final configuration value
mReceiveBufferSize = configuration()->receiveBufferSize;
mReceiveBufferSize = receive_buffer_size;

// Inform the user if the desired value could not be set
if (initial_value != 0 && mReceiveBufferSize != initial_value)
Expand Down Expand Up @@ -334,6 +354,17 @@ UDPChannelResource* UDPTransportInterface::CreateInputChannelResource(
{
eProsimaUDPSocket unicastSocket = OpenAndBindInputSocket(sInterface,
IPLocator::getPhysicalPort(locator), is_multicast);
if (mReceiveBufferSize != 0)
{
uint32_t configured_value;
configured_value = try_setting_receive_buffer_size(unicastSocket, mReceiveBufferSize, maxMsgSize);
if (configured_value != mReceiveBufferSize)
{
EPROSIMA_LOG_WARNING(RTPS_MSG_OUT, "UDPTransport receiveBufferSize could not be set to the desired value. "
<< "Using " << configured_value << " instead of " << mReceiveBufferSize);
}
}

UDPChannelResource* p_channel_resource = new UDPChannelResource(this, unicastSocket, maxMsgSize, locator,
sInterface, receiver, configuration()->get_thread_config_for_port(locator.port));
return p_channel_resource;
Expand Down
4 changes: 0 additions & 4 deletions src/cpp/rtps/transport/UDPv4Transport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,10 +393,6 @@ eProsimaUDPSocket UDPv4Transport::OpenAndBindInputSocket(
{
eProsimaUDPSocket socket = createUDPSocket(io_service_);
getSocketPtr(socket)->open(generate_protocol());
if (mReceiveBufferSize != 0)
{
getSocketPtr(socket)->set_option(socket_base::receive_buffer_size(mReceiveBufferSize));
}

if (is_multicast)
{
Expand Down
4 changes: 0 additions & 4 deletions src/cpp/rtps/transport/UDPv6Transport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,10 +394,6 @@ eProsimaUDPSocket UDPv6Transport::OpenAndBindInputSocket(
{
eProsimaUDPSocket socket = createUDPSocket(io_service_);
getSocketPtr(socket)->open(generate_protocol());
if (mReceiveBufferSize != 0)
{
getSocketPtr(socket)->set_option(socket_base::receive_buffer_size(mReceiveBufferSize));
}

if (is_multicast)
{
Expand Down

0 comments on commit ed848e9

Please sign in to comment.