1
1
package dns
2
2
3
3
import (
4
- "fmt"
5
4
"net"
6
5
"strings"
7
6
8
7
"github.com/sadityakumar9211/go-res/pkg/bytepacketbuffer"
9
8
)
10
9
11
-
12
- type ResultCode uint8
13
- type QueryType int
10
+ type ResultCode uint8
11
+ type QueryType int
14
12
15
13
// ResultCode represents DNS result codes.
16
14
const (
@@ -198,16 +196,20 @@ type DnsQuestion struct {
198
196
199
197
// Read reads DNS question data from the buffer.
200
198
func (q * DnsQuestion ) Read (buffer * bytepacketbuffer.BytePacketBuffer ) error {
199
+ // Reading the Dns question.
201
200
err := buffer .ReadQName (& q .Name )
202
201
if err != nil {
203
202
return err
204
203
}
205
204
205
+ // Reading the query type.
206
206
queryTypeFromNum , err := buffer .ReadU16 ()
207
207
if err != nil {
208
208
return err
209
209
}
210
+
210
211
q .QType = QueryTypeFromNum (queryTypeFromNum )
212
+
211
213
if _ , err = buffer .ReadU16 (); err != nil {
212
214
return err
213
215
} // class
@@ -501,7 +503,7 @@ type MXRecord struct {
501
503
}
502
504
503
505
// 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 {
505
507
// Domain Name
506
508
if err := buffer .ReadQName (& m .Domain ); err != nil {
507
509
return err
@@ -551,7 +553,7 @@ func (r *MXRecord) Write(buffer *bytepacketbuffer.BytePacketBuffer) (uint, error
551
553
}
552
554
if err := buffer .WriteU16 (1 ); err != nil {
553
555
return 0 , err
554
- }
556
+ }
555
557
// class
556
558
if err := buffer .WriteU32 (r .TTL ); err != nil {
557
559
return 0 , err
@@ -675,17 +677,17 @@ type UNKNOWNRecord struct {
675
677
}
676
678
677
679
func (u * UNKNOWNRecord ) Read (buffer * bytepacketbuffer.BytePacketBuffer ) error {
678
- // Domain Name
680
+ // Domain Name
679
681
if err := buffer .ReadQName (& u .Domain ); err != nil {
680
682
return err
681
683
}
682
-
684
+
683
685
// QueryType - 2 byte
684
686
if _ , err := buffer .ReadU16 (); err != nil {
685
687
return err
686
688
}
687
689
688
- // Ignoring the class type - 2 byte
690
+ // Ignoring the class type - 2 byte
689
691
if _ , err := buffer .ReadU16 (); err != nil {
690
692
return err
691
693
}
@@ -710,8 +712,8 @@ func (u *UNKNOWNRecord) Read(buffer *bytepacketbuffer.BytePacketBuffer) error {
710
712
711
713
// Write writes UNKNOWNRecord data to the buffer.
712
714
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)
715
717
return 0 , nil
716
718
}
717
719
@@ -743,10 +745,137 @@ func NewDnsPacket() *DnsPacket {
743
745
}
744
746
}
745
747
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
748
853
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
+ }
750
879
751
880
// FromBuffer creates a new DNS packet from the buffer.
752
881
func FromBuffer (buffer * bytepacketbuffer.BytePacketBuffer ) (* DnsPacket , error ) {
@@ -762,28 +891,24 @@ func FromBuffer(buffer *bytepacketbuffer.BytePacketBuffer) (*DnsPacket, error) {
762
891
763
892
// Reading answers from the buffer
764
893
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 {
768
896
return nil , err
769
897
}
770
-
771
- // newRecType := FindRecordType(rec)
772
898
packet .Answers = append (packet .Answers , rec )
773
899
}
774
900
// Reading authoritative entries from the buffer
775
901
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 {
779
904
return nil , err
780
905
}
781
906
packet .Authorities = append (packet .Authorities , rec )
782
907
}
783
908
// Reading Resources from the buffer
784
909
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 {
787
912
return nil , err
788
913
}
789
914
packet .Resources = append (packet .Resources , rec )
@@ -904,4 +1029,4 @@ func (p *DnsPacket) GetUnresolvedNS(qname string) string {
904
1029
}
905
1030
906
1031
return "" // Return an empty string for no match
907
- }
1032
+ }
0 commit comments