]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/ipin.h
Se cambia el logueo de paquetes dropeados a std::cerr para diferenciar de
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipin.h
index 2c64911c5969ef642692f1664eaa0b2975546111..86202784f477e7eb66e07fd396da89fff73e2963 100644 (file)
@@ -4,25 +4,52 @@
 #include "ipaddr.h"
 #include "ipheader.h"
 #include "dev.h"
 #include "ipaddr.h"
 #include "ipheader.h"
 #include "dev.h"
-#include <iostream>
+#include <map>
 #include <string>
 #include <string>
+#include <iostream>
 #include <stdexcept>
 
 /// IP de recepción
 struct IPIn
 {
 
 #include <stdexcept>
 
 /// IP de recepción
 struct IPIn
 {
 
-    /// Dirección MAC
+    /// Dirección IP
     IPAddr ip;
 
     /// Dispositivo de red
     Dev& dev;
 
     IPAddr ip;
 
     /// Dispositivo de red
     Dev& dev;
 
+    /// Cola para forwardear paquetes
+    Dev& forward_que;
+
+    /// Indica si es un router
+    bool router;
+
+    /// Indica si hace forwarding
+    bool forward;
+
     /// Dispositivo de logging
     std::ostream& log;
 
     /// Dispositivo de logging
     std::ostream& log;
 
+    /// Buffers de recepción
+    struct BufferKey
+    {
+        uint16_t id;
+        uint32_t src, dst;
+        uint8_t proto;
+        BufferKey(const IPHeader& h):
+            id(h.id), src(h.src), dst(h.dst), proto(h.proto)
+        {}
+        bool operator< (const BufferKey& b) const
+        { return id < b.id && src < b.src && dst < b.dst && proto < b.proto; }
+    };
+    typedef std::map< uint16_t, std::string > offsetmap_type;
+    typedef std::map< BufferKey, offsetmap_type > buffer_type;
+    buffer_type buffer;
+
     /// Constructor
     /// Constructor
-    IPIn(const IPAddr& ip, Dev& dev, std::ostream& log = std::cout);
+    IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router = false,
+        bool forward = false, std::ostream& log = std::cout);
 
     /// Descarta un paquete
     void drop(const std::string& msg, const std::string& buf);
 
     /// Descarta un paquete
     void drop(const std::string& msg, const std::string& buf);