// return an available ip if one is currently available. If not, // return the next available ip for the nextwork func (allocated *allocatedMap) getNextIP(network *net.IPNet) (*net.IP, error) { var ( ownIP = ipToInt(&network.IP) first, _ = networkdriver.NetworkRange(network) base = ipToInt(&first) size = int(networkdriver.NetworkSize(network.Mask)) max = int32(size - 2) // size -1 for the broadcast network, -1 for the gateway network pos = allocated.last ) var ( firstNetIP = network.IP.To4().Mask(network.Mask) firstAsInt = ipToInt(&firstNetIP) + 1 ) for i := int32(0); i < max; i++ { pos = pos%max + 1 next := int32(base + pos) if next == ownIP || next == firstAsInt { continue } if _, ok := allocated.p[pos]; ok { continue } allocated.p[pos] = struct{}{} allocated.last = pos return intToIP(next), nil } return nil, ErrNoAvailableIPs }
// convert the ip into the position in the subnet. Only // position are saved in the set func getPosition(network *net.IPNet, ip *net.IP) int32 { first, _ := networkdriver.NetworkRange(network) return ipToInt(ip) - ipToInt(&first) }