EXTRA_DIST += terminology.dox
EXTRA_DIST += unit-tests.dox
-EXTRA_DIST += images/assign-lease.png
-EXTRA_DIST += images/assign-lease.svg
-EXTRA_DIST += images/assign-lease.uml
+EXTRA_DIST += images/assign-lease4.png
+EXTRA_DIST += images/assign-lease4.svg
+EXTRA_DIST += images/assign-lease4.uml
EXTRA_DIST += images/main-loop.png
EXTRA_DIST += images/main-loop.svg
EXTRA_DIST += images/main-loop.uml
EXTRA_DIST += images/packet4.png
EXTRA_DIST += images/packet4.svg
EXTRA_DIST += images/packet4.uml
-EXTRA_DIST += images/request-lease.png
-EXTRA_DIST += images/request-lease.svg
-EXTRA_DIST += images/request-lease.uml
+EXTRA_DIST += images/request4-lease.png
+EXTRA_DIST += images/request4-lease.svg
+EXTRA_DIST += images/request4-lease.uml
EXTRA_DIST += images/request4.png
EXTRA_DIST += images/request4.svg
EXTRA_DIST += images/request4.uml
+EXTRA_DIST += images/requestLease4.png
+EXTRA_DIST += images/requestLease4.svg
+EXTRA_DIST += images/requestLease4.uml
EXTRA_DIST += images/select4.png
EXTRA_DIST += images/select4.svg
EXTRA_DIST += images/select4.uml
--- /dev/null
+@startuml
+
+start
+:get lease for the client;
+
+if (reserved address) then (yes)
+ if (requested address) then (no)
+ :requested address = reserved address;
+ else (yes)
+ if (requested address is reserved for another client) then (yes)
+ :return no lease;
+ stop
+ else (no)
+ endif
+ endif
+ if (lease for requested address) then (yes)
+ if (active and owned by another client) then (yes)
+ :return no lease;
+ stop
+ else (no)
+ endif
+ else (no)
+ endif
+ if (requested address == reserved address) then (no)
+ if (lease for requested address) then (yes)
+ if (active) then (yes)
+ :return no lease;
+ stop
+ else (no)
+ endif
+ else (no)
+ endif
+ if (requested address in allowed pool) then (no)
+ :return no lease;
+ stop
+ else (yes)
+ endif
+ else (yes)
+ endif
+
+else (no)
+
+ if (requested address) then (yes)
+ if (requested address is reserved for another client) then (yes)
+ :return no lease;
+ stop
+ else (no)
+ endif
+ if (lease for requested address) then (yes)
+ if (active and owned by another client) then (yes)
+ :return no lease;
+ stop
+ else (no)
+ endif
+ else (no)
+ endif
+ if (requested address in allowed pool) then (no)
+ :return no lease;
+ stop
+ else (yes)
+ endif
+ else (no)
+ if (client lease and lease address in allowed pool) then (no)
+ while (iterate over pools and subnect)
+ :pick candidate address;
+ if (candidate is reserved for another client) then (no)
+ if (lease for candidate) then (no)
+ :create and return new lease;
+ stop
+ else (yes)
+ if (expired) then (yes)
+ :reclaim expired lease;
+ :update lease information;
+ :callout lease4_select;
+ if (callout return) then (SKIP)
+ :return no lease;
+ stop
+ else (CONTINUE)
+ :update lease;
+ :return reused lease;
+ stop
+ endif
+ else (no)
+ endif
+ endif
+ else (yes)
+ endif
+ endwhile
+ :maximum attempts;
+ :return no lease;
+ stop
+ else (yes)
+ endif
+ endif
+endif
+
+' after check
+if (client lease) then (yes)
+ if (no requested address or requested address == client lease address) then (yes)
+ if (has reserved address or client lease address in allowed pool) then (yes)
+ :update lease information;
+ if (old lease expired) then (yes)
+ :reclaim expired lease;
+ else (no)
+ endif
+ :callout lease4_renew;
+ if (callout return) then (SKIP)
+ :return old client lease;
+ stop
+ else (CONTINUE)
+ :update lease;
+ :return renewed client lease;
+ stop
+ endif
+ else (no)
+ endif
+ else (no)
+ endif
+else (no)
+endif
+
+:get lease for requested address;
+if (requested lease) then (yes)
+ if (expired) then (no)
+ :return no lease;
+ stop
+ else (yes)
+ :reclaim expired lease;
+ :update lease information;
+ :callout lease4_select;
+ if (callout return) then (SKIP)
+ :return no lease;
+ stop
+ else (CONTINUE)
+ :update lease;
+ :return reused lease;
+ stop
+ endif
+ endif
+else (no)
+ :create and return new lease;
+ stop
+endif
+
+@enduml