return KNOT_STATE_FAIL;
}
- r = query_put_edns(pkt, &data->edns);
- if (r != KNOT_EOK) {
- return KNOT_STATE_FAIL;
- }
-
knot_wire_set_rd(pkt->wire);
return KNOT_STATE_CONSUME;
.remote = (struct sockaddr *)&parent->addr,
.key = key,
.not_key = not_key,
- .edns = query_edns_data_init(conf, parent->addr.ss_family,
- QUERY_EDNS_OPT_DO),
+ .edns = query_edns_data_init(conf, parent, QUERY_EDNS_OPT_DO),
.ds_ok = false,
.result_logged = false,
.ttl = 0,
return KNOT_ENOMEM;
}
- knot_request_t *req = knot_request_make(NULL, parent, pkt, server->quic_creds, 0);
+ knot_request_t *req = knot_request_make(NULL, parent, pkt, server->quic_creds, &data.edns, 0);
if (req == NULL) {
knot_request_free(req, NULL);
knot_requestor_clear(&requestor);
return KNOT_STATE_FAIL;
}
- ret = query_put_edns(pkt, &data->edns);
- if (ret != KNOT_EOK) {
- return KNOT_STATE_FAIL;
- }
-
return KNOT_STATE_CONSUME;
}
}
}
- query_put_edns(pkt, &data->edns);
-
return KNOT_STATE_CONSUME;
}
.parent_query = zone->name,
.new_ds = zone_cds,
.remote = (struct sockaddr *)&parent->addr,
- .edns = query_edns_data_init(conf, parent->addr.ss_family, 0)
+ .edns = query_edns_data_init(conf, parent, 0)
};
knot_rrset_init(&data.del_old_ds, zone->name, KNOT_RRTYPE_DS, KNOT_CLASS_ANY, 0);
}
knot_request_t *req = knot_request_make(NULL, parent, pkt,
- zone->server->quic_creds, 0);
+ zone->server->quic_creds, &data.edns, 0);
if (req == NULL) {
knot_rdataset_clear(&data.del_old_ds.rrs, NULL);
knot_request_free(req, NULL);
knot_pkt_put(pkt, KNOT_COMPR_HINT_QNAME, data->soa, 0);
}
- query_put_edns(pkt, &data->edns);
-
return KNOT_STATE_CONSUME;
}
.zone = zone->name,
.soa = soa,
.remote = (struct sockaddr *)&slave->addr,
- .edns = query_edns_data_init(conf, slave->addr.ss_family, 0)
+ .edns = query_edns_data_init(conf, slave, 0)
};
knot_requestor_t requestor;
knot_request_flag_t flags = conf->cache.srv_tcp_fastopen ? KNOT_REQUEST_TFO : 0;
knot_request_t *req = knot_request_make(NULL, slave, pkt,
- zone->server->quic_creds, flags);
+ zone->server->quic_creds, &data.edns, flags);
if (req == NULL) {
knot_request_free(req, NULL);
knot_requestor_clear(&requestor);
const struct sockaddr *remote; //!< Remote endpoint.
const knot_rrset_t *soa; //!< Local SOA (NULL for AXFR).
const size_t max_zone_size; //!< Maximal zone size.
- bool use_edns; //!< Allow EDNS in SOA/AXFR/IXFR queries.
query_edns_data_t edns; //!< EDNS data to be used in queries.
zone_master_fallback_t *fallback; //!< Flags allowing zone_master_try() fallbacks.
bool fallback_axfr; //!< Flag allowing fallback to AXFR,
return KNOT_STATE_FAIL;
}
- if (data->use_edns) {
- data->ret = query_put_edns(pkt, &data->edns);
- if (data->ret != KNOT_EOK) {
- return KNOT_STATE_FAIL;
- }
- }
-
return KNOT_STATE_CONSUME;
}
knot_rrset_free(sending_soa, data->mm);
}
- if (data->use_edns) {
- data->ret = query_put_edns(pkt, &data->edns);
- if (data->ret != KNOT_EOK) {
- return KNOT_STATE_FAIL;
- }
- }
-
return KNOT_STATE_CONSUME;
}
.remote = (struct sockaddr *)&master->addr,
.soa = zone->contents && !trctx->force_axfr ? &soa : NULL,
.max_zone_size = max_zone_size(conf, zone->name),
- .use_edns = !master->no_edns,
- .edns = query_edns_data_init(conf, master->addr.ss_family,
- QUERY_EDNS_OPT_EXPIRE),
+ .edns = query_edns_data_init(conf, master, QUERY_EDNS_OPT_EXPIRE),
.expire_timer = EXPIRE_TIMER_INVALID,
.fallback = fallback,
.fallback_axfr = false, // will be set upon IXFR consume
}
knot_request_flag_t flags = conf->cache.srv_tcp_fastopen ? KNOT_REQUEST_TFO : 0;
- knot_request_t *req = knot_request_make(NULL, master, pkt,
- zone->server->quic_creds, flags);
+ knot_request_t *req = knot_request_make(NULL, master, pkt, zone->server->quic_creds,
+ &data.edns, flags);
if (req == NULL) {
knot_request_free(req, NULL);
knot_requestor_clear(&requestor);
/* Create a request. */
knot_request_flag_t flags = conf->cache.srv_tcp_fastopen ? KNOT_REQUEST_TFO : 0;
knot_request_t *req = knot_request_make(NULL, remote, query,
- zone->server->quic_creds, flags);
+ zone->server->quic_creds, NULL, flags);
if (req == NULL) {
knot_requestor_clear(&re);
knot_pkt_free(query);
const struct sockaddr_storage *dst = &proxy->remote;
const struct sockaddr_storage *src = &proxy->via;
knot_request_t *req = knot_request_make_generic(re.mm, dst, src, qdata->query,
- NULL, NULL, NULL, 0, flags);
+ NULL, NULL, NULL, NULL, 0, flags);
if (req == NULL) {
knot_requestor_clear(&re);
return state; /* Ignore, not enough memory. */
-/* Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2023 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
knot_wire_set_id(pkt->wire, dnssec_random_uint16_t());
}
-query_edns_data_t query_edns_data_init(conf_t *conf, int remote_family,
+query_edns_data_t query_edns_data_init(conf_t *conf, const conf_remote_t *remote,
query_edns_opt_t opts)
{
assert(conf);
query_edns_data_t edns = {
- .max_payload = remote_family == AF_INET ?
+ .max_payload = remote->addr.ss_family == AF_INET ?
conf->cache.srv_udp_max_payload_ipv4 :
conf->cache.srv_udp_max_payload_ipv6,
+ .no_edns = remote->no_edns,
.do_flag = (opts & QUERY_EDNS_OPT_DO),
.expire_option = (opts & QUERY_EDNS_OPT_EXPIRE)
};
-/* Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/* Copyright (C) 2023 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
*/
typedef struct {
uint16_t max_payload;
+ bool no_edns;
bool do_flag;
bool expire_option;
} query_edns_data_t;
/*!
* \brief Initialize EDNS parameters from server configuration.
*
- * \param[in] conf Server configuration.
- * \param[in] remote_family Address family for remote host.
- * \param[in] opts EDNS options.
+ * \param[in] conf Server configuration.
+ * \param[in] remote Remote parameters.
+ * \param[in] opts EDNS options.
*
* \return EDNS parameters.
*/
-query_edns_data_t query_edns_data_init(conf_t *conf, int remote_family,
+query_edns_data_t query_edns_data_init(conf_t *conf, const conf_remote_t *remote,
query_edns_opt_t opts);
/*!
const struct sockaddr_storage *source,
knot_pkt_t *query,
const struct knot_quic_creds *creds,
+ const query_edns_data_t *edns,
const knot_tsig_key_t *tsig_key,
const uint8_t *pin,
size_t pin_len,
}
tsig_init(&request->tsig, tsig_key);
+ request->edns = edns;
request->creds = creds;
if (flags & KNOT_REQUEST_QUIC && pin_len > 0) {
request->pin_len = pin_len;
const conf_remote_t *remote,
knot_pkt_t *query,
const struct knot_quic_creds *creds,
+ const query_edns_data_t *edns,
knot_request_flag_t flags)
{
if (remote->quic) {
}
return knot_request_make_generic(mm, &remote->addr, &remote->via,
- query, creds, &remote->key, remote->pin,
+ query, creds, edns, &remote->key, remote->pin,
remote->pin_len, flags);
}
{
knot_layer_produce(&req->layer, last->query);
+ if (last->edns != NULL && !last->edns->no_edns) {
+ int ret = query_put_edns(last->query, last->edns);
+ if (ret != KNOT_EOK) {
+ return ret;
+ }
+ }
+
int ret = tsig_sign_packet(&last->tsig, last->query);
if (ret != KNOT_EOK) {
return ret;
#include "knot/conf/conf.h"
#include "knot/nameserver/tsig_ctx.h"
#include "knot/query/layer.h"
+#include "knot/query/query.h"
#include "libknot/mm_ctx.h"
#include "libknot/rrtype/tsig.h"
struct sockaddr_storage remote, source;
knot_pkt_t *query;
knot_pkt_t *resp;
+ const query_edns_data_t *edns;
tsig_ctx_t tsig;
knot_sign_context_t sign; /*!< Required for async. DDNS processing. */
* \param source Source address (or NULL).
* \param query Query message.
* \param creds Local (server) credentials.
+ * \param edns EDNS parameters.
* \param tsig_key TSIG key for authentication.
* \param pin Possible remote certificate PIN.
* \param pin_len Length of the remote certificate PIN.
const struct sockaddr_storage *source,
knot_pkt_t *query,
const struct knot_quic_creds *creds,
+ const query_edns_data_t *edns,
const knot_tsig_key_t *tsig_key,
const uint8_t *pin,
size_t pin_len,
const conf_remote_t *remote,
knot_pkt_t *query,
const struct knot_quic_creds *creds,
+ const query_edns_data_t *edns,
knot_request_flag_t flags);
/*!
knot_request_flag_t flags = TFO ? KNOT_REQUEST_TFO: KNOT_REQUEST_NONE;
return knot_request_make_generic(requestor->mm, dst, src, pkt, NULL,
- NULL, NULL, 0, flags);
+ NULL, NULL, NULL, 0, flags);
}
static void test_disconnected(knot_requestor_t *requestor,