a go dns packet parser
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}