// Update statistics
stat.ipackets.inc();
// Get IP header
final IPv4Header hdr = new IPv4Header(skbuf);
if (!hdr.isChecksumOk()) {
stat.badsum.inc();
return;
}
// Set the header object in the buffer-field
skbuf.setNetworkLayerHeader(hdr);
// Remove header from skbuf-data
skbuf.pull(hdr.getLength());
// Trim the end of the message, to we have a valid length
skbuf.trim(hdr.getDataLength());
// Now test if the size of the buffer equals the datalength in the
// header, if now ignore the packet
if (skbuf.getSize() < hdr.getDataLength()) {
stat.badlen.inc();
return;
}
// Update the ARP cache for the source address
updateARPCache(skbuf.getLinkLayerHeader().getSourceAddress(), hdr.getSourceAddress());
// Get my IP address
final IPv4ProtocolAddressInfo myAddrInfo =
(IPv4ProtocolAddressInfo) deviceAPI.getProtocolAddressInfo(getProtocolID());
if (myAddrInfo == null) {
stat.nodevaddr.inc();
}
// Should I process this packet, or is it for somebody else?
final IPv4Address dstAddr = hdr.getDestination();
final boolean shouldProcess;
if (myAddrInfo != null) {
shouldProcess = myAddrInfo.contains(dstAddr);
} else {
// I don't have an IP address yet, if the linklayer says
// it is for me, we'll process it, otherwise we'll drop it.
shouldProcess = !skbuf.getLinkLayerHeader().getDestinationAddress().isBroadcast();
}
if (!shouldProcess) {
// log.debug("IPPacket not for me, ignoring (dst=" + dstAddr + ")");
return;
}
// Is it a fragment?
if (hdr.isFragment()) {
// Yes it is a fragment
stat.fragments.inc();
deliverFragment(hdr, skbuf);
} else {
// It is a complete packet, find the protocol handler