#include "ipaddr.h"
#include "ipheader.h"
-#include "dev.h"
+#include "routetable.h"
#include <iostream>
#include <string>
#include <stdexcept>
/// Dirección MAC
IPAddr ip;
- /// Dispositivo de red
- Dev& dev;
+ /// Dispositivo de logging
+ RouteTable& rtable;
+
+ /// Cola para forwardear paquetes
+ Dev& forward_que;
/// Dispositivo de logging
std::ostream& log;
/// Constructor
- IPOut(const IPAddr& ip, Dev& dev, std::ostream& log = std::cout);
+ IPOut(const IPAddr& ip, RouteTable& rtable, Dev& forward_que,
+ std::ostream& log = std::cout);
/// Descarta un paquete
void drop(const std::string& msg, const std::string& buf);
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)
+ /// Envía un paquete IP a armar (y forwardea los encolados, de haber)
+ 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);
+ /// Envía un paquete IP ya armado
+ bool send(IPHeader iph, std::string data) throw (std::runtime_error);
+
+ /// Realiza el forwarding de paquetes (en un loop infinito)
+ void forward_loop() throw (std::runtime_error);
+
+ /// Obtiene un identificador para el paquete
+ uint16_t get_id() const;
+
+ /// Se fija si hay paquetes a forwardear (y devuelve cuantos hay)
+ unsigned to_forward();
+
// Nada de andar copiando...
private:
IPOut(const IPOut&);