Skip to content

Commit 6158bfc

Browse files
committed
Added Netmask() auxiliary method.
1 parent ed835b2 commit 6158bfc

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

reader.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,36 @@ func (r *Reader) findAddressInTree(ipAddress net.IP) (uint, error) {
212212
return 0, newInvalidDatabaseError("invalid node in search tree")
213213
}
214214

215+
func (r *Reader) Netmask(ipAddress net.IP) (uint, error) {
216+
217+
bitCount := uint(len(ipAddress) * 8)
218+
219+
var node, i uint
220+
if bitCount == 32 {
221+
node = r.ipv4Start
222+
}
223+
224+
nodeCount := r.Metadata.NodeCount
225+
226+
for i = uint(0); i < bitCount && node < nodeCount; i++ {
227+
bit := uint(1) & (uint(ipAddress[i>>3]) >> (7 - (i % 8)))
228+
229+
var err error
230+
node, err = r.readNode(node, bit)
231+
if err != nil {
232+
return 0, err
233+
}
234+
}
235+
if node == nodeCount {
236+
// Record is empty
237+
return 0, nil
238+
} else if node > nodeCount {
239+
return i, nil
240+
}
241+
242+
return 0, newInvalidDatabaseError("invalid node in search tree")
243+
}
244+
215245
func (r *Reader) readNode(nodeNumber uint, index uint) (uint, error) {
216246
RecordSize := r.Metadata.RecordSize
217247

0 commit comments

Comments
 (0)