]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/ipin.h
ecdc93ebdfff71ecdc4a98d44a5867f0cb9ff75c
[z.facultad/75.74/practicos.git] / practicas / pipi / 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     /// Buffers de paquetes completos
51     struct BufferPkt
52     {
53         uint32_t dst;
54         std::string data;
55         BufferPkt() {}
56         BufferPkt(const IPAddr& dst, const std::string& data):
57             dst(dst), data(data) {}
58     };
59     typedef std::map< IPAddr, BufferPkt > srcmap_type;
60     typedef std::map< uint8_t, srcmap_type > buffer_complete_type;
61     buffer_complete_type buffer_complete;
62
63     /// Constructor
64     IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router = false,
65         bool forward = false, std::ostream& log = std::cout);
66
67     /// Descarta un paquete
68     void drop(const std::string& msg, const std::string& buf);
69     void drop(const std::string& msg, const IPHeader& iph);
70
71     /// Recibe un paquete IP
72     std::string recv(uint8_t proto, IPAddr& src, IPAddr& dst,
73             bool filter = false)
74         throw (std::runtime_error);
75
76     // Nada de andar copiando placas...
77     private:
78     IPIn(const IPIn&);
79     IPIn& operator=(const IPIn&);
80
81 };
82
83 #endif // _IPIN_H_
84
85 // vim: set et sw=4 sts=4 :