]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/ipin.h
Queda lo mínimo del DNS implementado. Una prueba simple en una red sin routers
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipin.h
index 2c86191a5c81e10dda26369566859f9c2f31538d..8a452b2cd4dcb17ec6554e96e46fd9cff884fd24 100644 (file)
@@ -4,8 +4,9 @@
 #include "ipaddr.h"
 #include "ipheader.h"
 #include "dev.h"
-#include <iostream>
+#include <map>
 #include <string>
+#include <iostream>
 #include <stdexcept>
 
 /// IP de recepción
@@ -18,18 +19,44 @@ struct IPIn
     /// 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;
 
+    /// 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
-    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);
     void drop(const std::string& msg, const IPHeader& iph);
 
     /// Recibe un paquete IP
-    std::string recv(uint8_t proto, IPAddr& src, IPAddr& dst)
+    std::string recv(uint8_t& proto, IPAddr& src, IPAddr& dst)
         throw (std::runtime_error);
 
     // Nada de andar copiando placas...