Fixes #2757: Always treat first/last IPs within a /31 or /127 as usable

This commit is contained in:
Jeremy Stretch 2019-01-08 12:04:32 -05:00
parent 73a1d6a7ba
commit 0d415d94a5
2 changed files with 18 additions and 6 deletions

View File

@ -12,6 +12,7 @@ v2.5.3 (FUTURE)
## Bug Fixes ## Bug Fixes
* [#2742](https://github.com/digitalocean/netbox/issues/2742) - Preserve cluster assignment when editing a device * [#2742](https://github.com/digitalocean/netbox/issues/2742) - Preserve cluster assignment when editing a device
* [#2757](https://github.com/digitalocean/netbox/issues/2757) - Always treat first/last IPs within a /31 or /127 as usable
* [#2762](https://github.com/digitalocean/netbox/issues/2762) - Add missing DCIM field values to API `_choices` endpoint * [#2762](https://github.com/digitalocean/netbox/issues/2762) - Add missing DCIM field values to API `_choices` endpoint

View File

@ -438,8 +438,19 @@ class Prefix(ChangeLoggedModel, CustomFieldModel):
child_ips = netaddr.IPSet([ip.address.ip for ip in self.get_child_ips()]) child_ips = netaddr.IPSet([ip.address.ip for ip in self.get_child_ips()])
available_ips = prefix - child_ips available_ips = prefix - child_ips
# Remove unusable IPs from non-pool prefixes # All IP addresses within a pool are considered usable
if not self.is_pool: if self.is_pool:
return available_ips
# All IP addresses within a point-to-point prefix (IPv4 /31 or IPv6 /127) are considered usable
if (
self.family == 4 and self.prefix.prefixlen == 31 # RFC 3021
) or (
self.family == 6 and self.prefix.prefixlen == 127 # RFC 6164
):
return available_ips
# Omit first and last IP address from the available set
available_ips -= netaddr.IPSet([ available_ips -= netaddr.IPSet([
netaddr.IPAddress(self.prefix.first), netaddr.IPAddress(self.prefix.first),
netaddr.IPAddress(self.prefix.last), netaddr.IPAddress(self.prefix.last),