-
Notifications
You must be signed in to change notification settings - Fork 32
/
netutils.go
73 lines (61 loc) · 1.34 KB
/
netutils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package logic
import (
"net"
"strconv"
"strings"
"github.com/pkg/errors"
)
const (
ipV4 = 4
ipV6 = 6
)
type cidrInfo struct {
IP string
netIP string
prefixLen int64
ver int8
}
func decodeIP(address string) (cidrInfo, error) {
if strings.Index(address, "/") == -1 {
address = address + "/0"
}
out := cidrInfo{}
var err error
out.IP, out.netIP, out.prefixLen, err = getIPPrefixAndPrefixLen(address)
if err != nil {
return out, err
}
out.ver, err = getIPVersion(out.IP)
if err != nil {
return out, err
}
return out, nil
}
func getIPVersionFromCIDR(cidr string) (int8, error) {
prefix := strings.Split(cidr, "/")
return getIPVersion(prefix[0])
}
func getIPVersion(ipAddress string) (int8, error) {
ip := net.ParseIP(ipAddress)
if ip == nil {
return -1, errors.Errorf("Invalid ip address: %s", ipAddress)
}
if v := ip.To4(); v != nil {
return ipV4, nil
}
return ipV6, nil
}
func getIPPrefixAndPrefixLen(cidr string) (prefixIP string, prefixNetIP string, prefixLen int64, err error) {
ip, netIP, err := net.ParseCIDR(cidr)
if err != nil {
return "", "", 0, err
}
prefix := strings.Split(netIP.String(), "/")
prefixIP = ip.String()
prefixNetIP = prefix[0]
prefixLen, err = strconv.ParseInt(prefix[1], 10, 64)
if err != nil {
return "", "", 0, err
}
return prefixIP, prefixNetIP, prefixLen, nil
}