Cosmos Nicolaou | f7a11d9 | 2014-08-29 09:56:07 -0700 | [diff] [blame] | 1 | package netstate |
David Why Use Two When One Will Do Presotto | 748a0d5 | 2014-07-30 17:07:04 -0700 | [diff] [blame] | 2 | |
| 3 | import ( |
| 4 | "net" |
| 5 | ) |
| 6 | |
| 7 | var privateCIDRs = []net.IPNet{ |
| 8 | net.IPNet{IP: net.IPv4(10, 0, 0, 0), Mask: net.IPv4Mask(0xff, 0, 0, 0)}, |
| 9 | net.IPNet{IP: net.IPv4(172, 16, 0, 0), Mask: net.IPv4Mask(0xff, 0xf0, 0, 0)}, |
| 10 | net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(0xff, 0xff, 0, 0)}, |
| 11 | } |
| 12 | |
| 13 | // IsGloballyRoutable returns true if the argument is a globally routable IP address. |
Cosmos Nicolaou | f7a11d9 | 2014-08-29 09:56:07 -0700 | [diff] [blame] | 14 | func IsGloballyRoutableIP(ip net.IP) bool { |
David Why Use Two When One Will Do Presotto | 748a0d5 | 2014-07-30 17:07:04 -0700 | [diff] [blame] | 15 | if !ip.IsGlobalUnicast() { |
| 16 | return false |
| 17 | } |
| 18 | if ip4 := ip.To4(); ip4 != nil { |
| 19 | for _, cidr := range privateCIDRs { |
| 20 | if cidr.Contains(ip4) { |
| 21 | return false |
| 22 | } |
| 23 | } |
| 24 | if ip4.Equal(net.IPv4bcast) { |
| 25 | return false |
| 26 | } |
| 27 | } |
| 28 | return true |
| 29 | } |