mirror of
https://github.com/containers/podman.git
synced 2026-03-15 13:17:39 -04:00
Add a new boltdb to handle IPAM assignment. The db structure is the following: Each network has their own bucket with the network name as bucket key. Inside the network bucket there is an ID bucket which maps the container ID (key) to a json array of ip addresses (value). The network bucket also has a bucket for each subnet, the subnet is used as key. Inside the subnet bucket an ip is used as key and the container ID as value. The db should be stored on a tmpfs to ensure we always have a clean state after a reboot. Signed-off-by: Paul Holzinger <pholzing@redhat.com>
57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package util
|
|
|
|
import (
|
|
"net"
|
|
)
|
|
|
|
// IsIPv6 returns true if netIP is IPv6.
|
|
func IsIPv6(netIP net.IP) bool {
|
|
return netIP != nil && netIP.To4() == nil
|
|
}
|
|
|
|
// IsIPv4 returns true if netIP is IPv4.
|
|
func IsIPv4(netIP net.IP) bool {
|
|
return netIP != nil && netIP.To4() != nil
|
|
}
|
|
|
|
// LastIPInSubnet gets the last IP in a subnet
|
|
func LastIPInSubnet(addr *net.IPNet) (net.IP, error) { //nolint:interfacer
|
|
// re-parse to ensure clean network address
|
|
_, cidr, err := net.ParseCIDR(addr.String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ones, bits := cidr.Mask.Size()
|
|
if ones == bits {
|
|
return cidr.IP, nil
|
|
}
|
|
for i := range cidr.IP {
|
|
cidr.IP[i] = cidr.IP[i] | ^cidr.Mask[i]
|
|
}
|
|
return cidr.IP, nil
|
|
}
|
|
|
|
// FirstIPInSubnet gets the first IP in a subnet
|
|
func FirstIPInSubnet(addr *net.IPNet) (net.IP, error) { //nolint:interfacer
|
|
// re-parse to ensure clean network address
|
|
_, cidr, err := net.ParseCIDR(addr.String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ones, bits := cidr.Mask.Size()
|
|
if ones == bits {
|
|
return cidr.IP, nil
|
|
}
|
|
cidr.IP[len(cidr.IP)-1]++
|
|
return cidr.IP, nil
|
|
}
|
|
|
|
// NormalizeIP will transform the given ip to the 4 byte len ipv4 if possible
|
|
func NormalizeIP(ip *net.IP) {
|
|
ipv4 := ip.To4()
|
|
if ipv4 != nil {
|
|
*ip = ipv4
|
|
}
|
|
}
|