}
/// Recibe un paquete IP
-std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runtime_error)
+std::string IPIn::recv(uint8_t& proto, IPAddr& src, IPAddr& dst)
+ throw (std::runtime_error)
{
while (true)
{
continue;
}
IPHeader iph(buf);
-#ifdef DEBUG
+#ifdef DEBUG_IP
std::cout << "IPIn::recv (" << ip << "): IPHeader: " << iph << "\n";
std::string tmp = buf.substr(iph.header_len());
std::cout << "\tdata (" << tmp.size() << ") = " << tmp << "\n";
// 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
- if (iph.mf || (iph.proto != proto))
+ // Si tiene más fragmentos, sigo
+ if (iph.mf)
continue;
// No hay más fragmentos, reensamblamos (de ser necesario)
std::string data;
//TODO chequear que los fragmentos estén todos
data += i->second;
}
-#ifdef DEBUG
+#ifdef DEBUG_IP
std::cout << "IPIn::recv (" << ip << "): Paquete completo: data = '"
<< data << "'\n";
#endif
//TODO faltaría limpiar fragmentos viejos cada tanto (timer?)
src = iph.src;
dst = iph.dst;
+ proto = iph.proto;
return data;
}
}