X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/9ee7a97ec97d3dc41e1367f1f457d5ed5d5270ea..d40854f63beb6e8ef9b720f88a8175bcb69338ae:/practicas/pipi/src/ipin.cpp?ds=sidebyside diff --git a/practicas/pipi/src/ipin.cpp b/practicas/pipi/src/ipin.cpp index 73913ab..7cb5abc 100644 --- a/practicas/pipi/src/ipin.cpp +++ b/practicas/pipi/src/ipin.cpp @@ -27,34 +27,11 @@ 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, bool filter) +std::string IPIn::recv(uint8_t& proto, IPAddr& src, IPAddr& dst) throw (std::runtime_error) { while (true) { - // Reviso buffers completos a ver si puedo sacar algo - buffer_complete_type::iterator f = buffer_complete.find(proto); - if (f != buffer_complete.end()) // Hay algo - { - srcmap_type& srcmap = f->second; - srcmap_type::iterator b; - if (filter) - b = srcmap.find(src); // Si filtro, busco el que me interesa - else - b = srcmap.begin(); // Si no filtro, agarro el primero - if (b != srcmap.end()) - { - src = b->first; - dst = (b->second).dst; - std::string data = b->second.data; - // Limpio buffers - srcmap.erase(src); - if (srcmap.empty()) - buffer_complete.erase(proto); - return data; - } - } - // Si no pude sacar nada, recibo std::string buf = dev.receive(); // No es siquiera IP if (buf.size() < IPHeader::header_len()) @@ -64,7 +41,7 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst, bool filter) continue; } IPHeader iph(buf); -#ifdef DEBUG +#ifdef DEBUG_IP std::cout << "IPIn::recv (" << ip << "): IPHeader: " << iph << "\n"; std::string tmp = buf.substr(iph.header_len()); std::cout << "\tdata (" << tmp.size() << ") = " << tmp << "\n"; @@ -122,21 +99,15 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst, bool filter) //TODO chequear que los fragmentos estén todos data += i->second; } -#ifdef DEBUG +#ifdef DEBUG_IP std::cout << "IPIn::recv (" << ip << "): Paquete completo: data = '" << data << "'\n"; #endif buffer.erase(iph); - // Si es un protocolo distinto o no es de quien quiero, rearmo paquete - // (ya sé que no hay más fragmentos) y guardo en buffer nomás - if ((iph.proto != proto) || (filter == true && src != iph.src)) - { - buffer_complete[proto][iph.src] = BufferPkt(iph.dst, data); - continue; - } //TODO faltaría limpiar fragmentos viejos cada tanto (timer?) src = iph.src; dst = iph.dst; + proto = iph.proto; return data; } }