dns_message_parser/encode/rr/
rfc_1035.rs1use 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);