| 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 |
| } |