]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/ipin.cpp
Ya estamos fragmentando! (falta testing intensivo pero parece andar)
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipin.cpp
index b5d346fbf7b831d8c10b95d5939240237b984f23..2d94158fee63e24ba8dac46867d401f19ed9b8c0 100644 (file)
@@ -43,21 +43,32 @@ 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)
+        //TODO forwarding (ponerlo en una cola para el proceso que manda)
         if (iph.dst != ip)
         {
             drop("No es para nosotros y no hacemos forward", iph);
             continue;
         }
-        //TODO a un buffer
-        if (iph.proto != proto)
-        {
-            drop("No es el protocolo pedido", iph);
+        // 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))
             continue;
+        // No hay más fragmentos, reensamblamos (de ser necesario)
+        std::string data;
+        for (offsetmap_type::iterator i = buffer[iph].begin();
+                i != buffer[iph].end(); ++i)
+        {
+            //TODO chequear que los fragmentos estén todos
+            data += i->second;
         }
+#ifdef DEBUG
+        log << "IPIn::recv: Paquete completo: data = '" << data << "'\n";
+#endif
+        buffer.erase(iph);
+        //TODO faltaría limpiar fragmentos viejos cada tanto (timer?)
         src = iph.src;
         dst = iph.dst;
-        std::string data = buf.substr(iph.header_len());
         return data;
     }
 }