dns_message_parser/encode/rr/
rfc_1035.rs

1use crate::encode::Encoder;
2use crate::rr::{Class, Type, A, HINFO, SOA, TXT, WKS};
3use crate::EncodeResult;
4
5impl Encoder {
6    pub(super) fn rr_a(&mut self, a: &A) -> EncodeResult<()> {
7        self.domain_name(&a.domain_name)?;
8        self.rr_type(&Type::A);
9        self.rr_class(&Class::IN);
10        self.u32(a.ttl);
11        let length_index = self.create_length_index();
12        self.ipv4_addr(&a.ipv4_addr);
13        self.set_length_index(length_index)
14    }
15
16    impl_encode_rr_domain_name!(NS, ns_d_name, rr_ns);
17
18    impl_encode_rr_domain_name!(MD, mad_name, rr_md);
19
20    impl_encode_rr_domain_name!(MF, mad_name, rr_mf);
21
22    impl_encode_rr_domain_name!(CNAME, c_name, rr_cname);
23
24    pub(super) fn rr_soa(&mut self, soa: &SOA) -> EncodeResult<()> {
25        self.domain_name(&soa.domain_name)?;
26        self.rr_type(&Type::SOA);
27        self.rr_class(&soa.class);
28        self.u32(soa.ttl);
29        let length_index = self.create_length_index();
30        self.domain_name(&soa.m_name)?;
31        self.domain_name(&soa.r_name)?;
32        self.u32(soa.serial);
33        self.u32(soa.refresh);
34        self.u32(soa.retry);
35        self.u32(soa.expire);
36        self.u32(soa.min_ttl);
37        self.set_length_index(length_index)
38    }
39
40    impl_encode_rr_domain_name!(MB, mad_name, rr_mb);
41
42    impl_encode_rr_domain_name!(MG, mgm_name, rr_mg);
43
44    impl_encode_rr_domain_name!(MR, new_name, rr_mr);
45
46    impl_encode_rr_vec!(NULL, data, rr_null);
47
48    pub(super) fn rr_wks(&mut self, wks: &WKS) -> EncodeResult<()> {
49        self.domain_name(&wks.domain_name)?;
50        self.rr_type(&Type::WKS);
51        self.rr_class(&Class::IN);
52        self.u32(wks.ttl);
53        let length_index = self.create_length_index();
54        self.ipv4_addr(&wks.ipv4_addr);
55        self.u8(wks.protocol);
56        self.vec(&wks.bit_map);
57        self.set_length_index(length_index)
58    }
59
60    impl_encode_rr_domain_name!(PTR, ptr_d_name, rr_ptr);
61
62    pub(super) fn rr_hinfo(&mut self, hinfo: &HINFO) -> EncodeResult<()> {
63        self.domain_name(&hinfo.domain_name)?;
64        self.rr_type(&Type::HINFO);
65        self.rr_class(&hinfo.class);
66        self.u32(hinfo.ttl);
67        let length_index = self.create_length_index();
68        self.string_with_len(&hinfo.cpu)?;
69        self.string_with_len(&hinfo.os)?;
70        self.set_length_index(length_index)
71    }
72
73    impl_encode_rr_domain_name_domain_name!(MINFO, r_mail_bx, e_mail_bx, rr_minfo);
74
75    impl_encode_rr_u16_domain_name!(MX, preference, exchange, rr_mx);
76
77    pub(super) fn rr_txt(&mut self, txt: &TXT) -> EncodeResult<()> {
78        self.domain_name(&txt.domain_name)?;
79        self.rr_type(&Type::TXT);
80        self.rr_class(&txt.class);
81        self.u32(txt.ttl);
82        let length_index = self.create_length_index();
83        for string in txt.strings.iter() {
84            self.string_with_len(string)?;
85        }
86        self.set_length_index(length_index)
87    }
88}
89
90impl_encode_rr!(A, rr_a);
91
92impl_encode_rr!(NS, rr_ns);
93
94impl_encode_rr!(MD, rr_md);
95
96impl_encode_rr!(MF, rr_mf);
97
98impl_encode_rr!(CNAME, rr_cname);
99
100impl_encode_rr!(SOA, rr_soa);
101
102impl_encode_rr!(MB, rr_mb);
103
104impl_encode_rr!(MG, rr_mg);
105
106impl_encode_rr!(MR, rr_mr);
107
108impl_encode_rr!(NULL, rr_null);
109
110impl_encode_rr!(WKS, rr_wks);
111
112impl_encode_rr!(PTR, rr_ptr);
113
114impl_encode_rr!(HINFO, rr_hinfo);
115
116impl_encode_rr!(MINFO, rr_minfo);
117
118impl_encode_rr!(MX, rr_mx);
119
120impl_encode_rr!(TXT, rr_txt);