From 7017431b15325cea0a0ce5c0490c829817991f1d Mon Sep 17 00:00:00 2001 From: Old-Ding <35417409+Old-Ding@users.noreply.github.com> Date: Sat, 11 Jul 2026 00:51:49 +0800 Subject: [PATCH] Fix Zephyr discovery IPv4 conversion Copy discovery IPv4 address bytes into in_addr storage so Zephyr's minimal libc does not need to provide the optional in_addr_t typedef. Add a unit test for the address conversion. Signed-off-by: Old-Ding <35417409+Old-Ding@users.noreply.github.com> --- .../transport/udp_transport_datagram_posix.c | 2 +- .../udp_transport_datagram_posix_nopoll.c | 2 +- test/unitary/CMakeLists.txt | 2 ++ test/unitary/profile/DiscoveryTransport.cpp | 16 ++++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/unitary/profile/DiscoveryTransport.cpp diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_posix.c b/src/c/profile/discovery/transport/udp_transport_datagram_posix.c index 1b5313621..a0c3603a9 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_posix.c +++ b/src/c/profile/discovery/transport/udp_transport_datagram_posix.c @@ -84,7 +84,7 @@ void uxr_bytes_to_ip( char* ip) { struct in_addr addr; - addr.s_addr = (in_addr_t)(*bytes + (*(bytes + 1) << 8) + (*(bytes + 2) << 16) + (*(bytes + 3) << 24)); + memcpy(&addr.s_addr, bytes, sizeof(addr.s_addr)); char* internal_ip = inet_ntoa(addr); strcpy(ip, internal_ip); } diff --git a/src/c/profile/discovery/transport/udp_transport_datagram_posix_nopoll.c b/src/c/profile/discovery/transport/udp_transport_datagram_posix_nopoll.c index 667bf9916..2c6d65ed6 100644 --- a/src/c/profile/discovery/transport/udp_transport_datagram_posix_nopoll.c +++ b/src/c/profile/discovery/transport/udp_transport_datagram_posix_nopoll.c @@ -88,7 +88,7 @@ void uxr_bytes_to_ip( char* ip) { struct in_addr addr; - addr.s_addr = (in_addr_t)(*bytes + (*(bytes + 1) << 8) + (*(bytes + 2) << 16) + (*(bytes + 3) << 24)); + memcpy(&addr.s_addr, bytes, sizeof(addr.s_addr)); char* internal_ip = inet_ntoa(addr); strcpy(ip, internal_ip); } diff --git a/test/unitary/CMakeLists.txt b/test/unitary/CMakeLists.txt index 80619324b..9471308d9 100644 --- a/test/unitary/CMakeLists.txt +++ b/test/unitary/CMakeLists.txt @@ -89,4 +89,6 @@ unitary_test(SessionInfo session/SessionInfo.cpp) unitary_test(Session session/Session.cpp) unitary_test(WriteReadAccess session/WriteReadAccess.cpp) unitary_test(Utils session/Utils.cpp) +unitary_test(DiscoveryTransport profile/DiscoveryTransport.cpp) +target_link_libraries(DiscoveryTransport PRIVATE microxrcedds_client) diff --git a/test/unitary/profile/DiscoveryTransport.cpp b/test/unitary/profile/DiscoveryTransport.cpp new file mode 100644 index 000000000..b8719a288 --- /dev/null +++ b/test/unitary/profile/DiscoveryTransport.cpp @@ -0,0 +1,16 @@ +#include + +extern "C" +{ +#include +} + +TEST(DiscoveryTransportTest, ConvertsIpv4AddressBytes) +{ + const uint8_t address[] = {192, 168, 1, 42}; + char ip[16] = {}; + + uxr_bytes_to_ip(address, ip); + + EXPECT_STREQ("192.168.1.42", ip); +}