2017-11-17 10:07:00 +00:00
|
|
|
package cidr
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
|
|
|
|
"git.loafle.net/commons_go/util/net/converter"
|
|
|
|
)
|
|
|
|
|
|
|
|
type cidrRangeIPv4 struct {
|
|
|
|
cidrNet *net.IPNet
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) Contains(ip net.IP) bool {
|
|
|
|
return cr.cidrNet.Contains(ip)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) First() net.IP {
|
|
|
|
nIP := cr.Network()
|
|
|
|
return cr.Next(nIP)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) Last() net.IP {
|
|
|
|
bIP := cr.Broadcast()
|
|
|
|
return cr.Previous(bIP)
|
|
|
|
}
|
|
|
|
|
2017-11-17 10:12:50 +00:00
|
|
|
func (cr *cidrRangeIPv4) Range(exclude []net.IP) []net.IP {
|
2017-11-17 10:07:00 +00:00
|
|
|
fIP := cr.First()
|
|
|
|
if nil == fIP {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
lIP := cr.Last()
|
|
|
|
if nil == lIP {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
fNum := converter.IPv4ToInt(fIP.To4())
|
|
|
|
lNum := converter.IPv4ToInt(lIP.To4())
|
2017-11-17 10:12:50 +00:00
|
|
|
|
|
|
|
exs := make([]int32, 0)
|
|
|
|
if nil != exclude {
|
|
|
|
for _, ex := range exclude {
|
|
|
|
exs = append(exs, converter.IPv4ToInt(ex.To4()))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-17 10:07:00 +00:00
|
|
|
r := make([]net.IP, 0)
|
|
|
|
for i := fNum; i <= lNum; i++ {
|
2017-11-17 10:12:50 +00:00
|
|
|
for _, exN := range exs {
|
|
|
|
if exN == i {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
2017-11-17 10:07:00 +00:00
|
|
|
r = append(r, converter.IntToIPv4(i))
|
|
|
|
}
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) Broadcast() net.IP {
|
|
|
|
ip := cr.cidrNet.IP.To4()
|
|
|
|
bIP := net.IPv4(0, 0, 0, 0).To4()
|
|
|
|
for i := 0; i < len(bIP); i++ {
|
|
|
|
bIP[i] = ip[i] | ^cr.cidrNet.Mask[i]
|
|
|
|
}
|
|
|
|
return bIP
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) Network() net.IP {
|
|
|
|
ip := cr.cidrNet.IP.To4()
|
|
|
|
return ip.Mask(cr.cidrNet.Mask)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) Next(ip net.IP) net.IP {
|
|
|
|
nNum := converter.IPv4ToInt(ip.To4()) + 1
|
|
|
|
nIP := converter.IntToIPv4(nNum)
|
|
|
|
if cr.Contains(nIP) {
|
|
|
|
return nIP
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cr *cidrRangeIPv4) Previous(ip net.IP) net.IP {
|
|
|
|
nNum := converter.IPv4ToInt(ip.To4()) - 1
|
|
|
|
nIP := converter.IntToIPv4(nNum)
|
|
|
|
if cr.Contains(nIP) {
|
|
|
|
return nIP
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|