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  }