/*
* Copyright (C) 2000, 2001 Nominum, Inc.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* Copyright (C) 2004 - 2015 Nominum, Inc.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose with or without fee is hereby granted,
* provided that the above copyright notice and this permission notice
* appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ISC_BUFFER_USEINLINE
#include <dns/callbacks.h>
#include <dns/fixedname.h>
#include <dns/rdataclass.h>
#include <dns/rdatatype.h>
#include "dns.h"
#include "log.h"
#include "opt.h"
const char *perf_dns_rcode_strings[] = {
"NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN",
"NOTIMP", "REFUSED", "YXDOMAIN", "YXRRSET",
"NXRRSET", "NOTAUTH", "NOTZONE", "rcode11",
"rcode12", "rcode13", "rcode14", "rcode15"
};
typedef enum {
} hmac_type_t;
typedef union {
} hmac_ctx_t;
struct perf_dnstsigkey {
unsigned int digestlen;
};
struct perf_dnsctx {
};
{
if (!updates)
return NULL;
if (result != ISC_R_SUCCESS)
perf_log_fatal("creating memory context: %s",
perf_log_fatal("out of memory");
if (result != ISC_R_SUCCESS) {
perf_log_fatal("creating compression context: %s",
}
if (result != ISC_R_SUCCESS) {
perf_log_fatal("creating lexer: %s",
}
return (ctx);
}
void
{
return;
}
static isc_result_t
{
if (result != ISC_R_SUCCESS)
return result;
}
} while (0)
{
perf_log_fatal("out of memory");
perf_log_warning("invalid TSIG [alg:]name:secret");
exit(1);
}
/* name:key */
alglen = 0;
} else {
/* [alg:]name:secret */
}
/* Algorithm */
} else {
exit(1);
}
/* Name */
NULL, "TSIG key");
if (result != ISC_R_SUCCESS) {
exit(1);
}
/* Secret */
sizeof(tsigkey->secretdata));
if (result != ISC_R_SUCCESS) {
exit(1);
}
return tsigkey;
}
void
{
}
/*
* Appends an OPT record to the packet.
*/
static isc_result_t
unsigned char *base;
perf_log_warning("failed to add OPT to query packet");
return (ISC_R_NOSPACE);
}
if (dnssec) /* flags */
else
return (ISC_R_SUCCESS);
}
static void
{
unsigned char *secret;
unsigned int length;
case TSIG_HMACMD5:
break;
case TSIG_HMACSHA1:
break;
case TSIG_HMACSHA224:
break;
case TSIG_HMACSHA256:
break;
case TSIG_HMACSHA384:
break;
case TSIG_HMACSHA512:
break;
}
}
static void
{
case TSIG_HMACMD5:
break;
case TSIG_HMACSHA1:
break;
case TSIG_HMACSHA224:
break;
case TSIG_HMACSHA256:
break;
case TSIG_HMACSHA384:
break;
case TSIG_HMACSHA512:
break;
}
}
static void
unsigned int digestlen)
{
case TSIG_HMACMD5:
break;
case TSIG_HMACSHA1:
break;
case TSIG_HMACSHA224:
break;
case TSIG_HMACSHA256:
break;
case TSIG_HMACSHA384:
break;
case TSIG_HMACSHA512:
break;
}
}
/*
* Appends a TSIG record to the packet.
*/
static isc_result_t
{
unsigned char *base;
/* Make sure everything will fit */
perf_log_warning("adding TSIG: out of space");
return (ISC_R_NOSPACE);
}
/* Digest the message */
/* Digest the TSIG record */
/* Add the TSIG record. */
return (ISC_R_SUCCESS);
}
static isc_result_t
{
char *domain_str;
int domain_len;
/* Create the question section */
msg, "domain");
if (result != ISC_R_SUCCESS)
return (result);
return (ISC_R_FAILURE);
}
if (result != ISC_R_SUCCESS) {
perf_log_warning("invalid query type: %.*s",
return (ISC_R_FAILURE);
}
return ISC_R_SUCCESS;
}
static isc_boolean_t
{
}
/*
* Reads one line containing an individual update for a dynamic update message.
*/
static isc_result_t
{
char *curr_str;
unsigned int curr_len;
str++;
/* Read the owner name */
"owner");
if (result != ISC_R_SUCCESS)
return (result);
str++;
/* Read the ttl */
if (want_ttl) {
if (result != ISC_R_SUCCESS) {
perf_log_warning("invalid ttl: %.*s",
return (result);
}
str++;
}
/* Read the type */
if (curr_len == 0) {
if (!need_type)
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
}
if (result != ISC_R_SUCCESS) {
return (result);
}
str++;
/* Read the rdata */
if (!want_rdata)
return (ISC_R_SUCCESS);
if (*str == 0) {
if (!need_rdata)
return (ISC_R_SUCCESS);
return (ISC_R_FAILURE);
}
if (result != ISC_R_SUCCESS) {
perf_log_warning("setting up lexer: %s",
return (result);
}
&callbacks);
if (result != ISC_R_SUCCESS) {
return (result);
}
return (ISC_R_SUCCESS);
}
/*
* Reads a complete dynamic update message and sends it.
*/
static isc_result_t
{
char *msgbase;
char *str;
int updates = 0;
int prereqs = 0;
/* Reset compression context */
/* Initialize */
/* Parse zone name */
NULL, "zone");
if (result != ISC_R_SUCCESS)
goto done;
/* Render zone section */
if (result != ISC_R_SUCCESS) {
perf_log_warning("error rendering zone name: %s",
goto done;
}
while (ISC_TRUE) {
perf_log_warning("warning: incomplete update");
goto done;
}
ttl = 0;
rdlen = 0;
break;
if (isc_buffer_usedlength(&rdatabuf) > 0)
else
if (isc_buffer_usedlength(&rdatabuf) > 0)
else
} else {
perf_log_warning("invalid update command: %s",
}
if (result != ISC_R_SUCCESS)
goto done;
perf_log_warning("prereqs must precede updates");
goto done;
}
/* Render record */
if (result != ISC_R_SUCCESS) {
perf_log_warning("rendering record name: %s",
goto done;
}
perf_log_warning("out of space in message buffer");
goto done;
}
if (rdlen > 0) {
if (result != ISC_R_SUCCESS) {
perf_log_warning("rendering rdata: %s",
goto done;
}
}
if (is_update)
updates++;
else
prereqs++;
}
done:
return result;
}
{
unsigned int flags;
else
/* Create the DNS packet header */
} else {
}
if (result != ISC_R_SUCCESS)
return (result);
if (edns) {
if (result != ISC_R_SUCCESS)
return (result);
}
if (result != ISC_R_SUCCESS)
return (result);
}
return (ISC_R_SUCCESS);
}