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) ...@@ -98,7 +98,11 @@ func (b *bruteRanger) CoveredNetworks(network net.IPNet) ([]RangerEntry, error)
var results []RangerEntry var results []RangerEntry
for _, entry := range entries { for _, entry := range entries {
entrynetwork := entry.Network() 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) results = append(results, entry)
} }
} }
......
...@@ -208,6 +208,13 @@ func (n Network) Contains(nn NetworkNumber) bool { ...@@ -208,6 +208,13 @@ func (n Network) Contains(nn NetworkNumber) bool {
return true 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 // LeastCommonBitPosition returns the smallest position of the preceding common
// bits of the 2 networks, and returns an error ErrNoGreatestCommonBit // bits of the 2 networks, and returns an error ErrNoGreatestCommonBit
// if the two network number diverges from the first bit. // if the two network number diverges from the first bit.
......
...@@ -412,6 +412,31 @@ func TestPreviousIP(t *testing.T) { ...@@ -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. Benchmarking ip manipulations.
......
...@@ -186,7 +186,7 @@ func (p *prefixTrie) containingNetworks(number rnet.NetworkNumber) ([]RangerEntr ...@@ -186,7 +186,7 @@ func (p *prefixTrie) containingNetworks(number rnet.NetworkNumber) ([]RangerEntr
func (p *prefixTrie) coveredNetworks(network rnet.Network) ([]RangerEntry, error) { func (p *prefixTrie) coveredNetworks(network rnet.Network) ([]RangerEntry, error) {
var results []RangerEntry var results []RangerEntry
if p.hasEntry() && network.Contains(p.network.Number) { if p.hasEntry() && network.Covers(p.network) {
results = []RangerEntry{p.entry} results = []RangerEntry{p.entry}
} }
if p.targetBitPosition() < 0 { if p.targetBitPosition() < 0 {
......
...@@ -404,6 +404,15 @@ var coveredNetworkTests = []coveredNetworkTest{ ...@@ -404,6 +404,15 @@ var coveredNetworkTests = []coveredNetworkTest{
[]string{"192.168.0.0/24", "192.168.1.1/32"}, []string{"192.168.0.0/24", "192.168.1.1/32"},
"path not taken", "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) { 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