1package magna
2
3// Decode decodes a DNS packet.
4func (m *Message) Decode(buf []byte) (err error) {
5 offset, err := m.Header.Decode(buf, 0)
6 if err != nil {
7 return err
8 }
9
10 for x := 0; x < int(m.Header.QDCount); x++ {
11 var question Question
12 offset, err = question.Decode(buf, offset)
13 if err != nil {
14 return err
15 }
16
17 m.Question = append(m.Question, question)
18 }
19
20 for x := 0; x < int(m.Header.ANCount); x++ {
21 var rr ResourceRecord
22 offset, err = rr.Decode(buf, offset)
23 if err != nil {
24 return err
25 }
26
27 m.Answer = append(m.Answer, rr)
28 }
29
30 for x := 0; x < int(m.Header.NSCount); x++ {
31 var rr ResourceRecord
32 offset, err = rr.Decode(buf, offset)
33 if err != nil {
34 return err
35 }
36
37 m.Authority = append(m.Authority, rr)
38 }
39
40 for x := 0; x < int(m.Header.ARCount); x++ {
41 var rr ResourceRecord
42 offset, err = rr.Decode(buf, offset)
43 if err != nil {
44 return err
45 }
46
47 m.Additional = append(m.Additional, rr)
48 }
49
50 return nil
51}
52
53// Encode encodes a message to a DNS packet.
54// TODO: set truncation bit if over 512 and udp is protocol
55func (m *Message) Encode() []byte {
56 m.offsets = make(map[string]uint8)
57 bytes := m.Header.Encode()
58
59 for _, question := range m.Question {
60 bytes = question.Encode(bytes, &m.offsets)
61 }
62
63 for _, answer := range m.Answer {
64 bytes = answer.Encode(bytes, &m.offsets)
65 }
66
67 for _, authority := range m.Authority {
68 bytes = authority.Encode(bytes, &m.offsets)
69 }
70
71 for _, additional := range m.Additional {
72 bytes = additional.Encode(bytes, &m.offsets)
73 }
74
75 return bytes
76}