mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-11-09 11:01:44 +01:00
This commit introduces a custom DNS module for ESP32, enabling DNS resolution capabilities over various protocols including UDP, TCP, DNS over TLS (DoT), and DNS over HTTPS (DoH). The module includes initialization and cleanup functionalities, along with protocol-specific implementations for each DNS type.
111 lines
2.9 KiB
C
111 lines
2.9 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include "esp_dns_priv.h"
|
|
#include "esp_dns.h"
|
|
|
|
|
|
#define TAG "ESP_DNS_UDP"
|
|
|
|
|
|
/**
|
|
* @brief Initializes the UDP DNS module
|
|
*
|
|
* Sets up the UDP DNS service using the provided configuration. Validates the parameters,
|
|
* sets the protocol, and initializes the DNS module.
|
|
*
|
|
* @param config Pointer to the DNS configuration structure
|
|
*
|
|
* @return Handle to the initialized UDP module on success, NULL on failure
|
|
*/
|
|
esp_dns_handle_t esp_dns_init_udp(esp_dns_config_t *config)
|
|
{
|
|
ESP_LOGD(TAG, "Initializing UDP DNS");
|
|
|
|
/* Validate parameters */
|
|
if (config == NULL) {
|
|
ESP_LOGE(TAG, "Invalid configuration (NULL)");
|
|
return NULL;
|
|
}
|
|
|
|
config->protocol = ESP_DNS_PROTOCOL_UDP;
|
|
|
|
esp_dns_handle_t handle = esp_dns_init(config);
|
|
if (handle == NULL) {
|
|
ESP_LOGE(TAG, "Failed to initialize DNS");
|
|
return NULL;
|
|
}
|
|
|
|
ESP_LOGD(TAG, "DNS module initialized successfully with protocol DNS Over UDP(%d)", config->protocol);
|
|
return handle;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Cleans up the UDP DNS module
|
|
*
|
|
* Releases resources allocated for the UDP DNS service. Validates the parameters,
|
|
* checks the protocol, and cleans up the DNS module.
|
|
*
|
|
* @param handle Pointer to the DNS handle to be cleaned up
|
|
*
|
|
* @return 0 on success, -1 on failure
|
|
*/
|
|
int esp_dns_cleanup_udp(esp_dns_handle_t handle)
|
|
{
|
|
ESP_LOGD(TAG, "Cleaning up UDP DNS");
|
|
|
|
/* Validate parameters */
|
|
if (handle == NULL) {
|
|
ESP_LOGE(TAG, "Invalid handle (NULL)");
|
|
return -1;
|
|
}
|
|
|
|
if (handle->config.protocol != ESP_DNS_PROTOCOL_UDP) {
|
|
ESP_LOGW(TAG, "Unknown protocol during cleanup: %d", handle->config.protocol);
|
|
return -1;
|
|
}
|
|
|
|
int ret = esp_dns_cleanup(handle);
|
|
if (ret != 0) {
|
|
ESP_LOGE(TAG, "Failed to cleanup DNS");
|
|
return ret;
|
|
}
|
|
|
|
/* Empty the handle */
|
|
memset(handle, 0, sizeof(*handle));
|
|
|
|
ESP_LOGD(TAG, "DNS module cleaned up DNS Over UDP successfully");
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Resolves a hostname using UDP DNS
|
|
*
|
|
* Performs DNS resolution over UDP for the given hostname. Creates a UDP connection,
|
|
* sends the DNS query, and processes the response.
|
|
*
|
|
* @note This function is a placeholder and does not contain the actual implementation
|
|
* for UDP DNS resolution. The implementation needs to be added.
|
|
* As of now the resolution is performed by lwip dns module.
|
|
*
|
|
* @param handle DNS handle
|
|
* @param name Hostname to resolve
|
|
* @param addr Pointer to store the resolved IP address
|
|
* @param rrtype DNS record type
|
|
*
|
|
* @return ERR_OK on success, error code on failure
|
|
*/
|
|
err_t dns_resolve_udp(const esp_dns_handle_t handle, const char *name, ip_addr_t *addr, u8_t rrtype)
|
|
{
|
|
// TBD: Implement UDP DNS resolution
|
|
if (addr == NULL) {
|
|
return ERR_ARG;
|
|
}
|
|
|
|
return ERR_OK;
|
|
}
|