From 6402a47f9d8a02ee0069df716022acdab867e650 Mon Sep 17 00:00:00 2001 From: Yulin Chen Date: Mon, 23 Dec 2019 04:07:17 -0800 Subject: [PATCH] Document how to get all entries in ranger (#25) * Document how to get all entries in ranger * update doc + test --- README.md | 5 +++++ cidranger.go | 17 +++++++++++++++++ trie_test.go | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/README.md b/README.md index c74eec6..b2de0a1 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 2f38618..2e8f118 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 e73508d..9b89a0d 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) -- GitLab