From 115d2ec7d8bb2fb8765e5167ac8fcc50c3b7b635 Mon Sep 17 00:00:00 2001 From: Alessandro Boch Date: Thu, 22 Oct 2015 12:58:45 -0700 Subject: [PATCH] Do not manipulate bitseq length to reserve broadcast address Signed-off-by: Alessandro Boch --- libnetwork/ipam/allocator.go | 10 +++++----- libnetwork/ipam/allocator_test.go | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/libnetwork/ipam/allocator.go b/libnetwork/ipam/allocator.go index 119031da89..7e4d85697f 100644 --- a/libnetwork/ipam/allocator.go +++ b/libnetwork/ipam/allocator.go @@ -250,11 +250,6 @@ func (a *Allocator) insertBitMask(key SubnetKey, pool *net.IPNet) error { ones, bits := pool.Mask.Size() numAddresses := uint64(1 << uint(bits-ones)) - if ipVer == v4 { - // Do not let broadcast address be reserved - numAddresses-- - } - // Allow /64 subnet if ipVer == v6 && numAddresses == 0 { numAddresses-- @@ -270,6 +265,11 @@ func (a *Allocator) insertBitMask(key SubnetKey, pool *net.IPNet) error { // Do the same for IPv6 so that bridge ip starts with XXXX...::1 h.Set(0) + // Do not let broadcast address be reserved + if ipVer == v4 { + h.Set(numAddresses - 1) + } + a.Lock() a.addresses[key] = h a.Unlock() diff --git a/libnetwork/ipam/allocator_test.go b/libnetwork/ipam/allocator_test.go index 82ec43d84e..0b0242df27 100644 --- a/libnetwork/ipam/allocator_test.go +++ b/libnetwork/ipam/allocator_test.go @@ -575,6 +575,23 @@ func TestGetSameAddress(t *testing.T) { } } +func TestGetAddressSubPoolEqualPool(t *testing.T) { + a, err := getAllocator() + if err != nil { + t.Fatal(err) + } + // Requesting a subpool of same size of the master pool should not cause any problem on ip allocation + pid, _, _, err := a.RequestPool(localAddressSpace, "172.18.0.0/16", "172.18.0.0/16", nil, false) + if err != nil { + t.Fatal(err) + } + + _, _, err = a.RequestAddress(pid, nil, nil) + if err != nil { + t.Fatal(err) + } +} + func TestRequestReleaseAddressFromSubPool(t *testing.T) { a, err := getAllocator() if err != nil {