mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-29 13:38:26 +00:00
1879. [func] Added framework for handling multiple EDNS versions.
1878. [func] dig can now specify the EDNS version when making a query.
This commit is contained in:
parent
e37806ea92
commit
1fc4793844
5
CHANGES
5
CHANGES
@ -1,3 +1,8 @@
|
|||||||
|
1879. [func] Added framework for handling multiple EDNS versions.
|
||||||
|
|
||||||
|
1878. [func] dig can now specify the EDNS version when making
|
||||||
|
a query.
|
||||||
|
|
||||||
1868. [placeholder] rt14851
|
1868. [placeholder] rt14851
|
||||||
|
|
||||||
1867. [placeholder] rt14846
|
1867. [placeholder] rt14846
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: dig.c,v 1.203 2005/04/27 04:55:44 sra Exp $ */
|
/* $Id: dig.c,v 1.204 2005/06/07 00:15:58 marka Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@ -192,6 +192,7 @@ help(void) {
|
|||||||
" +domain=### (Set default domainname)\n"
|
" +domain=### (Set default domainname)\n"
|
||||||
" +bufsize=### (Set EDNS0 Max UDP packet size)\n"
|
" +bufsize=### (Set EDNS0 Max UDP packet size)\n"
|
||||||
" +ndots=### (Set NDOTS value)\n"
|
" +ndots=### (Set NDOTS value)\n"
|
||||||
|
" +edns=### (Set EDNS version)\n"
|
||||||
" +[no]search (Set whether to use searchlist)\n"
|
" +[no]search (Set whether to use searchlist)\n"
|
||||||
" +[no]defname (Ditto)\n"
|
" +[no]defname (Ditto)\n"
|
||||||
" +[no]recurse (Recursive mode)\n"
|
" +[no]recurse (Recursive mode)\n"
|
||||||
@ -854,6 +855,8 @@ plus_option(char *option, isc_boolean_t is_batchfile,
|
|||||||
break;
|
break;
|
||||||
case 'n': /* dnssec */
|
case 'n': /* dnssec */
|
||||||
FULLCHECK("dnssec");
|
FULLCHECK("dnssec");
|
||||||
|
if (state && lookup->edns == -1)
|
||||||
|
lookup->edns = 0;
|
||||||
lookup->dnssec = state;
|
lookup->dnssec = state;
|
||||||
break;
|
break;
|
||||||
case 'o': /* domain */
|
case 'o': /* domain */
|
||||||
@ -869,6 +872,16 @@ plus_option(char *option, isc_boolean_t is_batchfile,
|
|||||||
goto invalid_option;
|
goto invalid_option;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'e':
|
||||||
|
FULLCHECK("edns");
|
||||||
|
if (!state) {
|
||||||
|
lookup->edns = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (value == NULL)
|
||||||
|
goto need_value;
|
||||||
|
lookup->edns = (isc_int16_t) parse_uint(value, "edns", 255);
|
||||||
|
break;
|
||||||
case 'f': /* fail */
|
case 'f': /* fail */
|
||||||
FULLCHECK("fail");
|
FULLCHECK("fail");
|
||||||
lookup->servfail_stops = state;
|
lookup->servfail_stops = state;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
- PERFORMANCE OF THIS SOFTWARE.
|
- PERFORMANCE OF THIS SOFTWARE.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- $Id: dig.docbook,v 1.22 2005/05/13 01:35:38 marka Exp $ -->
|
<!-- $Id: dig.docbook,v 1.23 2005/06/07 00:15:58 marka Exp $ -->
|
||||||
<refentry>
|
<refentry>
|
||||||
|
|
||||||
<refentryinfo>
|
<refentryinfo>
|
||||||
@ -695,11 +695,22 @@
|
|||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Set the UDP message buffer size advertised using EDNS0 to
|
Set the UDP message buffer size advertised using EDNS0 to
|
||||||
<parameter>B</parameter> bytes. The maximum and
|
<parameter>B</parameter> bytes. The maximum and minimum sizes
|
||||||
minimum sizes of this
|
of this buffer are 65535 and 0 respectively. Values outside
|
||||||
buffer are 65535 and 0 respectively. Values outside this range
|
this range are rounded up or down appropriately.
|
||||||
are
|
Values other than zero will cause a EDNS query to be sent.
|
||||||
rounded up or down appropriately.
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>+edns=#</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Specify the EDNS version to query with. Valid values
|
||||||
|
are 0 to 255. Setting the EDNS version will cause a
|
||||||
|
EDNS query to be sent. <option>+noedns</option> clears the
|
||||||
|
remembered EDNS version.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: dighost.c,v 1.276 2005/06/01 01:56:49 marka Exp $ */
|
/* $Id: dighost.c,v 1.277 2005/06/07 00:15:58 marka Exp $ */
|
||||||
|
|
||||||
/*! \file
|
/*! \file
|
||||||
* \note
|
* \note
|
||||||
@ -702,6 +702,7 @@ make_empty_lookup(void) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
looknew->udpsize = 0;
|
looknew->udpsize = 0;
|
||||||
|
looknew->edns = -1;
|
||||||
looknew->recurse = ISC_TRUE;
|
looknew->recurse = ISC_TRUE;
|
||||||
looknew->aaonly = ISC_FALSE;
|
looknew->aaonly = ISC_FALSE;
|
||||||
looknew->adflag = ISC_FALSE;
|
looknew->adflag = ISC_FALSE;
|
||||||
@ -778,6 +779,7 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
looknew->udpsize = lookold->udpsize;
|
looknew->udpsize = lookold->udpsize;
|
||||||
|
looknew->edns = lookold->edns;
|
||||||
looknew->recurse = lookold->recurse;
|
looknew->recurse = lookold->recurse;
|
||||||
looknew->aaonly = lookold->aaonly;
|
looknew->aaonly = lookold->aaonly;
|
||||||
looknew->adflag = lookold->adflag;
|
looknew->adflag = lookold->adflag;
|
||||||
@ -1085,7 +1087,9 @@ setup_libs(void) {
|
|||||||
* options are UDP buffer size and the DO bit.
|
* options are UDP buffer size and the DO bit.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
add_opt(dns_message_t *msg, isc_uint16_t udpsize, isc_boolean_t dnssec) {
|
add_opt(dns_message_t *msg, isc_uint16_t udpsize, isc_uint16_t edns,
|
||||||
|
isc_boolean_t dnssec)
|
||||||
|
{
|
||||||
dns_rdataset_t *rdataset = NULL;
|
dns_rdataset_t *rdataset = NULL;
|
||||||
dns_rdatalist_t *rdatalist = NULL;
|
dns_rdatalist_t *rdatalist = NULL;
|
||||||
dns_rdata_t *rdata = NULL;
|
dns_rdata_t *rdata = NULL;
|
||||||
@ -1104,9 +1108,9 @@ add_opt(dns_message_t *msg, isc_uint16_t udpsize, isc_boolean_t dnssec) {
|
|||||||
rdatalist->type = dns_rdatatype_opt;
|
rdatalist->type = dns_rdatatype_opt;
|
||||||
rdatalist->covers = 0;
|
rdatalist->covers = 0;
|
||||||
rdatalist->rdclass = udpsize;
|
rdatalist->rdclass = udpsize;
|
||||||
rdatalist->ttl = 0;
|
rdatalist->ttl = edns << 16;
|
||||||
if (dnssec)
|
if (dnssec)
|
||||||
rdatalist->ttl = DNS_MESSAGEEXTFLAG_DO;
|
rdatalist->ttl |= DNS_MESSAGEEXTFLAG_DO;
|
||||||
rdata->data = NULL;
|
rdata->data = NULL;
|
||||||
rdata->length = 0;
|
rdata->length = 0;
|
||||||
ISC_LIST_INIT(rdatalist->rdata);
|
ISC_LIST_INIT(rdatalist->rdata);
|
||||||
@ -1829,10 +1833,13 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||||||
result = dns_message_renderbegin(lookup->sendmsg, &cctx,
|
result = dns_message_renderbegin(lookup->sendmsg, &cctx,
|
||||||
&lookup->sendbuf);
|
&lookup->sendbuf);
|
||||||
check_result(result, "dns_message_renderbegin");
|
check_result(result, "dns_message_renderbegin");
|
||||||
if (lookup->udpsize > 0 || lookup->dnssec) {
|
if (lookup->udpsize > 0 || lookup->dnssec || lookup->edns > -1) {
|
||||||
if (lookup->udpsize == 0)
|
if (lookup->udpsize == 0)
|
||||||
lookup->udpsize = 2048;
|
lookup->udpsize = 2048;
|
||||||
add_opt(lookup->sendmsg, lookup->udpsize, lookup->dnssec);
|
if (lookup->edns < 0)
|
||||||
|
lookup->edns = 0;
|
||||||
|
add_opt(lookup->sendmsg, lookup->udpsize,
|
||||||
|
lookup->edns, lookup->dnssec);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = dns_message_rendersection(lookup->sendmsg,
|
result = dns_message_rendersection(lookup->sendmsg,
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: dig.h,v 1.91 2005/04/27 04:55:45 sra Exp $ */
|
/* $Id: dig.h,v 1.92 2005/06/07 00:15:59 marka Exp $ */
|
||||||
|
|
||||||
#ifndef DIG_H
|
#ifndef DIG_H
|
||||||
#define DIG_H
|
#define DIG_H
|
||||||
@ -180,6 +180,7 @@ isc_boolean_t sigchase;
|
|||||||
isc_uint32_t retries;
|
isc_uint32_t retries;
|
||||||
int nsfound;
|
int nsfound;
|
||||||
isc_uint16_t udpsize;
|
isc_uint16_t udpsize;
|
||||||
|
isc_int16_t edns;
|
||||||
isc_uint32_t ixfr_serial;
|
isc_uint32_t ixfr_serial;
|
||||||
isc_buffer_t rdatabuf;
|
isc_buffer_t rdatabuf;
|
||||||
char rdatastore[MXNAME];
|
char rdatastore[MXNAME];
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: client.c,v 1.227 2005/06/04 05:32:46 jinmei Exp $ */
|
/* $Id: client.c,v 1.228 2005/06/07 00:15:59 marka Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@ -574,6 +574,7 @@ ns_client_endrequest(ns_client_t *client) {
|
|||||||
|
|
||||||
client->udpsize = 512;
|
client->udpsize = 512;
|
||||||
client->extflags = 0;
|
client->extflags = 0;
|
||||||
|
client->ednsversion = -1;
|
||||||
dns_message_reset(client->message, DNS_MESSAGE_INTENTPARSE);
|
dns_message_reset(client->message, DNS_MESSAGE_INTENTPARSE);
|
||||||
|
|
||||||
if (client->recursionquota != NULL)
|
if (client->recursionquota != NULL)
|
||||||
@ -1363,8 +1364,6 @@ client_request(isc_task_t *task, isc_event_t *event) {
|
|||||||
*/
|
*/
|
||||||
opt = dns_message_getopt(client->message);
|
opt = dns_message_getopt(client->message);
|
||||||
if (opt != NULL) {
|
if (opt != NULL) {
|
||||||
unsigned int version;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the client's UDP buffer size.
|
* Set the client's UDP buffer size.
|
||||||
*/
|
*/
|
||||||
@ -1382,6 +1381,19 @@ client_request(isc_task_t *task, isc_event_t *event) {
|
|||||||
*/
|
*/
|
||||||
client->extflags = (isc_uint16_t)(opt->ttl & 0xFFFF);
|
client->extflags = (isc_uint16_t)(opt->ttl & 0xFFFF);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do we understand this version of EDNS?
|
||||||
|
*
|
||||||
|
* XXXRTH need library support for this!
|
||||||
|
*/
|
||||||
|
client->ednsversion = (opt->ttl & 0x00FF0000) >> 16;
|
||||||
|
if (client->ednsversion > 0) {
|
||||||
|
result = client_addopt(client);
|
||||||
|
if (result == ISC_R_SUCCESS)
|
||||||
|
result = DNS_R_BADVERS;
|
||||||
|
ns_client_error(client, result);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Create an OPT for our reply.
|
* Create an OPT for our reply.
|
||||||
*/
|
*/
|
||||||
@ -1390,17 +1402,6 @@ client_request(isc_task_t *task, isc_event_t *event) {
|
|||||||
ns_client_error(client, result);
|
ns_client_error(client, result);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Do we understand this version of ENDS?
|
|
||||||
*
|
|
||||||
* XXXRTH need library support for this!
|
|
||||||
*/
|
|
||||||
version = (opt->ttl & 0x00FF0000) >> 16;
|
|
||||||
if (version != 0) {
|
|
||||||
ns_client_error(client, DNS_R_BADVERS);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client->message->rdclass == 0) {
|
if (client->message->rdclass == 0) {
|
||||||
@ -1776,6 +1777,7 @@ client_create(ns_clientmgr_t *manager, ns_client_t **clientp) {
|
|||||||
client->opt = NULL;
|
client->opt = NULL;
|
||||||
client->udpsize = 512;
|
client->udpsize = 512;
|
||||||
client->extflags = 0;
|
client->extflags = 0;
|
||||||
|
client->ednsversion = -1;
|
||||||
client->next = NULL;
|
client->next = NULL;
|
||||||
client->shutdown = NULL;
|
client->shutdown = NULL;
|
||||||
client->shutdown_arg = NULL;
|
client->shutdown_arg = NULL;
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: client.h,v 1.73 2005/04/27 04:55:56 sra Exp $ */
|
/* $Id: client.h,v 1.74 2005/06/07 00:16:00 marka Exp $ */
|
||||||
|
|
||||||
#ifndef NAMED_CLIENT_H
|
#ifndef NAMED_CLIENT_H
|
||||||
#define NAMED_CLIENT_H 1
|
#define NAMED_CLIENT_H 1
|
||||||
@ -116,6 +116,7 @@ struct ns_client {
|
|||||||
dns_rdataset_t * opt;
|
dns_rdataset_t * opt;
|
||||||
isc_uint16_t udpsize;
|
isc_uint16_t udpsize;
|
||||||
isc_uint16_t extflags;
|
isc_uint16_t extflags;
|
||||||
|
isc_int16_t ednsversion; /* -1 noedns */
|
||||||
void (*next)(ns_client_t *);
|
void (*next)(ns_client_t *);
|
||||||
void (*shutdown)(void *arg, isc_result_t result);
|
void (*shutdown)(void *arg, isc_result_t result);
|
||||||
void *shutdown_arg;
|
void *shutdown_arg;
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: resolver.h,v 1.44 2005/04/27 04:56:59 sra Exp $ */
|
/* $Id: resolver.h,v 1.45 2005/06/07 00:16:01 marka Exp $ */
|
||||||
|
|
||||||
#ifndef DNS_RESOLVER_H
|
#ifndef DNS_RESOLVER_H
|
||||||
#define DNS_RESOLVER_H 1
|
#define DNS_RESOLVER_H 1
|
||||||
@ -91,6 +91,10 @@ typedef struct dns_fetchevent {
|
|||||||
#define DNS_FETCHOPT_FORWARDONLY 0x10 /*%< Only use forwarders. */
|
#define DNS_FETCHOPT_FORWARDONLY 0x10 /*%< Only use forwarders. */
|
||||||
#define DNS_FETCHOPT_NOVALIDATE 0x20 /*%< Disable validation. */
|
#define DNS_FETCHOPT_NOVALIDATE 0x20 /*%< Disable validation. */
|
||||||
|
|
||||||
|
#define DNS_FETCHOPT_EDNSVERSIONSET 0x00800000
|
||||||
|
#define DNS_FETCHOPT_EDNSVERSIONMASK 0xff000000
|
||||||
|
#define DNS_FETCHOPT_EDNSVERSIONSHIFT 24
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXXRTH Should this API be made semi-private? (I.e.
|
* XXXRTH Should this API be made semi-private? (I.e.
|
||||||
* _dns_resolver_create()).
|
* _dns_resolver_create()).
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: resolver.c,v 1.308 2005/06/04 05:32:47 jinmei Exp $ */
|
/* $Id: resolver.c,v 1.309 2005/06/07 00:16:00 marka Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@ -841,7 +841,7 @@ resquery_senddone(isc_task_t *task, isc_event_t *event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline isc_result_t
|
static inline isc_result_t
|
||||||
fctx_addopt(dns_message_t *message, dns_resolver_t *res) {
|
fctx_addopt(dns_message_t *message, unsigned int version, dns_resolver_t *res) {
|
||||||
dns_rdataset_t *rdataset;
|
dns_rdataset_t *rdataset;
|
||||||
dns_rdatalist_t *rdatalist;
|
dns_rdatalist_t *rdatalist;
|
||||||
dns_rdata_t *rdata;
|
dns_rdata_t *rdata;
|
||||||
@ -870,9 +870,10 @@ fctx_addopt(dns_message_t *message, dns_resolver_t *res) {
|
|||||||
rdatalist->rdclass = res->udpsize;
|
rdatalist->rdclass = res->udpsize;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set EXTENDED-RCODE, VERSION, and Z to 0, and the DO bit to 1.
|
* Set EXTENDED-RCODE and Z to 0, DO to 1.
|
||||||
*/
|
*/
|
||||||
rdatalist->ttl = DNS_MESSAGEEXTFLAG_DO;
|
rdatalist->ttl = (version << 16);
|
||||||
|
rdatalist->ttl |= DNS_MESSAGEEXTFLAG_DO;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No EDNS options.
|
* No EDNS options.
|
||||||
@ -1233,7 +1234,14 @@ resquery_send(resquery_t *query) {
|
|||||||
|
|
||||||
if ((query->options & DNS_FETCHOPT_NOEDNS0) == 0) {
|
if ((query->options & DNS_FETCHOPT_NOEDNS0) == 0) {
|
||||||
if ((query->addrinfo->flags & DNS_FETCHOPT_NOEDNS0) == 0) {
|
if ((query->addrinfo->flags & DNS_FETCHOPT_NOEDNS0) == 0) {
|
||||||
result = fctx_addopt(fctx->qmessage, res);
|
unsigned int version = 0; /* Default version. */
|
||||||
|
unsigned int flags;
|
||||||
|
flags = query->addrinfo->flags;
|
||||||
|
if ((flags & DNS_FETCHOPT_EDNSVERSIONSET) != 0) {
|
||||||
|
version = flags & DNS_FETCHOPT_EDNSVERSIONMASK;
|
||||||
|
version >>= DNS_FETCHOPT_EDNSVERSIONSHIFT;
|
||||||
|
}
|
||||||
|
result = fctx_addopt(fctx->qmessage, version, res);
|
||||||
if (result != ISC_R_SUCCESS) {
|
if (result != ISC_R_SUCCESS) {
|
||||||
/*
|
/*
|
||||||
* We couldn't add the OPT, but we'll press on.
|
* We couldn't add the OPT, but we'll press on.
|
||||||
@ -5277,6 +5285,28 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
|
|||||||
* for this fetch.
|
* for this fetch.
|
||||||
*/
|
*/
|
||||||
result = DNS_R_YXDOMAIN;
|
result = DNS_R_YXDOMAIN;
|
||||||
|
} else if (message->rcode == dns_rcode_badvers) {
|
||||||
|
dns_rdataset_t *opt;
|
||||||
|
unsigned int flags, mask;
|
||||||
|
unsigned int version;
|
||||||
|
|
||||||
|
resend = ISC_TRUE;
|
||||||
|
opt = dns_message_getopt(message);
|
||||||
|
version = (opt->ttl >> 16) & 0xff;
|
||||||
|
flags = (version << DNS_FETCHOPT_EDNSVERSIONSHIFT) |
|
||||||
|
DNS_FETCHOPT_EDNSVERSIONSET;
|
||||||
|
mask = DNS_FETCHOPT_EDNSVERSIONMASK |
|
||||||
|
DNS_FETCHOPT_EDNSVERSIONSET;
|
||||||
|
switch (version) {
|
||||||
|
case 0:
|
||||||
|
dns_adb_changeflags(fctx->adb, query->addrinfo,
|
||||||
|
flags, mask);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
broken_server = DNS_R_BADVERS;
|
||||||
|
keep_trying = ISC_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* XXXRTH log.
|
* XXXRTH log.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user