X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/99005a685dba8392d7ef48657854b498686223c3..78d6e1ce97611abe9f0d083033197773f93c33f7:/practicas/pipi/src/ipin.cpp?ds=sidebyside diff --git a/practicas/pipi/src/ipin.cpp b/practicas/pipi/src/ipin.cpp index 15e102c..1ff0560 100644 --- a/practicas/pipi/src/ipin.cpp +++ b/practicas/pipi/src/ipin.cpp @@ -27,7 +27,8 @@ void IPIn::drop(const std::string& msg, const IPHeader& iph) } /// Recibe un paquete IP -std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runtime_error) +std::string IPIn::recv(uint8_t& proto, IPAddr& src, IPAddr& dst) + throw (std::runtime_error) { while (true) { @@ -35,6 +36,7 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt // No es siquiera IP if (buf.size() < IPHeader::header_len()) { + // Silencioso drop("Cabecera incompleta o no es IP", buf); continue; } @@ -46,17 +48,27 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt #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; } @@ -69,14 +81,15 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt // Es para nosotros pero somos router else if (router) { + // Silencioso drop("Es para nosotros pero somos un router", iph); continue; } // Es para nosotros y somos un host // Guarda en buffer buffer[iph][iph.offset] = buf.substr(iph.header_len()); - // Si tiene más fragmentos o es un protocolo distinto, sigo - if (iph.mf || (iph.proto != proto)) + // Si tiene más fragmentos, sigo + if (iph.mf) continue; // No hay más fragmentos, reensamblamos (de ser necesario) std::string data; @@ -94,6 +107,7 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt //TODO faltaría limpiar fragmentos viejos cada tanto (timer?) src = iph.src; dst = iph.dst; + proto = iph.proto; return data; } }