aboutsummaryrefslogtreecommitdiff
path: root/libpod/network/subnet.go
diff options
context:
space:
mode:
authorPaul Holzinger <paul.holzinger@web.de>2020-11-23 11:41:40 +0100
committerPaul Holzinger <paul.holzinger@web.de>2020-11-23 11:55:29 +0100
commit70e7acdb23715298624d123f7cc7c9dbcdf0465c (patch)
tree32138518876bc7afbf0e1d3446fc85b7034878a7 /libpod/network/subnet.go
parent5292d5a7b85f9d2ae0b2a3734f8ae4baeba80f11 (diff)
downloadpodman-70e7acdb23715298624d123f7cc7c9dbcdf0465c.tar.gz
podman-70e7acdb23715298624d123f7cc7c9dbcdf0465c.tar.bz2
podman-70e7acdb23715298624d123f7cc7c9dbcdf0465c.zip
Fix ip-range for classless subnet masks
The `LastIPInSubnet` function worked only for classful subnet masks (e.g. /8, /16, /24). For non standard subnet masks this returned the wrong ip address. This works now for all subnet mask. A unit test is added to ensure this. Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
Diffstat (limited to 'libpod/network/subnet.go')
-rw-r--r--libpod/network/subnet.go14
1 files changed, 7 insertions, 7 deletions
diff --git a/libpod/network/subnet.go b/libpod/network/subnet.go
index 90f0cdfce..120038e57 100644
--- a/libpod/network/subnet.go
+++ b/libpod/network/subnet.go
@@ -54,14 +54,10 @@ func LastIPInSubnet(addr *net.IPNet) (net.IP, error) { //nolint:interfacer
ones, bits := cidr.Mask.Size()
if ones == bits {
- return FirstIPInSubnet(cidr)
+ return cidr.IP, nil
}
- hostStart := ones / 8
- // Handle the first host byte
- cidr.IP[hostStart] |= 0xff & cidr.Mask[hostStart]
- // Fill the rest with ones
- for i := hostStart; i < len(cidr.IP); i++ {
- cidr.IP[i] = 0xff
+ for i := range cidr.IP {
+ cidr.IP[i] = cidr.IP[i] | ^cidr.Mask[i]
}
return cidr.IP, nil
}
@@ -73,6 +69,10 @@ func FirstIPInSubnet(addr *net.IPNet) (net.IP, error) { //nolint:interfacer
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
}