ing
This commit is contained in:
parent
cbe7492057
commit
4bf418325b
37
net/cidr/range.go
Normal file
37
net/cidr/range.go
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
package cidr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewCIDRRanger(cidr string) (CIDRRanger, error) {
|
||||||
|
nIP, nIPNet, err := net.ParseCIDR(cidr)
|
||||||
|
if nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch len(nIP) {
|
||||||
|
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
|
||||||
|
Range() []net.IP
|
||||||
|
Broadcast() net.IP
|
||||||
|
Network() net.IP
|
||||||
|
}
|
75
net/cidr/range_v4.go
Normal file
75
net/cidr/range_v4.go
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv4) Range() []net.IP {
|
||||||
|
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())
|
||||||
|
r := make([]net.IP, 0)
|
||||||
|
for i := fNum; i <= lNum; i++ {
|
||||||
|
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
|
||||||
|
}
|
39
net/cidr/range_v6.go
Normal file
39
net/cidr/range_v6.go
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package cidr
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
|
type cidrRangeIPv6 struct {
|
||||||
|
cidrNet *net.IPNet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Contains(ip net.IP) bool {
|
||||||
|
return cr.cidrNet.Contains(ip)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) First() net.IP {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Last() net.IP {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Range() []net.IP {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Broadcast() net.IP {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Network() net.IP {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Next(ip net.IP) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cidrRangeIPv6) Previous(ip net.IP) {
|
||||||
|
|
||||||
|
}
|
|
@ -1,64 +1,17 @@
|
||||||
package converter
|
package converter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
"fmt"
|
||||||
"strings"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func IPToUint64(ip string) uint64 {
|
func IPToInt(ip net.IP) (int32, error) {
|
||||||
isV4 := true
|
switch len(ip) {
|
||||||
for i := 0; i < len(ip); i++ {
|
case net.IPv4len:
|
||||||
switch ip[i] {
|
return IPv4ToInt(ip), nil
|
||||||
case ':':
|
case net.IPv6len:
|
||||||
isV4 = false
|
return IPv6ToInt(ip), nil
|
||||||
break
|
default:
|
||||||
case '.':
|
return 0, fmt.Errorf("Net: not supported IP length")
|
||||||
isV4 = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if !isV4 {
|
|
||||||
return ipv6ToUint64(ip)
|
|
||||||
}
|
|
||||||
return IPV4ToUint64(ip)
|
|
||||||
}
|
|
||||||
|
|
||||||
func IPV4ToUint64(s string) uint64 {
|
|
||||||
bits := strings.Split(s, ".")
|
|
||||||
|
|
||||||
b0, _ := strconv.Atoi(bits[0])
|
|
||||||
b1, _ := strconv.Atoi(bits[1])
|
|
||||||
b2, _ := strconv.Atoi(bits[2])
|
|
||||||
b3, _ := strconv.Atoi(bits[3])
|
|
||||||
|
|
||||||
var sum uint64
|
|
||||||
|
|
||||||
// left shifting 24,16,8,0 and bitwise OR
|
|
||||||
|
|
||||||
sum += uint64(b0) << 24
|
|
||||||
sum += uint64(b1) << 16
|
|
||||||
sum += uint64(b2) << 8
|
|
||||||
sum += uint64(b3)
|
|
||||||
|
|
||||||
return sum
|
|
||||||
}
|
|
||||||
|
|
||||||
func ipv6ToUint64(s string) uint64 {
|
|
||||||
bits := strings.Split(s, ":")
|
|
||||||
|
|
||||||
b0, _ := strconv.Atoi(bits[0])
|
|
||||||
b1, _ := strconv.Atoi(bits[1])
|
|
||||||
b2, _ := strconv.Atoi(bits[2])
|
|
||||||
b3, _ := strconv.Atoi(bits[3])
|
|
||||||
|
|
||||||
var sum uint64
|
|
||||||
|
|
||||||
// left shifting 24,16,8,0 and bitwise OR
|
|
||||||
|
|
||||||
sum += uint64(b0) << 24
|
|
||||||
sum += uint64(b1) << 16
|
|
||||||
sum += uint64(b2) << 8
|
|
||||||
sum += uint64(b3)
|
|
||||||
|
|
||||||
return sum
|
|
||||||
}
|
}
|
||||||
|
|
17
net/converter/ip_v4.go
Normal file
17
net/converter/ip_v4.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
package converter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
func IPv4ToInt(ip net.IP) int32 {
|
||||||
|
return int32(binary.BigEndian.Uint32(ip.To4()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func IntToIPv4(n int32) net.IP {
|
||||||
|
b := make([]byte, 4)
|
||||||
|
binary.BigEndian.PutUint32(b, uint32(n))
|
||||||
|
return net.IP(b)
|
||||||
|
|
||||||
|
}
|
15
net/converter/ip_v6.go
Normal file
15
net/converter/ip_v6.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package converter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Not implemented
|
||||||
|
func IPv6ToInt(ip net.IP) int32 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not implemented
|
||||||
|
func IntToIPv6(n int32) net.IP {
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user