diff options
Diffstat (limited to '')
53 files changed, 4863 insertions, 0 deletions
diff --git a/doc/sphinx/uml/appendRequestedOptions.png b/doc/sphinx/uml/appendRequestedOptions.png Binary files differnew file mode 100644 index 0000000..8b217f8 --- /dev/null +++ b/doc/sphinx/uml/appendRequestedOptions.png diff --git a/doc/sphinx/uml/appendRequestedOptions.svg b/doc/sphinx/uml/appendRequestedOptions.svg new file mode 100644 index 0000000..c888943 --- /dev/null +++ b/doc/sphinx/uml/appendRequestedOptions.svg @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="832px" preserveAspectRatio="none" style="width:376px;height:832px;background:#FFFFFF;" version="1.1" viewBox="0 0 376 832" width="376px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="333" x="20" y="34.9659">Append requested options algorithm (Kea 1.8.0)</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="158" x="103.5" y="51.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="138" x="113.5" y="73.896">get configured option list</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="262" x="51.5" y="107.412"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="242" x="61.5" y="130.2401">get parameter request list (PRL) from query</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="231" x="67" y="207.7561"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="211" x="77" y="230.5842">get configured options in dhcp4 space</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="181" x="92" y="308.1003"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="161" x="102" y="330.9283">push back option code to PRL</text> + <polygon fill="#F1F1F1" points="114.5,264.1003,250.5,264.1003,262.5,276.1003,250.5,288.1003,114.5,288.1003,102.5,276.1003,114.5,264.1003" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="136" x="114.5" y="280.3682">for each persistent option</text> + <polygon fill="#F1F1F1" points="75,163.7561,290,163.7561,302,175.7561,290,187.7561,75,187.7561,63,175.7561,75,163.7561" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="215" x="75" y="180.0241">for each item from configured option list</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="231" x="67" y="545.9353"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="211" x="77" y="568.7634">get configured options in dhcp4 space</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="148" x="108.5" y="651.7704"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="128" x="118.5" y="674.5985">add option to response</text> + <polygon fill="#F1F1F1" points="166.5,602.2794,198.5,602.2794,210.5,614.2794,198.5,626.2794,166.5,626.2794,154.5,614.2794,166.5,602.2794" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="21" x="186.5" y="638.0383">first</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="32" x="166.5" y="618.5474">found</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="145" x="210.5" y="611.0565">not found or already found</text> + <polygon fill="#F1F1F1" points="182.5,708.1145,194.5,720.1145,182.5,732.1145,170.5,720.1145,182.5,708.1145" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="75,501.9353,290,501.9353,302,513.9353,290,525.9353,75,525.9353,63,513.9353,75,501.9353" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="215" x="75" y="518.2033">for each item from configured option list</text> + <polygon fill="#F1F1F1" points="108,452.4444,257,452.4444,269,464.4444,257,476.4444,108,476.4444,96,464.4444,108,452.4444" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="186.5" y="488.2033">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="149" x="108" y="468.7123">option is not set in response</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="269" y="461.2214">no</text> + <polygon fill="#F1F1F1" points="182.5,774.1145,194.5,786.1145,182.5,798.1145,170.5,786.1145,182.5,774.1145" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="129,408.4444,236,408.4444,248,420.4444,236,432.4444,129,432.4444,117,420.4444,129,408.4444" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="107" x="129" y="424.7123">for each code in PRL</text> + <ellipse cx="26" cy="463.4444" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="26" cy="463.4444" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="87.412" y2="107.412"/> + <polygon fill="#181818" points="178.5,97.412,182.5,107.412,186.5,97.412,182.5,101.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="288.1003" y2="308.1003"/> + <polygon fill="#181818" points="178.5,298.1003,182.5,308.1003,186.5,298.1003,182.5,302.1003" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="344.4444" y2="354.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="285" y1="354.4444" y2="354.4444"/> + <polygon fill="#181818" points="281,324.2723,285,314.2723,289,324.2723,285,320.2723" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="285" x2="285" y1="276.1003" y2="354.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="285" x2="262.5" y1="276.1003" y2="276.1003"/> + <polygon fill="#181818" points="272.5,272.1003,262.5,276.1003,272.5,280.1003,268.5,276.1003" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="102.5" x2="80" y1="276.1003" y2="276.1003"/> + <polygon fill="#181818" points="76,310.2723,80,320.2723,84,310.2723,80,314.2723" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="80" x2="80" y1="276.1003" y2="366.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="80" x2="314" y1="366.4444" y2="366.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="314" x2="314" y1="175.7561" y2="366.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="314" x2="302" y1="175.7561" y2="175.7561"/> + <polygon fill="#181818" points="312,171.7561,302,175.7561,312,179.7561,308,175.7561" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="244.1003" y2="264.1003"/> + <polygon fill="#181818" points="178.5,254.1003,182.5,264.1003,186.5,254.1003,182.5,258.1003" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="187.7561" y2="207.7561"/> + <polygon fill="#181818" points="178.5,197.7561,182.5,207.7561,186.5,197.7561,182.5,201.7561" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="63" x2="51" y1="175.7561" y2="175.7561"/> + <polygon fill="#181818" points="47,266.6003,51,276.6003,55,266.6003,51,270.6003" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="51" x2="51" y1="175.7561" y2="388.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="51" x2="182.5" y1="388.4444" y2="388.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="388.4444" y2="408.4444"/> + <polygon fill="#181818" points="178.5,398.4444,182.5,408.4444,186.5,398.4444,182.5,402.4444" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="143.7561" y2="163.7561"/> + <polygon fill="#181818" points="178.5,153.7561,182.5,163.7561,186.5,153.7561,182.5,157.7561" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="626.2794" y2="651.7704"/> + <polygon fill="#181818" points="178.5,641.7704,182.5,651.7704,186.5,641.7704,182.5,645.7704" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="210.5" x2="266.5" y1="614.2794" y2="614.2794"/> + <polygon fill="#181818" points="262.5,659.9424,266.5,669.9424,270.5,659.9424,266.5,663.9424" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="266.5" x2="266.5" y1="614.2794" y2="720.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="266.5" x2="194.5" y1="720.1145" y2="720.1145"/> + <polygon fill="#181818" points="204.5,716.1145,194.5,720.1145,204.5,724.1145,200.5,720.1145" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="688.1145" y2="708.1145"/> + <polygon fill="#181818" points="178.5,698.1145,182.5,708.1145,186.5,698.1145,182.5,702.1145" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="582.2794" y2="602.2794"/> + <polygon fill="#181818" points="178.5,592.2794,182.5,602.2794,186.5,592.2794,182.5,596.2794" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="525.9353" y2="545.9353"/> + <polygon fill="#181818" points="178.5,535.9353,182.5,545.9353,186.5,535.9353,182.5,539.9353" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="732.1145" y2="742.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="314" y1="742.1145" y2="742.1145"/> + <polygon fill="#181818" points="310,632.2704,314,622.2704,318,632.2704,314,628.2704" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="314" x2="314" y1="513.9353" y2="742.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="314" x2="302" y1="513.9353" y2="513.9353"/> + <polygon fill="#181818" points="312,509.9353,302,513.9353,312,517.9353,308,513.9353" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="63" x2="51" y1="513.9353" y2="513.9353"/> + <polygon fill="#181818" points="47,618.2704,51,628.2704,55,618.2704,51,622.2704" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="51" x2="51" y1="513.9353" y2="754.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="51" x2="182.5" y1="754.1145" y2="754.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="754.1145" y2="774.1145"/> + <polygon fill="#181818" points="178.5,764.1145,182.5,774.1145,186.5,764.1145,182.5,768.1145" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="476.4444" y2="501.9353"/> + <polygon fill="#181818" points="178.5,491.9353,182.5,501.9353,186.5,491.9353,182.5,495.9353" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="269" x2="324" y1="464.4444" y2="464.4444"/> + <polygon fill="#181818" points="320,612.2704,324,622.2704,328,612.2704,324,616.2704" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="324" x2="324" y1="464.4444" y2="786.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="324" x2="194.5" y1="786.1145" y2="786.1145"/> + <polygon fill="#181818" points="204.5,782.1145,194.5,786.1145,204.5,790.1145,200.5,786.1145" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="432.4444" y2="452.4444"/> + <polygon fill="#181818" points="178.5,442.4444,182.5,452.4444,186.5,442.4444,182.5,446.4444" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="182.5" y1="798.1145" y2="808.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="182.5" x2="348" y1="808.1145" y2="808.1145"/> + <polygon fill="#181818" points="344,620.2704,348,610.2704,352,620.2704,348,616.2704" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="348" x2="348" y1="420.4444" y2="808.1145"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="348" x2="248" y1="420.4444" y2="420.4444"/> + <polygon fill="#181818" points="258,416.4444,248,420.4444,258,424.4444,254,420.4444" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="117" x2="26" y1="420.4444" y2="420.4444"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="26" x2="26" y1="420.4444" y2="452.4444"/> + <polygon fill="#181818" points="22,442.4444,26,452.4444,30,442.4444,26,446.4444" style="stroke:#181818;stroke-width:1.0;"/> + <!--SRC=[dP2nJiGm38RtFCK_jWCda1WG9o4nmu0GBn0QvnhH9Y5nXVhsE6tJa-06H2OhjZz_zflZWV0O8tc3H9yJPIQ34Da5dw67KqYE-n7D4sdS7EuErwrIzoTYTC5RTvhINex1PJvksQYJ7eafLUgIHVFo-jp2fZ12VjCivL-z4uN6XWJING_7DAuLboUq2hWiaE4yJD_5M-IeEpfAvKzwf9G5Gfwtfe8JO9noZtVTVTHHNJ043X3Xmf7xB2Yr1x_4bmunA2jAXxDeDfRBy86HHLhoYN8KMMh1FNaqC-LLuZ-NMEJ_V8toYfSDapTrldNfp1AQDliKsR_QrdOQiZYMTHO8H5OFYRIPruyAaZivgxPelTYvkLMrO4zUFPZWPKhc4DKt]--> + </g> +</svg> diff --git a/doc/sphinx/uml/appendRequestedOptions.uml b/doc/sphinx/uml/appendRequestedOptions.uml new file mode 100644 index 0000000..80a21d9 --- /dev/null +++ b/doc/sphinx/uml/appendRequestedOptions.uml @@ -0,0 +1,31 @@ +@startuml + +Title Append requested options algorithm (Kea 1.8.0) + +:get configured option list; + +:get parameter request list (PRL) from query; + +while (for each item from configured option list) + :get configured options in dhcp4 space; + while (for each persistent option) + :push back option code to PRL; + endwhile +endwhile + +while (for each code in PRL) + if (option is not set in response) then (yes) + while (for each item from configured option list) + :get configured options in dhcp4 space; + if (found) then (first) + :add option to response; + else (not found or already found) + endif + endwhile + else (no) + endif +endwhile +->done; +stop + +@enduml diff --git a/doc/sphinx/uml/appendRequestedVendorOptions.png b/doc/sphinx/uml/appendRequestedVendorOptions.png Binary files differnew file mode 100644 index 0000000..c00fcce --- /dev/null +++ b/doc/sphinx/uml/appendRequestedVendorOptions.png diff --git a/doc/sphinx/uml/appendRequestedVendorOptions.svg b/doc/sphinx/uml/appendRequestedVendorOptions.svg new file mode 100644 index 0000000..94685f9 --- /dev/null +++ b/doc/sphinx/uml/appendRequestedVendorOptions.svg @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1642px" preserveAspectRatio="none" style="width:429px;height:1642px;background:#FFFFFF;" version="1.1" viewBox="0 0 429 1642" width="429px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="386" x="20" y="34.9659">Append vendor requested options algorithm (Kea 1.8.0)</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="227" x="105.5" y="51.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="207" x="115.5" y="73.896">get vendor id from query vivso option</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="247" x="95.5" y="107.412"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="227" x="105.5" y="130.2401">get vendor id from response vivso option</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="55" x="191.5" y="213.2471"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="35" x="201.5" y="236.0752">return</text> + <ellipse cx="219" cy="287.9191" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="219" cy="287.9191" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="193.5,163.7561,244.5,163.7561,256.5,175.7561,244.5,187.7561,193.5,187.7561,181.5,175.7561,193.5,163.7561" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="223" y="199.5151">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="51" x="193.5" y="180.0241">vendor id</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="256.5" y="172.5332">yes</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="158" x="140" y="340.9191"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="138" x="150" y="363.7472">get configured option list</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="369" x="34.5" y="397.2633"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="349" x="44.5" y="420.0914">get option request list (ORO) from query DOCSIS vendor option</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="249" x="94.5" y="497.6074"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="229" x="104.5" y="520.4355">get configured options in vendor id space</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="186" x="126" y="597.9515"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="166" x="136" y="620.7796">push back option code to ORO</text> + <polygon fill="#F1F1F1" points="151,553.9515,287,553.9515,299,565.9515,287,577.9515,151,577.9515,139,565.9515,151,553.9515" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="136" x="151" y="570.2195">for each persistent option</text> + <polygon fill="#F1F1F1" points="111.5,453.6074,326.5,453.6074,338.5,465.6074,326.5,477.6074,111.5,477.6074,99.5,465.6074,111.5,453.6074" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="215" x="111.5" y="469.8753">for each item from configured option list</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="199" x="119.5" y="747.7865"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="179" x="129.5" y="770.6146">create vivso option for vendor id</text> + <polygon fill="#F1F1F1" points="161,698.2956,277,698.2956,289,710.2956,277,722.2956,161,722.2956,149,710.2956,161,698.2956" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="223" y="734.0545">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="116" x="161" y="714.5636">response vivso option</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="289" y="707.0726">yes</text> + <polygon fill="#F1F1F1" points="219,804.1307,231,816.1307,219,828.1307,207,816.1307,219,804.1307" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="95" x="171.5" y="848.1307"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="75" x="181.5" y="870.9588">added = false</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="249" x="94.5" y="1041.9657"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="229" x="104.5" y="1064.7938">get configured options in vendor id space</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="186" x="126" y="1147.8008"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="166" x="136" y="1170.6289">add sub-option to vivso option</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="91" x="173.5" y="1219.1449"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="71" x="183.5" y="1241.973">added = true</text> + <polygon fill="#F1F1F1" points="203,1098.3098,235,1098.3098,247,1110.3098,235,1122.3098,203,1122.3098,191,1110.3098,203,1098.3098" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="21" x="223" y="1134.0687">first</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="32" x="203" y="1114.5778">found</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="145" x="247" y="1107.0869">not found or already found</text> + <polygon fill="#F1F1F1" points="219,1275.489,231,1287.489,219,1299.489,207,1287.489,219,1275.489" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="111.5,997.9657,326.5,997.9657,338.5,1009.9657,326.5,1021.9657,111.5,1021.9657,99.5,1009.9657,111.5,997.9657" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="215" x="111.5" y="1014.2337">for each item from configured option list</text> + <polygon fill="#F1F1F1" points="124.5,948.4748,313.5,948.4748,325.5,960.4748,313.5,972.4748,124.5,972.4748,112.5,960.4748,124.5,948.4748" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="223" y="984.2337">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="189" x="124.5" y="964.7427">sub-option is not set in vivso option</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="325.5" y="957.2518">no</text> + <polygon fill="#F1F1F1" points="219,1341.489,231,1353.489,219,1365.489,207,1353.489,219,1341.489" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="178" x="130" y="1484.4709"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="158" x="140" y="1507.299">add vivso option in response</text> + <polygon fill="#F1F1F1" points="154.5,1434.98,283.5,1434.98,295.5,1446.98,283.5,1458.98,154.5,1458.98,142.5,1446.98,154.5,1434.98" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="223" y="1470.7389">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="129" x="154.5" y="1451.2479">vivso option in response</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="295.5" y="1443.757">yes</text> + <polygon fill="#F1F1F1" points="219,1540.815,231,1552.815,219,1564.815,207,1552.815,219,1540.815" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="202.5,1385.489,235.5,1385.489,247.5,1397.489,235.5,1409.489,202.5,1409.489,190.5,1397.489,202.5,1385.489" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="223" y="1421.2479">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="33" x="202.5" y="1401.757">added</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="247.5" y="1394.266">no</text> + <polygon fill="#F1F1F1" points="219,1584.815,231,1596.815,219,1608.815,207,1596.815,219,1584.815" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="163,904.4748,275,904.4748,287,916.4748,275,928.4748,163,928.4748,151,916.4748,163,904.4748" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="112" x="163" y="920.7427">for each code in ORO</text> + <ellipse cx="37.5" cy="959.4748" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="37.5" cy="959.4748" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="87.412" y2="107.412"/> + <polygon fill="#181818" points="215,97.412,219,107.412,223,97.412,219,101.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="249.5912" y2="276.9191"/> + <polygon fill="#181818" points="215,266.9191,219,276.9191,223,266.9191,219,270.9191" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="187.7561" y2="213.2471"/> + <polygon fill="#181818" points="215,203.2471,219,213.2471,223,203.2471,219,207.2471" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="256.5" x2="268.5" y1="175.7561" y2="175.7561"/> + <polygon fill="#181818" points="264.5,246.9191,268.5,256.9191,272.5,246.9191,268.5,250.9191" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="268.5" x2="268.5" y1="175.7561" y2="320.9191"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="268.5" x2="219" y1="320.9191" y2="320.9191"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="320.9191" y2="340.9191"/> + <polygon fill="#181818" points="215,330.9191,219,340.9191,223,330.9191,219,334.9191" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="143.7561" y2="163.7561"/> + <polygon fill="#181818" points="215,153.7561,219,163.7561,223,153.7561,219,157.7561" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="377.2633" y2="397.2633"/> + <polygon fill="#181818" points="215,387.2633,219,397.2633,223,387.2633,219,391.2633" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="577.9515" y2="597.9515"/> + <polygon fill="#181818" points="215,587.9515,219,597.9515,223,587.9515,219,591.9515" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="634.2956" y2="644.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="324" y1="644.2956" y2="644.2956"/> + <polygon fill="#181818" points="320,614.1235,324,604.1235,328,614.1235,324,610.1235" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="324" x2="324" y1="565.9515" y2="644.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="324" x2="299" y1="565.9515" y2="565.9515"/> + <polygon fill="#181818" points="309,561.9515,299,565.9515,309,569.9515,305,565.9515" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="139" x2="114" y1="565.9515" y2="565.9515"/> + <polygon fill="#181818" points="110,600.1235,114,610.1235,118,600.1235,114,604.1235" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="114" x2="114" y1="565.9515" y2="656.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="114" x2="355.5" y1="656.2956" y2="656.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="355.5" x2="355.5" y1="465.6074" y2="656.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="355.5" x2="338.5" y1="465.6074" y2="465.6074"/> + <polygon fill="#181818" points="348.5,461.6074,338.5,465.6074,348.5,469.6074,344.5,465.6074" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="533.9515" y2="553.9515"/> + <polygon fill="#181818" points="215,543.9515,219,553.9515,223,543.9515,219,547.9515" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="477.6074" y2="497.6074"/> + <polygon fill="#181818" points="215,487.6074,219,497.6074,223,487.6074,219,491.6074" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="99.5" x2="82.5" y1="465.6074" y2="465.6074"/> + <polygon fill="#181818" points="78.5,556.4515,82.5,566.4515,86.5,556.4515,82.5,560.4515" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="82.5" x2="82.5" y1="465.6074" y2="678.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="82.5" x2="219" y1="678.2956" y2="678.2956"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="678.2956" y2="698.2956"/> + <polygon fill="#181818" points="215,688.2956,219,698.2956,223,688.2956,219,692.2956" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="433.6074" y2="453.6074"/> + <polygon fill="#181818" points="215,443.6074,219,453.6074,223,443.6074,219,447.6074" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="722.2956" y2="747.7865"/> + <polygon fill="#181818" points="215,737.7865,219,747.7865,223,737.7865,219,741.7865" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="289" x2="328.5" y1="710.2956" y2="710.2956"/> + <polygon fill="#181818" points="324.5,755.9586,328.5,765.9586,332.5,755.9586,328.5,759.9586" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="328.5" x2="328.5" y1="710.2956" y2="816.1307"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="328.5" x2="231" y1="816.1307" y2="816.1307"/> + <polygon fill="#181818" points="241,812.1307,231,816.1307,241,820.1307,237,816.1307" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="784.1307" y2="804.1307"/> + <polygon fill="#181818" points="215,794.1307,219,804.1307,223,794.1307,219,798.1307" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="828.1307" y2="848.1307"/> + <polygon fill="#181818" points="215,838.1307,219,848.1307,223,838.1307,219,842.1307" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1184.1449" y2="1219.1449"/> + <polygon fill="#181818" points="215,1209.1449,219,1219.1449,223,1209.1449,219,1213.1449" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1122.3098" y2="1147.8008"/> + <polygon fill="#181818" points="215,1137.8008,219,1147.8008,223,1137.8008,219,1141.8008" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="247" x2="322" y1="1110.3098" y2="1110.3098"/> + <polygon fill="#181818" points="318,1191.6449,322,1201.6449,326,1191.6449,322,1195.6449" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="322" x2="322" y1="1110.3098" y2="1287.489"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="322" x2="231" y1="1287.489" y2="1287.489"/> + <polygon fill="#181818" points="241,1283.489,231,1287.489,241,1291.489,237,1287.489" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1255.489" y2="1275.489"/> + <polygon fill="#181818" points="215,1265.489,219,1275.489,223,1265.489,219,1269.489" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1078.3098" y2="1098.3098"/> + <polygon fill="#181818" points="215,1088.3098,219,1098.3098,223,1088.3098,219,1092.3098" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1021.9657" y2="1041.9657"/> + <polygon fill="#181818" points="215,1031.9657,219,1041.9657,223,1031.9657,219,1035.9657" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1299.489" y2="1309.489"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="355.5" y1="1309.489" y2="1309.489"/> + <polygon fill="#181818" points="351.5,1163.9728,355.5,1153.9728,359.5,1163.9728,355.5,1159.9728" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="355.5" x2="355.5" y1="1009.9657" y2="1309.489"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="355.5" x2="338.5" y1="1009.9657" y2="1009.9657"/> + <polygon fill="#181818" points="348.5,1005.9657,338.5,1009.9657,348.5,1013.9657,344.5,1009.9657" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="99.5" x2="82.5" y1="1009.9657" y2="1009.9657"/> + <polygon fill="#181818" points="78.5,1149.9728,82.5,1159.9728,86.5,1149.9728,82.5,1153.9728" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="82.5" x2="82.5" y1="1009.9657" y2="1321.489"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="82.5" x2="219" y1="1321.489" y2="1321.489"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1321.489" y2="1341.489"/> + <polygon fill="#181818" points="215,1331.489,219,1341.489,223,1331.489,219,1335.489" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="972.4748" y2="997.9657"/> + <polygon fill="#181818" points="215,987.9657,219,997.9657,223,987.9657,219,991.9657" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="325.5" x2="365.5" y1="960.4748" y2="960.4748"/> + <polygon fill="#181818" points="361.5,1143.9728,365.5,1153.9728,369.5,1143.9728,365.5,1147.9728" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="365.5" x2="365.5" y1="960.4748" y2="1353.489"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="365.5" x2="231" y1="1353.489" y2="1353.489"/> + <polygon fill="#181818" points="241,1349.489,231,1353.489,241,1357.489,237,1353.489" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1458.98" y2="1484.4709"/> + <polygon fill="#181818" points="215,1474.4709,219,1484.4709,223,1474.4709,219,1478.4709" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="295.5" x2="318" y1="1446.98" y2="1446.98"/> + <polygon fill="#181818" points="314,1492.643,318,1502.643,322,1492.643,318,1496.643" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="318" x2="318" y1="1446.98" y2="1552.815"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="318" x2="231" y1="1552.815" y2="1552.815"/> + <polygon fill="#181818" points="241,1548.815,231,1552.815,241,1556.815,237,1552.815" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1520.815" y2="1540.815"/> + <polygon fill="#181818" points="215,1530.815,219,1540.815,223,1530.815,219,1534.815" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1409.489" y2="1434.98"/> + <polygon fill="#181818" points="215,1424.98,219,1434.98,223,1424.98,219,1428.98" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="247.5" x2="340" y1="1397.489" y2="1397.489"/> + <polygon fill="#181818" points="336,1492.643,340,1502.643,344,1492.643,340,1496.643" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="340" x2="340" y1="1397.489" y2="1596.815"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="340" x2="231" y1="1596.815" y2="1596.815"/> + <polygon fill="#181818" points="241,1592.815,231,1596.815,241,1600.815,237,1596.815" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1564.815" y2="1584.815"/> + <polygon fill="#181818" points="215,1574.815,219,1584.815,223,1574.815,219,1578.815" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1365.489" y2="1385.489"/> + <polygon fill="#181818" points="215,1375.489,219,1385.489,223,1375.489,219,1379.489" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="928.4748" y2="948.4748"/> + <polygon fill="#181818" points="215,938.4748,219,948.4748,223,938.4748,219,942.4748" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="1608.815" y2="1618.815"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="389.5" y1="1618.815" y2="1618.815"/> + <polygon fill="#181818" points="385.5,1281.1358,389.5,1271.1358,393.5,1281.1358,389.5,1277.1358" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="389.5" x2="389.5" y1="916.4748" y2="1618.815"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="389.5" x2="287" y1="916.4748" y2="916.4748"/> + <polygon fill="#181818" points="297,912.4748,287,916.4748,297,920.4748,293,916.4748" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="151" x2="37.5" y1="916.4748" y2="916.4748"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="37.5" x2="37.5" y1="916.4748" y2="948.4748"/> + <polygon fill="#181818" points="33.5,938.4748,37.5,948.4748,41.5,938.4748,37.5,942.4748" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="219" x2="219" y1="884.4748" y2="904.4748"/> + <polygon fill="#181818" points="215,894.4748,219,904.4748,223,894.4748,219,898.4748" style="stroke:#181818;stroke-width:1.0;"/> + <!--SRC=[dPEnJiCm48PtFyMDoT0ADjG890GBOgX4UG4tFZTMKzlOJb7VdhEJk6aR1kXGHVRTVz__N_AfGelmR2rg0KVwCmuSVdNe0memDYYZFV1sPvmApG6AT-HmltnOtfMChNOOnYObG3fp06fr9pYgepT3UpLRvz1RaiQhKYMXo9KbX0Or5DgK363bC7IEQW1yC9PXIzt52Nt9g479WQSsMgfTvp8-jCg7QhWTZWQBwGgAzSUwdDA_hbysRvkHU4HZtusYh0f9PyZh1bJ0GzysFpD1po9vK7eIYBUynkZhUe95vqa8zGWU9KdKThw1BQ_tuxZQ28HWW9n47L9EKYm_f61dCxyAkNR8msK5H9vCMyq5puKWSuyWETrLDqabFB8SWwOXaSLtsyKWhpne4y1JKZ6M6ROqAph_pmfIOdzQG_n5HcawdLz2gTnPZnJ9CanCKFYNR_AqC6KJN9VL-mYZwpG3282tbBmuzGVZd3xVuQdVvBcvPEU2Y9i6tKIMlgZfDfNE7z_bxhEjtyfx-idwfuYtL1bvyIICfkxqsVu0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/appendRequestedVendorOptions.uml b/doc/sphinx/uml/appendRequestedVendorOptions.uml new file mode 100644 index 0000000..65d3d54 --- /dev/null +++ b/doc/sphinx/uml/appendRequestedVendorOptions.uml @@ -0,0 +1,53 @@ +@startuml + +Title Append vendor requested options algorithm (Kea 1.8.0) + +:get vendor id from query vivso option; +:get vendor id from response vivso option; +if (vendor id) then (no) + :return; + stop +else (yes) +endif + +:get configured option list; + +:get option request list (ORO) from query DOCSIS vendor option; + +while (for each item from configured option list) + :get configured options in vendor id space; + while (for each persistent option) + :push back option code to ORO; + endwhile +endwhile + +if (response vivso option) then (no) + :create vivso option for vendor id; +else (yes) +endif + +:added = false; +while (for each code in ORO) + if (sub-option is not set in vivso option) then (yes) + while (for each item from configured option list) + :get configured options in vendor id space; + if (found) then (first) + :add sub-option to vivso option; + :added = true; + else (not found or already found) + endif + endwhile + else (no) + endif + if (added) then (yes) + if (vivso option in response) then (no) + :add vivso option in response; + else (yes) + endif + else (no) + endif +endwhile +->done; +stop + +@enduml diff --git a/doc/sphinx/uml/assign-lease4.png b/doc/sphinx/uml/assign-lease4.png Binary files differnew file mode 100644 index 0000000..29e099b --- /dev/null +++ b/doc/sphinx/uml/assign-lease4.png diff --git a/doc/sphinx/uml/assign-lease4.svg b/doc/sphinx/uml/assign-lease4.svg new file mode 100644 index 0000000..12f09a2 --- /dev/null +++ b/doc/sphinx/uml/assign-lease4.svg @@ -0,0 +1,238 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1433px" preserveAspectRatio="none" style="width:1340px;height:1433px;background:#FFFFFF;" version="1.1" viewBox="0 0 1340 1433" width="1340px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="223" x="551.5" y="24.9659">DHCPv4 Assign Lease (Kea 1.8.0)</text> + <!--cluster init_reboot--> + <g id="cluster_init_reboot"> + <rect fill="none" height="391.06" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="442" x="487" y="477.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="129" x="643.5" y="494.3039">INIT-REBOOT state</text> + </g> + <!--cluster allocated--> + <g id="cluster_allocated"> + <rect fill="none" height="274.03" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="160" x="7" y="1153.5379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="106" x="34" y="1170.5039">Lease allocated</text> + </g> + <!--entity by_client_id--> + <g id="elem_by_client_id"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="217" x="511.5" y="587.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="197" x="521.5" y="612.1639">Get existing lease by client id</text> + </g> + <!--entity by_hw_addr--> + <g id="elem_by_hw_addr"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="286" x="619" y="705.2679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="266" x="629" y="730.2339">Get existing lease by hardware address</text> + </g> + <!--entity authoritative--> + <g id="elem_authoritative"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="133" x="519.5" y="805.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="113" x="529.5" y="830.3039">Get authoritative</text> + </g> + <!--entity ddns--> + <g id="elem_ddns"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="111" x="31.5" y="1264.4279"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="91" x="41.5" y="1289.3939">update DDNS</text> + </g> + <!--entity ack--> + <g id="elem_ack"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="85" x="44.5" y="1364.4979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="54.5" y="1389.4639">Send ACK</text> + </g> + <!--entity subnet--> + <g id="elem_subnet"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="112" x="1177" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="92" x="1187" y="72.0339">Check Subnet</text> + </g> + <g id="elem_GMN3"> + <path d="M1054,52.7479 L1054,80.4539 A0,0 0 0 0 1054,80.4539 L1142,80.4539 A0,0 0 0 0 1142,80.4539 L1142,70.7479 L1176.66,66.5979 L1142,62.7479 L1142,62.7479 L1132,52.7479 L1054,52.7479 A0,0 0 0 0 1054,52.7479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1132,52.7479 L1132,62.7479 L1142,62.7479 L1132,52.7479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="67" x="1060" y="71.6449">entry point</text> + </g> + <!--entity server_id--> + <g id="elem_server_id"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="106" x="1020" y="147.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="86" x="1030" y="172.1039">Get server id</text> + </g> + <!--entity hint--> + <g id="elem_hint"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="74" x="832" y="247.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="54" x="842" y="272.1639">Get hint</text> + </g> + <!--entity ident--> + <g id="elem_ident"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="258" x="556" y="365.2679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="238" x="566" y="390.2339">Get hardware address and client id</text> + </g> + <!--entity hostname--> + <g id="elem_hostname"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="142" x="277" y="941.3979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="122" x="287" y="966.3639">Process hostname</text> + </g> + <!--entity allocate--> + <g id="elem_allocate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="114" x="205" y="1041.4679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="215" y="1066.4339">Request lease</text> + </g> + <!--entity failed--> + <g id="elem_failed"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="143" x="190.5" y="1164.3679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="123" x="200.5" y="1189.3339">No lease allocated</text> + </g> + <g id="elem_GMN19"> + <path d="M368,1170.0479 L368,1179.8979 L333.93,1183.8979 L368,1187.8979 L368,1197.7539 A0,0 0 0 0 368,1197.7539 L446,1197.7539 A0,0 0 0 0 446,1197.7539 L446,1180.0479 L436,1170.0479 L368,1170.0479 A0,0 0 0 0 368,1170.0479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M436,1170.0479 L436,1180.0479 L446,1180.0479 L436,1170.0479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="374" y="1188.9449">exit point</text> + </g> + <!--entity nak--> + <g id="elem_nak"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="87" x="591.5" y="1264.4279"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="67" x="601.5" y="1289.3939">Send NAK</text> + </g> + <g id="elem_GMN23"> + <path d="M713,1270.1179 L713,1279.9679 L678.88,1283.9679 L713,1287.9679 L713,1297.8239 A0,0 0 0 0 713,1297.8239 L791,1297.8239 A0,0 0 0 0 791,1297.8239 L791,1280.1179 L781,1270.1179 L713,1270.1179 A0,0 0 0 0 713,1270.1179 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M781,1270.1179 L781,1280.1179 L791,1280.1179 L781,1270.1179 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="719" y="1289.0149">exit point</text> + </g> + <!--entity no_response--> + <g id="elem_no_response"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="999.5" y="1041.4679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="85" x="1009.5" y="1066.4339">No response</text> + </g> + <g id="elem_GMN27"> + <path d="M1139,1047.1479 L1139,1057.0079 L1104.66,1061.0079 L1139,1065.0079 L1139,1074.8539 A0,0 0 0 0 1139,1074.8539 L1217,1074.8539 A0,0 0 0 0 1217,1074.8539 L1217,1057.1479 L1207,1047.1479 L1139,1047.1479 A0,0 0 0 0 1139,1047.1479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1207,1047.1479 L1207,1057.1479 L1217,1057.1479 L1207,1047.1479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="1145" y="1066.0449">exit point</text> + </g> + <!--link subnet to server_id--> + <g id="link_subnet_server_id"> + <path d="M1202.15,86.5079 C1175.67,102.7379 1137.47,126.1579 1109.48,143.3079 " fill="none" id="subnet-to-server_id" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1105.32,145.8579,1115.0825,144.5568,1109.5807,143.2414,1110.8961,137.7396,1105.32,145.8579" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link subnet to nak--> + <g id="link_subnet_nak"> + <path d="M1244.71,86.3479 C1255.55,105.5279 1270,136.5579 1270,165.6679 C1270,165.6679 1270,165.6679 1270,1184.8979 C1270,1249.0679 757.06,1228.6979 696,1248.4279 C686.6,1251.4679 677.03,1256.0479 668.34,1260.8979 " fill="none" id="subnet-to-nak" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="664.37,1263.1779,674.1655,1262.1545,668.7033,1260.6834,670.1743,1255.2212,664.37,1263.1779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="61" x="1271" y="671.1649">no subnet</text> + </g> + <!--link server_id to hint--> + <g id="link_server_id_hint"> + <path d="M1033.67,186.5779 C998.83,203.3279 948.06,227.7279 912.13,245.0079 " fill="none" id="server_id-to-hint" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="907.86,247.0579,917.704,246.7491,912.3631,244.885,914.2273,239.5441,907.86,247.0579" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link hint to ident--> + <g id="link_hint_ident"> + <path d="M831.51,268.0879 C759.25,269.6479 604.9,277.5579 572,316.2679 C555.28,335.9479 575.32,351.4079 602.93,362.5379 " fill="none" id="hint-to-ident" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="607.52,364.3079,600.5673,357.3323,602.8562,362.5054,597.6832,364.7943,607.52,364.3079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="178" x="573" y="331.1649">use requested address option</text> + </g> + <!--link hint to ident--> + <g id="link_hint_ident"> + <path d="M839.01,286.6279 C824.77,295.6079 807.5,306.4879 792,316.2679 C768.12,331.3279 741.25,348.2879 720.41,361.4479 " fill="none" id="hint-to-ident-1" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="716.26,364.0679,726.0052,362.6427,720.4871,361.3974,721.7324,355.8793,716.26,364.0679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="106" x="793" y="331.1649">use client address</text> + </g> + <!--link hint to ident--> + <g id="link_hint_ident"> + <path d="M890.07,286.6879 C903.34,300.9279 915.9,320.4379 904,335.2679 C892.23,349.9379 858.17,360.4479 820.31,367.8479 " fill="none" id="hint-to-ident-2" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="815.69,368.7279,825.2762,370.9874,820.6031,367.7996,823.7908,363.1265,815.69,368.7279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="43" x="909" y="331.1649">no hint</text> + </g> + <!--link ident to init_reboot--> + <g id="link_ident_init_reboot"> + <path d="M685,404.6979 C685,421.4329 685,446.4029 685,467.4479 C685,470.0785 685,472.6478 685,475.1321 C685,475.7531 685,476.3688 685,476.9789 " fill="none" id="ident-to-init_reboot" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="685,476.9789,689,467.9789,685,471.9789,681,467.9789,685,476.9789" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="210" x="686" y="449.2349">requested address and no server id</text> + </g> + <!--link ident to hostname--> + <g id="link_ident_hostname"> + <path d="M569.5,404.8179 C471.94,424.2579 348,458.4479 348,506.6979 C348,506.6979 348,506.6979 348,825.8679 C348,863.8479 348,907.8779 348,934.8179 " fill="none" id="ident-to-hostname" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="348,939.7679,352,930.7679,348,934.7679,344,930.7679,348,939.7679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link init_reboot to by_client_id--> + <g id="link_init_reboot_by_client_id"> + <path d="M684.81,508.4779 C682.27,512.2879 654.33,554.2279 635.97,581.7679 " fill="none" id="init_reboot-to-by_client_id" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="633.28,585.8079,641.5922,580.5251,636.0469,581.6433,634.9287,576.098,633.28,585.8079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="80" x="664" y="553.0949">has a client id</text> + </g> + <!--link init_reboot to by_hw_addr--> + <g id="link_init_reboot_by_hw_addr"> + <path d="M685.56,508.2379 C691.04,508.6379 735.47,512.6679 753,538.1979 C786.32,586.7179 776.72,660.3479 768.45,698.6579 " fill="none" id="init_reboot-to-by_hw_addr" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="767.37,703.4579,773.2491,695.5563,768.4682,698.58,765.4445,693.7991,767.37,703.4579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="65" x="777" y="612.1249">no client id</text> + </g> + <!--link by_client_id to authoritative--> + <g id="link_by_client_id_authoritative"> + <path d="M605.16,626.5679 C591.42,645.2879 571.95,675.4579 564,705.2679 C555.44,737.3479 565.93,775.1879 575.15,799.3479 " fill="none" id="by_client_id-to-authoritative" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="576.89,803.7779,577.2979,793.9375,575.0503,799.1287,569.8591,796.8811,576.89,803.7779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="36" x="565" y="730.1949">found</text> + </g> + <!--link by_client_id to by_hw_addr--> + <g id="link_by_client_id_by_hw_addr"> + <path d="M615.57,626.5079 C613.24,641.2079 612.7,661.4279 623,675.2679 C631.4,686.5579 642.62,695.2379 655.06,701.9079 " fill="none" id="by_client_id-to-by_hw_addr" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="659.5,704.1479,653.2585,696.5293,655.0336,701.9004,649.6625,703.6755,659.5,704.1479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="60" x="624" y="671.1649">not found</text> + </g> + <!--link by_hw_addr to authoritative--> + <g id="link_by_hw_addr_authoritative"> + <path d="M728.07,744.7079 C698.82,761.0079 656.57,784.5479 625.75,801.7179 " fill="none" id="by_hw_addr-to-authoritative" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="621.45,804.1179,631.26,803.2438,625.8208,801.6897,627.3748,796.2505,621.45,804.1179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link authoritative to no_response--> + <g id="link_authoritative_no_response"> + <path d="M652.89,841.8779 C695.29,853.2479 750.68,870.3979 797,892.3979 C884.78,934.0979 977.68,1002.0879 1023.3,1037.2879 " fill="none" id="authoritative-to-no_response" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1027.17,1040.2779,1022.5281,1031.5915,1023.2255,1037.2052,1017.6119,1037.9027,1027.17,1040.2779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="224" x="944" y="966.3349">not authoritative and no owned lease</text> + </g> + <!--link authoritative to nak--> + <g id="link_authoritative_nak"> + <path d="M652.79,844.4179 C705.78,863.6879 771,899.6479 771,959.9379 C771,959.9379 771,959.9379 771,1184.8979 C771,1197.1579 712.12,1235.7379 671.85,1260.6979 " fill="none" id="authoritative-to-nak" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="667.83,1263.1779,677.5925,1261.8768,672.0907,1260.5614,673.4061,1255.0596,667.83,1263.1779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="772" y="1066.4049">owned lease with hint mismatch</text> + </g> + <!--link authoritative to nak--> + <g id="link_authoritative_nak"> + <path d="M563.6,844.6979 C537.82,868.6079 499,912.4879 499,959.9379 C499,959.9379 499,959.9379 499,1184.8979 C499,1229.0079 546.66,1255.2679 585.55,1269.3379 " fill="none" id="authoritative-to-nak-1" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="589.79,1270.8279,582.6258,1264.0697,585.0729,1269.1698,579.9728,1271.617,589.79,1270.8279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="200" x="500" y="1066.4049">authoritative and no owned lease</text> + </g> + <!--link authoritative to hostname--> + <g id="link_authoritative_hostname"> + <path d="M519.21,840.8179 C482.59,851.2179 437.72,867.7179 403,892.3979 C386.76,903.9479 372.66,921.5079 362.8,935.8279 " fill="none" id="authoritative-to-hostname" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="360.21,939.6879,368.5513,934.4513,363,935.5387,361.9126,929.9873,360.21,939.6879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="68" x="404" y="907.2949">other cases</text> + </g> + <!--link hostname to allocate--> + <g id="link_hostname_allocate"> + <path d="M331.42,980.8479 C317.5,996.7179 297.55,1019.4679 282.6,1036.5079 " fill="none" id="hostname-to-allocate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="279.53,1040.0179,288.4746,1035.8956,282.8296,1036.2612,282.4639,1030.6162,279.53,1040.0179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link allocate to allocated--> + <g id="link_allocate_allocated"> + <path d="M214.81,1080.8979 C198.19,1088.7379 179.94,1098.7679 165,1110.5379 C156.9975,1116.8404 149.2931,1124.3342 142.2119,1132.0726 C138.6713,1135.9418 135.2864,1139.8722 132.098,1143.7455 C130.5038,1145.6821 128.9586,1147.6044 127.4677,1149.4977 C126.7222,1150.4443 125.9903,1151.3837 125.2726,1152.3139 C125.0931,1152.5465 124.9146,1152.7784 124.7369,1153.0098 C124.6481,1153.1255 124.5595,1153.2411 124.4711,1153.3565 " fill="none" id="allocate-to-allocated" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="124.4711,1153.3565,133.1191,1148.6435,127.5113,1149.3869,126.7678,1143.7792,124.4711,1153.3565" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="87" x="166" y="1125.4349">lease allocated</text> + </g> + <!--link allocated to ddns--> + <g id="link_allocated_ddns"> + <path d="M103.99,1184.9679 C103.65,1186.9379 96.26,1229.5779 91.34,1257.9479 " fill="none" id="allocated-to-ddns" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="90.52,1262.6279,96.0029,1254.4464,91.3767,1257.7019,88.1212,1253.0756,90.52,1262.6279" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link ddns to ack--> + <g id="link_ddns_ack"> + <path d="M87,1303.8779 C87,1319.2079 87,1340.9479 87,1357.7679 " fill="none" id="ddns-to-ack" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="87,1362.6679,91,1353.6679,87,1357.6679,83,1353.6679,87,1362.6679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link allocate to failed--> + <g id="link_allocate_failed"> + <path d="M262,1080.8979 C262,1101.5679 262,1134.8079 262,1157.6879 " fill="none" id="allocate-to-failed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="262,1162.6279,266,1153.6279,262,1157.6279,258,1153.6279,262,1162.6279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="106" x="263" y="1125.4349">no lease allocated</text> + </g> + <!--link failed to nak--> + <g id="link_failed_nak"> + <path d="M333.92,1203.8079 C407.65,1223.1879 520.38,1252.8279 584.94,1269.8079 " fill="none" id="failed-to-nak" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="589.57,1271.0179,581.8807,1264.8636,584.7339,1269.7483,579.8493,1272.6014,589.57,1271.0179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--SRC=[dLF1Rjim3BtxAuYSjaEA3jXXw650bWnRqI4jcju3nM8Y8OwKMNJIODY_Zv8intBI3TZ5iAZt7YdoaJHL2BFlqwV3HvWufpS6Vg1m2EyUKC27cqytj- -BGcpG48oc2iijB9gLGHg1SE32Rs4i8LIu9hW31jOds5jjgEDzGmA7zG5hq38ImscfPOPHJ0hNQiXMefP7KIC8AMjq3eIHK5RQ0rf9BT6JQYn9c0s_QdG_ltyPFt_zylZu0eu4OSGPJSiQLzOI_2gWbmHVjIDjDlmKtu7LQP1XTLh6GAZxxynXmKb07PS-ajD5GyhMcalKXrXa5Yb-Txrugctfdw-i8oDs4PmE7UePVpReA5OJzQhAbjo1h3znqEbAPa3Pwqspbno1sMo-21WfZUik5yYJc4mV8hlSzegTsxOVUOgrq1NAQ9fQRrHmpQkcWMc2y7mIXOtO_fF0wRZJUslQDnkxJEUtkT71C1v_xdco2tAKCpF5sEJr3XKumQZ-4qx1Wenk-Crrd04tCbdMxabRSntT6gs5Nc8uVqWLp-6cP-ExAzdyWlYgqzfrL5zrCanVn5_q7Swgoe_ql0JNuAsVOubdP2OKScQEPlZQDkO2To59PrmANuWLkNISsddshKuEQhjZZuPR5anweP96tyF0KPCAWu2TTZj1fNgJzX_vqbXyKb8yjP9nR8OK3YzFYvn-igWVsc3bYlETHuRTzP_8uttDXE9kncaEXTgxzed57m00]--> + </g> +</svg> diff --git a/doc/sphinx/uml/assign-lease4.uml b/doc/sphinx/uml/assign-lease4.uml new file mode 100644 index 0000000..de19ed7 --- /dev/null +++ b/doc/sphinx/uml/assign-lease4.uml @@ -0,0 +1,64 @@ +@startuml + +title DHCPv4 Assign Lease (Kea 1.8.0) + +agent "Check Subnet" as subnet +note left : entry point + +agent "Get server id" as server_id + +agent "Get hint" as hint + +agent "Get hardware address and client id" as ident + +rectangle "INIT-REBOOT state" as init_reboot { + agent "Get existing lease by client id" as by_client_id + + agent "Get existing lease by hardware address" as by_hw_addr + + agent "Get authoritative" as authoritative +} + +agent "Process hostname" as hostname + +agent "Request lease" as allocate + +rectangle "Lease allocated" as allocated { + agent "update DDNS" as ddns + agent "Send ACK" as ack +} + +agent "No lease allocated" as failed +note right : exit point + +agent "Send NAK" as nak +note right : exit point + +agent "No response" as no_response +note right : exit point + +subnet --> server_id +subnet ---> nak : no subnet +server_id --> hint +hint --> ident : use requested address option +hint --> ident : use client address +hint --> ident : no hint +ident --> init_reboot : requested address and no server id +ident ---> hostname +init_reboot --> by_client_id : has a client id +init_reboot --> by_hw_addr : no client id +by_client_id ---> authoritative : found +by_client_id --> by_hw_addr : not found +by_hw_addr --> authoritative +authoritative ---> no_response : not authoritative and no owned lease +authoritative --> nak : owned lease with hint mismatch +authoritative --> nak : authoritative and no owned lease +authoritative --> hostname : other cases +hostname --> allocate +allocate --> allocated : lease allocated +allocated --> ddns +ddns --> ack +allocate --> failed : no lease allocated +failed --> nak + +@enduml diff --git a/doc/sphinx/uml/buildCfgOptionList.png b/doc/sphinx/uml/buildCfgOptionList.png Binary files differnew file mode 100644 index 0000000..262b10e --- /dev/null +++ b/doc/sphinx/uml/buildCfgOptionList.png diff --git a/doc/sphinx/uml/buildCfgOptionList.svg b/doc/sphinx/uml/buildCfgOptionList.svg new file mode 100644 index 0000000..e1d7470 --- /dev/null +++ b/doc/sphinx/uml/buildCfgOptionList.svg @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1517px" preserveAspectRatio="none" style="width:615px;height:1517px;background:#FFFFFF;" version="1.1" viewBox="0 0 615 1517" width="615px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="476" x="68" y="34.9659">buildCfgOptionList: build configured option list algorithm (Kea 1.8.0)</text> + <ellipse cx="279.25" cy="60.0679" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="206" x="176.25" y="90.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="186" x="186.25" y="112.896">Get (empty) configured option list</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="55" x="251.75" y="195.903"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="35" x="261.75" y="218.7311">return</text> + <ellipse cx="279.25" cy="270.575" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="279.25" cy="270.575" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="252.75,146.412,305.75,146.412,317.75,158.412,305.75,170.412,252.75,170.412,240.75,158.412,252.75,146.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="283.25" y="182.1709">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="53" x="252.75" y="162.68">no subnet</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="317.75" y="155.1891">no</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="210" x="174.25" y="373.066"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="190" x="184.25" y="395.8941">push back host configured options</text> + <polygon fill="#F1F1F1" points="215.25,323.575,343.25,323.575,355.25,335.575,343.25,347.575,215.25,347.575,203.25,335.575,215.25,323.575" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="283.25" y="359.3339">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="128" x="215.25" y="339.843">current host reservation</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="355.25" y="332.3521">no</text> + <polygon fill="#F1F1F1" points="279.25,429.4101,291.25,441.4101,279.25,453.4101,267.25,441.4101,279.25,429.4101" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="180" x="189.25" y="522.901"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="160" x="199.25" y="545.7291">get pool of assigned address</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="210" x="174.25" y="628.7361"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="190" x="184.25" y="651.5642">push back pool configured options</text> + <polygon fill="#F1F1F1" points="267.25,579.2451,291.25,579.2451,303.25,591.2451,291.25,603.2451,267.25,603.2451,255.25,591.2451,267.25,579.2451" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="283.25" y="615.0041">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="24" x="267.25" y="595.5131">pool</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="303.25" y="588.0222">no</text> + <polygon fill="#F1F1F1" points="279.25,685.0802,291.25,697.0802,279.25,709.0802,267.25,697.0802,279.25,685.0802" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="234.25,473.4101,324.25,473.4101,336.25,485.4101,324.25,497.4101,234.25,497.4101,222.25,485.4101,234.25,473.4101" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="283.25" y="509.169">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="90" x="234.25" y="489.6781">assigned address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="336.25" y="482.1871">no</text> + <polygon fill="#F1F1F1" points="279.25,729.0802,291.25,741.0802,279.25,753.0802,267.25,741.0802,279.25,729.0802" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="224" x="167.25" y="773.0802"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="204" x="177.25" y="795.9083">push back subnet configured options</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="199" x="179.75" y="829.4243"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="179" x="189.75" y="852.2524">get shared network from subnet</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="273" x="142.75" y="935.2594"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="253" x="152.75" y="958.0875">push back shared network configured options</text> + <polygon fill="#F1F1F1" points="237.75,885.7684,320.75,885.7684,332.75,897.7684,320.75,909.7684,237.75,909.7684,225.75,897.7684,237.75,885.7684" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="283.25" y="921.5273">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="83" x="237.75" y="902.0364">shared network</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="332.75" y="894.5455">no</text> + <polygon fill="#F1F1F1" points="279.25,991.6035,291.25,1003.6035,279.25,1015.6035,267.25,1003.6035,279.25,991.6035" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="308" x="125.25" y="1079.6035"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="288" x="135.25" y="1102.4316">get client class definition from current configuration</text> + <polygon fill="#F1F1F1" points="263.25,1135.9476,295.25,1135.9476,307.25,1147.9476,295.25,1159.9476,263.25,1159.9476,251.25,1147.9476,263.25,1135.9476" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="32" x="263.25" y="1152.2156">found</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="237.25" y="1144.7246">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="307.25" y="1144.7246">yes</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="193" x="38" y="1219.4386"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="173" x="48" y="1242.2666">log debug "class unconfigured"</text> + <polygon fill="#F1F1F1" points="86.5,1169.9476,182.5,1169.9476,194.5,1181.9476,182.5,1193.9476,86.5,1193.9476,74.5,1181.9476,86.5,1169.9476" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="138.5" y="1205.7065">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="96" x="86.5" y="1186.2156">built-in client class</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="194.5" y="1178.7246">yes</text> + <polygon fill="#F1F1F1" points="134.5,1275.7827,146.5,1287.7827,134.5,1299.7827,122.5,1287.7827,134.5,1275.7827" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="302" x="273" y="1169.9476"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="282" x="283" y="1192.7757">push back client class definition configured options</text> + <polygon fill="#F1F1F1" points="279.25,1305.7827,291.25,1317.7827,279.25,1329.7827,267.25,1317.7827,279.25,1305.7827" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="211.75,1035.6035,346.75,1035.6035,358.75,1047.6035,346.75,1059.6035,211.75,1059.6035,199.75,1047.6035,211.75,1035.6035" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="135" x="211.75" y="1051.8715">for each query client class</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="220" x="169.25" y="1371.7827"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="200" x="179.25" y="1394.6108">push back global configured options</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="55" x="251.75" y="1428.1268"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="35" x="261.75" y="1450.9549">return</text> + <ellipse cx="279.25" cy="1495.4709" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="279.25" cy="1495.4709" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="70.0679" y2="90.0679"/> + <polygon fill="#181818" points="275.25,80.0679,279.25,90.0679,283.25,80.0679,279.25,84.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="232.2471" y2="259.575"/> + <polygon fill="#181818" points="275.25,249.575,279.25,259.575,283.25,249.575,279.25,253.575" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="170.412" y2="195.903"/> + <polygon fill="#181818" points="275.25,185.903,279.25,195.903,283.25,185.903,279.25,189.903" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="317.75" x2="329.75" y1="158.412" y2="158.412"/> + <polygon fill="#181818" points="325.75,229.575,329.75,239.575,333.75,229.575,329.75,233.575" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="329.75" x2="329.75" y1="158.412" y2="303.575"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="329.75" x2="279.25" y1="303.575" y2="303.575"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="303.575" y2="323.575"/> + <polygon fill="#181818" points="275.25,313.575,279.25,323.575,283.25,313.575,279.25,317.575" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="126.412" y2="146.412"/> + <polygon fill="#181818" points="275.25,136.412,279.25,146.412,283.25,136.412,279.25,140.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="347.575" y2="373.066"/> + <polygon fill="#181818" points="275.25,363.066,279.25,373.066,283.25,363.066,279.25,367.066" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="355.25" x2="394.25" y1="335.575" y2="335.575"/> + <polygon fill="#181818" points="390.25,381.238,394.25,391.238,398.25,381.238,394.25,385.238" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="394.25" x2="394.25" y1="335.575" y2="441.4101"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="394.25" x2="291.25" y1="441.4101" y2="441.4101"/> + <polygon fill="#181818" points="301.25,437.4101,291.25,441.4101,301.25,445.4101,297.25,441.4101" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="409.4101" y2="429.4101"/> + <polygon fill="#181818" points="275.25,419.4101,279.25,429.4101,283.25,419.4101,279.25,423.4101" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="603.2451" y2="628.7361"/> + <polygon fill="#181818" points="275.25,618.7361,279.25,628.7361,283.25,618.7361,279.25,622.7361" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="303.25" x2="394.25" y1="591.2451" y2="591.2451"/> + <polygon fill="#181818" points="390.25,636.9081,394.25,646.9081,398.25,636.9081,394.25,640.9081" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="394.25" x2="394.25" y1="591.2451" y2="697.0802"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="394.25" x2="291.25" y1="697.0802" y2="697.0802"/> + <polygon fill="#181818" points="301.25,693.0802,291.25,697.0802,301.25,701.0802,297.25,697.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="665.0802" y2="685.0802"/> + <polygon fill="#181818" points="275.25,675.0802,279.25,685.0802,283.25,675.0802,279.25,679.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="559.2451" y2="579.2451"/> + <polygon fill="#181818" points="275.25,569.2451,279.25,579.2451,283.25,569.2451,279.25,573.2451" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="497.4101" y2="522.901"/> + <polygon fill="#181818" points="275.25,512.901,279.25,522.901,283.25,512.901,279.25,516.901" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="336.25" x2="416.25" y1="485.4101" y2="485.4101"/> + <polygon fill="#181818" points="412.25,601.2361,416.25,611.2361,420.25,601.2361,416.25,605.2361" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="416.25" x2="416.25" y1="485.4101" y2="741.0802"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="416.25" x2="291.25" y1="741.0802" y2="741.0802"/> + <polygon fill="#181818" points="301.25,737.0802,291.25,741.0802,301.25,745.0802,297.25,741.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="709.0802" y2="729.0802"/> + <polygon fill="#181818" points="275.25,719.0802,279.25,729.0802,283.25,719.0802,279.25,723.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="453.4101" y2="473.4101"/> + <polygon fill="#181818" points="275.25,463.4101,279.25,473.4101,283.25,463.4101,279.25,467.4101" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="753.0802" y2="773.0802"/> + <polygon fill="#181818" points="275.25,763.0802,279.25,773.0802,283.25,763.0802,279.25,767.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="809.4243" y2="829.4243"/> + <polygon fill="#181818" points="275.25,819.4243,279.25,829.4243,283.25,819.4243,279.25,823.4243" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="909.7684" y2="935.2594"/> + <polygon fill="#181818" points="275.25,925.2594,279.25,935.2594,283.25,925.2594,279.25,929.2594" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="332.75" x2="425.75" y1="897.7684" y2="897.7684"/> + <polygon fill="#181818" points="421.75,943.4314,425.75,953.4314,429.75,943.4314,425.75,947.4314" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="425.75" x2="425.75" y1="897.7684" y2="1003.6035"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="425.75" x2="291.25" y1="1003.6035" y2="1003.6035"/> + <polygon fill="#181818" points="301.25,999.6035,291.25,1003.6035,301.25,1007.6035,297.25,1003.6035" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="971.6035" y2="991.6035"/> + <polygon fill="#181818" points="275.25,981.6035,279.25,991.6035,283.25,981.6035,279.25,985.6035" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="865.7684" y2="885.7684"/> + <polygon fill="#181818" points="275.25,875.7684,279.25,885.7684,283.25,875.7684,279.25,879.7684" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="134.5" x2="134.5" y1="1193.9476" y2="1219.4386"/> + <polygon fill="#181818" points="130.5,1209.4386,134.5,1219.4386,138.5,1209.4386,134.5,1213.4386" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="194.5" x2="241" y1="1181.9476" y2="1181.9476"/> + <polygon fill="#181818" points="237,1227.6106,241,1237.6106,245,1227.6106,241,1231.6106" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="241" x2="241" y1="1181.9476" y2="1287.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="241" x2="146.5" y1="1287.7827" y2="1287.7827"/> + <polygon fill="#181818" points="156.5,1283.7827,146.5,1287.7827,156.5,1291.7827,152.5,1287.7827" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="134.5" x2="134.5" y1="1255.7827" y2="1275.7827"/> + <polygon fill="#181818" points="130.5,1265.7827,134.5,1275.7827,138.5,1265.7827,134.5,1269.7827" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="251.25" x2="134.5" y1="1147.9476" y2="1147.9476"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="134.5" x2="134.5" y1="1147.9476" y2="1169.9476"/> + <polygon fill="#181818" points="130.5,1159.9476,134.5,1169.9476,138.5,1159.9476,134.5,1163.9476" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="307.25" x2="424" y1="1147.9476" y2="1147.9476"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="424" x2="424" y1="1147.9476" y2="1169.9476"/> + <polygon fill="#181818" points="420,1159.9476,424,1169.9476,428,1159.9476,424,1163.9476" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="134.5" x2="134.5" y1="1299.7827" y2="1317.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="134.5" x2="267.25" y1="1317.7827" y2="1317.7827"/> + <polygon fill="#181818" points="257.25,1313.7827,267.25,1317.7827,257.25,1321.7827,261.25,1317.7827" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="424" x2="424" y1="1206.2917" y2="1317.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="424" x2="291.25" y1="1317.7827" y2="1317.7827"/> + <polygon fill="#181818" points="301.25,1313.7827,291.25,1317.7827,301.25,1321.7827,297.25,1317.7827" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1115.9476" y2="1135.9476"/> + <polygon fill="#181818" points="275.25,1125.9476,279.25,1135.9476,283.25,1125.9476,279.25,1129.9476" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1059.6035" y2="1079.6035"/> + <polygon fill="#181818" points="275.25,1069.6035,279.25,1079.6035,283.25,1069.6035,279.25,1073.6035" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1329.7827" y2="1339.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="589" y1="1339.7827" y2="1339.7827"/> + <polygon fill="#181818" points="585,1197.9386,589,1187.9386,593,1197.9386,589,1193.9386" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="589" x2="589" y1="1047.6035" y2="1339.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="589" x2="358.75" y1="1047.6035" y2="1047.6035"/> + <polygon fill="#181818" points="368.75,1043.6035,358.75,1047.6035,368.75,1051.6035,364.75,1047.6035" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="199.75" x2="24" y1="1047.6035" y2="1047.6035"/> + <polygon fill="#181818" points="20,1183.9386,24,1193.9386,28,1183.9386,24,1187.9386" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="24" x2="24" y1="1047.6035" y2="1351.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="24" x2="279.25" y1="1351.7827" y2="1351.7827"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1351.7827" y2="1371.7827"/> + <polygon fill="#181818" points="275.25,1361.7827,279.25,1371.7827,283.25,1361.7827,279.25,1365.7827" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1015.6035" y2="1035.6035"/> + <polygon fill="#181818" points="275.25,1025.6035,279.25,1035.6035,283.25,1025.6035,279.25,1029.6035" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1408.1268" y2="1428.1268"/> + <polygon fill="#181818" points="275.25,1418.1268,279.25,1428.1268,283.25,1418.1268,279.25,1422.1268" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="279.25" x2="279.25" y1="1464.4709" y2="1484.4709"/> + <polygon fill="#181818" points="275.25,1474.4709,279.25,1484.4709,283.25,1474.4709,279.25,1478.4709" style="stroke:#181818;stroke-width:1.0;"/> + <!--SRC=[ZLFBJiCm4BpxArOz9GSGt51pvC019Bx1YTUELTSR_A3gt-C7eKsQIjoiVSpEpgo33WQXZzg8Lwa-fw39VcWVzZK60rcfLNGeW4eIJCe2DugS3kCHcdVayFpuylZKCkO3Tu7jtp10WySfdDix01rZMa9Z2NpiBOOMmeWMcZFwbW7i7OReR9UUFj34q7ZCrIr3AxIipKDq3cs0aH8XXnxTDyy3rbXJz2FqV3ZKoXj2ljl6vzvhPLCP5oB1-pMkIbjEH0P8mhesCyyOER_gMp0g_LkC02wSqhkmkc5v1LHbt8HYXQaVUOwceXEv0qX7nz-chcoxpD_NS8NpBpLFeqv7raXoW7mOuIkYEyDWTBPlC4cyDAIml8w1GAcjBZTJwCw6ppEBsqcgJ5zIj69cNKMh3kGp3W_QBiUjBRaMkrXaIANvVLImgsIYlQowwsfJsMvkthBttZft7AykMr7qMjYh3FLy-rB-_ahvAJy0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/buildCfgOptionList.uml b/doc/sphinx/uml/buildCfgOptionList.uml new file mode 100644 index 0000000..1df19f8 --- /dev/null +++ b/doc/sphinx/uml/buildCfgOptionList.uml @@ -0,0 +1,52 @@ +@startuml + +title buildCfgOptionList: build configured option list algorithm (Kea 1.8.0) + +start +:Get (empty) configured option list; + +if (no subnet) then (yes) + :return; + stop +else (no) +endif + +if (current host reservation) then (yes) + :push back host configured options; +else (no) +endif + +if (assigned address) then (yes) + :get pool of assigned address; + if (pool) then (yes) + :push back pool configured options; + else (no) + endif +else (no) +endif + +:push back subnet configured options; + +:get shared network from subnet; +if (shared network) then (yes) + :push back shared network configured options; +else (no) +endif + +while (for each query client class) + :get client class definition from current configuration; + if (found) then (no) + if (built-in client class) then (yes) + else (no) + :log debug "class unconfigured"; + endif + else (yes) + :push back client class definition configured options; + endif +endwhile + +:push back global configured options; +:return; +stop + +@enduml diff --git a/doc/sphinx/uml/currentHost4.png b/doc/sphinx/uml/currentHost4.png Binary files differnew file mode 100644 index 0000000..e8aa59e --- /dev/null +++ b/doc/sphinx/uml/currentHost4.png diff --git a/doc/sphinx/uml/currentHost4.svg b/doc/sphinx/uml/currentHost4.svg new file mode 100644 index 0000000..58ed82e --- /dev/null +++ b/doc/sphinx/uml/currentHost4.svg @@ -0,0 +1,301 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="2256px" preserveAspectRatio="none" style="width:944px;height:2256px;background:#FFFFFF;" version="1.1" viewBox="0 0 944 2256" width="944px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="218" x="356.25" y="24.9659">currentHost DHCPv4 (Kea 1.8.0)</text> + <!--entity entry--> + <g id="elem_entry"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="133" x="301" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="113" x="311" y="72.0339">Subnet Selection</text> + </g> + <!--entity setSelected--> + <g id="elem_setSelected"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="246" x="244.5" y="147.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="226" x="254.5" y="172.1039">Set subnet to the selected subnet</text> + </g> + <!--entity clientid_lookup--> + <g id="elem_clientid_lookup"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="244" x="245.5" y="247.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="224" x="255.5" y="272.1739">Has client a lease for its client id?</text> + </g> + <!--entity clientid_iterate--> + <g id="elem_clientid_iterate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="281" x="7" y="347.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="261" x="17" y="372.2439">Iterate on allowed subnets for client id</text> + </g> + <!--entity found_clientid--> + <g id="elem_found_clientid"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="252" x="21.5" y="534.4079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="232" x="31.5" y="559.3739">Set subnet to the by client id lease</text> + </g> + <!--entity hwaddr_lookup--> + <g id="elem_hwaddr_lookup"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="211" x="429" y="465.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="191" x="439" y="490.3039">Has client a matching lease?</text> + </g> + <!--entity hwaddr_iterate--> + <g id="elem_hwaddr_iterate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="350" x="200.5" y="603.4779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="330" x="210.5" y="628.4439">Iterate on allowed subnets for hardware address</text> + </g> + <!--entity found_hwaddr--> + <g id="elem_found_hwaddr"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="242" x="227.5" y="721.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="222" x="237.5" y="746.5139">Set subnet to the matching lease</text> + </g> + <!--entity hasAddressReservation--> + <g id="elem_hasAddressReservation"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="210" x="373.5" y="981.6079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="190" x="383.5" y="1006.5739">Has an address reservation?</text> + </g> + <!--entity setAddressReservation--> + <g id="elem_setAddressReservation"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="298" x="220.5" y="1099.6779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="278" x="230.5" y="1124.6439">Set subnet to address reservation subnet</text> + </g> + <!--entity pool--> + <g id="elem_pool"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="249" x="354" y="1199.7479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="229" x="364" y="1224.7139">Is the address in an allowed pool?</text> + </g> + <!--entity pool_iterate--> + <g id="elem_pool_iterate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="266" x="146.5" y="1299.8179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="246" x="156.5" y="1324.7839">Iterate on allowed subnets with pool</text> + </g> + <!--entity inAllowedPool--> + <g id="elem_inAllowedPool"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="251" x="154" y="1417.8879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="231" x="164" y="1442.8539">Set subnet to address pool subnet</text> + </g> + <!--entity allocate--> + <g id="elem_allocate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="156" x="396.5" y="1517.9479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="136" x="406.5" y="1542.9139">Allocate a new lease</text> + </g> + <!--entity allocate_iterate--> + <g id="elem_allocate_iterate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="200" x="237.5" y="1636.0179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="180" x="247.5" y="1660.9839">Iterate on allowed subnets</text> + </g> + <!--entity allocated--> + <g id="elem_allocated"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="264" x="273.5" y="1754.0879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="244" x="283.5" y="1779.0539">Set subnet to allocated lease subnet</text> + </g> + <!--entity getHRmode--> + <g id="elem_getHRmode"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="249" x="395" y="1854.1579"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="229" x="405" y="1879.1239">Get subnet host reservation mode</text> + </g> + <!--entity checkHRmode--> + <g id="elem_checkHRmode"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="290" x="374.5" y="1954.2279"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="270" x="384.5" y="1979.1939">Is subnet host reservation mode global?</text> + </g> + <!--entity global--> + <g id="elem_global"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="202" x="298.5" y="2072.2879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="182" x="308.5" y="2097.2539">Get global host reservation</text> + </g> + <!--entity bySubnet--> + <g id="elem_bySubnet"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="207" x="536" y="2072.2879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="187" x="546" y="2097.2539">Get subnet host reservation</text> + </g> + <!--entity return--> + <g id="elem_return"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="233" x="402" y="2190.3579"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="213" x="412" y="2215.3239">Return current host reservation</text> + </g> + <!--link entry to setSelected--> + <g id="link_entry_setSelected"> + <path d="M367.5,86.5079 C367.5,101.8379 367.5,123.5879 367.5,140.4079 " fill="none" id="entry-to-setSelected" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="367.5,145.3079,371.5,136.3079,367.5,140.3079,363.5,136.3079,367.5,145.3079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link setSelected to clientid_lookup--> + <g id="link_setSelected_clientid_lookup"> + <path d="M367.5,186.5779 C367.5,201.9079 367.5,223.6579 367.5,240.4779 " fill="none" id="setSelected-to-clientid_lookup" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="367.5,245.3779,371.5,236.3779,367.5,240.3779,363.5,236.3779,367.5,245.3779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link clientid_lookup to hwaddr_lookup--> + <g id="link_clientid_lookup_hwaddr_lookup"> + <path d="M432.71,286.6579 C466.61,299.2479 506.66,318.7979 534.5,347.2779 C563.51,376.9479 577.14,395.5079 565.5,435.3379 C562.95,444.0779 558.29,452.7279 553.35,460.2679 " fill="none" id="clientid_lookup-to-hwaddr_lookup" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="550.77,464.0379,559.1444,458.8543,553.5862,459.9065,552.5341,454.3483,550.77,464.0379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="108" x="564.5" y="372.2049">no client id option</text> + </g> + <!--link clientid_lookup to clientid_iterate--> + <g id="link_clientid_lookup_clientid_iterate"> + <path d="M324.82,286.7679 C287.78,303.2779 234.2,327.1579 195.64,344.3479 " fill="none" id="clientid_lookup-to-clientid_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="191.44,346.2179,201.2889,346.2122,196.0079,344.1846,198.0355,338.9036,191.44,346.2179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link clientid_iterate to clientid_iterate--> + <g id="link_clientid_iterate_clientid_iterate"> + <path d="M288.3,358.3179 C309.02,359.6579 323,362.4879 323,366.8079 C323,370.6879 311.71,373.3679 294.4,374.8379 " fill="none" id="clientid_iterate-to-clientid_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="289.81,375.1879,299.0823,378.5082,294.7962,374.8165,298.488,370.5303,289.81,375.1879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="199" x="329" y="372.2049">match-client-id is false or no lease</text> + </g> + <!--link clientid_iterate to found_clientid--> + <g id="link_clientid_iterate_found_clientid"> + <path d="M147.5,386.5779 C147.5,420.1179 147.5,490.3479 147.5,527.9379 " fill="none" id="clientid_iterate-to-found_clientid" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="147.5,532.6079,151.5,523.6079,147.5,527.6079,143.5,523.6079,147.5,532.6079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="79" x="148.5" y="431.2349">found a lease</text> + </g> + <!--link found_clientid to hasAddressReservation--> + <g id="link_found_clientid_hasAddressReservation"> + <path d="M147.5,573.7479 C147.5,598.3879 147.5,642.9479 147.5,681.0479 C147.5,681.0479 147.5,681.0479 147.5,920.6079 C147.5,966.8079 270.91,986.2379 367.03,994.3679 " fill="none" id="found_clientid-to-hasAddressReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="371.81,994.7679,363.1721,990.0364,366.8272,994.3539,362.5097,998.0089,371.81,994.7679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link clientid_iterate to hwaddr_lookup--> + <g id="link_clientid_iterate_hwaddr_lookup"> + <path d="M182.5,386.8379 C215.25,404.3879 261.96,428.6879 281.5,435.3379 C326.59,450.6879 377.94,461.6679 422.55,469.2579 " fill="none" id="clientid_iterate-to-hwaddr_lookup" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="427.3,470.0579,419.0851,464.625,422.3688,469.2313,417.7626,472.515,427.3,470.0579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="278" x="282.5" y="431.2349">not found by client id, try by hardware address</text> + </g> + <!--link hwaddr_lookup to hasAddressReservation--> + <g id="link_hwaddr_lookup_hasAddressReservation"> + <path d="M640.43,496.0879 C717.9,510.0979 809.5,543.2979 809.5,622.0079 C809.5,622.0079 809.5,622.0079 809.5,920.6079 C809.5,966.8079 686.09,986.2379 589.97,994.3679 " fill="none" id="hwaddr_lookup-to-hasAddressReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="585.19,994.7679,594.4903,998.0089,590.1728,994.3539,593.8279,990.0364,585.19,994.7679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="126" x="810.5" y="805.5049">no hardware address</text> + </g> + <!--link hwaddr_lookup to hwaddr_iterate--> + <g id="link_hwaddr_lookup_hwaddr_iterate"> + <path d="M512.39,504.8079 C483.64,529.4279 433.44,572.4079 402.47,598.9179 " fill="none" id="hwaddr_lookup-to-hwaddr_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="398.83,602.0379,408.2726,599.2383,402.6333,598.7922,403.0794,593.153,398.83,602.0379" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link hwaddr_iterate to hwaddr_iterate--> + <g id="link_hwaddr_iterate_hwaddr_iterate"> + <path d="M550.89,613.4979 C571.83,615.2279 585.5,618.3979 585.5,623.0079 C585.5,627.1579 574.46,630.1379 557.04,631.9479 " fill="none" id="hwaddr_iterate-to-hwaddr_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="552.4,632.3879,561.7285,635.547,557.379,631.9301,560.9959,627.5806,552.4,632.3879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="176" x="591.5" y="628.4049">no lease or client id mismatch</text> + </g> + <!--link hwaddr_iterate to found_hwaddr--> + <g id="link_hwaddr_iterate_found_hwaddr"> + <path d="M371.1,642.9179 C366.53,662.5579 359.36,693.3979 354.32,715.0579 " fill="none" id="hwaddr_iterate-to-found_hwaddr" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="353.24,719.7079,359.168,711.8429,354.3685,714.8369,351.3745,710.0374,353.24,719.7079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="79" x="365.5" y="687.4449">found a lease</text> + </g> + <!--link found_hwaddr to hasAddressReservation--> + <g id="link_found_hwaddr_hasAddressReservation"> + <path d="M358.06,761.0579 C381.21,807.0079 440.27,924.2479 466.09,975.5179 " fill="none" id="found_hwaddr-to-hasAddressReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="468.25,979.7879,467.7902,969.9498,466.0082,975.3186,460.6394,973.5366,468.25,979.7879" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link hwaddr_iterate to hasAddressReservation--> + <g id="link_hwaddr_iterate_hasAddressReservation"> + <path d="M432.33,643.0379 C473.7,660.8879 522.5,692.1179 522.5,740.0779 C522.5,740.0779 522.5,740.0779 522.5,920.6079 C522.5,941.1679 511.11,961.3979 499.91,976.3179 " fill="none" id="hwaddr_iterate-to-hasAddressReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="497.07,979.9679,505.7564,975.326,500.1427,976.0235,499.4452,970.4098,497.07,979.9679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="60" x="523.5" y="854.5049">not found</text> + </g> + <!--link hasAddressReservation to setAddressReservation--> + <g id="link_hasAddressReservation_setAddressReservation"> + <path d="M460.74,1021.0579 C441.9,1041.1179 412.09,1072.8679 391.7,1094.5779 " fill="none" id="hasAddressReservation-to-setAddressReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="388.28,1098.2079,397.3611,1094.3956,391.7068,1094.5669,391.5355,1088.9127,388.28,1098.2079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="20" x="431.5" y="1065.5749">yes</text> + </g> + <!--link hasAddressReservation to pool--> + <g id="link_hasAddressReservation_pool"> + <path d="M495.7,1020.7579 C517.49,1046.6879 550.63,1095.3879 536.5,1138.7479 C529.65,1159.7679 514.91,1179.8579 502,1194.5879 " fill="none" id="hasAddressReservation-to-pool" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="498.72,1198.2379,507.7062,1194.207,502.0577,1194.5151,501.7496,1188.8666,498.72,1198.2379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="212" x="540.5" y="1124.6149">no or not check in the taken branch</text> + </g> + <!--link setAddressReservation to pool--> + <g id="link_setAddressReservation_pool"> + <path d="M390.52,1139.1279 C408.31,1155.1279 433.88,1178.1379 452.87,1195.2279 " fill="none" id="setAddressReservation-to-pool" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="456.42,1198.4179,452.4062,1189.4241,452.7035,1195.0731,447.0545,1195.3704,456.42,1198.4179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link pool to pool_iterate--> + <g id="link_pool_pool_iterate"> + <path d="M440.13,1239.1879 C406.79,1255.6179 358.5,1279.4179 323.58,1296.6279 " fill="none" id="pool-to-pool_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="319.45,1298.6679,329.2909,1298.271,323.9335,1296.4547,325.7497,1291.0974,319.45,1298.6679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link pool to allocate--> + <g id="link_pool_allocate"> + <path d="M557.89,1239.2379 C589.58,1251.1179 622.9,1270.0379 641.5,1299.8179 C650.7,1314.5379 645.43,1321.9679 641.5,1338.8879 C628.27,1395.8279 621.1,1412.1779 583.5,1456.9479 C564.11,1480.0379 536.68,1500.0079 514.18,1514.1679 " fill="none" id="pool-to-allocate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="510.16,1516.6579,519.9161,1515.3094,514.408,1514.0207,515.6966,1508.5126,510.16,1516.6579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="188" x="634.5" y="1383.7849">pool check is not in all branches</text> + </g> + <!--link pool_iterate to pool_iterate--> + <g id="link_pool_iterate_pool_iterate"> + <path d="M412.93,1310.7779 C433.5,1312.0679 447.5,1314.9279 447.5,1319.3479 C447.5,1323.3279 436.2,1326.0379 418.99,1327.4879 " fill="none" id="pool_iterate-to-pool_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="414.44,1327.8179,423.7123,1331.1382,419.4262,1327.4465,423.118,1323.1603,414.44,1327.8179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="182" x="453.5" y="1324.7449">address not in an allowed pool</text> + </g> + <!--link pool_iterate to inAllowedPool--> + <g id="link_pool_iterate_inAllowedPool"> + <path d="M279.5,1339.2579 C279.5,1358.8179 279.5,1389.4779 279.5,1411.1179 " fill="none" id="pool_iterate-to-inAllowedPool" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="279.5,1416.0079,283.5,1407.0079,279.5,1411.0079,275.5,1407.0079,279.5,1416.0079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="158" x="280.5" y="1383.7849">address in an allowed pool</text> + </g> + <!--link pool_iterate to allocate--> + <g id="link_pool_iterate_allocate"> + <path d="M405.43,1339.2479 C421.34,1346.3379 436.03,1355.9279 447.5,1368.8879 C482.63,1408.5679 481.73,1475.1879 478.08,1511.3279 " fill="none" id="pool_iterate-to-allocate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="477.55,1516.2079,482.5033,1507.6953,478.0928,1511.2375,474.5506,1506.8269,477.55,1516.2079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="95" x="479.5" y="1442.8149">no allowed pool</text> + </g> + <!--link inAllowedPool to allocate--> + <g id="link_inAllowedPool_allocate"> + <path d="M317.1,1457.3279 C349.64,1473.6879 396.7,1497.3579 430.89,1514.5579 " fill="none" id="inAllowedPool-to-allocate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="435.33,1516.7879,429.0787,1509.1773,430.8607,1514.5461,425.4919,1516.3281,435.33,1516.7879" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link allocate to allocate_iterate--> + <g id="link_allocate_allocate_iterate"> + <path d="M399.66,1557.3979 C383.63,1564.4479 368.06,1574.0279 356.5,1587.0179 C346.18,1598.6179 341.42,1615.4079 339.25,1629.3479 " fill="none" id="allocate-to-allocate_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="338.63,1634.0279,343.778,1625.6316,339.2871,1629.0713,335.8474,1624.5803,338.63,1634.0279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="228" x="357.5" y="1601.9149">start from preferred (last used) subnet</text> + </g> + <!--link allocate to getHRmode--> + <g id="link_allocate_getHRmode"> + <path d="M552.86,1556.5279 C567.72,1563.5779 581.43,1573.3879 590.5,1587.0179 C646.76,1671.5379 572.93,1796.9279 537.05,1848.8479 " fill="none" id="allocate-to-getHRmode" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="534.36,1852.6879,542.7993,1847.6107,537.2283,1848.5924,536.2465,1843.0214,534.36,1852.6879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="182" x="605.5" y="1719.9849">allocation is not in all branches</text> + </g> + <!--link allocate_iterate to allocate_iterate--> + <g id="link_allocate_iterate_allocate_iterate"> + <path d="M437.88,1644.9279 C458.07,1646.0979 472.5,1649.6479 472.5,1655.5579 C472.5,1660.8179 461.06,1664.2079 444.29,1665.7079 " fill="none" id="allocate_iterate-to-allocate_iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="439.39,1666.0679,448.6623,1669.3882,444.3762,1665.6965,448.068,1661.4103,439.39,1666.0679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="92" x="478.5" y="1660.9549">no free address</text> + </g> + <!--link allocate_iterate to allocated--> + <g id="link_allocate_iterate_allocated"> + <path d="M348.58,1675.4579 C360.18,1695.2779 378.46,1726.4779 391.17,1748.1579 " fill="none" id="allocate_iterate-to-allocated" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="393.66,1752.4179,392.5601,1742.6307,391.1318,1748.1042,385.6582,1746.6758,393.66,1752.4179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="122" x="377.5" y="1719.9849">found a free address</text> + </g> + <!--link allocated to getHRmode--> + <g id="link_allocated_getHRmode"> + <path d="M427.48,1793.5279 C446.09,1809.5379 472.83,1832.5479 492.69,1849.6279 " fill="none" id="allocated-to-getHRmode" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="496.44,1852.8479,492.2264,1843.9459,492.6498,1849.5869,487.0088,1850.0103,496.44,1852.8479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link getHRmode to checkHRmode--> + <g id="link_getHRmode_checkHRmode"> + <path d="M519.5,1893.5979 C519.5,1908.9279 519.5,1930.6779 519.5,1947.4979 " fill="none" id="getHRmode-to-checkHRmode" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="519.5,1952.3979,523.5,1943.3979,519.5,1947.3979,515.5,1943.3979,519.5,1952.3979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link checkHRmode to global--> + <g id="link_checkHRmode_global"> + <path d="M499.95,1993.6679 C479.12,2013.8179 446.11,2045.7479 423.66,2067.4579 " fill="none" id="checkHRmode-to-global" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="420.13,2070.8779,429.3782,2067.4911,423.7221,2067.3999,423.8133,2061.7437,420.13,2070.8779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="20" x="467.5" y="2038.1849">yes</text> + </g> + <!--link checkHRmode to bySubnet--> + <g id="link_checkHRmode_bySubnet"> + <path d="M539.05,1993.6679 C559.88,2013.8179 592.89,2045.7479 615.34,2067.4579 " fill="none" id="checkHRmode-to-bySubnet" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="618.87,2070.8779,615.1867,2061.7437,615.2779,2067.3999,609.6218,2067.4911,618.87,2070.8779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="16" x="587.5" y="2038.1849">no</text> + </g> + <!--link global to return--> + <g id="link_global_return"> + <path d="M398,2111.5979 C397.82,2126.2979 399.86,2146.5079 410.5,2160.3579 C419.21,2171.6979 431.16,2180.4579 443.95,2187.2079 " fill="none" id="global-to-return" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="448.12,2189.2979,441.859,2181.6953,443.6479,2187.0618,438.2813,2188.8507,448.12,2189.2979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="179" x="411.5" y="2156.2549">return global host reservation</text> + </g> + <!--link bySubnet to return--> + <g id="link_bySubnet_return"> + <path d="M630.17,2111.5779 C622.32,2126.0679 610.05,2146.0179 595.5,2160.3579 C585.35,2170.3579 572.79,2179.3379 560.79,2186.7779 " fill="none" id="bySubnet-to-return" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="556.61,2189.2979,566.3825,2188.0735,560.8912,2186.715,562.2497,2181.2237,556.61,2189.2979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="184" x="611.5" y="2156.2549">return subnet host reservation</text> + </g> + <text fill="#888888" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="620" x="155.25" y="2245.1158">Only the initial lookup is always performed: other occasions to change the subnet so the current host are only in some branches</text> + <!--SRC=[bLR1Rjim3BtxAuYUMc0fDc27eOSEnGOinGuhsWye59k9XJfI82aDylUZH5cMR2TfBuP4yZrIbFHa9rs7KE-DGUMMsZhulVprzFuThl-YW6-tFsw_tbILs90NhbxsAuKENh33sacjha1O88yv3Y7ajnpcDBWMmOPeRA8vO2owbsXEo2NPwqxwiO0EXKLOQmFI9RDiVWOqJsNpscdzjjybXaU7HZW4hK1qdJwad3Om9PQIH3Bgp0fMnm7BbGM6jTwhvhNdcL_7LhYwbMh3C2w_FOYcCPyilXMcEGY3uB5eRSvqUGLb6Ldrp53KBbIV0-Y3vbtuhOwb2_l0lkV1TIBl3Cde29oXUhIXxfv3gb1MxCjEwuxhyQEFTF0WNHk24-f2q_h4FZIlMge7fdxACtjRxLCBK7Z8cYoYumCr5l6NgejXyJJc1IPNWluPeAs_t_b-R7N3XMxGBP_zBD-1SoZOT7ebuZRKBTPl8xnFop4J0iuOV1-fCeIlZYm-2V2CRczKhrpp81DYgYf852mMzuNmPEFW6ylAQ4un55HSNhW3fJDjqBjmYAV0-wdSZ0qm4qJyuUOksB6W599khkXepqaJA7VO_nak8YlbYQY2eTVMQkHUyEfcx_Si_RGHBcR8vV8B-CwJPQnVLOa_dPrxV15-FnR3SWgJ0ERb-vC_3h2LDZHzmf1woeuJ7OtES_sS8JwzzDZLQZuYdkbPx17j6LHGjj23S98SNsAlj5vudNX31IiZ53LYFa5FKWMcVfRw7wraxYM9iWLZJ6H3LXc4C6QYWdCE674IGQ_BFRHy54PeWXTwdU4lOyl2bIw3Izuyk4get9ejmJfXQ5EDtiBEu1f9lnguxWJfrzvYSnDbCESXeYJGVX7iyPjmeekJjFEbqAhM1eTBDOLbk5n2Pb6ieiDBCfGS131x8x8nO_YTu2CxTlRA7-gjOgXtiBgJEGvEl3PL8fW3dNXpAhhDcfe0_rHt33T2AkaaqKV5aVwfFOWZ_IAWeH-qBJPte2dGWAvhOOd3-gUwReNQ8Fy8SohBlsJ5m-MLJVjCj95MRt7OoVy0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/currentHost4.uml b/doc/sphinx/uml/currentHost4.uml new file mode 100644 index 0000000..1e9ef4d --- /dev/null +++ b/doc/sphinx/uml/currentHost4.uml @@ -0,0 +1,83 @@ +@startuml + +title currentHost DHCPv4 (Kea 1.8.0) + +agent "Subnet Selection" as entry + +agent "Set subnet to the selected subnet" as setSelected + +agent "Has client a lease for its client id?" as clientid_lookup + +agent "Iterate on allowed subnets for client id" as clientid_iterate + +agent "Set subnet to the by client id lease" as found_clientid + +agent "Has client a matching lease?" as hwaddr_lookup + +agent "Iterate on allowed subnets for hardware address" as hwaddr_iterate + +agent "Set subnet to the matching lease" as found_hwaddr + +agent "Has an address reservation?" as hasAddressReservation + +agent "Set subnet to address reservation subnet" as setAddressReservation + +agent "Is the address in an allowed pool?" as pool + +agent "Iterate on allowed subnets with pool" as pool_iterate + +agent "Set subnet to address pool subnet" as inAllowedPool + +agent "Allocate a new lease" as allocate + +agent "Iterate on allowed subnets" as allocate_iterate + +agent "Set subnet to allocated lease subnet" as allocated + +agent "Get subnet host reservation mode" as getHRmode + +agent "Is subnet host reservation mode global?" as checkHRmode + +agent "Get global host reservation" as global + +agent "Get subnet host reservation" as bySubnet + +agent "Return current host reservation" as return + +entry --> setSelected +setSelected --> clientid_lookup +clientid_lookup ---> hwaddr_lookup : no client id option +clientid_lookup --> clientid_iterate +clientid_iterate -> clientid_iterate : match-client-id is false or no lease +clientid_iterate --> found_clientid : found a lease +found_clientid ----> hasAddressReservation +clientid_iterate --> hwaddr_lookup : not found by client id, try by hardware address +hwaddr_lookup ---> hasAddressReservation : no hardware address +hwaddr_lookup --> hwaddr_iterate +hwaddr_iterate -> hwaddr_iterate : no lease or client id mismatch +hwaddr_iterate --> found_hwaddr : found a lease +found_hwaddr ----> hasAddressReservation +hwaddr_iterate --> hasAddressReservation : not found +hasAddressReservation --> setAddressReservation : yes +hasAddressReservation --> pool : no or not check in the taken branch +setAddressReservation --> pool +pool --> pool_iterate +pool ---> allocate : pool check is not in all branches +pool_iterate -> pool_iterate : address not in an allowed pool +pool_iterate --> inAllowedPool : address in an allowed pool +pool_iterate ---> allocate : no allowed pool +inAllowedPool --> allocate +allocate --> allocate_iterate : start from preferred (last used) subnet +allocate ---> getHRmode : allocation is not in all branches +allocate_iterate -> allocate_iterate : no free address +allocate_iterate --> allocated : found a free address +allocated --> getHRmode +getHRmode --> checkHRmode +checkHRmode --> global : yes +checkHRmode --> bySubnet : no +global --> return : return global host reservation +bySubnet --> return : return subnet host reservation + +footer Only the initial lookup is always performed: other occasions to change the subnet so the current host are only in some branches + +@enduml
\ No newline at end of file diff --git a/doc/sphinx/uml/lease-states.png b/doc/sphinx/uml/lease-states.png Binary files differnew file mode 100644 index 0000000..76fc762 --- /dev/null +++ b/doc/sphinx/uml/lease-states.png diff --git a/doc/sphinx/uml/lease-states.svg b/doc/sphinx/uml/lease-states.svg new file mode 100644 index 0000000..873cd64 --- /dev/null +++ b/doc/sphinx/uml/lease-states.svg @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="728px" preserveAspectRatio="none" style="width:617px;height:728px;background:#FFFFFF;" version="1.1" viewBox="0 0 617 728" width="617px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="156" x="223.5" y="24.9659">lease states (Kea 1.8.0)</text> + <!--entity free--> + <g id="elem_free"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="49" x="266.5" y="49.3979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="29" x="276.5" y="74.3639">Free</text> + </g> + <g id="elem_GMN3"> + <path d="M61,55.0779 L61,82.7839 A0,0 0 0 0 61,82.7839 L231,82.7839 A0,0 0 0 0 231,82.7839 L231,73.0779 L266.26,68.9379 L231,65.0779 L231,65.0779 L221,55.0779 L61,55.0779 A0,0 0 0 0 61,55.0779 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M221,55.0779 L221,65.0779 L231,65.0779 L221,55.0779 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="149" x="67" y="73.9749">not in the lease database</text> + </g> + <!--entity assigned--> + <g id="elem_assigned"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="82" x="257" y="229.4679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="62" x="267" y="254.4339">Assigned</text> + </g> + <!--entity assigned_expired--> + <g id="elem_assigned_expired"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="137" x="353.5" y="347.5379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="363.5" y="372.5039">Assigned expired</text> + </g> + <!--entity declined--> + <g id="elem_declined"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="79" x="129.5" y="465.6079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="59" x="139.5" y="490.5739">Declined</text> + </g> + <!--entity declined_expired--> + <g id="elem_declined_expired"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="134" x="40" y="583.6679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="114" x="50" y="608.6339">Declined expired</text> + </g> + <!--entity reclaimed--> + <g id="elem_reclaimed"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="146" x="271" y="683.7379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="281" y="708.7039">Expired-Reclaimed</text> + </g> + <!--link free to assigned--> + <g id="link_free_assigned"> + <path d="M273.81,88.6079 C258.11,108.0179 238.52,139.5279 247,168.4679 C253.01,188.9779 266.11,209.2079 277.53,224.1279 " fill="none" id="free-to-assigned" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="280.39,227.7879,278.0148,218.2298,277.3173,223.8435,271.7036,223.146,280.39,227.7879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="70" x="248" y="164.3649">assignment</text> + </g> + <!--reverse link free to assigned--> + <g id="link_free_assigned"> + <path d="M303.84,94.7279 C311.04,110.0579 319.3,130.3779 323,149.4679 C328.44,177.5379 316.98,209.5379 307.84,229.2579 " fill="none" id="free-backto-assigned" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="301.7,90.2779,302.0088,100.1219,303.8729,94.7811,309.2138,96.6452,301.7,90.2779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="80" x="326" y="164.3649">release query</text> + </g> + <!--link assigned to assigned_expired--> + <g id="link_assigned_assigned_expired"> + <path d="M339.42,264.1779 C357.42,272.0179 377.63,283.3079 392,298.5379 C403.22,310.4379 410.71,327.2279 415.39,341.0879 " fill="none" id="assigned-to-assigned_expired" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="416.89,345.7879,417.9535,335.9966,415.3646,341.0263,410.3349,338.4373,416.89,345.7879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="106" x="405" y="313.4349">after valid lifetime</text> + </g> + <!--reverse link assigned to assigned_expired--> + <g id="link_assigned_assigned_expired"> + <path d="M313.23,274.0979 C322.56,287.7579 335.31,304.6379 349,317.5379 C360.86,328.6979 375.55,339.0079 388.65,347.2279 " fill="none" id="assigned-backto-assigned_expired" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="310.55,270.0979,312.2372,279.8012,313.3334,274.2516,318.883,275.3478,310.55,270.0979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="33" x="350" y="313.4349">reuse</text> + </g> + <!--link assigned to assigned--> + <g id="link_assigned_assigned"> + <path d="M339.43,239.7679 C357.97,238.8879 374,241.9679 374,248.9979 C374,255.2179 361.51,258.3379 345.82,258.3879 " fill="none" id="assigned-to-assigned" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="340.95,258.2679,349.8562,262.4725,345.9487,258.3822,350.0391,254.4746,340.95,258.2679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="75" x="380" y="254.3949">renew query</text> + </g> + <!--link assigned to declined--> + <g id="link_assigned_declined"> + <path d="M268.22,269.0179 C243.65,286.3679 210,314.3379 192,347.5379 C172.82,382.9179 168.88,430.4079 168.46,459.0679 " fill="none" id="assigned-to-declined" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="168.43,463.7179,172.4814,454.7409,168.4586,458.718,164.4815,454.6952,168.43,463.7179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="80" x="193" y="372.4649">decline query</text> + </g> + <!--link declined to declined_expired--> + <g id="link_declined_declined_expired"> + <path d="M156.82,504.7479 C151.16,513.6679 144.49,524.5779 139,534.6679 C131.42,548.6079 123.78,564.6379 117.87,577.5879 " fill="none" id="declined-to-declined_expired" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="115.9,581.9179,123.2734,575.3886,117.9744,577.3685,115.9944,572.0695,115.9,581.9179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="133" x="140" y="549.5649">after probation period</text> + </g> + <!--reverse link assigned to declined_expired--> + <g id="link_assigned_declined_expired"> + <path d="M251.01,269.6579 C235.72,277.3479 219.28,287.0879 206,298.5379 C158.17,339.7579 153.15,359.1379 127,416.6079 C101.37,472.9479 102.85,548.5379 105.26,583.2879 " fill="none" id="assigned-backto-declined_expired" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="255.22,267.5879,245.3791,267.9849,250.7365,269.8011,248.9203,275.1585,255.22,267.5879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="33" x="128" y="431.5049">reuse</text> + </g> + <!--link assigned_expired to reclaimed--> + <g id="link_assigned_expired_reclaimed"> + <path d="M417.58,386.9979 C404.31,443.8679 364.78,613.2479 349.82,677.3379 " fill="none" id="assigned_expired-to-reclaimed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="348.71,682.0779,354.638,674.2129,349.8385,677.2069,346.8445,672.4074,348.71,682.0779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="43" x="384" y="549.5649">reclaim</text> + </g> + <!--link declined_expired to free--> + <g id="link_declined_expired_free"> + <path d="M74.77,583.3279 C45.21,563.3179 6,528.7479 6,486.1379 C6,157.9679 6,157.9679 6,157.9679 C6,46.0679 142.63,126.1379 248,88.4679 C252.01,87.0379 256.18,85.4079 260.28,83.7379 " fill="none" id="declined_expired-to-free" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="264.81,81.8479,254.9636,81.628,260.1967,83.7761,258.0486,89.0092,264.81,81.8479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="46" x="7" y="313.4349">remove</text> + </g> + <!--reverse link assigned to reclaimed--> + <g id="link_assigned_reclaimed"> + <path d="M298.47,275.3379 C299.06,309.3879 300,371.8079 300,425.1079 C300,425.1079 300,425.1079 300,604.2079 C300,633.8779 316.97,664.5179 329.84,683.4879 " fill="none" id="assigned-backto-reclaimed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="298.38,270.4279,294.5349,279.4952,298.4657,275.4272,302.5337,279.358,298.38,270.4279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="33" x="301" y="490.5349">reuse</text> + </g> + <!--reverse link free to reclaimed--> + <g id="link_free_reclaimed"> + <path d="M321.67,73.3179 C392.62,81.9779 562,107.9079 562,157.9679 C562,157.9679 562,157.9679 562,604.2079 C562,669.1579 480.53,691.3479 417.2,698.7779 " fill="none" id="free-backto-reclaimed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="317.03,72.7579,325.4985,77.7863,321.9955,73.3446,326.4372,69.8416,317.03,72.7579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="46" x="563" y="372.4649">remove</text> + </g> + <!--link declined_expired to reclaimed--> + <!--SRC=[TP6nJiGm343tV8Lr4mmzmOOOa93W5ZPMX52Ek7UMsgGaxW5_ZzCskPRqDZjvVhOJ9cuG6jG18R1c373rWXfkjtVRcskbz04jmsRd4JUW0zGIAEiurjGCzo0na0K-9elHhFSIvDh74EXWqGprUagAMy2VZlm_wcCwpFGJVZQKN6PAYjk5Ar65wtdCgrS1DBKJxbEcLDmLggfwoFF8lcFOYa54wNY6f3OHhHazd7H31XggaKMxMYEiHulVyDMZ_vqXiNUQNw0fBB2-4swODeh6RnWPbQldgcB6phkzPd8MElJap7crZ8vD5XFtyic5yWAt8emJvTSUm25UKLRpzLft4jsvy4B39L0AoYvlHp86xVjyBFK7]--> + </g> +</svg> diff --git a/doc/sphinx/uml/lease-states.uml b/doc/sphinx/uml/lease-states.uml new file mode 100644 index 0000000..66de2bb --- /dev/null +++ b/doc/sphinx/uml/lease-states.uml @@ -0,0 +1,38 @@ +@startuml + +title lease states (Kea 1.8.0) + +agent "Free" as free +note left : not in the lease database + +agent "Assigned" as assigned + +agent "Assigned expired" as assigned_expired + +agent "Declined" as declined + +agent "Declined expired" as declined_expired + +agent "Expired-Reclaimed" as reclaimed + +free ---> assigned : assignment + +assigned -> assigned_expired : after valid lifetime +assigned -> assigned : renew query +assigned ---> declined : decline query +assigned -up-> free : release query + +declined --> declined_expired : after probation period + +assigned_expired -up-> assigned : reuse +declined_expired -up-> assigned : reuse + +assigned_expired ---> reclaimed : reclaim +declined_expired ---> free : remove + +reclaimed -up-> assigned : reuse +reclaimed -up--> free : remove + +declined_expired -[hidden]-> reclaimed + +@enduml diff --git a/doc/sphinx/uml/main-loop.png b/doc/sphinx/uml/main-loop.png Binary files differnew file mode 100644 index 0000000..8734007 --- /dev/null +++ b/doc/sphinx/uml/main-loop.png diff --git a/doc/sphinx/uml/main-loop.svg b/doc/sphinx/uml/main-loop.svg new file mode 100644 index 0000000..f2d095e --- /dev/null +++ b/doc/sphinx/uml/main-loop.svg @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="883px" preserveAspectRatio="none" style="width:498px;height:883px;background:#FFFFFF;" version="1.1" viewBox="0 0 498 883" width="498px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="235" x="124.5" y="24.9659">DHCP server main loop (Kea 1.8.0)</text> + <!--cluster Main Loop--> + <g id="cluster_Main Loop"> + <rect fill="none" height="809.48" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="485" x="7" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="73" x="213" y="64.0339">Main Loop</text> + </g> + <!--cluster run_one--> + <g id="cluster_run_one"> + <rect fill="none" height="451.13" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="395" x="65" y="154.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="78" x="223.5" y="171.2439">Event Loop</text> + </g> + <!--entity run--> + <g id="elem_run"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="147" x="113.5" y="85.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="127" x="123.5" y="110.0339">Wait for next event</text> + </g> + <!--entity poll--> + <g id="elem_poll"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="93" x="108.5" y="641.4079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="73" x="118.5" y="666.3739">I/O Service</text> + </g> + <!--entity ready--> + <g id="elem_ready"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="171" x="236.5" y="641.4079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="151" x="246.5" y="666.3739">Execute ready handler</text> + </g> + <!--entity shutdown--> + <g id="elem_shutdown"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="132" x="56" y="801.4779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="112" x="66" y="826.4439">Check Shutdown</text> + </g> + <!--entity signal--> + <g id="elem_signal"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="62" x="246" y="245.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="42" x="256" y="270.1039">Signal</text> + </g> + <!--entity handleSignal--> + <g id="elem_handleSignal"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="114" x="97" y="245.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="107" y="270.1039">Handle Signal</text> + </g> + <!--entity external_socket--> + <g id="elem_external_socket"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="97" y="344.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="102" x="107" y="369.1739">External Socket</text> + </g> + <!--entity handleExternalSocket--> + <g id="elem_handleExternalSocket"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="174" x="254" y="344.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="154" x="264" y="369.1739">Handle External Socket</text> + </g> + <!--entity query--> + <g id="elem_query"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="102" x="248" y="443.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="82" x="258" y="468.2439">DHCP Query</text> + </g> + <!--entity processQuery--> + <g id="elem_processQuery"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="97" y="443.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="96" x="107" y="468.2439">Process Query</text> + </g> + <!--entity timeout--> + <g id="elem_timeout"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="75" x="226.5" y="542.3479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="55" x="236.5" y="567.3139">Timeout</text> + </g> + <!--link run to run_one--> + <g id="link_run_run_one"> + <path d="M232,124.3879 C232,129.8504 232,135.9954 232,142.2182 C232,145.3296 232,148.4605 232,151.5352 C232,152.3039 232,153.0691 232,153.8296 C232,153.9246 232,154.0196 232,154.1145 " fill="none" id="run-to-run_one" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="232,154.1145,236,145.1145,232,149.1145,228,145.1145,232,154.1145" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="87" x="144" y="150.0849">get next event</text> + </g> + <!--link run_one to signal--> + <g id="link_run_one_signal"> + <path d="M232.06,185.5479 C233.31,185.5479 253.25,185.5479 253.25,185.5479 C253.25,185.5479 253.25,238.1979 253.25,238.1979 " fill="none" id="run_one-to-signal" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="253.25,243.1979,257.25,234.1979,253.25,238.1979,249.25,234.1979,253.25,243.1979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link signal to handleSignal--> + <g id="link_signal_handleSignal"> + <path d="M245.64,258.5479 C245.64,258.5479 217.64,258.5479 217.64,258.5479 " fill="none" id="signal-to-handleSignal" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="212.64,258.5479,221.64,262.5479,217.64,258.5479,221.64,254.5479,212.64,258.5479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="59" x="186.89" y="273.4449">got signal</text> + </g> + <!--link handleSignal to poll--> + <g id="link_handleSignal_poll"> + <path d="M96.86,265.5479 C85.25,265.5479 76.5,265.5479 76.5,265.5479 C76.5,265.5479 76.5,661.5479 76.5,661.5479 C76.5,661.5479 101.92,661.5479 101.92,661.5479 " fill="none" id="handleSignal-to-poll" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="106.92,661.5479,97.92,657.5479,101.92,661.5479,97.92,665.5479,106.92,661.5479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link signal to external_socket--> + <g id="link_signal_external_socket"> + <path d="M245.64,271.5479 C230.26,271.5479 215,271.5479 215,271.5479 C215,271.5479 215,337.2279 215,337.2279 " fill="none" id="signal-to-external_socket" style="stroke:#181818;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/> + <polygon fill="#181818" points="215,342.2279,219,333.2279,215,337.2279,211,333.2279,215,342.2279" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link external_socket to handleExternalSocket--> + <g id="link_external_socket_handleExternalSocket"> + <path d="M219.45,354.5479 C219.45,354.5479 247.17,354.5479 247.17,354.5479 " fill="none" id="external_socket-to-handleExternalSocket" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="252.17,354.5479,243.17,350.5479,247.17,354.5479,243.17,358.5479,252.17,354.5479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="128" x="234.31" y="350.4449">external socket ready</text> + </g> + <!--link handleExternalSocket to poll--> + <g id="link_handleExternalSocket_poll"> + <path d="M253.51,373.5479 C235.94,373.5479 222.75,373.5479 222.75,373.5479 C222.75,373.5479 222.75,651.5479 222.75,651.5479 C222.75,651.5479 208.2,651.5479 208.2,651.5479 " fill="none" id="handleExternalSocket-to-poll" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="203.2,651.5479,212.2,655.5479,208.2,651.5479,212.2,647.5479,203.2,651.5479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link external_socket to query--> + <g id="link_external_socket_query"> + <path d="M219.4,364.5479 C222.66,364.5479 224.62,364.5479 224.62,364.5479 C224.62,364.5479 224.62,456.5479 224.62,456.5479 C224.62,456.5479 241.24,456.5479 241.24,456.5479 " fill="none" id="external_socket-to-query" style="stroke:#181818;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/> + <polygon fill="#181818" points="246.24,456.5479,237.24,452.5479,241.24,456.5479,237.24,460.5479,246.24,456.5479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link query to processQuery--> + <g id="link_query_processQuery"> + <path d="M247.83,469.5479 C247.83,469.5479 219.89,469.5479 219.89,469.5479 " fill="none" id="query-to-processQuery" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="214.89,469.5479,223.89,473.5479,219.89,469.5479,223.89,465.5479,214.89,469.5479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="114" x="176.86" y="484.4449">DHCP socket ready</text> + </g> + <!--link processQuery to poll--> + <g id="link_processQuery_poll"> + <path d="M155,482.5279 C155,482.5279 155,634.4979 155,634.4979 " fill="none" id="processQuery-to-poll" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="155,639.4979,159,630.4979,155,634.4979,151,630.4979,155,639.4979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link query to timeout--> + <g id="link_query_timeout"> + <path d="M274.75,482.3779 C274.75,482.3779 274.75,535.4979 274.75,535.4979 " fill="none" id="query-to-timeout" style="stroke:#181818;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/> + <polygon fill="#181818" points="274.75,540.4979,278.75,531.4979,274.75,535.4979,270.75,531.4979,274.75,540.4979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link timeout to poll--> + <g id="link_timeout_poll"> + <path d="M229.83,581.5679 C229.83,610.6179 229.83,661.5479 229.83,661.5479 C229.83,661.5479 208.48,661.5479 208.48,661.5479 " fill="none" id="timeout-to-poll" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="203.48,661.5479,212.48,665.5479,208.48,661.5479,212.48,657.5479,203.48,661.5479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="96" x="132.83" y="628.1349">timeout expired</text> + </g> + <!--link poll to ready--> + <g id="link_poll_ready"> + <path d="M201.96,671.5479 C201.96,671.5479 229.64,671.5479 229.64,671.5479 " fill="none" id="poll-to-ready" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="234.64,671.5479,225.64,667.5479,229.64,671.5479,225.64,675.5479,234.64,671.5479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="174.3" y="686.4449">handler ready</text> + </g> + <!--link poll to shutdown--> + <g id="link_poll_shutdown"> + <path d="M148.25,680.8979 C148.25,680.8979 148.25,794.5479 148.25,794.5479 " fill="none" id="poll-to-shutdown" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="148.25,799.5479,152.25,790.5479,148.25,794.5479,144.25,790.5479,148.25,799.5479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="102" x="45.25" y="733.6249">no ready handler</text> + </g> + <!--link ready to ready--> + <g id="link_ready_ready"> + <path d="M269,641.1379 C269,627.3979 269,611.5479 269,611.5479 C269,611.5479 233.17,611.5479 233.17,611.5479 C233.17,611.5479 233.17,741.5479 233.17,741.5479 C233.17,741.5479 322,741.5479 322,741.5479 C322,741.5479 322,687.3879 322,687.3879 " fill="none" id="ready-to-ready" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="322,682.3879,318,691.3879,322,687.3879,326,691.3879,322,682.3879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="133" x="239.17" y="735.2349">execute ready handler</text> + </g> + <!--reverse link run to shutdown--> + <g id="link_run_shutdown"> + <path d="M220.87,131.0479 C220.87,131.0479 220.87,821.5479 220.87,821.5479 C220.87,821.5479 206.39,821.5479 188.5,821.5479 " fill="none" id="run-backto-shutdown" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="220.88,126.0479,216.88,135.0479,220.88,131.0479,224.88,135.0479,220.88,126.0479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <text fill="#888888" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="139" x="172.5" y="872.2379">dashed arrow means priority</text> + <!--SRC=[VLF1ZjCm4BtFLunwWaDtuORsm6LPQLU0M5Ga3WYjh6GsiPfwWkFijaByEsEF7TnIk3JncpVlJVocmOQ1yDtjzJrEv9_8uyvOXmFpY2_Uay7N5sykNhq4cBRMZSQR7GxMKJYCXEn3pm2Ucc1S9pAhZx7tW_Iky2UWwSW5N7qrDk0ZUtIq3qXF0gxGJEXd1u1LzqqivNQjFx2Zg8I1EmgzJ1SFHNXZEsU6n9tIArJ5M-DQ4QquVK8K4E8l-9VkpJwG5n9kkDcI3aiPUvWITiRfN9TQbeeM_ckTWlWyap-a_X_nhVQwzzpGD5MKKP445Ed2_c9tnBEE4lGT4kF8EvFlBZ_XHbR0DgJ2FAGBNIw5cZcGv6NQG_umhpb5H7KpzxgdPekRVWujFpiDA1z0Q18ihjTlbu2lKAQfjWDA8P9oilh0jRTT7mIkmum270hpg18LqeUK_c-jcNfglmj-6kd9-TJhE4NnB7pCVBs7i-HbZByygdaqxFJxnxkELpprZrhx7H4MdwnIgPVyytEXYcY1Q3zQJoqaEEQJehugOHV3L4tHv4o5ulXuCK1FbGYTsnzO9DQpBWJ08xFS4UhaQBpdPzoHSN7LBNiR3l0R]--> + </g> +</svg> diff --git a/doc/sphinx/uml/main-loop.uml b/doc/sphinx/uml/main-loop.uml new file mode 100644 index 0000000..9e29c9f --- /dev/null +++ b/doc/sphinx/uml/main-loop.uml @@ -0,0 +1,60 @@ +@startuml + +title DHCP server main loop (Kea 1.8.0) + +skinparam linetype ortho + +rectangle "Main Loop" { + agent "Wait for next event" as run + + rectangle "Event Loop" as run_one { + together { + agent "Signal" as signal + + agent "Handle Signal" as handleSignal + } + + together { + agent "External Socket" as external_socket + + agent "Handle External Socket" as handleExternalSocket + } + + together { + agent "DHCP Query" as query + + agent "Process Query" as processQuery + } + + agent "Timeout" as timeout + } + + together { + agent "I/O Service" as poll + + agent "Execute ready handler" as ready + } + + agent "Check Shutdown" as shutdown +} + +run --> run_one : get next event +run_one --> signal +signal -right-> handleSignal : got signal +handleSignal --> poll +signal -[dashed]-> external_socket +external_socket -right-> handleExternalSocket : external socket ready +handleExternalSocket --> poll +external_socket -[dashed]-> query +query -right-> processQuery : DHCP socket ready +processQuery --> poll +query -[dashed]-> timeout +timeout --> poll : timeout expired +poll -> ready : handler ready +poll ---> shutdown : no ready handler +ready -> ready : execute ready handler +shutdown -u-> run + +footer dashed arrow means priority + +@enduml
\ No newline at end of file diff --git a/doc/sphinx/uml/option-data-priority.atxt b/doc/sphinx/uml/option-data-priority.atxt new file mode 100644 index 0000000..cd02dbc --- /dev/null +++ b/doc/sphinx/uml/option-data-priority.atxt @@ -0,0 +1,53 @@ + Option Precedence + + | _ _ _ + | / \ / \ / \ +Globals | | | | | | | + | \_/ \_/ \_/ + | | + | _ _ | + | / \ / \ | +Class-N | | | | | | + | \_/ \_/ | +[More classes | | | +in reverse | | | +order of | | | +definition] | _ | | + | / \ | | +Class-1 | | | | | + | \_/ | | + | | | | + | _ _ | _ | | + | / \ / \ | / \ | | +Network | | | | | | | | | | + | \_/ \_/ | \_/ | | + | | | | | + | _ | _ | | | _ + | / \ | / \ | | | / \ +Subnet | | | | | | | | | | | + | \_/ | \_/ | | | \_/ + | | | | | | | | + | | _ | | _ | | | | + | | / \ | | / \ | | | | +Pool | | | | | | | | | | | | + | | \_/ | | \_/ | | | | + | | | | | | | | | + | | _ | | | | | | | _ + | | / \ | | | | | | /|\ / \ +Global Host | | | | | | | | | | | | | | | + | | \_/ | | | | | | \|/ \_/ + | | | | | | | | | + | | _ | | | | | | | + | | / \ | | | | | | | +Subnet Host | | | | | | | | | | | + | | \_/ | | | | | | | + | | | | | | | | | | +----------------+----+------+------+------+------+------+------+------+------+------+ + | | | | | | | | | | + | V V V V V V V V V + | _ _ _ _ _ _ _ _ _ + | / \ / \ / \ / \ / \ / \ / \ / \ / \ +DHCP Response | | | | | | | | | | | | | | | | | | | + | \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + +* This diagram was manually created and does not have a UML source. diff --git a/doc/sphinx/uml/packet4.png b/doc/sphinx/uml/packet4.png Binary files differnew file mode 100644 index 0000000..6fef4e2 --- /dev/null +++ b/doc/sphinx/uml/packet4.png diff --git a/doc/sphinx/uml/packet4.svg b/doc/sphinx/uml/packet4.svg new file mode 100644 index 0000000..0badab5 --- /dev/null +++ b/doc/sphinx/uml/packet4.svg @@ -0,0 +1,355 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1930px" preserveAspectRatio="none" style="width:1791px;height:1930px;background:#FFFFFF;" version="1.1" viewBox="0 0 1791 1930" width="1791px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="260" x="758.5" y="24.9659">DHCPv4 packet processing (Kea 1.8.0)</text> + <!--cluster process--> + <g id="cluster_process"> + <rect fill="none" height="109.06" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="842" x="680" y="975.6179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="243" x="979.5" y="992.5839">Process Query on its Message Type</text> + </g> + <!--entity processDiscover--> + <g id="elem_processDiscover"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="132" x="1050" y="1021.6179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="112" x="1060" y="1046.5839">Process Discover</text> + </g> + <!--entity processRequest--> + <g id="elem_processRequest"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="130" x="723" y="1021.6179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="110" x="733" y="1046.5839">Process Request</text> + </g> + <!--entity processRelease--> + <g id="elem_processRelease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="127" x="888.5" y="1021.6179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="107" x="898.5" y="1046.5839">Process Release</text> + </g> + <!--entity processDecline--> + <g id="elem_processDecline"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="1216.5" y="1021.6179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="105" x="1226.5" y="1046.5839">Process Decline</text> + </g> + <!--entity processInform--> + <g id="elem_processInform"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="121" x="1376.5" y="1021.6179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="101" x="1386.5" y="1046.5839">Process Inform</text> + </g> + <!--entity receivePacket--> + <g id="elem_receivePacket"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="114" x="1505" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="1515" y="72.0339">Receive query</text> + </g> + <g id="elem_GMN3"> + <path d="M1417.5,52.7479 L1417.5,80.4539 A0,0 0 0 0 1417.5,80.4539 L1470.5,80.4539 A0,0 0 0 0 1470.5,80.4539 L1470.5,70.7479 L1504.6,66.6079 L1470.5,62.7479 L1470.5,62.7479 L1460.5,52.7479 L1417.5,52.7479 A0,0 0 0 0 1417.5,52.7479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1460.5,52.7479 L1460.5,62.7479 L1470.5,62.7479 L1460.5,52.7479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="32" x="1423.5" y="71.6449">input</text> + </g> + <!--entity isServiceEnabled--> + <g id="elem_isServiceEnabled"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="127" x="1498.5" y="147.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="107" x="1508.5" y="172.1039">Service Enabled</text> + </g> + <!--entity buffer4_receive--> + <g id="elem_buffer4_receive"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="175" x="974.5" y="265.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="155" x="984.5" y="290.1739">Callout buffer4_receive</text> + </g> + <g id="elem_GMN8"> + <path d="M1185,270.8879 L1185,280.7379 L1149.89,284.7379 L1185,288.7379 L1185,298.5939 A0,0 0 0 0 1185,298.5939 L1237,298.5939 A0,0 0 0 0 1237,298.5939 L1237,280.8879 L1227,270.8879 L1185,270.8879 A0,0 0 0 0 1185,270.8879 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1227,270.8879 L1227,280.8879 L1237,280.8879 L1227,270.8879 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="31" x="1191" y="289.7849">hook</text> + </g> + <!--entity unpack--> + <g id="elem_unpack"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="113" x="630.5" y="383.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="93" x="640.5" y="408.2439">Unpack query</text> + </g> + <!--entity classify--> + <g id="elem_classify"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="114" x="630" y="483.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="640" y="508.3039">Classify query</text> + </g> + <!--entity pkt4_receive--> + <g id="elem_pkt4_receive"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="154" x="459" y="583.4079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="134" x="469" y="608.3739">Callout pkt4_receive</text> + </g> + <g id="elem_GMN14"> + <path d="M648,589.0879 L648,598.9479 L613.36,602.9479 L648,606.9479 L648,616.7939 A0,0 0 0 0 648,616.7939 L700,616.7939 A0,0 0 0 0 700,616.7939 L700,599.0879 L690,589.0879 L648,589.0879 A0,0 0 0 0 648,589.0879 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M690,589.0879 L690,599.0879 L700,599.0879 L690,589.0879 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="31" x="654" y="607.9849">hook</text> + </g> + <!--entity drop_class--> + <g id="elem_drop_class"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="139" x="245.5" y="701.4779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="119" x="255.5" y="726.4439">Check DROP class</text> + </g> + <!--entity same_client--> + <g id="elem_same_client"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="336" x="147" y="801.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="316" x="157" y="826.5139">Avoid same client race in multi-threaded mode</text> + </g> + <g id="elem_GMN19"> + <path d="M588.5,807.2279 L588.5,817.0779 L483.47,821.0779 L588.5,825.0779 L588.5,834.9339 A0,0 0 0 0 588.5,834.9339 L783.5,834.9339 A0,0 0 0 0 783.5,834.9339 L783.5,817.2279 L773.5,807.2279 L588.5,807.2279 A0,0 0 0 0 588.5,807.2279 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M773.5,807.2279 L773.5,817.2279 L783.5,817.2279 L773.5,807.2279 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="174" x="594.5" y="826.1249">postpone processing or drop</text> + </g> + <!--entity leases4_committed--> + <g id="elem_leases4_committed"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="199" x="991.5" y="1157.6779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="179" x="1001.5" y="1182.6439">Callout leases4_committed</text> + </g> + <g id="elem_GMN29"> + <path d="M1225,1163.3679 L1225,1173.2179 L1191,1177.2179 L1225,1181.2179 L1225,1191.0739 A0,0 0 0 0 1225,1191.0739 L1277,1191.0739 A0,0 0 0 0 1277,1191.0739 L1277,1173.3679 L1267,1163.3679 L1225,1163.3679 A0,0 0 0 0 1225,1163.3679 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1267,1163.3679 L1267,1173.3679 L1277,1173.3679 L1267,1163.3679 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="31" x="1231" y="1182.2649">hook</text> + </g> + <!--entity park--> + <g id="elem_park"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="49" x="1130.5" y="1275.7479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="29" x="1140.5" y="1300.7139">Park</text> + </g> + <!--entity pkt4_send--> + <g id="elem_pkt4_send"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="139" x="991.5" y="1393.8179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="119" x="1001.5" y="1418.7839">Callout pkt4_send</text> + </g> + <!--entity send--> + <g id="elem_send"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="120" x="1000" y="1730.0179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="100" x="1010" y="1754.9839">Send response</text> + </g> + <!--entity pack--> + <g id="elem_pack"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="1003" y="1511.8879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="96" x="1013" y="1536.8539">Pack response</text> + </g> + <!--entity buffer4_send--> + <g id="elem_buffer4_send"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="160" x="953" y="1611.9579"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="140" x="963" y="1636.9239">Callout buffer4_send</text> + </g> + <g id="elem_GMN37"> + <path d="M855.5,1617.6379 L855.5,1645.3439 A0,0 0 0 0 855.5,1645.3439 L918.5,1645.3439 A0,0 0 0 0 918.5,1645.3439 L918.5,1635.6379 L952.8,1631.4879 L918.5,1627.6379 L918.5,1627.6379 L908.5,1617.6379 L855.5,1617.6379 A0,0 0 0 0 855.5,1617.6379 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M908.5,1617.6379 L908.5,1627.6379 L918.5,1627.6379 L908.5,1617.6379 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="42" x="861.5" y="1636.5349">output</text> + </g> + <!--entity drop--> + <g id="elem_drop"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="101" x="920.5" y="1830.0879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="81" x="930.5" y="1855.0539">Drop packet</text> + </g> + <g id="elem_GMN41"> + <path d="M834.5,1835.7679 L834.5,1863.4739 A0,0 0 0 0 834.5,1863.4739 L885.5,1863.4739 A0,0 0 0 0 885.5,1863.4739 L885.5,1853.7679 L920.28,1849.6279 L885.5,1845.7679 L885.5,1845.7679 L875.5,1835.7679 L834.5,1835.7679 A0,0 0 0 0 834.5,1835.7679 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M875.5,1835.7679 L875.5,1845.7679 L885.5,1845.7679 L875.5,1835.7679 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="30" x="840.5" y="1854.6649">error</text> + </g> + <!--link receivePacket to isServiceEnabled--> + <g id="link_receivePacket_isServiceEnabled"> + <path d="M1562,86.5179 C1562,101.8479 1562,123.5879 1562,140.4079 " fill="none" id="receivePacket-to-isServiceEnabled" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1562,145.3079,1566,136.3079,1562,140.3079,1558,136.3079,1562,145.3079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link isServiceEnabled to buffer4_receive--> + <g id="link_isServiceEnabled_buffer4_receive"> + <path d="M1498.17,182.4879 C1409.72,203.0279 1249.54,240.2079 1149.86,263.3479 " fill="none" id="isServiceEnabled-to-buffer4_receive" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1145.15,264.4379,1154.8218,266.2972,1150.0203,263.3063,1153.0112,258.5048,1145.15,264.4379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="104" x="1342" y="231.1049">service is enabled</text> + </g> + <!--link isServiceEnabled to drop--> + <g id="link_isServiceEnabled_drop"> + <path d="M1600.28,186.6079 C1633.4,206.0079 1676,239.5379 1676,283.7379 C1676,283.7379 1676,283.7379 1676,1750.5579 C1676,1815.7879 1196.34,1840.1279 1028.31,1846.6579 " fill="none" id="isServiceEnabled-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.5,1846.8379,1032.6423,1850.5011,1028.4966,1846.6523,1032.3453,1842.5066,1023.5,1846.8379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="106" x="1677" y="947.5149">service is disabled</text> + </g> + <!--link buffer4_receive to unpack--> + <g id="link_buffer4_receive_unpack"> + <path d="M1000.92,304.6479 C931.81,326.0379 819.84,360.6979 749.97,382.3179 " fill="none" id="buffer4_receive-to-unpack" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="745.2,383.7979,754.9823,384.9414,749.9739,382.3114,752.6039,377.3031,745.2,383.7979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="897" y="349.1749">CONTINUE</text> + </g> + <!--link buffer4_receive to classify--> + <g id="link_buffer4_receive_classify"> + <path d="M1039.06,304.5979 C1021.3,318.7879 995.8,338.2779 972,353.2779 C891.44,404.0279 791.65,453.1479 734.06,480.2579 " fill="none" id="buffer4_receive-to-classify" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="729.65,482.3279,739.4967,482.1195,734.1751,480.201,736.0936,474.8794,729.65,482.3279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="27" x="922" y="408.2049">SKIP</text> + </g> + <!--link buffer4_receive to drop--> + <g id="link_buffer4_receive_drop"> + <path d="M1149.71,302.9379 C1298.88,332.4779 1586,390.7779 1586,401.8079 C1586,401.8079 1586,401.8079 1586,1750.5579 C1586,1806.7379 1180.52,1836.3379 1028.04,1845.4879 " fill="none" id="buffer4_receive-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.36,1845.7679,1032.5834,1849.2217,1028.351,1845.4685,1032.1043,1841.2361,1023.36,1845.7679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35" x="1587" y="1046.5449">DROP</text> + </g> + <!--link unpack to classify--> + <g id="link_unpack_classify"> + <path d="M687,422.7179 C687,438.0479 687,459.7979 687,476.6179 " fill="none" id="unpack-to-classify" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="687,481.5079,691,472.5079,687,476.5079,683,472.5079,687,481.5079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link unpack to drop--> + <g id="link_unpack_drop"> + <path d="M630.11,406.0479 C466.44,413.2279 6,439.0179 6,501.8779 C6,501.8779 6,501.8779 6,1750.5579 C6,1796.6079 52.59,1787.9079 97,1800.0879 C269.84,1847.5279 725.82,1803.0179 903,1830.0879 C906.56,1830.6379 910.21,1831.2979 913.87,1832.0479 " fill="none" id="unpack-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="918.55,1833.0679,910.6157,1827.2329,913.6661,1831.9969,908.9021,1835.0472,918.55,1833.0679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="7" y="1123.5749">on error</text> + </g> + <!--link classify to pkt4_receive--> + <g id="link_classify_pkt4_receive"> + <path d="M657.89,522.7879 C632.9,539.0179 596.84,562.4279 570.43,579.5879 " fill="none" id="classify-to-pkt4_receive" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="566.55,582.0979,576.2763,580.5491,570.7429,579.374,571.918,573.8405,566.55,582.0979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link pkt4_receive to drop_class--> + <g id="link_pkt4_receive_drop_class"> + <path d="M498.89,622.9779 C481.58,631.8879 460.71,642.6779 442,652.4779 C413.11,667.6179 380.64,684.8879 355.76,698.1779 " fill="none" id="pkt4_receive-to-drop_class" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="351.58,700.4079,361.4032,699.6971,355.9906,698.0528,357.6349,692.6402,351.58,700.4079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="443" y="667.3749">CONTINUE</text> + </g> + <!--link pkt4_receive to drop--> + <g id="link_pkt4_receive_drop"> + <path d="M536,622.8379 C536,645.8179 536,685.7579 536,720.0079 C536,720.0079 536,720.0079 536,1750.5579 C536,1860.5579 649.96,1782.9379 903,1830.0879 C906.62,1830.7679 910.33,1831.5379 914.06,1832.3779 " fill="none" id="pkt4_receive-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="918.87,1833.4979,911.005,1827.5699,913.999,1832.3694,909.1994,1835.3635,918.87,1833.4979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35" x="537" y="1241.6449">DROP</text> + </g> + <!--link drop_class to same_client--> + <g id="link_drop_class_same_client"> + <path d="M315,740.9179 C315,756.2479 315,777.9979 315,794.8179 " fill="none" id="drop_class-to-same_client" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="315,799.7179,319,790.7179,315,794.7179,311,790.7179,315,799.7179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link drop_class to drop--> + <g id="link_drop_class_drop"> + <path d="M245.07,724.7079 C180.33,731.3979 94,752.9179 94,820.0779 C94,820.0779 94,820.0779 94,1750.5579 C94,1903.2579 282.12,1784.1979 434,1800.0879 C641.74,1821.8279 696.97,1795.7879 903,1830.0879 C906.56,1830.6779 910.2,1831.3879 913.85,1832.1579 " fill="none" id="drop_class-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="918.53,1833.2079,910.612,1827.3508,913.6491,1832.1233,908.8766,1835.1603,918.53,1833.2079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="95" y="1300.6849">query in DROP class</text> + </g> + <!--link same_client to process--> + <g id="link_same_client_process"> + <path d="M347.45,841.0479 C392.47,867.3679 476.635,916.5729 550.025,959.4792 C586.72,980.9323 620.7213,1000.8107 645.7888,1015.4665 C658.3225,1022.7944 668.6228,1028.8166 675.9097,1033.0772 C676.8205,1033.6098 677.6843,1034.1148 678.4995,1034.5914 C678.9071,1034.8298 679.3025,1035.061 679.6856,1035.285 " fill="none" id="same_client-to-process" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="679.6856,1035.285,673.9353,1027.2891,675.3693,1032.7612,669.8972,1034.1952,679.6856,1035.285" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link same_client to drop--> + <g id="link_same_client_drop"> + <path d="M295.48,841.0979 C282.19,856.1279 267,878.3879 267,901.6179 C267,901.6179 267,901.6179 267,1237.2479 C267,1293.6179 257.26,1307.4779 259,1363.8179 C259.67,1385.4179 262,1390.7379 262,1412.3479 C262,1412.3479 262,1412.3479 262,1750.5579 C262,1862.9579 398.65,1784.7779 510,1800.0879 C683.54,1823.9579 730.38,1800.2579 903,1830.0879 C906.63,1830.7179 910.35,1831.4579 914.08,1832.2679 " fill="none" id="same_client-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="918.89,1833.3579,910.9884,1827.4788,914.0121,1832.2597,909.2312,1835.2834,918.89,1833.3579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="249" x="260" y="1359.7149">queries from the same client possible race</text> + </g> + <!--link process to drop--> + <g id="link_process_drop"> + <path d="M679.8577,1049.157 C679.7594,1049.2455 679.6604,1049.3349 679.5607,1049.4249 C677.9649,1050.8664 676.1853,1052.5069 674.2595,1054.3326 C666.5566,1061.6354 656.5156,1071.9017 646.5513,1084.2479 C626.6225,1108.9404 607,1141.9529 607,1176.2179 C607,1176.2179 607,1176.2179 607,1355.3179 C607,1455.5979 607,1480.6679 607,1580.9579 C607,1580.9579 607,1580.9579 607,1750.5579 C607,1886.7779 771.51,1794.5079 903,1830.0879 C906.56,1831.0479 910.22,1832.0479 913.91,1833.0479 " fill="none" id="process-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="918.67,1834.3379,911.0365,1828.1146,913.8455,1833.0247,908.9354,1835.8338,918.67,1834.3379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="143" x="608" y="1477.7849">unknown message type</text> + </g> + <!--link processDiscover to leases4_committed--> + <g id="link_processDiscover_leases4_committed"> + <path d="M1112.47,1061.0679 C1108.08,1084.6279 1100.56,1124.9379 1095.69,1151.0679 " fill="none" id="processDiscover-to-leases4_committed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1094.79,1155.8979,1100.3645,1147.7785,1095.702,1150.9818,1092.4987,1146.3193,1094.79,1155.8979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link processDiscover to drop--> + <g id="link_processDiscover_drop"> + <path d="M1141.38,1060.9579 C1157.61,1072.7479 1179.24,1088.0579 1199,1100.6779 C1255.63,1136.8679 1330,1109.0079 1330,1176.2179 C1330,1176.2179 1330,1176.2179 1330,1414.3479 C1330,1435.9679 1327.67,1441.2879 1327,1462.8879 C1326.74,1471.3279 1326.04,1473.4979 1327,1481.8879 C1332.14,1526.7979 1350,1535.7579 1350,1580.9579 C1350,1580.9579 1350,1580.9579 1350,1750.5579 C1350,1816.2779 1133.7,1838.6679 1027.91,1845.6879 " fill="none" id="processDiscover-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.23,1845.9879,1032.4632,1849.4154,1028.2202,1845.6743,1031.9613,1841.4312,1023.23,1845.9879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="1328" y="1477.7849">on error</text> + </g> + <!--link processRequest to leases4_committed--> + <g id="link_processRequest_leases4_committed"> + <path d="M810.84,1060.9379 C826.91,1073.4679 849.33,1089.6079 871,1100.6779 C916.25,1123.8079 970.17,1142.4479 1013.3,1155.4279 " fill="none" id="processRequest-to-leases4_committed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1017.86,1156.7879,1010.3749,1150.3868,1013.0677,1155.3616,1008.0929,1158.0544,1017.86,1156.7879" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link processRequest to drop--> + <g id="link_processRequest_drop"> + <path d="M785.96,1060.7779 C783.3,1086.6379 779,1134.9279 779,1176.2179 C779,1176.2179 779,1176.2179 779,1414.3479 C779,1576.7879 769.86,1638.8979 867,1769.0879 C884.42,1792.4379 910.46,1812.3379 932.12,1826.3879 " fill="none" id="processRequest-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="936.25,1829.0279,930.8099,1820.8178,932.0335,1826.3408,926.5105,1827.5643,936.25,1829.0279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="779" y="1477.7849">on error</text> + </g> + <!--link processRelease to leases4_committed--> + <g id="link_processRelease_leases4_committed"> + <path d="M971.62,1061.0679 C996.66,1085.2279 1039.97,1126.9979 1066.96,1153.0379 " fill="none" id="processRelease-to-leases4_committed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1070.39,1156.3379,1066.6879,1147.2113,1066.7908,1152.8672,1061.1349,1152.9701,1070.39,1156.3379" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link processRelease to drop--> + <g id="link_processRelease_drop"> + <path d="M931.31,1060.8179 C907.02,1084.8979 870,1129.2879 870,1176.2179 C870,1176.2179 870,1176.2179 870,1414.3479 C870,1520.4979 807.02,1549.4979 838,1651.0179 C859.66,1721.9979 916.3,1790.5579 948.24,1825.2179 " fill="none" id="processRelease-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="951.36,1828.5679,948.1796,1819.2467,947.9627,1824.8994,942.31,1824.6824,951.36,1828.5679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="866" y="1477.7849">on error</text> + </g> + <!--link processDecline to leases4_committed--> + <g id="link_processDecline_leases4_committed"> + <path d="M1253.52,1061.0079 C1237.85,1072.5479 1217.34,1087.5679 1199,1100.6779 C1173.78,1118.7279 1145,1138.8279 1123.49,1153.7579 " fill="none" id="processDecline-to-leases4_committed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1119.43,1156.5779,1129.1039,1154.7298,1123.5368,1153.7259,1124.5407,1148.1589,1119.43,1156.5779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link processDecline to drop--> + <g id="link_processDecline_drop"> + <path d="M1302.45,1061.0779 C1342.78,1094.0579 1421,1160.1079 1421,1176.2179 C1421,1176.2179 1421,1176.2179 1421,1750.5579 C1421,1830.0879 1149.24,1845.2379 1028.1,1848.0379 " fill="none" id="processDecline-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.26,1848.1379,1032.3491,1851.9312,1028.2587,1848.0237,1032.1662,1843.9333,1023.26,1848.1379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="1422" y="1477.7849">on error</text> + </g> + <!--link processInform to leases4_committed--> + <g id="link_processInform_leases4_committed"> + <path d="M1416.23,1061.1179 C1401.28,1073.8879 1380.1,1090.2479 1359,1100.6779 C1308.2,1125.8079 1247.72,1143.7579 1197.09,1155.8379 " fill="none" id="processInform-to-leases4_committed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1192.44,1156.9379,1202.1169,1158.7702,1197.3071,1155.7927,1200.2846,1150.9829,1192.44,1156.9379" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link processInform to drop--> + <g id="link_processInform_drop"> + <path d="M1455.93,1061.1579 C1478.14,1085.5879 1512,1130.3479 1512,1176.2179 C1512,1176.2179 1512,1176.2179 1512,1750.5579 C1512,1804.9879 1452.54,1785.8579 1400,1800.0879 C1270.09,1835.2779 1111.35,1844.9779 1028.14,1847.6379 " fill="none" id="processInform-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.31,1847.7879,1032.4312,1851.5032,1028.3075,1847.6309,1032.1799,1843.5072,1023.31,1847.7879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="1513" y="1477.7849">on error</text> + </g> + <!--link leases4_committed to pkt4_send--> + <g id="link_leases4_committed_pkt4_send"> + <path d="M1078.99,1197.0979 C1067.68,1216.1179 1051.51,1246.6979 1045,1275.7479 C1036.36,1314.3079 1045.58,1360.0979 1053.17,1387.6579 " fill="none" id="leases4_committed-to-pkt4_send" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1054.45,1392.1279,1055.8505,1382.3791,1053.0896,1387.3165,1048.1522,1384.5557,1054.45,1392.1279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="1046" y="1300.6849">CONTINUE</text> + </g> + <!--link leases4_committed to drop--> + <g id="link_leases4_committed_drop"> + <path d="M1128.87,1197.2279 C1142.26,1205.1379 1156.76,1215.1979 1168,1226.7479 C1185.64,1244.8979 1188.99,1251.7479 1197,1275.7479 C1250.04,1434.7279 1272.49,1487.9079 1234,1651.0179 C1215.74,1728.4279 1205.78,1763.8179 1135,1800.0879 C1101.17,1817.4279 1060.16,1829.5579 1027.61,1837.3579 " fill="none" id="leases4_committed-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.11,1838.4179,1032.7857,1840.2566,1027.9778,1837.2759,1030.9585,1832.468,1023.11,1838.4179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35" x="1254" y="1536.8149">DROP</text> + </g> + <!--link leases4_committed to park--> + <g id="link_leases4_committed_park"> + <path d="M1101.43,1197.1279 C1112.35,1216.9379 1129.55,1248.1379 1141.51,1269.8179 " fill="none" id="leases4_committed-to-park" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1143.85,1274.0579,1143.0139,1264.2446,1141.4388,1269.6777,1136.0056,1268.1026,1143.85,1274.0579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="32" x="1127" y="1241.6449">PARK</text> + </g> + <!--link park to pkt4_send--> + <g id="link_park_pkt4_send"> + <path d="M1139.69,1315.1879 C1123.51,1335.1679 1097.94,1366.7379 1080.37,1388.4379 " fill="none" id="park-to-pkt4_send" style="stroke:#181818;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/> + <polygon fill="#181818" points="1077.26,1392.2779,1086.0398,1387.8153,1080.413,1388.3973,1079.8309,1382.7705,1077.26,1392.2779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="43" x="1114" y="1359.7149">unpark</text> + </g> + <!--link pkt4_send to pack--> + <g id="link_pkt4_send_pack"> + <path d="M1061,1433.2579 C1061,1452.8179 1061,1483.4779 1061,1505.1179 " fill="none" id="pkt4_send-to-pack" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1061,1510.0079,1065,1501.0079,1061,1505.0079,1057,1501.0079,1061,1510.0079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="1062" y="1477.7849">CONTINUE</text> + </g> + <!--link pkt4_send to buffer4_send--> + <g id="link_pkt4_send_buffer4_send"> + <path d="M1029.86,1433.1479 C1004.93,1450.1879 971.76,1477.8179 957,1511.8879 C941.54,1547.5879 974.65,1584.7179 1001.93,1607.7179 " fill="none" id="pkt4_send-to-buffer4_send" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1005.77,1610.8879,1001.3586,1602.0823,1001.9079,1607.7124,996.2777,1608.2617,1005.77,1610.8879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="27" x="958" y="1536.8149">SKIP</text> + </g> + <!--link pkt4_send to drop--> + <g id="link_pkt4_send_drop"> + <path d="M1106.46,1433.2979 C1118.54,1440.6679 1130.13,1450.4079 1137,1462.8879 C1202.62,1582.1179 1210.65,1654.0179 1138,1769.0879 C1114,1807.1079 1066.3,1827.3279 1028,1837.8479 " fill="none" id="pkt4_send-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1023.4,1839.0679,1033.1219,1840.6444,1028.2352,1837.7947,1031.0848,1832.9081,1023.4,1839.0679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35" x="1190" y="1636.8849">DROP</text> + </g> + <!--link pack to buffer4_send--> + <g id="link_pack_buffer4_send"> + <path d="M1055.6,1551.3279 C1051.19,1566.7979 1044.91,1588.7879 1040.09,1605.6679 " fill="none" id="pack-to-buffer4_send" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1038.8,1610.1779,1045.1186,1602.6231,1040.1736,1605.3703,1037.4264,1600.4253,1038.8,1610.1779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link buffer4_send to send--> + <g id="link_buffer4_send_send"> + <path d="M1037.4,1651.3979 C1041.97,1671.0379 1049.14,1701.8779 1054.18,1723.5379 " fill="none" id="buffer4_send-to-send" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1055.26,1728.1879,1057.1255,1718.5174,1054.1315,1723.3169,1049.332,1720.3229,1055.26,1728.1879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="1049" y="1695.9149">CONTINUE</text> + </g> + <!--link buffer4_send to drop--> + <g id="link_buffer4_send_drop"> + <path d="M1007.81,1651.3279 C986.51,1668.9779 957.52,1697.4479 945,1730.0179 C932.96,1761.3479 945.95,1799.5979 957.5,1824.0279 " fill="none" id="buffer4_send-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="959.57,1828.2679,959.2236,1818.4252,957.3799,1823.7731,952.0319,1821.9294,959.57,1828.2679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35" x="946" y="1754.9549">DROP</text> + </g> + <!--link send to drop--> + <text fill="#888888" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="225" x="776" y="1919.9479">dashed arrow means asynchronous processing</text> + <!--SRC=[XLLDRzim3BthLn0zROSK6z33iCE08YcmebYRfUsfA0BLPc8XZkH9SefWs7yVzH5RifFq5Z- -Hr8I-MA5hH5cFwVptHKqlDYWXKQh0eqHSWsVxf33ryjlbry-CyRNA2rSBB10iKFuqwBUNm0te0Cozt8cbKMeSMNXEmZPjBPJFgBUYGBXHlAt6akl5IQY4Up8KrxNghNmrgvMgA-MiOWN3R1GKejrvMfMIcswBC_I7IhfjVL0NwNcTDBLFc4K4HfrqcnitaOAdEbXMY6rC5iyp4DkhosrQfR-i-DTxvGemV0j4ayuI7EwBI5XszPMJ6obaPTOmbQLeG77NGPkNhzHnZPAOlgMIlkYZ577biirlVl5F8JXjpizA0d26lX52BK4J_icdZEo_ZA8hHvqCs4AjKETqWxOYBn0kcHZKsw4Zb1hv0PpgeV6BI1TWCoe4HfHR-LAwMtA30ZxDtfhNyjSBGkrtGfhux2Eq3ElFkTw4qhHZ-EpP52M_I2vhsHLP4bxPUWHupLaORTgUJYVwi7kT8LIuADQwHvJidIHPpH7qIswOSxugBNIVj9wOu39vCTutOU0PmtscnAQQ1t209vMEgth9HUKmWJ5CAsZ1pyWmVJX_kds_ldcAElW2SHxlBkT7-4afTscivWt5VTOpwML2tVLLN31p5ZI3pX8WtMaRGzeWtOIZGkbnf65UfatH6S-lN6nH1QuSOt6WII9G0ChhRPWAypSZKpA27eORtFiO3Afl9KRgTx9_w8ZMN8aDh0PVvxnOevPHouzTw7pcNhIkKHU_b6Y0-bqekXW7voj8vrE50pkV9wESoJDIDJFfpE9T02FKGTJU28R6IGnvjUBE-P_JrvARYeiNmUbtFwGb_PGKEVhcqTJmpiiRyeODDZjR6QKMHA_FeEZ3mY3f05zgKHPedoDGSPMYWoJ_fFzKO7JTR_Je7Dfo57tigYqageroJyu-my0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/packet4.uml b/doc/sphinx/uml/packet4.uml new file mode 100644 index 0000000..15263c7 --- /dev/null +++ b/doc/sphinx/uml/packet4.uml @@ -0,0 +1,92 @@ +@startuml + +title DHCPv4 packet processing (Kea 1.8.0) + +agent "Receive query" as receivePacket +note left : input + +agent "Service Enabled" as isServiceEnabled + +agent "Callout buffer4_receive" as buffer4_receive +note right : hook + +agent "Unpack query" as unpack + +agent "Classify query" as classify + +agent "Callout pkt4_receive" as pkt4_receive +note right : hook + +agent "Check DROP class" as drop_class + +agent "Avoid same client race in multi-threaded mode" as same_client +note right : postpone processing or drop + +rectangle "Process Query on its Message Type" as process { + agent "Process Discover" as processDiscover + agent "Process Request" as processRequest + agent "Process Release" as processRelease + agent "Process Decline" as processDecline + agent "Process Inform" as processInform +} + +agent "Callout leases4_committed" as leases4_committed +note right : hook + +agent "Park" as park + +agent "Callout pkt4_send" as pkt4_send + +agent "Send response" as send + +agent "Pack response" as pack + +agent "Callout buffer4_send" as buffer4_send + +agent "Send response" as send +note left : output + +agent "Drop packet" as drop +note left : error + +receivePacket --> isServiceEnabled +isServiceEnabled --> buffer4_receive : service is enabled +isServiceEnabled ----> drop : service is disabled +buffer4_receive --> unpack : CONTINUE +buffer4_receive --> classify : SKIP +buffer4_receive ----> drop : DROP +unpack --> classify +unpack ---> drop : on error +classify --> pkt4_receive +pkt4_receive --> drop_class : CONTINUE +pkt4_receive ---> drop : DROP +drop_class --> same_client +drop_class ---> drop : query in DROP class +same_client ---> process +same_client ---> drop : queries from the same client possible race +process ---> drop : unknown message type +processDiscover --> leases4_committed +processDiscover ---> drop : on error +processRequest --> leases4_committed +processRequest ---> drop : on error +processRelease --> leases4_committed +processRelease ---> drop : on error +processDecline --> leases4_committed +processDecline ---> drop : on error +processInform --> leases4_committed +processInform ---> drop : on error +leases4_committed --> pkt4_send : CONTINUE +leases4_committed ---> drop : DROP +leases4_committed --> park : PARK +park -[dashed]-> pkt4_send : unpark +pkt4_send --> pack : CONTINUE +pkt4_send --> buffer4_send : SKIP +pkt4_send ---> drop : DROP +pack --> buffer4_send +buffer4_send --> send : CONTINUE +buffer4_send ---> drop : DROP +send -[hidden]-> drop + +footer dashed arrow means asynchronous processing + +@enduml diff --git a/doc/sphinx/uml/priority-of-lease-lifetimes-and-dhcpv4-fields.atxt b/doc/sphinx/uml/priority-of-lease-lifetimes-and-dhcpv4-fields.atxt new file mode 100644 index 0000000..76f2889 --- /dev/null +++ b/doc/sphinx/uml/priority-of-lease-lifetimes-and-dhcpv4-fields.atxt @@ -0,0 +1,38 @@ + Precedence of Lease Lifetimes and DHCPv4 Fields + + | _ _ _ + | / \ / \ / \ +Globals | | | | | | | + | \_/ \_/ \_/ + | | + | _ _ _ | + | / \ / \ / \ | +Network | | | | | | | | + | \_/ \_/ \_/ | + | | | | + | _ | _ | | + | / \ | / \ | | +Subnet | | | | | | | | + | \_/ | \_/ | | + | | | | | + | _ | _ | | _ | + | / \ | / \ | | / \ | +Class-N | | | | | | | | | | | + | \_/ | \_/ | | \_/ | +[More classes | | | | | | | +in reverse | | | | | | | +order of | | | | | | | +definition] | | | _ | | | | + | | | / \ | | | | +Class-1 | | | | | | | | | + | | | \_/ | | | | + | | | | | | | | +----------------+----+------+------+------+------+------+------+ + | | | | | | | | + | V V V V V V V + | _ _ _ _ _ _ _ + | / \ / \ / \ / \ / \ / \ / \ +DHCP Response | | | | | | | | | | | | | | | + | \_/ \_/ \_/ \_/ \_/ \_/ \_/ + +* This diagram was manually created and does not have a UML source. diff --git a/doc/sphinx/uml/radius.png b/doc/sphinx/uml/radius.png Binary files differnew file mode 100644 index 0000000..315eae4 --- /dev/null +++ b/doc/sphinx/uml/radius.png diff --git a/doc/sphinx/uml/radius.svg b/doc/sphinx/uml/radius.svg new file mode 100644 index 0000000..778d1f8 --- /dev/null +++ b/doc/sphinx/uml/radius.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="2972px" preserveAspectRatio="none" style="width:839px;height:2972px;background:#FFFFFF;" version="1.1" viewBox="0 0 839 2972" width="839px" zoomAndPan="magnify"> + <defs/> + <g> + <!--entity _--> + <g id="elem__"> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="4" x="17" y="31.9659"> </text> + <image height="1437" width="798" x="17" xlink:href="data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjE0MzciIHdpZHRoPSI3OTgiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID48ZGVmcy8+PGc+PHJlY3QgZmlsbD0iI0ZGRkZGRiIgc3R5bGU9IndpZHRoOjc5OHB4O2hlaWdodDoxNDM3cHg7YmFja2dyb3VuZDojRkZGRkZGOyIgd2lkdGg9Ijc5OCIgaGVpZ2h0PSIxNDM3Ii8+IDx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0MDgiIHg9IjE5My41IiB5PSIzNC45NjU5Ij5SQURJVVMgd29ya2Zsb3cgZm9yIGxlYXNlIGFsbG9jYXRpb24gaW4gdGhlIERIQ1B2NCBzZXJ2ZXI8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjExMCIgeD0iMzQ0IiB5PSI1MS4wNjc5Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTAiIHg9IjM1NCIgeT0iNzMuODk2Ij5QYWNrZXQgUmVjZWl2ZWQ8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjExMyIgeD0iMzQyLjUiIHk9IjEwNy40MTIiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5MyIgeD0iMzUyLjUiIHk9IjEzMC4yNDAxIj5TdWJuZXQgU2VsZWN0aW9uPC90ZXh0PjxlbGxpcHNlIGN4PSIzOTkiIGN5PSIxNzMuNzU2MSIgZmlsbD0iIzIyMjIyMiIgcng9IjEwIiByeT0iMTAiIHN0eWxlPSJzdHJva2U6IzIyMjIyMjtzdHJva2Utd2lkdGg6MS4wOyIvPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMTE0MC43NjY1IiBzdHlsZT0ic3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuNTsiIHdpZHRoPSI3NzYiIHg9IjExIiB5PSIxOTMuNzU2MSIvPjxwYXRoIGQ9Ik0xNzIsMTkzLjc1NjEgTDE3MiwyMDUuODI0MSBMMTYyLDIxNS44MjQxIEwxMSwyMTUuODI0MSAiIGZpbGw9Im5vbmUiIHN0eWxlPSJzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS41OyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxMDIiIHg9IjE0IiB5PSIyMDkuNzIyMSI+c3VibmV0NF9zZWxlY3Q8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNDUiIHg9IjEyMCIgeT0iMjA5LjcyMjEiPmNhbGxvdXQ8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjQwNSIgeD0iMTk2LjUiIHk9IjIzMi44MjQxIi8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzg1IiB4PSIyMDYuNSIgeT0iMjU1LjY1MjIiPlJldHJpZXZlIHJlc2VydmF0aW9uIGZyb20gaG9zdCBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgaG9zdCBhbmQgc3VibmV0LjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjM2LjM0NDEiIHJ4PSIxMi41IiByeT0iMTIuNSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMzA5IiB4PSIyNDQuNSIgeT0iMzg4LjE1MDEiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIyODkiIHg9IjI1NC41IiB5PSI0MTAuOTc4MiI+UmVzZWxlY3QgdGhlIHN1Ym5ldCB0byB0aGUgb25lIGZyb20gdGhlIHJlc2VydmF0aW9uLjwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjMwNy41LDMzOC42NTkxLDQ5MC41LDMzOC42NTkxLDUwMi41LDM1MC42NTkxLDQ5MC41LDM2Mi42NTkxLDMwNy41LDM2Mi42NTkxLDI5NS41LDM1MC42NTkxLDMwNy41LDMzOC42NTkxIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSIzNzQuNDE4Ij55ZXM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTgzIiB4PSIzMDcuNSIgeT0iMzU0LjkyNzEiPlJlc2VydmF0aW9uIGZvciBhIGRpZmZlcmVudCBzdWJuZXQ/PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE0IiB4PSI1MDIuNSIgeT0iMzQ3LjQzNjEiPm5vPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzk5LDQ0NC40OTQyLDQxMSw0NTYuNDk0MiwzOTksNDY4LjQ5NDIsMzg3LDQ1Ni40OTQyLDM5OSw0NDQuNDk0MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7Ii8+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjQ1NCIgeD0iMTcyIiB5PSI0ODguNDk0MiIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQzNCIgeD0iMTgyIiB5PSI1MTEuMzIyMyI+UmV0cmlldmUgcmVzZXJ2YXRpb24gZnJvbSBob3N0IGNhY2hlIGFnYWluIGluIGNhc2UgdGhlIHN1Ym5ldCB3YXMgcmVzZWxlY3RlZC48L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjI2MyIgeD0iMjY3LjUiIHk9IjU5NS42NTcyIi8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMjQzIiB4PSIyNzcuNSIgeT0iNjE4LjQ4NTMiPlVzZSBjYWNoZWQgYXR0cmlidXRlcyBmcm9tIHRoZSByZXNlcnZhdGlvbi48L3RleHQ+PGVsbGlwc2UgY3g9IjM5OSIgY3k9IjY3MC4zMjkyIiBmaWxsPSJub25lIiByeD0iMTEiIHJ5PSIxMSIgc3R5bGU9InN0cm9rZTojMjIyMjIyO3N0cm9rZS13aWR0aDoxLjA7Ii8+PGVsbGlwc2UgY3g9IjM5OSIgY3k9IjY3MC4zMjkyIiBmaWxsPSIjMjIyMjIyIiByeD0iNiIgcnk9IjYiIHN0eWxlPSJzdHJva2U6IzIyMjIyMjtzdHJva2Utd2lkdGg6MS4wOyIvPjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzA2LDU0Ni4xNjYyLDQ5Miw1NDYuMTY2Miw1MDQsNTU4LjE2NjIsNDkyLDU3MC4xNjYyLDMwNiw1NzAuMTY2MiwyOTQsNTU4LjE2NjIsMzA2LDU0Ni4xNjYyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSI1ODEuOTI1MSI+eWVzPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE4NiIgeD0iMzA2IiB5PSI1NjIuNDM0MiI+UmVzZXJ2YXRpb24gd2l0aCBjYWNoZWQgYXR0cmlidXRlcz88L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTQiIHg9IjUwNCIgeT0iNTU0Ljk0MzMiPm5vPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzQ4LDI4OS4xNjgyLDQ1MCwyODkuMTY4Miw0NjIsMzAxLjE2ODIsNDUwLDMxMy4xNjgyLDM0OCwzMTMuMTY4MiwzMzYsMzAxLjE2ODIsMzQ4LDI4OS4xNjgyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSIzMjQuOTI3MSI+eWVzPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjEwMiIgeD0iMzQ4IiB5PSIzMDUuNDM2MSI+UmVzZXJ2YXRpb24gZm91bmQ/PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE0IiB4PSI0NjIiIHk9IjI5Ny45NDUyIj5ubzwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjM5OSw3MjMuMzI5Miw0MTEsNzM1LjMyOTIsMzk5LDc0Ny4zMjkyLDM4Nyw3MzUuMzI5MiwzOTksNzIzLjMyOTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIvPjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSIxNDIiIHg9IjMyOCIgeT0iNzY3LjMyOTIiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxMjIiIHg9IjMzOCIgeT0iNzkwLjE1NzMiPlNlbmQgQWNjZXNzLVJlcXVlc3QuPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSIzNjgiIHg9IjIxNSIgeT0iOTIyLjY1NTIiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIzNDgiIHg9IjIyNSIgeT0iOTQ1LjQ4MzMiPlJlc2VsZWN0IHN1Ym5ldCB0byBtYXRjaCBhIHN1Ym5ldCB0aGUgY29udGFpbnMgdGhlIElQIGFkZHJlc3MuPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzAwLDg3My4xNjQzLDQ5OCw4NzMuMTY0Myw1MTAsODg1LjE2NDMsNDk4LDg5Ny4xNjQzLDMwMCw4OTcuMTY0MywyODgsODg1LjE2NDMsMzAwLDg3My4xNjQzIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSI5MDguOTIzMiI+eWVzPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE5OCIgeD0iMzAwIiB5PSI4ODkuNDMyMyI+RnJhbWVkLUlQLUFkZHJlc3MgYXR0cmlidXRlIHByZXNlbnQ/PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE0IiB4PSI1MTAiIHk9Ijg4MS45NDEzIj5ubzwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjM5OSw5NzguOTk5NCw0MTEsOTkwLjk5OTQsMzk5LDEwMDIuOTk5NCwzODcsOTkwLjk5OTQsMzk5LDk3OC45OTk0IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjM2LjM0NDEiIHJ4PSIxMi41IiByeT0iMTIuNSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMzY1IiB4PSIyMTYuNSIgeT0iMTA3Mi40OTAzIi8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzQ1IiB4PSIyMjYuNSIgeT0iMTA5NS4zMTg0Ij5SZXNlbGVjdCBzdWJuZXQgdG8gbWF0Y2ggYSBzdWJuZXQgZ3VhcmRlZCBieSB0aGUgY2xpZW50IGNsYXNzLjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjM2LjM0NDEiIHJ4PSIxMi41IiByeT0iMTIuNSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iNDIzIiB4PSIxODcuNSIgeT0iMTE0My44MzQ0Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNDAzIiB4PSIxOTcuNSIgeT0iMTE2Ni42NjI1Ij5Bc3NpZ24gcGFja2V0IHRvIGNsaWVudCBjbGFzcyByZXByZXNlbnRlZCBieSB0aGUgdmFsdWUgb2YgRnJhbWVkLUlQLVBvb2wuPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzA5LDEwMjIuOTk5NCw0ODksMTAyMi45OTk0LDUwMSwxMDM0Ljk5OTQsNDg5LDEwNDYuOTk5NCwzMDksMTA0Ni45OTk0LDI5NywxMDM0Ljk5OTQsMzA5LDEwMjIuOTk5NCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTciIHg9IjQwMyIgeT0iMTA1OC43NTgzIj55ZXM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTgwIiB4PSIzMDkiIHk9IjEwMzkuMjY3MyI+RnJhbWVkLUlQLVBvb2wgYXR0cmlidXRlIHByZXNlbnQ/PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE0IiB4PSI1MDEiIHk9IjEwMzEuNzc2NCI+bm88L3RleHQ+PHBvbHlnb24gZmlsbD0iI0YxRjFGMSIgcG9pbnRzPSIzOTksMTIwMC4xNzg1LDQxMSwxMjEyLjE3ODUsMzk5LDEyMjQuMTc4NSwzODcsMTIxMi4xNzg1LDM5OSwxMjAwLjE3ODUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIvPjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSI3NTIiIHg9IjIzIiB5PSIxMjQ0LjE3ODUiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI3MzIiIHg9IjMzIiB5PSIxMjY3LjAwNjYiPlBvcHVsYXRlIHRoZSBob3N0IGNhY2hlIHdpdGggdGhlIHJlc2VsZWN0ZWQgc3VibmV0IElEIGFuZCB0aGUgcG90ZW50aWFsIGNsYXNzIGd1YXJkIG9yIElQIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSB0aGUgUkFESVVTIHNlcnZlci48L3RleHQ+PHBvbHlnb24gZmlsbD0iI0YxRjFGMSIgcG9pbnRzPSIzNzQsODIzLjY3MzQsNDI0LDgyMy42NzM0LDQzNiw4MzUuNjczNCw0MjQsODQ3LjY3MzQsMzc0LDg0Ny42NzM0LDM2Miw4MzUuNjczNCwzNzQsODIzLjY3MzQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjcxIiB4PSI0MDMiIHk9Ijg1OS40MzIzIj5BY2Nlc3MtQWNjZXB0PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjUwIiB4PSIzNzQiIHk9IjgzOS45NDEzIj5SZXNwb25zZTwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI2OCIgeD0iNDM2IiB5PSI4MzIuNDUwNCI+QWNjZXNzLVJlamVjdDwvdGV4dD48ZWxsaXBzZSBjeD0iNTI2IiBjeT0iODM1LjY3MzQiIGZpbGw9Im5vbmUiIHJ4PSIxMSIgcnk9IjExIiBzdHlsZT0ic3Ryb2tlOiMyMjIyMjI7c3Ryb2tlLXdpZHRoOjEuMDsiLz48ZWxsaXBzZSBjeD0iNTI2IiBjeT0iODM1LjY3MzQiIGZpbGw9IiMyMjIyMjIiIHJ4PSI2IiByeT0iNiIgc3R5bGU9InN0cm9rZTojMjIyMjIyO3N0cm9rZS13aWR0aDoxLjA7Ii8+PGVsbGlwc2UgY3g9IjM5OSIgY3k9IjEzMTEuNTIyNiIgZmlsbD0ibm9uZSIgcng9IjExIiByeT0iMTEiIHN0eWxlPSJzdHJva2U6IzIyMjIyMjtzdHJva2Utd2lkdGg6MS4wOyIvPjxlbGxpcHNlIGN4PSIzOTkiIGN5PSIxMzExLjUyMjYiIGZpbGw9IiMyMjIyMjIiIHJ4PSI2IiByeT0iNiIgc3R5bGU9InN0cm9rZTojMjIyMjIyO3N0cm9rZS13aWR0aDoxLjA7Ii8+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSI4MC40MTIiIHN0eWxlPSJzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS41OyIgd2lkdGg9IjU3NyIgeD0iMTEwLjUiIHk9IjEzNDYuMTI0NiIvPjxwYXRoIGQ9Ik02NzcuNSwxMzQ2LjEyNDYgTDY3Ny41LDEzNTguMTkyNSBMNjY3LjUsMTM2OC4xOTI1IEwxMTAuNSwxMzY4LjE5MjUgIiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iODkiIHg9IjExMy41IiB5PSIxMzYyLjA5MDYiPmxlYXNlNF9zZWxlY3Q8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNCIgeD0iMjAyLjUiIHk9IjEzNjIuMDkwNiI+LDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTIiIHg9IjIxMC41IiB5PSIxMzYyLjA5MDYiPmxlYXNlNF9yZW5ldzwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0IiB4PSIzMDIuNSIgeT0iMTM2Mi4wOTA2Ij4sPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5OCIgeD0iMzEwLjUiIHk9IjEzNjIuMDkwNiI+bGVhc2U0X3JlbGVhc2U8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNCIgeD0iNDA4LjUiIHk9IjEzNjIuMDkwNiI+LDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTgiIHg9IjQxNi41IiB5PSIxMzYyLjA5MDYiPmxlYXNlNF9kZWNsaW5lPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQiIHg9IjUxNC41IiB5PSIxMzYyLjA5MDYiPiw8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjkyIiB4PSI1MjIuNSIgeT0iMTM2Mi4wOTA2Ij5sZWFzZTRfZXhwaXJlPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjUyIiB4PSI2MTguNSIgeT0iMTM2Mi4wOTA2Ij5jYWxsb3V0czwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjM2LjM0NDEiIHJ4PSIxMi41IiByeT0iMTIuNSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMjU1IiB4PSIyNzEuNSIgeT0iMTM3OC4xOTI1Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMjM1IiB4PSIyODEuNSIgeT0iMTQwMS4wMjA2Ij5TZW5kIEFjY291bnRpbmctUmVxdWVzdCBhc3luY2hyb25vdXNseS48L3RleHQ+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iODcuNDEyIiB5Mj0iMTA3LjQxMiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDk3LjQxMiwzOTksMTA3LjQxMiw0MDMsOTcuNDEyLDM5OSwxMDEuNDEyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIxNDMuNzU2MSIgeTI9IjE2My43NTYxIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMTUzLjc1NjEsMzk5LDE2My43NTYxLDQwMywxNTMuNzU2MSwzOTksMTU3Ljc1NjEiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjM2Mi42NTkxIiB5Mj0iMzg4LjE1MDEiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwzNzguMTUwMSwzOTksMzg4LjE1MDEsNDAzLDM3OC4xNTAxLDM5OSwzODIuMTUwMSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTAyLjUiIHgyPSI1NjMuNSIgeTE9IjM1MC42NTkxIiB5Mj0iMzUwLjY1OTEiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjU1OS41LDM5Ni4zMjIxLDU2My41LDQwNi4zMjIxLDU2Ny41LDM5Ni4zMjIxLDU2My41LDQwMC4zMjIxIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI1NjMuNSIgeDI9IjU2My41IiB5MT0iMzUwLjY1OTEiIHkyPSI0NTYuNDk0MiIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjU2My41IiB4Mj0iNDExIiB5MT0iNDU2LjQ5NDIiIHkyPSI0NTYuNDk0MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iNDIxLDQ1Mi40OTQyLDQxMSw0NTYuNDk0Miw0MjEsNDYwLjQ5NDIsNDE3LDQ1Ni40OTQyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI0MjQuNDk0MiIgeTI9IjQ0NC40OTQyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsNDM0LjQ5NDIsMzk5LDQ0NC40OTQyLDQwMyw0MzQuNDk0MiwzOTksNDM4LjQ5NDIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjQ2OC40OTQyIiB5Mj0iNDg4LjQ5NDIiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSw0NzguNDk0MiwzOTksNDg4LjQ5NDIsNDAzLDQ3OC40OTQyLDM5OSw0ODIuNDk0MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iNjMyLjAwMTMiIHkyPSI2NTkuMzI5MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDY0OS4zMjkyLDM5OSw2NTkuMzI5Miw0MDMsNjQ5LjMyOTIsMzk5LDY1My4zMjkyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI1NzAuMTY2MiIgeTI9IjU5NS42NTcyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsNTg1LjY1NzIsMzk5LDU5NS42NTcyLDQwMyw1ODUuNjU3MiwzOTksNTg5LjY1NzIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjUwNCIgeDI9IjU0MC41IiB5MT0iNTU4LjE2NjIiIHkyPSI1NTguMTY2MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iNTM2LjUsNjI5LjMyOTIsNTQwLjUsNjM5LjMyOTIsNTQ0LjUsNjI5LjMyOTIsNTQwLjUsNjMzLjMyOTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjU0MC41IiB4Mj0iNTQwLjUiIHkxPSI1NTguMTY2MiIgeTI9IjcwMy4zMjkyIi8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTQwLjUiIHgyPSIzOTkiIHkxPSI3MDMuMzI5MiIgeTI9IjcwMy4zMjkyIi8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iNzAzLjMyOTIiIHkyPSI3MjMuMzI5MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDcxMy4zMjkyLDM5OSw3MjMuMzI5Miw0MDMsNzEzLjMyOTIsMzk5LDcxNy4zMjkyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI1MjQuODM4MyIgeTI9IjU0Ni4xNjYyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsNTM2LjE2NjIsMzk5LDU0Ni4xNjYyLDQwMyw1MzYuMTY2MiwzOTksNTQwLjE2NjIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjMxMy4xNjgyIiB5Mj0iMzM4LjY1OTEiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwzMjguNjU5MSwzOTksMzM4LjY1OTEsNDAzLDMyOC42NTkxLDM5OSwzMzIuNjU5MSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNDYyIiB4Mj0iNjM2IiB5MT0iMzAxLjE2ODIiIHkyPSIzMDEuMTY4MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iNjMyLDUxNi4xNjYyLDYzNiw1MjYuMTY2Miw2NDAsNTE2LjE2NjIsNjM2LDUyMC4xNjYyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI2MzYiIHgyPSI2MzYiIHkxPSIzMDEuMTY4MiIgeTI9IjczNS4zMjkyIi8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNjM2IiB4Mj0iNDExIiB5MT0iNzM1LjMyOTIiIHkyPSI3MzUuMzI5MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iNDIxLDczMS4zMjkyLDQxMSw3MzUuMzI5Miw0MjEsNzM5LjMyOTIsNDE3LDczNS4zMjkyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIyNjkuMTY4MiIgeTI9IjI4OS4xNjgyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMjc5LjE2ODIsMzk5LDI4OS4xNjgyLDQwMywyNzkuMTY4MiwzOTksMjgzLjE2ODIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9Ijc0Ny4zMjkyIiB5Mj0iNzY3LjMyOTIiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSw3NTcuMzI5MiwzOTksNzY3LjMyOTIsNDAzLDc1Ny4zMjkyLDM5OSw3NjEuMzI5MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iODk3LjE2NDMiIHkyPSI5MjIuNjU1MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDkxMi42NTUyLDM5OSw5MjIuNjU1Miw0MDMsOTEyLjY1NTIsMzk5LDkxNi42NTUyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI1MTAiIHgyPSI1OTMiIHkxPSI4ODUuMTY0MyIgeTI9Ijg4NS4xNjQzIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI1ODksOTMwLjgyNzMsNTkzLDk0MC44MjczLDU5Nyw5MzAuODI3Myw1OTMsOTM0LjgyNzMiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjU5MyIgeDI9IjU5MyIgeTE9Ijg4NS4xNjQzIiB5Mj0iOTkwLjk5OTQiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI1OTMiIHgyPSI0MTEiIHkxPSI5OTAuOTk5NCIgeTI9Ijk5MC45OTk0Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI0MjEsOTg2Ljk5OTQsNDExLDk5MC45OTk0LDQyMSw5OTQuOTk5NCw0MTcsOTkwLjk5OTQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9Ijk1OC45OTk0IiB5Mj0iOTc4Ljk5OTQiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSw5NjguOTk5NCwzOTksOTc4Ljk5OTQsNDAzLDk2OC45OTk0LDM5OSw5NzIuOTk5NCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iMTEwOC44MzQ0IiB5Mj0iMTE0My44MzQ0Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMTEzMy44MzQ0LDM5OSwxMTQzLjgzNDQsNDAzLDExMzMuODM0NCwzOTksMTEzNy44MzQ0IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIxMDQ2Ljk5OTQiIHkyPSIxMDcyLjQ5MDMiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwxMDYyLjQ5MDMsMzk5LDEwNzIuNDkwMyw0MDMsMTA2Mi40OTAzLDM5OSwxMDY2LjQ5MDMiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjUwMSIgeDI9IjYyMC41IiB5MT0iMTAzNC45OTk0IiB5Mj0iMTAzNC45OTk0Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI2MTYuNSwxMTE2LjMzNDQsNjIwLjUsMTEyNi4zMzQ0LDYyNC41LDExMTYuMzM0NCw2MjAuNSwxMTIwLjMzNDQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjYyMC41IiB4Mj0iNjIwLjUiIHkxPSIxMDM0Ljk5OTQiIHkyPSIxMjEyLjE3ODUiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI2MjAuNSIgeDI9IjQxMSIgeTE9IjEyMTIuMTc4NSIgeTI9IjEyMTIuMTc4NSIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iNDIxLDEyMDguMTc4NSw0MTEsMTIxMi4xNzg1LDQyMSwxMjE2LjE3ODUsNDE3LDEyMTIuMTc4NSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iMTE4MC4xNzg1IiB5Mj0iMTIwMC4xNzg1Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMTE5MC4xNzg1LDM5OSwxMjAwLjE3ODUsNDAzLDExOTAuMTc4NSwzOTksMTE5NC4xNzg1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIxMDAyLjk5OTQiIHkyPSIxMDIyLjk5OTQiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwxMDEyLjk5OTQsMzk5LDEwMjIuOTk5NCw0MDMsMTAxMi45OTk0LDM5OSwxMDE2Ljk5OTQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjEyMjQuMTc4NSIgeTI9IjEyNDQuMTc4NSIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDEyMzQuMTc4NSwzOTksMTI0NC4xNzg1LDQwMywxMjM0LjE3ODUsMzk5LDEyMzguMTc4NSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iODQ3LjY3MzQiIHkyPSI4NzMuMTY0MyIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDg2My4xNjQzLDM5OSw4NzMuMTY0Myw0MDMsODYzLjE2NDMsMzk5LDg2Ny4xNjQzIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI0MzYiIHgyPSI1MTUiIHkxPSI4MzUuNjczNCIgeTI9IjgzNS42NzM0Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI1MDUsODMxLjY3MzQsNTE1LDgzNS42NzM0LDUwNSw4MzkuNjczNCw1MDksODM1LjY3MzQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjEyODAuNTIyNiIgeTI9IjEzMDAuNTIyNiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDEyOTAuNTIyNiwzOTksMTMwMC41MjI2LDQwMywxMjkwLjUyMjYsMzk5LDEyOTQuNTIyNiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iODAzLjY3MzQiIHkyPSI4MjMuNjczNCIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDgxMy42NzM0LDM5OSw4MjMuNjczNCw0MDMsODEzLjY3MzQsMzk5LDgxNy42NzM0IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIxODMuNzU2MSIgeTI9IjIzMi44MjQxIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMjIyLjgyNDEsMzk5LDIzMi44MjQxLDQwMywyMjIuODI0MSwzOTksMjI2LjgyNDEiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjwhLS1TUkM9W2hMSERSbmVuNEJ0ZEx1bXU0TEh3b1lhdkxBWWVBaFNMQUVWQVU2VFBEeVJVc2NDZWdsQlZFeFFOX08xNDlMOUZRdV83Unp4UlVIdTAwNUFhNFRRQnZVZnYwcVZoTllmalpyMVAxbmc1SG4xUU1vYjhNR0ZBMERLOG8telZZeUMzVTdHN1Q3U0MwTy01YTJ6OGk0UTl3ZTNiS3V2a21qUG1UOENRUEdKOE9LXzJLTGVybDUwOVVKQVItUEp5eUNFZHhEYUNQQW1TUTA5X0taQlpoUDZTbVdFMm1yV3lhd2dTdEtEakZWNDVvVW1ZeXlYSTFrVkdLM3VJZmVIU3VGREpZd09nY0F3N0UzUU95aWp6bDZqV1VhOV90b1EtYlVmMEdBY2cyYkU5WkZwc3RLR3hRcWdxU1l3R0pKamhDMGs4Y3U2Z1pZSzBRY3gyckRXVTRXc05sWGwwdF8xTm40d2VyNDBQVXBlV1NYRy1OT200aUhwS2xISHpMNUhkaTE4NFNTYmo4RkpsWWR4Y0NiVlBfejhRcE02UjZ3TFZkV3hGN1pVeVd1TUt3RnJ5WlJ5Mi1nbEVEelB1RkREbEstRWRlTjdkbHBjbm50QS1Ba1FCaWNKVWxYUzRKVEhYUmNYenRfUXo4NWNwVlN3SFE1TGhZRGxacXNQTFdDWHJGYzIyQ1NfMk1sclZJVXcyUzJMdFNkbEFWQk1BamZUUVo0V29yQzl4akpGeWlEQ3VPQTFYQVpVemZUOTM3T0dFXzBtZzZCRl9ZRnlCc21HakFCandPRmJhc0JGTmlodEZVYlJCRDE3WU9NRTkySWNYTXV2OUFsMDN4X2wwMDFJU3VVa1RWVGpuY0tUV0hwUEp4THB0YXNsc2gwVkU3V2hlbWdfTjhwNER1N3VZVmU4a242QzdablVIajFaNUlrSlZSeU9uX0RxZVhfcnV6UEZCOXlEcGE5SlBkUHlEMjd5b2lkUk1zRTNyZ0hOeC1YUzBdLS0+PC9nPjwvc3ZnPg==" y="36.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="4" x="17" y="1488.0339"> </text> + <image height="1437" width="798" x="17" xlink:href="data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjE0MzciIHdpZHRoPSI3OTgiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID48ZGVmcy8+PGc+PHJlY3QgZmlsbD0iI0ZGRkZGRiIgc3R5bGU9IndpZHRoOjc5OHB4O2hlaWdodDoxNDM3cHg7YmFja2dyb3VuZDojRkZGRkZGOyIgd2lkdGg9Ijc5OCIgaGVpZ2h0PSIxNDM3Ii8+IDx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0MDgiIHg9IjE5My41IiB5PSIzNC45NjU5Ij5SQURJVVMgd29ya2Zsb3cgZm9yIGxlYXNlIGFsbG9jYXRpb24gaW4gdGhlIERIQ1B2NiBzZXJ2ZXI8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjExMCIgeD0iMzQ0IiB5PSI1MS4wNjc5Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTAiIHg9IjM1NCIgeT0iNzMuODk2Ij5QYWNrZXQgUmVjZWl2ZWQ8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjExMyIgeD0iMzQyLjUiIHk9IjEwNy40MTIiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5MyIgeD0iMzUyLjUiIHk9IjEzMC4yNDAxIj5TdWJuZXQgU2VsZWN0aW9uPC90ZXh0PjxlbGxpcHNlIGN4PSIzOTkiIGN5PSIxNzMuNzU2MSIgZmlsbD0iIzIyMjIyMiIgcng9IjEwIiByeT0iMTAiIHN0eWxlPSJzdHJva2U6IzIyMjIyMjtzdHJva2Utd2lkdGg6MS4wOyIvPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMTE0MC43NjY1IiBzdHlsZT0ic3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuNTsiIHdpZHRoPSI3NzYiIHg9IjExIiB5PSIxOTMuNzU2MSIvPjxwYXRoIGQ9Ik0xNzIsMTkzLjc1NjEgTDE3MiwyMDUuODI0MSBMMTYyLDIxNS44MjQxIEwxMSwyMTUuODI0MSAiIGZpbGw9Im5vbmUiIHN0eWxlPSJzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS41OyIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxMDIiIHg9IjE0IiB5PSIyMDkuNzIyMSI+c3VibmV0Nl9zZWxlY3Q8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNDUiIHg9IjEyMCIgeT0iMjA5LjcyMjEiPmNhbGxvdXQ8L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjQwNSIgeD0iMTk2LjUiIHk9IjIzMi44MjQxIi8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzg1IiB4PSIyMDYuNSIgeT0iMjU1LjY1MjIiPlJldHJpZXZlIHJlc2VydmF0aW9uIGZyb20gaG9zdCBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgaG9zdCBhbmQgc3VibmV0LjwvdGV4dD48cmVjdCBmaWxsPSIjRjFGMUYxIiBoZWlnaHQ9IjM2LjM0NDEiIHJ4PSIxMi41IiByeT0iMTIuNSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7IiB3aWR0aD0iMzA5IiB4PSIyNDQuNSIgeT0iMzg4LjE1MDEiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIyODkiIHg9IjI1NC41IiB5PSI0MTAuOTc4MiI+UmVzZWxlY3QgdGhlIHN1Ym5ldCB0byB0aGUgb25lIGZyb20gdGhlIHJlc2VydmF0aW9uLjwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjMwNy41LDMzOC42NTkxLDQ5MC41LDMzOC42NTkxLDUwMi41LDM1MC42NTkxLDQ5MC41LDM2Mi42NTkxLDMwNy41LDM2Mi42NTkxLDI5NS41LDM1MC42NTkxLDMwNy41LDMzOC42NTkxIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSIzNzQuNDE4Ij55ZXM8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTgzIiB4PSIzMDcuNSIgeT0iMzU0LjkyNzEiPlJlc2VydmF0aW9uIGZvciBhIGRpZmZlcmVudCBzdWJuZXQ/PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE0IiB4PSI1MDIuNSIgeT0iMzQ3LjQzNjEiPm5vPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzk5LDQ0NC40OTQyLDQxMSw0NTYuNDk0MiwzOTksNDY4LjQ5NDIsMzg3LDQ1Ni40OTQyLDM5OSw0NDQuNDk0MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7Ii8+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjQ1NCIgeD0iMTcyIiB5PSI0ODguNDk0MiIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQzNCIgeD0iMTgyIiB5PSI1MTEuMzIyMyI+UmV0cmlldmUgcmVzZXJ2YXRpb24gZnJvbSBob3N0IGNhY2hlIGFnYWluIGluIGNhc2UgdGhlIHN1Ym5ldCB3YXMgcmVzZWxlY3RlZC48L3RleHQ+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9IjI2MyIgeD0iMjY3LjUiIHk9IjU5NS42NTcyIi8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMjQzIiB4PSIyNzcuNSIgeT0iNjE4LjQ4NTMiPlVzZSBjYWNoZWQgYXR0cmlidXRlcyBmcm9tIHRoZSByZXNlcnZhdGlvbi48L3RleHQ+PGVsbGlwc2UgY3g9IjM5OSIgY3k9IjY3MC4zMjkyIiBmaWxsPSJub25lIiByeD0iMTEiIHJ5PSIxMSIgc3R5bGU9InN0cm9rZTojMjIyMjIyO3N0cm9rZS13aWR0aDoxLjA7Ii8+PGVsbGlwc2UgY3g9IjM5OSIgY3k9IjY3MC4zMjkyIiBmaWxsPSIjMjIyMjIyIiByeD0iNiIgcnk9IjYiIHN0eWxlPSJzdHJva2U6IzIyMjIyMjtzdHJva2Utd2lkdGg6MS4wOyIvPjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzA2LDU0Ni4xNjYyLDQ5Miw1NDYuMTY2Miw1MDQsNTU4LjE2NjIsNDkyLDU3MC4xNjYyLDMwNiw1NzAuMTY2MiwyOTQsNTU4LjE2NjIsMzA2LDU0Ni4xNjYyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSI1ODEuOTI1MSI+eWVzPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE4NiIgeD0iMzA2IiB5PSI1NjIuNDM0MiI+UmVzZXJ2YXRpb24gd2l0aCBjYWNoZWQgYXR0cmlidXRlcz88L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTQiIHg9IjUwNCIgeT0iNTU0Ljk0MzMiPm5vPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzQ4LDI4OS4xNjgyLDQ1MCwyODkuMTY4Miw0NjIsMzAxLjE2ODIsNDUwLDMxMy4xNjgyLDM0OCwzMTMuMTY4MiwzMzYsMzAxLjE2ODIsMzQ4LDI4OS4xNjgyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSIzMjQuOTI3MSI+eWVzPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjEwMiIgeD0iMzQ4IiB5PSIzMDUuNDM2MSI+UmVzZXJ2YXRpb24gZm91bmQ/PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjE0IiB4PSI0NjIiIHk9IjI5Ny45NDUyIj5ubzwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjM5OSw3MjMuMzI5Miw0MTEsNzM1LjMyOTIsMzk5LDc0Ny4zMjkyLDM4Nyw3MzUuMzI5MiwzOTksNzIzLjMyOTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIvPjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSIxNDIiIHg9IjMyOCIgeT0iNzY3LjMyOTIiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxMjIiIHg9IjMzOCIgeT0iNzkwLjE1NzMiPlNlbmQgQWNjZXNzLVJlcXVlc3QuPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSIzNjgiIHg9IjIxNSIgeT0iOTIyLjY1NTIiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIzNDgiIHg9IjIyNSIgeT0iOTQ1LjQ4MzMiPlJlc2VsZWN0IHN1Ym5ldCB0byBtYXRjaCBhIHN1Ym5ldCB0aGUgY29udGFpbnMgdGhlIElQIGFkZHJlc3MuPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMjk0LDg3My4xNjQzLDUwNCw4NzMuMTY0Myw1MTYsODg1LjE2NDMsNTA0LDg5Ny4xNjQzLDI5NCw4OTcuMTY0MywyODIsODg1LjE2NDMsMjk0LDg3My4xNjQzIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSI5MDguOTIzMiI+eWVzPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjIxMCIgeD0iMjk0IiB5PSI4ODkuNDMyMyI+RnJhbWVkLUlQdjYtQWRkcmVzcyBhdHRyaWJ1dGUgcHJlc2VudD88L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTQiIHg9IjUxNiIgeT0iODgxLjk0MTMiPm5vPC90ZXh0Pjxwb2x5Z29uIGZpbGw9IiNGMUYxRjEiIHBvaW50cz0iMzk5LDk3OC45OTk0LDQxMSw5OTAuOTk5NCwzOTksMTAwMi45OTk0LDM4Nyw5OTAuOTk5NCwzOTksOTc4Ljk5OTQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIvPjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSIzNjUiIHg9IjIxNi41IiB5PSIxMDcyLjQ5MDMiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIzNDUiIHg9IjIyNi41IiB5PSIxMDk1LjMxODQiPlJlc2VsZWN0IHN1Ym5ldCB0byBtYXRjaCBhIHN1Ym5ldCBndWFyZGVkIGJ5IHRoZSBjbGllbnQgY2xhc3MuPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSI0MjMiIHg9IjE4Ny41IiB5PSIxMTQzLjgzNDQiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0MDMiIHg9IjE5Ny41IiB5PSIxMTY2LjY2MjUiPkFzc2lnbiBwYWNrZXQgdG8gY2xpZW50IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoZSB2YWx1ZSBvZiBGcmFtZWQtSVAtUG9vbC48L3RleHQ+PHBvbHlnb24gZmlsbD0iI0YxRjFGMSIgcG9pbnRzPSIzMDksMTAyMi45OTk0LDQ4OSwxMDIyLjk5OTQsNTAxLDEwMzQuOTk5NCw0ODksMTA0Ni45OTk0LDMwOSwxMDQ2Ljk5OTQsMjk3LDEwMzQuOTk5NCwzMDksMTAyMi45OTk0IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNyIgeD0iNDAzIiB5PSIxMDU4Ljc1ODMiPnllczwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMSIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxODAiIHg9IjMwOSIgeT0iMTAzOS4yNjczIj5GcmFtZWQtSVAtUG9vbCBhdHRyaWJ1dGUgcHJlc2VudD88L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTQiIHg9IjUwMSIgeT0iMTAzMS43NzY0Ij5ubzwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjM5OSwxMjAwLjE3ODUsNDExLDEyMTIuMTc4NSwzOTksMTIyNC4xNzg1LDM4NywxMjEyLjE3ODUsMzk5LDEyMDAuMTc4NSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7Ii8+PHJlY3QgZmlsbD0iI0YxRjFGMSIgaGVpZ2h0PSIzNi4zNDQxIiByeD0iMTIuNSIgcnk9IjEyLjUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MC41OyIgd2lkdGg9Ijc1MiIgeD0iMjMiIHk9IjEyNDQuMTc4NSIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjczMiIgeD0iMzMiIHk9IjEyNjcuMDA2NiI+UG9wdWxhdGUgdGhlIGhvc3QgY2FjaGUgd2l0aCB0aGUgcmVzZWxlY3RlZCBzdWJuZXQgSUQgYW5kIHRoZSBwb3RlbnRpYWwgY2xhc3MgZ3VhcmQgb3IgSVAgYWRkcmVzcyByZXR1cm5lZCBmcm9tIHRoZSBSQURJVVMgc2VydmVyLjwvdGV4dD48cG9seWdvbiBmaWxsPSIjRjFGMUYxIiBwb2ludHM9IjM3NCw4MjMuNjczNCw0MjQsODIzLjY3MzQsNDM2LDgzNS42NzM0LDQyNCw4NDcuNjczNCwzNzQsODQ3LjY3MzQsMzYyLDgzNS42NzM0LDM3NCw4MjMuNjczNCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDowLjU7Ii8+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNzEiIHg9IjQwMyIgeT0iODU5LjQzMjMiPkFjY2Vzcy1BY2NlcHQ8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTEiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNTAiIHg9IjM3NCIgeT0iODM5Ljk0MTMiPlJlc3BvbnNlPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjExIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjY4IiB4PSI0MzYiIHk9IjgzMi40NTA0Ij5BY2Nlc3MtUmVqZWN0PC90ZXh0PjxlbGxpcHNlIGN4PSI1MjYiIGN5PSI4MzUuNjczNCIgZmlsbD0ibm9uZSIgcng9IjExIiByeT0iMTEiIHN0eWxlPSJzdHJva2U6IzIyMjIyMjtzdHJva2Utd2lkdGg6MS4wOyIvPjxlbGxpcHNlIGN4PSI1MjYiIGN5PSI4MzUuNjczNCIgZmlsbD0iIzIyMjIyMiIgcng9IjYiIHJ5PSI2IiBzdHlsZT0ic3Ryb2tlOiMyMjIyMjI7c3Ryb2tlLXdpZHRoOjEuMDsiLz48ZWxsaXBzZSBjeD0iMzk5IiBjeT0iMTMxMS41MjI2IiBmaWxsPSJub25lIiByeD0iMTEiIHJ5PSIxMSIgc3R5bGU9InN0cm9rZTojMjIyMjIyO3N0cm9rZS13aWR0aDoxLjA7Ii8+PGVsbGlwc2UgY3g9IjM5OSIgY3k9IjEzMTEuNTIyNiIgZmlsbD0iIzIyMjIyMiIgcng9IjYiIHJ5PSI2IiBzdHlsZT0ic3Ryb2tlOiMyMjIyMjI7c3Ryb2tlLXdpZHRoOjEuMDsiLz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjgwLjQxMiIgc3R5bGU9InN0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjU7IiB3aWR0aD0iNjc5IiB4PSI1OS41IiB5PSIxMzQ2LjEyNDYiLz48cGF0aCBkPSJNNzI4LjUsMTM0Ni4xMjQ2IEw3MjguNSwxMzU4LjE5MjUgTDcxOC41LDEzNjguMTkyNSBMNTkuNSwxMzY4LjE5MjUgIiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuNTsiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iODkiIHg9IjYyLjUiIHk9IjEzNjIuMDkwNiI+bGVhc2U2X3NlbGVjdDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0IiB4PSIxNTEuNSIgeT0iMTM2Mi4wOTA2Ij4sPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5MiIgeD0iMTU5LjUiIHk9IjEzNjIuMDkwNiI+bGVhc2U2X3JlbmV3PC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQiIHg9IjI1MS41IiB5PSIxMzYyLjA5MDYiPiw8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9Ijk0IiB4PSIyNTkuNSIgeT0iMTM2Mi4wOTA2Ij5sZWFzZTZfcmViaW5kPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQiIHg9IjM1My41IiB5PSIxMzYyLjA5MDYiPiw8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9Ijk4IiB4PSIzNjEuNSIgeT0iMTM2Mi4wOTA2Ij5sZWFzZTZfcmVsZWFzZTwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI0IiB4PSI0NTkuNSIgeT0iMTM2Mi4wOTA2Ij4sPC90ZXh0Pjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSI5OCIgeD0iNDY3LjUiIHk9IjEzNjIuMDkwNiI+bGVhc2U2X2RlY2xpbmU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNCIgeD0iNTY1LjUiIHk9IjEzNjIuMDkwNiI+LDwvdGV4dD48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iOTIiIHg9IjU3My41IiB5PSIxMzYyLjA5MDYiPmxlYXNlNl9leHBpcmU8L3RleHQ+PHRleHQgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iNTIiIHg9IjY2OS41IiB5PSIxMzYyLjA5MDYiPmNhbGxvdXRzPC90ZXh0PjxyZWN0IGZpbGw9IiNGMUYxRjEiIGhlaWdodD0iMzYuMzQ0MSIgcng9IjEyLjUiIHJ5PSIxMi41IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjAuNTsiIHdpZHRoPSIyNTUiIHg9IjI3MS41IiB5PSIxMzc4LjE5MjUiLz48dGV4dCBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIyMzUiIHg9IjI4MS41IiB5PSIxNDAxLjAyMDYiPlNlbmQgQWNjb3VudGluZy1SZXF1ZXN0IGFzeW5jaHJvbm91c2x5LjwvdGV4dD48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI4Ny40MTIiIHkyPSIxMDcuNDEyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsOTcuNDEyLDM5OSwxMDcuNDEyLDQwMyw5Ny40MTIsMzk5LDEwMS40MTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjE0My43NTYxIiB5Mj0iMTYzLjc1NjEiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwxNTMuNzU2MSwzOTksMTYzLjc1NjEsNDAzLDE1My43NTYxLDM5OSwxNTcuNzU2MSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iMzYyLjY1OTEiIHkyPSIzODguMTUwMSIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDM3OC4xNTAxLDM5OSwzODguMTUwMSw0MDMsMzc4LjE1MDEsMzk5LDM4Mi4xNTAxIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI1MDIuNSIgeDI9IjU2My41IiB5MT0iMzUwLjY1OTEiIHkyPSIzNTAuNjU5MSIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iNTU5LjUsMzk2LjMyMjEsNTYzLjUsNDA2LjMyMjEsNTY3LjUsMzk2LjMyMjEsNTYzLjUsNDAwLjMyMjEiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjU2My41IiB4Mj0iNTYzLjUiIHkxPSIzNTAuNjU5MSIgeTI9IjQ1Ni40OTQyIi8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTYzLjUiIHgyPSI0MTEiIHkxPSI0NTYuNDk0MiIgeTI9IjQ1Ni40OTQyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI0MjEsNDUyLjQ5NDIsNDExLDQ1Ni40OTQyLDQyMSw0NjAuNDk0Miw0MTcsNDU2LjQ5NDIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjQyNC40OTQyIiB5Mj0iNDQ0LjQ5NDIiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSw0MzQuNDk0MiwzOTksNDQ0LjQ5NDIsNDAzLDQzNC40OTQyLDM5OSw0MzguNDk0MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iNDY4LjQ5NDIiIHkyPSI0ODguNDk0MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDQ3OC40OTQyLDM5OSw0ODguNDk0Miw0MDMsNDc4LjQ5NDIsMzk5LDQ4Mi40OTQyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI2MzIuMDAxMyIgeTI9IjY1OS4zMjkyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsNjQ5LjMyOTIsMzk5LDY1OS4zMjkyLDQwMyw2NDkuMzI5MiwzOTksNjUzLjMyOTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjU3MC4xNjYyIiB5Mj0iNTk1LjY1NzIiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSw1ODUuNjU3MiwzOTksNTk1LjY1NzIsNDAzLDU4NS42NTcyLDM5OSw1ODkuNjU3MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTA0IiB4Mj0iNTQwLjUiIHkxPSI1NTguMTY2MiIgeTI9IjU1OC4xNjYyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI1MzYuNSw2MjkuMzI5Miw1NDAuNSw2MzkuMzI5Miw1NDQuNSw2MjkuMzI5Miw1NDAuNSw2MzMuMzI5MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTQwLjUiIHgyPSI1NDAuNSIgeTE9IjU1OC4xNjYyIiB5Mj0iNzAzLjMyOTIiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI1NDAuNSIgeDI9IjM5OSIgeTE9IjcwMy4zMjkyIiB5Mj0iNzAzLjMyOTIiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI3MDMuMzI5MiIgeTI9IjcyMy4zMjkyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsNzEzLjMyOTIsMzk5LDcyMy4zMjkyLDQwMyw3MTMuMzI5MiwzOTksNzE3LjMyOTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjUyNC44MzgzIiB5Mj0iNTQ2LjE2NjIiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSw1MzYuMTY2MiwzOTksNTQ2LjE2NjIsNDAzLDUzNi4xNjYyLDM5OSw1NDAuMTY2MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iMzEzLjE2ODIiIHkyPSIzMzguNjU5MSIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDMyOC42NTkxLDM5OSwzMzguNjU5MSw0MDMsMzI4LjY1OTEsMzk5LDMzMi42NTkxIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI0NjIiIHgyPSI2MzYiIHkxPSIzMDEuMTY4MiIgeTI9IjMwMS4xNjgyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI2MzIsNTE2LjE2NjIsNjM2LDUyNi4xNjYyLDY0MCw1MTYuMTY2Miw2MzYsNTIwLjE2NjIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjYzNiIgeDI9IjYzNiIgeTE9IjMwMS4xNjgyIiB5Mj0iNzM1LjMyOTIiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSI2MzYiIHgyPSI0MTEiIHkxPSI3MzUuMzI5MiIgeTI9IjczNS4zMjkyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI0MjEsNzMxLjMyOTIsNDExLDczNS4zMjkyLDQyMSw3MzkuMzI5Miw0MTcsNzM1LjMyOTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjI2OS4xNjgyIiB5Mj0iMjg5LjE2ODIiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwyNzkuMTY4MiwzOTksMjg5LjE2ODIsNDAzLDI3OS4xNjgyLDM5OSwyODMuMTY4MiIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iNzQ3LjMyOTIiIHkyPSI3NjcuMzI5MiIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDc1Ny4zMjkyLDM5OSw3NjcuMzI5Miw0MDMsNzU3LjMyOTIsMzk5LDc2MS4zMjkyIiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI4OTcuMTY0MyIgeTI9IjkyMi42NTUyIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsOTEyLjY1NTIsMzk5LDkyMi42NTUyLDQwMyw5MTIuNjU1MiwzOTksOTE2LjY1NTIiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjUxNiIgeDI9IjU5MyIgeTE9Ijg4NS4xNjQzIiB5Mj0iODg1LjE2NDMiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjU4OSw5MzAuODI3Myw1OTMsOTQwLjgyNzMsNTk3LDkzMC44MjczLDU5Myw5MzQuODI3MyIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTkzIiB4Mj0iNTkzIiB5MT0iODg1LjE2NDMiIHkyPSI5OTAuOTk5NCIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjU5MyIgeDI9IjQxMSIgeTE9Ijk5MC45OTk0IiB5Mj0iOTkwLjk5OTQiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjQyMSw5ODYuOTk5NCw0MTEsOTkwLjk5OTQsNDIxLDk5NC45OTk0LDQxNyw5OTAuOTk5NCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iOTU4Ljk5OTQiIHkyPSI5NzguOTk5NCIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDk2OC45OTk0LDM5OSw5NzguOTk5NCw0MDMsOTY4Ljk5OTQsMzk5LDk3Mi45OTk0IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIxMTA4LjgzNDQiIHkyPSIxMTQzLjgzNDQiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwxMTMzLjgzNDQsMzk5LDExNDMuODM0NCw0MDMsMTEzMy44MzQ0LDM5OSwxMTM3LjgzNDQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjEwNDYuOTk5NCIgeTI9IjEwNzIuNDkwMyIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDEwNjIuNDkwMywzOTksMTA3Mi40OTAzLDQwMywxMDYyLjQ5MDMsMzk5LDEwNjYuNDkwMyIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNTAxIiB4Mj0iNjIwLjUiIHkxPSIxMDM0Ljk5OTQiIHkyPSIxMDM0Ljk5OTQiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjYxNi41LDExMTYuMzM0NCw2MjAuNSwxMTI2LjMzNDQsNjI0LjUsMTExNi4zMzQ0LDYyMC41LDExMjAuMzM0NCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iNjIwLjUiIHgyPSI2MjAuNSIgeTE9IjEwMzQuOTk5NCIgeTI9IjEyMTIuMTc4NSIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjYyMC41IiB4Mj0iNDExIiB5MT0iMTIxMi4xNzg1IiB5Mj0iMTIxMi4xNzg1Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSI0MjEsMTIwOC4xNzg1LDQxMSwxMjEyLjE3ODUsNDIxLDEyMTYuMTc4NSw0MTcsMTIxMi4xNzg1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSIxMTgwLjE3ODUiIHkyPSIxMjAwLjE3ODUiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwxMTkwLjE3ODUsMzk5LDEyMDAuMTc4NSw0MDMsMTE5MC4xNzg1LDM5OSwxMTk0LjE3ODUiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjEwMDIuOTk5NCIgeTI9IjEwMjIuOTk5NCIvPjxwb2x5Z29uIGZpbGw9IiMxODE4MTgiIHBvaW50cz0iMzk1LDEwMTIuOTk5NCwzOTksMTAyMi45OTk0LDQwMywxMDEyLjk5OTQsMzk5LDEwMTYuOTk5NCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iMTIyNC4xNzg1IiB5Mj0iMTI0NC4xNzg1Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMTIzNC4xNzg1LDM5OSwxMjQ0LjE3ODUsNDAzLDEyMzQuMTc4NSwzOTksMTIzOC4xNzg1IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI4NDcuNjczNCIgeTI9Ijg3My4xNjQzIi8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsODYzLjE2NDMsMzk5LDg3My4xNjQzLDQwMyw4NjMuMTY0MywzOTksODY3LjE2NDMiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjQzNiIgeDI9IjUxNSIgeTE9IjgzNS42NzM0IiB5Mj0iODM1LjY3MzQiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjUwNSw4MzEuNjczNCw1MTUsODM1LjY3MzQsNTA1LDgzOS42NzM0LDUwOSw4MzUuNjczNCIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PGxpbmUgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7IiB4MT0iMzk5IiB4Mj0iMzk5IiB5MT0iMTI4MC41MjI2IiB5Mj0iMTMwMC41MjI2Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsMTI5MC41MjI2LDM5OSwxMzAwLjUyMjYsNDAzLDEyOTAuNTIyNiwzOTksMTI5NC41MjI2IiBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiLz48bGluZSBzdHlsZT0ic3Ryb2tlOiMxODE4MTg7c3Ryb2tlLXdpZHRoOjEuMDsiIHgxPSIzOTkiIHgyPSIzOTkiIHkxPSI4MDMuNjczNCIgeTI9IjgyMy42NzM0Ii8+PHBvbHlnb24gZmlsbD0iIzE4MTgxOCIgcG9pbnRzPSIzOTUsODEzLjY3MzQsMzk5LDgyMy42NzM0LDQwMyw4MTMuNjczNCwzOTksODE3LjY3MzQiIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIvPjxsaW5lIHN0eWxlPSJzdHJva2U6IzE4MTgxODtzdHJva2Utd2lkdGg6MS4wOyIgeDE9IjM5OSIgeDI9IjM5OSIgeTE9IjE4My43NTYxIiB5Mj0iMjMyLjgyNDEiLz48cG9seWdvbiBmaWxsPSIjMTgxODE4IiBwb2ludHM9IjM5NSwyMjIuODI0MSwzOTksMjMyLjgyNDEsNDAzLDIyMi44MjQxLDM5OSwyMjYuODI0MSIgc3R5bGU9InN0cm9rZTojMTgxODE4O3N0cm9rZS13aWR0aDoxLjA7Ii8+PCEtLVNSQz1baExIRFJuZW40QnRkTHVtdTRMSHdwMjR2TEFZZUFaUzRvaGFvellvdUNWUk03YURIYlZfVWlSdGkxb0dnYU5mWUZId19VT3p2Q20wMGZDYVdoNlJwblZDUVppd19MQ09UZU44VTM4ZzA4OG5uS2YxczVoRzVzWTdDbHR6VDdYdVdlMy1XbHNDOFU1bUEtTzg0QXZJZTN3WVVJZEdURHZRWlFwR2U0cTA5MW5BVXliVkQ3cGVaWm9RSmE5Q1ZWZUlTRlBjMEo5S1paVTFGSmNReTVQQk5VNDNtYzhlTktmTHRVell2R0ZuMENobDRGQjZLcU5rcUxBdzRMTDBBVjd2Z3E3RzV1cktWbnFNaGxqb2RqblI2OW1wdEpVOVJnSHU0QTVyTGM0aUt2QlZWUGpmNUt3UExTZTVTRlpjQkhLMHd6NUlyQjA3R1MxRjZyZE1HUUJkcU5HXy1YZHo1UjhORTNQSWZmcHFZSG43b21xR0dMUV9rZlVZWmZicTFLbzI4SXN1WU9OWE56M0VOa1NoLWJ6UGEzYlZWQUZ0b2pkX3RrRU9KcEFKNDRBT2hfMUtuTjdNLVRaUldjTndKY2R2ZzZkUi1jblR4TERDNVV0dXdLdWdQWHF1SXI0YzlsUTd2TlVGdFdrSUUzTklFOUJDd0l6b1dhMC1COU9YSXZtQ3M2MzJUQmZxcF92TmFEV2dsazlVUkstNWhUM0EtRDY5MGFnNWM4VVlqdlQ3RTJ1NjEtZ2RTemVQQTF0S0c5bDhXTDMxYV92NDlNQmV3NmE3NXJwdEpQeWtVdExPQ1ZqUXBjRVVUYTJ2aEhxbjgyekRtcDVBMUh4cGgwbURHejlRVmptUGs1Y1BQV1l0UEdoTnJ0Sy1rc1I3a1VSaWxlMHNfTllfNWw4QXhkVlc5c1gwbDdablVIM1JRZ2VqR19YWjQ1Nzk3eDMyNmxzbGppVGt2T05Hdkh4bVNJVGxqVVBQMFg5RUxFLSAtaVl5NlM2bHNsVm00MF0tLT48L2c+PC9zdmc+" y="1492.1358"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="4" x="17" y="2944.1018"> </text> + </g> + <!--SRC=[xLLDRnen4BtpAqOv4LHwYlQG72fKL9NR2fHJLKN6EmjkZBsrlKjHn7_ls5xO3wXArBJgWGlOu_6RDplFCv8jKS8JV1aC05vUw0V02ISHvfFfx741MssUSwcta6i34fb5O59gpfpG2eG2jqQOVlwOLdTWqLHe0iPzolWpEfWZHr5XzX2jYtAfoBf0YTm3HBDrpBYmAcWX0lBDQ6I3yzsJ3TwZ4N0VkNGt47aItXoT4LWX6FJ18wdSw0sijNLqWHCxpzopvAKng5myOYg36E3zGuqcSXZEspYwLDc7MtzNmN27zhPsFETgW44cyXn3Y8Xy_cwW7NCAjA8lE1rsMc5Cm6zQMHrP0g2a8WoLRY1HKUX12_w2hy9MJ8G2Sb_J5f4ji-6Y9uXPAsu_wQrmwmYM0NCKSbawjBzC-f72d7Z_BbSl3brSc7h_j7rslw0TJ3X7QyTp_5wYFQbyePN50_tQrVyLhblvJuPjC1lFql4aouYtRHA2mkUXBYXzK_ODStnDyZbOl5IrSbGU6pQp55YCymeHT7ccMiit9RagcSceaijTv2k5bpsNh4EIe2RMYfMYXntQ0G6rNQdeDPK6gcAof6UGGvVzQ_IVwgAKp4LLjoGV17lGMfJt8P_PD7G4VrXeHuG4apN7a2hG0s_gG02kD8gk7-LRjylO0eza8zMZwhvHp8PrIzdj18xc_MbB30suwOZlu6YYjeFRdYKiEhOCwVEhhWr_5C9WqrxjJV_9K1zqGgqEpmQOtIc-DbhfqifTdQndkz__-HX9_iuOIQvZv3f6_jCnKYNNGN8T9Fz-a2IdWoGv6IJUiXGgwvdwioKvCrkIjvujNmS_0G00]--> + </g> +</svg> diff --git a/doc/sphinx/uml/radius.uml b/doc/sphinx/uml/radius.uml new file mode 100644 index 0000000..8baad5b --- /dev/null +++ b/doc/sphinx/uml/radius.uml @@ -0,0 +1,91 @@ +@startuml + +label _ [ + + {{ + title RADIUS workflow for lease allocation in the DHCPv4 server + :Packet Received; + :Subnet Selection; + start + partition "**subnet4_select** callout" { + :Retrieve reservation from host cache for the current host and subnet.; + if (Reservation found?) then (yes) + if (Reservation for a different subnet?) then (yes) + :Reselect the subnet to the one from the reservation.; + else (no) + endif + :Retrieve reservation from host cache again in case the subnet was reselected.; + if (Reservation with cached attributes?) then (yes) + :Use cached attributes from the reservation.; + stop + else (no) + endif + else (no) + endif + :Send Access-Request.; + if (Response) then (Access-Accept) + if (Framed-IP-Address attribute present?) then (yes) + :Reselect subnet to match a subnet the contains the IP address.; + else (no) + endif + if (Framed-IP-Pool attribute present?) then (yes) + :Reselect subnet to match a subnet guarded by the client class.; + :Assign packet to client class represented by the value of Framed-IP-Pool.; + else (no) + endif + :Populate the host cache with the reselected subnet ID and the potential class guard or IP address returned from the RADIUS server.; + else (Access-Reject) + stop + endif + stop + } + partition "**lease4_select**, **lease4_renew**, **lease4_release**, **lease4_decline**, **lease4_expire** callouts" + :Send Accounting-Request asynchronously.; + } + }} + + {{ + title RADIUS workflow for lease allocation in the DHCPv6 server + :Packet Received; + :Subnet Selection; + start + partition "**subnet6_select** callout" { + :Retrieve reservation from host cache for the current host and subnet.; + if (Reservation found?) then (yes) + if (Reservation for a different subnet?) then (yes) + :Reselect the subnet to the one from the reservation.; + else (no) + endif + :Retrieve reservation from host cache again in case the subnet was reselected.; + if (Reservation with cached attributes?) then (yes) + :Use cached attributes from the reservation.; + stop + else (no) + endif + else (no) + endif + :Send Access-Request.; + if (Response) then (Access-Accept) + if (Framed-IPv6-Address attribute present?) then (yes) + :Reselect subnet to match a subnet the contains the IP address.; + else (no) + endif + if (Framed-IP-Pool attribute present?) then (yes) + :Reselect subnet to match a subnet guarded by the client class.; + :Assign packet to client class represented by the value of Framed-IP-Pool.; + else (no) + endif + :Populate the host cache with the reselected subnet ID and the potential class guard or IP address returned from the RADIUS server.; + else (Access-Reject) + stop + endif + stop + } + partition "**lease6_select**, **lease6_renew**, **lease6_rebind**, **lease6_release**, **lease6_decline**, **lease6_expire** callouts" + :Send Accounting-Request asynchronously.; + } + }} + +] + +@enduml diff --git a/doc/sphinx/uml/recognizing-same-client.png b/doc/sphinx/uml/recognizing-same-client.png Binary files differnew file mode 100644 index 0000000..3a5a526 --- /dev/null +++ b/doc/sphinx/uml/recognizing-same-client.png diff --git a/doc/sphinx/uml/recognizing-same-client.svg b/doc/sphinx/uml/recognizing-same-client.svg new file mode 100644 index 0000000..37f5cbc --- /dev/null +++ b/doc/sphinx/uml/recognizing-same-client.svg @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="472px" preserveAspectRatio="none" style="width:1806px;height:472px;background:#FFFFFF;" version="1.1" viewBox="0 0 1806 472" width="1806px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="527" x="638.375" y="34.9659">How Kea Recognizes the Same Client In Different DHCP Messages (Kea 2.4.0)</text> + <ellipse cx="765.4688" cy="60.0679" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="699.4688,90.0679,831.4688,90.0679,843.4688,102.0679,831.4688,114.0679,699.4688,114.0679,687.4688,102.0679,699.4688,90.0679" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="132" x="699.4688" y="106.3359">libdhcp_flex_id.so is used</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="670.4688" y="98.8449">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="843.4688" y="98.8449">no</text> + <polygon fill="#F1F1F1" points="158.6875,124.0679,344.6875,124.0679,356.6875,136.0679,344.6875,148.0679,158.6875,148.0679,146.6875,136.0679,158.6875,124.0679" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="186" x="158.6875" y="140.3359">replace-client-id is true (the default)</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="129.6875" y="132.8449">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="356.6875" y="132.8449">no</text> + <rect fill="#98FB98" height="101.7206" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="11" y="158.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="21" y="180.896">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="104" x="21" y="197.2401">by the result of the</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="50" x="21" y="213.5842">identifier</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="74" x="21" y="229.9283">expression in</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="99" x="21" y="246.2725">libdhcp_flex_id.so.</text> + <ellipse cx="75.5" cy="305.7885" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="75.5" cy="305.7885" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="367.375,158.0679,488.375,158.0679,500.375,170.0679,488.375,182.0679,367.375,182.0679,355.375,170.0679,367.375,158.0679" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="121" x="367.375" y="174.3359">client has a reservation</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="338.375" y="166.8449">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="500.375" y="166.8449">no</text> + <polygon fill="#F1F1F1" points="318,242.9774,318,242.9774,330,254.9774,318,266.9774,318,266.9774,306,254.9774,318,242.9774" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="83" x="170" y="236.7725">for the purpose</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="136" x="170" y="251.7544">of acquiring a reservation</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="83" x="330" y="191.8268">for the purpose</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="102" x="330" y="206.8087">of leasing outside a</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="128" x="330" y="221.7906">reservation or acquiring</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="124" x="330" y="236.7725">any other value outside</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="79" x="330" y="251.7544">of reservations</text> + <rect fill="#98FB98" height="101.7206" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="181.75" y="276.9774"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="191.75" y="299.8054">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="104" x="191.75" y="316.1496">by the result of the</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="50" x="191.75" y="332.4937">identifier</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="74" x="191.75" y="348.8378">expression in</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="99" x="191.75" y="365.1819">libdhcp_flex_id.so.</text> + <ellipse cx="246.25" cy="424.6979" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="246.25" cy="424.6979" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="101.7206" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="118" x="330.75" y="276.9774"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="84" x="340.75" y="299.8054">Go through the</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="98" x="340.75" y="316.1496">diagram from the</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="81" x="340.75" y="332.4937">beginning as if</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="96" x="340.75" y="348.8378">libdhcp_flex_id.so</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="56" x="340.75" y="365.1819">is unused.</text> + <ellipse cx="389.75" cy="424.6979" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="389.75" cy="424.6979" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="101.7206" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="118" x="478.75" y="192.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="84" x="488.75" y="214.896">Go through the</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="98" x="488.75" y="231.2401">diagram from the</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="81" x="488.75" y="247.5842">beginning as if</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="96" x="488.75" y="263.9283">libdhcp_flex_id.so</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="56" x="488.75" y="280.2725">is unused.</text> + <ellipse cx="537.75" cy="339.7885" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="537.75" cy="339.7885" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="1305.75,124.0679,1352.75,124.0679,1364.75,146.5407,1352.75,169.0136,1305.75,169.0136,1293.75,146.5407,1305.75,124.0679" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="42" x="1305.75" y="135.8268">DHCPv4</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="12" x="1305.75" y="150.8087">or</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="47" x="1305.75" y="165.7906">DHCPv6?</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="42" x="1251.75" y="143.3178">DHCPv4</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="42" x="1364.75" y="143.3178">DHCPv6</text> + <polygon fill="#F1F1F1" points="1052.25,179.0136,1104.25,179.0136,1116.25,201.4864,1104.25,223.9592,1052.25,223.9592,1040.25,201.4864,1052.25,179.0136" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="24" x="1052.25" y="190.7725">MAC</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="52" x="1052.25" y="205.7544">address is</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="40" x="1052.25" y="220.7363">present</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1023.25" y="198.2634">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1116.25" y="198.2634">no</text> + <polygon fill="#F1F1F1" points="885.75,233.9592,963.75,233.9592,975.75,256.4321,963.75,278.9049,885.75,278.9049,873.75,256.4321,885.75,233.9592" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="78" x="885.75" y="245.7182">match-client-id</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="33" x="885.75" y="260.7">is true</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="63" x="885.75" y="275.6819">(the default)</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="856.75" y="253.2091">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="975.75" y="253.2091">no</text> + <polygon fill="#F1F1F1" points="693.25,288.9049,877.25,288.9049,889.25,300.9049,877.25,312.9049,693.25,312.9049,681.25,300.9049,693.25,288.9049" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="184" x="693.25" y="305.1729">client ID option (code 61) is present</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="664.25" y="297.6819">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="889.25" y="297.6819">no</text> + <rect fill="#98FB98" height="69.0323" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="606.75" y="322.9049"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="616.75" y="345.733">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="83" x="616.75" y="362.0771">by the client ID</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="93" x="616.75" y="378.4212">option (code 61).</text> + <ellipse cx="671.25" cy="437.9373" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="671.25" cy="437.9373" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#98FB98" height="52.6882" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="135" x="831.75" y="322.9049"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="841.75" y="345.733">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="115" x="841.75" y="362.0771">by the MAC address.</text> + <ellipse cx="899.25" cy="421.5931" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="899.25" cy="421.5931" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#98FB98" height="52.6882" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="135" x="996.75" y="288.9049"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="1006.75" y="311.733">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="115" x="1006.75" y="328.0771">by the MAC address.</text> + <ellipse cx="1064.25" cy="387.5931" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1064.25" cy="387.5931" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#FFC0CB" height="52.6882" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="140" x="1141.75" y="233.9592"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="120" x="1151.75" y="256.7873">DHCP message is not</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="69" x="1151.75" y="273.1314">well formed.</text> + <ellipse cx="1211.75" cy="332.6475" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1211.75" cy="332.6475" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="1555.75,179.0136,1644.75,179.0136,1656.75,201.4864,1644.75,223.9592,1555.75,223.9592,1543.75,201.4864,1555.75,179.0136" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="43" x="1555.75" y="190.7725">client ID</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="89" x="1555.75" y="205.7544">option (code 1) is</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="40" x="1555.75" y="220.7363">present</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1526.75" y="198.2634">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1656.75" y="198.2634">no</text> + <polygon fill="#F1F1F1" points="1434.75,233.9592,1514.75,233.9592,1526.75,271.414,1514.75,308.8687,1434.75,308.8687,1422.75,271.414,1434.75,233.9592" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="66" x="1434.75" y="245.7182">interested in</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="80" x="1434.75" y="260.7">identifying as a</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="69" x="1434.75" y="275.6819">single client -</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="68" x="1434.75" y="290.6638">the device or</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="46" x="1434.75" y="305.6457">the lease</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="33" x="1389.75" y="268.191">device</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="26" x="1526.75" y="268.191">lease</text> + <rect fill="#98FB98" height="85.3765" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="1331.75" y="318.8687"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="1341.75" y="341.6968">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="83" x="1341.75" y="358.0409">by the client ID</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="106" x="1341.75" y="374.385">option (code 1) aka</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="34" x="1341.75" y="390.7291">DUID.</text> + <ellipse cx="1396.25" cy="450.2451" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1396.25" cy="450.2451" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#98FB98" height="69.0323" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="145" x="1480.75" y="318.8687"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="1490.75" y="341.6968">Client is recognized</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="65" x="1490.75" y="358.0409">by the tuple</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="125" x="1490.75" y="374.385"><DUID, IA-type, IAID>.</text> + <ellipse cx="1553.25" cy="433.901" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1553.25" cy="433.901" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#FFC0CB" height="52.6882" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="140" x="1655.75" y="233.9592"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="120" x="1665.75" y="256.7873">DHCP message is not</text> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="69" x="1665.75" y="273.1314">well formed.</text> + <ellipse cx="1725.75" cy="332.6475" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1725.75" cy="332.6475" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="75.5" x2="75.5" y1="259.7885" y2="294.7885"/> + <polygon fill="#181818" points="71.5,284.7885,75.5,294.7885,79.5,284.7885,75.5,288.7885" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="246.25" x2="246.25" y1="378.6979" y2="413.6979"/> + <polygon fill="#181818" points="242.25,403.6979,246.25,413.6979,250.25,403.6979,246.25,407.6979" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="389.75" x2="389.75" y1="378.6979" y2="413.6979"/> + <polygon fill="#181818" points="385.75,403.6979,389.75,413.6979,393.75,403.6979,389.75,407.6979" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="306" x2="246.25" y1="254.9774" y2="254.9774"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="246.25" x2="246.25" y1="254.9774" y2="276.9774"/> + <polygon fill="#181818" points="242.25,266.9774,246.25,276.9774,250.25,266.9774,246.25,270.9774" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="330" x2="389.75" y1="254.9774" y2="254.9774"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="389.75" x2="389.75" y1="254.9774" y2="276.9774"/> + <polygon fill="#181818" points="385.75,266.9774,389.75,276.9774,393.75,266.9774,389.75,270.9774" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="537.75" x2="537.75" y1="293.7885" y2="328.7885"/> + <polygon fill="#181818" points="533.75,318.7885,537.75,328.7885,541.75,318.7885,537.75,322.7885" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="355.375" x2="318" y1="170.0679" y2="170.0679"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="318" x2="318" y1="170.0679" y2="242.9774"/> + <polygon fill="#181818" points="314,232.9774,318,242.9774,322,232.9774,318,236.9774" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="500.375" x2="537.75" y1="170.0679" y2="170.0679"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="537.75" x2="537.75" y1="170.0679" y2="192.0679"/> + <polygon fill="#181818" points="533.75,182.0679,537.75,192.0679,541.75,182.0679,537.75,186.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="146.6875" x2="75.5" y1="136.0679" y2="136.0679"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="75.5" x2="75.5" y1="136.0679" y2="158.0679"/> + <polygon fill="#181818" points="71.5,148.0679,75.5,158.0679,79.5,148.0679,75.5,152.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="356.6875" x2="427.875" y1="136.0679" y2="136.0679"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="427.875" x2="427.875" y1="136.0679" y2="158.0679"/> + <polygon fill="#181818" points="423.875,148.0679,427.875,158.0679,431.875,148.0679,427.875,152.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="671.25" x2="671.25" y1="391.9373" y2="426.9373"/> + <polygon fill="#181818" points="667.25,416.9373,671.25,426.9373,675.25,416.9373,671.25,420.9373" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="899.25" x2="899.25" y1="375.5931" y2="410.5931"/> + <polygon fill="#181818" points="895.25,400.5931,899.25,410.5931,903.25,400.5931,899.25,404.5931" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="681.25" x2="671.25" y1="300.9049" y2="300.9049"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="671.25" x2="671.25" y1="300.9049" y2="322.9049"/> + <polygon fill="#181818" points="667.25,312.9049,671.25,322.9049,675.25,312.9049,671.25,316.9049" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="889.25" x2="899.25" y1="300.9049" y2="300.9049"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="899.25" x2="899.25" y1="300.9049" y2="322.9049"/> + <polygon fill="#181818" points="895.25,312.9049,899.25,322.9049,903.25,312.9049,899.25,316.9049" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1064.25" x2="1064.25" y1="341.5931" y2="376.5931"/> + <polygon fill="#181818" points="1060.25,366.5931,1064.25,376.5931,1068.25,366.5931,1064.25,370.5931" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="873.75" x2="785.25" y1="256.4321" y2="256.4321"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="785.25" x2="785.25" y1="256.4321" y2="288.9049"/> + <polygon fill="#181818" points="781.25,278.9049,785.25,288.9049,789.25,278.9049,785.25,282.9049" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="975.75" x2="1064.25" y1="256.4321" y2="256.4321"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1064.25" x2="1064.25" y1="256.4321" y2="288.9049"/> + <polygon fill="#181818" points="1060.25,278.9049,1064.25,288.9049,1068.25,278.9049,1064.25,282.9049" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1211.75" x2="1211.75" y1="286.6475" y2="321.6475"/> + <polygon fill="#181818" points="1207.75,311.6475,1211.75,321.6475,1215.75,311.6475,1211.75,315.6475" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1040.25" x2="924.75" y1="201.4864" y2="201.4864"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="924.75" x2="924.75" y1="201.4864" y2="233.9592"/> + <polygon fill="#181818" points="920.75,223.9592,924.75,233.9592,928.75,223.9592,924.75,227.9592" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1116.25" x2="1211.75" y1="201.4864" y2="201.4864"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1211.75" x2="1211.75" y1="201.4864" y2="233.9592"/> + <polygon fill="#181818" points="1207.75,223.9592,1211.75,233.9592,1215.75,223.9592,1211.75,227.9592" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1396.25" x2="1396.25" y1="404.2451" y2="439.2451"/> + <polygon fill="#181818" points="1392.25,429.2451,1396.25,439.2451,1400.25,429.2451,1396.25,433.2451" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1553.25" x2="1553.25" y1="387.901" y2="422.901"/> + <polygon fill="#181818" points="1549.25,412.901,1553.25,422.901,1557.25,412.901,1553.25,416.901" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1422.75" x2="1396.25" y1="271.414" y2="271.414"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1396.25" x2="1396.25" y1="271.414" y2="318.8687"/> + <polygon fill="#181818" points="1392.25,308.8687,1396.25,318.8687,1400.25,308.8687,1396.25,312.8687" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1526.75" x2="1553.25" y1="271.414" y2="271.414"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1553.25" x2="1553.25" y1="271.414" y2="318.8687"/> + <polygon fill="#181818" points="1549.25,308.8687,1553.25,318.8687,1557.25,308.8687,1553.25,312.8687" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1725.75" x2="1725.75" y1="286.6475" y2="321.6475"/> + <polygon fill="#181818" points="1721.75,311.6475,1725.75,321.6475,1729.75,311.6475,1725.75,315.6475" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1543.75" x2="1474.75" y1="201.4864" y2="201.4864"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1474.75" x2="1474.75" y1="201.4864" y2="233.9592"/> + <polygon fill="#181818" points="1470.75,223.9592,1474.75,233.9592,1478.75,223.9592,1474.75,227.9592" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1656.75" x2="1725.75" y1="201.4864" y2="201.4864"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1725.75" x2="1725.75" y1="201.4864" y2="233.9592"/> + <polygon fill="#181818" points="1721.75,223.9592,1725.75,233.9592,1729.75,223.9592,1725.75,227.9592" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1293.75" x2="1078.25" y1="146.5407" y2="146.5407"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1078.25" x2="1078.25" y1="146.5407" y2="179.0136"/> + <polygon fill="#181818" points="1074.25,169.0136,1078.25,179.0136,1082.25,169.0136,1078.25,173.0136" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1364.75" x2="1600.25" y1="146.5407" y2="146.5407"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1600.25" x2="1600.25" y1="146.5407" y2="179.0136"/> + <polygon fill="#181818" points="1596.25,169.0136,1600.25,179.0136,1604.25,169.0136,1600.25,173.0136" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="687.4688" x2="251.6875" y1="102.0679" y2="102.0679"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="251.6875" x2="251.6875" y1="102.0679" y2="124.0679"/> + <polygon fill="#181818" points="247.6875,114.0679,251.6875,124.0679,255.6875,114.0679,251.6875,118.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="843.4688" x2="1329.25" y1="102.0679" y2="102.0679"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1329.25" x2="1329.25" y1="102.0679" y2="124.0679"/> + <polygon fill="#181818" points="1325.25,114.0679,1329.25,124.0679,1333.25,114.0679,1329.25,118.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="765.4688" x2="765.4688" y1="70.0679" y2="90.0679"/> + <polygon fill="#181818" points="761.4688,80.0679,765.4688,90.0679,769.4688,80.0679,765.4688,84.0679" style="stroke:#181818;stroke-width:1.0;"/> + <!--SRC=[nLLDRzim3BthLn3eeGcGfDjGzD0D6ue6M8CjmD2jvqAnQKUeB7cIdDJxzIDbEz_9sbvsIMnBudkFVAGkpiMlkVBmCFqEbKSFOOvWS0c-Da4-Wyr09a4jLAWXLJ9til2GELj0gQK9LQ57ui5areNAo82w7e0A8BMtuD1NEdXG1YGKrY4iLOhWIuSovS0CrMnI9XSBvIkfEv01K8IuFynbu9WpJ6n112l3v-LCKxmvKkmgs486bKYjQ-7f3rD8xT8mC4FSt4z744Kgts9ARmqGwVWgyvnOUBMWWDQbOkbaMH8ZGjHs2KC8blSc67Ut_FZZ345RawC3QLBG52Co7l2ha9vKD-eeH9JVyHw9ymiXV90k215K82Lt1FGD9ToJoDoeFsqXVie2uLOhD04c1iOgoz3no_ZkzWTC2L7cjBN7Hp-CBaVl-aAe37fQpT9vKZvc6fyVLJgYN99sgc_QvxW6UZNwlW3WpGwfb0aEauWpL6dCawiGUb4mPf94z7TE0foLb6fA7PhhbYATSvs0DEwPrHjLRciU5oXF9gXCeOkl-5p66bYkMlooBs7qCIxuO4jwGEs9eB4D5zRHy8Tvbtbq2xA5DNl4c-tTvyu6PULAwr54n_-kb6CBR0TgJxzC-adv1r9mE0qdKx6HZdWwfkI07as6PpMs2fvRIeeDLK3xLuA5D3LOEkvW8JLPe3t2KJRE-7KghhzQWdEsokTRwhe-YRDYSs66kJ8c9fSwCZkXSfqfxdfsxn7T9ctZR9lY6BaZr0uJEqfhdzIAKaUe-TyanSRZtbrS2kj4VBhwqZcnMLWRUdfpAsIQiYC8JR0ro357x4mZC9clUrYqFInEz_1Exqp6OCjeYbvYoIXNx_kiypZoQvfXrGuhi8sbNTYDIc_LUh_6Rw90gOKsjIUGLhuwXFhA6N0OyKKkFgFRwEawZloY6VaCPMnervUeDTzGnKalng2Du_Pc9fLYgm2nxFymd3A1xY8VwBQbMTKEixfj7obuuEXLhOUYiU52qJLApkStdahO1M-MtfpTVKljwf5FShKsVfYCJutGXjbRkOIgrEjnzud11Z2v6OQwH7wOZ3__7mSqqoZ-_WK0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/recognizing-same-client.uml b/doc/sphinx/uml/recognizing-same-client.uml new file mode 100644 index 0000000..ef5b965 --- /dev/null +++ b/doc/sphinx/uml/recognizing-same-client.uml @@ -0,0 +1,113 @@ +@startuml + +/' +This UML uses the new syntax of activity diagrams from plantuml. +Unfortunately, it also results in a more wide spread of the resulting +visual diagram, so wide that it becomes unreadable when automatically +scaled down in the ARM. This is the reason for the aggressive word +wrapping below - to force the diagram to be longer and less wide, and +as a result - more readable. +'/ + +start + +title How Kea Recognizes the Same Client In Different DHCP Messages (Kea 2.4.0) + +if (libdhcp_flex_id.so is used) then (yes) + if (replace-client-id is true (the default)) then (yes) + #palegreen:Client is recognized + by the result of the + identifier + expression in + libdhcp_flex_id.so.; + stop + else (no) + if (client has a reservation) then (yes) + if () then (for the purpose +of acquiring a reservation) + #palegreen:Client is recognized + by the result of the + identifier + expression in + libdhcp_flex_id.so.; + stop + else (for the purpose +of leasing outside a +reservation or acquiring +any other value outside +of reservations) + :Go through the + diagram from the + beginning as if + libdhcp_flex_id.so + is unused.; + stop + endif + else (no) + :Go through the + diagram from the + beginning as if + libdhcp_flex_id.so + is unused.; + stop + endif + endif +else (no) + if (DHCPv4 +or +DHCPv6?) then (DHCPv4) + if (MAC +address is +present) then (yes) + if (match-client-id +is true +(the default)) then (yes) + if (client ID option (code 61) is present) then (yes) + #palegreen:Client is recognized + by the client ID + option (code 61).; + stop + else (no) + #palegreen:Client is recognized + by the MAC address.; + stop + endif + else (no) + #palegreen:Client is recognized + by the MAC address.; + stop + endif + else (no) + #pink:DHCP message is not + well formed.; + stop + endif + else (DHCPv6) + if (client ID +option (code 1) is +present) then (yes) + if (interested in +identifying as a +single client - +the device or +the lease) then (device) + #palegreen:Client is recognized + by the client ID + option (code 1) aka + DUID.; + stop + else (lease) + #palegreen:Client is recognized + by the tuple + <DUID, IA-type, IAID>.; + stop + endif + else (no) + #pink:DHCP message is not + well formed.; + stop + endif + endif +endif + +@enduml diff --git a/doc/sphinx/uml/request4-lease.png b/doc/sphinx/uml/request4-lease.png Binary files differnew file mode 100644 index 0000000..23b95cd --- /dev/null +++ b/doc/sphinx/uml/request4-lease.png diff --git a/doc/sphinx/uml/request4-lease.svg b/doc/sphinx/uml/request4-lease.svg new file mode 100644 index 0000000..2a8a0a2 --- /dev/null +++ b/doc/sphinx/uml/request4-lease.svg @@ -0,0 +1,437 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="2463px" preserveAspectRatio="none" style="width:2209px;height:2463px;background:#FFFFFF;" version="1.1" viewBox="0 0 2209 2463" width="2209px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="312" x="941.5" y="24.9659">Allocate a lease for DHCPREQUEST (Kea 1.8.0)</text> + <!--cluster check_hint--> + <g id="cluster_check_hint"> + <rect fill="none" height="392.85" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="926" x="903" y="277.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="174" x="1279" y="294.1739">Check requested address</text> + </g> + <!--cluster get_existing--> + <g id="cluster_get_existing"> + <rect fill="none" height="172.92" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="235" x="1554" y="379.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="219" x="1562" y="396.0339">Get lease for requested address</text> + </g> + <!--cluster check_done--> + <g id="cluster_check_done"> + <rect fill="none" height="172.93" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="154" x="447" y="737.0579"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="123" x="462.5" y="754.0239">Check client lease</text> + </g> + <!--cluster new_lease--> + <g id="cluster_new_lease"> + <rect fill="none" height="1404.29" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="1087" x="7" y="958.9879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="140" x="480.5" y="975.9539">Allocate a new lease</text> + </g> + <!--cluster allocateOrReuseLease4--> + <g id="cluster_allocateOrReuseLease4"> + <rect fill="none" height="710.3" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="293" x="55" y="1526.9079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="156" x="123.5" y="1543.8739">Allocate or reuse lease</text> + </g> + <!--cluster allocateUnreservedLease4--> + <g id="cluster_allocateUnreservedLease4"> + <rect fill="none" height="614.02" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="502" x="388" y="1086.8479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="177" x="550.5" y="1103.8139">Allocate unreserved lease</text> + </g> + <!--entity getReservedLease--> + <g id="elem_getReservedLease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="243" x="1086.5" y="488.9279"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="223" x="1096.5" y="513.8939">Check lease for reserved address</text> + </g> + <!--entity out_of_pool--> + <g id="elem_out_of_pool"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="196" x="973" y="606.9879"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="176" x="983" y="631.9539">Check out-of-pool address</text> + </g> + <!--entity existing--> + <g id="elem_existing"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="172" x="1593" y="488.9279"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="152" x="1603" y="513.8939">Check requested lease</text> + </g> + <!--entity client_lease--> + <g id="elem_client_lease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="106" x="471" y="846.9179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="86" x="481" y="871.8839">Check renew</text> + </g> + <!--entity create--> + <g id="elem_create"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="147" x="922.5" y="1773.8679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="127" x="932.5" y="1798.8339">Create a new lease</text> + </g> + <!--entity old_lease--> + <g id="elem_old_lease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="127" x="703.5" y="2300.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="107" x="713.5" y="2325.1739">Delete old lease</text> + </g> + <!--entity candidate--> + <g id="elem_candidate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="153" x="166.5" y="1637.8079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="133" x="176.5" y="1662.7739">Get candidate lease</text> + </g> + <!--entity reuseExpiredLease4--> + <g id="elem_reuseExpiredLease4"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="155" x="104.5" y="1773.8679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="135" x="114.5" y="1798.8339">Reuse expired lease</text> + </g> + <!--entity reclaimExpiredLease--> + <g id="elem_reclaimExpiredLease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="167" x="97.5" y="1873.9379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="147" x="107.5" y="1898.9039">Reclaim expired lease</text> + </g> + <!--entity updateLease4Information--> + <g id="elem_updateLease4Information"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="190" x="81" y="1974.0079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="170" x="91" y="1998.9739">update lease information</text> + </g> + <!--entity lease4_select--> + <g id="elem_lease4_select"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="159" x="78.5" y="2074.0779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="88.5" y="2099.0439">Callout lease4_select</text> + </g> + <g id="elem_GMN23"> + <path d="M272,2079.7579 L272,2089.6079 L237.84,2093.6079 L272,2097.6079 L272,2107.4639 A0,0 0 0 0 272,2107.4639 L324,2107.4639 A0,0 0 0 0 324,2107.4639 L324,2089.7579 L314,2079.7579 L272,2079.7579 A0,0 0 0 0 272,2079.7579 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M314,2079.7579 L314,2089.7579 L324,2089.7579 L314,2079.7579 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="31" x="278" y="2098.6549">hook</text> + </g> + <!--entity updateLease4--> + <g id="elem_updateLease4"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="108" x="188" y="2174.1479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="88" x="198" y="2199.1139">Update lease</text> + </g> + <!--entity iterate--> + <g id="elem_iterate"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="193" x="426.5" y="1178.7079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="173" x="436.5" y="1203.6739">Iterate pools and subnets</text> + </g> + <!--entity pick--> + <g id="elem_pick"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="104" x="486" y="1296.7779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="84" x="496" y="1321.7439">Pick address</text> + </g> + <!--entity pick_reserved--> + <g id="elem_pick_reserved"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="198" x="607" y="1414.8379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="617" y="1439.8039">Check reserved addressed</text> + </g> + <!--entity mt_in_use--> + <g id="elem_mt_in_use"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="285" x="482.5" y="1537.7379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="265" x="492.5" y="1562.7039">Check already in use by another thread</text> + </g> + <!--entity pick_lease--> + <g id="elem_pick_lease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="99" x="451.5" y="1637.8079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="79" x="461.5" y="1662.7739">Check lease</text> + </g> + <!--entity findClientLease--> + <g id="elem_findClientLease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="1335.5" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="109" x="1345.5" y="72.0339">Find client lease</text> + </g> + <g id="elem_GMN3"> + <path d="M1500,52.7479 L1500,62.5979 L1464.97,66.5979 L1500,70.5979 L1500,80.4539 A0,0 0 0 0 1500,80.4539 L1588,80.4539 A0,0 0 0 0 1588,80.4539 L1588,62.7479 L1578,52.7479 L1500,52.7479 A0,0 0 0 0 1500,52.7479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1578,52.7479 L1578,62.7479 L1588,62.7479 L1578,52.7479 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="67" x="1506" y="71.6449">entry point</text> + </g> + <!--entity addressReserved--> + <g id="elem_addressReserved"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="213" x="1564.5" y="165.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="193" x="1574.5" y="190.1039">Check requested reservation</text> + </g> + <!--entity hasAddressReservation--> + <g id="elem_hasAddressReservation"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="123" x="1068.5" y="165.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="103" x="1078.5" y="190.1039">Get reservation</text> + </g> + <!--entity update_hint--> + <g id="elem_update_hint"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="200" x="1330" y="165.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="180" x="1340" y="190.1039">Update requested address</text> + </g> + <!--entity no_lease--> + <g id="elem_no_lease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="126" x="1382" y="2300.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="106" x="1392" y="2325.1739">Return no lease</text> + </g> + <g id="elem_GMN36"> + <path d="M1543,2305.8979 L1543,2315.7479 L1508.42,2319.7479 L1543,2323.7479 L1543,2333.6039 A0,0 0 0 0 1543,2333.6039 L1621,2333.6039 A0,0 0 0 0 1621,2333.6039 L1621,2315.8979 L1611,2305.8979 L1543,2305.8979 A0,0 0 0 0 1543,2305.8979 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1611,2305.8979 L1611,2315.8979 L1621,2315.8979 L1611,2305.8979 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="1549" y="2324.7949">exit point</text> + </g> + <!--entity renew--> + <g id="elem_renew"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="168" x="927" y="846.9179"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="148" x="937" y="871.8839">Return renewed lease</text> + </g> + <g id="elem_GMN40"> + <path d="M1130,852.5979 L1130,862.4479 L1095.25,866.4479 L1130,870.4479 L1130,880.3039 A0,0 0 0 0 1130,880.3039 L1208,880.3039 A0,0 0 0 0 1208,880.3039 L1208,862.5979 L1198,852.5979 L1130,852.5979 A0,0 0 0 0 1130,852.5979 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M1198,852.5979 L1198,862.5979 L1208,862.5979 L1198,852.5979 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="1136" y="871.4949">exit point</text> + </g> + <!--entity return--> + <g id="elem_return"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="714.5" y="2418.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="85" x="724.5" y="2443.2439">Return lease</text> + </g> + <g id="elem_GMN44"> + <path d="M854,2423.9579 L854,2433.8179 L819.66,2437.8179 L854,2441.8179 L854,2451.6639 A0,0 0 0 0 854,2451.6639 L932,2451.6639 A0,0 0 0 0 932,2451.6639 L932,2433.9579 L922,2423.9579 L854,2423.9579 A0,0 0 0 0 854,2423.9579 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M922,2423.9579 L922,2433.9579 L932,2433.9579 L922,2423.9579 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="860" y="2442.8549">exit point</text> + </g> + <!--link findClientLease to addressReserved--> + <g id="link_findClientLease_addressReserved"> + <path d="M1444.14,86.5079 C1492.67,107.2879 1570.45,140.6079 1621.14,162.3179 " fill="none" id="findClientLease-to-addressReserved" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1625.48,164.1779,1618.7834,156.9561,1620.8843,162.2083,1615.632,164.3092,1625.48,164.1779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="170" x="1552" y="131.0349">has requested address (hint)</text> + </g> + <!--link findClientLease to hasAddressReservation--> + <g id="link_findClientLease_hasAddressReservation"> + <path d="M1356.02,86.5079 C1307.67,107.2879 1230.18,140.6079 1179.68,162.3179 " fill="none" id="findClientLease-to-hasAddressReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1175.35,164.1679,1185.198,164.2992,1179.9457,162.1983,1182.0466,156.9461,1175.35,164.1679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="165" x="1282" y="131.0349">no requested address (hint)</text> + </g> + <!--link addressReserved to check_hint--> + <g id="link_addressReserved_check_hint"> + <path d="M1653.97,204.5579 C1638.88,221.2929 1616.365,246.2654 1597.3888,267.3129 C1595.0167,269.9439 1592.7,272.5135 1590.4599,274.998 C1589.8999,275.6191 1589.3447,276.2349 1588.7946,276.8451 " fill="none" id="addressReserved-to-check_hint" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1588.7946,276.8451,1597.792,272.8392,1592.1427,273.1315,1591.8504,267.4822,1588.7946,276.8451" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="152" x="1627" y="249.1049">no conflicting reservation</text> + </g> + <!--link addressReserved to no_lease--> + <g id="link_addressReserved_no_lease"> + <path d="M1771.76,204.6379 C1863.26,224.8279 1984,260.2479 1984,306.5679 C1984,306.5679 1984,306.5679 1984,2194.6779 C1984,2299.1179 1627.93,2277.4479 1526,2300.2079 C1522.21,2301.0579 1518.33,2301.9279 1514.4,2302.8179 " fill="none" id="addressReserved-to-no_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1509.69,2303.8779,1519.3488,2305.8034,1514.5679,2302.7797,1517.5916,2297.9988,1509.69,2303.8779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="216" x="1985" y="1262.6749">reservation owned by another client</text> + </g> + <!--link hasAddressReservation to update_hint--> + <g id="link_hasAddressReservation_update_hint"> + <path d="M1191.8,184.6679 C1229.64,184.6679 1279.11,184.6679 1323.15,184.6679 " fill="none" id="hasAddressReservation-to-update_hint" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1328.09,184.6679,1319.09,180.6679,1323.09,184.6679,1319.09,188.6679,1328.09,184.6679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="102" x="1209.75" y="177.5649">has a reservation</text> + </g> + <!--link update_hint to check_hint--> + <g id="link_update_hint_check_hint"> + <path d="M1432.09,204.5379 C1434.6,219.2979 1440.09,239.5379 1452,253.2079 C1456.3938,258.2467 1461.3717,262.8532 1466.7236,267.0577 C1469.3996,269.1599 1472.169,271.1616 1475.0056,273.0665 C1476.4239,274.019 1477.859,274.9473 1479.3077,275.8518 C1480.032,276.3041 1480.7597,276.7505 1481.4903,277.1909 " fill="none" id="update_hint-to-check_hint" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1481.4903,277.1909,1475.8477,269.1187,1477.2082,274.6095,1471.7174,275.97,1481.4903,277.1909" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="151" x="1453" y="249.1049">request reserved address</text> + </g> + <!--link hasAddressReservation to check_done--> + <g id="link_hasAddressReservation_check_done"> + <path d="M1068.19,186.7879 C928,191.0079 598,211.0779 598,306.5679 C598,306.5679 598,306.5679 598,627.5279 C598,657.9279 596.79,692.0479 595.56,718.8617 C595.4063,722.2134 595.2522,725.4509 595.1001,728.5528 C595.0241,730.1037 594.9486,731.6207 594.8739,733.1011 C594.8365,733.8413 594.7993,734.5724 594.7624,735.2939 C594.7439,735.6547 594.7255,736.0131 594.7072,736.3691 C594.698,736.5471 594.6889,736.7245 594.6797,736.9013 " fill="none" id="hasAddressReservation-to-check_done" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="594.6797,736.9013,599.1391,728.1198,594.9379,731.9079,591.1497,727.7067,594.6797,736.9013" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="87" x="599" y="454.8249">no reservation</text> + </g> + <!--link check_hint to get_existing--> + <g id="link_check_hint_get_existing"> + <path d="M1562,308.3479 C1562,311.2479 1562,335.5354 1562,359.4554 C1562,365.4354 1562,371.3924 1562,376.9866 C1562,377.6859 1562,378.3795 1562,379.0667 " fill="none" id="check_hint-to-get_existing" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1562,379.0667,1566,370.0667,1562,374.0667,1558,370.0667,1562,379.0667" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link get_existing to existing--> + <g id="link_get_existing_existing"> + <path d="M1562.34,410.1979 C1566.97,414.0679 1618.62,457.1179 1651.62,484.6279 " fill="none" id="get_existing-to-existing" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1655.18,487.5979,1650.8235,478.765,1651.3377,484.3984,1645.7043,484.9126,1655.18,487.5979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="1621" y="454.8249">has requested lease</text> + </g> + <!--link existing to no_lease--> + <g id="link_existing_no_lease"> + <path d="M1679,528.3579 C1679,551.3279 1679,591.2679 1679,625.5279 C1679,625.5279 1679,625.5279 1679,2194.6779 C1679,2232.9179 1580.23,2273.8379 1511.02,2297.8179 " fill="none" id="existing-to-no_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1506.69,2299.3079,1516.502,2300.1591,1511.4175,2297.6797,1513.8969,2292.5952,1506.69,2299.3079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="250" x="1680" y="1439.7749">not expired lease owned by another client</text> + </g> + <!--link get_existing to out_of_pool--> + <g id="link_get_existing_out_of_pool"> + <path d="M1553.7013,410.1388 C1553.4182,410.1466 1553.1282,410.1547 1552.8314,410.163 C1548.0828,410.296 1541.5925,410.4854 1533.6022,410.7367 C1517.6218,411.2395 1495.6421,411.9901 1469.5986,413.0329 C1417.5116,415.1185 1349.1694,418.3729 1280.0562,423.1504 C1141.83,432.7054 1000.52,448.3529 980,472.9279 C952.92,505.3579 959.61,530.9779 980,567.9879 C988.27,583.0079 1002.3,594.6479 1016.9,603.4079 " fill="none" id="get_existing-to-out_of_pool" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1020.98,605.7579,1015.187,597.7929,1016.6503,603.2572,1011.1859,604.7205,1020.98,605.7579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="87" x="981" y="513.8549">no reservation</text> + </g> + <!--link get_existing to out_of_pool--> + <g id="link_get_existing_out_of_pool"> + <path d="M1553.7208,411.9855 C1553.6146,412.0133 1553.5076,412.0414 1553.3996,412.0698 C1553.1837,412.1266 1552.9642,412.1845 1552.7411,412.2435 C1551.8486,412.4797 1550.8989,412.7341 1549.8951,413.0069 C1547.8877,413.5524 1545.6642,414.1711 1543.2506,414.8639 C1533.5963,417.6348 1520.9,421.5892 1506.82,426.7704 C1478.66,437.1329 1444.965,452.4029 1419,472.9279 C1377.42,505.7879 1391.79,539.6579 1347,567.9879 C1296.02,600.2479 1230.15,614.7779 1175.55,621.1779 " fill="none" id="get_existing-to-out_of_pool-1" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1170.79,621.7079,1180.1795,624.6807,1175.7589,621.1511,1179.2885,616.7305,1170.79,621.7079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="156" x="1420" y="513.8549">has requested reservation</text> + </g> + <!--link get_existing to getReservedLease--> + <g id="link_get_existing_getReservedLease"> + <path d="M1553.4552,409.9078 C1552.9981,409.9078 1552.5239,409.908 1552.0329,409.9083 C1551.0509,409.9088 1550.0018,409.9097 1548.8879,409.9113 C1546.6601,409.9143 1544.1733,409.9196 1541.4469,409.9281 C1530.5414,409.9623 1515.8032,410.0482 1498.477,410.249 C1463.8247,410.6507 1418.8206,411.5123 1373.4238,413.3392 C1282.63,416.9929 1190.265,424.5079 1176,439.9279 C1164.54,452.3079 1172.98,469.5379 1184.06,483.4879 " fill="none" id="get_existing-to-getReservedLease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1187.26,487.3079,1184.5539,477.8381,1184.0521,483.4727,1178.4175,482.9708,1187.26,487.3079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="213" x="1177" y="454.8249">has reservation for another address</text> + </g> + <!--link getReservedLease to no_lease--> + <g id="link_getReservedLease_no_lease"> + <path d="M1250.44,528.4779 C1323.43,561.2179 1465,624.7979 1465,625.5279 C1465,625.5279 1465,625.5279 1465,1376.3379 C1465,1412.8479 1470.29,1424.5679 1492,1453.9079 C1505.43,1472.0579 1519.93,1465.4979 1533,1483.9079 C1552.45,1511.3279 1555,1522.6579 1555,1556.2679 C1555,1556.2679 1555,1556.2679 1555,2194.6779 C1555,2238.8979 1515.39,2274.7179 1483.71,2296.3079 " fill="none" id="getReservedLease-to-no_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1479.56,2299.0679,1489.2673,2297.4038,1483.7203,2296.2944,1484.8297,2290.7474,1479.56,2299.0679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="142" x="1493" y="1439.7749">no active reserved lease</text> + </g> + <!--link getReservedLease to out_of_pool--> + <g id="link_getReservedLease_out_of_pool"> + <path d="M1185.68,528.3679 C1161.8,548.5979 1123.9,580.7079 1098.26,602.4279 " fill="none" id="getReservedLease-to-out_of_pool" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1094.46,605.6479,1103.9138,602.8864,1098.2764,602.4176,1098.7452,596.7802,1094.46,605.6479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link out_of_pool to check_done--> + <g id="link_out_of_pool_check_done"> + <path d="M1042.32,646.4379 C1011.08,666.1379 959,696.4079 910,713.0579 C843.42,735.6829 765.5875,748.9629 703.7075,756.6167 C672.7675,760.4435 645.8156,762.8639 626.2525,764.3424 C616.4709,765.0817 608.5366,765.5856 602.8745,765.9122 C602.5206,765.9326 602.1756,765.9523 601.8395,765.9713 C601.6715,765.9808 601.5058,765.9902 601.3422,765.9994 " fill="none" id="out_of_pool-to-check_done" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="601.3422,765.9994,610.5523,769.4885,606.3344,765.719,610.1038,761.5011,601.3422,765.9994" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="269" x="957" y="708.9549">owned reservation for the requested address</text> + </g> + <!--link out_of_pool to check_done--> + <g id="link_out_of_pool_check_done"> + <path d="M972.77,636.7379 C870.54,647.5379 718.2,667.4179 666,694.0579 C646.29,704.1179 628.5475,721.4104 615.49,736.5679 C612.2256,740.3573 609.2541,744.0132 606.6178,747.3894 C605.2996,749.0774 604.0653,750.6955 602.9201,752.2254 C602.3475,752.9903 601.7972,753.7332 601.2698,754.4517 C601.2039,754.5416 601.1383,754.631 601.0731,754.72 " fill="none" id="out_of_pool-to-check_done-1" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="601.0731,754.72,609.6174,749.8216,604.027,750.6859,603.1627,745.0954,601.0731,754.72" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="234" x="667" y="708.9549">requested address is in allowed an pool</text> + </g> + <!--link out_of_pool to no_lease--> + <g id="link_out_of_pool_no_lease"> + <path d="M1154.92,646.5479 C1183.44,656.5979 1213.5,671.6779 1235,694.0579 C1258.67,718.7079 1261,732.2479 1261,766.4179 C1261,766.4179 1261,766.4179 1258,1494.4079 C1258,1740.6479 1335,1796.8379 1335,2043.0779 C1335,2043.0779 1335,2043.0779 1335,2194.6779 C1335,2238.8979 1374.61,2274.7179 1406.29,2296.3079 " fill="none" id="out_of_pool-to-no_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1410.44,2299.0679,1405.1703,2290.7474,1406.2797,2296.2944,1400.7327,2297.4038,1410.44,2299.0679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="269" x="1262" y="1498.8049">address not reserved and not in allowed pool</text> + </g> + <!--link check_done to client_lease--> + <g id="link_check_done_client_lease"> + <path d="M592.8,768.1979 C590.1,772.0079 560.44,813.9479 540.95,841.4879 " fill="none" id="check_done-to-client_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="538.08,845.5579,546.5477,840.5282,540.9713,841.4786,540.0209,835.9022,538.08,845.5579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="99" x="572" y="812.8149">has a client lease</text> + </g> + <!--link client_lease to renew--> + <g id="link_client_lease_renew"> + <path d="M577.04,866.4479 C659.51,866.4479 819.44,866.4479 920.42,866.4479 " fill="none" id="client_lease-to-renew" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="925.18,866.4479,916.18,862.4479,920.18,866.4479,916.18,870.4479,925.18,866.4479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="314" x="595" y="859.3449">requested address was already assigned to the client</text> + </g> + <!--link client_lease to new_lease--> + <g id="link_client_lease_new_lease"> + <path d="M523.84,886.3379 C523.705,903.0729 523.5,928.0454 523.3263,949.0929 C523.3045,951.7239 523.2833,954.2935 523.2628,956.778 C523.2576,957.3991 523.2525,958.0149 523.2475,958.6251 " fill="none" id="client_lease-to-new_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="523.2475,958.6251,527.3218,949.6585,523.2888,953.6252,519.3221,949.5923,523.2475,958.6251" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link new_lease to allocateOrReuseLease4--> + <g id="link_new_lease_allocateOrReuseLease4"> + <path d="M522.5,989.9379 C508.82,992.3279 217,1044.3579 217,1116.2079 C217,1116.2079 217,1116.2079 217,1435.3779 C217,1462.0279 220.6325,1491.7304 224.3225,1515.0242 C224.7838,1517.9359 225.2459,1520.7475 225.702,1523.4404 C225.816,1524.1137 225.9296,1524.7795 226.0428,1525.4376 C226.0993,1525.7667 226.1558,1526.0938 226.2121,1526.419 C226.2403,1526.5816 226.2684,1526.7437 226.2965,1526.9053 " fill="none" id="new_lease-to-allocateOrReuseLease4" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="226.2965,1526.9053,228.6962,1517.3533,225.4403,1521.9791,220.8144,1518.7232,226.2965,1526.9053" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="145" x="218" y="1262.6749">has a requested address</text> + </g> + <!--link new_lease to allocateUnreservedLease4--> + <g id="link_new_lease_allocateUnreservedLease4"> + <path d="M523,989.9379 C523,991.8229 523,1022.4404 523,1053.0504 C523,1060.7029 523,1068.3549 523,1075.5574 C523,1079.1587 523,1082.6476 523,1085.9679 C523,1086.1754 523,1086.3823 523,1086.5885 " fill="none" id="new_lease-to-allocateUnreservedLease4" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="523,1086.5885,527,1077.5885,523,1081.5885,519,1077.5885,523,1086.5885" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="130" x="524" y="1034.7449">no requested address</text> + </g> + <!--link allocateOrReuseLease4 to candidate--> + <g id="link_allocateOrReuseLease4_candidate"> + <path d="M232.01,1558.3379 C232.23,1560.3179 237.01,1602.9479 240.19,1631.3279 " fill="none" id="allocateOrReuseLease4-to-candidate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="240.72,1635.9879,243.6928,1626.5984,240.1631,1631.019,235.7425,1627.4894,240.72,1635.9879" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link candidate to reuseExpiredLease4--> + <g id="link_candidate_reuseExpiredLease4"> + <path d="M234.39,1677.2579 C223.58,1701.0179 205.02,1741.8079 193.14,1767.9179 " fill="none" id="candidate-to-reuseExpiredLease4" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="191.19,1772.1979,198.5557,1765.6598,193.259,1767.6461,191.2728,1762.3494,191.19,1772.1979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="214" y="1739.7649">expired candidate lease</text> + </g> + <!--link candidate to no_lease--> + <g id="link_candidate_no_lease"> + <path d="M281.19,1677.3079 C311.49,1691.2679 355.35,1709.1179 396,1716.8679 C414.83,1720.4679 1069.57,1715.0079 1086,1724.8679 C1115.34,1742.4879 1123,1758.1779 1123,1792.4079 C1123,1792.4079 1123,1792.4079 1123,2194.6779 C1123,2248.3879 1280.98,2287.7279 1375.63,2306.4779 " fill="none" id="candidate-to-no_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1380.28,2307.3879,1372.2107,2301.7411,1375.3722,2306.432,1370.6813,2309.5936,1380.28,2307.3879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="1124" y="1998.9349">conflicting candidate lease</text> + </g> + <!--link candidate to create--> + <g id="link_candidate_create"> + <path d="M283.96,1677.3279 C314.26,1690.5579 356.88,1707.4379 396,1716.8679 C428.16,1724.6279 437.15,1720.9879 470,1724.8679 C628.07,1743.5579 812.53,1767.8079 915.65,1781.5779 " fill="none" id="candidate-to-create" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="920.51,1782.2279,912.1137,1777.0799,915.5534,1781.5708,911.0624,1785.0105,920.51,1782.2279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="111" x="616" y="1739.7649">no candidate lease</text> + </g> + <!--link reuseExpiredLease4 to reclaimExpiredLease--> + <g id="link_reuseExpiredLease4_reclaimExpiredLease"> + <path d="M181.81,1813.3179 C181.65,1828.6479 181.43,1850.3879 181.26,1867.2079 " fill="none" id="reuseExpiredLease4-to-reclaimExpiredLease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="181.21,1872.1079,185.3126,1863.1542,181.2671,1867.1082,177.3131,1863.0628,181.21,1872.1079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link reclaimExpiredLease to updateLease4Information--> + <g id="link_reclaimExpiredLease_updateLease4Information"> + <path d="M180.04,1913.3779 C179.25,1928.7179 178.15,1950.4579 177.29,1967.2779 " fill="none" id="reclaimExpiredLease-to-updateLease4Information" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="177.04,1972.1779,181.4983,1963.3959,177.2975,1967.1846,173.5089,1962.9838,177.04,1972.1779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link updateLease4Information to lease4_select--> + <g id="link_updateLease4Information_lease4_select"> + <path d="M172.53,2013.4479 C169.69,2028.9179 165.65,2050.9079 162.56,2067.7979 " fill="none" id="updateLease4Information-to-lease4_select" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="161.73,2072.2679,167.2817,2064.1329,162.6282,2067.3493,159.4118,2062.6958,161.73,2072.2679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link lease4_select to no_lease--> + <g id="link_lease4_select_no_lease"> + <path d="M237.86,2110.8479 C399.58,2143.4479 777.6,2218.1779 1097,2270.2079 C1193.29,2285.8979 1305.08,2300.9279 1375.43,2309.9979 " fill="none" id="lease4_select-to-no_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1380.18,2310.6079,1371.7692,2305.4837,1375.2215,2309.9649,1370.7403,2313.4172,1380.18,2310.6079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="27" x="1041" y="2199.0749">SKIP</text> + </g> + <!--link lease4_select to updateLease4--> + <g id="link_lease4_select_updateLease4"> + <path d="M168.99,2113.1879 C175.01,2122.7879 182.89,2134.4979 191,2144.1479 C198.43,2152.9879 207.33,2161.9179 215.59,2169.6579 " fill="none" id="lease4_select-to-updateLease4" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="218.99,2172.8079,215.1045,2163.7579,215.3215,2169.4106,209.6688,2169.6276,218.99,2172.8079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link updateLease4 to old_lease--> + <g id="link_updateLease4_old_lease"> + <path d="M252.95,2213.5979 C263.06,2229.1579 279.56,2250.3579 300,2261.2079 C367.18,2296.8879 583.75,2311.1079 696.81,2316.2079 " fill="none" id="updateLease4-to-old_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="701.6,2316.4179,692.7795,2312.0362,696.6046,2316.2038,692.437,2320.0289,701.6,2316.4179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link allocateUnreservedLease4 to iterate--> + <g id="link_allocateUnreservedLease4_iterate"> + <path d="M523,1117.9379 C523,1120.7879 523,1149.8079 523,1171.9279 " fill="none" id="allocateUnreservedLease4-to-iterate" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="523,1176.7279,527,1167.7279,523,1171.7279,519,1167.7279,523,1176.7279" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link iterate to pick--> + <g id="link_iterate_pick"> + <path d="M525.44,1218.1479 C527.97,1237.7079 531.93,1268.3679 534.73,1290.0079 " fill="none" id="iterate-to-pick" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="535.36,1294.9079,538.1693,1285.4682,534.717,1289.9494,530.2358,1286.4971,535.36,1294.9079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link pick to pick_reserved--> + <g id="link_pick_pick_reserved"> + <path d="M590.31,1329.7379 C635.21,1340.9179 693.8,1356.8979 701,1365.8379 C710.4,1377.5179 711.67,1394.3079 710.59,1408.2279 " fill="none" id="pick-to-pick_reserved" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="710.1,1412.8879,715.0049,1404.3473,710.6145,1407.9145,707.0473,1403.5241,710.1,1412.8879" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--reverse link iterate to pick_reserved--> + <g id="link_iterate_pick_reserved"> + <path d="M563.34,1221.4079 C608.29,1248.6779 678.52,1299.6279 708,1365.8379 C714.82,1381.1679 713.4,1400.4479 710.81,1414.4779 " fill="none" id="iterate-backto-pick_reserved" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="559.28,1218.9779,564.9395,1227.0384,563.5675,1221.5504,569.0554,1220.1784,559.28,1218.9779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="204" x="691" y="1321.7049">address reserved to another client</text> + </g> + <!--link pick_reserved to mt_in_use--> + <g id="link_pick_reserved_mt_in_use"> + <path d="M693.34,1454.2679 C679.26,1475.2879 656.46,1509.3179 641.11,1532.2279 " fill="none" id="pick_reserved-to-mt_in_use" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="638.41,1536.2579,646.743,1531.008,641.1934,1532.1043,640.0972,1526.5546,638.41,1536.2579" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--reverse link iterate to mt_in_use--> + <g id="link_iterate_mt_in_use"> + <path d="M499.34,1222.9279 C465.42,1259.8279 410.87,1332.2379 447,1384.8379 C468.03,1415.4579 495.69,1392.0379 525,1414.8379 C568.91,1449.0079 601.58,1507.6479 616.32,1537.5479 " fill="none" id="iterate-backto-mt_in_use" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="502.74,1219.2879,493.6669,1223.1192,499.3208,1222.936,499.5039,1228.5899,502.74,1219.2879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="244" x="448" y="1380.7349">address already in use by another thread</text> + </g> + <!--link mt_in_use to pick_lease--> + <g id="link_mt_in_use_pick_lease"> + <path d="M601.09,1577.1779 C580.76,1593.2579 551.52,1616.3879 529.88,1633.4979 " fill="none" id="mt_in_use-to-pick_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="526.02,1636.5479,535.5588,1634.096,529.9396,1633.4437,530.592,1627.8246,526.02,1636.5479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--reverse link iterate to pick_lease--> + <g id="link_iterate_pick_lease"> + <path d="M486.95,1221.7579 C476.56,1229.2579 465.69,1238.1679 457,1247.7779 C440.02,1266.5379 434.68,1272.3679 428,1296.7779 C411.43,1357.3179 446.44,1516.8379 465,1576.8079 C471.68,1598.3779 482.78,1621.7779 490.89,1637.5779 " fill="none" id="iterate-backto-pick_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="490.76,1219.0579,481.1011,1220.9828,486.676,1221.9425,485.7163,1227.5173,490.76,1219.0579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="68" x="437" y="1439.7749">active lease</text> + </g> + <!--link pick_lease to reuseExpiredLease4--> + <g id="link_pick_lease_reuseExpiredLease4"> + <path d="M460.73,1677.3379 C436.84,1689.4379 406.54,1706.3079 382,1724.8679 C372.48,1732.0779 373.34,1737.8979 363,1743.8679 C354.02,1749.0579 309.1,1761.1179 266.26,1771.9079 " fill="none" id="pick_lease-to-reuseExpiredLease4" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="261.43,1773.1279,271.1314,1774.8257,266.2807,1771.9152,269.1911,1767.0645,261.43,1773.1279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="78" x="383" y="1739.7649">expired lease</text> + </g> + <!--link pick_lease to create--> + <g id="link_pick_lease_create"> + <path d="M550.73,1671.8079 C637.51,1695.3079 817.1,1743.9479 919.71,1771.7479 " fill="none" id="pick_lease-to-create" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="924.29,1772.9879,916.6394,1766.7857,919.4619,1771.688,914.5596,1774.5106,924.29,1772.9879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="808" y="1739.7649">no lease</text> + </g> + <!--link create to old_lease--> + <g id="link_create_old_lease"> + <path d="M975.35,1813.2879 C957.65,1831.6179 935,1861.1979 935,1892.4779 C935,1892.4779 935,1892.4779 935,2194.6779 C935,2246.3179 883.01,2278.8979 836.88,2297.6379 " fill="none" id="create-to-old_lease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="832.4,2299.4179,842.2408,2299.8154,837.0473,2297.5733,839.2894,2292.3798,832.4,2299.4179" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link old_lease to return--> + <g id="link_old_lease_return"> + <path d="M767,2339.6479 C767,2359.2079 767,2389.8779 767,2411.5079 " fill="none" id="old_lease-to-return" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="767,2416.3979,771,2407.3979,767,2411.3979,763,2407.3979,767,2416.3979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--SRC=[ZLPBRzGm4BxdLrYSuB0890w80n8g1IgGA8MU8vDuTorIUqaSIeNuxyoC4tlyICkbtOpdcnb_y_0uxGObtWo3xQHJGef1oKc9lHt5smzdbrVdNwxFltuJZpygAPu_VVdqsPEcaGTbd7ZqJfjUT8F63q8z4d8IUv2UaV0JoXfZmUoe3qSdNWcGZdVYPBLnmSpPKNK_nAX-pcfogeTVanf_IQUj8OEoxq4qNP5OzG7tNhb2zoYdDroTJWBY-jJZ7QEhnJH1PpfiZnJQg3edpG6OASBZc0xF22B-D8A1CBP8P1ryKAvLl_Naj3aWN6pm4QbTjHlnjsbITUxCyvJxMldpMSdWTdOxkz-Th1qI7CXRkszHtlojq59atpFIMwFmIjcDZBhrIeHg2PMPPOK8simmV7a0sdKMBdHK8z5MGnCFCoX70t8v-pnUuGdHy88C25PGdJIzfYfXTrfb3LCc8v2HanwJ797RSo_sFb9KDqXzKyNH2KToeA_E9StQGA9lOjNxG-_j8fvn_1bUVruozQATr02i4JYH829fsAErFxYTwrD63lSDUbYOrOpC9XHccPFhS5X9ouLJ8rh08WG8p9nf_cwKynMg_IcFyL93jV4gFe4W8MEfnxHHL1-Ksp4CcnmbXr79_Wvo8B00ljz1H9PgqHtnX6pSk5QRTavJo1erEl8zWBmbFGsMAZtGaJYglOMSOR4Fd5FuYfqLoixDeu7CyeQoYrewe7zhbytd1KpjcvKiIFuNpc4esCPb3uZOxLxdRm0M9bdAvgfuZBFuITL4zMa0Gq3AfftSBTfXCv_0dJNxGNSqnTbpLCMkd0EIgGfxQq21bP8Va4qzPB33tgg52fduvkT5pCjjY_hVSXVmDDKNmg8lPXjL-QlM94ySdeQFF86-59bkoXRmaixCJSuAb-m9AuD_G3kDyLvW_i86T6GIN-SrsfNp0bRUN4WehbzAfFEpXap2R_XLYYHw-lBe8BIo6UutLFQEdd0uucZ7SI6Dg4R3hhW2CScnA67Eeu2P8ZlCESN2LedG2dmhQH8DGD3KgWP-Io-I7-zoclG1ANAMM5cgApM6rrZNaYOkA3Imgjj6xDMSupgwU1VhuwgfUoD-mkuIDviTiP2lAJI5VOTbIr06PPdZi-z-a7-wbecPQLPYyI6M6r55HhfR6z26d33fufDy5LtuzUF5PQ6Ikary-MOCB_5cFb5jtM2M_oIZZGN_XA-uaYHVOZUVeWtMJ4412ZWRaPa1WCTz9VpQDFpG0iHDhB5x5kBFqhWVSQNUGwLQHV1YMuhHIzAiX5-B6rfB_W40]--> + </g> +</svg> diff --git a/doc/sphinx/uml/request4-lease.uml b/doc/sphinx/uml/request4-lease.uml new file mode 100644 index 0000000..54f0c81 --- /dev/null +++ b/doc/sphinx/uml/request4-lease.uml @@ -0,0 +1,118 @@ +@startuml + +title Allocate a lease for DHCPREQUEST (Kea 1.8.0) + +agent "Find client lease" as findClientLease +note right : entry point + +agent "Check requested reservation" as addressReserved + +agent "Get reservation" as hasAddressReservation + +agent "Update requested address" as update_hint + +rectangle "Check requested address" as check_hint { + rectangle "Get lease for requested address" as get_existing { + agent "Check requested lease" as existing + } + + agent "Check lease for reserved address" as getReservedLease + + agent "Check out-of-pool address" as out_of_pool +} + +rectangle "Check client lease" as check_done { + agent "Check renew" as client_lease +} + +rectangle "Allocate a new lease" as new_lease { + together { + rectangle "Allocate or reuse lease" as allocateOrReuseLease4 { + agent "Get candidate lease" as candidate + + agent "Reuse expired lease" as reuseExpiredLease4 + + agent "Reclaim expired lease" as reclaimExpiredLease + + agent "update lease information" as updateLease4Information + + agent "Callout lease4_select" as lease4_select + note right : hook + + agent "Update lease" as updateLease4 + } + + rectangle "Allocate unreserved lease" as allocateUnreservedLease4 { + agent "Iterate pools and subnets" as iterate + + agent "Pick address" as pick + + agent "Check reserved addressed" as pick_reserved + + agent "Check already in use by another thread" as mt_in_use + + agent "Check lease" as pick_lease + } + } + + agent "Create a new lease" as create + + agent "Delete old lease" as old_lease +} + +agent "Return no lease" as no_lease +note right : exit point + +agent "Return renewed lease" as renew +note right : exit point + +agent "Return lease" as return +note right : exit point + +findClientLease --> addressReserved : has requested address (hint) +findClientLease --> hasAddressReservation : no requested address (hint) +addressReserved --> check_hint : no conflicting reservation +addressReserved --> no_lease : reservation owned by another client +hasAddressReservation -> update_hint : has a reservation +update_hint --> check_hint : request reserved address +hasAddressReservation --> check_done : no reservation +check_hint --> get_existing +get_existing --> existing : has requested lease +existing ---> no_lease : not expired lease owned by another client +get_existing --> out_of_pool : no reservation +get_existing --> out_of_pool : has requested reservation +get_existing --> getReservedLease : has reservation for another address +getReservedLease ---> no_lease : no active reserved lease +getReservedLease --> out_of_pool +out_of_pool --> check_done : owned reservation for the requested address +out_of_pool --> check_done : requested address is in allowed an pool +out_of_pool --> no_lease : address not reserved and not in allowed pool +check_done --> client_lease : has a client lease +client_lease -> renew : requested address was already assigned to the client +client_lease --> new_lease +new_lease --> allocateOrReuseLease4 : has a requested address +new_lease --> allocateUnreservedLease4 : no requested address +allocateOrReuseLease4 --> candidate +candidate --> reuseExpiredLease4 : expired candidate lease +candidate --> no_lease : conflicting candidate lease +candidate --> create : no candidate lease +reuseExpiredLease4 --> reclaimExpiredLease +reclaimExpiredLease --> updateLease4Information +updateLease4Information --> lease4_select +lease4_select ---> no_lease : SKIP +lease4_select --> updateLease4 +updateLease4 --> old_lease +allocateUnreservedLease4 --> iterate +iterate --> pick +pick --> pick_reserved +pick_reserved -up-> iterate : address reserved to another client +pick_reserved --> mt_in_use +mt_in_use -up-> iterate : address already in use by another thread +mt_in_use --> pick_lease +pick_lease -up-> iterate : active lease +pick_lease --> reuseExpiredLease4 : expired lease +pick_lease --> create : no lease +create --> old_lease +old_lease --> return + +@enduml diff --git a/doc/sphinx/uml/request4.png b/doc/sphinx/uml/request4.png Binary files differnew file mode 100644 index 0000000..6818c2c --- /dev/null +++ b/doc/sphinx/uml/request4.png diff --git a/doc/sphinx/uml/request4.svg b/doc/sphinx/uml/request4.svg new file mode 100644 index 0000000..78f0aaa --- /dev/null +++ b/doc/sphinx/uml/request4.svg @@ -0,0 +1,213 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1851px" preserveAspectRatio="none" style="width:713px;height:1851px;background:#FFFFFF;" version="1.1" viewBox="0 0 713 1851" width="713px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="256" x="221.5" y="24.9659">DHCPREQUEST processing (Kea 1.8.0)</text> + <!--cluster ack--> + <g id="cluster_ack"> + <rect fill="none" height="791.34" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="298" x="409" y="759.5379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="145" x="485.5" y="776.5039">A lease was assigned</text> + </g> + <!--entity setReservedClasses--> + <g id="elem_setReservedClasses"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="162" x="439" y="851.3979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="142" x="449" y="876.3639">Add reserved classes</text> + </g> + <!--entity requiredClassify--> + <g id="elem_requiredClassify"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="186" x="437" y="951.4679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="166" x="447" y="976.4339">Classify required classes</text> + </g> + <!--entity buildCfgOptionList--> + <g id="elem_buildCfgOptionList"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="204" x="444" y="1051.5379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="184" x="454" y="1076.5039">Build configured option list</text> + </g> + <!--entity appendRequestedOptions--> + <g id="elem_appendRequestedOptions"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="200" x="453" y="1169.5979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="180" x="463" y="1194.5639">Append requested options</text> + </g> + <!--entity appendRequestedVendorOptions--> + <g id="elem_appendRequestedVendorOptions"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="251" x="432.5" y="1287.6679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="231" x="442.5" y="1312.6339">Append requested vendor options</text> + </g> + <!--entity appendBasicOptions--> + <g id="elem_appendBasicOptions"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="166" x="474" y="1387.7379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="146" x="484" y="1412.7039">Append basic options</text> + </g> + <!--entity setFixedFields--> + <g id="elem_setFixedFields"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="119" x="494.5" y="1487.8079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="504.5" y="1512.7739">Set fixed fields</text> + </g> + <!--entity entry--> + <g id="elem_entry"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="94" x="76" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="74" x="86" y="72.0339">Entry point</text> + </g> + <!--entity selectSubnet--> + <g id="elem_selectSubnet"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="111" x="67.5" y="147.1279"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="91" x="77.5" y="172.0939">Select subnet</text> + </g> + <g id="elem_GMN4"> + <path d="M213.5,152.8079 L213.5,162.6679 L178.75,166.6679 L213.5,170.6679 L213.5,180.5139 A0,0 0 0 0 213.5,180.5139 L300.5,180.5139 A0,0 0 0 0 300.5,180.5139 L300.5,162.8079 L290.5,152.8079 L213.5,152.8079 A0,0 0 0 0 213.5,152.8079 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M290.5,152.8079 L290.5,162.8079 L300.5,162.8079 L290.5,152.8079 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="219.5" y="171.7049">hook point</text> + </g> + <!--entity findReservation--> + <g id="elem_findReservation"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="162" x="186" y="247.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="142" x="196" y="272.1639">Find host reservation</text> + </g> + <!--entity known--> + <g id="elem_known"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="285" x="167.5" y="347.2679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="265" x="177.5" y="372.2339">Add either KNOWN or UNKNOWN class</text> + </g> + <!--entity classify2--> + <g id="elem_classify2"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="144" x="244" y="447.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="124" x="254" y="472.3039">Classify (2nd pass)</text> + </g> + <!--entity processClientName--> + <g id="elem_processClientName"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="154" x="242" y="547.3979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="134" x="252" y="572.3639">Process client name</text> + </g> + <!--entity assignLease--> + <g id="elem_assignLease"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="263" y="647.4679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="96" x="273" y="672.4339">Assign a lease</text> + </g> + <!--entity common--> + <g id="elem_common"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="161" x="470.5" y="1605.8779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="141" x="480.5" y="1630.8439">Adjust interface data</text> + </g> + <!--entity appendServerID--> + <g id="elem_appendServerID"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="138" x="482" y="1705.9379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="118" x="492" y="1730.9039">Append server ID</text> + </g> + <g id="elem_GMN22"> + <path d="M301.5,1711.6279 L301.5,1739.3339 A0,0 0 0 0 301.5,1739.3339 L446.5,1739.3339 A0,0 0 0 0 446.5,1739.3339 L446.5,1729.6279 L481.9,1725.4779 L446.5,1721.6279 L446.5,1721.6279 L436.5,1711.6279 L301.5,1711.6279 A0,0 0 0 0 301.5,1711.6279 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M436.5,1711.6279 L436.5,1721.6279 L446.5,1721.6279 L436.5,1711.6279 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="124" x="307.5" y="1730.5249">on success exit point</text> + </g> + <!--entity drop--> + <g id="elem_drop"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="153" x="171.5" y="1806.0079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="133" x="181.5" y="1830.9739">Return no response</text> + </g> + <g id="elem_GMN26"> + <path d="M6,1811.6879 L6,1839.3939 A0,0 0 0 0 6,1839.3939 L136,1839.3939 A0,0 0 0 0 136,1839.3939 L136,1829.6879 L171.23,1825.5479 L136,1821.6879 L136,1821.6879 L126,1811.6879 L6,1811.6879 A0,0 0 0 0 6,1811.6879 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <path d="M126,1811.6879 L126,1821.6879 L136,1821.6879 L126,1811.6879 " fill="#FEFFDD" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="109" x="12" y="1830.5849">on error exit point</text> + </g> + <!--link entry to selectSubnet--> + <g id="link_entry_selectSubnet"> + <path d="M123,86.5079 C123,101.8379 123,123.5779 123,140.3979 " fill="none" id="entry-to-selectSubnet" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="123,145.2979,127,136.2979,123,140.2979,119,136.2979,123,145.2979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link selectSubnet to findReservation--> + <g id="link_selectSubnet_findReservation"> + <path d="M150.76,186.5779 C174.57,202.7879 208.91,226.1679 234.09,243.3179 " fill="none" id="selectSubnet-to-findReservation" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="238.07,246.0279,232.8864,237.6535,233.9386,243.2117,228.3804,244.2638,238.07,246.0279" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link selectSubnet to drop--> + <g id="link_selectSubnet_drop"> + <path d="M116.78,186.5979 C110.91,206.1779 103,237.7579 103,265.7379 C103,265.7379 103,265.7379 103,1726.4779 C103,1764.1179 136.95,1788.2979 171.99,1803.2279 " fill="none" id="selectSubnet-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="176.22,1804.9679,169.4398,1797.8245,171.6017,1803.0519,166.3742,1805.2138,176.22,1804.9679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="90" x="104" y="976.3949">hook set DROP</text> + </g> + <!--link findReservation to known--> + <g id="link_findReservation_known"> + <path d="M275.29,286.6379 C282.13,302.2479 291.89,324.4879 299.31,341.4279 " fill="none" id="findReservation-to-known" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="301.13,345.5679,301.1615,335.7191,299.1139,340.9924,293.8406,338.9449,301.13,345.5679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link known to classify2--> + <g id="link_known_classify2"> + <path d="M311.16,386.7079 C312.09,402.0379 313.43,423.7879 314.45,440.6079 " fill="none" id="known-to-classify2" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="314.75,445.5079,318.1775,436.2747,314.4363,440.5178,310.1933,436.7766,314.75,445.5079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link classify2 to processClientName--> + <g id="link_classify2_processClientName"> + <path d="M316.58,486.7779 C317.05,502.1079 317.71,523.8579 318.23,540.6779 " fill="none" id="classify2-to-processClientName" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="318.38,545.5779,322.0953,536.4567,318.2229,540.5804,314.0993,536.708,318.38,545.5779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link processClientName to assignLease--> + <g id="link_processClientName_assignLease"> + <path d="M319.39,586.8479 C319.7,602.1779 320.14,623.9179 320.48,640.7379 " fill="none" id="processClientName-to-assignLease" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="320.58,645.6379,324.3992,636.5597,320.48,640.6389,316.4008,636.7197,320.58,645.6379" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link assignLease to ack--> + <g id="link_assignLease_ack"> + <path d="M343.66,686.8979 C363.73,703.6329 393.68,728.6029 418.9225,749.6479 C422.0778,752.2785 425.1596,754.8478 428.1393,757.3321 C428.8842,757.9531 429.6228,758.5688 430.3545,759.1789 " fill="none" id="assignLease-to-ack" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="430.3545,759.1789,426.0032,750.3434,426.5141,755.9771,420.8804,756.488,430.3545,759.1789" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="59" x="398" y="731.4349">DHCPACK</text> + </g> + <!--link assignLease to common--> + <g id="link_assignLease_common"> + <path d="M321.25,686.8479 C321.55,710.6379 322,752.7979 322,788.8979 C322,788.8979 322,788.8979 322,1508.3379 C322,1574.6179 399.27,1603.0579 464.04,1615.2579 " fill="none" id="assignLease-to-common" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="468.77,1616.1179,460.6378,1610.5621,463.8518,1615.2172,459.1967,1618.4312,468.77,1616.1179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="61" x="323" y="1135.4949">DHCPNAK</text> + </g> + <!--link assignLease to drop--> + <g id="link_assignLease_drop"> + <path d="M300.67,686.8379 C279.07,708.9779 248,747.9579 248,788.8979 C248,788.8979 248,788.8979 248,1726.4779 C248,1751.2579 248,1779.5579 248,1799.3679 " fill="none" id="assignLease-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="248,1804.2279,252,1795.2279,248,1799.2279,244,1795.2279,248,1804.2279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="49" x="249" y="1253.5649">on error</text> + </g> + <!--link ack to setReservedClasses--> + <g id="link_ack_setReservedClasses"> + <path d="M466.15,790.6279 C468.13,793.5279 488.48,823.5079 503.58,845.7479 " fill="none" id="ack-to-setReservedClasses" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="506.25,849.6779,504.5015,839.9855,503.4404,845.542,497.884,844.4809,506.25,849.6779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link setReservedClasses to requiredClassify--> + <g id="link_setReservedClasses_requiredClassify"> + <path d="M521.93,890.8379 C523.49,906.1679 525.71,927.9179 527.42,944.7379 " fill="none" id="setReservedClasses-to-requiredClassify" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="527.92,949.6479,530.9727,940.2841,527.4055,944.6745,523.0151,941.1073,527.92,949.6479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link requiredClassify to buildCfgOptionList--> + <g id="link_requiredClassify_buildCfgOptionList"> + <path d="M533.08,990.9079 C535.59,1006.2379 539.13,1027.9879 541.88,1044.8079 " fill="none" id="requiredClassify-to-buildCfgOptionList" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="542.68,1049.7279,545.1863,1040.2033,541.8789,1044.7925,537.2897,1041.4851,542.68,1049.7279" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link buildCfgOptionList to appendRequestedOptions--> + <g id="link_buildCfgOptionList_appendRequestedOptions"> + <path d="M547.14,1090.9779 C548.32,1110.5379 550.17,1141.1979 551.47,1162.8379 " fill="none" id="buildCfgOptionList-to-appendRequestedOptions" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="551.77,1167.7279,555.2222,1158.5039,551.4697,1162.7369,547.2367,1158.9844,551.77,1167.7279" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link appendRequestedOptions to appendRequestedVendorOptions--> + <g id="link_appendRequestedOptions_appendRequestedVendorOptions"> + <path d="M553.81,1209.0479 C554.66,1228.6079 555.98,1259.2679 556.91,1280.8979 " fill="none" id="appendRequestedOptions-to-appendRequestedVendorOptions" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="557.12,1285.7979,560.7298,1276.6345,556.9053,1280.8025,552.7372,1276.978,557.12,1285.7979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link appendRequestedVendorOptions to appendBasicOptions--> + <g id="link_appendRequestedVendorOptions_appendBasicOptions"> + <path d="M557.81,1327.1079 C557.65,1342.4479 557.43,1364.1879 557.26,1381.0079 " fill="none" id="appendRequestedVendorOptions-to-appendBasicOptions" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="557.21,1385.9079,561.3126,1376.9542,557.2671,1380.9082,553.3131,1376.8628,557.21,1385.9079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link appendBasicOptions to setFixedFields--> + <g id="link_appendBasicOptions_setFixedFields"> + <path d="M556.42,1427.1779 C555.95,1442.5079 555.29,1464.2579 554.77,1481.0779 " fill="none" id="appendBasicOptions-to-setFixedFields" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="554.62,1485.9779,558.8754,1477.0958,554.7628,1480.98,550.8787,1476.8673,554.62,1485.9779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link setFixedFields to common--> + <g id="link_setFixedFields_common"> + <path d="M553.51,1527.2479 C553.01,1546.8079 552.21,1577.4679 551.65,1599.1079 " fill="none" id="setFixedFields-to-common" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="551.53,1603.9979,555.76,1595.1037,551.6585,1598.9996,547.7627,1594.8981,551.53,1603.9979" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link common to appendServerID--> + <g id="link_common_appendServerID"> + <path d="M551,1645.3179 C551,1660.6479 551,1682.3879 551,1699.2179 " fill="none" id="common-to-appendServerID" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="551,1704.1079,555,1695.1079,551,1699.1079,547,1695.1079,551,1704.1079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link appendServerID to drop--> + <!--SRC=[VLJBRjim4BphAnOv9GS7RKv53WKSsKO31xOhD-sXw86MLZ9hcLH9AWyK_VUIIucI9ISNGpixiwA6EpRSb0YpB_4ccNzzd6-_GQLaYbfpKS3b4XbylFvq_U4gYbY1mi35N1Zr2fNambm0qu2k3jqjbfWQqFLEeEzhGhO4H48Q1CMBlO5Rs4jvy8E2VC55Pd5jGA56zSGCbuB6vBQJT5XGJBCCa9izAbYkrZzM81KyhlnZMZAjINqGyhdJn0xd-IjStjZNLRQu8bRQu3U1kV5Us0vtjM1796RZKKpmogBTUUo4GW234fdsP4RGWwkZI5apc2YivnTJpu7dmC7C2z83_8sWzuNU3Spy4L4tpfgamMCF1qtuGeL_Qgu6mXPiMK5sL_FIKgN8UL4xbQoSsL1oxIzpvmXnNgm9Vx1mTyogGf7HRDGcQFqR6JMJjkVb-ctjaotjHRupuZintXYqOvgdPzHt3XzgjcZiThtOj-OSoonukt3OWg3eNs_VVjTsFUtIeifPYf0nm_psoEEnlvZ-A7G_2kvdlMDi2RkV-JYKcBiqM9jrdTAsuGitWs0aQ6ebG4Yt2fKzlb-jJCbgE0MLijRrPr14OJBvV1h6Va7TOSO61CjmxskJQos2MRBUH0CPZVA1er-gksY59yB7GHeXnEjdgFViUpOkj_GNDesNeww_beQmcWu9tKUrraLkdZThbAynHCnHe8O0iSw4PmpvBpeVb_FmESLfEjvhzjGdwHX3hIVzN9oMFR-ZnlPkUbZwqn8cF_Syor3yQcuY-Wy0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/request4.uml b/doc/sphinx/uml/request4.uml new file mode 100644 index 0000000..a5878b9 --- /dev/null +++ b/doc/sphinx/uml/request4.uml @@ -0,0 +1,59 @@ +@startuml + +title DHCPREQUEST processing (Kea 1.8.0) + +agent "Entry point" as entry + +agent "Select subnet" as selectSubnet +note right : hook point + +agent "Find host reservation" as findReservation + +agent "Add either KNOWN or UNKNOWN class" as known + +agent "Classify (2nd pass)" as classify2 + +agent "Process client name" as processClientName + +agent "Assign a lease" as assignLease + +rectangle "A lease was assigned" as ack { + agent "Add reserved classes" as setReservedClasses + agent "Classify required classes" as requiredClassify + agent "Build configured option list" as buildCfgOptionList + agent "Append requested options" as appendRequestedOptions + agent "Append requested vendor options" as appendRequestedVendorOptions + agent "Append basic options" as appendBasicOptions + agent "Set fixed fields" as setFixedFields +} + +agent "Adjust interface data" as common + +agent "Append server ID" as appendServerID +note left : on success exit point + +agent "Return no response" as drop +note left : on error exit point + +entry --> selectSubnet +selectSubnet --> findReservation +selectSubnet ---> drop : hook set DROP +findReservation --> known +known --> classify2 +classify2 --> processClientName +processClientName --> assignLease +assignLease --> ack : DHCPACK +assignLease --> common : DHCPNAK +assignLease ---> drop : on error +ack --> setReservedClasses +setReservedClasses --> requiredClassify +requiredClassify --> buildCfgOptionList +buildCfgOptionList --> appendRequestedOptions +appendRequestedOptions --> appendRequestedVendorOptions +appendRequestedVendorOptions --> appendBasicOptions +appendBasicOptions --> setFixedFields +setFixedFields --> common +common --> appendServerID +appendServerID -[hidden]-> drop + +@enduml
\ No newline at end of file diff --git a/doc/sphinx/uml/requestLease4.png b/doc/sphinx/uml/requestLease4.png Binary files differnew file mode 100644 index 0000000..52ff01f --- /dev/null +++ b/doc/sphinx/uml/requestLease4.png diff --git a/doc/sphinx/uml/requestLease4.svg b/doc/sphinx/uml/requestLease4.svg new file mode 100644 index 0000000..2b7d0a7 --- /dev/null +++ b/doc/sphinx/uml/requestLease4.svg @@ -0,0 +1,540 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="2628px" preserveAspectRatio="none" style="width:1543px;height:2628px;background:#FFFFFF;" version="1.1" viewBox="0 0 1543 2628" width="1543px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="248" x="646" y="34.9659">requestLease4 algorithm (Kea 1.8.0)</text> + <ellipse cx="611.8438" cy="60.0679" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="144" x="539.8438" y="90.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="124" x="549.8438" y="112.896">get lease for the client</text> + <polygon fill="#F1F1F1" points="566.8438,146.412,656.8438,146.412,668.8438,158.412,656.8438,170.412,566.8438,170.412,554.8438,158.412,566.8438,146.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="90" x="566.8438" y="162.68">reserved address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="537.8438" y="155.1891">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="668.8438" y="155.1891">no</text> + <polygon fill="#F1F1F1" points="218.5,180.412,315.5,180.412,327.5,192.412,315.5,204.412,218.5,204.412,206.5,192.412,218.5,180.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="97" x="218.5" y="196.68">requested address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="192.5" y="189.1891">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="327.5" y="189.1891">yes</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="236" x="11" y="214.412"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="216" x="21" y="237.2401">requested address = reserved address</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="352.5" y="263.903"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="362.5" y="286.7311">return no lease</text> + <ellipse cx="405" cy="346.2471" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="405" cy="346.2471" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="279,214.412,531,214.412,543,226.412,531,238.412,279,238.412,267,226.412,279,214.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="409" y="250.1709">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="252" x="279" y="230.68">requested address is reserved for another client</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="543" y="223.1891">no</text> + <polygon fill="#F1F1F1" points="267,388.738,279,400.738,267,412.738,255,400.738,267,388.738" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="214.5" y="546.7199"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="224.5" y="569.548">return no lease</text> + <ellipse cx="267" cy="629.064" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="267" cy="629.064" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="175,497.229,359,497.229,371,509.229,359,521.229,175,521.229,163,509.229,175,497.229" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="271" y="532.9879">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="184" x="175" y="513.4969">active and owned by another client</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="371" y="506.006">no</text> + <polygon fill="#F1F1F1" points="194.5,447.738,339.5,447.738,351.5,459.738,339.5,471.738,194.5,471.738,182.5,459.738,194.5,447.738" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="271" y="483.4969">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="145" x="194.5" y="464.006">lease for requested address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="351.5" y="456.5151">no</text> + <polygon fill="#F1F1F1" points="267,697.0459,279,709.0459,267,721.0459,255,709.0459,267,697.0459" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="214.5" y="904.5188"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="224.5" y="927.3468">return no lease</text> + <ellipse cx="267" cy="986.8629" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="267" cy="986.8629" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="252,855.0278,282,855.0278,294,867.0278,282,879.0278,252,879.0278,240,867.0278,252,855.0278" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="271" y="890.7867">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="30" x="252" y="871.2958">active</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="294" y="863.8048">no</text> + <polygon fill="#F1F1F1" points="194.5,805.5369,339.5,805.5369,351.5,817.5369,339.5,829.5369,194.5,829.5369,182.5,817.5369,194.5,805.5369" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="271" y="841.2958">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="145" x="194.5" y="821.8048">lease for requested address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="351.5" y="814.3139">no</text> + <polygon fill="#F1F1F1" points="267,1054.8448,279,1066.8448,267,1078.8448,255,1066.8448,267,1054.8448" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="214.5" y="1163.3357"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="224.5" y="1186.1638">return no lease</text> + <ellipse cx="267" cy="1241.2574" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="267" cy="1241.2574" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="176.5,1113.8448,357.5,1113.8448,369.5,1125.8448,357.5,1137.8448,176.5,1137.8448,164.5,1125.8448,176.5,1113.8448" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="271" y="1149.6037">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="181" x="176.5" y="1130.1127">requested address in allowed pool</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="369.5" y="1122.6218">yes</text> + <polygon fill="#F1F1F1" points="164.5,756.0459,369.5,756.0459,381.5,768.0459,369.5,780.0459,164.5,780.0459,152.5,768.0459,164.5,756.0459" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="271" y="791.8048">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="205" x="164.5" y="772.3139">requested address == reserved address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="381.5" y="764.8229">yes</text> + <polygon fill="#F1F1F1" points="267,1303.7484,279,1315.7484,267,1327.7484,255,1315.7484,267,1303.7484" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="908.1875,180.412,1005.1875,180.412,1017.1875,192.412,1005.1875,204.412,908.1875,204.412,896.1875,192.412,908.1875,180.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="97" x="908.1875" y="196.68">requested address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="879.1875" y="189.1891">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1017.1875" y="189.1891">no</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="680.5" y="263.903"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="690.5" y="286.7311">return no lease</text> + <ellipse cx="733" cy="346.2471" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="733" cy="346.2471" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="607,214.412,859,214.412,871,226.412,859,238.412,607,238.412,595,226.412,607,214.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="737" y="250.1709">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="252" x="607" y="230.68">requested address is reserved for another client</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="871" y="223.1891">no</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="680.5" y="516.7199"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="690.5" y="539.548">return no lease</text> + <ellipse cx="733" cy="599.064" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="733" cy="599.064" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="641,467.229,825,467.229,837,479.229,825,491.229,641,491.229,629,479.229,641,467.229" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="737" y="502.9879">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="184" x="641" y="483.4969">active and owned by another client</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="837" y="476.006">no</text> + <polygon fill="#F1F1F1" points="660.5,417.738,805.5,417.738,817.5,429.738,805.5,441.738,660.5,441.738,648.5,429.738,660.5,417.738" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="737" y="453.4969">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="145" x="660.5" y="434.006">lease for requested address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="817.5" y="426.5151">no</text> + <polygon fill="#F1F1F1" points="733,667.0459,745,679.0459,733,691.0459,721,679.0459,733,667.0459" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="680.5" y="775.5369"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="690.5" y="798.365">return no lease</text> + <ellipse cx="733" cy="857.881" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="733" cy="857.881" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="642.5,726.0459,823.5,726.0459,835.5,738.0459,823.5,750.0459,642.5,750.0459,630.5,738.0459,642.5,726.0459" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="737" y="761.8048">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="181" x="642.5" y="742.3139">requested address in allowed pool</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="835.5" y="734.8229">yes</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="148" x="1106.375" y="311.903"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="128" x="1116.375" y="334.7311">pick candidate address</text> + <polygon fill="#F1F1F1" points="1130.875,476.229,1229.875,476.229,1241.875,488.229,1229.875,500.229,1130.875,500.229,1118.875,488.229,1130.875,476.229" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="99" x="1130.875" y="492.4969">lease for candidate</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1104.875" y="485.006">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1241.875" y="485.006">yes</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="967" y="510.229"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="157" x="977" y="533.0571">create and return new lease</text> + <ellipse cx="1055.5" cy="592.5731" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1055.5" cy="592.5731" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="140" x="1235.25" y="559.7199"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="120" x="1245.25" y="582.548">reclaim expired lease</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="160" x="1225.25" y="631.064"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="140" x="1235.25" y="653.8921">update lease information</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="135" x="1237.75" y="702.4081"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="115" x="1247.75" y="725.2362">callout lease4_select</text> + <polygon fill="#F1F1F1" points="1269.25,773.7523,1341.25,773.7523,1353.25,785.7523,1341.25,797.7523,1269.25,797.7523,1257.25,785.7523,1269.25,773.7523" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="72" x="1269.25" y="790.0202">callout return</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="24" x="1233.25" y="782.5293">SKIP</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="56" x="1353.25" y="782.5293">CONTINUE</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="1184" y="807.7523"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="1194" y="830.5804">return no lease</text> + <ellipse cx="1236.5" cy="890.0964" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1236.5" cy="890.0964" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="92" x="1328" y="807.7523"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="72" x="1338" y="830.5804">update lease</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="130" x="1309" y="879.0964"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="110" x="1319" y="901.9245">return reused lease</text> + <ellipse cx="1374" cy="961.4405" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1374" cy="961.4405" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="1285.25,510.229,1325.25,510.229,1337.25,522.229,1325.25,534.229,1285.25,534.229,1273.25,522.229,1285.25,510.229" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1309.25" y="545.9879">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="40" x="1285.25" y="526.4969">expired</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1337.25" y="519.006">no</text> + <polygon fill="#F1F1F1" points="1085.875,426.738,1274.875,426.738,1286.875,438.738,1274.875,450.738,1085.875,450.738,1073.875,438.738,1085.875,426.738" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1184.375" y="462.4969">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="189" x="1085.875" y="443.006">candidate is used by another thread</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1286.875" y="435.5151">yes</text> + <polygon fill="#F1F1F1" points="1180.375,1041.4224,1192.375,1053.4224,1180.375,1065.4224,1168.375,1053.4224,1180.375,1041.4224" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="1077.375,377.2471,1283.375,377.2471,1295.375,389.2471,1283.375,401.2471,1077.375,401.2471,1065.375,389.2471,1077.375,377.2471" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1184.375" y="413.006">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="206" x="1077.375" y="393.5151">candidate is reserved for another client</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1295.375" y="386.0241">yes</text> + <polygon fill="#F1F1F1" points="1180.375,1090.9133,1192.375,1102.9133,1180.375,1114.9133,1168.375,1102.9133,1180.375,1090.9133" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="1100.375,263.903,1260.375,263.903,1272.375,275.903,1260.375,287.903,1100.375,287.903,1088.375,275.903,1100.375,263.903" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="160" x="1100.375" y="280.1709">iterate over pools and subnets</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="1115.875" y="1173.9133"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="109" x="1125.875" y="1196.7414">maximum attempts</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="1127.875" y="1240.8351"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="1137.875" y="1263.6632">return no lease</text> + <ellipse cx="1180.375" cy="1317.6882" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="1180.375" cy="1317.6882" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="1061.875,214.412,1298.875,214.412,1310.875,226.412,1298.875,238.412,1061.875,238.412,1049.875,226.412,1061.875,214.412" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="1184.375" y="250.1709">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="237" x="1061.875" y="230.68">client lease and lease address in allowed pool</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="1310.875" y="223.1891">yes</text> + <polygon fill="#F1F1F1" points="956.6875,1356.6882,968.6875,1368.6882,956.6875,1380.6882,944.6875,1368.6882,956.6875,1356.6882" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="611.8438,1386.6882,623.8438,1398.6882,611.8438,1410.6882,599.8438,1398.6882,611.8438,1386.6882" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="160" x="531.8438" y="1579.1611"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="140" x="541.8438" y="1601.9892">update lease information</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="140" x="541.8438" y="1684.9961"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="120" x="551.8438" y="1707.8242">reclaim expired lease</text> + <polygon fill="#F1F1F1" points="567.3438,1635.5052,656.3438,1635.5052,668.3438,1647.5052,656.3438,1659.5052,567.3438,1659.5052,555.3438,1647.5052,567.3438,1635.5052" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="615.8438" y="1671.2641">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="89" x="567.3438" y="1651.7731">old lease expired</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="668.3438" y="1644.2822">no</text> + <polygon fill="#F1F1F1" points="611.8438,1741.3402,623.8438,1753.3402,611.8438,1765.3402,599.8438,1753.3402,611.8438,1741.3402" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="137" x="543.3438" y="1785.3402"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="117" x="553.3438" y="1808.1683">callout lease4_renew</text> + <polygon fill="#F1F1F1" points="575.8438,1841.6844,647.8438,1841.6844,659.8438,1853.6844,647.8438,1865.6844,575.8438,1865.6844,563.8438,1853.6844,575.8438,1841.6844" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="72" x="575.8438" y="1857.9523">callout return</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="24" x="539.8438" y="1850.4614">SKIP</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="56" x="659.8438" y="1850.4614">CONTINUE</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="141" x="452.8438" y="1875.6844"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="121" x="462.8438" y="1898.5124">return old client lease</text> + <ellipse cx="523.3438" cy="1943.0285" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="523.3438" cy="1943.0285" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="92" x="654.3438" y="1875.6844"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="72" x="664.3438" y="1898.5124">update lease</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="173" x="613.8438" y="1932.0285"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="153" x="623.8438" y="1954.8566">return renewed client lease</text> + <ellipse cx="700.3438" cy="1999.3726" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="700.3438" cy="1999.3726" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <polygon fill="#F1F1F1" points="454.8438,1529.6701,768.8438,1529.6701,780.8438,1541.6701,768.8438,1553.6701,454.8438,1553.6701,442.8438,1541.6701,454.8438,1529.6701" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="615.8438" y="1565.429">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="314" x="454.8438" y="1545.9381">has reserved address or client lease address in allowed pool</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="780.8438" y="1538.4471">no</text> + <polygon fill="#F1F1F1" points="437.8438,1480.1792,785.8438,1480.1792,797.8438,1492.1792,785.8438,1504.1792,437.8438,1504.1792,425.8438,1492.1792,437.8438,1480.1792" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="615.8438" y="1515.9381">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="348" x="437.8438" y="1496.4471">no requested address or requested address == client lease address</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="797.8438" y="1488.9562">no</text> + <polygon fill="#F1F1F1" points="611.8438,2052.3726,623.8438,2064.3726,611.8438,2076.3726,599.8438,2064.3726,611.8438,2052.3726" style="stroke:#181818;stroke-width:0.5;"/> + <polygon fill="#F1F1F1" points="583.3438,1430.6882,640.3438,1430.6882,652.3438,1442.6882,640.3438,1454.6882,583.3438,1454.6882,571.3438,1442.6882,583.3438,1430.6882" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="615.8438" y="1466.4471">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="57" x="583.3438" y="1446.9562">client lease</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="652.3438" y="1439.4653">no</text> + <polygon fill="#F1F1F1" points="611.8438,2096.3726,623.8438,2108.3726,611.8438,2120.3726,599.8438,2108.3726,611.8438,2096.3726" style="stroke:#181818;stroke-width:0.5;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="198" x="512.8438" y="2140.3726"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="178" x="522.8438" y="2163.2007">get lease for requested address</text> + <polygon fill="#F1F1F1" points="570.8438,2196.7167,652.8438,2196.7167,664.8438,2208.7167,652.8438,2220.7167,570.8438,2220.7167,558.8438,2208.7167,570.8438,2196.7167" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="82" x="570.8438" y="2212.9847">requested lease</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="541.8438" y="2205.4937">yes</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="664.8438" y="2205.4937">no</text> + <polygon fill="#F1F1F1" points="409.7813,2230.7167,449.7813,2230.7167,461.7813,2242.7167,449.7813,2254.7167,409.7813,2254.7167,397.7813,2242.7167,409.7813,2230.7167" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="40" x="409.7813" y="2246.9847">expired</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="14" x="383.7813" y="2239.4937">no</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="17" x="461.7813" y="2239.4937">yes</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="275.4063" y="2264.7167"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="285.4063" y="2287.5448">return no lease</text> + <ellipse cx="327.9063" cy="2347.0608" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="327.9063" cy="2347.0608" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="140" x="461.6563" y="2264.7167"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="120" x="471.6563" y="2287.5448">reclaim expired lease</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="160" x="451.6563" y="2336.0608"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="140" x="461.6563" y="2358.8889">update lease information</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="135" x="464.1563" y="2392.4049"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="115" x="474.1563" y="2415.233">callout lease4_select</text> + <polygon fill="#F1F1F1" points="495.6563,2448.749,567.6563,2448.749,579.6563,2460.749,567.6563,2472.749,495.6563,2472.749,483.6563,2460.749,495.6563,2448.749" style="stroke:#181818;stroke-width:0.5;"/> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="72" x="495.6563" y="2465.017">callout return</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="24" x="459.6563" y="2457.5261">SKIP</text> + <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="56" x="579.6563" y="2457.5261">CONTINUE</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="105" x="410.4063" y="2482.749"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="85" x="420.4063" y="2505.5771">return no lease</text> + <ellipse cx="462.9063" cy="2550.0932" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="462.9063" cy="2550.0932" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="92" x="554.4063" y="2482.749"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="72" x="564.4063" y="2505.5771">update lease</text> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="130" x="535.4063" y="2539.0932"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="110" x="545.4063" y="2561.9212">return reused lease</text> + <ellipse cx="600.4063" cy="2606.4373" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="600.4063" cy="2606.4373" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <rect fill="#F1F1F1" height="36.3441" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="705.4063" y="2230.7167"/> + <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="157" x="715.4063" y="2253.5448">create and return new lease</text> + <ellipse cx="793.9063" cy="2313.0608" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1.0;"/> + <ellipse cx="793.9063" cy="2313.0608" fill="#222222" rx="6" ry="6" style="stroke:#111111;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="70.0679" y2="90.0679"/> + <polygon fill="#181818" points="607.8438,80.0679,611.8438,90.0679,615.8438,80.0679,611.8438,84.0679" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="405" x2="405" y1="300.2471" y2="335.2471"/> + <polygon fill="#181818" points="401,325.2471,405,335.2471,409,325.2471,405,329.2471" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="405" x2="405" y1="238.412" y2="263.903"/> + <polygon fill="#181818" points="401,253.903,405,263.903,409,253.903,405,257.903" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="543" x2="555" y1="226.412" y2="226.412"/> + <polygon fill="#181818" points="551,306.575,555,316.575,559,306.575,555,310.575" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="555" x2="555" y1="226.412" y2="400.738"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="555" x2="279" y1="400.738" y2="400.738"/> + <polygon fill="#181818" points="289,396.738,279,400.738,289,404.738,285,400.738" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="206.5" x2="129" y1="192.412" y2="192.412"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="129" x2="129" y1="192.412" y2="214.412"/> + <polygon fill="#181818" points="125,204.412,129,214.412,133,204.412,129,208.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="327.5" x2="405" y1="192.412" y2="192.412"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="405" x2="405" y1="192.412" y2="214.412"/> + <polygon fill="#181818" points="401,204.412,405,214.412,409,204.412,405,208.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="129" x2="129" y1="250.7561" y2="400.738"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="129" x2="255" y1="400.738" y2="400.738"/> + <polygon fill="#181818" points="245,396.738,255,400.738,245,404.738,249,400.738" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="583.064" y2="618.064"/> + <polygon fill="#181818" points="263,608.064,267,618.064,271,608.064,267,612.064" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="521.229" y2="546.7199"/> + <polygon fill="#181818" points="263,536.7199,267,546.7199,271,536.7199,267,540.7199" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="371" x2="383" y1="509.229" y2="509.229"/> + <polygon fill="#181818" points="379,580.392,383,590.392,387,580.392,383,584.392" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="383" x2="383" y1="509.229" y2="671.555"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="383" x2="267" y1="671.555" y2="671.555"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="671.555" y2="697.0459"/> + <polygon fill="#181818" points="263,687.0459,267,697.0459,271,687.0459,267,691.0459" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="471.738" y2="497.229"/> + <polygon fill="#181818" points="263,487.229,267,497.229,271,487.229,267,491.229" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="351.5" x2="393" y1="459.738" y2="459.738"/> + <polygon fill="#181818" points="389,574.392,393,584.392,397,574.392,393,578.392" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="393" x2="393" y1="459.738" y2="709.0459"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="393" x2="279" y1="709.0459" y2="709.0459"/> + <polygon fill="#181818" points="289,705.0459,279,709.0459,289,713.0459,285,709.0459" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="412.738" y2="447.738"/> + <polygon fill="#181818" points="263,437.738,267,447.738,271,437.738,267,441.738" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="940.8629" y2="975.8629"/> + <polygon fill="#181818" points="263,965.8629,267,975.8629,271,965.8629,267,969.8629" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="879.0278" y2="904.5188"/> + <polygon fill="#181818" points="263,894.5188,267,904.5188,271,894.5188,267,898.5188" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="294" x2="329.5" y1="867.0278" y2="867.0278"/> + <polygon fill="#181818" points="325.5,938.1908,329.5,948.1908,333.5,938.1908,329.5,942.1908" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="329.5" x2="329.5" y1="867.0278" y2="1029.3538"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="329.5" x2="267" y1="1029.3538" y2="1029.3538"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="1029.3538" y2="1054.8448"/> + <polygon fill="#181818" points="263,1044.8448,267,1054.8448,271,1044.8448,267,1048.8448" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="829.5369" y2="855.0278"/> + <polygon fill="#181818" points="263,845.0278,267,855.0278,271,845.0278,267,849.0278" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="351.5" x2="363.5" y1="817.5369" y2="817.5369"/> + <polygon fill="#181818" points="359.5,932.1908,363.5,942.1908,367.5,932.1908,363.5,936.1908" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="363.5" x2="363.5" y1="817.5369" y2="1066.8448"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="363.5" x2="279" y1="1066.8448" y2="1066.8448"/> + <polygon fill="#181818" points="289,1062.8448,279,1066.8448,289,1070.8448,285,1066.8448" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="1199.6798" y2="1230.2574"/> + <polygon fill="#181818" points="263,1220.2574,267,1230.2574,271,1220.2574,267,1224.2574" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="1137.8448" y2="1163.3357"/> + <polygon fill="#181818" points="263,1153.3357,267,1163.3357,271,1153.3357,267,1157.3357" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="369.5" x2="381.5" y1="1125.8448" y2="1125.8448"/> + <polygon fill="#181818" points="377.5,1197.0078,381.5,1207.0078,385.5,1197.0078,381.5,1201.0078" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="381.5" x2="381.5" y1="1125.8448" y2="1283.7484"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="381.5" x2="267" y1="1283.7484" y2="1283.7484"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="1283.7484" y2="1303.7484"/> + <polygon fill="#181818" points="263,1293.7484,267,1303.7484,271,1293.7484,267,1297.7484" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="1078.8448" y2="1113.8448"/> + <polygon fill="#181818" points="263,1103.8448,267,1113.8448,271,1103.8448,267,1107.8448" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="780.0459" y2="805.5369"/> + <polygon fill="#181818" points="263,795.5369,267,805.5369,271,795.5369,267,799.5369" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="381.5" x2="393.5" y1="768.0459" y2="768.0459"/> + <polygon fill="#181818" points="389.5,1036.8538,393.5,1046.8538,397.5,1036.8538,393.5,1040.8538" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="393.5" x2="393.5" y1="768.0459" y2="1315.7484"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="393.5" x2="279" y1="1315.7484" y2="1315.7484"/> + <polygon fill="#181818" points="289,1311.7484,279,1315.7484,289,1319.7484,285,1315.7484" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="721.0459" y2="756.0459"/> + <polygon fill="#181818" points="263,746.0459,267,756.0459,271,746.0459,267,750.0459" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="300.2471" y2="335.2471"/> + <polygon fill="#181818" points="729,325.2471,733,335.2471,737,325.2471,733,329.2471" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="238.412" y2="263.903"/> + <polygon fill="#181818" points="729,253.903,733,263.903,737,253.903,733,257.903" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="871" x2="883" y1="226.412" y2="226.412"/> + <polygon fill="#181818" points="879,297.575,883,307.575,887,297.575,883,301.575" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="883" x2="883" y1="226.412" y2="382.738"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="883" x2="733" y1="382.738" y2="382.738"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="382.738" y2="417.738"/> + <polygon fill="#181818" points="729,407.738,733,417.738,737,407.738,733,411.738" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="553.064" y2="588.064"/> + <polygon fill="#181818" points="729,578.064,733,588.064,737,578.064,733,582.064" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="491.229" y2="516.7199"/> + <polygon fill="#181818" points="729,506.7199,733,516.7199,737,506.7199,733,510.7199" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="837" x2="849" y1="479.229" y2="479.229"/> + <polygon fill="#181818" points="845,550.392,849,560.392,853,550.392,849,554.392" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="849" x2="849" y1="479.229" y2="641.555"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="849" x2="733" y1="641.555" y2="641.555"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="641.555" y2="667.0459"/> + <polygon fill="#181818" points="729,657.0459,733,667.0459,737,657.0459,733,661.0459" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="441.738" y2="467.229"/> + <polygon fill="#181818" points="729,457.229,733,467.229,737,457.229,733,461.229" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="817.5" x2="859" y1="429.738" y2="429.738"/> + <polygon fill="#181818" points="855,544.392,859,554.392,863,544.392,859,548.392" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="859" x2="859" y1="429.738" y2="679.0459"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="859" x2="745" y1="679.0459" y2="679.0459"/> + <polygon fill="#181818" points="755,675.0459,745,679.0459,755,683.0459,751,679.0459" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="811.881" y2="846.881"/> + <polygon fill="#181818" points="729,836.881,733,846.881,737,836.881,733,840.881" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="750.0459" y2="775.5369"/> + <polygon fill="#181818" points="729,765.5369,733,775.5369,737,765.5369,733,769.5369" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="835.5" x2="847.5" y1="738.0459" y2="738.0459"/> + <polygon fill="#181818" points="843.5,1053.0692,847.5,1063.0692,851.5,1053.0692,847.5,1057.0692" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="847.5" x2="847.5" y1="738.0459" y2="1368.6882"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="847.5" x2="944.6875" y1="1368.6882" y2="1368.6882"/> + <polygon fill="#181818" points="934.6875,1364.6882,944.6875,1368.6882,934.6875,1372.6882,938.6875,1368.6882" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="691.0459" y2="726.0459"/> + <polygon fill="#181818" points="729,716.0459,733,726.0459,737,716.0459,733,720.0459" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1055.5" x2="1055.5" y1="546.5731" y2="581.5731"/> + <polygon fill="#181818" points="1051.5,571.5731,1055.5,581.5731,1059.5,571.5731,1055.5,575.5731" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1305.25" x2="1305.25" y1="596.064" y2="631.064"/> + <polygon fill="#181818" points="1301.25,621.064,1305.25,631.064,1309.25,621.064,1305.25,625.064" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1305.25" x2="1305.25" y1="667.4081" y2="702.4081"/> + <polygon fill="#181818" points="1301.25,692.4081,1305.25,702.4081,1309.25,692.4081,1305.25,696.4081" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1236.5" x2="1236.5" y1="844.0964" y2="879.0964"/> + <polygon fill="#181818" points="1232.5,869.0964,1236.5,879.0964,1240.5,869.0964,1236.5,873.0964" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1374" x2="1374" y1="844.0964" y2="879.0964"/> + <polygon fill="#181818" points="1370,869.0964,1374,879.0964,1378,869.0964,1374,873.0964" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1374" x2="1374" y1="915.4405" y2="950.4405"/> + <polygon fill="#181818" points="1370,940.4405,1374,950.4405,1378,940.4405,1374,944.4405" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1257.25" x2="1236.5" y1="785.7523" y2="785.7523"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1236.5" x2="1236.5" y1="785.7523" y2="807.7523"/> + <polygon fill="#181818" points="1232.5,797.7523,1236.5,807.7523,1240.5,797.7523,1236.5,801.7523" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1353.25" x2="1374" y1="785.7523" y2="785.7523"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1374" x2="1374" y1="785.7523" y2="807.7523"/> + <polygon fill="#181818" points="1370,797.7523,1374,807.7523,1378,797.7523,1374,801.7523" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1305.25" x2="1305.25" y1="738.7523" y2="773.7523"/> + <polygon fill="#181818" points="1301.25,763.7523,1305.25,773.7523,1309.25,763.7523,1305.25,767.7523" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1305.25" x2="1305.25" y1="534.229" y2="559.7199"/> + <polygon fill="#181818" points="1301.25,549.7199,1305.25,559.7199,1309.25,549.7199,1305.25,553.7199" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1337.25" x2="1453" y1="522.229" y2="522.229"/> + <polygon fill="#181818" points="1449,759.0802,1453,769.0802,1457,759.0802,1453,763.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1453" x2="1453" y1="522.229" y2="1015.9314"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1453" x2="1180.375" y1="1015.9314" y2="1015.9314"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="1015.9314" y2="1041.4224"/> + <polygon fill="#181818" points="1176.375,1031.4224,1180.375,1041.4224,1184.375,1031.4224,1180.375,1035.4224" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1118.875" x2="1055.5" y1="488.229" y2="488.229"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1055.5" x2="1055.5" y1="488.229" y2="510.229"/> + <polygon fill="#181818" points="1051.5,500.229,1055.5,510.229,1059.5,500.229,1055.5,504.229" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1241.875" x2="1305.25" y1="488.229" y2="488.229"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1305.25" x2="1305.25" y1="488.229" y2="510.229"/> + <polygon fill="#181818" points="1301.25,500.229,1305.25,510.229,1309.25,500.229,1305.25,504.229" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="450.738" y2="476.229"/> + <polygon fill="#181818" points="1176.375,466.229,1180.375,476.229,1184.375,466.229,1180.375,470.229" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1286.875" x2="1471" y1="438.738" y2="438.738"/> + <polygon fill="#181818" points="1467,736.0802,1471,746.0802,1475,736.0802,1471,740.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1471" x2="1471" y1="438.738" y2="1053.4224"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1471" x2="1192.375" y1="1053.4224" y2="1053.4224"/> + <polygon fill="#181818" points="1202.375,1049.4224,1192.375,1053.4224,1202.375,1057.4224,1198.375,1053.4224" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="401.2471" y2="426.738"/> + <polygon fill="#181818" points="1176.375,416.738,1180.375,426.738,1184.375,416.738,1180.375,420.738" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1295.375" x2="1489" y1="389.2471" y2="389.2471"/> + <polygon fill="#181818" points="1485,736.0802,1489,746.0802,1493,736.0802,1489,740.0802" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1489" x2="1489" y1="389.2471" y2="1102.9133"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1489" x2="1192.375" y1="1102.9133" y2="1102.9133"/> + <polygon fill="#181818" points="1202.375,1098.9133,1192.375,1102.9133,1202.375,1106.9133,1198.375,1102.9133" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="1065.4224" y2="1090.9133"/> + <polygon fill="#181818" points="1176.375,1080.9133,1180.375,1090.9133,1184.375,1080.9133,1180.375,1084.9133" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="348.2471" y2="377.2471"/> + <polygon fill="#181818" points="1176.375,367.2471,1180.375,377.2471,1184.375,367.2471,1180.375,371.2471" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="287.903" y2="311.903"/> + <polygon fill="#181818" points="1176.375,301.903,1180.375,311.903,1184.375,301.903,1180.375,305.903" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="1114.9133" y2="1126.9133"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1507" y1="1126.9133" y2="1126.9133"/> + <polygon fill="#181818" points="1503,708.4081,1507,698.4081,1511,708.4081,1507,704.4081" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1507" x2="1507" y1="275.903" y2="1126.9133"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1507" x2="1272.375" y1="275.903" y2="275.903"/> + <polygon fill="#181818" points="1282.375,271.903,1272.375,275.903,1282.375,279.903,1278.375,275.903" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1088.375" x2="925" y1="275.903" y2="275.903"/> + <polygon fill="#181818" points="921,694.4081,925,704.4081,929,694.4081,925,698.4081" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="925" x2="925" y1="275.903" y2="1138.9133"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="925" x2="1180.375" y1="1138.9133" y2="1138.9133"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="1138.9133" y2="1173.9133"/> + <polygon fill="#181818" points="1176.375,1163.9133,1180.375,1173.9133,1184.375,1163.9133,1180.375,1167.9133" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="1210.2574" y2="1240.8351"/> + <polygon fill="#181818" points="1176.375,1230.8351,1180.375,1240.8351,1184.375,1230.8351,1180.375,1234.8351" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="1277.1792" y2="1306.6882"/> + <polygon fill="#181818" points="1176.375,1296.6882,1180.375,1306.6882,1184.375,1296.6882,1180.375,1300.6882" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="238.412" y2="263.903"/> + <polygon fill="#181818" points="1176.375,253.903,1180.375,263.903,1184.375,253.903,1180.375,257.903" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1310.875" x2="1517" y1="226.412" y2="226.412"/> + <polygon fill="#181818" points="1513,794.2523,1517,804.2523,1521,794.2523,1517,798.2523" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1517" x2="1517" y1="226.412" y2="1368.6882"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1517" x2="968.6875" y1="1368.6882" y2="1368.6882"/> + <polygon fill="#181818" points="978.6875,1364.6882,968.6875,1368.6882,978.6875,1372.6882,974.6875,1368.6882" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="896.1875" x2="733" y1="192.412" y2="192.412"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="733" x2="733" y1="192.412" y2="214.412"/> + <polygon fill="#181818" points="729,204.412,733,214.412,737,204.412,733,208.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1017.1875" x2="1180.375" y1="192.412" y2="192.412"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="1180.375" x2="1180.375" y1="192.412" y2="214.412"/> + <polygon fill="#181818" points="1176.375,204.412,1180.375,214.412,1184.375,204.412,1180.375,208.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="554.8438" x2="267" y1="158.412" y2="158.412"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="158.412" y2="180.412"/> + <polygon fill="#181818" points="263,170.412,267,180.412,271,170.412,267,174.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="668.8438" x2="956.6875" y1="158.412" y2="158.412"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="956.6875" x2="956.6875" y1="158.412" y2="180.412"/> + <polygon fill="#181818" points="952.6875,170.412,956.6875,180.412,960.6875,170.412,956.6875,174.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="267" y1="1327.7484" y2="1398.6882"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="267" x2="599.8438" y1="1398.6882" y2="1398.6882"/> + <polygon fill="#181818" points="589.8438,1394.6882,599.8438,1398.6882,589.8438,1402.6882,593.8438,1398.6882" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="956.6875" x2="956.6875" y1="1380.6882" y2="1398.6882"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="956.6875" x2="623.8438" y1="1398.6882" y2="1398.6882"/> + <polygon fill="#181818" points="633.8438,1394.6882,623.8438,1398.6882,633.8438,1402.6882,629.8438,1398.6882" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="126.412" y2="146.412"/> + <polygon fill="#181818" points="607.8438,136.412,611.8438,146.412,615.8438,136.412,611.8438,140.412" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1659.5052" y2="1684.9961"/> + <polygon fill="#181818" points="607.8438,1674.9961,611.8438,1684.9961,615.8438,1674.9961,611.8438,1678.9961" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="668.3438" x2="691.8438" y1="1647.5052" y2="1647.5052"/> + <polygon fill="#181818" points="687.8438,1693.1682,691.8438,1703.1682,695.8438,1693.1682,691.8438,1697.1682" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="691.8438" x2="691.8438" y1="1647.5052" y2="1753.3402"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="691.8438" x2="623.8438" y1="1753.3402" y2="1753.3402"/> + <polygon fill="#181818" points="633.8438,1749.3402,623.8438,1753.3402,633.8438,1757.3402,629.8438,1753.3402" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1721.3402" y2="1741.3402"/> + <polygon fill="#181818" points="607.8438,1731.3402,611.8438,1741.3402,615.8438,1731.3402,611.8438,1735.3402" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1615.5052" y2="1635.5052"/> + <polygon fill="#181818" points="607.8438,1625.5052,611.8438,1635.5052,615.8438,1625.5052,611.8438,1629.5052" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1765.3402" y2="1785.3402"/> + <polygon fill="#181818" points="607.8438,1775.3402,611.8438,1785.3402,615.8438,1775.3402,611.8438,1779.3402" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="523.3438" x2="523.3438" y1="1912.0285" y2="1932.0285"/> + <polygon fill="#181818" points="519.3438,1922.0285,523.3438,1932.0285,527.3438,1922.0285,523.3438,1926.0285" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="700.3438" x2="700.3438" y1="1912.0285" y2="1932.0285"/> + <polygon fill="#181818" points="696.3438,1922.0285,700.3438,1932.0285,704.3438,1922.0285,700.3438,1926.0285" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="700.3438" x2="700.3438" y1="1968.3726" y2="1988.3726"/> + <polygon fill="#181818" points="696.3438,1978.3726,700.3438,1988.3726,704.3438,1978.3726,700.3438,1982.3726" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="563.8438" x2="523.3438" y1="1853.6844" y2="1853.6844"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="523.3438" x2="523.3438" y1="1853.6844" y2="1875.6844"/> + <polygon fill="#181818" points="519.3438,1865.6844,523.3438,1875.6844,527.3438,1865.6844,523.3438,1869.6844" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="659.8438" x2="700.3438" y1="1853.6844" y2="1853.6844"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="700.3438" x2="700.3438" y1="1853.6844" y2="1875.6844"/> + <polygon fill="#181818" points="696.3438,1865.6844,700.3438,1875.6844,704.3438,1865.6844,700.3438,1869.6844" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1821.6844" y2="1841.6844"/> + <polygon fill="#181818" points="607.8438,1831.6844,611.8438,1841.6844,615.8438,1831.6844,611.8438,1835.6844" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1553.6701" y2="1579.1611"/> + <polygon fill="#181818" points="607.8438,1569.1611,611.8438,1579.1611,615.8438,1569.1611,611.8438,1573.1611" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="780.8438" x2="806.8438" y1="1541.6701" y2="1541.6701"/> + <polygon fill="#181818" points="802.8438,1789.5213,806.8438,1799.5213,810.8438,1789.5213,806.8438,1793.5213" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="806.8438" x2="806.8438" y1="1541.6701" y2="2032.3726"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="806.8438" x2="611.8438" y1="2032.3726" y2="2032.3726"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="2032.3726" y2="2052.3726"/> + <polygon fill="#181818" points="607.8438,2042.3726,611.8438,2052.3726,615.8438,2042.3726,611.8438,2046.3726" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1504.1792" y2="1529.6701"/> + <polygon fill="#181818" points="607.8438,1519.6701,611.8438,1529.6701,615.8438,1519.6701,611.8438,1523.6701" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="797.8438" x2="828.8438" y1="1492.1792" y2="1492.1792"/> + <polygon fill="#181818" points="824.8438,1783.5213,828.8438,1793.5213,832.8438,1783.5213,828.8438,1787.5213" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="828.8438" x2="828.8438" y1="1492.1792" y2="2064.3726"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="828.8438" x2="623.8438" y1="2064.3726" y2="2064.3726"/> + <polygon fill="#181818" points="633.8438,2060.3726,623.8438,2064.3726,633.8438,2068.3726,629.8438,2064.3726" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1454.6882" y2="1480.1792"/> + <polygon fill="#181818" points="607.8438,1470.1792,611.8438,1480.1792,615.8438,1470.1792,611.8438,1474.1792" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="652.3438" x2="850.8438" y1="1442.6882" y2="1442.6882"/> + <polygon fill="#181818" points="846.8438,1783.5213,850.8438,1793.5213,854.8438,1783.5213,850.8438,1787.5213" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="850.8438" x2="850.8438" y1="1442.6882" y2="2108.3726"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="850.8438" x2="623.8438" y1="2108.3726" y2="2108.3726"/> + <polygon fill="#181818" points="633.8438,2104.3726,623.8438,2108.3726,633.8438,2112.3726,629.8438,2108.3726" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="2076.3726" y2="2096.3726"/> + <polygon fill="#181818" points="607.8438,2086.3726,611.8438,2096.3726,615.8438,2086.3726,611.8438,2090.3726" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="1410.6882" y2="1430.6882"/> + <polygon fill="#181818" points="607.8438,1420.6882,611.8438,1430.6882,615.8438,1420.6882,611.8438,1424.6882" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="2120.3726" y2="2140.3726"/> + <polygon fill="#181818" points="607.8438,2130.3726,611.8438,2140.3726,615.8438,2130.3726,611.8438,2134.3726" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="327.9063" x2="327.9063" y1="2301.0608" y2="2336.0608"/> + <polygon fill="#181818" points="323.9063,2326.0608,327.9063,2336.0608,331.9063,2326.0608,327.9063,2330.0608" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="531.6563" x2="531.6563" y1="2301.0608" y2="2336.0608"/> + <polygon fill="#181818" points="527.6563,2326.0608,531.6563,2336.0608,535.6563,2326.0608,531.6563,2330.0608" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="531.6563" x2="531.6563" y1="2372.4049" y2="2392.4049"/> + <polygon fill="#181818" points="527.6563,2382.4049,531.6563,2392.4049,535.6563,2382.4049,531.6563,2386.4049" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="462.9063" x2="462.9063" y1="2519.0932" y2="2539.0932"/> + <polygon fill="#181818" points="458.9063,2529.0932,462.9063,2539.0932,466.9063,2529.0932,462.9063,2533.0932" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="600.4063" x2="600.4063" y1="2519.0932" y2="2539.0932"/> + <polygon fill="#181818" points="596.4063,2529.0932,600.4063,2539.0932,604.4063,2529.0932,600.4063,2533.0932" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="600.4063" x2="600.4063" y1="2575.4373" y2="2595.4373"/> + <polygon fill="#181818" points="596.4063,2585.4373,600.4063,2595.4373,604.4063,2585.4373,600.4063,2589.4373" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="483.6563" x2="462.9063" y1="2460.749" y2="2460.749"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="462.9063" x2="462.9063" y1="2460.749" y2="2482.749"/> + <polygon fill="#181818" points="458.9063,2472.749,462.9063,2482.749,466.9063,2472.749,462.9063,2476.749" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="579.6563" x2="600.4063" y1="2460.749" y2="2460.749"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="600.4063" x2="600.4063" y1="2460.749" y2="2482.749"/> + <polygon fill="#181818" points="596.4063,2472.749,600.4063,2482.749,604.4063,2472.749,600.4063,2476.749" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="531.6563" x2="531.6563" y1="2428.749" y2="2448.749"/> + <polygon fill="#181818" points="527.6563,2438.749,531.6563,2448.749,535.6563,2438.749,531.6563,2442.749" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="397.7813" x2="327.9063" y1="2242.7167" y2="2242.7167"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="327.9063" x2="327.9063" y1="2242.7167" y2="2264.7167"/> + <polygon fill="#181818" points="323.9063,2254.7167,327.9063,2264.7167,331.9063,2254.7167,327.9063,2258.7167" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="461.7813" x2="531.6563" y1="2242.7167" y2="2242.7167"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="531.6563" x2="531.6563" y1="2242.7167" y2="2264.7167"/> + <polygon fill="#181818" points="527.6563,2254.7167,531.6563,2264.7167,535.6563,2254.7167,531.6563,2258.7167" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="793.9063" x2="793.9063" y1="2267.0608" y2="2302.0608"/> + <polygon fill="#181818" points="789.9063,2292.0608,793.9063,2302.0608,797.9063,2292.0608,793.9063,2296.0608" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="558.8438" x2="429.7813" y1="2208.7167" y2="2208.7167"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="429.7813" x2="429.7813" y1="2208.7167" y2="2230.7167"/> + <polygon fill="#181818" points="425.7813,2220.7167,429.7813,2230.7167,433.7813,2220.7167,429.7813,2224.7167" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="664.8438" x2="793.9063" y1="2208.7167" y2="2208.7167"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="793.9063" x2="793.9063" y1="2208.7167" y2="2230.7167"/> + <polygon fill="#181818" points="789.9063,2220.7167,793.9063,2230.7167,797.9063,2220.7167,793.9063,2224.7167" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="611.8438" x2="611.8438" y1="2176.7167" y2="2196.7167"/> + <polygon fill="#181818" points="607.8438,2186.7167,611.8438,2196.7167,615.8438,2186.7167,611.8438,2190.7167" style="stroke:#181818;stroke-width:1.0;"/> + <!--SRC=[tLPDRzim3BtxL_2sv59iG0z3Wvs67OeEtO1jvq6rcLgeBNaIdRJ_Vf8_8bcI7QV3W66d6F8BzKY-HveuLGWAVxMewJCoZTV0gaUfE9KrREwGmRkhzrTljrccYIdARXwHeB90s4i5L2Ba5KT1kopZUzWerAWEM00h2lEijnOYOFE2Ufi1z93kjXWZf8K0t4G8-01Xu9s1OcLeZA5dWWFNxh-MCXFINAS6sW6_uNfgbG0X-qHtmxacsNIF_RKZMnG5tsVkrx9m1PfDTiAQvSGFQAWL88_2W1zU_XvFxzJdd2XwNFMmLPScwwURU3cVb9TMc9XBOoxbMMa88_PA7irH8sKL9hUwnASCfZKUZll3p54xvuD_HD1_rjqBnVn_TTwtHv_oC3DjKOQdjKoE9JSZUiC95IC4UJ1bj4ZT1TFjWq3oozZm_0boyuuN5k-DIzSYztgTc1oRP8HMJxjCfK9MfFySgkeKQ0vkKifDEEgBDxO5Zw5A8gtuYfaepT70vuOhB99wz7IPLupNC83JznfSstJrw5FZmYHNC-9I9A2vRNaxYEBwfyOASufnVQ5xQ9_uoFJRtUtNcEgIYHPAvChqySlzzzlx7v-IeVtyTWjtA-pqSE7z9yE6d68znDZm9DdqAIW1yG7ckJFUE0vgziphjWP6X7L39p-zUavqlyDgU0DiJzPq9UPFMJWq4fzGvhPufgL6jDtXqm6qi6fAfgE5RwEc0ipDBN_jd3E4lLDMuq1SykAo1-UNGcmrXMPq-0JM-6jiiYNh5sDXHSLEcl6FSuqXXclYdrbvyVUTEndq5dp4HwhPPTEjEIV3e6NUztl24qCAWH-MEdj6G4jJT5rdLvetx6MoaqlJpyMRkjzrwioAwmBqV_eD]--> + </g> +</svg> diff --git a/doc/sphinx/uml/requestLease4.uml b/doc/sphinx/uml/requestLease4.uml new file mode 100644 index 0000000..4cb55b5 --- /dev/null +++ b/doc/sphinx/uml/requestLease4.uml @@ -0,0 +1,150 @@ +@startuml + +title requestLease4 algorithm (Kea 1.8.0) + +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 subnets) + :pick candidate address; + if (candidate is reserved for another client) then (no) + if (candidate is used by another thread) 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 + 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 diff --git a/doc/sphinx/uml/select4.png b/doc/sphinx/uml/select4.png Binary files differnew file mode 100644 index 0000000..a89f54c --- /dev/null +++ b/doc/sphinx/uml/select4.png diff --git a/doc/sphinx/uml/select4.svg b/doc/sphinx/uml/select4.svg new file mode 100644 index 0000000..b733a70 --- /dev/null +++ b/doc/sphinx/uml/select4.svg @@ -0,0 +1,345 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="2308px" preserveAspectRatio="none" style="width:1429px;height:2308px;background:#FFFFFF;" version="1.1" viewBox="0 0 1429 2308" width="1429px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="248" x="583.5" y="24.9659">DHCPv4 subnet selection (Kea 1.8.0)</text> + <!--cluster relayed--> + <g id="cluster_relayed"> + <rect fill="none" height="391.06" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="442" x="7" y="359.2779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="54" x="201" y="376.2439">Relayed</text> + </g> + <!--cluster set_address--> + <g id="cluster_set_address"> + <rect fill="none" height="172.93" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="792" x="226" y="817.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="157" x="543.5" y="834.3039">Set address for lookup</text> + </g> + <!--cluster interface--> + <g id="cluster_interface"> + <rect fill="none" height="509.27" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="392" x="919" y="1049.2679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="156" x="1037" y="1066.2339">Try incoming interface</text> + </g> + <!--cluster address--> + <g id="cluster_address"> + <rect fill="none" height="309.14" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:1.0;" width="186" x="737" y="1609.5379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="80" x="790" y="1626.5039">Try address</text> + </g> + <!--entity relay_subnet--> + <g id="elem_relay_subnet"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="226" x="170" y="451.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="206" x="180" y="476.1039">Relay address matches subnet</text> + </g> + <!--entity relay_network--> + <g id="elem_relay_network"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="284" x="141" y="569.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="264" x="151" y="594.1639">Relay address matches shared network</text> + </g> + <!--entity relay_class--> + <g id="elem_relay_class"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="138" x="113" y="687.2679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="118" x="123" y="712.2339">Check client class</text> + </g> + <!--entity relay_address--> + <g id="elem_relay_address"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="136" x="250" y="927.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="116" x="260" y="952.1639">Set relay address</text> + </g> + <!--entity client_address--> + <g id="elem_client_address"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="140" x="544" y="927.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="120" x="554" y="952.1639">Set client address</text> + </g> + <!--entity source_address--> + <g id="elem_source_address"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="148" x="846" y="927.1979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="128" x="856" y="952.1639">Set source address</text> + </g> + <!--entity interface_subnet--> + <g id="elem_interface_subnet"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="193" x="970.5" y="1087.2679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="173" x="980.5" y="1112.2339">Interface matches subnet</text> + </g> + <!--entity interface_network--> + <g id="elem_interface_network"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="251" x="1044.5" y="1205.3379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="231" x="1054.5" y="1230.3039">Interface matches shared network</text> + </g> + <!--entity interface_class--> + <g id="elem_interface_class"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="138" x="995" y="1323.3979"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="118" x="1005" y="1348.3639">Check client class</text> + </g> + <!--entity interface_address--> + <g id="elem_interface_address"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="163" x="935.5" y="1503.4679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="143" x="945.5" y="1528.4339">Set interface address</text> + </g> + <!--entity inRange--> + <g id="elem_inRange"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="154" x="753" y="1647.5379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="134" x="763" y="1672.5039">Check subnet prefix</text> + </g> + <!--entity address_class--> + <g id="elem_address_class"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="138" x="769" y="1863.6079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="118" x="779" y="1888.5739">Check client class</text> + </g> + <!--entity entry--> + <g id="elem_entry"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="94" x="348" y="47.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="74" x="358" y="72.0339">Entry point</text> + </g> + <!--entity rai_link_select--> + <g id="elem_rai_link_select"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="139" x="325.5" y="147.1379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="119" x="335.5" y="172.1039">Try RAI link select</text> + </g> + <!--entity subnet_select--> + <g id="elem_subnet_select"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="203" x="293.5" y="247.2079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="183" x="303.5" y="272.1739">Try subnet selection option</text> + </g> + <!--entity found--> + <g id="elem_found"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="696.5" y="2045.6779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="105" x="706.5" y="2070.6439">Found a subnet</text> + </g> + <!--entity not_found--> + <g id="elem_not_found"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="134" x="856" y="2045.6779"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="114" x="866" y="2070.6439">Found no subnet</text> + </g> + <!--entity subnet4_select--> + <g id="elem_subnet4_select"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="171" x="754.5" y="2145.7379"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="151" x="764.5" y="2170.7039">Callout subnet4_select</text> + </g> + <!--entity success--> + <g id="elem_success"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="575.5" y="2263.8079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="109" x="585.5" y="2288.7739">Return a subnet</text> + </g> + <!--entity no_subnet--> + <g id="elem_no_subnet"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="138" x="771" y="2263.8079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="118" x="781" y="2288.7739">Return no subnet</text> + </g> + <!--entity drop--> + <g id="elem_drop"> + <rect fill="#F1F1F1" height="39.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="96" x="967" y="2263.8079"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="76" x="977" y="2288.7739">Drop query</text> + </g> + <!--link entry to rai_link_select--> + <g id="link_entry_rai_link_select"> + <path d="M395,86.5179 C395,101.8479 395,123.5879 395,140.4079 " fill="none" id="entry-to-rai_link_select" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="395,145.3079,399,136.3079,395,140.3079,391,136.3079,395,145.3079" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link rai_link_select to subnet_select--> + <g id="link_rai_link_select_subnet_select"> + <path d="M395,186.5779 C395,201.9079 395,223.6579 395,240.4779 " fill="none" id="rai_link_select-to-subnet_select" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="395,245.3779,399,236.3779,395,240.3779,391,236.3779,395,245.3779" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link subnet_select to relayed--> + <g id="link_subnet_select_relayed"> + <path d="M386.56,286.6279 C379.085,303.3629 367.9325,328.3354 358.5325,349.3829 C357.3575,352.0139 356.2099,354.5835 355.1003,357.068 C354.8228,357.6891 354.5478,358.3049 354.2753,358.9151 " fill="none" id="subnet_select-to-relayed" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="354.2753,358.9151,361.5978,352.3286,356.3143,354.3497,354.2932,349.0662,354.2753,358.9151" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="44" x="373" y="331.1749">relayed</text> + </g> + <!--link subnet_select to set_address--> + <g id="link_subnet_select_set_address"> + <path d="M430.75,286.5979 C463.86,306.9379 508,342.6679 508,388.6379 C508,388.6379 508,388.6379 508,707.8079 C508,756.6779 465.6075,791.0879 422.5525,813.4329 C421.207,814.1312 419.8609,814.8177 418.5154,815.4925 C417.8427,815.8299 417.1701,816.1643 416.4978,816.4959 C416.1617,816.6617 415.8256,816.8267 415.4897,816.991 " fill="none" id="subnet_select-to-set_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="415.4897,816.991,425.3319,816.63,419.9812,814.7942,421.817,809.4435,415.4897,816.991" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="68" x="509" y="535.0949">not relayed</text> + </g> + <!--link relayed to relay_subnet--> + <g id="link_relayed_relay_subnet"> + <path d="M340.83,390.3679 C338.72,393.2679 316.86,423.2379 300.64,445.4879 " fill="none" id="relayed-to-relay_subnet" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="297.75,449.4479,306.2806,444.5256,300.6926,445.4055,299.8126,439.8175,297.75,449.4479" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link relay_subnet to relay_network--> + <g id="link_relay_subnet_relay_network"> + <path d="M283,490.5779 C283,510.1379 283,540.7979 283,562.4379 " fill="none" id="relay_subnet-to-relay_network" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="283,567.3279,287,558.3279,283,562.3279,279,558.3279,283,567.3279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="284" y="535.0949">no match</text> + </g> + <!--link relay_subnet to relay_class--> + <g id="link_relay_subnet_relay_class"> + <path d="M198.2,490.6879 C156.15,504.8679 109.09,528.9679 84,569.1979 C57.99,610.9179 108.63,656.8779 146.32,683.4379 " fill="none" id="relay_subnet-to-relay_class" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="150.06,686.0279,144.9432,677.6125,145.9511,683.1789,140.3848,684.1868,150.06,686.0279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="38" x="85" y="594.1349">match</text> + </g> + <!--link relay_network to set_address--> + <g id="link_relay_network_set_address"> + <path d="M286.68,608.6279 C292.36,637.8379 303.67,695.9654 313.6913,747.4692 C318.7019,773.221 323.3903,797.317 326.8917,815.3143 C327.0011,815.8767 327.1094,816.4332 327.2165,816.9836 " fill="none" id="relay_network-to-set_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="327.2165,816.9836,329.4241,807.3853,326.2616,812.0756,321.5714,808.9131,327.2165,816.9836" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="317" y="712.2049">no match</text> + </g> + <!--link relay_network to relay_class--> + <g id="link_relay_network_relay_class"> + <path d="M266.55,608.6479 C249.09,628.7079 221.46,660.4579 202.57,682.1679 " fill="none" id="relay_network-to-relay_class" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="199.44,685.7679,208.3589,681.5903,202.7163,681.9909,202.3157,676.3482,199.44,685.7679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="38" x="240" y="653.1649">match</text> + </g> + <!--link relay_class to found--> + <g id="link_relay_class_found"> + <path d="M178.01,726.5779 C172.7,753.1779 164,803.4179 164,846.6979 C164,846.6979 164,846.6979 164,1976.1779 C164,2028.7979 532.92,2053.1279 689.77,2061.0979 " fill="none" id="relay_class-to-found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="694.66,2061.3479,685.8653,2056.9148,689.6659,2061.1047,685.476,2064.9053,694.66,2061.3479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="67" x="165" y="1438.3649">compatible</text> + </g> + <!--link relay_class to set_address--> + <g id="link_relay_class_set_address"> + <path d="M186.01,726.6779 C190.9,745.6379 200.85,774.6479 219,793.3379 C223.795,798.2767 229.1359,802.8079 234.8159,806.9572 C237.6558,809.0318 240.5806,811.0109 243.5642,812.8978 C245.056,813.8412 246.5625,814.7615 248.0805,815.6592 C248.8395,816.108 249.6014,816.5511 250.3657,816.9887 C250.5568,817.0981 250.7481,817.2071 250.9395,817.3158 " fill="none" id="relay_class-to-set_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="250.9395,817.3158,245.0885,809.3933,246.5916,814.8468,241.1381,816.3499,250.9395,817.3158" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="91" x="220" y="789.2349">not compatible</text> + </g> + <!--link set_address to relay_address--> + <g id="link_set_address_relay_address"> + <path d="M332.96,848.4779 C332.38,852.2479 326.08,893.1779 321.85,920.7279 " fill="none" id="set_address-to-relay_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="321.1,925.5779,326.4166,917.2873,321.8571,920.6356,318.5088,916.076,321.1,925.5779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="122" x="329" y="893.0949">try the relay address</text> + </g> + <!--link relay_address to client_address--> + <g id="link_relay_address_client_address"> + <path d="M386.28,946.7279 C431.37,946.7279 490.52,946.7279 537.24,946.7279 " fill="none" id="relay_address-to-client_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="542.24,946.7279,533.24,942.7279,537.24,946.7279,533.24,950.7279,542.24,946.7279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="122" x="404" y="939.6249">has no relay address</text> + </g> + <!--link client_address to source_address--> + <g id="link_client_address_source_address"> + <path d="M684.2,946.7279 C730.39,946.7279 790.98,946.7279 839.17,946.7279 " fill="none" id="client_address-to-source_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="844.07,946.7279,835.07,942.7279,839.07,946.7279,835.07,950.7279,844.07,946.7279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="125" x="702.5" y="939.6249">has no client address</text> + </g> + <!--link source_address to interface_subnet--> + <g id="link_source_address_interface_subnet"> + <path d="M937.44,966.4879 C964.41,995.4779 1016.16,1051.1279 1045.43,1082.6079 " fill="none" id="source_address-to-interface_subnet" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1048.55,1085.9679,1045.3321,1076.6596,1045.1379,1082.3131,1039.4844,1082.119,1048.55,1085.9679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="116" x="998" y="1029.1649">no suitable address</text> + </g> + <!--link relay_address to inRange--> + <g id="link_relay_address_inRange"> + <path d="M318,966.7079 C318,996.3879 318,1055.5779 318,1105.7979 C318,1105.7979 318,1105.7979 318,1524.0079 C318,1611.7779 600.91,1647.5579 746.13,1660.1479 " fill="none" id="relay_address-to-inRange" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="751.01,1660.5679,742.3868,1655.8097,746.0285,1660.1385,741.6997,1663.7801,751.01,1660.5679" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="113" x="319" y="1348.3349">has a relay address</text> + </g> + <!--link client_address to inRange--> + <g id="link_client_address_inRange"> + <path d="M588.81,966.6479 C556.06,993.6079 503,1046.4479 503,1105.7979 C503,1105.7979 503,1105.7979 503,1524.0079 C503,1629.9979 649.31,1657.7579 746.2,1664.5179 " fill="none" id="client_address-to-inRange" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="751,1664.8379,742.2817,1660.2564,746.0108,1664.5101,741.7571,1668.2392,751,1664.8379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="116" x="504" y="1348.3349">has a client address</text> + </g> + <!--link source_address to inRange--> + <g id="link_source_address_inRange"> + <path d="M845.65,965.7379 C778.78,986.8879 691,1029.2279 691,1105.7979 C691,1105.7979 691,1105.7979 691,1524.0079 C691,1578.9879 744.85,1620.5679 785.52,1644.1279 " fill="none" id="source_address-to-inRange" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="789.59,1646.4379,783.7463,1638.51,785.2444,1643.9649,779.7895,1645.463,789.59,1646.4379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="210" x="692" y="1348.3349">has source address and use unicast</text> + </g> + <!--link interface_subnet to not_found--> + <g id="link_interface_subnet_not_found"> + <path d="M1163.65,1109.3879 C1245.29,1116.4879 1349,1141.6779 1349,1223.8679 C1349,1223.8679 1349,1223.8679 1349,1976.1779 C1349,2047.3079 1118.33,2061.4179 996.47,2063.9179 " fill="none" id="interface_subnet-to-not_found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="991.54,2064.0079,1000.6182,2067.8272,996.539,2063.9079,1000.4582,2059.8288,991.54,2064.0079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="71" x="1350" y="1589.4349">no interface</text> + </g> + <!--link interface_subnet to interface_class--> + <g id="link_interface_subnet_interface_class"> + <path d="M1044.43,1126.7879 C1025,1144.7379 998.36,1173.5779 987,1205.3379 C971.83,1247.7379 1008.42,1292.3879 1036.21,1318.6679 " fill="none" id="interface_subnet-to-interface_class" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1039.82,1322.0079,1035.9155,1312.9661,1036.1443,1318.6183,1030.4921,1318.8471,1039.82,1322.0079" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="38" x="988" y="1230.2649">match</text> + </g> + <!--link interface_subnet to interface_network--> + <g id="link_interface_subnet_interface_network"> + <path d="M1083.78,1126.7079 C1101.58,1146.7779 1129.76,1178.5179 1149.02,1200.2279 " fill="none" id="interface_subnet-to-interface_network" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1152.22,1203.8379,1149.2304,1194.4538,1148.8982,1200.1009,1143.2511,1199.7687,1152.22,1203.8379" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="1125" y="1171.2349">no match</text> + </g> + <!--link interface_network to interface_class--> + <g id="link_interface_network_interface_class"> + <path d="M1152.73,1244.7779 C1134.41,1264.8379 1105.41,1296.5879 1085.59,1318.2979 " fill="none" id="interface_network-to-interface_class" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1082.28,1321.9179,1091.306,1317.9769,1085.6547,1318.2286,1085.4031,1312.5773,1082.28,1321.9179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="38" x="1124" y="1289.2949">march</text> + </g> + <!--link interface_network to not_found--> + <g id="link_interface_network_not_found"> + <path d="M1189.38,1244.8879 C1209.17,1266.4279 1237,1303.5479 1237,1341.9379 C1237,1341.9379 1237,1341.9379 1237,1976.1779 C1237,2025.8479 1089.48,2048.7879 996.67,2058.2979 " fill="none" id="interface_network-to-not_found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="991.87,2058.7879,1001.2242,2061.8699,996.845,2058.289,1000.4259,2053.9098,991.87,2058.7879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="1238" y="1672.4649">no match</text> + </g> + <!--link interface_class to found--> + <g id="link_interface_class_found"> + <path d="M1085.86,1362.7379 C1101.31,1377.4979 1120.83,1399.5079 1130,1423.4679 C1179.63,1553.1279 1133.94,1597.0079 1142,1735.6079 C1143,1752.7379 1145,1756.9479 1145,1774.1079 C1145,1774.1079 1145,1774.1079 1145,1976.1779 C1145,2045.9079 906.97,2030.0779 839,2045.6779 C835.44,2046.4879 831.79,2047.3279 828.1,2048.1779 " fill="none" id="interface_class-to-found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="823.35,2049.2779,833.0206,2051.1435,828.221,2048.1494,831.215,2043.3499,823.35,2049.2779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="67" x="1143" y="1731.5049">compatible</text> + </g> + <!--link interface_class to interface_address--> + <g id="link_interface_class_interface_address"> + <path d="M1055.33,1362.8379 C1048.36,1378.7179 1038.81,1402.1679 1033,1423.4679 C1026.32,1447.9579 1022.05,1476.6679 1019.61,1496.7679 " fill="none" id="interface_class-to-interface_address" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1019.03,1501.7279,1024.0584,1493.2594,1019.6167,1496.7625,1016.1137,1492.3207,1019.03,1501.7279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="91" x="1034" y="1438.3649">not compatible</text> + </g> + <!--link interface_address to inRange--> + <g id="link_interface_address_inRange"> + <path d="M935.09,1535.7079 C890.06,1543.9979 840.63,1556.8179 827,1574.5379 C812.66,1593.1879 815.9,1620.8679 821.19,1640.8979 " fill="none" id="interface_address-to-inRange" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="822.54,1645.6579,823.9213,1635.9064,821.1702,1640.8492,816.2273,1638.0981,822.54,1645.6579" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="144" x="828" y="1589.4349">has an interface address</text> + </g> + <!--link interface_address to not_found--> + <g id="link_interface_address_not_found"> + <path d="M1013.09,1542.7479 C1007.8,1569.8479 999,1621.5679 999,1666.0679 C999,1666.0679 999,1666.0679 999,1976.1779 C999,2003.1679 978.28,2025.9679 958.48,2041.6079 " fill="none" id="interface_address-to-not_found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="954.68,2044.4979,964.2621,2042.2211,958.6558,2041.466,959.411,2035.8597,954.68,2044.4979" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="121" x="1000" y="1829.5049">no interface address</text> + </g> + <!--link inRange to address_class--> + <g id="link_inRange_address_class"> + <path d="M830.71,1687.0679 C832.15,1725.7079 835.43,1813.4579 837.06,1856.8679 " fill="none" id="inRange-to-address_class" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="837.24,1861.6779,840.9032,1852.5356,837.0544,1856.6814,832.9087,1852.8326,837.24,1861.6779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="38" x="835" y="1780.5049">match</text> + </g> + <!--link inRange to not_found--> + <g id="link_inRange_not_found"> + <path d="M759.3,1687.0679 C718.42,1702.8079 675,1729.9279 675,1774.1079 C675,1774.1079 675,1774.1079 675,1976.1779 C675,1994.8679 776.34,2025.6379 849.46,2045.3979 " fill="none" id="inRange-to-not_found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="854.1,2046.6479,846.4494,2040.4457,849.2719,2045.348,844.3696,2048.1706,854.1,2046.6479" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="57" x="676" y="1888.5349">no match</text> + </g> + <!--link address_class to found--> + <g id="link_address_class_found"> + <path d="M803.16,1902.9579 C753.3,1930.6979 665.77,1982.7179 649,2014.6779 C637.19,2037.1879 661.3,2049.4879 689.93,2056.1979 " fill="none" id="address_class-to-found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="694.62,2057.2179,686.6857,2051.3829,689.7361,2056.1469,684.9721,2059.1972,694.62,2057.2179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="67" x="701" y="1980.5749">compatible</text> + </g> + <!--link address_class to not_found--> + <g id="link_address_class_not_found"> + <path d="M845.19,1902.9179 C853.15,1923.2979 866.63,1956.6779 880,1984.6779 C888.98,2003.4679 900.2,2024.1479 908.93,2039.7079 " fill="none" id="address_class-to-not_found" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="911.28,2043.8779,910.3433,2034.0737,908.8239,2039.5227,903.3749,2038.0034,911.28,2043.8779" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="91" x="881" y="1980.5749">not compatible</text> + </g> + <!--link found to subnet4_select--> + <g id="link_found_subnet4_select"> + <path d="M774.62,2085.1179 C787.73,2100.9879 806.52,2123.7379 820.59,2140.7779 " fill="none" id="found-to-subnet4_select" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="823.47,2144.2579,820.8228,2134.7715,820.286,2140.4028,814.6546,2139.8659,823.47,2144.2579" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link not_found to subnet4_select--> + <g id="link_not_found_subnet4_select"> + <path d="M907,2085.1179 C893.56,2100.9879 874.31,2123.7379 859.89,2140.7779 " fill="none" id="not_found-to-subnet4_select" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="856.93,2144.2679,865.7977,2139.9827,860.1604,2140.4515,859.6915,2134.8141,856.93,2144.2679" style="stroke:#181818;stroke-width:1.0;"/> + </g> + <!--link found to not_found--> + <!--link subnet4_select to success--> + <g id="link_subnet4_select_success"> + <path d="M754.28,2174.9179 C724.09,2181.6979 691.77,2193.6879 668,2214.8079 C655.63,2225.7979 648.6,2243.1079 644.67,2257.4579 " fill="none" id="subnet4_select-to-success" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="643.55,2261.9279,649.6348,2254.1836,644.7761,2257.0806,641.8791,2252.2218,643.55,2261.9279" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="158" x="669" y="2229.7049">CONTINUE and subnet set</text> + </g> + <!--link subnet4_select to no_subnet--> + <g id="link_subnet4_select_no_subnet"> + <path d="M838.56,2185.1679 C837.95,2194.1379 837.3,2205.0179 837,2214.8079 C836.57,2228.7979 837.19,2244.3979 837.98,2257.0879 " fill="none" id="subnet4_select-to-no_subnet" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="838.3,2261.9179,841.6731,2252.6647,837.957,2256.9297,833.692,2253.2135,838.3,2261.9179" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="133" x="838" y="2229.7049">SKIP or subnet not set</text> + </g> + <!--link subnet4_select to drop--> + <g id="link_subnet4_select_drop"> + <path d="M922.26,2185.2079 C941.3,2192.2879 960.5,2201.8879 976,2214.8079 C989.56,2226.1179 999.42,2243.4179 1005.84,2257.6779 " fill="none" id="subnet4_select-to-drop" style="stroke:#181818;stroke-width:1.0;"/> + <polygon fill="#181818" points="1007.78,2262.1879,1007.9113,2252.3399,1005.8104,2257.5922,1000.5581,2255.4913,1007.78,2262.1879" style="stroke:#181818;stroke-width:1.0;"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="35" x="992" y="2229.7049">DROP</text> + </g> + <!--SRC=[ZPPDRzim38Rl_XL2JziXnGRqCFHGO4WwB2ZG1cbt6eP0jPbOY2jvahmj6FRVfo_hotBJIskHpqjHf4n74ja1MdrTRdvT8J4yKv18G0Ur98oYTtU0qSVBJvSVtbSLFW2LwEAMIdv2FIDKNY0i4EYrzpuft_Rp6dM47bqWGt5CTjgsixQ4dspBUltFwApFgxZwY-b1fNonXGwVeB7HxJFwMo4NrtWHRXeEGg0NBEiMncX1ihE6SweMSnLSWRyPFqPgP_7oPGlr4TKTqQkwmq94i5bN_v8pFAfZZxlj6KSTOyUXjmTNfnvTuLXQmECaemsS9M5TBZ5iJKLQi87NaD3MvEaqVTqyGclsGkX1FKZWUro3qVbLbFpQsmhzy8Ay9mNLj1z1_SQU187jIro6a7jSYQ2OBqRCJvjdKt6tlUUm9tzSvAsA0UTITW73HNBu5pRG1k6uc7jjoW3AOe8okKkf9UuwDaW7NUsYbpSrUSKMvC1fkhCOwbhN9cFopSScZzYAinxz782V3D2ePLMPoO8MYvl9zCZMXaadHRAoCToCk1wV2apyqbth6dbsLFj8umdYHUHrrz14iHTtZZJjL5mCZUfIJhFWV3XhMsZ8z5ovrKlROqcUEyYOKX4YE7Q6JGEkEoPRI8TKbL8BheJf65BArboCJ9XHHfcEfA1CPrsLOJhPVCROUeg1IApEDfUj4PetrEs5poHP4BmbjrYHJcA4LSy60MYWfCP2LfE3cDxwTzgUoqCb_2QVWFxAd84B5tlgd8lFP-XfyddarwzmaPiCxEbjdYA5vj7f1w4eVAK3aSw6DdGoqAFwHqYnAgbkhYO5AesMLCAQmnprmpve2axd-DwIfW7w8zgXIaadDjy6jVdouVvfVV_jrbni__DFbaJ-Mw5aZtVh3L8_avn17s56fJyWIh3QFcog_m00]--> + </g> +</svg> diff --git a/doc/sphinx/uml/select4.uml b/doc/sphinx/uml/select4.uml new file mode 100644 index 0000000..ed8b65c --- /dev/null +++ b/doc/sphinx/uml/select4.uml @@ -0,0 +1,85 @@ +@startuml + +title DHCPv4 subnet selection (Kea 1.8.0) + +agent "Entry point" as entry + +agent "Try RAI link select" as rai_link_select + +agent "Try subnet selection option" as subnet_select + +rectangle "Relayed" as relayed { + agent "Relay address matches subnet" as relay_subnet + agent "Relay address matches shared network" as relay_network + agent "Check client class" as relay_class +} + +rectangle "Set address for lookup" as set_address { + agent "Set relay address" as relay_address + agent "Set client address" as client_address + agent "Set source address" as source_address +} + +rectangle "Try incoming interface" as interface { + agent "Interface matches subnet" as interface_subnet + agent "Interface matches shared network" as interface_network + agent "Check client class" as interface_class + agent "Set interface address" as interface_address +} + +rectangle "Try address" as address { + agent "Check subnet prefix" as inRange + agent "Check client class" as address_class +} + +agent "Found a subnet" as found + +agent "Found no subnet" as not_found + +agent "Callout subnet4_select" as subnet4_select + +agent "Return a subnet" as success + +agent "Return no subnet" as no_subnet + +agent "Drop query" as drop + +entry --> rai_link_select +rai_link_select --> subnet_select +subnet_select --> relayed : relayed +subnet_select --> set_address : not relayed +relayed --> relay_subnet +relay_subnet --> relay_network : no match +relay_subnet --> relay_class : match +relay_network --> set_address : no match +relay_network --> relay_class : match +relay_class ---> found : compatible +relay_class --> set_address : not compatible +set_address --> relay_address : try the relay address +relay_address -r-> client_address : has no relay address +client_address -r-> source_address : has no client address +source_address --> interface_subnet : no suitable address +relay_address --> inRange : has a relay address +client_address --> inRange : has a client address +source_address --> inRange : has source address and use unicast +interface_subnet ---> not_found : no interface +interface_subnet --> interface_class : match +interface_subnet --> interface_network : no match +interface_network --> interface_class : march +interface_network ---> not_found : no match +interface_class ---> found : compatible +interface_class ---> interface_address : not compatible +interface_address --> inRange : has an interface address +interface_address ---> not_found : no interface address +inRange ---> address_class : match +inRange ---> not_found : no match +address_class ---> found : compatible +address_class ---> not_found : not compatible +found --> subnet4_select +not_found --> subnet4_select +found -[hidden]> not_found +subnet4_select --> success : CONTINUE and subnet set +subnet4_select --> no_subnet : SKIP or subnet not set +subnet4_select --> drop : DROP + +@enduml diff --git a/doc/sphinx/uml/tkey.atxt b/doc/sphinx/uml/tkey.atxt new file mode 100644 index 0000000..f348aee --- /dev/null +++ b/doc/sphinx/uml/tkey.atxt @@ -0,0 +1,13 @@ + TKEY Exchange (GSS-TSIG hook) + + ,-------------. ,----------. + |Kea D2 server| |DNS server| + `------+------' `----+-----' + | TKEY request | + |----------------------> + | | + |TKEY response (signed)| + |<---------------------- + ,------+------. ,----+-----. + |Kea D2 server| |DNS server| + `-------------' `----------' diff --git a/doc/sphinx/uml/tkey.png b/doc/sphinx/uml/tkey.png Binary files differnew file mode 100644 index 0000000..c10ec7c --- /dev/null +++ b/doc/sphinx/uml/tkey.png diff --git a/doc/sphinx/uml/tkey.svg b/doc/sphinx/uml/tkey.svg new file mode 100644 index 0000000..25bd4c6 --- /dev/null +++ b/doc/sphinx/uml/tkey.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="200px" preserveAspectRatio="none" style="width:271px;height:200px;background:#FFFFFF;" version="1.1" viewBox="0 0 271 200" width="271px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="220" x="24.5" y="29.9659">TKEY Exchange (GSS-TSIG hook)</text> + <line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="58" x2="58" y1="79.1358" y2="162.5479"/> + <line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="220" x2="220" y1="79.1358" y2="162.5479"/> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="107" x="5" y="45.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="93" x="12" y="67.0339">Kea D2 server</text> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="107" x="5" y="161.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="93" x="12" y="183.5138">Kea D2 server</text> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="89" x="176" y="45.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="183" y="67.0339">DNS server</text> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="89" x="176" y="161.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="183" y="183.5138">DNS server</text> + <polygon fill="#181818" points="208.5,108.8419,218.5,112.8419,208.5,116.8419,212.5,112.8419" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="58.5" x2="214.5" y1="112.8419" y2="112.8419"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="78" x="65.5" y="107.0328">TKEY request</text> + <polygon fill="#181818" points="69.5,140.5479,59.5,144.5479,69.5,148.5479,65.5,144.5479" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="219.5" y1="144.5479" y2="144.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="138" x="75.5" y="138.7389">TKEY response (signed)</text> + <!--SRC=[AyaioKbL2F5sZLHmhKZEICnBJrNGS0yErWq9zdHNoCZFpzRauYf8B2h9JCuiICmhKL3oJarKS35IA4ujAaijKb98B5O0Yg0gSV4BHfO7ShcuGDfqxK1iAuXrHQc5fQd59LmWnK09e3nSehWWFwyOw8xYpFIyr1HDBW00]--> + </g> +</svg> diff --git a/doc/sphinx/uml/tkey.uml b/doc/sphinx/uml/tkey.uml new file mode 100644 index 0000000..4cc33e5 --- /dev/null +++ b/doc/sphinx/uml/tkey.uml @@ -0,0 +1,11 @@ +@startuml + +title TKEY Exchange (GSS-TSIG hook) + +participant "Kea D2 server" as Kea +participant "DNS server" as DNS + +Kea -> DNS: TKEY request +DNS -> Kea: TKEY response (signed) + +@enduml diff --git a/doc/sphinx/uml/update.atxt b/doc/sphinx/uml/update.atxt new file mode 100644 index 0000000..f5d1b02 --- /dev/null +++ b/doc/sphinx/uml/update.atxt @@ -0,0 +1,13 @@ + DNS Update Exchange (GSS-TSIG hook) + + ,-------------. ,----------. + |Kea D2 server| |DNS server| + `------+------' `----+-----' + |DNS update request (signed) | + |----------------------------> + | | + |DNS update response (signed)| + |<---------------------------- + ,------+------. ,----+-----. + |Kea D2 server| |DNS server| + `-------------' `----------' diff --git a/doc/sphinx/uml/update.png b/doc/sphinx/uml/update.png Binary files differnew file mode 100644 index 0000000..9b0520e --- /dev/null +++ b/doc/sphinx/uml/update.png diff --git a/doc/sphinx/uml/update.svg b/doc/sphinx/uml/update.svg new file mode 100644 index 0000000..fef2e38 --- /dev/null +++ b/doc/sphinx/uml/update.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="200px" preserveAspectRatio="none" style="width:314px;height:200px;background:#FFFFFF;" version="1.1" viewBox="0 0 314 200" width="314px" zoomAndPan="magnify"> + <defs/> + <g> + <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="270" x="21" y="29.9659">DNS Update Exchange (GSS-TSIG hook)</text> + <line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="58" x2="58" y1="79.1358" y2="162.5479"/> + <line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="263" x2="263" y1="79.1358" y2="162.5479"/> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="107" x="5" y="45.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="93" x="12" y="67.0339">Kea D2 server</text> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="107" x="5" y="161.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="93" x="12" y="183.5138">Kea D2 server</text> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="89" x="219" y="45.0679"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="226" y="67.0339">DNS server</text> + <rect fill="#E2E2F0" height="33.0679" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="89" x="219" y="161.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="226" y="183.5138">DNS server</text> + <polygon fill="#181818" points="251.5,108.8419,261.5,112.8419,251.5,116.8419,255.5,112.8419" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="58.5" x2="257.5" y1="112.8419" y2="112.8419"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="172" x="65.5" y="107.0328">DNS update request (signed)</text> + <polygon fill="#181818" points="69.5,140.5479,59.5,144.5479,69.5,148.5479,65.5,144.5479" style="stroke:#181818;stroke-width:1.0;"/> + <line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="262.5" y1="144.5479" y2="144.5479"/> + <text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="181" x="75.5" y="138.7389">DNS update response (signed)</text> + <!--SRC=[NOsz3i8m38JtFCMfKpjqOMHWAgeG4alA0rYjrKQW9CGkul59OE1dy_c-krEdLqPtiZZ7YPInVumB-PbHzzQsWptqM4AuDCP4Ikf65yahgYCJkWs4qvrJ1HBapozIIh_yB8qfiNPNxkrhT7sF9hwjB8fQtEnvQapnCfVnFqvYyC8Vy0a0]--> + </g> +</svg> diff --git a/doc/sphinx/uml/update.uml b/doc/sphinx/uml/update.uml new file mode 100644 index 0000000..9738f30 --- /dev/null +++ b/doc/sphinx/uml/update.uml @@ -0,0 +1,11 @@ +@startuml + +title DNS Update Exchange (GSS-TSIG hook) + +participant "Kea D2 server" as Kea +participant "DNS server" as DNS + +Kea -> DNS: DNS update request (signed) +DNS -> Kea: DNS update response (signed) + +@enduml diff --git a/doc/sphinx/umls.rst b/doc/sphinx/umls.rst new file mode 100644 index 0000000..e5c7a94 --- /dev/null +++ b/doc/sphinx/umls.rst @@ -0,0 +1,159 @@ +.. + Copyright (C) 2020-2023 Internet Systems Consortium, Inc. ("ISC") + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + + See the COPYRIGHT file distributed with this work for additional + information regarding copyright ownership. + +.. _umls: + +Kea Flow Diagrams +================= + +These flow diagrams describe Kea's DHCPv4 server implementation, and they may be useful for system administrators. To design a configuration that results in clients getting the intended addresses and options, it is important to understand the sequence of request-processing steps. For example, Kea iterates looking for a suitable address, and conditionally accepts the first available address, so the order in which addresses are evaluated matters. + +It is also useful to understand Kea's processing logic because there are configuration choices which can make the process far more efficient. Kea is very flexible, so it can be applied to very different use cases and in different environments. In an environment where throughput and efficiency are a priority, the administrator can choose to limit some of the processing steps. For example, it is possible to limit the number of different client identifiers Kea evaluates in looking for a host reservation, or even to skip the step of checking for host reservations. + +These diagrams are focused on those aspects of Kea processing that will be most useful to operators. The diagrams illustrate DHCPv4 request processing, but most of the logic applies equally to DHCPv6. Following the title of each diagram is a Kea version number. Kea behavior has evolved over time, and the diagrams document the behavior as of the Kea version indicated. These diagrams are provided in the Kea source tree in UML (source), PNG, and SVG formats. + +Main Loop +^^^^^^^^^ + +The main loop is common to both DHCPv4 and DHPCv6 servers. + +.. figure:: uml/main-loop.* + + The DHCP server main loop + +.. _uml_packet4: + +DHCPv4 Packet Processing +^^^^^^^^^^^^^^^^^^^^^^^^ + +DHCPv4 packet processing evaluates the type DHCP message: Discover, Request, Release, Decline, or Inform. This diagram shows the general, high-level flow for processing an inbound client DHCP packet from receipt to the server's response. + +.. figure:: uml/packet4.* + + DHCPv4 packet processing + +.. _uml_request4: + +DHCPREQUEST Processing +^^^^^^^^^^^^^^^^^^^^^^ + +The following diagrams focus on DHCPREQUEST processing. This chart gives an overview of the process, from subnet selection to checking for host reservations to evaluating client classes. Finally, before acknowledging the lease, the options are evaluated and added to the message. + +.. figure:: uml/request4.* + + DHCPREQUEST processing + +.. _uml_select4: + +DHCPv4 Subnet Selection +^^^^^^^^^^^^^^^^^^^^^^^ + +Subnet selection is the process of choosing a subnet that is topologically appropriate for the client. When the selected subnet is a member of a shared network, the whole shared network is selected. During subnet selection the client class may be checked more than once while iterating through subnets, to determine whether it is permitted in the selected subnet. + +.. figure:: uml/select4.* + + DHCPv4 subnet selection + +.. _uml_assign-lease4: + +DHCPv4 Special Case of Double-Booting +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +After subnet selection and before lease allocation, the DHCPv4 server handles the special case of clients restarting with an image provided by PXE boot or bootp. The Lease Request box is expanded below. + +.. figure:: uml/assign-lease4.* + + DHCPv4 lease assignment + +.. _uml_request4-lease: + +DHCPv4 Lease Allocation +^^^^^^^^^^^^^^^^^^^^^^^ + +The first diagram below illustrates the details of processing the client request, showing the renewal of an existing lease, the assignment of a reserved lease, and the allocation of an unreserved lease. + +.. figure:: uml/request4-lease.* + + DHCPREQUEST lease allocation + +The second diagram shows the algorithm used to validate a requested lease or select a new address to offer. The right-hand side of the diagram shows how a new address is selected, when a new lease is required and the client has neither a requested address nor a reservation. When a new lease is required and Kea iterates over pools and subnets, it starts with the subnet selected above in the subnet selection process. + +.. figure:: uml/requestLease4.* + + The requestLease4 algorithm + +.. note:: + + Declined addresses are included in the statistic for assigned addresses, + so the :math:`assigned + free = total` equation is true. + +.. _uml_lease-states: + +Lease States +^^^^^^^^^^^^ + +This diagram illustrates the different lease states, including the ``free`` one, where no lease object exists. + +.. figure:: uml/lease-states.* + + Lease states + +.. _uml_currentHost4: + +Checking for Host Reservations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The allocation engine checks for host reservations after selecting a subnet. The following diagram shows the details of that operation. Subnet selection is based on network topology. Host reservations are primarily for assigning options, and options are evaluated after subnet selection. However, if client classes are added in the host reservation, those are also evaluated against the selected subnet in a further check. Kea includes several options to skip checking for host reservations, which can make this process much more efficient if reservations are not being used. + +.. note:: + + To find a free lease, the allocation engine begins by evaluating the most recently used subnet. + The current subnet depends on the history of prior queries. + +.. figure:: uml/currentHost4.* + + Host reservation evaluation + +.. _uml_CfgOptionList: + +Building the Options List +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Before sending a response, options are added: + - evaluate required client classes + - build the configured option list + - append requested options + - append requested vendor options + - append basic options + +.. figure:: uml/buildCfgOptionList.* + + The buildCfgOptionList (build configured option list) algorithm + +.. figure:: uml/appendRequestedOptions.* + + The appendRequestedOptions (append requested options) algorithm + +.. figure:: uml/appendRequestedVendorOptions.* + + The appendRequestedVendorOptions (append vendor requested options) algorithm + + +.. _uml-recognizing-same-client: + +How Kea Recognizes the Same Client In Different DHCP Messages +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: uml/recognizing-same-client.* + +RADIUS workflows for lease allocation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: uml/radius.* |