X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/127afaea3cf716aa9261e5c2cf129a10acbd1688..51f24d14e8c4c52776a98c8e2aaacf95f90ad1f4:/practicas/pipi/src/ipin.cpp diff --git a/practicas/pipi/src/ipin.cpp b/practicas/pipi/src/ipin.cpp index b5d346f..2d94158 100644 --- a/practicas/pipi/src/ipin.cpp +++ b/practicas/pipi/src/ipin.cpp @@ -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; } }