mirror of
				https://github.com/espressif/esp-protocols.git
				synced 2025-11-04 00:21:37 +01:00 
			
		
		
		
	
		
			
	
	
		
			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;
							 | 
						||
| 
								 | 
							
								}
							 |