util/net/cidr/range.go

40 lines
649 B
Go
Raw Normal View History

2017-11-17 10:07:00 +00:00
package cidr
import (
"fmt"
"net"
)
func NewCIDRRanger(cidr string) (CIDRRanger, error) {
2017-11-17 10:34:21 +00:00
_, nIPNet, err := net.ParseCIDR(cidr)
2017-11-17 10:07:00 +00:00
if nil != err {
return nil, err
}
2017-11-17 10:34:21 +00:00
switch len(nIPNet.IP) {
2017-11-17 10:07:00 +00:00
case net.IPv4len:
cr := &cidrRangeIPv4{
cidrNet: nIPNet,
}
return cr, nil
case net.IPv6len:
cr := &cidrRangeIPv6{
cidrNet: nIPNet,
}
return cr, nil
default:
return nil, fmt.Errorf("Net: not supported IP length")
}
}
type CIDRRanger interface {
Contains(ip net.IP) bool
First() net.IP
Last() net.IP
2017-11-17 10:12:50 +00:00
Range(exclude []net.IP) []net.IP
2017-11-17 10:07:00 +00:00
Broadcast() net.IP
Network() net.IP
2017-11-17 10:12:50 +00:00
Next(ip net.IP) net.IP
Previous(ip net.IP) net.IP
2017-11-17 10:07:00 +00:00
}