14#if PC_NEED_DNS_RESOLVER
19#include "lwip/ip_addr.h"
20#include "lwip/priv/tcpip_priv.h"
24pc_ip_class pc_dns_resolver_classify(uint32_t ip)
28 return pc_ip_class::PC_IP_UNSPECIFIED;
30 if (ip == 0xFFFFFFFFu)
32 return pc_ip_class::PC_IP_BROADCAST;
34 uint8_t a = (uint8_t)((ip >> 24) & 0xFF);
35 uint8_t b = (uint8_t)((ip >> 16) & 0xFF);
38 return pc_ip_class::PC_IP_LOOPBACK;
42 return pc_ip_class::PC_IP_PRIVATE;
44 if (a == 172 && b >= 16 && b <= 31)
46 return pc_ip_class::PC_IP_PRIVATE;
48 if (a == 192 && b == 168)
50 return pc_ip_class::PC_IP_PRIVATE;
52 if (a == 169 && b == 254)
54 return pc_ip_class::PC_IP_LINKLOCAL;
56 if (a >= 224 && a <= 239)
58 return pc_ip_class::PC_IP_MULTICAST;
60 return pc_ip_class::PC_IP_PUBLIC;
63bool pc_dns_resolver_verify(uint32_t ip)
65 switch (pc_dns_resolver_classify(ip))
67 case pc_ip_class::PC_IP_UNSPECIFIED:
68 case pc_ip_class::PC_IP_BROADCAST:
69 case pc_ip_class::PC_IP_LOOPBACK:
70 case pc_ip_class::PC_IP_MULTICAST:
88 volatile bool done =
false;
89 volatile bool ok =
false;
95 struct tcpip_api_call_data base;
99void dns_cb(
const char *name,
const ip_addr_t *addr,
void *arg)
111err_t do_dns(
struct tcpip_api_call_data *c)
113 const char *host = ((DnsCall *)c)->host;
114 err_t e = dns_gethostbyname(host, &s_dr.addr, dns_cb,
nullptr);
120 else if (e != ERR_INPROGRESS)
127uint32_t to_host_order(
const ip_addr_t *a)
129 return lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(a)));
133bool pc_dns_resolver_resolve(
const char *host, uint32_t *out_ip)
135 if (!host || !out_ip)
141 if (ipaddr_aton(host, &literal))
143 *out_ip = to_host_order(&literal);
150 memset(&k, 0,
sizeof(k));
152 tcpip_api_call(do_dns, &k.base);
155 while (!s_dr.done && (int32_t)(deadline -
pc_millis()) > 0)
164 *out_ip = to_host_order(&s_dr.addr);
180DnsTestCtx s_dns_test;
183void pc_dns_resolver_test_set_resolve(
bool ok, uint32_t ip)
188bool pc_dns_resolver_resolve(
const char *, uint32_t *out_ip)
196 *out_ip = s_dns_test.ip;
203bool pc_dns_resolver_resolve_verified(
const char *host, uint32_t *out_ip)
206 if (!pc_dns_resolver_resolve(host, &ip))
210 if (!pc_dns_resolver_verify(ip))
Pluggable monotonic clock for all library timing.
void pcdelay(uint32_t ms)
Block for at least ms milliseconds - the library's single delay primitive.
uint32_t pc_millis(void)
The library's monotonic time at 1000 Hz (milliseconds).
DNS resolver with answer verification (PC_ENABLE_DNS_RESOLVER).
#define PC_DNS_TIMEOUT_MS
DNS resolve timeout in milliseconds.