From f43e5961b31a607ff5e9af19f092f066db2364cf Mon Sep 17 00:00:00 2001 From: bjv-capra <80034183+bjv-capra@users.noreply.github.com> Date: Mon, 11 Oct 2021 10:05:03 +0200 Subject: [PATCH 1/9] Fixes memory leak due to not deleting freertos socket set (#270) Signed-off-by: Bart Jimenez Vera Signed-off-by: Patrick Roncagliolo --- .../transport/udp_transport_datagram_freertos_plus_tcp.c | 5 +++++ .../transport/ip/tcp/tcp_transport_freertos_plus_tcp.c | 5 +++++ .../transport/ip/udp/udp_transport_freertos_plus_tcp.c | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_freertos_plus_tcp.c b/src/c/profile/discovery/transport/udp_transport_datagram_freertos_plus_tcp.c index 989539581..339a3e396 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_freertos_plus_tcp.c +++ b/src/c/profile/discovery/transport/udp_transport_datagram_freertos_plus_tcp.c @@ -49,6 +49,11 @@ bool uxr_close_udp_transport_datagram( /* FreeRTOS_closesocket() always returns 0. */ (void) FreeRTOS_closesocket(transport->fd); + if (NULL != transport->poll_fd) + { + (void) FreeRTOS_DeleteSocketSet(transport->poll_fd); + } + return true; } diff --git a/src/c/profile/transport/ip/tcp/tcp_transport_freertos_plus_tcp.c b/src/c/profile/transport/ip/tcp/tcp_transport_freertos_plus_tcp.c index 598c85c0c..db3ad046d 100644 --- a/src/c/profile/transport/ip/tcp/tcp_transport_freertos_plus_tcp.c +++ b/src/c/profile/transport/ip/tcp/tcp_transport_freertos_plus_tcp.c @@ -76,6 +76,11 @@ bool uxr_close_tcp_platform( * FreeRTOS_closesocket() always returns 0. */ (void) FreeRTOS_closesocket(platform->fd); + if (NULL != platform->poll_fd) + { + (void) FreeRTOS_DeleteSocketSet(platform->poll_fd); + } + return true; } diff --git a/src/c/profile/transport/ip/udp/udp_transport_freertos_plus_tcp.c b/src/c/profile/transport/ip/udp/udp_transport_freertos_plus_tcp.c index 3facab1ea..d08f2dbed 100644 --- a/src/c/profile/transport/ip/udp/udp_transport_freertos_plus_tcp.c +++ b/src/c/profile/transport/ip/udp/udp_transport_freertos_plus_tcp.c @@ -61,6 +61,11 @@ bool uxr_close_udp_platform( /* FreeRTOS_closesocket() always returns 0. */ (void) FreeRTOS_closesocket(platform->fd); + if (NULL != platform->poll_fd) + { + (void) FreeRTOS_DeleteSocketSet(platform->poll_fd); + } + return true; } From b20b8cd612ddabe04e4a10c44d8e2ba113570de9 Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Tue, 19 Oct 2021 21:45:42 +0200 Subject: [PATCH 2/9] RTEMS support Add UCLIENT_PLATFORM_RTEMS_BSD_NET platform flag to use TCP/UDP implementation with only POSIX API and no poll() usage, to be able to compile against RTEMS 5.1 RTOS. Signed-off-by: Patrick Roncagliolo --- CMakeLists.txt | 12 ++ include/uxr/client/config.h.in | 1 + .../ip/tcp/tcp_transport_rtems_bsd_net.h | 40 +++++ .../ip/udp/udp_transport_rtems_bsd_net.h | 39 +++++ .../transport/serial/serial_transport_posix.h | 1 + include/uxr/client/transport.h | 4 + .../udp_transport_datagram_internal.h | 6 + .../udp_transport_datagram_rtems_bsd_net.c | 118 ++++++++++++++ src/c/profile/transport/ip/ip_posix.c | 3 +- src/c/profile/transport/ip/ip_rtems_bsd_net.c | 75 +++++++++ .../ip/tcp/tcp_transport_rtems_bsd_net.c | 146 ++++++++++++++++++ .../ip/udp/udp_transport_rtems_bsd_net.c | 123 +++++++++++++++ .../transport/serial/serial_transport_posix.c | 8 +- 13 files changed, 573 insertions(+), 3 deletions(-) create mode 100644 include/uxr/client/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.h create mode 100644 include/uxr/client/profile/transport/ip/udp/udp_transport_rtems_bsd_net.h create mode 100644 src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c create mode 100644 src/c/profile/transport/ip/ip_rtems_bsd_net.c create mode 100644 src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c create mode 100644 src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3943b3858..621fccd65 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,6 +149,8 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Generic") set(UCLIENT_PLATFORM_POSIX_NOPOLL ON) elseif(PLATFORM_NAME STREQUAL "FreeRTOS_Plus_TCP") set(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP ON) + elseif(PLATFORM_NAME STREQUAL "RTEMS_BSD_NET") + set(UCLIENT_PLATFORM_RTEMS_BSD_NET ON) endif() endif() @@ -159,6 +161,8 @@ endif() # Transport sources. set(_transport_src) +set(UCLIENT_PLATFORM_RTEMS_BSD_NET ON) + if(UCLIENT_PROFILE_UDP) list(APPEND _transport_src src/c/profile/transport/ip/udp/udp_transport.c) if(UCLIENT_PLATFORM_POSIX) @@ -169,6 +173,8 @@ if(UCLIENT_PROFILE_UDP) list(APPEND _transport_src src/c/profile/transport/ip/udp/udp_transport_windows.c) elseif(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP) list(APPEND _transport_src src/c/profile/transport/ip/udp/udp_transport_freertos_plus_tcp.c) + elseif(UCLIENT_PLATFORM_RTEMS_BSD_NET) + list(APPEND _transport_src src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c) endif() endif() @@ -180,6 +186,8 @@ if(UCLIENT_PROFILE_TCP) list(APPEND _transport_src src/c/profile/transport/ip/tcp/tcp_transport_windows.c) elseif(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP) list(APPEND _transport_src src/c/profile/transport/ip/tcp/tcp_transport_freertos_plus_tcp.c) + elseif(UCLIENT_PLATFORM_RTEMS_BSD_NET) + list(APPEND _transport_src src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c) endif() endif() @@ -204,6 +212,8 @@ if(UCLIENT_PROFILE_DISCOVERY OR UCLIENT_PROFILE_UDP OR UCLIENT_PROFILE_TCP) list(APPEND _transport_src src/c/profile/transport/ip/ip_windows.c) elseif(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP) list(APPEND _transport_src src/c/profile/transport/ip/ip_freertos_plus_tcp.c) + elseif(UCLIENT_PLATFORM_RTEMS_BSD_NET) + list(APPEND _transport_src src/c/profile/transport/ip/ip_rtems_bsd_net.c) endif() endif() @@ -218,6 +228,8 @@ if(UCLIENT_PROFILE_DISCOVERY) list(APPEND _transport_src src/c/profile/discovery/transport/udp_transport_datagram_windows.c) elseif(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP) list(APPEND _transport_src src/c/profile/discovery/transport/udp_transport_datagram_freertos_plus_tcp.c) + elseif(UCLIENT_PLATFORM_RTEMS_BSD_NET) + list(APPEND _transport_src src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c) endif() endif() diff --git a/include/uxr/client/config.h.in b/include/uxr/client/config.h.in index c2ef01942..593cbd3fa 100644 --- a/include/uxr/client/config.h.in +++ b/include/uxr/client/config.h.in @@ -34,6 +34,7 @@ #cmakedefine UCLIENT_PLATFORM_POSIX_NOPOLL #cmakedefine UCLIENT_PLATFORM_WINDOWS #cmakedefine UCLIENT_PLATFORM_FREERTOS_PLUS_TCP +#cmakedefine UCLIENT_PLATFORM_RTEMS_BSD_NET #cmakedefine UCLIENT_PLATFORM_ZEPHYR #define UXR_CONFIG_MAX_OUTPUT_BEST_EFFORT_STREAMS @UCLIENT_MAX_OUTPUT_BEST_EFFORT_STREAMS@ diff --git a/include/uxr/client/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.h b/include/uxr/client/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.h new file mode 100644 index 000000000..24a6a47f8 --- /dev/null +++ b/include/uxr/client/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.h @@ -0,0 +1,40 @@ +// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef _UXR_CLIENT_TCP_TRANSPORT_RTEMS_H_ +#define _UXR_CLIENT_TCP_TRANSPORT_RTEMS_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif // ifdef __cplusplus + +#include "arpa/inet.h" +#include "sys/socket.h" +#include "sys/select.h" +#include "netinet/in.h" + + +typedef struct uxrTCPPlatform +{ + struct sockaddr_in remote_addr; + struct fd_set select_fd; + int fd; +} uxrTCPPlatform; + +#ifdef __cplusplus +} +#endif // ifdef __cplusplus + +#endif //_UXR_CLIENT_TCP_TRANSPORT_RTEMS_H_ diff --git a/include/uxr/client/profile/transport/ip/udp/udp_transport_rtems_bsd_net.h b/include/uxr/client/profile/transport/ip/udp/udp_transport_rtems_bsd_net.h new file mode 100644 index 000000000..19a3270aa --- /dev/null +++ b/include/uxr/client/profile/transport/ip/udp/udp_transport_rtems_bsd_net.h @@ -0,0 +1,39 @@ +// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef _UXR_CLIENT_UDP_TRANSPORT_RTEMS_H_ +#define _UXR_CLIENT_UDP_TRANSPORT_RTEMS_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif // ifdef __cplusplus + +#include "arpa/inet.h" +#include "sys/socket.h" +#include "sys/select.h" +#include "netinet/in.h" + +typedef struct uxrUDPPlatform +{ + struct sockaddr_in remote_addr; + struct fd_set select_fd; + int fd; +} uxrUDPPlatform; + +#ifdef __cplusplus +} +#endif // ifdef __cplusplus + +#endif //_UXR_CLIENT_UDP_TRANSPORT_RTEMS_H_ diff --git a/include/uxr/client/profile/transport/serial/serial_transport_posix.h b/include/uxr/client/profile/transport/serial/serial_transport_posix.h index 55eba063b..dbccd1763 100644 --- a/include/uxr/client/profile/transport/serial/serial_transport_posix.h +++ b/include/uxr/client/profile/transport/serial/serial_transport_posix.h @@ -21,6 +21,7 @@ extern "C" #endif // ifdef __cplusplus #include +#include typedef struct uxrSerialPlatform { diff --git a/include/uxr/client/transport.h b/include/uxr/client/transport.h index 06f977b74..7d65c022c 100644 --- a/include/uxr/client/transport.h +++ b/include/uxr/client/transport.h @@ -26,6 +26,8 @@ #include #elif defined(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP) #include +#elif defined(UCLIENT_PLATFORM_RTEMS_BSD_NET) +#include #endif // if defined(UCLIENT_EXTERNAL_UDP) #include #endif //UCLIENT_PROFILE_UDP @@ -35,6 +37,8 @@ #include #elif defined(UCLIENT_PLATFORM_WINDOWS) #include +#elif defined(UCLIENT_PLATFORM_RTEMS_BSD_NET) +#include #endif // if defined(UCLIENT_EXTERNAL_TCP) #include #endif //UCLIENT_PROFILE_TCP diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_internal.h b/src/c/profile/discovery/transport/udp_transport_datagram_internal.h index 5497c67de..50dc64d6e 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_internal.h +++ b/src/c/profile/discovery/transport/udp_transport_datagram_internal.h @@ -39,6 +39,9 @@ extern "C" #include "list.h" #include "FreeRTOS_IP.h" #include "FreeRTOS_Sockets.h" +#elif defined(UCLIENT_PLATFORM_RTEMS_BSD_NET) +#include +#include #endif // if defined(UCLIENT_PLATFORM_POSIX) @@ -57,6 +60,9 @@ typedef struct uxrUDPTransportDatagram #elif defined(UCLIENT_PLATFORM_FREERTOS_PLUS_TCP) SocketSet_t poll_fd; Socket_t fd; +#elif defined(UCLIENT_PLATFORM_RTEMS_BSD_NET) + struct fd_set select_fd; + int fd; #endif // if defined(UCLIENT_PLATFORM_POSIX) } uxrUDPTransportDatagram; diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c new file mode 100644 index 000000000..c33d9bdec --- /dev/null +++ b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c @@ -0,0 +1,118 @@ +// Copyright 2018 eSOL Co.,Ltd. +// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "udp_transport_datagram_internal.h" +#include "arpa/inet.h" +#include "sys/socket.h" + +#include +#include +#include +#include + +bool uxr_init_udp_transport_datagram( + uxrUDPTransportDatagram* transport) +{ + bool rv = false; + + transport->fd = socket(AF_INET, SOCK_DGRAM, 0); + + if (-1 != transport->fd) + { + /* Poll setup. */ + FD_ZERO(&transport->select_fd); + FD_SET(transport->fd, &transport->select_fd); + rv = true; + } + + return rv; +} + +bool uxr_close_udp_transport_datagram( + uxrUDPTransportDatagram* transport) +{ + (void) close(transport->fd); + + return true; +} + +bool uxr_udp_send_datagram_to( + uxrUDPTransportDatagram* transport, + const uint8_t* buf, + size_t len, + const TransportLocator* locator) +{ + bool rv = true; + + struct sockaddr remote_addr; + memcpy(&remote_addr.sin_addr, &locator->_.medium_locator.address, sizeof(locator->_.medium_locator.address)); + if (0 != remote_addr.sin_addr) + { + remote_addr.sin_family = AF_INET; + remote_addr.sin_port = htons(locator->_.medium_locator.locator_port); + + int32_t bytes_sent = sendto(transport->fd, (void*)buf, len, 0, + (struct freertos_sockaddr*)&remote_addr, sizeof(remote_addr)); + + if (0 >= bytes_sent) + { + rv = false; + } + } + + return rv; +} + +bool uxr_udp_recv_datagram( + uxrUDPTransportDatagram* transport, + uint8_t** buf, + size_t* len, + int timeout) +{ + bool rv = false; + + struct timeval tv; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000) *1000; + + + BaseType_t poll_rv = select(transport->fd+1, transport->poll_fd, NULL, NULL, &tv); + if (0 < poll_rv) + { + int32_t bytes_received = recvfrom(transport->fd, (void*)transport->buffer, sizeof(transport->buffer), + 0, NULL, NULL); + if (0 < bytes_received) + { + *len = (size_t)bytes_received; + *buf = transport->buffer; + rv = true; + } + } + else if (0 == poll_rv) + { + errno = ETIME; + } + + return rv; +} + +void uxr_bytes_to_ip( + const uint8_t* bytes, + char* ip) +{ + uint32_t addr; + addr = (uint32_t)(*bytes + (*(bytes + 1) << 8) + (*(bytes + 2) << 16) + (*(bytes + 3) << 24)); + inet_ntoa(addr, ip); +} diff --git a/src/c/profile/transport/ip/ip_posix.c b/src/c/profile/transport/ip/ip_posix.c index f310408c6..105a71098 100644 --- a/src/c/profile/transport/ip/ip_posix.c +++ b/src/c/profile/transport/ip/ip_posix.c @@ -15,9 +15,8 @@ #include #include -#if defined(UCLIENT_PLATFORM_POSIX) #include -#elif defined(UCLIENT_PLATFORM_POSIX_NOPOLL) +#if defined(UCLIENT_PLATFORM_POSIX_NOPOLL) #include #endif /* if defined(UCLIENT_PLATFORM_POSIX) */ diff --git a/src/c/profile/transport/ip/ip_rtems_bsd_net.c b/src/c/profile/transport/ip/ip_rtems_bsd_net.c new file mode 100644 index 000000000..ed281306d --- /dev/null +++ b/src/c/profile/transport/ip/ip_rtems_bsd_net.c @@ -0,0 +1,75 @@ +// Copyright 2017-present Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "sys/socket.h" +#include "arpa/inet.h" +#include +#include + +bool uxr_ip_to_locator( + char const* ip, + uint16_t port, + uxrIpProtocol ip_protocol, + TransportLocator* locator) +{ + bool result = false; + switch (ip_protocol) + { + case UXR_IPv4: + locator->format = ADDRESS_FORMAT_MEDIUM; + locator->_.medium_locator.locator_port = port; + uint32_t addr = inet_addr(ip); + memcpy(&locator->_.medium_locator.address, &addr, sizeof(locator->_.medium_locator.address)); + result = locator->_.medium_locator.address != 0; + break; + case UXR_IPv6: + break; + default: + break; + } + return result; +} + +bool uxr_locator_to_ip( + TransportLocator const* locator, + char* ip, + size_t size, + uint16_t* port, + uxrIpProtocol* ip_protocol) +{ + bool result = false; + (void)size; + switch (locator->format) + { + case ADDRESS_FORMAT_MEDIUM: + *port = locator->_.medium_locator.locator_port; + *ip_protocol = UXR_IPv4; + struct in_addr saddr; + uint32_t addr; + memcpy(&addr, &locator->_.medium_locator.address, sizeof(locator->_.medium_locator.address)); + saddr.s_addr = addr; + char* res = inet_ntoa(saddr); + strncpy(ip, res, 16); // 16 == MAX_IP_LEN + result = true; + break; + case ADDRESS_FORMAT_LARGE: + break; + default: + break; + } + return result; +} \ No newline at end of file diff --git a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c new file mode 100644 index 000000000..ab23a74b5 --- /dev/null +++ b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c @@ -0,0 +1,146 @@ +// Copyright 2018 eSOL Co.,Ltd. +// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include "tcp_transport_internal.h" + +#include +#include +#include +#include + +bool uxr_init_tcp_platform( + struct uxrTCPPlatform* platform, + uxrIpProtocol ip_protocol, + const char* ip, + const char* port) +{ + bool rv = false; + uint16_t iport; + + (void) ip_protocol; + iport = (uint16_t)atoi(port); + + /* Socket initialization. */ + platform->fd = socket(AF_INET, SOCK_STREAM, 0); + if (-1 != platform->fd) + { + /* Remote IP setup. */ + platform->remote_addr.sin_family = AF_INET; + platform->remote_addr.sin_port = htons(iport); + platform->remote_addr.sin_addr.s_addr = inet_addr(ip); + + /* Poll setup. */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + FD_ZERO(&platform->select_fd); + FD_SET(platform->fd, &platform->select_fd); + #pragma GCC diagnostic pop + rv = true; + + /* Server connection. */ + if (rv) + { + int connected = connect(platform->fd, + (struct sockaddr *)&platform->remote_addr, + sizeof(platform->remote_addr)); + rv = (0 == connected); + } + else + { + rv = false; + } + } + + return rv; +} + +bool uxr_close_tcp_platform( + struct uxrTCPPlatform* platform) +{ + (void) shutdown(platform->fd, SHUT_RDWR); + + (void) close(platform->fd); + + return true; +} + +size_t uxr_write_tcp_data_platform( + struct uxrTCPPlatform* platform, + const uint8_t* buf, + size_t len, + uint8_t* errcode) +{ + size_t rv = 0; + + int32_t bytes_sent = send(platform->fd, (void*)buf, len, 0); + + if (0 <= bytes_sent) + { + rv = (size_t)bytes_sent; + *errcode = 0; + } + else + { + *errcode = 1; + } + + return rv; +} + +size_t uxr_read_tcp_data_platform( + struct uxrTCPPlatform* platform, + uint8_t* buf, + size_t len, + int timeout, + uint8_t* errcode) +{ + size_t rv = 0; + + struct timeval tv; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000) *1000; + + int32_t poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); + if (0 < poll_rv) + { + int32_t bytes_received = recv(platform->fd, (void*)buf, len, 0); + if (0 <= bytes_received) + { + rv = (size_t)bytes_received; + *errcode = 0; + } + else + { + *errcode = 1; + } + } + else + { + *errcode = (0 == poll_rv) ? 0 : 1; + } + + return rv; +} + +void uxr_disconnect_tcp_platform( + struct uxrTCPPlatform* platform) +{ + (void) shutdown(platform->fd, SHUT_RDWR); + + (void) close(platform->fd); + platform->fd = -1; + FD_ZERO(&platform->select_fd); +} diff --git a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c new file mode 100644 index 000000000..638fff1bc --- /dev/null +++ b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c @@ -0,0 +1,123 @@ +// Copyright 2018 eSOL Co.,Ltd. +// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include "udp_transport_internal.h" +#include "sys/socket.h" + +#include +#include +#include +#include + +bool uxr_init_udp_platform( + uxrUDPPlatform* platform, + uxrIpProtocol ip_protocol, + const char* ip, + const char* port) +{ + bool rv = false; + uint16_t iport; + + (void) ip_protocol; + iport = (uint16_t)atoi(port); + + /* Socket initialization */ + platform->fd = socket(AF_INET, SOCK_DGRAM, 0); + if (platform->fd != -1) + { + /* Remote IP setup. */ + platform->remote_addr.sin_family = AF_INET; + platform->remote_addr.sin_port = htons(iport); + platform->remote_addr.sin_addr.s_addr = inet_addr(ip); + + /* Poll setup. */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + FD_ZERO(&platform->select_fd); + FD_SET(platform->fd, &platform->select_fd); + #pragma GCC diagnostic pop + rv = true; + + } + + return rv; +} + +bool uxr_close_udp_platform( + uxrUDPPlatform* platform) +{ + (void) close(platform->fd); + return true; +} + +size_t uxr_write_udp_data_platform( + uxrUDPPlatform* platform, + const uint8_t* buf, + size_t len, + uint8_t* errcode) +{ + size_t rv = 0; + + int32_t bytes_sent = sendto(platform->fd, (const void*)buf, len, 0, + (struct sockaddr *)&platform->remote_addr, sizeof(platform->remote_addr)); + + if (0 < bytes_sent) + { + rv = (size_t)bytes_sent; + *errcode = 0; + } + else + { + *errcode = 1; + } + + return rv; +} + +size_t uxr_read_udp_data_platform( + uxrUDPPlatform* platform, + uint8_t* buf, + size_t len, + int timeout, + uint8_t* errcode) +{ + size_t rv = 0; + + struct timeval tv; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000) *1000; + + int poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); + if (0 < poll_rv) + { + int32_t bytes_received = recvfrom(platform->fd, (void*)buf, len, 0, NULL, NULL); + if (0 <= bytes_received) + { + rv = (size_t)bytes_received; + *errcode = 0; + } + else + { + *errcode = 1; + } + } + else + { + *errcode = (0 == poll_rv) ? 0 : 1; + } + + return rv; +} diff --git a/src/c/profile/transport/serial/serial_transport_posix.c b/src/c/profile/transport/serial/serial_transport_posix.c index 6e7e885cc..877ab15a7 100644 --- a/src/c/profile/transport/serial/serial_transport_posix.c +++ b/src/c/profile/transport/serial/serial_transport_posix.c @@ -61,7 +61,13 @@ size_t uxr_read_serial_data_platform( size_t rv = 0; struct uxrSerialPlatform* platform = (struct uxrSerialPlatform*) args; - int poll_rv = poll(&platform->poll_fd, 1, timeout); + fd_set fds; + FD_ZERO(&fds); + FD_SET(platform->poll_fd.fd, &fds); + struct timeval t_out = { 0, timeout*1000}; + int poll_rv = select(platform->poll_fd.fd+1, &fds, NULL, NULL, &t_out); + + //int poll_rv = poll(&platform->poll_fd, 1, timeout); if (0 < poll_rv) { ssize_t bytes_read = read(platform->poll_fd.fd, buf, len); From 7fe7719e504d06b6d0db9862accc0b081fc21d52 Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Wed, 20 Oct 2021 11:23:11 +0200 Subject: [PATCH 3/9] Add RTEMS discovery support Signed-off-by: Patrick Roncagliolo --- .../udp_transport_datagram_internal.h | 1 + .../udp_transport_datagram_rtems_bsd_net.c | 21 +++++++++++++------ src/c/profile/transport/ip/ip_rtems_bsd_net.c | 2 +- .../ip/udp/udp_transport_rtems_bsd_net.c | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_internal.h b/src/c/profile/discovery/transport/udp_transport_datagram_internal.h index 50dc64d6e..61ff34ab6 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_internal.h +++ b/src/c/profile/discovery/transport/udp_transport_datagram_internal.h @@ -41,6 +41,7 @@ extern "C" #include "FreeRTOS_Sockets.h" #elif defined(UCLIENT_PLATFORM_RTEMS_BSD_NET) #include +#include #include #endif // if defined(UCLIENT_PLATFORM_POSIX) diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c index c33d9bdec..55a274981 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c +++ b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c @@ -16,6 +16,7 @@ #include "udp_transport_datagram_internal.h" #include "arpa/inet.h" #include "sys/socket.h" +#include "netinet/in.h" #include #include @@ -32,8 +33,11 @@ bool uxr_init_udp_transport_datagram( if (-1 != transport->fd) { /* Poll setup. */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" FD_ZERO(&transport->select_fd); FD_SET(transport->fd, &transport->select_fd); + #pragma GCC diagnostic pop rv = true; } @@ -56,15 +60,15 @@ bool uxr_udp_send_datagram_to( { bool rv = true; - struct sockaddr remote_addr; - memcpy(&remote_addr.sin_addr, &locator->_.medium_locator.address, sizeof(locator->_.medium_locator.address)); - if (0 != remote_addr.sin_addr) + struct sockaddr_in remote_addr; + memcpy(&remote_addr.sin_addr.s_addr, &locator->_.medium_locator.address, sizeof(locator->_.medium_locator.address)); + if (0 != remote_addr.sin_addr.s_addr) { remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(locator->_.medium_locator.locator_port); int32_t bytes_sent = sendto(transport->fd, (void*)buf, len, 0, - (struct freertos_sockaddr*)&remote_addr, sizeof(remote_addr)); + (struct sockaddr*)&remote_addr, sizeof(remote_addr)); if (0 >= bytes_sent) { @@ -88,7 +92,7 @@ bool uxr_udp_recv_datagram( tv.tv_usec = (timeout%1000) *1000; - BaseType_t poll_rv = select(transport->fd+1, transport->poll_fd, NULL, NULL, &tv); + int32_t poll_rv = select(transport->fd+1, &transport->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { int32_t bytes_received = recvfrom(transport->fd, (void*)transport->buffer, sizeof(transport->buffer), @@ -114,5 +118,10 @@ void uxr_bytes_to_ip( { uint32_t addr; addr = (uint32_t)(*bytes + (*(bytes + 1) << 8) + (*(bytes + 2) << 16) + (*(bytes + 3) << 24)); - inet_ntoa(addr, ip); + struct in_addr saddr; + saddr.s_addr = addr; + char* res = inet_ntoa(saddr); + strncpy(ip, res, 16); // 16 == MAX_IPv4_LEN + + } diff --git a/src/c/profile/transport/ip/ip_rtems_bsd_net.c b/src/c/profile/transport/ip/ip_rtems_bsd_net.c index ed281306d..9fd00d2dd 100644 --- a/src/c/profile/transport/ip/ip_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/ip_rtems_bsd_net.c @@ -63,7 +63,7 @@ bool uxr_locator_to_ip( memcpy(&addr, &locator->_.medium_locator.address, sizeof(locator->_.medium_locator.address)); saddr.s_addr = addr; char* res = inet_ntoa(saddr); - strncpy(ip, res, 16); // 16 == MAX_IP_LEN + strncpy(ip, res, 16); // 16 == MAX_IPv4_LEN result = true; break; case ADDRESS_FORMAT_LARGE: diff --git a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c index 638fff1bc..5690d0e8e 100644 --- a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c @@ -100,7 +100,7 @@ size_t uxr_read_udp_data_platform( tv.tv_sec = timeout/1000; tv.tv_usec = (timeout%1000) *1000; - int poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); + int32_t poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { int32_t bytes_received = recvfrom(platform->fd, (void*)buf, len, 0, NULL, NULL); From 8ea7240d18ba5dae040049fe4289b1e518631d7e Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Sun, 14 Nov 2021 20:01:00 +0100 Subject: [PATCH 4/9] Fix FDSET issue Signed-off-by: Patrick Roncagliolo --- .../ip/tcp/tcp_transport_rtems_bsd_net.c | 21 ++++++++----------- .../ip/udp/udp_transport_rtems_bsd_net.c | 5 +++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c index ab23a74b5..a0e7528f2 100644 --- a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c @@ -51,19 +51,11 @@ bool uxr_init_tcp_platform( rv = true; /* Server connection. */ - if (rv) - { - int connected = connect(platform->fd, - (struct sockaddr *)&platform->remote_addr, - sizeof(platform->remote_addr)); - rv = (0 == connected); - } - else - { - rv = false; - } + int connected = connect(platform->fd, + (struct sockaddr *)&platform->remote_addr, + sizeof(platform->remote_addr)); + rv = (0 == connected); } - return rv; } @@ -113,6 +105,11 @@ size_t uxr_read_tcp_data_platform( tv.tv_sec = timeout/1000; tv.tv_usec = (timeout%1000) *1000; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + FD_ZERO(&platform->select_fd); + FD_SET(platform->fd, &platform->select_fd); + #pragma GCC diagnostic pop int32_t poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { diff --git a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c index 5690d0e8e..3f4634144 100644 --- a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c @@ -100,6 +100,11 @@ size_t uxr_read_udp_data_platform( tv.tv_sec = timeout/1000; tv.tv_usec = (timeout%1000) *1000; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + FD_ZERO(&platform->select_fd); + FD_SET(platform->fd, &platform->select_fd); + #pragma GCC diagnostic pop int32_t poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { From a8126de13f12cabb2750ee2f9ac30b5da503db8b Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Sun, 14 Nov 2021 20:21:30 +0100 Subject: [PATCH 5/9] Cleanup Signed-off-by: Patrick Roncagliolo --- .../profile/transport/serial/serial_transport_posix.h | 1 - src/c/profile/transport/serial/serial_transport_posix.c | 8 +------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/include/uxr/client/profile/transport/serial/serial_transport_posix.h b/include/uxr/client/profile/transport/serial/serial_transport_posix.h index dbccd1763..55eba063b 100644 --- a/include/uxr/client/profile/transport/serial/serial_transport_posix.h +++ b/include/uxr/client/profile/transport/serial/serial_transport_posix.h @@ -21,7 +21,6 @@ extern "C" #endif // ifdef __cplusplus #include -#include typedef struct uxrSerialPlatform { diff --git a/src/c/profile/transport/serial/serial_transport_posix.c b/src/c/profile/transport/serial/serial_transport_posix.c index 877ab15a7..6e7e885cc 100644 --- a/src/c/profile/transport/serial/serial_transport_posix.c +++ b/src/c/profile/transport/serial/serial_transport_posix.c @@ -61,13 +61,7 @@ size_t uxr_read_serial_data_platform( size_t rv = 0; struct uxrSerialPlatform* platform = (struct uxrSerialPlatform*) args; - fd_set fds; - FD_ZERO(&fds); - FD_SET(platform->poll_fd.fd, &fds); - struct timeval t_out = { 0, timeout*1000}; - int poll_rv = select(platform->poll_fd.fd+1, &fds, NULL, NULL, &t_out); - - //int poll_rv = poll(&platform->poll_fd, 1, timeout); + int poll_rv = poll(&platform->poll_fd, 1, timeout); if (0 < poll_rv) { ssize_t bytes_read = read(platform->poll_fd.fd, buf, len); From e31c74728820f9897f868c9ddcb5ca3a663448ce Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Sun, 14 Nov 2021 22:02:12 +0100 Subject: [PATCH 6/9] Uncrustify Signed-off-by: Patrick Roncagliolo --- .../transport/udp_transport_datagram_rtems_bsd_net.c | 8 ++++---- .../transport/ip/tcp/tcp_transport_rtems_bsd_net.c | 8 ++++---- .../transport/ip/udp/udp_transport_rtems_bsd_net.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c index 55a274981..95e8381bc 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c +++ b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c @@ -88,11 +88,11 @@ bool uxr_udp_recv_datagram( bool rv = false; struct timeval tv; - tv.tv_sec = timeout/1000; - tv.tv_usec = (timeout%1000) *1000; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; - int32_t poll_rv = select(transport->fd+1, &transport->select_fd, NULL, NULL, &tv); + int32_t poll_rv = select(transport->fd + 1, &transport->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { int32_t bytes_received = recvfrom(transport->fd, (void*)transport->buffer, sizeof(transport->buffer), @@ -122,6 +122,6 @@ void uxr_bytes_to_ip( saddr.s_addr = addr; char* res = inet_ntoa(saddr); strncpy(ip, res, 16); // 16 == MAX_IPv4_LEN - + } diff --git a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c index a0e7528f2..798d5ab0e 100644 --- a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c @@ -52,7 +52,7 @@ bool uxr_init_tcp_platform( /* Server connection. */ int connected = connect(platform->fd, - (struct sockaddr *)&platform->remote_addr, + (struct sockaddr*)&platform->remote_addr, sizeof(platform->remote_addr)); rv = (0 == connected); } @@ -102,15 +102,15 @@ size_t uxr_read_tcp_data_platform( size_t rv = 0; struct timeval tv; - tv.tv_sec = timeout/1000; - tv.tv_usec = (timeout%1000) *1000; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-conversion" FD_ZERO(&platform->select_fd); FD_SET(platform->fd, &platform->select_fd); #pragma GCC diagnostic pop - int32_t poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); + int32_t poll_rv = select(platform->fd + 1, &platform->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { int32_t bytes_received = recv(platform->fd, (void*)buf, len, 0); diff --git a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c index 3f4634144..68de73f55 100644 --- a/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/udp/udp_transport_rtems_bsd_net.c @@ -72,7 +72,7 @@ size_t uxr_write_udp_data_platform( size_t rv = 0; int32_t bytes_sent = sendto(platform->fd, (const void*)buf, len, 0, - (struct sockaddr *)&platform->remote_addr, sizeof(platform->remote_addr)); + (struct sockaddr*)&platform->remote_addr, sizeof(platform->remote_addr)); if (0 < bytes_sent) { @@ -97,15 +97,15 @@ size_t uxr_read_udp_data_platform( size_t rv = 0; struct timeval tv; - tv.tv_sec = timeout/1000; - tv.tv_usec = (timeout%1000) *1000; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-conversion" FD_ZERO(&platform->select_fd); FD_SET(platform->fd, &platform->select_fd); #pragma GCC diagnostic pop - int32_t poll_rv = select(platform->fd+1, &platform->select_fd, NULL, NULL, &tv); + int32_t poll_rv = select(platform->fd + 1, &platform->select_fd, NULL, NULL, &tv); if (0 < poll_rv) { int32_t bytes_received = recvfrom(platform->fd, (void*)buf, len, 0, NULL, NULL); From 48489e8ecc4ae750cad76ffa792867532240820a Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Mon, 15 Nov 2021 10:13:04 +0100 Subject: [PATCH 7/9] Update src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c Co-authored-by: Antonio Cuadros <49162117+Acuadros95@users.noreply.github.com> Signed-off-by: Patrick Roncagliolo --- src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c index 798d5ab0e..d146d4d70 100644 --- a/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c +++ b/src/c/profile/transport/ip/tcp/tcp_transport_rtems_bsd_net.c @@ -48,7 +48,6 @@ bool uxr_init_tcp_platform( FD_ZERO(&platform->select_fd); FD_SET(platform->fd, &platform->select_fd); #pragma GCC diagnostic pop - rv = true; /* Server connection. */ int connected = connect(platform->fd, From ac18bed965a8385939931798dbf0bfda0b4e7414 Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Mon, 15 Nov 2021 10:15:10 +0100 Subject: [PATCH 8/9] Update CMakeLists.txt Signed-off-by: Patrick Roncagliolo --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 621fccd65..6691bd131 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,8 +161,6 @@ endif() # Transport sources. set(_transport_src) -set(UCLIENT_PLATFORM_RTEMS_BSD_NET ON) - if(UCLIENT_PROFILE_UDP) list(APPEND _transport_src src/c/profile/transport/ip/udp/udp_transport.c) if(UCLIENT_PLATFORM_POSIX) From a9fb179cd1a2cff1899b1fcb08630337225cbd6d Mon Sep 17 00:00:00 2001 From: Patrick Roncagliolo Date: Mon, 15 Nov 2021 10:16:11 +0100 Subject: [PATCH 9/9] Update udp_transport_datagram_rtems_bsd_net.c Signed-off-by: Patrick Roncagliolo --- .../discovery/transport/udp_transport_datagram_rtems_bsd_net.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c index 95e8381bc..acfbc33f3 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c +++ b/src/c/profile/discovery/transport/udp_transport_datagram_rtems_bsd_net.c @@ -122,6 +122,4 @@ void uxr_bytes_to_ip( saddr.s_addr = addr; char* res = inet_ntoa(saddr); strncpy(ip, res, 16); // 16 == MAX_IPv4_LEN - - }