blob: 7441c049d81f88b2b6f539fd1021f5e54c713be8 [file] [log] [blame]
/*
* Copyright (c) 2016 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "dns_pack.h"
#include <stdio.h>
#include <errno.h>
int dns_print_msg_header(uint8_t *header, int size)
{
if (size < DNS_MSG_HEADER_SIZE) {
return -ENOMEM;
}
printf("\nHeader\n");
printf("\tFlags\n");
printf("\t\tTransaction ID:\t\t%d\n", dns_header_id(header));
printf("\t\tMessage type:\t\t%d (%s)\n", dns_header_qr(header),
(dns_header_qr(header) == DNS_QUERY ? "query" : "response"));
printf("\t\tOperation code:\t\t%d (%s)\n", dns_header_opcode(header),
(dns_header_opcode(header) == DNS_QUERY ? "query" : "other"));
printf("\t\tAuthoritative:\t\t%d (%s)\n", dns_header_aa(header),
(dns_header_aa(header) ? "true" : "false"));
printf("\t\tTruncated:\t\t%d (%s)\n", dns_header_tc(header),
(dns_header_tc(header) ? "true" : "false"));
printf("\t\tRecursion desired:\t%d (%s)\n", dns_header_rd(header),
(dns_header_rd(header) ? "true" : "false"));
printf("\t\tRecursion avaialable:\t%d (%s)\n", dns_header_ra(header),
(dns_header_ra(header) ? "true" : "false"));
printf("\t\tZ:\t\t\t%d\n", dns_header_z(header));
printf("\t\tResponse code:\t\t%d (%s)\n", dns_header_rcode(header),
(dns_header_rcode(header) == 0 ? "no error" : "error"));
printf("\tQuestion counter:\t%d\n", dns_header_qdcount(header));
printf("\tAnswer counter:\t\t%d\n", dns_header_ancount(header));
printf("\tNServer counter:\t%d\n", dns_header_nscount(header));
printf("\tAdditional counter:\t%d\n", dns_header_arcount(header));
return 0;
}
int dns_print_label(uint8_t *label, int size)
{
int n;
int i;
i = 0;
while (i < size) {
n = label[i];
if (n == 0) {
break;
} else if (n > 63) {
break;
} else if (i + n <= size) {
if (i) {
printf(".");
}
int j = i + 1; /* next char */
while (j < i + 1 + n) {
printf("%c", label[j]);
j++;
}
i += n + 1; /* content + octect size */
} else {
i = 0; /* no memory! */
break;
}
}
if (i == 0) {
return -ENOMEM;
}
return 0;
}
int dns_print_msg_query(uint8_t *qname, int qname_size, int qtype, int qclass)
{
printf("\nQuery\n");
printf("\tQuery name\n\t\tLabel size:\t%d\n\t\tDomain name:\t",
qname_size);
dns_print_label(qname, qname_size);
printf("\n");
printf("\tQuery type:\t\t%d\n", qtype);
printf("\tQuery class:\t\t%d\n", qclass);
return 0;
}
int dns_print_readable_msg_label(int offset, uint8_t *buf, int size)
{
int next;
int i;
int j;
for (i = offset; i < size;) {
if (buf[i] <= 63) {
/* +1 because the null label or a pointer */
if (i + buf[i] + 1 >= size) {
return -ENOMEM;
}
for (j = 1; j <= buf[i]; j++) {
printf("%c", buf[i + j]);
}
i += buf[i] + 1;
if (buf[i] == 0) {
break;
}
printf(".");
} else {
if (i + 1 >= size) {
return -ENOMEM;
}
next = ((buf[i] & 0x3F) << 8) + buf[i + 1];
if (next >= size) {
return -ENOMEM;
}
i = next;
offset = next;
}
}
return 0;
}
int print_buf(uint8_t *buf, size_t size)
{
size_t i;
for (i = 0; i < size; i++) {
printf("%d ", buf[i]);
}
return 0;
}
int print_app_buf(struct app_buf_t *buf)
{
print_buf(buf->buf, buf->length);
return 0;
}