]> git.llucax.com Git - z.facultad/75.74/practicos.git/commitdiff
Mejora interfaz de IPOut.
authorLeandro Lucarella <llucax@gmail.com>
Thu, 1 Jun 2006 18:11:47 +0000 (18:11 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 1 Jun 2006 18:11:47 +0000 (18:11 +0000)
practicas/pipi/src/ipout.cpp
practicas/pipi/src/ipout.h
practicas/pipi/src/test_ipout.cpp

index 48cbc30ac34b61a4f43f8e0b71c0b90beb7e8e4a..fb60ffd02ba32907187b253e46e29c679b6612d8 100644 (file)
@@ -1,6 +1,7 @@
 
 #include "ipout.h"
 #include "ipheader.h"
+#include <ctime>
 
 /// Constructor
 IPOut::IPOut(const IPAddr& ip, Dev& dev, std::ostream& log):
@@ -18,8 +19,8 @@ void IPOut::drop(const std::string& msg, const IPHeader& iph)
 }
 
 /// Envía un paquete IP
-bool IPOut::send(const std::string& data, IPAddr& src, IPAddr& dst,
-        uint8_t proto, bool df, uint8_t ttl, uint16_t id)
+bool IPOut::send(const std::string& data, uint8_t proto, IPAddr dst, IPAddr src,
+        bool df, uint8_t ttl, uint16_t id)
     throw (std::runtime_error)
 {
     // TODO fragmentar
@@ -28,6 +29,10 @@ bool IPOut::send(const std::string& data, IPAddr& src, IPAddr& dst,
         drop("Tamaño de paquete más grande que MTU", data);
         return false;
     }
+    if (!src)
+        src = ip;
+    if (!id)
+        id = get_id();
     IPHeader iph(4, IPHeader::header_len() + data.size(), id, df, 0, 0,
             ttl, proto, src, dst);
     std::string buf((char*) &iph, sizeof(IPHeader));
@@ -40,4 +45,10 @@ bool IPOut::send(const std::string& data, IPAddr& src, IPAddr& dst,
     return true;
 }
 
+/// Obtiene un identificador para el paquete
+uint16_t IPOut::get_id() const
+{
+    return time(NULL);
+}
+
 // vim: set et sw=4 sts=4 :
index 57c139bceb19f28eb064e884ef4244728b9aa5a3..61c21116991eb6e836f094b859f748688c03a69e 100644 (file)
@@ -29,10 +29,13 @@ struct IPOut
     void drop(const std::string& msg, const IPHeader& iph);
 
     /// Envía un paquete IP
-    bool send(const std::string& data, IPAddr& src, IPAddr& dst, uint8_t proto,
-            bool df = 0, uint8_t ttl = 64, uint16_t id = 0)
+    bool send(const std::string& data, uint8_t proto, IPAddr dst,
+            IPAddr src = 0, bool df = 0, uint8_t ttl = 64, uint16_t id = 0)
         throw (std::runtime_error);
 
+    /// Obtiene un identificador para el paquete
+    uint16_t get_id() const;
+
     // Nada de andar copiando...
     private:
     IPOut(const IPOut&);
index bc68022bd359ce9bda42f15f27d86bd3a2e03d1f..dff222a011a0c951c2602444c185a6eae18f9428 100644 (file)
@@ -15,10 +15,9 @@ int main()
     int que_id = msgget(DEV_DEFAULT_KEY, IPC_CREAT | 0666);
     assert(que_id != -1);
     IPAddr addr("10.10.10.2");
-    IPAddr dst("10.10.10.1");
     Dev dev(addr);
     IPOut ipout(addr, dev);
-    if (ipout.send("hola mundo", addr, dst, 0))
+    if (ipout.send("hola mundo", 0, IPAddr("10.10.10.1")))
         std::cout << "Enviado 'hola mundo' a 10.10.10.1\n";
     else
         std::cout << "NO SE PUDO ENVIAR 'hola mundo' a 10.10.10.1\n";