1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

sock_dns_cache: move to dns_cache

Also piggy-back some fixes to the unittests and submodule handling
This commit is contained in:
Martine Lenders 2022-07-18 11:47:57 +02:00
parent 1761726024
commit 8bec9c1115
No known key found for this signature in database
GPG Key ID: 2134D77A5336DD80
14 changed files with 138 additions and 98 deletions

View File

@ -54,6 +54,7 @@ PSEUDOMODULES += dhcpv6_client_ia_pd
PSEUDOMODULES += dhcpv6_client_ia_na PSEUDOMODULES += dhcpv6_client_ia_na
PSEUDOMODULES += dhcpv6_client_mud_url PSEUDOMODULES += dhcpv6_client_mud_url
PSEUDOMODULES += dhcpv6_relay PSEUDOMODULES += dhcpv6_relay
PSEUDOMODULES += dns_cache
PSEUDOMODULES += dns_msg PSEUDOMODULES += dns_msg
PSEUDOMODULES += ecc_% PSEUDOMODULES += ecc_%
PSEUDOMODULES += ethos_stdio PSEUDOMODULES += ethos_stdio
@ -215,7 +216,6 @@ PSEUDOMODULES += sock_async
PSEUDOMODULES += sock_aux_local PSEUDOMODULES += sock_aux_local
PSEUDOMODULES += sock_aux_rssi PSEUDOMODULES += sock_aux_rssi
PSEUDOMODULES += sock_aux_timestamp PSEUDOMODULES += sock_aux_timestamp
PSEUDOMODULES += sock_dns_cache
PSEUDOMODULES += sock_dtls PSEUDOMODULES += sock_dtls
PSEUDOMODULES += sock_ip PSEUDOMODULES += sock_ip
PSEUDOMODULES += sock_tcp PSEUDOMODULES += sock_tcp

View File

@ -602,8 +602,7 @@ ifneq (,$(filter sock_dns,$(USEMODULE)))
USEMODULE += posix_headers USEMODULE += posix_headers
endif endif
ifneq (,$(filter sock_dns_cache,$(USEMODULE))) ifneq (,$(filter dns_cache,$(USEMODULE)))
USEMODULE += sock_dns
USEMODULE += ztimer_msec USEMODULE += ztimer_msec
USEMODULE += checksum USEMODULE += checksum
endif endif

View File

