diff --git a/README.md b/README.md index c74eec6953b23aee766a2ee9d605c9c10f718573..b2de0a1e0cc4d6fa446ced959e231c5d145e14b2 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/cidranger.go b/cidranger.go index 2f386182b2a648d35881c1cd453fc76920c8ba32..2e8f11888ece3d648634c9450e956e82cda3007f 100644 --- a/cidranger.go +++ b/cidranger.go @@ -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 diff --git a/trie_test.go b/trie_test.go index e73508dad8d93bb626cbf52c8d364e9870ae39c6..9b89a0dcb2e2a74db83c526d96fd7018379af102 100644 --- a/trie_test.go +++ b/trie_test.go @@ -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)