]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi-2da-entrega/src/ipin.h
Tag de 2da entrega.
[z.facultad/75.74/practicos.git] / practicas / pipi-2da-entrega / src / ipin.h
1 #ifndef _IPIN_H_
2 #define _IPIN_H_
3
4 #include "ipaddr.h"
5 #include "ipheader.h"
6 #include "dev.h"
7 #include <map>
8 #include <string>
9 #include <iostream>
10 #include <stdexcept>
11
12 /// IP de recepción
13 struct IPIn
14 {
15
16     /// Dirección IP
17     IPAddr ip;
18
19     /// Dispositivo de red
20     Dev& dev;
21
22     /// Cola para forwardear paquetes
23     Dev& forward_que;
24
25     /// Indica si es un router
26     bool router;
27
28     /// Indica si hace forwarding
29     bool forward;
30
31     /// Dispositivo de logging
32     std::ostream& log;
33
34     /// Buffers de recepción
35     struct BufferKey
36     {
37         uint16_t id;
38         uint32_t src, dst;
39         uint8_t proto;
40         BufferKey(const IPHeader& h):
41             id(h.id), src(h.src), dst(h.dst), proto(h.proto)
42         {}
43         bool operator< (const BufferKey& b) const
44         { return id < b.id && src < b.src && dst < b.dst && proto < b.proto; }
45     };
46     typedef std::map< uint16_t, std::string > offsetmap_type;
47     typedef std::map< BufferKey, offsetmap_type > buffer_type;
48     buffer_type buffer;
49
50     /// Constructor
51     IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router = false,
52         bool forward = false, std::ostream& log = std::cout);
53
54     /// Descarta un paquete
55     void drop(const std::string& msg, const std::string& buf);
56     void drop(const std::string& msg, const IPHeader& iph);
57
58     /// Recibe un paquete IP
59     std::string recv(uint8_t& proto, IPAddr& src, IPAddr& dst)
60         throw (std::runtime_error);
61
62     // Nada de andar copiando placas...
63     private:
64     IPIn(const IPIn&);
65     IPIn& operator=(const IPIn&);
66
67 };
68
69 #endif // _IPIN_H_
70
71 // vim: set et sw=4 sts=4 :