9 IPIn::IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router,
10 bool forward, std::ostream& log):
11 ip(ip), dev(dev), forward_que(forward_que), router(router),
12 forward(forward), log(log)
14 if (router) forward = true;
17 void IPIn::drop(const std::string& msg, const std::string& buf)
19 log << "IPIn::drop (" << ip << "): " << msg << "\n\tBuffer: " << buf
23 void IPIn::drop(const std::string& msg, const IPHeader& iph)
25 log << "IPIn::drop (" << ip << "): " << msg << "\n\tIPHeader: " << iph
29 /// Recibe un paquete IP
30 std::string IPIn::recv(uint8_t& proto, IPAddr& src, IPAddr& dst)
31 throw (std::runtime_error)
35 std::string buf = dev.receive();
37 if (buf.size() < IPHeader::header_len())
40 drop("Cabecera incompleta o no es IP", buf);
45 std::cout << "IPIn::recv (" << ip << "): IPHeader: " << iph << "\n";
46 std::string tmp = buf.substr(iph.header_len());
47 std::cout << "\tdata (" << tmp.size() << ") = " << tmp << "\n";
52 drop("Versión IP incorrecta", iph);
55 if (!iph.check_checksum())
58 drop("Mal checksum", iph);
61 // Si el TTL se va a 0
65 drop("TTL == 0 -> ICMP", iph);
68 // No es para nosotros y no forwardeamos
69 if (iph.dst != ip && !forward)
72 drop("No es para nosotros y no hacemos forward", iph);
75 // No es para nosotros pero forwardeamos
76 else if (iph.dst != ip)
78 forward_que.transmit(buf, ip);
81 // Es para nosotros pero somos router
85 drop("Es para nosotros pero somos un router", iph);
88 // Es para nosotros y somos un host
90 buffer[iph][iph.offset] = buf.substr(iph.header_len());
91 // Si tiene más fragmentos, sigo
94 // No hay más fragmentos, reensamblamos (de ser necesario)
96 for (offsetmap_type::iterator i = buffer[iph].begin();
97 i != buffer[iph].end(); ++i)
99 //TODO chequear que los fragmentos estén todos
103 std::cout << "IPIn::recv (" << ip << "): Paquete completo: data = '"
107 //TODO faltaría limpiar fragmentos viejos cada tanto (timer?)
115 // vim: set et sw=4 sts=4 :