6 IPIn::IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router,
7 bool forward, std::ostream& log):
8 ip(ip), dev(dev), forward_que(forward_que), router(router),
9 forward(forward), log(log)
11 if (router) forward = true;
14 void IPIn::drop(const std::string& msg, const std::string& buf)
16 log << "IPIn::drop: " << msg << "\n\tBuffer: " << buf << "\n";
19 void IPIn::drop(const std::string& msg, const IPHeader& iph)
21 log << "IPIn::drop: " << msg << "\n\tIPHeader: " << iph << "\n";
24 /// Recibe un paquete IP
25 std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runtime_error)
29 std::string buf = dev.receive();
31 if (buf.size() < IPHeader::header_len())
33 drop("Cabecera incompleta o no es IP", buf);
38 log << "IPIn::recv: IPHeader: " << iph << "\n";
39 std::string tmp = buf.substr(iph.header_len());
40 log << "\tdata (" << tmp.size() << ") = " << tmp << "\n";
44 drop("Versión IP incorrecta", iph);
47 if (!iph.check_checksum())
49 drop("Mal checksum", iph);
52 // No es para nosotros y no forwardeamos
53 if (iph.dst != ip && !forward)
55 drop("No es para nosotros y no hacemos forward", iph);
58 // No es para nosotros pero forwardeamos
59 else if (iph.dst != ip)
61 forward_que.transmit(buf, ip);
64 // Es para nosotros pero somos router
67 drop("Es para nosotros pero somos un router", iph);
70 // Es para nosotros y somos un host
72 buffer[iph][iph.offset] = buf.substr(iph.header_len());
73 // Si tiene más fragmentos o es un protocolo distinto, sigo
74 if (iph.mf || (iph.proto != proto))
76 // No hay más fragmentos, reensamblamos (de ser necesario)
78 for (offsetmap_type::iterator i = buffer[iph].begin();
79 i != buffer[iph].end(); ++i)
81 //TODO chequear que los fragmentos estén todos
85 log << "IPIn::recv: Paquete completo: data = '" << data << "'\n";
88 //TODO faltaría limpiar fragmentos viejos cada tanto (timer?)
95 // vim: set et sw=4 sts=4 :