]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/ipin.cpp
45e340e90bd285632496c0e9870015460571487e
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipin.cpp
1
2 #include "ipin.h"
3 #include "ipheader.h"
4
5 /// Constructor
6 IPIn::IPIn(const IPAddr& ip, Dev& dev, std::ostream& log):
7     ip(ip), dev(dev), log(log)
8 {}
9
10 void IPIn::drop(const std::string& msg, const std::string& buf)
11 {
12     log << "IPIn::drop: " << msg << "\n\tBuffer: " << buf << "\n";
13 }
14
15 void IPIn::drop(const std::string& msg, const IPHeader& iph)
16 {
17     log << "IPIn::drop: " << msg << "\n\tIPHeader: " << iph << "\n";
18 }
19
20 /// Recibe un paquete IP
21 std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runtime_error)
22 {
23     while (true)
24     {
25         std::string buf = dev.receive();
26         // No es siquiera IP
27         if (buf.size() < IPHeader::header_len())
28         {
29             drop("Cabecera incompleta o no es IP", buf);
30             continue;
31         }
32         IPHeader iph(buf);
33 #ifdef DEBUG
34         log << iph << "\n";
35 #endif
36         if (iph.version != 4)
37         {
38             drop("Versión IP incorrecta", iph);
39             continue;
40         }
41         if (!iph.check_checksum())
42         {
43             drop("Mal checksum", iph);
44             continue;
45         }
46         // TODO forwarding (ponerlo en una cola para el proceso que manda)
47         if (iph.dst != ip)
48         {
49             drop("No es para nosotros y no hacemos forward", iph);
50             continue;
51         }
52         //TODO a un buffer
53         if (iph.proto != proto)
54         {
55             drop("No es el protocolo pedido", iph);
56             continue;
57         }
58         src = iph.src;
59         dst = iph.dst;
60         std::string data = buf.substr(iph.total_len - iph.header_len());
61         return data;
62     }
63 }
64
65 // vim: set et sw=4 sts=4 :