summaryrefslogtreecommitdiff
path: root/vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go')
-rw-r--r--vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go b/vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go
new file mode 100644
index 00000000..861a5f62
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go
@@ -0,0 +1,38 @@
+package cidr
+
+import (
+ "fmt"
+ "math/big"
+ "net"
+)
+
+func ipToInt(ip net.IP) (*big.Int, int) {
+ val := &big.Int{}
+ val.SetBytes([]byte(ip))
+ if len(ip) == net.IPv4len {
+ return val, 32
+ } else if len(ip) == net.IPv6len {
+ return val, 128
+ } else {
+ panic(fmt.Errorf("Unsupported address length %d", len(ip)))
+ }
+}
+
+func intToIP(ipInt *big.Int, bits int) net.IP {
+ ipBytes := ipInt.Bytes()
+ ret := make([]byte, bits/8)
+ // Pack our IP bytes into the end of the return array,
+ // since big.Int.Bytes() removes front zero padding.
+ for i := 1; i <= len(ipBytes); i++ {
+ ret[len(ret)-i] = ipBytes[len(ipBytes)-i]
+ }
+ return net.IP(ret)
+}
+
+func insertNumIntoIP(ip net.IP, num int, prefixLen int) net.IP {
+ ipInt, totalBits := ipToInt(ip)
+ bigNum := big.NewInt(int64(num))
+ bigNum.Lsh(bigNum, uint(totalBits-prefixLen))
+ ipInt.Or(ipInt, bigNum)
+ return intToIP(ipInt, totalBits)
+}