#include "ipheader.h"
/// 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)
{
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;
}
+ // 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("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