Skip to content

Commit ab9ea1f

Browse files
geky0xc0170
authored andcommitted
Added support for multiple results in a dns-query
Internal API changes: + nsapi_dns_query_multiple Note, dns_query_multiple takes a buffer of nsapi_addr_t to fill. This is less dynamic than the linked-list method used in linux's gethostbyname, but is easier to manage and more constrained.
1 parent cc99870 commit ab9ea1f

File tree

1 file changed

+45
-12
lines changed

1 file changed

+45
-12
lines changed

features/net/network-socket/nsapi_dns.cpp

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "nsapi_dns.h"
1818
#include "network-socket/UDPSocket.h"
1919
#include <string.h>
20+
#include <stdlib.h>
2021

2122

2223
#define DNS_BUFFER_SIZE 256
@@ -88,7 +89,7 @@ static void dns_append_question(uint8_t **p, const char *host)
8889
dns_append_word(p, 1); // qclass = 1
8990
}
9091

91-
static bool dns_scan_response(const uint8_t **p, nsapi_addr_t *addr)
92+
static int dns_scan_response(const uint8_t **p, nsapi_addr_t *addr, unsigned addr_count)
9293
{
9394
// scan header
9495
uint16_t id = dns_scan_word(p);
@@ -104,7 +105,7 @@ static bool dns_scan_response(const uint8_t **p, nsapi_addr_t *addr)
104105

105106
// verify header is response to query
106107
if (!(id == 1 && qr && opcode == 0 && rcode == 0)) {
107-
return false;
108+
return 0;
108109
}
109110

110111
// skip questions
@@ -123,7 +124,9 @@ static bool dns_scan_response(const uint8_t **p, nsapi_addr_t *addr)
123124
}
124125

125126
// scan each response
126-
for (int i = 0; i < ancount; i++) {
127+
unsigned count = 0;
128+
129+
for (int i = 0; i < ancount && count < addr_count; i++) {
127130
while (true) {
128131
uint8_t len = dns_scan_byte(p);
129132
if (len == 0) {
@@ -152,14 +155,15 @@ static bool dns_scan_response(const uint8_t **p, nsapi_addr_t *addr)
152155
addr->bytes[i] = dns_scan_byte(p);
153156
}
154157

155-
return true;
158+
addr += 1;
159+
count += 1;
156160
}
157161

158-
return false;
162+
return count;
159163
}
160164

161-
162-
int nsapi_dns_query(NetworkStack *stack, nsapi_addr_t *addr, const char *host)
165+
// core query function
166+
int nsapi_dns_query_multiple(NetworkStack *stack, nsapi_addr_t *addr, unsigned addr_count, const char *host)
163167
{
164168
// check for valid host name
165169
int host_len = host ? strlen(host) : 0;
@@ -208,9 +212,9 @@ int nsapi_dns_query(NetworkStack *stack, nsapi_addr_t *addr, const char *host)
208212
}
209213

210214
p = packet;
211-
bool found = dns_scan_response((const uint8_t **)&p, addr);
215+
int found = dns_scan_response((const uint8_t **)&p, addr, addr_count);
212216
if (found) {
213-
result = 0;
217+
result = found;
214218
break;
215219
}
216220
}
@@ -228,16 +232,45 @@ int nsapi_dns_query(NetworkStack *stack, nsapi_addr_t *addr, const char *host)
228232
return result;
229233
}
230234

235+
// convenience functions for other forms of queries
236+
NSAPI_C_LINKAGE
237+
int nsapi_dns_query_multiple(nsapi_stack_t *stack, nsapi_addr_t *addr, unsigned addr_count, const char *host)
238+
{
239+
return nsapi_dns_query_multiple(nsapi_create_stack(stack), addr, addr_count, host);
240+
}
241+
242+
int nsapi_dns_query_multiple(NetworkStack *stack, SocketAddress *addresses, unsigned addr_count, const char *host)
243+
{
244+
nsapi_addr_t *addrs = new nsapi_addr_t[addr_count];
245+
int result = nsapi_dns_query_multiple(stack, addrs, addr_count, host);
246+
247+
if (result > 0) {
248+
for (int i = 0; i < result; i++) {
249+
addresses[i].set_addr(addrs[i]);
250+
}
251+
}
252+
253+
delete[] addrs;
254+
return result;
255+
}
256+
231257
NSAPI_C_LINKAGE
232258
int nsapi_dns_query(nsapi_stack_t *stack, nsapi_addr_t *addr, const char *host)
233259
{
234-
return nsapi_dns_query(nsapi_create_stack(stack), addr, host);
260+
int result = nsapi_dns_query_multiple(nsapi_create_stack(stack), addr, 1, host);
261+
return (result > 0) ? 0 : result;
262+
}
263+
264+
int nsapi_dns_query(NetworkStack *stack, nsapi_addr_t *addr, const char *host)
265+
{
266+
int result = nsapi_dns_query_multiple(stack, addr, 1, host);
267+
return (result > 0) ? 0 : result;
235268
}
236269

237270
int nsapi_dns_query(NetworkStack *stack, SocketAddress *address, const char *host)
238271
{
239272
nsapi_addr_t addr;
240-
int err = nsapi_dns_query(stack, &addr, host);
273+
int result = nsapi_dns_query_multiple(stack, &addr, 1, host);
241274
address->set_addr(addr);
242-
return err;
275+
return (result > 0) ? 0 : result;
243276
}

0 commit comments

Comments
 (0)