]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/ipout.h
Se generaliza el devque para seguir (ab)usándolo como cola y poder pedir de
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipout.h
1 #ifndef _IPOUT_H_
2 #define _IPOUT_H_
3
4 #include "ipaddr.h"
5 #include "ipheader.h"
6 #include "routetable.h"
7 #include <iostream>
8 #include <string>
9 #include <stdexcept>
10
11 /// IP de envío
12 struct IPOut
13 {
14
15     /// Dirección MAC
16     IPAddr ip;
17
18     /// Dispositivo de logging
19     RouteTable& rtable;
20
21     /// Cola para forwardear paquetes
22     Dev& forward_que;
23
24     /// Dispositivo de logging
25     std::ostream& log;
26
27     /// Constructor
28     IPOut(const IPAddr& ip, RouteTable& rtable, Dev& forward_que,
29             std::ostream& log = std::cout);
30
31     /// Descarta un paquete
32     void drop(const std::string& msg, const std::string& buf);
33     void drop(const std::string& msg, const IPHeader& iph);
34
35     /// Envía un paquete IP a armar (y forwardea los encolados, de haber)
36     bool send(const std::string& data, uint8_t proto, IPAddr dst,
37             IPAddr src = 0, bool df = 0, uint8_t ttl = 64, uint16_t id = 0)
38         throw (std::runtime_error);
39
40     /// Envía un paquete IP ya armado
41     bool send(IPHeader iph, std::string data) throw (std::runtime_error);
42
43     /// Realiza el forwarding de paquetes (en un loop infinito)
44     void forward_loop() throw (std::runtime_error);
45
46     /// Obtiene un identificador para el paquete
47     uint16_t get_id() const;
48
49     /// Se fija si hay paquetes a forwardear (y devuelve cuantos hay)
50     unsigned to_forward();
51
52     // Nada de andar copiando...
53     private:
54     IPOut(const IPOut&);
55     IPOut& operator=(const IPOut&);
56
57 };
58
59 #endif // _IPOUT_H_
60
61 // vim: set et sw=4 sts=4 :