Skip to content

Commit fe10ea4

Browse files
authored
Fix XGETADDRINFO iteration address selection
1 parent a353ca0 commit fe10ea4

2 files changed

Lines changed: 73 additions & 2 deletions

File tree

app/src/sm_at_socket.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2211,13 +2211,13 @@ STATIC int handle_at_getaddrinfo(enum at_parser_cmd_type cmd_type, struct at_par
22112211
for (res = result; res != NULL; res = res->ai_next) {
22122212
if (res->ai_family == NRF_AF_INET) {
22132213
struct nrf_sockaddr_in *host =
2214-
(struct nrf_sockaddr_in *)result->ai_addr;
2214+
(struct nrf_sockaddr_in *)res->ai_addr;
22152215

22162216
nrf_inet_ntop(NRF_AF_INET, &host->sin_addr, hostname,
22172217
sizeof(hostname));
22182218
} else if (res->ai_family == NRF_AF_INET6) {
22192219
struct nrf_sockaddr_in6 *host =
2220-
(struct nrf_sockaddr_in6 *)result->ai_addr;
2220+
(struct nrf_sockaddr_in6 *)res->ai_addr;
22212221

22222222
nrf_inet_ntop(NRF_AF_INET6, &host->sin6_addr, hostname,
22232223
sizeof(hostname));

app/tests/at_socket/src/test_at_socket.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,6 +2544,21 @@ static const char *mock_nrf_inet_ntop_ipv6_callback(int af, const void *src, cha
25442544
return dst;
25452545
}
25462546

2547+
/* Helper callback for mocking nrf_inet_ntop with multiple IPv4 addresses */
2548+
static const char *mock_nrf_inet_ntop_ipv4_multi_callback(int af, const void *src, char *dst,
2549+
nrf_socklen_t size, int num_calls)
2550+
{
2551+
const struct nrf_in_addr *addr = src;
2552+
2553+
if (af == NRF_AF_INET && addr->s_addr == net_htonl(0xC0A80001)) {
2554+
strcpy(dst, "192.168.0.1");
2555+
} else if (af == NRF_AF_INET && addr->s_addr == net_htonl(0x0A000002)) {
2556+
strcpy(dst, "10.0.0.2");
2557+
}
2558+
2559+
return dst;
2560+
}
2561+
25472562
/* Helper callback for mocking successful nrf_getaddrinfo (IPv4) */
25482563
static int mock_nrf_getaddrinfo_ipv4_callback(const char *nodename, const char *servname,
25492564
const struct nrf_addrinfo *hints,
@@ -2571,6 +2586,41 @@ static int mock_nrf_getaddrinfo_ipv4_callback(const char *nodename, const char *
25712586
return 0;
25722587
}
25732588

2589+
/* Helper callback for mocking successful nrf_getaddrinfo (multiple IPv4 results) */
2590+
static int mock_nrf_getaddrinfo_ipv4_multi_callback(const char *nodename, const char *servname,
2591+
const struct nrf_addrinfo *hints,
2592+
struct nrf_addrinfo **res, int num_calls)
2593+
{
2594+
static struct {
2595+
struct nrf_addrinfo ai[2];
2596+
struct nrf_sockaddr_in sa[2];
2597+
} result;
2598+
2599+
memset(&result, 0, sizeof(result));
2600+
2601+
result.sa[0].sin_family = NRF_AF_INET;
2602+
result.sa[0].sin_addr.s_addr = net_htonl(0xC0A80001); /* 192.168.0.1 */
2603+
result.sa[1].sin_family = NRF_AF_INET;
2604+
result.sa[1].sin_addr.s_addr = net_htonl(0x0A000002); /* 10.0.0.2 */
2605+
2606+
result.ai[0].ai_family = NRF_AF_INET;
2607+
result.ai[0].ai_socktype = NRF_SOCK_STREAM;
2608+
result.ai[0].ai_protocol = NRF_IPPROTO_TCP;
2609+
result.ai[0].ai_addrlen = sizeof(result.sa[0]);
2610+
result.ai[0].ai_addr = (struct nrf_sockaddr *)&result.sa[0];
2611+
result.ai[0].ai_next = &result.ai[1];
2612+
2613+
result.ai[1].ai_family = NRF_AF_INET;
2614+
result.ai[1].ai_socktype = NRF_SOCK_STREAM;
2615+
result.ai[1].ai_protocol = NRF_IPPROTO_TCP;
2616+
result.ai[1].ai_addrlen = sizeof(result.sa[1]);
2617+
result.ai[1].ai_addr = (struct nrf_sockaddr *)&result.sa[1];
2618+
result.ai[1].ai_next = NULL;
2619+
2620+
*res = &result.ai[0];
2621+
return 0;
2622+
}
2623+
25742624
/* Helper callback for mocking successful nrf_getaddrinfo (IPv6) */
25752625
static int mock_nrf_getaddrinfo_ipv6_callback(const char *nodename, const char *servname,
25762626
const struct nrf_addrinfo *hints,
@@ -2626,6 +2676,27 @@ void test_xgetaddrinfo_ipv4(void)
26262676
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
26272677
}
26282678

2679+
/*
2680+
* Test: Resolve hostname via AT#XGETADDRINFO command with multiple IPv4 results
2681+
* - Command: AT#XGETADDRINFO="hostname"
2682+
* - Tests: Iteration uses each addrinfo entry address
2683+
*/
2684+
void test_xgetaddrinfo_ipv4_multiple_results(void)
2685+
{
2686+
const char *response;
2687+
2688+
__cmock_nrf_getaddrinfo_Stub(mock_nrf_getaddrinfo_ipv4_multi_callback);
2689+
__cmock_nrf_inet_ntop_Stub(mock_nrf_inet_ntop_ipv4_multi_callback);
2690+
__cmock_nrf_freeaddrinfo_Expect(NULL);
2691+
__cmock_nrf_freeaddrinfo_IgnoreArg_ai();
2692+
2693+
send_at_command("AT#XGETADDRINFO=\"example.com\"\r\n");
2694+
2695+
response = get_captured_response();
2696+
TEST_ASSERT_TRUE(strstr(response, "#XGETADDRINFO: \"192.168.0.1 10.0.0.2\"") != NULL);
2697+
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
2698+
}
2699+
26292700
/*
26302701
* Test: Resolve hostname via AT#XGETADDRINFO command (IPv6)
26312702
* - Command: AT#XGETADDRINFO="hostname",2

0 commit comments

Comments
 (0)