Commit fec54c23 authored by Rob Adams's avatar Rob Adams

Fix bug in covering logic and add new Covers() method for network.

Signed-off-by: default avatarRob Adams <readams@readams.net>
parent 8c56974d
......@@ -98,7 +98,11 @@ func (b *bruteRanger) CoveredNetworks(network net.IPNet) ([]RangerEntry, error)
var results []RangerEntry
for _, entry := range entries {
entrynetwork := entry.Network()
if network.Contains(entrynetwork.IP) {
searchMaskSize, _ := network.Mask.Size()
entryMaskSize, _ := entrynetwork.Mask.Size()
if network.Contains(entrynetwork.IP) && searchMaskSize <= entryMaskSize {
results = append(results, entry)
}
}
......
......@@ -208,6 +208,13 @@ func (n Network) Contains(nn NetworkNumber) bool {
return true
}
// Contains returns true if Network covers o, false otherwise
func (n Network) Covers(o Network) bool {
nMaskSize, _ := n.IPNet.Mask.Size()
oMaskSize, _ := o.IPNet.Mask.Size()
return n.Contains(o.Number) && nMaskSize <= oMaskSize
}
// LeastCommonBitPosition returns the smallest position of the preceding common
// bits of the 2 networks, and returns an error ErrNoGreatestCommonBit
// if the two network number diverges from the first bit.
......
......@@ -412,6 +412,31 @@ func TestPreviousIP(t *testing.T) {
}
}
func TestNetworkCovers(t *testing.T) {
cases := []struct {
network string
covers string
result bool
name string
}{
{"10.0.0.0/24", "10.0.0.1/25", true, "contains"},
{"10.0.0.0/24", "11.0.0.1/25", false, "not contains"},
{"10.0.0.0/16", "10.0.0.0/15", false, "prefix false"},
{"10.0.0.0/15", "10.0.0.0/16", true, "prefix true"},
{"10.0.0.0/15", "10.0.0.0/15", true, "same"},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
_, n, _ := net.ParseCIDR(tc.network)
network := NewNetwork(*n)
_, n, _ = net.ParseCIDR(tc.covers)
covers := NewNetwork(*n)
assert.Equal(t, tc.result, network.Covers(covers))
})
}
}
/*
*********************************
Benchmarking ip manipulations.
......
......@@ -186,7 +186,7 @@ func (p *prefixTrie) containingNetworks(number rnet.NetworkNumber) ([]RangerEntr
func (p *prefixTrie) coveredNetworks(network rnet.Network) ([]RangerEntry, error) {
var results []RangerEntry
if p.hasEntry() && network.Contains(p.network.Number) {
if p.hasEntry() && network.Covers(p.network) {
results = []RangerEntry{p.entry}
}
if p.targetBitPosition() < 0 {
......
......@@ -404,6 +404,15 @@ var coveredNetworkTests = []coveredNetworkTest{
[]string{"192.168.0.0/24", "192.168.1.1/32"},
"path not taken",
},
{
rnet.IPv4,
[]string{
"192.168.0.0/15",
},
"192.168.0.0/16",
nil,
"only masks different",
},
}
func TestPrefixTrieCoveredNetworks(t *testing.T) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment