Browse Source

More intelligent handling of first/last IPs

Jeremy Stretch 8 years ago
parent
commit
3b9ac3b986
1 changed files with 10 additions and 8 deletions
  1. 10 8
      netbox/ipam/views.py

+ 10 - 8
netbox/ipam/views.py

@@ -39,15 +39,17 @@ def add_available_ipaddresses(prefix, ipaddress_list):
     output = []
     output = []
     prev_ip = None
     prev_ip = None
 
 
-    # Determine first and last usable IP
-    if prefix.version == 6 or (prefix.version == 4 and prefix.prefixlen == 31):
-        first_ip_in_prefix = netaddr.IPAddress(prefix.first)
-    else:
+    # Ignore the "network address" for IPv4 prefixes larger than /31
+    if prefix.version == 4 and prefix.prefixlen < 31:
         first_ip_in_prefix = netaddr.IPAddress(prefix.first + 1)
         first_ip_in_prefix = netaddr.IPAddress(prefix.first + 1)
-    if prefix.version == 6 or (prefix.version == 4 and prefix.prefixlen == 31):
-        last_ip_in_prefix = netaddr.IPAddress(prefix.last)
     else:
     else:
+        first_ip_in_prefix = netaddr.IPAddress(prefix.first)
+
+    # Ignore the broadcast address for IPv4 prefixes larger than /31
+    if prefix.version == 4 and prefix.prefixlen < 31:
         last_ip_in_prefix = netaddr.IPAddress(prefix.last - 1)
         last_ip_in_prefix = netaddr.IPAddress(prefix.last - 1)
+    else:
+        last_ip_in_prefix = netaddr.IPAddress(prefix.last)
 
 
     if not ipaddress_list:
     if not ipaddress_list:
         return [(
         return [(
@@ -56,7 +58,7 @@ def add_available_ipaddresses(prefix, ipaddress_list):
         )]
         )]
 
 
     # Account for any available IPs before the first real IP
     # Account for any available IPs before the first real IP
-    if ipaddress_list[0].address.ip != first_ip_in_prefix:
+    if ipaddress_list[0].address.ip > first_ip_in_prefix:
         skipped_count = int(ipaddress_list[0].address.ip - first_ip_in_prefix)
         skipped_count = int(ipaddress_list[0].address.ip - first_ip_in_prefix)
         first_skipped = '{}/{}'.format(first_ip_in_prefix, prefix.prefixlen)
         first_skipped = '{}/{}'.format(first_ip_in_prefix, prefix.prefixlen)
         output.append((skipped_count, first_skipped))
         output.append((skipped_count, first_skipped))
@@ -72,7 +74,7 @@ def add_available_ipaddresses(prefix, ipaddress_list):
         prev_ip = ip
         prev_ip = ip
 
 
     # Include any remaining available IPs
     # Include any remaining available IPs
-    if prev_ip.address.ip != last_ip_in_prefix:
+    if prev_ip.address.ip < last_ip_in_prefix:
         skipped_count = int(last_ip_in_prefix - prev_ip.address.ip)
         skipped_count = int(last_ip_in_prefix - prev_ip.address.ip)
         first_skipped = '{}/{}'.format(prev_ip.address.ip + 1, prefix.prefixlen)
         first_skipped = '{}/{}'.format(prev_ip.address.ip + 1, prefix.prefixlen)
         output.append((skipped_count, first_skipped))
         output.append((skipped_count, first_skipped))