summaryrefslogtreecommitdiff
path: root/test/test-parse_dns_udp-multi.c
blob: 854b61a8efd847565ee2555b88b5f99168cce6b3 (plain)
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;
}