dnsmsg_parser/
dns_message.rs1use hickory_proto::op::ResponseCode;
2
3use crate::ede::EDE;
4
5pub(super) const RTYPE_MB: u16 = 7;
6pub(super) const RTYPE_MG: u16 = 8;
7pub(super) const RTYPE_MR: u16 = 9;
8pub(super) const RTYPE_WKS: u16 = 11;
9pub(super) const RTYPE_MINFO: u16 = 14;
10pub(super) const RTYPE_RP: u16 = 17;
11pub(super) const RTYPE_AFSDB: u16 = 18;
12pub(super) const RTYPE_X25: u16 = 19;
13pub(super) const RTYPE_ISDN: u16 = 20;
14pub(super) const RTYPE_RT: u16 = 21;
15pub(super) const RTYPE_NSAP: u16 = 22;
16pub(super) const RTYPE_PX: u16 = 26;
17pub(super) const RTYPE_LOC: u16 = 29;
18pub(super) const RTYPE_KX: u16 = 36;
19pub(super) const RTYPE_A6: u16 = 38;
20pub(super) const RTYPE_SINK: u16 = 40;
21pub(super) const RTYPE_APL: u16 = 42;
22pub(super) const RTYPE_DHCID: u16 = 49;
23pub(super) const RTYPE_SPF: u16 = 99;
24
25#[derive(Clone, Debug, Default)]
26pub struct DnsQueryMessage {
27 pub response_code: u16,
28 pub response: Option<&'static str>,
29 pub header: QueryHeader,
30 pub question_section: Vec<QueryQuestion>,
31 pub answer_section: Vec<DnsRecord>,
32 pub authority_section: Vec<DnsRecord>,
33 pub additional_section: Vec<DnsRecord>,
34 pub opt_pseudo_section: Option<OptPseudoSection>,
35}
36
37#[derive(Clone, Debug, Default)]
38pub struct QueryHeader {
39 pub id: u16,
40 pub opcode: u8,
41 pub rcode: ResponseCode,
42 pub qr: u8,
43 pub aa: bool,
44 pub tc: bool,
45 pub rd: bool,
46 pub ra: bool,
47 pub ad: bool,
48 pub cd: bool,
49 pub question_count: u16,
50 pub answer_count: u16,
51 pub authority_count: u16,
52 pub additional_count: u16,
53}
54
55#[derive(Clone, Debug, Default)]
56pub struct DnsUpdateMessage {
57 pub response_code: u16,
58 pub response: Option<&'static str>,
59 pub header: UpdateHeader,
60 pub zone_to_update: ZoneInfo,
61 pub prerequisite_section: Vec<DnsRecord>,
62 pub update_section: Vec<DnsRecord>,
63 pub additional_section: Vec<DnsRecord>,
64}
65
66#[derive(Clone, Debug, Default)]
67pub struct UpdateHeader {
68 pub id: u16,
69 pub opcode: u8,
70 pub rcode: ResponseCode,
71 pub qr: u8,
72 pub zone_count: u16,
73 pub prerequisite_count: u16,
74 pub update_count: u16,
75 pub additional_count: u16,
76}
77
78#[derive(Clone, Debug, Default)]
79pub struct OptPseudoSection {
80 pub extended_rcode: u8,
81 pub version: u8,
82 pub dnssec_ok: bool,
83 pub udp_max_payload_size: u16,
84 pub ede: Vec<EDE>,
85 pub options: Vec<EdnsOptionEntry>,
86}
87
88#[derive(Clone, Debug, Default)]
89pub struct QueryQuestion {
90 pub name: String,
91 pub class: String,
92 pub record_type: Option<String>,
93 pub record_type_id: u16,
94}
95
96#[derive(Clone, Debug, Default)]
97pub struct ZoneInfo {
98 pub name: String,
99 pub class: String,
100 pub zone_type: Option<String>,
101 pub zone_type_id: u16,
102}
103
104impl From<QueryQuestion> for ZoneInfo {
105 fn from(query: QueryQuestion) -> Self {
106 Self {
107 name: query.name,
108 class: query.class,
109 zone_type: query.record_type,
110 zone_type_id: query.record_type_id,
111 }
112 }
113}
114
115#[derive(Clone, Debug, Default)]
116pub struct DnsRecord {
117 pub name: String,
118 pub class: String,
119 pub record_type: Option<String>,
120 pub record_type_id: u16,
121 pub ttl: u32,
122 pub rdata: Option<String>,
123 pub rdata_bytes: Option<Vec<u8>>,
124}
125
126#[derive(Clone, Debug, Default)]
127pub struct EdnsOptionEntry {
128 pub opt_code: u16,
129 pub opt_name: String,
130 pub opt_data: String,
131}