util/net/cidr/range_v4.go

90 lines
1.6 KiB
Go
Raw Normal View History

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)
2017-11-17 10:30:12 +00:00
Loop:
2017-11-17 10:07:00 +00:00
for i := fNum; i <= lNum; i++ {
2017-11-17 10:12:50 +00:00
for _, exN := range exs {
if exN == i {
2017-11-17 10:30:12 +00:00
continue Loop
2017-11-17 10:12:50 +00:00
}
}
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
}