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);
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 if (iph.proto != proto)
55 drop("No es el protocolo pedido", iph);
60 std::string data = buf.substr(iph.total_len - iph.header_len());
65 // vim: set et sw=4 sts=4 :