#include "ipin.h"
#include "ipheader.h"
+#ifdef DEBUG
+#include <iostream>
+#endif
/// Constructor
-IPIn::IPIn(const IPAddr& ip, Dev& dev, std::ostream& log):
- ip(ip), dev(dev), log(log)
-{}
+IPIn::IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router,
+ bool forward, std::ostream& log):
+ ip(ip), dev(dev), forward_que(forward_que), router(router),
+ forward(forward), log(log)
+{
+ if (router) forward = true;
+}
void IPIn::drop(const std::string& msg, const std::string& buf)
{
}
IPHeader iph(buf);
#ifdef DEBUG
- log << "IPIn::recv: IPHeader: " << iph << "\n";
+ std::cout << "IPIn::recv: IPHeader: " << iph << "\n";
+ std::string tmp = buf.substr(iph.header_len());
+ std::cout << "\tdata (" << tmp.size() << ") = " << tmp << "\n";
#endif
if (iph.version != 4)
{
drop("Mal checksum", iph);
continue;
}
- // TODO forwarding (ponerlo en una cola para el proceso que manda)
- if (iph.dst != ip)
+ // No es para nosotros y no forwardeamos
+ if (iph.dst != ip && !forward)
{
drop("No es para nosotros y no hacemos forward", iph);
continue;
}
- //TODO a un buffer
- if (iph.proto != proto)
+ // No es para nosotros pero forwardeamos
+ else if (iph.dst != ip)
+ {
+ forward_que.transmit(buf, ip);
+ continue;
+ }
+ // Es para nosotros pero somos router
+ else if (router)
{
- drop("No es el protocolo pedido", iph);
+ drop("Es para nosotros pero somos un router", iph);
+ continue;
+ }
+ // Es para nosotros y somos un host
+ // 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
+ std::cout << "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;
}
}