diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index c6c8cf74c..1f3766e3a 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -340,16 +340,6 @@ class Prefix(PrimaryModel): 'prefix': "Cannot create prefix with /0 mask." }) - # Disallow host masks - if self.prefix.version == 4 and self.prefix.prefixlen == 32: - raise ValidationError({ - 'prefix': "Cannot create host addresses (/32) as prefixes. Create an IPv4 address instead." - }) - elif self.prefix.version == 6 and self.prefix.prefixlen == 128: - raise ValidationError({ - 'prefix': "Cannot create host addresses (/128) as prefixes. Create an IPv6 address instead." - }) - # Enforce unique IP space (if applicable) if (self.vrf is None and settings.ENFORCE_GLOBAL_UNIQUE) or (self.vrf and self.vrf.enforce_unique): duplicate_prefixes = self.get_duplicates() @@ -471,8 +461,8 @@ class Prefix(PrimaryModel): child_ips = netaddr.IPSet([ip.address.ip for ip in self.get_child_ips()]) available_ips = prefix - child_ips - # IPv6, pool, or IPv4 /31 sets are fully usable - if self.family == 6 or self.is_pool or self.prefix.prefixlen == 31: + # IPv6, pool, or IPv4 /31-/32 sets are fully usable + if self.family == 6 or self.is_pool or (self.family == 4 and self.prefix.prefixlen >= 31): return available_ips # For "normal" IPv4 prefixes, omit first and last addresses diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 8de6e9b1c..919b09b79 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -522,7 +522,7 @@ class IPAddressView(generic.ObjectView): # Parent prefixes table parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter( vrf=instance.vrf, - prefix__net_contains=str(instance.address.ip) + prefix__net_contains_or_equals=str(instance.address.ip) ).prefetch_related( 'site', 'role' )