zephyr/subsys/net/lib/dns/dns_cache.h
Carlo Kirchmeier 7bfaca4c58 net: dns: Add DNS cache for improved performance
In order to reduce dns resolve requests when using the dns
resolver an optional cache was introduced. This cache
retains query requests for the TTL duration and therefore
prevents premature refetching of DNS RRs.

Signed-off-by: Carlo Kirchmeier <carlo.kirchmeier@zuehlke.com>
2024-03-15 08:37:29 +00:00

101 lines
3.3 KiB
C

/** @file
* @brief DNS cache
*
* An cache holding dns records for faster dns resolving.
*/
/*
* Copyright (c) 2024 Endress+Hauser AG
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_NET_DNS_CACHE_H_
#define ZEPHYR_INCLUDE_NET_DNS_CACHE_H_
#include <stdint.h>
#include <zephyr/net/dns_resolve.h>
#include <zephyr/kernel.h>
#include <zephyr/sys_clock.h>
struct dns_cache_entry {
char query[CONFIG_DNS_RESOLVER_MAX_QUERY_LEN];
struct dns_addrinfo data;
k_timepoint_t expiry;
bool in_use;
};
struct dns_cache {
size_t size;
struct dns_cache_entry *entries;
struct k_mutex *lock;
};
/**
* @brief Statically define and initialize a DNS queue.
*
* The cache can be accessed outside the module where it is defined using:
*
* @code extern struct dns_cache <name>; @endcode
*
* @param name Name of the cache.
*/
#define DNS_CACHE_DEFINE(name, cache_size) \
static K_MUTEX_DEFINE(name##_mutex); \
static struct dns_cache_entry name##_entries[cache_size]; \
static struct dns_cache name = { \
.entries = name##_entries, .size = cache_size, .lock = &name##_mutex};
/**
* @brief Flushes the dns cache removing all its entries.
*
* @param cache Cache to be flushed
* @retval 0 on success
* @retval On error, a negative value is returned.
*/
int dns_cache_flush(struct dns_cache *cache);
/**
* @brief Adds a new entry to the dns cache removing the one closest to expiry
* if no free space is available.
*
* @param cache Cache where the entry should be added.
* @param query Query which should be persisted in the cache.
* @param addrinfo Addrinfo resulting from the query which will be returned
* upon cache hit.
* @param ttl Time to live for the entry in seconds. This usually represents
* the TTL of the RR.
* @retval 0 on success
* @retval On error, a negative value is returned.
*/
int dns_cache_add(struct dns_cache *cache, char const *query, struct dns_addrinfo const *addrinfo,
uint32_t ttl);
/**
* @brief Removes all entries with the given query
*
* @param cache Cache where the entries should be removed.
* @param query Query which should be searched for.
* @retval 0 on success
* @retval On error, a negative value is returned.
*/
int dns_cache_remove(struct dns_cache *cache, char const *query);
/**
* @brief Tries to find the specified query entry within the cache.
*
* @param cache Cache where the entry should be searched.
* @param query Query which should be searched for.
* @param addrinfo dns_addrinfo array which will be written if the query was found.
* @param addrinfo_array_len Array size of the dns_addrinfo array
* @retval on success the amount of dns_addrinfo written into the addrinfo array will be returned.
* A cache miss will therefore return a 0.
* @retval On error a negative value is returned.
* -ENOSR means there was not enough space in the addrinfo array to accommodate all cache hits the
* array will however be filled with valid data.
*/
int dns_cache_find(struct dns_cache const *cache, const char *query, struct dns_addrinfo *addrinfo,
size_t addrinfo_array_len);
#endif /* ZEPHYR_INCLUDE_NET_DNS_CACHE_H_ */