Logo Pico-Framework A web-first embedded framework for C++
Loading...
Searching...
No Matches
lwip_dns_resolver.cpp
Go to the documentation of this file.
1#include "lwip/dns.h"
2#include "lwip/ip_addr.h"
3#include "lwip/err.h"
4#include "pico/time.h"
5#include <cstring>
6#include "framework_config.h"
7#include "DebugTrace.h"
8TRACE_INIT(LwipDnsResolver);
9
10static volatile bool dns_done = false;
11static ip_addr_t resolved_ip;
12
13static void dns_callback(const char* name, const ip_addr_t* ipaddr, void* callback_arg) {
14 if (ipaddr) {
15 resolved_ip = *ipaddr;
16 } else {
17 ip_addr_set_any(IPADDR_TYPE_V4, &resolved_ip);
18 }
19 dns_done = true;
20}
21
29bool resolveHostnameBlocking(const char* hostname, ip_addr_t* result, uint32_t timeout_ms = 5000) {
30
31 TRACE("[DNS] Starting DNS lookup for %s\n", hostname);
32
33 dns_done = false;
34 err_t err = dns_gethostbyname(hostname, &resolved_ip, dns_callback, nullptr);
35
36 if (err == ERR_OK) {
37 TRACE("[DNS] Hostname resolved immediately: %s -> %s\n", hostname, ipaddr_ntoa(&resolved_ip));
38 *result = resolved_ip;
39 return true;
40 } else if (err == ERR_INPROGRESS) {
41 TRACE("[DNS] Lookup in progress for %s, waiting...\n", hostname);
42 } else {
43 TRACE("[DNS] dns_gethostbyname failed with error %d\n", err);
44 return false;
45 }
46
47 // Wait for async resolution
48 absolute_time_t deadline = make_timeout_time_ms(timeout_ms);
49 while (!dns_done && absolute_time_diff_us(get_absolute_time(), deadline) > 0) {
50 sleep_ms(10);
51 }
52
53 if (dns_done && !ip_addr_isany(&resolved_ip)) {
54 TRACE("[DNS] DNS resolved after wait: %s -> %s\n", hostname, ipaddr_ntoa(&resolved_ip));
55 *result = resolved_ip;
56 return true;
57 } else {
58 printf("[DNS] DNS resolution timed out or returned null\n");
59 return false;
60 }
61}
62
Macro-based debug trace system with optional SD file logging.
#define TRACE_INIT(MODULE_NAME)
Declare trace usage in a source file for a given module.
Definition DebugTrace.h:170
#define TRACE(...)
Default trace (INFO level).
Definition DebugTrace.h:187
Delegates to user or system configuration.
static volatile bool dns_done
static ip_addr_t resolved_ip
static void dns_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
bool resolveHostnameBlocking(const char *hostname, ip_addr_t *result, uint32_t timeout_ms=5000)
Blocking DNS resolution using lwIP.