@@ -7,50 +7,58 @@ import (
7
7
// BytePacketBuffer is a buffer for working with binary data.
8
8
type BytePacketBuffer struct {
9
9
Buf [512 ]byte
10
- Pos int
10
+ Pos int // buffer pointer to track current position.
11
11
}
12
12
13
+ // NewBytePacketBuffer creates and returns a new BytePacketBuffer with default values.
13
14
func NewBytePacketBuffer () BytePacketBuffer {
14
15
return BytePacketBuffer {}
15
16
}
16
17
18
+ // GetPos returns the current buffer pointer.
17
19
func (b * BytePacketBuffer ) GetPos () int {
18
20
return b .Pos
19
21
}
20
22
23
+ // Step moves the buffer pointer by steps amount.
21
24
func (b * BytePacketBuffer ) Step (steps int ) error {
22
25
b .Pos += steps
23
26
return nil
24
27
}
25
28
29
+ // Seek sets the buffer pointer to pos.
26
30
func (b * BytePacketBuffer ) Seek (pos int ) error {
27
31
b .Pos = pos
28
32
return nil
29
33
}
30
34
35
+ // Read reads a single byte from buffer and moves buffer pointer by same amount.
31
36
func (b * BytePacketBuffer ) Read () (byte , error ) {
32
37
if b .Pos >= 512 {
33
- return 0 , errors .New ("End of buffer" )
38
+ return 0 , errors .New ("end of buffer" )
34
39
}
35
40
res := b .Buf [b .Pos ]
36
41
b .Pos ++
37
42
return res , nil
38
43
}
39
44
45
+ // Get returns a buffer byte at pos without changing buffer pointer.
40
46
func (b * BytePacketBuffer ) Get (pos int ) (byte , error ) {
41
47
if pos >= 512 {
42
- return 0 , errors .New ("End of buffer" )
48
+ return 0 , errors .New ("end of buffer" )
43
49
}
44
50
return b .Buf [pos ], nil
45
51
}
46
52
53
+ // GetRange returns buffer bits from start with specified length without moving buffer pointer.
47
54
func (b * BytePacketBuffer ) GetRange (start int , length int ) ([]byte , error ) {
48
55
if start + length >= 512 {
49
- return nil , errors .New ("End of buffer" )
56
+ return nil , errors .New ("end of buffer" )
50
57
}
51
58
return b .Buf [start : start + length ], nil
52
59
}
53
60
61
+ // ReadU16 reads 2 buffer bytes and moves buffer pointer.
54
62
func (b * BytePacketBuffer ) ReadU16 () (uint16 , error ) {
55
63
val1 , err := b .Read ()
56
64
if err != nil {
@@ -63,6 +71,7 @@ func (b *BytePacketBuffer) ReadU16() (uint16, error) {
63
71
return (uint16 (val1 ) << 8 ) | uint16 (val2 ), nil
64
72
}
65
73
74
+ // ReadU32 reads 4 buffer bytes and moves buffer pointer.
66
75
func (b * BytePacketBuffer ) ReadU32 () (uint32 , error ) {
67
76
val1 , err := b .Read ()
68
77
if err != nil {
@@ -83,6 +92,7 @@ func (b *BytePacketBuffer) ReadU32() (uint32, error) {
83
92
return (uint32 (val1 ) << 24 ) | (uint32 (val2 ) << 16 ) | (uint32 (val3 ) << 8 ) | uint32 (val4 ), nil
84
93
}
85
94
95
+ // ReadQName reads DNS question name and moves buffer pointer.
86
96
func (b * BytePacketBuffer ) ReadQName (outstr * string ) error {
87
97
pos := b .GetPos ()
88
98
jumped := false
@@ -92,7 +102,7 @@ func (b *BytePacketBuffer) ReadQName(outstr *string) error {
92
102
93
103
for {
94
104
if jumpsPerformed > maxJumps {
95
- return errors .New ("Limit of 5 jumps exceeded" )
105
+ return errors .New ("limit of 5 jumps exceeded" )
96
106
}
97
107
98
108
lenVal , err := b .Get (pos )
@@ -137,25 +147,29 @@ func (b *BytePacketBuffer) ReadQName(outstr *string) error {
137
147
return nil
138
148
}
139
149
150
+ // Write writes a byte to buffer and moves buffer pointer.
140
151
func (b * BytePacketBuffer ) Write (val byte ) error {
141
152
if b .Pos >= 512 {
142
- return errors .New ("End of buffer" )
153
+ return errors .New ("end of buffer" )
143
154
}
144
155
b .Buf [b .Pos ] = val
145
156
b .Pos ++
146
157
return nil
147
158
}
148
159
160
+ // WriteU8 writes 1 byte to buffer and moves buffer pointer.
149
161
func (b * BytePacketBuffer ) WriteU8 (val byte ) error {
150
162
return b .Write (val )
151
163
}
152
164
165
+ // WriteU16 writes 2 bytes to buffer and moves buffer pointer.
153
166
func (b * BytePacketBuffer ) WriteU16 (val uint16 ) error {
154
167
b .Write (byte (val >> 8 ))
155
168
b .Write (byte (val & 0xFF ))
156
169
return nil
157
170
}
158
171
172
+ // WriteU32 writes 4 bytes to buffer and moves buffer pointer.
159
173
func (b * BytePacketBuffer ) WriteU32 (val uint32 ) error {
160
174
b .Write (byte ((val >> 24 ) & 0xFF ))
161
175
b .Write (byte ((val >> 16 ) & 0xFF ))
@@ -164,11 +178,12 @@ func (b *BytePacketBuffer) WriteU32(val uint32) error {
164
178
return nil
165
179
}
166
180
181
+ // WriteQName writes Question name to the buffer and moves buffer pointer.
167
182
func (b * BytePacketBuffer ) WriteQName (qname string ) error {
168
183
for _ , label := range SplitDNSName (qname ) {
169
184
lenVal := byte (len (label ))
170
185
if lenVal > 0x34 {
171
- return errors .New ("Single label exceeds 63 characters of length" )
186
+ return errors .New ("single label exceeds 63 characters of length" )
172
187
}
173
188
b .WriteU8 (lenVal )
174
189
for _ , ch := range label {
@@ -179,17 +194,20 @@ func (b *BytePacketBuffer) WriteQName(qname string) error {
179
194
return nil
180
195
}
181
196
197
+ // Set overwrite a byte from the given position.
182
198
func (b * BytePacketBuffer ) Set (pos int , val byte ) error {
183
199
b .Buf [pos ] = val
184
200
return nil
185
201
}
186
202
203
+ // SetU16 overwrites 2 bytes from the given position.
187
204
func (b * BytePacketBuffer ) SetU16 (pos int , val uint16 ) error {
188
205
b .Set (pos , byte (val >> 8 ))
189
206
b .Set (pos + 1 , byte (val & 0xFF ))
190
207
return nil
191
208
}
192
209
210
+ // SplitDNSName splits question name string to multiple labels and returns an slice of labels.
193
211
func SplitDNSName (qname string ) []string {
194
212
labels := make ([]string , 0 )
195
213
labelStart := 0
0 commit comments