// No es siquiera IP
if (buf.size() < IPHeader::header_len())
{
+ // Silencioso
drop("Cabecera incompleta o no es IP", buf);
continue;
}
#endif
if (iph.version != 4)
{
+ // Silencioso
drop("Versión IP incorrecta", iph);
continue;
}
if (!iph.check_checksum())
{
+ // Silencioso
drop("Mal checksum", iph);
continue;
}
+ // Si el TTL se va a 0
+ if (!--iph.ttl)
+ {
+ // ICMP
+ drop("TTL == 0 -> ICMP", iph);
+ continue;
+ }
// No es para nosotros y no forwardeamos
if (iph.dst != ip && !forward)
{
+ // Silencioso
drop("No es para nosotros y no hacemos forward", iph);
continue;
}
// Es para nosotros pero somos router
else if (router)
{
+ // Silencioso
drop("Es para nosotros pero somos un router", iph);
continue;
}
RouteTable::Route* r = rtable.get(iph.dst);
if (!r)
{
- drop("No existe una ruta para el destino", iph);
+ // ICMP
+ drop("No existe una ruta para el destino -> ICMP", iph);
return false;
}
// No quieren fragmentar
if (iph.df && (IPHeader::header_len() + data.size() > r->iface->mtu))
{
+ // Silencioso
drop("Tamaño de paquete más grande que MTU y DF=1", iph);
return false;
}