dnsmsg_parser/
dns_message.rs

1use 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}