diff --git a/runtime/networkdriver/portallocator/portallocator.go b/runtime/networkdriver/portallocator/portallocator.go index 4d698f2de2..9ecd447116 100644 --- a/runtime/networkdriver/portallocator/portallocator.go +++ b/runtime/networkdriver/portallocator/portallocator.go @@ -18,8 +18,8 @@ type ( ) var ( + ErrAllPortsAllocated = errors.New("all ports are allocated") ErrPortAlreadyAllocated = errors.New("port has already been allocated") - ErrPortExceedsRange = errors.New("port exceeds upper range") ErrUnknownProtocol = errors.New("unknown protocol") ) @@ -152,17 +152,21 @@ func equalsDefault(ip net.IP) bool { func findNextPort(proto string, allocated *collections.OrderedIntSet) (int, error) { port := nextPort(proto) + startSearchPort := port for allocated.Exists(port) { port = nextPort(proto) - } - if port > EndPortRange { - return 0, ErrPortExceedsRange + if startSearchPort == port { + return 0, ErrAllPortsAllocated + } } return port, nil } func nextPort(proto string) int { c := currentDynamicPort[proto] + 1 + if c > EndPortRange { + c = BeginPortRange + } currentDynamicPort[proto] = c return c } diff --git a/runtime/networkdriver/portallocator/portallocator_test.go b/runtime/networkdriver/portallocator/portallocator_test.go index f01bcfc99e..8b4062c37c 100644 --- a/runtime/networkdriver/portallocator/portallocator_test.go +++ b/runtime/networkdriver/portallocator/portallocator_test.go @@ -110,8 +110,8 @@ func TestAllocateAllPorts(t *testing.T) { } } - if _, err := RequestPort(defaultIP, "tcp", 0); err != ErrPortExceedsRange { - t.Fatalf("Expected error %s got %s", ErrPortExceedsRange, err) + if _, err := RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { + t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) } _, err := RequestPort(defaultIP, "udp", 0)