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;
}
}