X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/9ee7a97ec97d3dc41e1367f1f457d5ed5d5270ea..78d6e1ce97611abe9f0d083033197773f93c33f7:/practicas/pipi/src/ipin.cpp?ds=sidebyside diff --git a/practicas/pipi/src/ipin.cpp b/practicas/pipi/src/ipin.cpp index 73913ab..1ff0560 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()) @@ -127,16 +104,10 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst, bool filter) << 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; } }