InputBuffer buf(raw_buf, data_len);
+ // @todo: This is awkward way to solve the chicken and egg problem
+ // whereby we don't know the offset where DHCP data start in the
+ // received buffer when we create the packet object. The dummy
+ // object is created so as we can pass it to the functions which
+ // decode IP stack and find actual offset of the DHCP packet.
+ // Once we find the offset we can create another Pkt4 object from
+ // the reminder of the input buffer and set the IP addresses and
+ // ports from the dummy packet. We should consider making this
+ // in some more elegant way.
Pkt4Ptr dummy_pkt = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 0));
+
+ // Decode ethernet, ip and udp headers.
decodeEthernetHeader(buf, dummy_pkt);
decodeIpUdpHeader(buf, dummy_pkt);
+ // Read the DHCP data.
std::vector<uint8_t> dhcp_buf;
buf.readVector(dhcp_buf, buf.getLength() - buf.getPosition());
+ // Decode DHCP data into the Pkt4 object.
Pkt4Ptr pkt = Pkt4Ptr(new Pkt4(&dhcp_buf[0], dhcp_buf.size()));
+ // Set the appropriate packet members using data collected from
+ // the decoded headers.
pkt->setIndex(iface.getIndex());
pkt->setIface(iface.getName());
pkt->setLocalAddr(dummy_pkt->getLocalAddr());