net: dns: Use dispatcher context in callbacks

Feed the dispatcher context to dispatcher callbacks instead of
resolver or responder context. The callback can then use the
proper context because the dispatcher context contains those
two context. This allows dispatcher callback to utilize all the
information (like interface etc) stored in dispatcher context.

Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
This commit is contained in:
Jukka Rissanen 2025-01-22 19:03:10 +02:00 committed by Benjamin Cabé
parent 3ed8151b00
commit e98bf3e6d7
4 changed files with 12 additions and 12 deletions

View File

@ -156,13 +156,14 @@ enum dns_socket_type {
struct dns_resolve_context;
struct mdns_responder_context;
struct dns_socket_dispatcher;
/**
* @typedef dns_socket_dispatcher_cb
* @brief Callback used when the DNS socket dispatcher has found a handler for
* this type of socket.
*
* @param ctx DNS resolve or mDNS responder context.
* @param ctx struct dns_socket_dispatcher context.
* @param sock Socket which is seeing traffic.
* @param addr Socket address of the peer that sent the DNS packet.
* @param addrlen Length of the socket address.
@ -171,7 +172,7 @@ struct mdns_responder_context;
*
* @return 0 if ok, <0 if error
*/
typedef int (*dns_socket_dispatcher_cb)(void *ctx, int sock,
typedef int (*dns_socket_dispatcher_cb)(struct dns_socket_dispatcher *ctx, int sock,
struct sockaddr *addr, size_t addrlen,
struct net_buf *buf, size_t data_len);

View File

@ -63,11 +63,11 @@ static int dns_dispatch(struct dns_socket_dispatcher *dispatcher,
if (is_query) {
if (dispatcher->type == DNS_SOCKET_RESPONDER) {
/* Call the responder callback */
ret = dispatcher->cb(dispatcher->ctx, sock,
ret = dispatcher->cb(dispatcher, sock,
addr, addrlen,
dns_data, data_len);
} else if (dispatcher->pair) {
ret = dispatcher->pair->cb(dispatcher->pair->ctx, sock,
ret = dispatcher->pair->cb(dispatcher, sock,
addr, addrlen,
dns_data, data_len);
} else {
@ -81,11 +81,11 @@ static int dns_dispatch(struct dns_socket_dispatcher *dispatcher,
*/
if (dispatcher->type == DNS_SOCKET_RESOLVER) {
/* Call the resolver callback */
ret = dispatcher->cb(dispatcher->ctx, sock,
ret = dispatcher->cb(dispatcher, sock,
addr, addrlen,
dns_data, data_len);
} else if (dispatcher->pair) {
ret = dispatcher->pair->cb(dispatcher->pair->ctx, sock,
ret = dispatcher->pair->cb(dispatcher, sock,
addr, addrlen,
dns_data, data_len);
} else {

View File

@ -583,7 +583,8 @@ static int dns_read(int sock,
if (!strncasecmp(hostname, result->data + 1, hostname_len) &&
(result->len - 1) >= hostname_len &&
&(result->data + 1)[hostname_len] == lquery) {
NET_DBG("%s query to our hostname %s.local", "mDNS",
NET_DBG("%s %s %s to our hostname %s.local", "mDNS",
family == AF_INET ? "IPv4" : "IPv6", "query",
hostname);
send_response(sock, family, src_addr, addrlen,
result, qtype);
@ -668,14 +669,12 @@ static void setup_ipv4_addr(struct sockaddr_in *local_addr)
#define INTERFACE_NAME_LEN 0
#endif
static int dispatcher_cb(void *my_ctx, int sock,
static int dispatcher_cb(struct dns_socket_dispatcher *ctx, int sock,
struct sockaddr *addr, size_t addrlen,
struct net_buf *dns_data, size_t len)
{
int ret;
ARG_UNUSED(my_ctx);
ret = dns_read(sock, dns_data, len, addr, addrlen);
if (ret < 0 && ret != -EINVAL && ret != -ENOENT) {
NET_DBG("%s read failed (%d)", "mDNS", ret);

View File

@ -201,11 +201,11 @@ static void dns_postprocess_server(struct dns_resolve_context *ctx, int idx)
}
}
static int dispatcher_cb(void *my_ctx, int sock,
static int dispatcher_cb(struct dns_socket_dispatcher *my_ctx, int sock,
struct sockaddr *addr, size_t addrlen,
struct net_buf *dns_data, size_t len)
{
struct dns_resolve_context *ctx = my_ctx;
struct dns_resolve_context *ctx = my_ctx->resolve_ctx;
struct net_buf *dns_cname = NULL;
uint16_t query_hash = 0U;
uint16_t dns_id = 0U;