Unverified Commit 6402a47f authored by Yulin Chen's avatar Yulin Chen Committed by GitHub

Document how to get all entries in ranger (#25)

* Document how to get all entries in ranger
* update doc + test
parent 1c6c8201
......@@ -55,6 +55,11 @@ To get all the networks given is contained in,
```go
containingNetworks, err = ranger.ContainingNetworks(net.ParseIP("128.168.1.0"))
```
To get all networks in ranger,
```go
entries, err := ranger.CoveredNetworks(*AllIPv4) // for IPv4
entries, err := ranger.CoveredNetworks(*AllIPv6) // for IPv6
```
## Benchmark
Compare hit/miss case for IPv4/IPv6 using PC trie vs brute force implementation, Ranger is initialized with published AWS ip ranges (889 IPv4 CIDR blocks and 360 IPv6)
......
......@@ -30,6 +30,12 @@ To get a list of CIDR blocks in constructed ranger that contains IP:
// returns []RangerEntry, error
entries, err := ranger.ContainingNetworks(net.ParseIP("192.168.0.1"))
To get a list of all IPv4/IPv6 rangers respectively:
// returns []RangerEntry, error
entries, err := ranger.CoveredNetworks(*AllIPv4)
entries, err := ranger.CoveredNetworks(*AllIPv6)
*/
package cidranger
......@@ -44,6 +50,17 @@ var ErrInvalidNetworkInput = fmt.Errorf("Invalid network input")
// ErrInvalidNetworkNumberInput is returned upon invalid network input.
var ErrInvalidNetworkNumberInput = fmt.Errorf("Invalid network number input")
// AllIPv4 is a IPv4 CIDR that contains all networks
var AllIPv4 = parseCIDRUnsafe("0.0.0.0/0")
// AllIPv6 is a IPv6 CIDR that contains all networks
var AllIPv6 = parseCIDRUnsafe("0::0/0")
func parseCIDRUnsafe(s string) *net.IPNet {
_, cidr, _ := net.ParseCIDR(s)
return cidr
}
// RangerEntry is an interface for insertable entry into a Ranger.
type RangerEntry interface {
Network() net.IPNet
......
......@@ -12,6 +12,13 @@ import (
rnet "github.com/yl2chen/cidranger/net"
)
func getAllByVersion(version rnet.IPVersion) *net.IPNet {
if version == rnet.IPv6 {
return AllIPv6
}
return AllIPv4
}
func TestPrefixTrieInsert(t *testing.T) {
cases := []struct {
version rnet.IPVersion
......@@ -74,6 +81,10 @@ func TestPrefixTrieInsert(t *testing.T) {
assert.Equal(t, len(tc.expectedNetworksInDepthOrder), trie.Len(), "trie size should match")
allNetworks, err := trie.CoveredNetworks(*getAllByVersion(tc.version))
assert.Nil(t, err)
assert.Equal(t, len(allNetworks), trie.Len(), "trie size should match")
walk := trie.walkDepth()
for _, network := range tc.expectedNetworksInDepthOrder {
_, ipnet, _ := net.ParseCIDR(network)
......@@ -204,6 +215,10 @@ func TestPrefixTrieRemove(t *testing.T) {
assert.Equal(t, len(tc.expectedNetworksInDepthOrder), trie.Len(), "trie size should match after revmoval")
allNetworks, err := trie.CoveredNetworks(*getAllByVersion(tc.version))
assert.Nil(t, err)
assert.Equal(t, len(allNetworks), trie.Len(), "trie size should match")
walk := trie.walkDepth()
for _, network := range tc.expectedNetworksInDepthOrder {
_, ipnet, _ := net.ParseCIDR(network)
......@@ -492,6 +507,10 @@ func TestTrieMemUsage(t *testing.T) {
assert.Less(t, 0, trie.Len(), "Len should > 0")
assert.LessOrEqualf(t, trie.Len(), numIPs, "Len should <= %d", numIPs)
allNetworks, err := trie.CoveredNetworks(*getAllByVersion(rnet.IPv4))
assert.Nil(t, err)
assert.Equal(t, len(allNetworks), trie.Len(), "trie size should match")
// Remove networks.
_, all, _ := net.ParseCIDR("0.0.0.0/0")
ll, _ := trie.CoveredNetworks(*all)
......
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