in simulation/src/internet-apps/model/dhcp-header.cc [352:514]
uint32_t DhcpHeader::Deserialize (Buffer::Iterator start)
{
uint32_t len, clen = start.GetSize ();
if (clen < 240)
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
Buffer::Iterator i = start;
m_bootp = i.ReadU8 ();
m_hType = i.ReadU8 ();
m_hLen = i.ReadU8 ();
m_hops = i.ReadU8 ();
m_xid = i.ReadU32 ();
m_secs = i.ReadNtohU16 ();
m_flags = i.ReadU16 ();
ReadFrom (i, m_ciAddr);
ReadFrom (i, m_yiAddr);
ReadFrom (i, m_siAddr);
ReadFrom (i, m_giAddr);
i.Read (m_chaddr, 16);
i.Read (m_sname, 64);
i.Read (m_file, 128);
i.Read (m_magic_cookie, 4);
if ( m_magic_cookie[0] != 99 || m_magic_cookie[1] != 130 || m_magic_cookie[2] != 83 || m_magic_cookie[3] != 99)
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
len = 240;
uint8_t option;
bool loop = true;
do
{
if (len + 1 <= clen)
{
option = i.ReadU8 ();
len += 1;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
switch (option)
{
case OP_MASK:
if (len + 5 < clen)
{
i.ReadU8 ();
m_mask = i.ReadNtohU32 ();
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_ROUTE:
if (len + 5 < clen)
{
i.ReadU8 ();
ReadFrom (i, m_route);
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_MSGTYPE:
if (len + 2 < clen)
{
i.ReadU8 ();
m_op = (i.ReadU8 () - 1);
len += 2;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_SERVID:
if (len + 5 < clen)
{
i.ReadU8 ();
ReadFrom (i, m_dhcps);
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_ADDREQ:
if (len + 5 < clen)
{
i.ReadU8 ();
ReadFrom (i, m_req);
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_LEASE:
if (len + 5 < clen)
{
i.ReadU8 ();
m_lease = i.ReadNtohU32 ();
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_RENEW:
if (len + 5 < clen)
{
i.ReadU8 ();
m_renew = i.ReadNtohU32 ();
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_REBIND:
if (len + 5 < clen)
{
i.ReadU8 ();
m_rebind = i.ReadNtohU32 ();
len += 5;
}
else
{
NS_LOG_WARN ("Malformed Packet");
return 0;
}
break;
case OP_END:
loop = false;
break;
default:
NS_LOG_WARN ("Malformed Packet");
return 0;
}
}
while (loop);
m_len = len;
return m_len;
}