X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/51f24d14e8c4c52776a98c8e2aaacf95f90ad1f4..26fc1173c5122fd73d1cd2191e20d49fef1e1f32:/practicas/pipi/src/ipin.cpp?ds=sidebyside diff --git a/practicas/pipi/src/ipin.cpp b/practicas/pipi/src/ipin.cpp index 2d94158..c191b90 100644 --- a/practicas/pipi/src/ipin.cpp +++ b/practicas/pipi/src/ipin.cpp @@ -1,11 +1,18 @@ #include "ipin.h" #include "ipheader.h" +#ifdef DEBUG +#include +#endif /// Constructor -IPIn::IPIn(const IPAddr& ip, Dev& dev, std::ostream& log): - ip(ip), dev(dev), log(log) -{} +IPIn::IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router, + bool forward, std::ostream& log): + ip(ip), dev(dev), forward_que(forward_que), router(router), + forward(forward), log(log) +{ + if (router) forward = true; +} void IPIn::drop(const std::string& msg, const std::string& buf) { @@ -31,7 +38,9 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt } IPHeader iph(buf); #ifdef DEBUG - log << "IPIn::recv: IPHeader: " << iph << "\n"; + std::cout << "IPIn::recv: IPHeader: " << iph << "\n"; + std::string tmp = buf.substr(iph.header_len()); + std::cout << "\tdata (" << tmp.size() << ") = " << tmp << "\n"; #endif if (iph.version != 4) { @@ -43,12 +52,25 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt drop("Mal checksum", iph); continue; } - //TODO forwarding (ponerlo en una cola para el proceso que manda) - if (iph.dst != ip) + // No es para nosotros y no forwardeamos + if (iph.dst != ip && !forward) { drop("No es para nosotros y no hacemos forward", iph); continue; } + // No es para nosotros pero forwardeamos + else if (iph.dst != ip) + { + forward_que.transmit(buf, ip); + continue; + } + // Es para nosotros pero somos router + else if (router) + { + 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 @@ -63,7 +85,7 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt data += i->second; } #ifdef DEBUG - log << "IPIn::recv: Paquete completo: data = '" << data << "'\n"; + std::cout << "IPIn::recv: Paquete completo: data = '" << data << "'\n"; #endif buffer.erase(iph); //TODO faltaría limpiar fragmentos viejos cada tanto (timer?)