| // Package ipamutils provides utililty functions for ipam management |
| package ipamutils |
| |
| import ( |
| "net" |
| "sync" |
| ) |
| |
| var ( |
| // PredefinedBroadNetworks contains a list of 31 IPv4 private networks with host size 16 and 12 |
| // (172.17-31.x.x/16, 192.168.x.x/20) which do not overlap with the networks in `PredefinedGranularNetworks` |
| PredefinedBroadNetworks []*net.IPNet |
| // PredefinedGranularNetworks contains a list of 64K IPv4 private networks with host size 8 |
| // (10.x.x.x/24) which do not overlap with the networks in `PredefinedBroadNetworks` |
| PredefinedGranularNetworks []*net.IPNet |
| |
| initNetworksOnce sync.Once |
| ) |
| |
| // InitNetworks initializes the pre-defined networks used by the built-in IP allocator |
| func InitNetworks() { |
| initNetworksOnce.Do(func() { |
| PredefinedBroadNetworks = initBroadPredefinedNetworks() |
| PredefinedGranularNetworks = initGranularPredefinedNetworks() |
| }) |
| } |
| |
| func initBroadPredefinedNetworks() []*net.IPNet { |
| pl := make([]*net.IPNet, 0, 31) |
| mask := []byte{255, 255, 0, 0} |
| for i := 17; i < 32; i++ { |
| pl = append(pl, &net.IPNet{IP: []byte{172, byte(i), 0, 0}, Mask: mask}) |
| } |
| mask20 := []byte{255, 255, 240, 0} |
| for i := 0; i < 16; i++ { |
| pl = append(pl, &net.IPNet{IP: []byte{192, 168, byte(i << 4), 0}, Mask: mask20}) |
| } |
| return pl |
| } |
| |
| func initGranularPredefinedNetworks() []*net.IPNet { |
| pl := make([]*net.IPNet, 0, 256*256) |
| mask := []byte{255, 255, 255, 0} |
| for i := 0; i < 256; i++ { |
| for j := 0; j < 256; j++ { |
| pl = append(pl, &net.IPNet{IP: []byte{10, byte(i), byte(j), 0}, Mask: mask}) |
| } |
| } |
| return pl |
| } |