Skip to content

Commit c1b9c7e

Browse files
fix: correctly reading the specific type of dns record now
Signed-off-by: Aditya Kumar Singh <sadityakumar9211@gmail.com>
1 parent 31b84e8 commit c1b9c7e

File tree

1 file changed

+150
-25
lines changed

1 file changed

+150
-25
lines changed

internal/dns/dns.go

Lines changed: 150 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package dns
22

33
import (
4-
"fmt"
54
"net"
65
"strings"
76

87
"github.com/sadityakumar9211/go-res/pkg/bytepacketbuffer"
98
)
109

11-
12-
type ResultCode uint8
13-
type QueryType int
10+
type ResultCode uint8
11+
type QueryType int
1412

1513
// ResultCode represents DNS result codes.
1614
const (
@@ -198,16 +196,20 @@ type DnsQuestion struct {
198196

199197
// Read reads DNS question data from the buffer.
200198
func (q *DnsQuestion) Read(buffer *bytepacketbuffer.BytePacketBuffer) error {
199+
// Reading the Dns question.
201200
err := buffer.ReadQName(&q.Name)
202201
if err != nil {
203202
return err
204203
}
205204

205+
// Reading the query type.
206206
queryTypeFromNum, err := buffer.ReadU16()
207207
if err != nil {
208208
return err
209209
}
210+
210211
q.QType = QueryTypeFromNum(queryTypeFromNum)
212+
211213
if _, err = buffer.ReadU16(); err != nil {
212214
return err
213215
} // class
@@ -501,7 +503,7 @@ type MXRecord struct {
501503
}
502504

503505
// ReadMXRecord reads MX record data from a byte slice.
504-
func (m *MXRecord) Read(buffer *bytepacketbuffer.BytePacketBuffer, domain string, ttl uint32) error {
506+
func (m *MXRecord) Read(buffer *bytepacketbuffer.BytePacketBuffer) error {
505507
// Domain Name
506508
if err := buffer.ReadQName(&m.Domain); err != nil {
507509
return err
@@ -551,7 +553,7 @@ func (r *MXRecord) Write(buffer *bytepacketbuffer.BytePacketBuffer) (uint, error
551553
}
552554
if err := buffer.WriteU16(1); err != nil {
553555
return 0, err
554-
}
556+
}
555557
// class
556558
if err := buffer.WriteU32(r.TTL); err != nil {
557559
return 0, err
@@ -675,17 +677,17 @@ type UNKNOWNRecord struct {
675677
}
676678

677679
func (u *UNKNOWNRecord) Read(buffer *bytepacketbuffer.BytePacketBuffer) error {
678-
// Domain Name
680+
// Domain Name
679681
if err := buffer.ReadQName(&u.Domain); err != nil {
680682
return err
681683
}
682-
684+
683685
// QueryType - 2 byte
684686
if _, err := buffer.ReadU16(); err != nil {
685687
return err
686688
}
687689

688-
// Ignoring the class type - 2 byte
690+
// Ignoring the class type - 2 byte
689691
if _, err := buffer.ReadU16(); err != nil {
690692
return err
691693
}
@@ -710,8 +712,8 @@ func (u *UNKNOWNRecord) Read(buffer *bytepacketbuffer.BytePacketBuffer) error {
710712

711713
// Write writes UNKNOWNRecord data to the buffer.
712714
func (u *UNKNOWNRecord) Write(buffer *bytepacketbuffer.BytePacketBuffer) (uint, error) {
713-
st := fmt.Sprintf("Skipping record %v", u)
714-
fmt.Println(st)
715+
// st := fmt.Sprintf("Skipping record %v", u)
716+
// fmt.Println(st)
715717
return 0, nil
716718
}
717719

@@ -743,10 +745,137 @@ func NewDnsPacket() *DnsPacket {
743745
}
744746
}
745747

746-
// // FindRecordType returns correctly parsed DnsRecord
747-
// func FindRecordType(rec *UNKNOWNRecord) (*DnsRecord, error) {
748+
func ReadDNSRecord(buffer *bytepacketbuffer.BytePacketBuffer) (DnsRecord, error) {
749+
var domain string
750+
buffer.ReadQName(&domain)
751+
752+
qtype_num, err := buffer.ReadU16()
753+
if err != nil {
754+
return nil, err
755+
}
756+
qtype := QueryTypeFromNum(qtype_num)
757+
758+
_, err = buffer.ReadU16()
759+
if err != nil {
760+
return nil, err
761+
}
762+
763+
ttl, err := buffer.ReadU32()
764+
if err != nil {
765+
return nil, err
766+
}
767+
768+
data_len, err := buffer.ReadU16()
769+
if err != nil {
770+
return nil, err
771+
}
772+
773+
switch qtype {
774+
case A:
775+
raw_addr, err := buffer.ReadU32()
776+
if err != nil {
777+
return nil, err
778+
}
779+
addr := net.IPv4(
780+
byte((raw_addr>>24)&0xFF),
781+
byte((raw_addr>>16)&0xFF),
782+
byte((raw_addr>>8)&0xFF),
783+
byte((raw_addr>>0)&0xFF),
784+
)
785+
786+
return &ARecord{
787+
Domain: domain,
788+
Addr: addr,
789+
TTL: ttl,
790+
}, nil
791+
792+
case AAAA:
793+
raw_addr1, err := buffer.ReadU32()
794+
if err != nil {
795+
return nil, err
796+
}
797+
raw_addr2, err := buffer.ReadU32()
798+
if err != nil {
799+
return nil, err
800+
}
801+
raw_addr3, err := buffer.ReadU32()
802+
if err != nil {
803+
return nil, err
804+
}
805+
raw_addr4, err := buffer.ReadU32()
806+
if err != nil {
807+
return nil, err
808+
}
809+
810+
addr := net.IP{
811+
byte((raw_addr1 >> 24) & 0xFFFF),
812+
byte((raw_addr1 >> 16) & 0xFFFF),
813+
byte((raw_addr1 >> 8) & 0xFFFF),
814+
byte((raw_addr1 >> 0) & 0xFFFF),
815+
byte((raw_addr2 >> 24) & 0xFFFF),
816+
byte((raw_addr2 >> 16) & 0xFFFF),
817+
byte((raw_addr2 >> 8) & 0xFFFF),
818+
byte((raw_addr2 >> 0) & 0xFFFF),
819+
byte((raw_addr3 >> 24) & 0xFFFF),
820+
byte((raw_addr3 >> 16) & 0xFFFF),
821+
byte((raw_addr3 >> 8) & 0xFFFF),
822+
byte((raw_addr3 >> 0) & 0xFFFF),
823+
byte((raw_addr4 >> 24) & 0xFFFF),
824+
byte((raw_addr4 >> 16) & 0xFFFF),
825+
byte((raw_addr4 >> 8) & 0xFFFF),
826+
byte((raw_addr4 >> 0) & 0xFFFF),
827+
}
828+
829+
return &AAAARecord{
830+
Domain: domain,
831+
Addr: addr,
832+
TTL: ttl,
833+
}, nil
834+
835+
case NS:
836+
var ns string
837+
buffer.ReadQName(&ns)
838+
return &NSRecord{
839+
Domain: domain,
840+
Host: ns,
841+
TTL: ttl,
842+
}, nil
843+
844+
case CNAME:
845+
var cname string
846+
buffer.ReadQName(&cname)
847+
848+
return &NSRecord{
849+
Domain: domain,
850+
Host: cname,
851+
TTL: ttl,
852+
}, nil
748853

749-
// }
854+
case MX:
855+
priority, err := buffer.ReadU16()
856+
if err != nil {
857+
return nil, err
858+
}
859+
var mx string
860+
buffer.ReadQName(&mx)
861+
862+
return &MXRecord{
863+
Domain: domain,
864+
Priority: priority,
865+
Host: mx,
866+
TTL: ttl,
867+
}, nil
868+
869+
default: // UNKNOWN
870+
buffer.Step(int(data_len))
871+
return &UNKNOWNRecord{
872+
Domain: domain,
873+
QType: UNKNOWN.QueryTypeToNum(),
874+
DataLength: data_len,
875+
TTL: ttl,
876+
}, nil
877+
}
878+
}
750879

751880
// FromBuffer creates a new DNS packet from the buffer.
752881
func FromBuffer(buffer *bytepacketbuffer.BytePacketBuffer) (*DnsPacket, error) {
@@ -762,28 +891,24 @@ func FromBuffer(buffer *bytepacketbuffer.BytePacketBuffer) (*DnsPacket, error) {
762891

763892
// Reading answers from the buffer
764893
for i := uint16(0); i < packet.Header.Answers; i++ {
765-
rec := &UNKNOWNRecord{}
766-
// var rec DnsRecord
767-
if err := rec.Read(buffer); err != nil {
894+
rec, err := ReadDNSRecord(buffer)
895+
if err != nil {
768896
return nil, err
769897
}
770-
771-
// newRecType := FindRecordType(rec)
772898
packet.Answers = append(packet.Answers, rec)
773899
}
774900
// Reading authoritative entries from the buffer
775901
for i := uint16(0); i < packet.Header.AuthoritativeEntries; i++ {
776-
fmt.Println("authoritative enteries", len(packet.Authorities), "len in header: ", packet.Header.AuthoritativeEntries)
777-
rec := &UNKNOWNRecord{}
778-
if err := rec.Read(buffer); err != nil {
902+
rec, err := ReadDNSRecord(buffer)
903+
if err != nil {
779904
return nil, err
780905
}
781906
packet.Authorities = append(packet.Authorities, rec)
782907
}
783908
// Reading Resources from the buffer
784909
for i := uint16(0); i < uint16(len(packet.Resources)); i++ {
785-
rec := &UNKNOWNRecord{}
786-
if err := rec.Read(buffer); err != nil {
910+
rec, err := ReadDNSRecord(buffer)
911+
if err != nil {
787912
return nil, err
788913
}
789914
packet.Resources = append(packet.Resources, rec)
@@ -904,4 +1029,4 @@ func (p *DnsPacket) GetUnresolvedNS(qname string) string {
9041029
}
9051030

9061031
return "" // Return an empty string for no match
907-
}
1032+
}

0 commit comments

Comments
 (0)