]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/ipin.cpp
Se verifica si expiró el cache y se lo elimina si así fuere.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipin.cpp
index 73913abda23f59f33e1fbae858efacb309263a4a..7cb5abcfb95b42404fda0979ffe1721aa1126d84 100644 (file)
@@ -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;
     }
 }