43 lines
1014 B
Go
43 lines
1014 B
Go
|
package main
|
||
|
|
||
|
import "fmt"
|
||
|
|
||
|
type AddressCounter = int
|
||
|
|
||
|
type Ip4AddressAllocator struct {
|
||
|
networks map[int]AddressCounter
|
||
|
}
|
||
|
|
||
|
func (a *Ip4AddressAllocator) AddNetwork(networkNumber int) {
|
||
|
a.networks[networkNumber] = 1
|
||
|
}
|
||
|
|
||
|
func (a *Ip4AddressAllocator) NewIp4InterfaceAddress(inputNetworkNumber ...int) (string, error) {
|
||
|
var networkNumber int = 0
|
||
|
if len(inputNetworkNumber) > 0 {
|
||
|
networkNumber = inputNetworkNumber[0]
|
||
|
}
|
||
|
|
||
|
if _, ok := a.networks[networkNumber]; !ok {
|
||
|
a.AddNetwork(networkNumber)
|
||
|
}
|
||
|
|
||
|
numberOfAddresses := a.networks[networkNumber]
|
||
|
|
||
|
if numberOfAddresses == 254 {
|
||
|
return "", fmt.Errorf("no available IPv4 addresses")
|
||
|
}
|
||
|
|
||
|
address := fmt.Sprintf("10.10.%v.%v/24", networkNumber, numberOfAddresses)
|
||
|
a.networks[networkNumber] = numberOfAddresses + 1
|
||
|
|
||
|
return address, nil
|
||
|
}
|
||
|
|
||
|
func NewIp4AddressAllocator() *Ip4AddressAllocator {
|
||
|
var ip4AddrAllocator = new(Ip4AddressAllocator)
|
||
|
ip4AddrAllocator.networks = make(map[int]AddressCounter)
|
||
|
ip4AddrAllocator.AddNetwork(0)
|
||
|
return ip4AddrAllocator
|
||
|
}
|