#define UPDATE_LOG(priority, qdata, fmt...) \
ns_log(priority, knot_pkt_qname(qdata->query), LOG_OPERATION_UPDATE, \
- LOG_DIRECTION_IN, (struct sockaddr *)qdata->params->remote, fmt)
+ LOG_DIRECTION_IN, (struct sockaddr *)knotd_qdata_remote_addr(qdata), fmt)
static void init_qdata_from_request(knotd_qdata_t *qdata,
const zone_t *zone,
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
struct knotd_qdata_extra *extra; /*!< Private items (process_query.h). */
} knotd_qdata_t;
+/*!
+ * Gets the local (destination) address of the query.
+ *
+ * \param[in] qdata Query data.
+ * \param[out] buff Auxiliary buffer (not used for XDP).
+ *
+ * \return Local address or NULL if error.
+ */
+const struct sockaddr_storage *knotd_qdata_local_addr(knotd_qdata_t *qdata,
+ struct sockaddr_storage *buff);
+
+/*!
+ * Gets the remote (source) address of the query.
+ *
+ * \param[in] qdata Query data.
+ *
+ * \return Remote address or NULL if error.
+ */
+const struct sockaddr_storage *knotd_qdata_remote_addr(knotd_qdata_t *qdata);
+
/*!
* Gets the current zone name.
*
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
.timestamp = (uint32_t)time(NULL),
.lifetime_before = 3600,
.lifetime_after = 300,
- .client_addr = qdata->params->remote
+ .client_addr = knotd_qdata_remote_addr(qdata)
};
uint64_t current_secret = ATOMIC_GET(ctx->secret.variable);
memcpy(params.secret, ¤t_secret, sizeof(current_secret));
protocol = IPPROTO_UDP;
}
- /* Try to get the destination address. */
- struct sockaddr_storage dst_addr;
- socklen_t dst_addr_len = sizeof(dst_addr);
- (void)getsockname(qdata->params->socket, (struct sockaddr *)&dst_addr,
- &dst_addr_len);
-
/* Create a dnstap message. */
+ struct sockaddr_storage buff;
Dnstap__Message msg;
int ret = dt_message_fill(&msg, msgtype,
- (const struct sockaddr *)qdata->params->remote,
- (struct sockaddr *)&dst_addr, protocol, pkt->wire,
- pkt->size, &tv);
+ (const struct sockaddr *)knotd_qdata_remote_addr(qdata),
+ (const struct sockaddr *)knotd_qdata_local_addr(qdata, &buff),
+ protocol, pkt->wire, pkt->size, &tv);
if (ret != KNOT_EOK) {
return state;
}
-/* Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
// Check if EDNS Client Subnet is available.
struct sockaddr_storage ecs_addr = { 0 };
- const struct sockaddr_storage *remote = qdata->params->remote;
+ const struct sockaddr_storage *remote = knotd_qdata_remote_addr(qdata);
if (knot_edns_client_subnet_get_addr(&ecs_addr, qdata->ecs) == KNOT_EOK) {
remote = &ecs_addr;
}
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
if (ctx->allow_addr.count > 0) {
- if (!knotd_conf_addr_range_match(&ctx->allow_addr, qdata->params->remote)) {
+ const struct sockaddr_storage *addr = knotd_qdata_remote_addr(qdata);
+ if (!knotd_conf_addr_range_match(&ctx->allow_addr, addr)) {
qdata->rcode = KNOT_RCODE_NOTAUTH;
return KNOTD_STATE_FAIL;
}
}
if (ctx->allow_iface.count > 0) {
- struct sockaddr_storage iface;
- socklen_t iface_len = sizeof(iface);
- struct sockaddr_storage *iface_ptr;
-
- if (qdata->params->xdp_msg != NULL) {
-#ifdef ENABLE_XDP
- iface_ptr = (struct sockaddr_storage *)&qdata->params->xdp_msg->ip_to;
-#else
- assert(0);
- return KNOTD_STATE_FAIL;
-#endif
- } else {
- if (getsockname(qdata->params->socket, (struct sockaddr *)&iface,
- &iface_len) != 0) {
- knotd_mod_log(mod, LOG_ERR, "failed to get interface address");
- return KNOTD_STATE_FAIL;
- }
- iface_ptr = &iface;
- }
-
- if (!knotd_conf_addr_range_match(&ctx->allow_iface, iface_ptr)) {
+ struct sockaddr_storage buff;
+ const struct sockaddr_storage *addr = knotd_qdata_local_addr(qdata, &buff);
+ if (addr == NULL || !knotd_conf_addr_range_match(&ctx->allow_iface, addr)) {
qdata->rcode = KNOT_RCODE_NOTAUTH;
return KNOTD_STATE_FAIL;
}
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
// Exempt clients.
- if (knotd_conf_addr_range_match(&ctx->whitelist, qdata->params->remote)) {
+ if (knotd_conf_addr_range_match(&ctx->whitelist, knotd_qdata_remote_addr(qdata))) {
return state;
}
}
}
- if (rrl_query(ctx->rrl, qdata->params->remote, &req, zone_name, mod) == KNOT_EOK) {
+ if (rrl_query(ctx->rrl, knotd_qdata_remote_addr(qdata), &req, zone_name, mod) == KNOT_EOK) {
// Rate limiting not applied.
return state;
}
// Count the request protocol.
if (stats->protocol) {
bool xdp = qdata->params->xdp_msg != NULL;
- if (qdata->params->remote->ss_family == AF_INET) {
+ if (knotd_qdata_remote_addr(qdata)->ss_family == AF_INET) {
if (qdata->params->flags & KNOTD_QUERY_FLAG_LIMIT_SIZE) {
if (xdp) {
knotd_mod_stats_incr(mod, tid, CTR_PROTOCOL,
}
/* Retrieve the IP address that sent the query. */
- const struct sockaddr_storage *query_source = qdata->params->remote;
+ const struct sockaddr_storage *query_source = knotd_qdata_remote_addr(qdata);
if (query_source == NULL) {
return KNOTD_IN_STATE_ERROR;
}
-/* Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "libknot/libknot.h"
#define ZONE_NAME(qdata) knot_pkt_qname((qdata)->query)
-#define REMOTE(qdata) (struct sockaddr *)(qdata)->params->remote
+#define REMOTE(qdata) (struct sockaddr *)knotd_qdata_remote_addr(qdata)
#define AXFROUT_LOG(priority, qdata, fmt...) \
ns_log(priority, ZONE_NAME(qdata), LOG_OPERATION_AXFR, \
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "libknot/libknot.h"
#define ZONE_NAME(qdata) knot_pkt_qname((qdata)->query)
-#define REMOTE(qdata) (struct sockaddr *)(qdata)->params->remote
+#define REMOTE(qdata) (struct sockaddr *)knotd_qdata_remote_addr(qdata)
#define IXFROUT_LOG(priority, qdata, fmt...) \
ns_log(priority, ZONE_NAME(qdata), LOG_OPERATION_IXFR, \
-/* Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#define NOTIFY_IN_LOG(priority, qdata, fmt...) \
ns_log(priority, knot_pkt_qname(qdata->query), LOG_OPERATION_NOTIFY, \
- LOG_DIRECTION_IN, qdata->params->remote, fmt)
+ LOG_DIRECTION_IN, knotd_qdata_remote_addr(qdata), fmt)
static int notify_check_query(knotd_qdata_t *qdata)
{
}
/* Incoming NOTIFY expires REFRESH timer and renews EXPIRE timer. */
- zone_set_preferred_master(zone, qdata->params->remote);
+ zone_set_preferred_master(zone, knotd_qdata_remote_addr(qdata));
zone_events_schedule_now(zone, ZONE_EVENT_REFRESH);
return KNOT_STATE_DONE;
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Initialize OPT record. */
uint16_t max_payload;
- switch (qdata->params->remote->ss_family) {
+ switch (knotd_qdata_remote_addr(qdata)->ss_family) {
case AF_INET:
max_payload = conf()->cache.srv_udp_max_payload_ipv4;
break;
resp->max_size = KNOT_WIRE_MIN_PKTSIZE;
if (knot_pkt_has_edns(query)) {
uint16_t server_size;
- switch (qdata->params->remote->ss_family) {
+ switch (knotd_qdata_remote_addr(qdata)->ss_family) {
case AF_INET:
server_size = conf()->cache.srv_udp_max_payload_ipv4;
break;
{
const knot_dname_t *zone_name = qdata->extra->zone->name;
knot_pkt_t *query = qdata->query;
- const struct sockaddr_storage *query_source = qdata->params->remote;
+ const struct sockaddr_storage *query_source = knotd_qdata_remote_addr(qdata);
knot_tsig_key_t tsig = { 0 };
/* Skip if already checked and valid. */
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
memset(conf, 0, sizeof(*conf));
}
+_public_
+const struct sockaddr_storage *knotd_qdata_local_addr(knotd_qdata_t *qdata,
+ struct sockaddr_storage *buff)
+{
+ if (qdata == NULL) {
+ return NULL;
+ }
+
+ if (qdata->params->xdp_msg != NULL) {
+#ifdef ENABLE_XDP
+ return (struct sockaddr_storage *)&qdata->params->xdp_msg->ip_to;
+#else
+ assert(0);
+ return NULL;
+#endif
+ } else {
+ socklen_t buff_len = sizeof(*buff);
+ if (getsockname(qdata->params->socket, (struct sockaddr *)buff,
+ &buff_len) != 0) {
+ return NULL;
+ }
+ return buff;
+ }
+}
+
+_public_
+const struct sockaddr_storage *knotd_qdata_remote_addr(knotd_qdata_t *qdata)
+{
+ if (qdata == NULL) {
+ return NULL;
+ }
+
+ if (qdata->params->xdp_msg != NULL) {
+#ifdef ENABLE_XDP
+ return (struct sockaddr_storage *)&qdata->params->xdp_msg->ip_from;
+#else
+ assert(0);
+ return NULL;
+#endif
+ } else {
+ return qdata->params->remote;
+ }
+}
+
_public_
const knot_dname_t *knotd_qdata_zone_name(knotd_qdata_t *qdata)
{
-/* Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Store socket and remote address. */
req->fd = dup(qdata->params->socket);
- memcpy(&req->remote, qdata->params->remote, sizeof(req->remote));
+ memcpy(&req->remote, knotd_qdata_remote_addr(qdata), sizeof(req->remote));
/* Store update request. */
req->query = knot_pkt_new(NULL, qdata->query->max_size, NULL);