go get github.com/apparentlymart/go-cidr@v1.0.1
This includes fixes in the handling of IPv6 prefixes that leave a host portion longer than the size of int on the target platform.
This commit is contained in:
parent
ae3048fb98
commit
6f83197856
2
go.mod
2
go.mod
|
@ -11,7 +11,7 @@ require (
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190329064014-6e358769c32a
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190329064014-6e358769c32a
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190103054945-8205d1f41e70
|
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190103054945-8205d1f41e70
|
||||||
github.com/aliyun/aliyun-tablestore-go-sdk v4.1.2+incompatible
|
github.com/aliyun/aliyun-tablestore-go-sdk v4.1.2+incompatible
|
||||||
github.com/apparentlymart/go-cidr v1.0.0
|
github.com/apparentlymart/go-cidr v1.0.1
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0
|
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0
|
||||||
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2
|
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
|
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -38,8 +38,8 @@ github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e h1:ptBAamGVd6CfRsUty
|
||||||
github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
|
github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
|
||||||
github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0 h1:JaCC8jz0zdMLk2m+qCCVLLLM/PL93p84w4pK3aJWj60=
|
github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0 h1:JaCC8jz0zdMLk2m+qCCVLLLM/PL93p84w4pK3aJWj60=
|
||||||
github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M=
|
github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M=
|
||||||
github.com/apparentlymart/go-cidr v1.0.0 h1:lGDvXx8Lv9QHjrAVP7jyzleG4F9+FkRhJcEsDFxeb8w=
|
github.com/apparentlymart/go-cidr v1.0.1 h1:NmIwLZ/KdsjIUlhf+/Np40atNXm/+lZ5txfTJ/SpF+U=
|
||||||
github.com/apparentlymart/go-cidr v1.0.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
|
github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
|
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
||||||
|
|
|
@ -44,7 +44,7 @@ func Subnet(base *net.IPNet, newBits int, num int) (*net.IPNet, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return &net.IPNet{
|
return &net.IPNet{
|
||||||
IP: insertNumIntoIP(ip, num, newPrefixLen),
|
IP: insertNumIntoIP(ip, big.NewInt(int64(num)), newPrefixLen),
|
||||||
Mask: net.CIDRMask(newPrefixLen, addrLen),
|
Mask: net.CIDRMask(newPrefixLen, addrLen),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -56,19 +56,23 @@ func Subnet(base *net.IPNet, newBits int, num int) (*net.IPNet, error) {
|
||||||
func Host(base *net.IPNet, num int) (net.IP, error) {
|
func Host(base *net.IPNet, num int) (net.IP, error) {
|
||||||
ip := base.IP
|
ip := base.IP
|
||||||
mask := base.Mask
|
mask := base.Mask
|
||||||
|
bigNum := big.NewInt(int64(num))
|
||||||
|
|
||||||
parentLen, addrLen := mask.Size()
|
parentLen, addrLen := mask.Size()
|
||||||
hostLen := addrLen - parentLen
|
hostLen := addrLen - parentLen
|
||||||
|
|
||||||
maxHostNum := uint64(1<<uint64(hostLen)) - 1
|
maxHostNum := big.NewInt(int64(1))
|
||||||
|
maxHostNum.Lsh(maxHostNum, uint(hostLen))
|
||||||
|
maxHostNum.Sub(maxHostNum, big.NewInt(1))
|
||||||
|
|
||||||
numUint64 := uint64(num)
|
numUint64 := big.NewInt(int64(bigNum.Uint64()))
|
||||||
if num < 0 {
|
if bigNum.Cmp(big.NewInt(0)) == -1 {
|
||||||
numUint64 = uint64(-num) - 1
|
numUint64.Neg(bigNum)
|
||||||
num = int(maxHostNum - numUint64)
|
numUint64.Sub(numUint64, big.NewInt(int64(1)))
|
||||||
|
bigNum.Sub(maxHostNum, numUint64)
|
||||||
}
|
}
|
||||||
|
|
||||||
if numUint64 > maxHostNum {
|
if numUint64.Cmp(maxHostNum) == 1 {
|
||||||
return nil, fmt.Errorf("prefix of %d does not accommodate a host numbered %d", parentLen, num)
|
return nil, fmt.Errorf("prefix of %d does not accommodate a host numbered %d", parentLen, num)
|
||||||
}
|
}
|
||||||
var bitlength int
|
var bitlength int
|
||||||
|
@ -77,7 +81,7 @@ func Host(base *net.IPNet, num int) (net.IP, error) {
|
||||||
} else {
|
} else {
|
||||||
bitlength = 128
|
bitlength = 128
|
||||||
}
|
}
|
||||||
return insertNumIntoIP(ip, num, bitlength), nil
|
return insertNumIntoIP(ip, bigNum, bitlength), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddressRange returns the first and last addresses in the given CIDR range.
|
// AddressRange returns the first and last addresses in the given CIDR range.
|
||||||
|
@ -129,7 +133,11 @@ func VerifyNoOverlap(subnets []*net.IPNet, CIDRBlock *net.IPNet) error {
|
||||||
if !CIDRBlock.Contains(firstLastIP[i][0]) || !CIDRBlock.Contains(firstLastIP[i][1]) {
|
if !CIDRBlock.Contains(firstLastIP[i][0]) || !CIDRBlock.Contains(firstLastIP[i][1]) {
|
||||||
return fmt.Errorf("%s does not fully contain %s", CIDRBlock.String(), s.String())
|
return fmt.Errorf("%s does not fully contain %s", CIDRBlock.String(), s.String())
|
||||||
}
|
}
|
||||||
for j := i + 1; j < len(subnets); j++ {
|
for j := 0; j < len(subnets); j++ {
|
||||||
|
if i == j {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
first := firstLastIP[j][0]
|
first := firstLastIP[j][0]
|
||||||
last := firstLastIP[j][1]
|
last := firstLastIP[j][1]
|
||||||
if s.Contains(first) || s.Contains(last) {
|
if s.Contains(first) || s.Contains(last) {
|
||||||
|
|
|
@ -29,9 +29,8 @@ func intToIP(ipInt *big.Int, bits int) net.IP {
|
||||||
return net.IP(ret)
|
return net.IP(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
func insertNumIntoIP(ip net.IP, num int, prefixLen int) net.IP {
|
func insertNumIntoIP(ip net.IP, bigNum *big.Int, prefixLen int) net.IP {
|
||||||
ipInt, totalBits := ipToInt(ip)
|
ipInt, totalBits := ipToInt(ip)
|
||||||
bigNum := big.NewInt(int64(num))
|
|
||||||
bigNum.Lsh(bigNum, uint(totalBits-prefixLen))
|
bigNum.Lsh(bigNum, uint(totalBits-prefixLen))
|
||||||
ipInt.Or(ipInt, bigNum)
|
ipInt.Or(ipInt, bigNum)
|
||||||
return intToIP(ipInt, totalBits)
|
return intToIP(ipInt, totalBits)
|
||||||
|
|
|
@ -70,7 +70,7 @@ github.com/aliyun/aliyun-tablestore-go-sdk/tablestore/search
|
||||||
github.com/antchfx/xpath
|
github.com/antchfx/xpath
|
||||||
# github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0
|
# github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0
|
||||||
github.com/antchfx/xquery/xml
|
github.com/antchfx/xquery/xml
|
||||||
# github.com/apparentlymart/go-cidr v1.0.0
|
# github.com/apparentlymart/go-cidr v1.0.1
|
||||||
github.com/apparentlymart/go-cidr/cidr
|
github.com/apparentlymart/go-cidr/cidr
|
||||||
# github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0
|
# github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0
|
||||||
github.com/apparentlymart/go-dump/dump
|
github.com/apparentlymart/go-dump/dump
|
||||||
|
|
Loading…
Reference in New Issue