1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-18 12:52:44 +01:00
RIOT/sys/include/net/sock/dns.h
Benjamin Valentin 1de14931b8 sock_dns: use the same buffer for request & reply
Saving RAM is more important than saving a few cycles
used by re-creating the request buffer in the error case.

Also reduce the size of the buffer to 128 bytes.
If we are just requesting the AAAA record it is unlikely
for the reply to take up the maximum size of 512 bytes.

We were already placing restrictions on the domain name length,
those are now actually a bit more relaxed (112 bytes instead of 64)
2020-02-24 14:29:17 +01:00

99 lines
2.5 KiB
C

/*
* Copyright (C) 2017 Kaspar Schleiser <kaspar@schleiser.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup net_sock_dns DNS sock API
* @ingroup net_sock
*
* @brief Sock DNS client
*
* @{
*
* @file
* @brief DNS sock definitions
*
* @author Kaspar Schleiser <kaspar@schleiser.de>
*/
#ifndef NET_SOCK_DNS_H
#define NET_SOCK_DNS_H
#include <errno.h>
#include <stdint.h>
#include <unistd.h>
#include "net/sock/udp.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief DNS internal structure
*/
typedef struct {
uint16_t id; /**< read */
uint16_t flags; /**< DNS */
uint16_t qdcount; /**< RFC */
uint16_t ancount; /**< for */
uint16_t nscount; /**< detailed */
uint16_t arcount; /**< explanations */
uint8_t payload[]; /**< !! */
} sock_dns_hdr_t;
/**
* @name DNS defines
* @{
*/
#define DNS_TYPE_A (1)
#define DNS_TYPE_AAAA (28)
#define DNS_CLASS_IN (1)
#define SOCK_DNS_PORT (53)
#define SOCK_DNS_RETRIES (2)
#define SOCK_DNS_BUF_LEN (128) /* we're in embedded context. */
#define SOCK_DNS_MAX_NAME_LEN (SOCK_DNS_BUF_LEN - sizeof(sock_dns_hdr_t) - 4)
/** @} */
/**
* @brief Get IP address for DNS name
*
* This function will synchronously try to resolve a DNS A or AAAA record by contacting
* the DNS server specified in the global variable @ref sock_dns_server.
*
* By supplying AF_INET, AF_INET6 or AF_UNSPEC in @p family requesting of A
* records (IPv4), AAAA records (IPv6) or both can be selected.
*
* This function will return the first DNS record it receives. IF both A and
* AAAA are requested, AAAA will be preferred.
*
* @note @p addr_out needs to provide space for any possible result!
* (4byte when family==AF_INET, 16byte otherwise)
*
* @param[in] domain_name DNS name to resolve into address
* @param[out] addr_out buffer to write result into
* @param[in] family Either AF_INET, AF_INET6 or AF_UNSPEC
*
* @return 0 on success
* @return !=0 otherwise
*/
int sock_dns_query(const char *domain_name, void *addr_out, int family);
/**
* @brief global DNS server endpoint
*/
extern sock_udp_ep_t sock_dns_server;
#ifdef __cplusplus
}
#endif
#endif /* NET_SOCK_DNS_H */
/** @} */