@ -7,7 +7,8 @@
*/ */
/** /**
* @ingroup net_sock_dns * @defgroup net_dns_cache DNS cache
* @ingroup net_dns
* *
* @brief DNS cache * @brief DNS cache
* *
@ -29,23 +30,39 @@
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com> * @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
*/ */
#ifndef DNS_CACHE_H #ifndef NET_DNS_CACHE_H
#define DNS_CACHE_H #define NET_DNS_CACHE_H
#include <stdint.h> #include <stdint.h>
#include "kernel_defines.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/** /**
* @brief Number of DNS cache entries * @brief Maximum number of DNS cache entries
*/ */
#ifndef CONFIG_DNS_CACHE_SIZE #ifndef CONFIG_DNS_CACHE_SIZE
#define CONFIG_DNS_CACHE_SIZE 4 #define CONFIG_DNS_CACHE_SIZE 4
#endif #endif
#if IS_USED(MODULE_SOCK_DNS_CACHE) || DOXYGEN /**
* @brief Handle to cache A records
*/
#ifndef CONFIG_DNS_CACHE_A
#define CONFIG_DNS_CACHE_A IS_USED(MODULE_IPV4)
#endif
/**
* @brief Handle to cache AAAA records
*/
#ifndef CONFIG_DNS_CACHE_AAAA
#define CONFIG_DNS_CACHE_AAAA IS_USED(MODULE_IPV6)
#endif
#if IS_USED(MODULE_DNS_CACHE) || DOXYGEN
/** /**
* @brief Get IP address for a DNS name from the DNS cache * @brief Get IP address for a DNS name from the DNS cache
* *
@ -56,7 +73,7 @@ extern "C" {
* @return the size of the resolved address on success * @return the size of the resolved address on success
* @return <= 0 otherwise * @return <= 0 otherwise
*/ */
int sock_dns_cache_query(const char *domain_name, void *addr_out, int family); int dns_cache_query(const char *domain_name, void *addr_out, int family);
/** /**
* @brief Add an IP address for a DNS name to the DNS cache * @brief Add an IP address for a DNS name to the DNS cache
@ -66,10 +83,9 @@ int sock_dns_cache_query(const char *domain_name, void *addr_out, int family);
* @param[in] addr_len length of the address in bytes * @param[in] addr_len length of the address in bytes
* @param[in] ttl lifetime of the entry in seconds * @param[in] ttl lifetime of the entry in seconds
*/ */
void sock_dns_cache_add(const char *domain_name, const void *addr, int addr_len, uint32_t ttl); void dns_cache_add(const char *domain_name, const void *addr, int addr_len, uint32_t ttl);
#else #else
static inline int sock_dns_cache_query(const char *domain_name, static inline int dns_cache_query(const char *domain_name, void *addr_out, int family)
void *addr_out, int family)
{ {
(void)domain_name; (void)domain_name;
(void)addr_out; (void)addr_out;
@ -77,8 +93,8 @@ static inline int sock_dns_cache_query(const char *domain_name,
return 0; return 0;
} }
static inline void sock_dns_cache_add(const char *domain_name, const void *addr, static inline void dns_cache_add(const char *domain_name, const void *addr,
int addr_len, uint32_t ttl) int addr_len, uint32_t ttl)
{ {
(void)domain_name; (void)domain_name;
(void)addr; (void)addr;
@ -91,5 +107,5 @@ static inline void sock_dns_cache_add(const char *domain_name, const void *addr,
} }
#endif #endif
#endif /* DNS_CACHE_H */ #endif /* NET_DNS_CACHE_H */
/** @} */ /** @} */

View File

@ -25,4 +25,28 @@ config DNS_MSG_LEN
default 128 default 128
endif # KCONFIG_USEMODULE_DNS_MSG endif # KCONFIG_USEMODULE_DNS_MSG
menuconfig KCONFIG_USEMODULE_DNS_CACHE
bool "Configure DNS cache"
depends on USEMODULE_DNS_CACHE
help
Configure DNS cache using Kconfig.
if KCONFIG_USEMODULE_DNS_CACHE
config DNS_CACHE_SIZE
int "Maximum number of DNS cache entries"
default 4
config DNS_CACHE_A
bool "Handle to cache A records"
default y if USEMODULE_IPV4
default n
config DNS_CACHE_AAAA
bool "Handle to cache AAAA records"
default y if USEMODULE_IPV6
default n
endif # KCONFIG_USEMODULE_DNS_SIZE
endif # KCONFIG_USEMODULE_DNS endif # KCONFIG_USEMODULE_DNS

View File

@ -1,5 +1,5 @@
SRC := SRC :=
SUBMODULE := 1 SUBMODULES := 1
include $(RIOTBASE)/Makefile.base include $(RIOTBASE)/Makefile.base

View File

@ -7,7 +7,7 @@
*/ */
/** /**
* @ingroup net_sock_dns * @ingroup net_dns_cache
* @{ * @{
* @file * @file
* @brief DNS cache implementation * @brief DNS cache implementation
@ -17,9 +17,11 @@
#include "bitfield.h" #include "bitfield.h"
#include "checksum/fletcher32.h" #include "checksum/fletcher32.h"
#include "net/sock/dns.h"
#include "time_units.h" #include "time_units.h"
#include "dns_cache.h" #include "net/af.h"
#include "net/dns/cache.h"
#include "net/ipv4/addr.h"
#include "net/ipv6/addr.h"
#include "ztimer.h" #include "ztimer.h"
#define ENABLE_DEBUG 0 #define ENABLE_DEBUG 0
@ -29,29 +31,29 @@ static struct dns_cache_entry {
uint32_t hash; uint32_t hash;
uint32_t expires; uint32_t expires;
union { union {
#if IS_ACTIVE(SOCK_HAS_IPV4) #if IS_ACTIVE(CONFIG_DNS_CACHE_A)
ipv4_addr_t v4; ipv4_addr_t v4;
#endif #endif
#if IS_ACTIVE(SOCK_HAS_IPV6) #if IS_ACTIVE(CONFIG_DNS_CACHE_AAAA)
ipv6_addr_t v6; ipv6_addr_t v6;
#endif #endif
} addr; } addr;
} cache[CONFIG_DNS_CACHE_SIZE]; } cache[CONFIG_DNS_CACHE_SIZE];
#if IS_ACTIVE(SOCK_HAS_IPV4) && IS_ACTIVE(SOCK_HAS_IPV6) #if IS_ACTIVE(CONFIG_DNS_CACHE_A) && IS_ACTIVE(CONFIG_DNS_CACHE_AAAA)
BITFIELD(cache_is_v6, CONFIG_DNS_CACHE_SIZE); BITFIELD(cache_is_v6, CONFIG_DNS_CACHE_SIZE);
static inline uint8_t _get_len(unsigned idx) static inline uint8_t _get_len(unsigned idx)
{ {
return bf_isset(cache_is_v6, idx) ? 16 : 4; return bf_isset(cache_is_v6, idx) ? 16 : 4;
} }
#elif IS_ACTIVE(SOCK_HAS_IPV4) #elif IS_ACTIVE(CONFIG_DNS_CACHE_A)
static inline uint8_t _get_len(unsigned idx) static inline uint8_t _get_len(unsigned idx)
{ {
(void)idx; (void)idx;
return 4; return 4;
} }
#elif IS_ACTIVE(SOCK_HAS_IPV6) #elif IS_ACTIVE(CONFIG_DNS_CACHE_AAAA)
static inline uint8_t _get_len(unsigned idx) static inline uint8_t _get_len(unsigned idx)
{ {
(void)idx; (void)idx;
@ -61,7 +63,7 @@ static inline uint8_t _get_len(unsigned idx)
static void _set_len(unsigned idx, uint8_t len) static void _set_len(unsigned idx, uint8_t len)
{ {
#if IS_ACTIVE(SOCK_HAS_IPV4) && IS_ACTIVE(SOCK_HAS_IPV6) #if IS_ACTIVE(CONFIG_DNS_CACHE_A) && IS_ACTIVE(CONFIG_DNS_CACHE_AAAA)
if (len == 16) { if (len == 16) {
bf_set(cache_is_v6, idx); bf_set(cache_is_v6, idx);
} else { } else {
@ -94,11 +96,11 @@ static void _set_empty(unsigned idx)
static uint8_t _addr_len(int family) static uint8_t _addr_len(int family)
{ {
switch (family) { switch (family) {
#if IS_ACTIVE(SOCK_HAS_IPV4) #if IS_ACTIVE(CONFIG_DNS_CACHE_A)
case AF_INET: case AF_INET:
return sizeof(ipv4_addr_t); return sizeof(ipv4_addr_t);
#endif #endif
#if IS_ACTIVE(SOCK_HAS_IPV6) #if IS_ACTIVE(CONFIG_DNS_CACHE_AAAA)
case AF_INET6: case AF_INET6:
return sizeof(ipv6_addr_t); return sizeof(ipv6_addr_t);
#endif #endif
@ -114,7 +116,7 @@ static uint32_t _hash(const void *data, size_t len)
return fletcher32(data, (len + 1) / 2); return fletcher32(data, (len + 1) / 2);
} }
int sock_dns_cache_query(const char *domain_name, void *addr_out, int family) int dns_cache_query(const char *domain_name, void *addr_out, int family)
{ {
uint32_t now = ztimer_now(ZTIMER_MSEC) / MS_PER_SEC; uint32_t now = ztimer_now(ZTIMER_MSEC) / MS_PER_SEC;
uint32_t hash = _hash(domain_name, strlen(domain_name)); uint32_t hash = _hash(domain_name, strlen(domain_name));
@ -153,7 +155,7 @@ static void _add_entry(uint8_t i, uint32_t hash, const void *addr_out,
_set_len(i, addr_len); _set_len(i, addr_len);
} }
void sock_dns_cache_add(const char *domain_name, const void *addr_out, void dns_cache_add(const char *domain_name, const void *addr_out,
int addr_len, uint32_t ttl) int addr_len, uint32_t ttl)
{ {
uint32_t now = ztimer_now(ZTIMER_MSEC) / MS_PER_SEC; uint32_t now = ztimer_now(ZTIMER_MSEC) / MS_PER_SEC;

View File

@ -1,7 +1,3 @@
SRC += dns.c SRC += dns.c
ifneq (,$(filter sock_dns_cache, $(USEMODULE)))
SRC += dns_cache.c
endif
include $(RIOTBASE)/Makefile.base include $(RIOTBASE)/Makefile.base

View File

@ -22,10 +22,10 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include "net/dns.h" #include "net/dns.h"
#include "net/dns/cache.h"
#include "net/dns/msg.h" #include "net/dns/msg.h"
#include "net/sock/udp.h" #include "net/sock/udp.h"
#include "net/sock/dns.h" #include "net/sock/dns.h"
#include "dns_cache.h"
/* min domain name length is 1, so minimum record length is 7 */ /* min domain name length is 1, so minimum record length is 7 */
#define DNS_MIN_REPLY_LEN (unsigned)(sizeof(dns_hdr_t) + 7) #define DNS_MIN_REPLY_LEN (unsigned)(sizeof(dns_hdr_t) + 7)
@ -80,7 +80,7 @@ int sock_dns_query(const char *domain_name, void *addr_out, int family)
return -ENOSPC; return -ENOSPC;
} }
res = sock_dns_cache_query(domain_name, addr_out, family); res = dns_cache_query(domain_name, addr_out, family);
if (res) { if (res) {
return res; return res;
} }
@ -104,7 +104,7 @@ int sock_dns_query(const char *domain_name, void *addr_out, int family)
uint32_t ttl; uint32_t ttl;
if ((res = dns_msg_parse_reply(dns_buf, res, family, if ((res = dns_msg_parse_reply(dns_buf, res, family,
addr_out, &ttl)) > 0) { addr_out, &ttl)) > 0) {
sock_dns_cache_add(domain_name, addr_out, res, ttl); dns_cache_add(domain_name, addr_out, res, ttl);
goto out; goto out;
} }
} }

