From 0700f847c59d44155ad89917b52dd58dc89f3b73 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Wed, 11 Mar 2026 19:24:05 +0000
Subject: [PATCH] Allocate point-to-point addresses when option ptp=1 is specified

---
 lib/Ipam.py |   23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/lib/Ipam.py b/lib/Ipam.py
index 12f4a56..2cffed2 100644
--- a/lib/Ipam.py
+++ b/lib/Ipam.py
@@ -12,8 +12,7 @@
     def __init__(self, pool: str = None, options: dict = None, subPool: str = None, v6: bool = None):
         if pool == '':
             pool = None
-        if options is None:
-            options = {}
+        self.options = options or {}
         if subPool == '':
             subPool = None
 
@@ -42,8 +41,10 @@
         if not self.subpool.subnet_of(self.pool):
             raise InputValidationException('Subpool must be a subnet of pool')
 
+        self.ptp = self.options.get('ptp', '0') == '1'
+
         self.allocations = set()
-        self.current = self.subpool.hosts()
+        self.current = self.subpool.hosts() if not self.ptp else self.subpool.__iter__()
 
         self.v6 = isinstance(self.pool, ipaddress.IPv6Network)
 
@@ -62,7 +63,7 @@
         for address in self.current:
             if not self._is_allocated(address):
                 return address
-        self.current = self.subpool.hosts()
+        self.current = self.subpool.hosts() if not self.ptp else self.subpool.__iter__()
         for address in self.current:
             if not self._is_allocated(address):
                 return address
@@ -74,10 +75,11 @@
         else:
             address = ipaddress.ip_address(address)
 
-        if self.pool.network_address == address:
-            raise InputValidationException('Cannot allocate network address to a host')
-        if not self.v6 and self.pool.broadcast_address == address:
-            raise InputValidationException('Cannot allocate broadcast address to a host')
+        if not self.ptp:
+            if self.pool.network_address == address:
+                raise InputValidationException('Cannot allocate network address to a host')
+            if not self.v6 and self.pool.broadcast_address == address:
+                raise InputValidationException('Cannot allocate broadcast address to a host')
         if address not in self.pool:
             raise InputValidationException('Requested address does not belong to a pool')
 
@@ -86,7 +88,10 @@
             raise InputValidationException('Requested address {} is already used'.format(address))
         self.allocations.add(address)
 
-        return '{}/{}'.format(address, self.pool.prefixlen)
+        prefixlen = self.pool.prefixlen
+        if self.ptp:
+            prefixlen = 128 if self.v6 else 32
+        return '{}/{}'.format(address, prefixlen)
 
     def deallocate(self, address: str):
         address = ipaddress.ip_address(address)

--
Gitblit v1.10.0