summaryrefslogtreecommitdiff
path: root/include/dns_decoder.h
blob: 69e1e4b8364d2dd998f033a590a8f0d40d40ec50 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>
#include <stddef.h>

#define DNS_MESSAGE_TOPIC	"TOPIC_DNS_MESSAGE"

/*.
	First call DNS_MESSAGE_TRANSACTION_BEGIN to create the transaction, 
	then publish the transaction's DNS_MESSAGE_QUERY/DNS_MESSAGE_RESPONSE, 
	and finally call DNS_MESSAGE_TRANSACTION_END to release the transaction.
*/
enum dns_message_type
{
	DNS_MESSAGE_QUERY=1,
	DNS_MESSAGE_RESPONSE,
	DNS_MESSAGE_TRANSACTION_BEGIN,
	DNS_MESSAGE_TRANSACTION_END,
    DNS_MESSAGE_MAX
};

struct dns_flag
{
    uint8_t qr:1;
	uint8_t opcode:4;
	uint8_t aa:1;
	uint8_t tc:1;
	uint8_t rd:1;
	uint8_t ra:1;
	uint8_t z:3;
	uint8_t rcode:4;
};

struct dns_message;
struct dns_query_question;
struct dns_resource_record;

enum dns_message_type dns_message_type_get(struct dns_message *msg);

int32_t dns_message_header_id_get(struct dns_message *msg);
struct dns_flag *dns_message_header_flag_get0(struct dns_message *msg);

void dns_message_uuid_get0(struct dns_message *msg, char **value, size_t *value_sz);

void dns_message_query_question_get0(struct dns_message *msg, struct dns_query_question **question, uint16_t *n_question);
const char *dns_query_question_qname_get0(struct dns_query_question *question);
int32_t dns_query_question_qtype_get0(struct dns_query_question *question);
int32_t dns_query_question_qclass_get0(struct dns_query_question *question);

int dns_message_resource_record_is_dnssec(struct dns_message *msg);
const char *dns_message_resource_record_json_exporter(struct dns_message *msg);
const char *dns_message_resource_record_cname_json_exporter(struct dns_message *msg);

#ifdef __cplusplus
}
#endif