6 IPIn::IPIn(const IPAddr& ip, Dev& dev, std::ostream& log):
7 ip(ip), dev(dev), log(log)
10 void IPIn::drop(const std::string& msg, const std::string& buf)
12 log << "IPIn::drop: " << msg << "\n\tBuffer: " << buf << "\n";
15 void IPIn::drop(const std::string& msg, const IPHeader& iph)
17 log << "IPIn::drop: " << msg << "\n\tIPHeader: " << iph << "\n";
20 /// Recibe un paquete IP
21 std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runtime_error)
25 std::string buf = dev.receive();
27 if (buf.size() < IPHeader::header_len())
29 drop("Cabecera incompleta o no es IP", buf);
34 log << "IPIn::recv: IPHeader: " << iph << "\n";
38 drop("Versión IP incorrecta", iph);
41 if (!iph.check_checksum())
43 drop("Mal checksum", iph);
46 //TODO forwarding (ponerlo en una cola para el proceso que manda)
49 drop("No es para nosotros y no hacemos forward", iph);
53 buffer[iph][iph.offset] = buf.substr(iph.header_len());
54 // Si tiene más fragmentos o es un protocolo distinto, sigo
55 if (iph.mf || (iph.proto != proto))
57 // No hay más fragmentos, reensamblamos (de ser necesario)
59 for (offsetmap_type::iterator i = buffer[iph].begin();
60 i != buffer[iph].end(); ++i)
62 //TODO chequear que los fragmentos estén todos
66 log << "IPIn::recv: Paquete completo: data = '" << data << "'\n";
69 //TODO faltaría limpiar fragmentos viejos cada tanto (timer?)
76 // vim: set et sw=4 sts=4 :