Smart Home firewall
Profile-based Smart Home firewall
dns.h
1 
11 #ifndef _PROTOCOL_PARSERS_DNS_
12 #define _PROTOCOL_PARSERS_DNS_
13 
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <stdint.h>
17 #include <stdbool.h>
18 #include <string.h>
19 #include <unistd.h>
20 #include <errno.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <arpa/inet.h>
25 #include "packet_utils.h"
26 #include "dns_map.h"
27 
28 #define DNS_HEADER_SIZE 12
29 #define DNS_MAX_DOMAIN_NAME_LENGTH 100
30 #define DNS_QR_FLAG_MASK 0x8000
31 #define DNS_CLASS_MASK 0x7fff
32 #define DNS_COMPRESSION_MASK 0x3fff
33 
34 
36 
40 typedef enum {
41  A = 1,
42  NS = 2,
43  MD = 3,
44  MF = 4,
45  CNAME = 5,
46  SOA = 6,
47  MB = 7,
48  MG = 8,
49  MR = 9,
50  NULL_ = 10,
51  WKS = 11,
52  PTR = 12,
53  HINFO = 13,
54  MINFO = 14,
55  MX = 15,
56  TXT = 16,
57  AAAA = 28,
58  OPT = 41, // Used to specify extensions
59  ANY = 255 // Used to query any type
60 } dns_rr_type_t;
61 
65 typedef struct dns_header {
66  uint16_t id;
67  uint16_t flags;
68  bool qr; // 0 if the message is a query, 1 if it is a response
69  uint16_t qdcount; // Number of entries in Question section
70  uint16_t ancount; // Number of Resource Records in Answer section
71  uint16_t nscount; // Number of Resource Records in Authority section
72  uint16_t arcount; // Number of Resource Records in Additional section
73 } dns_header_t;
74 
78 typedef struct dns_question {
79  char *qname;
80  uint16_t qtype;
81  uint16_t qclass;
83 
87 typedef union {
88  char *domain_name; // Domain name, character string
89  ip_addr_t ip; // IP (v4 or v6) address
90  uint8_t *data; // Generic data, series of bytes
91 } rdata_t;
92 
96 typedef struct dns_resource_record {
97  char *name;
98  uint16_t rtype;
99  uint16_t rclass;
100  uint32_t ttl;
101  uint16_t rdlength;
102  rdata_t rdata;
104 
108 typedef struct dns_message {
109  dns_header_t header;
110  dns_question_t *questions;
111  dns_resource_record_t *answers;
112  dns_resource_record_t *authorities;
113  dns_resource_record_t *additionals;
114 } dns_message_t;
115 
116 
118 
120 
129 dns_header_t dns_parse_header(uint8_t *data, uint16_t *offset);
130 
139 dns_question_t* dns_parse_questions(uint16_t qdcount, uint8_t *data, uint16_t *offset);
140 
149 dns_resource_record_t* dns_parse_rrs(uint16_t count, uint8_t *data, uint16_t *offset);
150 
157 dns_message_t dns_parse_message(uint8_t *data);
158 
159 
161 
172 bool dns_contains_suffix_domain_name(dns_question_t *questions, uint16_t qdcount, char *suffix, uint16_t suffix_length);
173 
182 bool dns_contains_full_domain_name(dns_question_t *questions, uint16_t qdcount, char *domain_name);
183 
192 dns_question_t* dns_get_question(dns_question_t *questions, uint16_t qdcount, char *domain_name);
193 
205 ip_list_t dns_get_ip_from_name(dns_resource_record_t *answers, uint16_t ancount, char *domain_name);
206 
207 
209 
216 void dns_convert_qname(char *dst, char *src, uint16_t len);
217 
226 int dns_send_query(char *qname, int sockfd, struct sockaddr_in *server_addr);
227 
236 int dns_receive_response(int sockfd, struct sockaddr_in *server_addr, dns_message_t *dns_message);
237 
238 
240 
246 void dns_free_message(dns_message_t message);
247 
248 
250 
256 void dns_print_header(dns_header_t header);
257 
263 void dns_print_question(dns_question_t question);
264 
271 void dns_print_questions(uint16_t qdcount, dns_question_t *questions);
272 
281 char* dns_rdata_to_str(dns_rr_type_t rtype, uint16_t rdlength, rdata_t rdata);
282 
289 void dns_print_rr(char* section_name, dns_resource_record_t rr);
290 
298 void dns_print_rrs(char* section_name, uint16_t count, dns_resource_record_t *rrs);
299 
305 void dns_print_message(dns_message_t message);
306 
307 
308 #endif /* _PROTOCOL_PARSERS_DNS_ */
Implementation of a DNS domain name to IP addresses mapping, using Joshua J Baker's hashmap....
Utilitaries for payload manipulation and display.
Definition: dns.h:65
Definition: dns.h:108
Definition: dns.h:78
Definition: dns.h:96
IP (v4 or v6) address.
Definition: packet_utils.h:37
Definition: dns_map.h:30
Definition: dns.h:87