uint32_t DhcpHeader::Deserialize()

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;
}