Browse Source

[2324] increaseAddress() added in IterativeAllocator.

Tomek Mrugalski 12 years ago
parent
commit
d97fa9cb68
3 changed files with 40 additions and 7 deletions
  1. 1 0
      src/bin/dhcp6/Makefile.am
  2. 38 6
      src/bin/dhcp6/alloc_engine.cc
  3. 1 1
      src/bin/dhcp6/alloc_engine.h

+ 1 - 0
src/bin/dhcp6/Makefile.am

@@ -47,6 +47,7 @@ pkglibexec_PROGRAMS = b10-dhcp6
 b10_dhcp6_SOURCES  = main.cc
 b10_dhcp6_SOURCES += ctrl_dhcp6_srv.cc ctrl_dhcp6_srv.h
 b10_dhcp6_SOURCES += config_parser.cc config_parser.h
+b10_dhcp6_SOURCES += alloc_engine.cc alloc_engine.h
 b10_dhcp6_SOURCES += dhcp6_log.cc dhcp6_log.h
 b10_dhcp6_SOURCES += dhcp6_srv.cc dhcp6_srv.h
 

+ 38 - 6
src/bin/dhcp6/alloc_engine.cc

@@ -25,6 +25,33 @@ AllocEngine::IterativeAllocator::IterativeAllocator()
 }
 
 isc::asiolink::IOAddress
+AllocEngine::IterativeAllocator::increaseAddress(const isc::asiolink::IOAddress& addr) {
+    uint8_t packed[V6ADDRESS_LEN];
+    int len;
+    if (addr.getFamily()==AF_INET) {
+        // IPv4
+        memcpy(packed, addr.getAddress().to_v4().to_bytes().data(), 4);
+        len = 4;
+    } else {
+        // IPv6
+        memcpy(packed, addr.getAddress().to_v6().to_bytes().data(), 16);
+        len = 16;
+    }
+
+    // First we copy the whole address as 16 bytes.
+    bool carry = false;
+    for (int i = len; i >=0; --i) {
+        packed[i]++;
+        if (packed[i] != 0) {
+            break;
+        }
+    }
+
+    return (IOAddress::from_bytes(addr.getFamily(), packed));
+}
+
+
+isc::asiolink::IOAddress
 AllocEngine::IterativeAllocator::pickAddress(const Subnet6Ptr& subnet,
                                              const DuidPtr& duid,
                                              const IOAddress& hint) {
@@ -118,6 +145,14 @@ AllocEngine::allocateAddress6(const Subnet6Ptr& subnet,
         isc_throw(InvalidOperation, "No allocator selected");
     }
 
+    // check if there's existing lease for that subnet/duid/iaid combination.
+    Lease6Ptr existing = LeaseMgr::instance().getLease6(*duid, iaid, subnet->getID());
+    if (existing) {
+        // we have a lease already. This is a returning client, probably after
+        // his reboot.
+        return (existing);
+    }
+
     unsigned int i = attempts_;
     do {
         IOAddress candidate = allocator_->pickAddress(subnet, duid, hint);
@@ -153,12 +188,9 @@ Lease6Ptr AllocEngine::createLease(const Subnet6Ptr& subnet,
                                    uint32_t iaid,
                                    const IOAddress& addr) {
 
-    Lease6Ptr lease = new Lease6(Lease6::LEASE_IA_NA, addr, iaid,
-                                 duid, subnet->getPreferred(),
-                                 subnet->getValid(),
-                                 subnet->getT1(),
-                                 subnet->getT2(),
-                                 subnet->getID());
+    Lease6Ptr lease(new Lease6(Lease6::LEASE_IA_NA, addr, duid, iaid,
+                               subnet->getPreferred(), subnet->getValid(),
+                               subnet->getT1(), subnet->getT2(), subnet->getID()));
 
     bool status = LeaseMgr::instance().addLease(lease);
 

+ 1 - 1
src/bin/dhcp6/alloc_engine.h

@@ -67,7 +67,7 @@ protected:
                         const DuidPtr& duid,
                         const isc::asiolink::IOAddress& hint);
     private:
-        isc::asiolink::IOAddress increaseAddress(isc::asiolink::IOAddress& addr);
+        isc::asiolink::IOAddress increaseAddress(const isc::asiolink::IOAddress& addr);
 
     };