View File

@ -0,0 +1,4 @@
USEMODULE += dns_cache
USEMODULE += ipv4
USEMODULE += ipv6
USEMODULE += ztimer_usec

View File

@ -0,0 +1,54 @@
/*
* Copyright (C) 2022 ML!PA Consulting GmbH
*
* 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.
*/
#include <stdint.h>
#include <string.h>
#include "net/af.h"
#include "net/ipv6.h"
#include "ztimer.h"
#include "net/dns/cache.h"
#include "tests-dns_cache.h"
static void test_dns_cache_add(void)
{
ipv6_addr_t addr_in = IPV6_ADDR_ALL_NODES_IF_LOCAL;
ipv6_addr_t addr_out;
TEST_ASSERT_EQUAL_INT(0, dns_cache_query("example.com", &addr_out, AF_INET6));
/* add DNS entry, set it to expire in 1s */
dns_cache_add("example.com", &addr_in, sizeof(addr_in), 1);
TEST_ASSERT_EQUAL_INT(sizeof(addr_out), dns_cache_query("example.com", &addr_out, AF_INET6));
TEST_ASSERT_EQUAL_INT(0, memcmp(&addr_in, &addr_out, sizeof(addr_in)));
TEST_ASSERT_EQUAL_INT(0, dns_cache_query("example.com", &addr_out, AF_INET));
TEST_ASSERT_EQUAL_INT(0, dns_cache_query("alt.example.com", &addr_out, AF_INET6));
TEST_ASSERT_EQUAL_INT(0, dns_cache_query("example.comm", &addr_out, AF_INET6));
TEST_ASSERT_EQUAL_INT(0, dns_cache_query("example.co", &addr_out, AF_INET6));
ztimer_sleep(ZTIMER_USEC, 2000000);
TEST_ASSERT_EQUAL_INT(0, dns_cache_query("example.com", &addr_out, AF_INET6));
}
Test *tests_dns_cache_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_dns_cache_add),
};
EMB_UNIT_TESTCALLER(dns_cache_tests, NULL, NULL, fixtures);
return (Test *)&dns_cache_tests;
}
void tests_dns_cache(void)
{
TESTS_RUN(tests_dns_cache_tests());
}

