mirror of
https://github.com/NLnetLabs/unbound.git
synced 2026-08-20 06:35:49 +02:00
Merge branch 'master' into disable-edns-do
This commit is contained in:
@@ -61,6 +61,17 @@ Specify the server to send the queries to. If not specified localhost (127.0.0.1
|
||||
.B \-d \fIsecs
|
||||
Delay after the connection before sending query. This tests the timeout
|
||||
on the other side, eg. if shorter the connection is closed.
|
||||
.TP
|
||||
.B \-p \fIclient
|
||||
Use proxy protocol to send the query. Specify the ipaddr@portnr of the client
|
||||
to include in PROXYv2.
|
||||
.TP
|
||||
.B IXFR=serial
|
||||
Pass the type of the query as IXFR=N to send an IXFR query with serial N.
|
||||
.TP
|
||||
.B NOTIFY[=serial]
|
||||
Pass the type of the query as NOTIFY[=N] to send a notify packet. The serial N
|
||||
of the new zone can be included.
|
||||
.SH "EXAMPLES"
|
||||
.LP
|
||||
Some examples of use.
|
||||
|
||||
+68
-6
@@ -79,6 +79,8 @@ static void usage(char* argv[])
|
||||
printf("-d secs delay after connection before sending query\n");
|
||||
printf("-s use ssl\n");
|
||||
printf("-h this help text\n");
|
||||
printf("IXFR=N for the type, sends ixfr query with serial N.\n");
|
||||
printf("NOTIFY[=N] for the type, sends notify. Can set new zone serial N.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -115,6 +117,29 @@ open_svr(const char* svr, int udp, struct sockaddr_storage* addr,
|
||||
return fd;
|
||||
}
|
||||
|
||||
/** Append a SOA record with serial number */
|
||||
static void
|
||||
write_soa_serial_to_buf(sldns_buffer* buf, struct query_info* qinfo,
|
||||
uint32_t serial)
|
||||
{
|
||||
sldns_buffer_set_position(buf, sldns_buffer_limit(buf));
|
||||
sldns_buffer_set_limit(buf, sldns_buffer_capacity(buf));
|
||||
/* Write compressed reference to the query */
|
||||
sldns_buffer_write_u16(buf, PTR_CREATE(LDNS_HEADER_SIZE));
|
||||
sldns_buffer_write_u16(buf, LDNS_RR_TYPE_SOA);
|
||||
sldns_buffer_write_u16(buf, qinfo->qclass);
|
||||
sldns_buffer_write_u32(buf, 3600); /* TTL */
|
||||
sldns_buffer_write_u16(buf, 1+1+4*5); /* rdatalen */
|
||||
sldns_buffer_write_u8(buf, 0); /* primary "." */
|
||||
sldns_buffer_write_u8(buf, 0); /* email "." */
|
||||
sldns_buffer_write_u32(buf, serial); /* serial */
|
||||
sldns_buffer_write_u32(buf, 0); /* refresh */
|
||||
sldns_buffer_write_u32(buf, 0); /* retry */
|
||||
sldns_buffer_write_u32(buf, 0); /* expire */
|
||||
sldns_buffer_write_u32(buf, 0); /* minimum */
|
||||
sldns_buffer_flip(buf);
|
||||
}
|
||||
|
||||
/** write a query over the TCP fd */
|
||||
static void
|
||||
write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
|
||||
@@ -123,6 +148,8 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
|
||||
{
|
||||
struct query_info qinfo;
|
||||
size_t proxy_buf_limit = sldns_buffer_limit(proxy_buf);
|
||||
int have_serial = 0, is_notify = 0;
|
||||
uint32_t serial = 0;
|
||||
/* qname */
|
||||
qinfo.qname = sldns_str2wire_dname(strname, &qinfo.qname_len);
|
||||
if(!qinfo.qname) {
|
||||
@@ -130,12 +157,27 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* qtype and qclass */
|
||||
qinfo.qtype = sldns_get_rr_type_by_name(strtype);
|
||||
if(qinfo.qtype == 0 && strcmp(strtype, "TYPE0") != 0) {
|
||||
printf("cannot parse query type: '%s'\n", strtype);
|
||||
exit(1);
|
||||
/* qtype */
|
||||
if(strncasecmp(strtype, "IXFR=", 5) == 0) {
|
||||
serial = (uint32_t)atoi(strtype+5);
|
||||
have_serial = 1;
|
||||
qinfo.qtype = LDNS_RR_TYPE_IXFR;
|
||||
} else if(strcasecmp(strtype, "NOTIFY") == 0) {
|
||||
is_notify = 1;
|
||||
qinfo.qtype = LDNS_RR_TYPE_SOA;
|
||||
} else if(strncasecmp(strtype, "NOTIFY=", 7) == 0) {
|
||||
serial = (uint32_t)atoi(strtype+7);
|
||||
have_serial = 1;
|
||||
is_notify = 1;
|
||||
qinfo.qtype = LDNS_RR_TYPE_SOA;
|
||||
} else {
|
||||
qinfo.qtype = sldns_get_rr_type_by_name(strtype);
|
||||
if(qinfo.qtype == 0 && strcmp(strtype, "TYPE0") != 0) {
|
||||
printf("cannot parse query type: '%s'\n", strtype);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
/* qclass */
|
||||
qinfo.qclass = sldns_get_rr_class_by_name(strclass);
|
||||
if(qinfo.qclass == 0 && strcmp(strclass, "CLASS0") != 0) {
|
||||
printf("cannot parse query class: '%s'\n", strclass);
|
||||
@@ -150,6 +192,21 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
|
||||
sldns_buffer_write_u16_at(buf, 0, id);
|
||||
sldns_buffer_write_u16_at(buf, 2, BIT_RD);
|
||||
|
||||
if(have_serial && qinfo.qtype == LDNS_RR_TYPE_IXFR) {
|
||||
/* Attach serial to SOA record in the authority section. */
|
||||
write_soa_serial_to_buf(buf, &qinfo, serial);
|
||||
LDNS_NSCOUNT_SET(sldns_buffer_begin(buf), 1);
|
||||
}
|
||||
if(is_notify) {
|
||||
LDNS_OPCODE_SET(sldns_buffer_begin(buf), LDNS_PACKET_NOTIFY);
|
||||
LDNS_RD_CLR(sldns_buffer_begin(buf));
|
||||
LDNS_AA_SET(sldns_buffer_begin(buf));
|
||||
if(have_serial) {
|
||||
write_soa_serial_to_buf(buf, &qinfo, serial);
|
||||
LDNS_ANCOUNT_SET(sldns_buffer_begin(buf), 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(1) {
|
||||
/* add EDNS DO */
|
||||
struct edns_data edns;
|
||||
@@ -361,6 +418,7 @@ static int parse_pp2_client(const char* pp2_client, int udp,
|
||||
sldns_buffer* proxy_buf)
|
||||
{
|
||||
struct sockaddr_storage pp2_addr;
|
||||
size_t bytes_written;
|
||||
socklen_t pp2_addrlen = 0;
|
||||
memset(&pp2_addr, 0, sizeof(pp2_addr));
|
||||
if(*pp2_client == 0) return 0;
|
||||
@@ -369,7 +427,9 @@ static int parse_pp2_client(const char* pp2_client, int udp,
|
||||
exit(1);
|
||||
}
|
||||
sldns_buffer_clear(proxy_buf);
|
||||
pp2_write_to_buf(proxy_buf, &pp2_addr, !udp);
|
||||
bytes_written = pp2_write_to_buf(sldns_buffer_begin(proxy_buf),
|
||||
sldns_buffer_remaining(proxy_buf), &pp2_addr, !udp);
|
||||
sldns_buffer_set_position(proxy_buf, bytes_written);
|
||||
sldns_buffer_flip(proxy_buf);
|
||||
return 1;
|
||||
}
|
||||
@@ -541,6 +601,8 @@ int main(int argc, char** argv)
|
||||
break;
|
||||
case 'p':
|
||||
pp2_client = optarg;
|
||||
pp_init(&sldns_write_uint16,
|
||||
&sldns_write_uint32);
|
||||
break;
|
||||
case 'a':
|
||||
onarrival = 1;
|
||||
|
||||
Reference in New Issue
Block a user