Skip to content

Commit 9b577d8

Browse files
Add RMW TCP support (#167) (#168)
* Add RMW TCP support * Fix (cherry picked from commit 8769539) Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
1 parent a1b6a3a commit 9b577d8

8 files changed

Lines changed: 60 additions & 28 deletions

File tree

rmw_microxrcedds_c/CMakeLists.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ if(RMW_UXRCE_GRAPH)
4141
endif()
4242

4343
# --- RMW CONFIGURATION ---
44-
set(RMW_UXRCE_TRANSPORT "udp" CACHE STRING "Sets Micro XRCE-DDS transport to use. (udp | serial | custom)")
44+
set(RMW_UXRCE_TRANSPORT "udp" CACHE STRING "Sets Micro XRCE-DDS transport to use. (udp | tcp | serial | custom)")
4545
set(RMW_UXRCE_IPV "ipv4" CACHE STRING "Sets Micro XRCE-DDS IP version to use. (ipv4 | ipv6)")
4646
set(RMW_UXRCE_CREATION_MODE "xml" CACHE STRING "Sets creation mode in Micro XRCE-DDS. (xml | refs)")
4747
set(RMW_UXRCE_MAX_HISTORY "8" CACHE STRING "This value sets the number of history slots available for RMW subscriptions, requests and replies")
@@ -77,6 +77,7 @@ endif()
7777
# Transport handle define macros.
7878
set(RMW_UXRCE_TRANSPORT_SERIAL OFF)
7979
set(RMW_UXRCE_TRANSPORT_UDP OFF)
80+
set(RMW_UXRCE_TRANSPORT_TCP OFF)
8081
set(RMW_UXRCE_TRANSPORT_IPV4 OFF)
8182
set(RMW_UXRCE_TRANSPORT_IPV6 OFF)
8283
set(RMW_UXRCE_TRANSPORT_CUSTOM OFF)
@@ -93,6 +94,16 @@ elseif(${RMW_UXRCE_TRANSPORT} STREQUAL "udp")
9394
set(RMW_UXRCE_DEFAULT_UDP_IP "::1" CACHE STRING "Sets the agent IP address.")
9495
endif()
9596
set(RMW_UXRCE_DEFAULT_UDP_PORT "8888" CACHE STRING "Sets the agent IP port.")
97+
elseif(${RMW_UXRCE_TRANSPORT} STREQUAL "tcp")
98+
set(RMW_UXRCE_TRANSPORT_TCP ON)
99+
if(${RMW_UXRCE_IPV} STREQUAL "ipv4")
100+
set(RMW_UXRCE_TRANSPORT_IPV4 ON)
101+
set(RMW_UXRCE_DEFAULT_TCP_IP "127.0.0.1" CACHE STRING "Sets the agent IP address.")
102+
elseif(${RMW_UXRCE_IPV} STREQUAL "ipv6")
103+
set(RMW_UXRCE_TRANSPORT_IPV6 ON)
104+
set(RMW_UXRCE_DEFAULT_TCP_IP "::1" CACHE STRING "Sets the agent IP address.")
105+
endif()
106+
set(RMW_UXRCE_DEFAULT_TCP_PORT "8888" CACHE STRING "Sets the agent IP port.")
96107
elseif(${RMW_UXRCE_TRANSPORT} STREQUAL "custom")
97108
set(RMW_UXRCE_TRANSPORT_CUSTOM ON)
98109
else()
@@ -159,7 +170,7 @@ set(SRCS
159170
src/rmw_microros/time_sync.c
160171
src/rmw_microros/ping.c
161172
src/rmw_microros/timing.c
162-
$<$<BOOL:${RMW_UXRCE_TRANSPORT_UDP}>:src/rmw_microros/discovery.c>
173+
$<$<OR:$<BOOL:${RMW_UXRCE_TRANSPORT_UDP}>,$<BOOL:${RMW_UXRCE_TRANSPORT_TCP}>>:src/rmw_microros/discovery.c>
163174
$<$<BOOL:${RMW_UXRCE_TRANSPORT_CUSTOM}>:src/rmw_microros/custom_transport.c>
164175
$<$<BOOL:${RMW_UXRCE_GRAPH}>:src/rmw_graph.c>
165176
)

rmw_microxrcedds_c/include/rmw_microros/rmw_microros.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include <rmw_microros/time_sync.h>
2727
#include <rmw_microros/ping.h>
2828

29-
#ifdef RMW_UXRCE_TRANSPORT_UDP
29+
#if defined(RMW_UXRCE_TRANSPORT_UDP) || defined(RMW_UXRCE_TRANSPORT_TCP)
3030
#include <rmw_microros/discovery.h>
3131
#endif // RMW_UXRCE_TRANSPORT_UDP
3232

@@ -51,7 +51,7 @@ typedef struct rmw_uxrce_transport_params_t
5151
{
5252
#if defined(RMW_UXRCE_TRANSPORT_SERIAL)
5353
char serial_device[MAX_SERIAL_DEVICE];
54-
#elif defined(RMW_UXRCE_TRANSPORT_UDP)
54+
#elif defined(RMW_UXRCE_TRANSPORT_UDP) || defined(RMW_UXRCE_TRANSPORT_TCP)
5555
char agent_address[MAX_IP_LEN];
5656
char agent_port[MAX_PORT_LEN];
5757
#elif defined(RMW_UXRCE_TRANSPORT_CUSTOM)

rmw_microxrcedds_c/src/config.h.in

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <uxr/client/config.h>
55

66
#cmakedefine RMW_UXRCE_TRANSPORT_UDP
7+
#cmakedefine RMW_UXRCE_TRANSPORT_TCP
78
#cmakedefine RMW_UXRCE_TRANSPORT_SERIAL
89
#cmakedefine RMW_UXRCE_TRANSPORT_CUSTOM
910
#cmakedefine RMW_UXRCE_TRANSPORT_IPV4
@@ -14,8 +15,12 @@
1415

1516
#ifdef RMW_UXRCE_TRANSPORT_UDP
1617
#define RMW_UXRCE_MAX_TRANSPORT_MTU UXR_CONFIG_UDP_TRANSPORT_MTU
17-
#define RMW_UXRCE_DEFAULT_UDP_IP "@RMW_UXRCE_DEFAULT_UDP_IP@"
18-
#define RMW_UXRCE_DEFAULT_UDP_PORT "@RMW_UXRCE_DEFAULT_UDP_PORT@"
18+
#define RMW_UXRCE_DEFAULT_IP "@RMW_UXRCE_DEFAULT_UDP_IP@"
19+
#define RMW_UXRCE_DEFAULT_PORT "@RMW_UXRCE_DEFAULT_UDP_PORT@"
20+
#elif defined(RMW_UXRCE_TRANSPORT_TCP)
21+
#define RMW_UXRCE_MAX_TRANSPORT_MTU UXR_CONFIG_TCP_TRANSPORT_MTU
22+
#define RMW_UXRCE_DEFAULT_IP "@RMW_UXRCE_DEFAULT_TCP_IP@"
23+
#define RMW_UXRCE_DEFAULT_PORT "@RMW_UXRCE_DEFAULT_TCP_PORT@"
1924
#elif defined(RMW_UXRCE_TRANSPORT_SERIAL)
2025
#define RMW_UXRCE_MAX_TRANSPORT_MTU UXR_CONFIG_SERIAL_TRANSPORT_MTU
2126
#define RMW_UXRCE_DEFAULT_SERIAL_DEVICE "@RMW_UXRCE_DEFAULT_SERIAL_DEVICE@"

rmw_microxrcedds_c/src/rmw_init.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,22 @@ rmw_init_options_init(
6868
RMW_SET_ERROR_MSG("default serial port configuration overflow");
6969
return RMW_RET_INVALID_ARGUMENT;
7070
}
71-
#elif defined(RMW_UXRCE_TRANSPORT_UDP)
72-
if (strlen(RMW_UXRCE_DEFAULT_UDP_IP) <= MAX_IP_LEN) {
71+
#elif defined(RMW_UXRCE_TRANSPORT_UDP) || defined(RMW_UXRCE_TRANSPORT_TCP)
72+
if (strlen(RMW_UXRCE_DEFAULT_IP) <= MAX_IP_LEN) {
7373
snprintf(
7474
init_options->impl->transport_params.agent_address,
7575
MAX_IP_LEN,
7676
"%s",
77-
RMW_UXRCE_DEFAULT_UDP_IP);
77+
RMW_UXRCE_DEFAULT_IP);
7878
} else {
7979
RMW_SET_ERROR_MSG("default ip configuration overflow");
8080
return RMW_RET_INVALID_ARGUMENT;
8181
}
8282

83-
if (strlen(RMW_UXRCE_DEFAULT_UDP_PORT) <= MAX_PORT_LEN) {
83+
if (strlen(RMW_UXRCE_DEFAULT_PORT) <= MAX_PORT_LEN) {
8484
snprintf(
8585
init_options->impl->transport_params.agent_port,
86-
MAX_PORT_LEN, "%s", RMW_UXRCE_DEFAULT_UDP_PORT);
86+
MAX_PORT_LEN, "%s", RMW_UXRCE_DEFAULT_PORT);
8787
} else {
8888
RMW_SET_ERROR_MSG("default port configuration overflow");
8989
return RMW_RET_INVALID_ARGUMENT;

rmw_microxrcedds_c/src/rmw_microros/ping.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ rmw_ret_t rmw_uros_ping_agent(
3838
uxrSerialTransport transport;
3939
#elif defined(RMW_UXRCE_TRANSPORT_UDP)
4040
uxrUDPTransport transport;
41+
#elif defined(RMW_UXRCE_TRANSPORT_TCP)
42+
uxrTCPTransport transport;
4143
#elif defined(RMW_UXRCE_TRANSPORT_CUSTOM)
4244
uxrCustomTransport transport;
4345
transport.framing = rmw_uxrce_transport_default_params.framing;
@@ -79,6 +81,8 @@ rmw_ret_t rmw_uros_ping_agent_options(
7981
uxrSerialTransport transport;
8082
#elif defined(RMW_UXRCE_TRANSPORT_UDP)
8183
uxrUDPTransport transport;
84+
#elif defined(RMW_UXRCE_TRANSPORT_TCP)
85+
uxrTCPTransport transport;
8286
#elif defined(RMW_UXRCE_TRANSPORT_CUSTOM)
8387
uxrCustomTransport transport;
8488
transport.framing = rmw_options->impl->transport_params.framing;

rmw_microxrcedds_c/src/rmw_uxrce_transports.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extern rmw_uxrce_transport_params_t rmw_uxrce_transport_default_params;
2121
rmw_ret_t rmw_uxrce_transport_init(
2222
rmw_context_impl_t * context_impl,
2323
rmw_init_options_impl_t * init_options_impl,
24-
void * transport)
24+
void * override_transport)
2525
{
2626
#ifdef RMW_UXRCE_TRANSPORT_SERIAL
2727
const char * serial_device = (NULL == init_options_impl) ?
@@ -81,7 +81,7 @@ rmw_ret_t rmw_uxrce_transport_init(
8181
}
8282

8383
uxrSerialTransport * serial_transport = (NULL == context_impl) ?
84-
(uxrSerialTransport *)transport :
84+
(uxrSerialTransport *)override_transport :
8585
&context_impl->transport;
8686

8787
if (!uxr_init_serial_transport(serial_transport, fd, 0, 1)) {
@@ -92,30 +92,40 @@ rmw_ret_t rmw_uxrce_transport_init(
9292
RMW_SET_ERROR_MSG("rmw_transport_init SERIAL: invalid serial device file descriptor");
9393
return RMW_RET_ERROR;
9494
}
95-
#elif defined(RMW_UXRCE_TRANSPORT_UDP)
95+
#elif defined(RMW_UXRCE_TRANSPORT_UDP) || defined(RMW_UXRCE_TRANSPORT_TCP)
96+
const char * agent_ip = (NULL == init_options_impl) ?
97+
RMW_UXRCE_DEFAULT_IP :
98+
init_options_impl->transport_params.agent_address;
99+
const char * agent_port = (NULL == init_options_impl) ?
100+
RMW_UXRCE_DEFAULT_PORT :
101+
init_options_impl->transport_params.agent_port;
102+
96103
#ifdef RMW_UXRCE_TRANSPORT_IPV4
97104
uxrIpProtocol ip_protocol = UXR_IPv4;
98105
#elif defined(RMW_UXRCE_TRANSPORT_IPV6)
99106
uxrIpProtocol ip_protocol = UXR_IPv6;
100107
#endif /* ifdef RMW_UXRCE_TRANSPORT_IPV4 */
101108

102-
uxrUDPTransport * udp_transport = (NULL == context_impl) ?
103-
(uxrUDPTransport *)transport :
104-
&context_impl->transport;
105-
const char * agent_ip = (NULL == init_options_impl) ?
106-
RMW_UXRCE_DEFAULT_UDP_IP :
107-
init_options_impl->transport_params.agent_address;
108-
const char * agent_port = (NULL == init_options_impl) ?
109-
RMW_UXRCE_DEFAULT_UDP_PORT :
110-
init_options_impl->transport_params.agent_port;
109+
#ifdef RMW_UXRCE_TRANSPORT_UDP
110+
#define TRANSPORT_TYPE uxrUDPTransport
111+
#define TRANSPORT_INIT_FUNTION uxr_init_udp_transport
112+
#elif defined(RMW_UXRCE_TRANSPORT_TCP)
113+
#define TRANSPORT_TYPE uxrTCPTransport
114+
#define TRANSPORT_INIT_FUNTION uxr_init_tcp_transport
115+
#endif /* ifdef RMW_UXRCE_TRANSPORT_IPV4 */
116+
117+
TRANSPORT_TYPE * transport = (NULL == context_impl) ?
118+
(TRANSPORT_TYPE *)override_transport : &context_impl->transport;
111119

112-
if (!uxr_init_udp_transport(udp_transport, ip_protocol, agent_ip, agent_port)) {
113-
RMW_SET_ERROR_MSG("rmw_transport_init UDP: cannot init XRCE transport");
120+
if (!TRANSPORT_INIT_FUNTION(transport, ip_protocol, agent_ip, agent_port)) {
121+
RMW_SET_ERROR_MSG("rmw_transport_init UDP/TCP: cannot init XRCE transport");
114122
return RMW_RET_ERROR;
115123
}
124+
#undef TRANSPORT_TYPE
125+
#undef TRANSPORT_INIT_FUNTION
116126
#elif defined(RMW_UXRCE_TRANSPORT_CUSTOM)
117127
uxrCustomTransport * custom_transport = (NULL == context_impl) ?
118-
(uxrCustomTransport *)transport :
128+
(uxrCustomTransport *)override_transport :
119129
&context_impl->transport;
120130
void * args = (NULL == init_options_impl) ?
121131
rmw_uxrce_transport_default_params.args :

rmw_microxrcedds_c/src/rmw_uxrce_transports.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
* XRCE transport entity, if it has been initialized.
3737
* @param init_options Pointer to struct holding the provided init options for
3838
* micro-ROS.
39-
* @param transport Älternative opaque transport structure, which will
39+
* @param override_transport Alternative opaque transport structure, which will
4040
* must come as NULL and will be given as a handle to the user.
4141
* This structure is filled when the context_impl pointer is NULL.
4242
* Useful for some utilities, such as the "ping" functionality.
@@ -48,7 +48,7 @@
4848
rmw_ret_t rmw_uxrce_transport_init(
4949
rmw_context_impl_t * context,
5050
rmw_init_options_impl_t * init_options,
51-
void * transport);
51+
void * override_transport);
5252

5353
/**
5454
* @brief Helper macros for closing an open micro XRCE-DDS transport.

rmw_microxrcedds_c/src/types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ typedef struct rmw_context_impl_t
6464
uxrSerialTransport transport;
6565
#elif defined(RMW_UXRCE_TRANSPORT_UDP)
6666
uxrUDPTransport transport;
67+
#elif defined(RMW_UXRCE_TRANSPORT_TCP)
68+
uxrTCPTransport transport;
6769
#elif defined(RMW_UXRCE_TRANSPORT_CUSTOM)
6870
uxrCustomTransport transport;
6971
#endif // if defined(RMW_UXRCE_TRANSPORT_SERIAL)

0 commit comments

Comments
 (0)