]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/ipin.cpp
Forwarding casi implementado. Hay un bug cuando se usan distintos MTU que hay
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipin.cpp
index 2d94158fee63e24ba8dac46867d401f19ed9b8c0..a9029c67c14b994b502f9100117ee5cd70340bb7 100644 (file)
@@ -3,9 +3,13 @@
 #include "ipheader.h"
 
 /// Constructor
-IPIn::IPIn(const IPAddr& ip, Dev& dev, std::ostream& log):
-    ip(ip), dev(dev), log(log)
-{}
+IPIn::IPIn(const IPAddr& ip, Dev& dev, Dev& forward_que, bool router,
+        bool forward, std::ostream& log):
+    ip(ip), dev(dev), forward_que(forward_que), router(router),
+    forward(forward), log(log)
+{
+    if (router) forward = true;
+}
 
 void IPIn::drop(const std::string& msg, const std::string& buf)
 {
@@ -43,12 +47,25 @@ std::string IPIn::recv(uint8_t proto, IPAddr& src, IPAddr& dst) throw (std::runt
             drop("Mal checksum", iph);
             continue;
         }
-        //TODO forwarding (ponerlo en una cola para el proceso que manda)
-        if (iph.dst != ip)
+        // No es para nosotros y no forwardeamos
+        if (iph.dst != ip && !forward)
         {
             drop("No es para nosotros y no hacemos forward", iph);
             continue;
         }
+        // No es para nosotros pero forwardeamos
+        else if (iph.dst != ip)
+        {
+            forward_que.transmit(buf, ip);
+            continue;
+        }
+        // Es para nosotros pero somos router
+        else if (router)
+        {
+            drop("Es para nosotros pero somos un router", iph);
+            continue;
+        }
+        // Es para nosotros y somos un host
         // Guarda en buffer
         buffer[iph][iph.offset] = buf.substr(iph.header_len());
         // Si tiene más fragmentos o es un protocolo distinto, sigo