<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Group,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’ve ran across an issue with DHCP snooping on some of my switches with only KEA server. The switches cannot track the DHCP responses from the server and I found the issue is that all of the other DHCP servers we have list DHCP options
in numerical order. Other such servers always start their options with (53) Message Type (54) DHCP Server Identifier (51) Lease time, then numerically sorted. I edited the file libdhcp++.cc with the following method which changed the order and fixed my issue;
I cannot find any RFC reference that this order is mandatory but for some reason ISC DHCP server also follows this other order:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">void<o:p></o:p></p>
<p class="MsoNormal">LibDHCP::packOptions4(isc::util::OutputBuffer& buf,<o:p></o:p></p>
<p class="MsoNormal"> const OptionCollection& options) {<o:p></o:p></p>
<p class="MsoNormal"> OptionPtr agent;<o:p></o:p></p>
<p class="MsoNormal"> OptionPtr end;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> //BEGINNING BLOCK I ADDED<o:p></o:p></p>
<p class="MsoNormal"> //DHO_DHCP_MESSAGE_TYPE = 53<o:p></o:p></p>
<p class="MsoNormal"> //DHO_DHCP_SERVER_IDENTIFIER =54<o:p></o:p></p>
<p class="MsoNormal"> //DHO_DHCP_LEASE_TIME =51<o:p></o:p></p>
<p class="MsoNormal"> OptionPtr type;<o:p></o:p></p>
<p class="MsoNormal"> OptionPtr id;<o:p></o:p></p>
<p class="MsoNormal"> OptionPtr leaset;<o:p></o:p></p>
<p class="MsoNormal"> for (OptionCollection::const_iterator it = options.begin();<o:p></o:p></p>
<p class="MsoNormal"> it != options.end(); ++it) {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> // type, id, leaset options must be last.<o:p></o:p></p>
<p class="MsoNormal"> switch (it->first) {<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_MESSAGE_TYPE:<o:p></o:p></p>
<p class="MsoNormal"> type = it->second;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_SERVER_IDENTIFIER:<o:p></o:p></p>
<p class="MsoNormal"> id = it->second;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_LEASE_TIME:<o:p></o:p></p>
<p class="MsoNormal"> leaset = it->second;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> } <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> if (type){<o:p></o:p></p>
<p class="MsoNormal"> type->pack(buf);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (id){<o:p></o:p></p>
<p class="MsoNormal"> id->pack(buf);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> if (leaset){<o:p></o:p></p>
<p class="MsoNormal"> leaset->pack(buf);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> //ENDING BLOCK I ADDED<o:p></o:p></p>
<p class="MsoNormal"> for (OptionCollection::const_iterator it = options.begin();<o:p></o:p></p>
<p class="MsoNormal"> it != options.end(); ++it) {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> // RAI and END options must be last.<o:p></o:p></p>
<p class="MsoNormal"> switch (it->first) {<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_AGENT_OPTIONS:<o:p></o:p></p>
<p class="MsoNormal"> agent = it->second;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case DHO_END:<o:p></o:p></p>
<p class="MsoNormal"> end = it->second;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_MESSAGE_TYPE: //ALSO ADDED<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_SERVER_IDENTIFIER: //ALSO ADDED<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> case DHO_DHCP_LEASE_TIME: //ALSO ADDED<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> default:<o:p></o:p></p>
<p class="MsoNormal"> it->second->pack(buf);<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> // Add the RAI option if it exists.<o:p></o:p></p>
<p class="MsoNormal"> if (agent) {<o:p></o:p></p>
<p class="MsoNormal"> agent->pack(buf);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> // And at the end the END option.<o:p></o:p></p>
<p class="MsoNormal"> if (end) {<o:p></o:p></p>
<p class="MsoNormal"> end->pack(buf);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">///END OF CODE<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Any comments?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>