1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "dns.h"
int main() {
uint8_t pkt[512] = {0};
// DNS header
pkt[4] = 0x00;
pkt[5] = 0x02; // QDCOUNT = 2
uint8_t *ptr = pkt + 12;
// Question 1: foo.com A
*ptr++ = 3; memcpy(ptr, "foo", 3); ptr += 3;
*ptr++ = 3; memcpy(ptr, "com", 3); ptr += 3;
*ptr++ = 0; // null terminator
*ptr++ = 0x00; *ptr++ = 0x01; // QTYPE A
*ptr++ = 0x00; *ptr++ = 0x01; // QCLASS IN
// Question 2: bar.org AAAA
*ptr++ = 3; memcpy(ptr, "bar", 3); ptr += 3;
*ptr++ = 3; memcpy(ptr, "org", 3); ptr += 3;
*ptr++ = 0;
*ptr++ = 0x00; *ptr++ = 0x1c; // QTYPE AAAA
*ptr++ = 0x00; *ptr++ = 0x01;
size_t pkt_len = ptr - pkt;
struct dns_question out[4];
size_t count = parse_dns_udp(pkt, pkt_len, out, 4);
//printf("Got %zu questions:\n", count);
//for (size_t i = 0; i < count; i++) {
// printf(" %s (%s)\n", out[i].name, dns_type_to_string(out[i].qtype));
//}
int res = (count == 2 &&
strcmp(out[0].name, "foo.com") == 0 &&
out[0].qtype == 1 &&
strcmp(out[1].name, "bar.org") == 0 &&
out[1].qtype == 28);
printf("%s: parse_dns_udp-multi\n", res ? "PASS" : "FAIL");
return res;
}
|