#include "ipout.h"
#include "ipheader.h"
+#include <ctime>
/// Constructor
IPOut::IPOut(const IPAddr& ip, Dev& dev, std::ostream& log):
}
/// Envía un paquete IP
-bool IPOut::send(const std::string& data, IPAddr& src, IPAddr& dst,
- uint8_t proto, bool df, uint8_t ttl, uint16_t id)
+bool IPOut::send(const std::string& data, uint8_t proto, IPAddr dst, IPAddr src,
+ bool df, uint8_t ttl, uint16_t id)
throw (std::runtime_error)
{
// TODO fragmentar
drop("Tamaño de paquete más grande que MTU", data);
return false;
}
+ if (!src)
+ src = ip;
+ if (!id)
+ id = get_id();
IPHeader iph(4, IPHeader::header_len() + data.size(), id, df, 0, 0,
ttl, proto, src, dst);
std::string buf((char*) &iph, sizeof(IPHeader));
return true;
}
+/// Obtiene un identificador para el paquete
+uint16_t IPOut::get_id() const
+{
+ return time(NULL);
+}
+
// vim: set et sw=4 sts=4 :
void drop(const std::string& msg, const IPHeader& iph);
/// Envía un paquete IP
- bool send(const std::string& data, IPAddr& src, IPAddr& dst, uint8_t proto,
- bool df = 0, uint8_t ttl = 64, uint16_t id = 0)
+ bool send(const std::string& data, uint8_t proto, IPAddr dst,
+ IPAddr src = 0, bool df = 0, uint8_t ttl = 64, uint16_t id = 0)
throw (std::runtime_error);
+ /// Obtiene un identificador para el paquete
+ uint16_t get_id() const;
+
// Nada de andar copiando...
private:
IPOut(const IPOut&);
int que_id = msgget(DEV_DEFAULT_KEY, IPC_CREAT | 0666);
assert(que_id != -1);
IPAddr addr("10.10.10.2");
- IPAddr dst("10.10.10.1");
Dev dev(addr);
IPOut ipout(addr, dev);
- if (ipout.send("hola mundo", addr, dst, 0))
+ if (ipout.send("hola mundo", 0, IPAddr("10.10.10.1")))
std::cout << "Enviado 'hola mundo' a 10.10.10.1\n";
else
std::cout << "NO SE PUDO ENVIAR 'hola mundo' a 10.10.10.1\n";