github.com/Cloud-Foundations/Dominator@v0.3.4/lib/net/util/math.go (about) 1 package util 2 3 import ( 4 "errors" 5 "net" 6 ) 7 8 var invertTable [256]byte 9 10 func init() { 11 for value := 0; value < 256; value++ { 12 invertTable[value] = invertByte(byte(value)) 13 } 14 } 15 16 func compareIPs(left, right net.IP) bool { 17 leftVal, err := ipToValue(left) 18 if err != nil { 19 return false 20 } 21 rightVal, err := ipToValue(right) 22 if err != nil { 23 return false 24 } 25 return leftVal < rightVal 26 } 27 28 func copyIP(ip net.IP) net.IP { 29 retval := make(net.IP, len(ip)) 30 copy(retval, ip) 31 return retval 32 } 33 34 func decrementIP(ip net.IP) { 35 for index := len(ip) - 1; index >= 0; index-- { 36 if ip[index] > 0 { 37 ip[index]-- 38 return 39 } 40 ip[index] = 0xff 41 } 42 } 43 44 func incrementIP(ip net.IP) { 45 for index := len(ip) - 1; index >= 0; index-- { 46 if ip[index] < 255 { 47 ip[index]++ 48 return 49 } 50 ip[index] = 0 51 } 52 } 53 54 func invertByte(input byte) byte { 55 var inverted byte 56 for index := 0; index < 8; index++ { 57 inverted <<= 1 58 if input&0x80 == 0 { 59 inverted |= 1 60 } 61 input <<= 1 62 } 63 return inverted 64 } 65 66 func invertIP(ip net.IP) { 67 for index, value := range ip { 68 ip[index] = invertTable[value] 69 } 70 } 71 72 func ipToValue(ip net.IP) (uint32, error) { 73 ip = ip.To4() 74 if ip == nil { 75 return 0, errors.New("not an IPv4 address") 76 } 77 return uint32(ip[0])<<24 | 78 uint32(ip[1])<<16 | 79 uint32(ip[2])<<8 | 80 uint32(ip[3]), nil 81 }