...
1
16
17 package net
18
19 import (
20 "fmt"
21 "net"
22 )
23
24
25 type IPFamily string
26
27
28 const (
29 IPFamilyUnknown IPFamily = ""
30
31 IPv4 IPFamily = "4"
32 IPv6 IPFamily = "6"
33 )
34
35
36
37
38 func IsDualStackIPs(ips []net.IP) (bool, error) {
39 v4Found := false
40 v6Found := false
41 for i, ip := range ips {
42 switch IPFamilyOf(ip) {
43 case IPv4:
44 v4Found = true
45 case IPv6:
46 v6Found = true
47 default:
48 return false, fmt.Errorf("invalid IP[%d]: %v", i, ip)
49 }
50 }
51
52 return (v4Found && v6Found), nil
53 }
54
55
56
57
58 func IsDualStackIPStrings(ips []string) (bool, error) {
59 parsedIPs := make([]net.IP, 0, len(ips))
60 for i, ip := range ips {
61 parsedIP := ParseIPSloppy(ip)
62 if parsedIP == nil {
63 return false, fmt.Errorf("invalid IP[%d]: %v", i, ip)
64 }
65 parsedIPs = append(parsedIPs, parsedIP)
66 }
67 return IsDualStackIPs(parsedIPs)
68 }
69
70
71
72
73 func IsDualStackCIDRs(cidrs []*net.IPNet) (bool, error) {
74 v4Found := false
75 v6Found := false
76 for i, cidr := range cidrs {
77 switch IPFamilyOfCIDR(cidr) {
78 case IPv4:
79 v4Found = true
80 case IPv6:
81 v6Found = true
82 default:
83 return false, fmt.Errorf("invalid CIDR[%d]: %v", i, cidr)
84 }
85 }
86
87 return (v4Found && v6Found), nil
88 }
89
90
91
92
93 func IsDualStackCIDRStrings(cidrs []string) (bool, error) {
94 parsedCIDRs, err := ParseCIDRs(cidrs)
95 if err != nil {
96 return false, err
97 }
98 return IsDualStackCIDRs(parsedCIDRs)
99 }
100
101
102 func IPFamilyOf(ip net.IP) IPFamily {
103 switch {
104 case ip.To4() != nil:
105 return IPv4
106 case ip.To16() != nil:
107 return IPv6
108 default:
109 return IPFamilyUnknown
110 }
111 }
112
113
114
115 func IPFamilyOfString(ip string) IPFamily {
116 return IPFamilyOf(ParseIPSloppy(ip))
117 }
118
119
120 func IPFamilyOfCIDR(cidr *net.IPNet) IPFamily {
121 if cidr == nil {
122 return IPFamilyUnknown
123 }
124 return IPFamilyOf(cidr.IP)
125 }
126
127
128 func IPFamilyOfCIDRString(cidr string) IPFamily {
129 ip, _, _ := ParseCIDRSloppy(cidr)
130 return IPFamilyOf(ip)
131 }
132
133
134 func IsIPv6(netIP net.IP) bool {
135 return IPFamilyOf(netIP) == IPv6
136 }
137
138
139
140
141 func IsIPv6String(ip string) bool {
142 return IPFamilyOfString(ip) == IPv6
143 }
144
145
146
147 func IsIPv6CIDR(cidr *net.IPNet) bool {
148 return IPFamilyOfCIDR(cidr) == IPv6
149 }
150
151
152
153
154 func IsIPv6CIDRString(cidr string) bool {
155 return IPFamilyOfCIDRString(cidr) == IPv6
156 }
157
158
159 func IsIPv4(netIP net.IP) bool {
160 return IPFamilyOf(netIP) == IPv4
161 }
162
163
164
165
166 func IsIPv4String(ip string) bool {
167 return IPFamilyOfString(ip) == IPv4
168 }
169
170
171
172 func IsIPv4CIDR(cidr *net.IPNet) bool {
173 return IPFamilyOfCIDR(cidr) == IPv4
174 }
175
176
177
178
179 func IsIPv4CIDRString(cidr string) bool {
180 return IPFamilyOfCIDRString(cidr) == IPv4
181 }
182
View as plain text