View File

@ -11,12 +11,12 @@
* @{ * @{
* *
* @file * @file
* @brief Unittests for the ``sock_dns_cache`` module * @brief Unittests for the ``dns_cache`` module
* *
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com> * @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
*/ */
#ifndef TESTS_SOCK_DNS_CACHE_H #ifndef TESTS_DNS_CACHE_H
#define TESTS_SOCK_DNS_CACHE_H #define TESTS_DNS_CACHE_H
#include "embUnit.h" #include "embUnit.h"
@ -27,18 +27,18 @@ extern "C" {
/** /**
* @brief The entry point of this test suite. * @brief The entry point of this test suite.
*/ */
void tests_sock_dns_cache(void); void tests_dns_cache(void);
/** /**
* @brief Generates tests for sock_dns_cache * @brief Generates tests for dns_cache
* *
* @return embUnit tests if successful, NULL if not. * @return embUnit tests if successful, NULL if not.
*/ */
Test *tests_sock_dns_cache_tests(void); Test *tests_dns_cache_tests(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* TESTS_SOCK_DNS_CACHE_H */ #endif /* TESTS_DNS_CACHE_H */
/** @} */ /** @} */

View File

@ -1,2 +0,0 @@
USEMODULE += gnrc_ipv6
USEMODULE += sock_dns_cache

View File

@ -1,53 +0,0 @@
/*
* Copyright (C) 2022 ML!PA Consulting GmbH
*
* 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.
*/
#include <stdint.h>
#include <string.h>
#include "net/af.h"
#include "net/ipv6.h"
#include "ztimer.h"
#include "tests-sock_dns_cache.h"
#include "../net/application_layer/sock_dns/dns_cache.h"
static void test_dns_cache_add(void)
{
ipv6_addr_t addr_in = IPV6_ADDR_ALL_NODES_IF_LOCAL;
ipv6_addr_t addr_out;
TEST_ASSERT_EQUAL_INT(0, sock_dns_cache_query("example.com", &addr_out, AF_INET6));
/* add DNS entry, set it to expire in 1s */
sock_dns_cache_add("example.com", &addr_in, sizeof(addr_in), 1);
TEST_ASSERT_EQUAL_INT(sizeof(addr_out), sock_dns_cache_query("example.com", &addr_out, AF_INET6));
TEST_ASSERT_EQUAL_INT(0, memcmp(&addr_in, &addr_out, sizeof(addr_in)));
TEST_ASSERT_EQUAL_INT(0, sock_dns_cache_query("example.com", &addr_out, AF_INET));
TEST_ASSERT_EQUAL_INT(0, sock_dns_cache_query("alt.example.com", &addr_out, AF_INET6));
TEST_ASSERT_EQUAL_INT(0, sock_dns_cache_query("example.comm", &addr_out, AF_INET6));
TEST_ASSERT_EQUAL_INT(0, sock_dns_cache_query("example.co", &addr_out, AF_INET6));
ztimer_sleep(ZTIMER_USEC, 2000000);
TEST_ASSERT_EQUAL_INT(0, sock_dns_cache_query("example.com", &addr_out, AF_INET6));
}
Test *tests_sock_dns_cache_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_dns_cache_add),
};
EMB_UNIT_TESTCALLER(sock_dns_cache_tests, NULL, NULL, fixtures);
return (Test *)&sock_dns_cache_tests;
}
void tests_sock_dns_cache(void)
{
TESTS_RUN(tests_sock_dns_cache_tests());
}