Newer
Older
#ifndef DNS_H
#define DNS_H
#include "config.h"
#define DNS_PORT 53
#define MAX_EXT_HDR 8
#define MAX_DNS_ANS_RECORD 20
#define DELIM "."
#define T_A 1
#define T_CNAME 5
#define T_PTR 12
/*
* The DNS header structure
*/
struct dnshdr {
uint16_t id;
uint16_t flags;
uint16_t qdcount;
uint16_t ancount;
uint16_t nscount;
uint16_t arcount;
} __attribute__((packed));
struct DNS_HEADER {
unsigned short id; // identification number
unsigned char rd :1; // recursion desired
unsigned char tc :1; // truncated message
unsigned char aa :1; // authoritative answer
unsigned char opcode :4; // purpose of message
unsigned char qr :1; // query/response flag
unsigned char rcode :4; // response code
unsigned char cd :1; // checking disabled
unsigned char ad :1; // authenticated data
unsigned char z :1; // its z! reserved
unsigned char ra :1; // recursion available
unsigned short q_count; // number of question entries
unsigned short ans_count; // number of answer entries
unsigned short auth_count; // number of authority entries
unsigned short add_count; // number of resource entries
};
#pragma pack(push, 1)
struct R_DATA {
unsigned short type;
unsigned short _class;
unsigned int ttl;
unsigned short data_len;
};
#pragma pack(pop)
//Pointers to resource record contents
struct RES_RECORD {
unsigned char *name;
struct R_DATA *resource;
unsigned char *rdata;
};
//Constant sized fields of query structure
struct QUESTION {
unsigned short qtype;
unsigned short qclass;
};
void parse_dns_response(unsigned char *data_p);
#endif