1276. [contrib] 'queryperf' now has EDNS (-e) + DNSSEC DO (-D) support.

This commit is contained in:
Mark Andrews 2002-04-30 00:11:55 +00:00
parent c99d9017ba
commit 8ac1acc30d
2 changed files with 42 additions and 5 deletions

View file

@ -1,3 +1,5 @@
1276. [contrib] 'queryperf' now has EDNS (-e) + DNSSEC DO (-D) support.
1275. [bug] When verifying that an NXT proves nonexistence, check
the rcode of the message and only do the matching NXT
check. That is, for NXDOMAIN responses, check that

View file

@ -18,7 +18,7 @@
/***
*** DNS Query Performance Testing Tool (queryperf.c)
***
*** Version $Id: queryperf.c,v 1.3 2002/03/11 19:00:01 gson Exp $
*** Version $Id: queryperf.c,v 1.4 2002/04/30 00:11:55 marka Exp $
***
*** Stephen Jacob <sj@nominum.com>
***/
@ -61,6 +61,7 @@
#define MAX_BUFFER_LEN 8192 /* in bytes */
#define HARD_TIMEOUT_EXTRA 5 /* in seconds */
#define RESPONSE_BLOCKING_WAIT_TIME 0.1 /* in seconds */
#define EDNSLEN 11
#define FALSE 0
#define TRUE 1
@ -120,6 +121,7 @@ unsigned int run_timelimit; /* init 0 */
int serverset = FALSE, portset = FALSE;
int queriesset = FALSE, timeoutset = FALSE;
int edns = FALSE, dnssec = FALSE;
int verbose = FALSE;
@ -167,7 +169,7 @@ void
show_startup_info(void) {
printf("\n"
"DNS Query Performance Testing Tool\n"
"Version: $Id: queryperf.c,v 1.3 2002/03/11 19:00:01 gson Exp $\n"
"Version: $Id: queryperf.c,v 1.4 2002/04/30 00:11:55 marka Exp $\n"
"\n");
}
@ -190,6 +192,8 @@ show_usage(void) {
" -l specifies how a limit for how long to run tests in seconds (no default)\n"
" -1 run through input only once (default: multiple iff limit given)\n"
" -b set input/output buffer size in kilobytes (default: %d k)\n"
" -e enable EDNS 0\n"
" -D set the DNSSEC OK bit (implies EDNS)\n"
" -v verbose: report the RCODE of each response on stdout\n"
"\n",
DEF_SERVER_TO_QUERY, DEF_SERVER_PORT,
@ -407,7 +411,7 @@ parse_args(int argc, char **argv) {
int c;
unsigned int uint_arg_val;
while ((c = getopt(argc, argv, "q:t:nd:s:p:1l:b:v")) != -1) {
while ((c = getopt(argc, argv, "q:t:nd:s:p:1l:b:eDv")) != -1) {
switch (c) {
case 'q':
if (is_uint(optarg, &uint_arg_val) == TRUE) {
@ -494,6 +498,13 @@ parse_args(int argc, char **argv) {
return (-1);
}
break;
case 'e':
edns = TRUE;
break;
case 'D':
dnssec = TRUE;
edns = TRUE;
break;
case 'v':
verbose = 1;
break;
@ -991,7 +1002,7 @@ parse_query(char *input, char *qname, int qnlen, int *qtype) {
type_str = strtok(NULL, WHITESPACE);
if ((domain_str == NULL) || (type_str == NULL)) {
fprintf(stderr, "Invalid query input format: %s", input);
fprintf(stderr, "Invalid query input format: %s\n", input);
return (-1);
}
@ -1001,7 +1012,7 @@ parse_query(char *input, char *qname, int qnlen, int *qtype) {
}
for (index = 0; (index < num_types) && (found == FALSE); index++) {
if (strcmp(type_str, qtype_strings[index]) == 0) {
if (strcasecmp(type_str, qtype_strings[index]) == 0) {
*qtype = qtype_codes[index];
found = TRUE;
}
@ -1040,6 +1051,30 @@ dispatch_query(unsigned short int id, char *dom, int qt) {
dom, qt);
return (-1);
}
if (edns) {
unsigned char *p;
if (buffer_len + EDNSLEN >= PACKETSZ) {
fprintf(stderr, "Failed to add OPT to query packet\n");
return (-1);
}
packet_buffer[11] = 1;
p = &packet_buffer[buffer_len];
*p++ = 0; /* root name */
*p++ = 0;
*p++ = 41; /* OPT */
*p++ = 16;
*p++ = 0; /* UDP payload size (4K) */
*p++ = 0; /* extended rcode */
*p++ = 0; /* version */
if (dnssec)
*p++ = 0x80; /* upper flag bits - DO set */
else
*p++ = 0; /* upper flag bits */
*p++ = 0; /* lower flag bit */
*p++ = 0;
*p++ = 0; /* rdlen == 0 */
buffer_len += EDNSLEN;
}
packet_buffer[0] = id_ptr[0];
packet_buffer[1] = id_ptr[1];