mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-11-06 17:41:39 +01:00
112 lines
3.1 KiB
C
112 lines
3.1 KiB
C
|
|
/*
|
||
|
|
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
|
||
|
|
*
|
||
|
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @file esp_dns_lwip.c
|
||
|
|
* @brief Custom DNS module for ESP32 with multiple protocol support
|
||
|
|
*
|
||
|
|
* Provides DNS resolution capabilities with support for various protocols:
|
||
|
|
* - Standard UDP/TCP DNS (Port 53)
|
||
|
|
* - DNS over TLS (DoT) (Port 853)
|
||
|
|
* - DNS over HTTPS (DoH) (Port 443)
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <string.h>
|
||
|
|
#include <stdbool.h>
|
||
|
|
#include <stdint.h>
|
||
|
|
|
||
|
|
#include "freertos/FreeRTOS.h"
|
||
|
|
#include "esp_log.h"
|
||
|
|
|
||
|
|
#include "esp_dns.h"
|
||
|
|
#include "esp_dns_priv.h"
|
||
|
|
|
||
|
|
#define TAG "ESP_DNS_LWIP"
|
||
|
|
|
||
|
|
/* Global DNS handle instance */
|
||
|
|
extern esp_dns_handle_t g_dns_handle;
|
||
|
|
|
||
|
|
/* ========================= LWIP HOOK FUNCTIONS ========================= */
|
||
|
|
|
||
|
|
#if defined(CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM)
|
||
|
|
/**
|
||
|
|
* @brief Custom DNS resolution hook for lwIP network connections
|
||
|
|
*
|
||
|
|
* @param name Hostname to resolve
|
||
|
|
* @param addr Pointer to store resolved IP address
|
||
|
|
* @param addrtype Type of address to resolve (IPv4/IPv6)
|
||
|
|
* @param err Pointer to store error code
|
||
|
|
*
|
||
|
|
* @return int 0 if resolution should be handled by lwIP, 1 if handled by this module
|
||
|
|
*/
|
||
|
|
int lwip_hook_netconn_external_resolve(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err)
|
||
|
|
{
|
||
|
|
if (g_dns_handle == NULL) {
|
||
|
|
ESP_LOGD(TAG, "ESP_DNS module not initialized, resolving through native DNS");
|
||
|
|
*err = ERR_OK;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (name == NULL || addr == NULL || err == NULL) {
|
||
|
|
if (err) {
|
||
|
|
*err = ERR_ARG;
|
||
|
|
}
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Check if name is already an IP address */
|
||
|
|
if (ipaddr_aton(name, addr)) {
|
||
|
|
*err = ERR_OK;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Check if DNS server name matches or if it's localhost */
|
||
|
|
if ((strcmp(name, g_dns_handle->config.dns_server) == 0) ||
|
||
|
|
#if LWIP_HAVE_LOOPIF
|
||
|
|
(strcmp(name, "localhost") == 0) ||
|
||
|
|
#endif
|
||
|
|
ipaddr_aton(name, addr)) {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
u8_t rrtype;
|
||
|
|
if ((addrtype == NETCONN_DNS_IPV4) || (addrtype == NETCONN_DNS_IPV4_IPV6)) {
|
||
|
|
rrtype = DNS_RRTYPE_A;
|
||
|
|
} else if ((addrtype == NETCONN_DNS_IPV6) || (addrtype == NETCONN_DNS_IPV6_IPV4)) {
|
||
|
|
rrtype = DNS_RRTYPE_AAAA;
|
||
|
|
} else {
|
||
|
|
ESP_LOGE(TAG, "Invalid address type");
|
||
|
|
*err = ERR_VAL;
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Resolve based on configured transport type */
|
||
|
|
switch (g_dns_handle->config.protocol) {
|
||
|
|
case ESP_DNS_PROTOCOL_UDP:
|
||
|
|
/* Return zero as lwIP DNS can handle UDP DNS */
|
||
|
|
return 0;
|
||
|
|
case ESP_DNS_PROTOCOL_TCP:
|
||
|
|
*err = dns_resolve_tcp(g_dns_handle, name, addr, rrtype);
|
||
|
|
break;
|
||
|
|
case ESP_DNS_PROTOCOL_DOT:
|
||
|
|
*err = dns_resolve_dot(g_dns_handle, name, addr, rrtype);
|
||
|
|
break;
|
||
|
|
case ESP_DNS_PROTOCOL_DOH:
|
||
|
|
*err = dns_resolve_doh(g_dns_handle, name, addr, rrtype);
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
ESP_LOGE(TAG, "Invalid transport type");
|
||
|
|
*err = ERR_VAL;
|
||
|
|
}
|
||
|
|
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
#else
|
||
|
|
#error "CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not defined. Please enable it in your menuconfig"
|
||
|
|
#endif /* CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM */
|