]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/test_ipout.cpp
Forwarding casi implementado. Hay un bug cuando se usan distintos MTU que hay
[z.facultad/75.74/practicos.git] / practicas / pipi / src / test_ipout.cpp
index acdb77fb3000f92ae5c2e3afda252be1a71416ad..ec4430f63fe5b48d0297494aa49590c629d90c47 100644 (file)
@@ -4,6 +4,8 @@
 #include "routetable.h"
 #include "dev.h"
 #include <iostream>
+#include <fstream>
+#include <sstream>
 #include <string>
 #include <cassert>
 #include <unistd.h>
 #include <sys/ipc.h>
 #include <sys/msg.h>
 
-// Uso: ./test_ipout ip dst msg mtu proto queue_id
+// Uso: ./test_ipout ip dst mtu routes_file proto queue_id
+
+void add_routes(RouteTable& rt, std::istream& is, Dev& dev);
 
 int main(int argc, char* argv[])
 {
     IPAddr addr("10.10.10.2");
     IPAddr dst("10.10.10.1");
-    std::string msg = "hola mundo";
     unsigned mtu = 25;
     unsigned proto = 0;
     key_t queue_id = DEV_DEFAULT_KEY;
+    std::string fname = "route.txt";
     if (argc > 1)
         addr = IPAddr(argv[1]);
     if (argc > 2)
         dst = IPAddr(argv[2]);
     if (argc > 3)
-        msg = argv[3];
+        mtu = atoi(argv[3]);
     if (argc > 4)
-        mtu = atoi(argv[4]);
+        fname = argv[4];
     if (argc > 5)
         proto = atoi(argv[5]);
     if (argc > 6)
         queue_id = atoi(argv[6]);
-    int que_id = msgget(queue_id, IPC_CREAT | 0666);
-    assert(que_id != -1);
+    int que_id = msgget(queue_id, IPC_CREAT | 0666); assert(que_id != -1);
+    que_id = msgget(queue_id+1, IPC_CREAT | 0666); assert(que_id != -1);
+    std::ifstream ifs(fname.c_str()); assert(ifs);
     Dev dev(addr, mtu, queue_id);
+    Dev fwque(addr, mtu, queue_id+1);
     RouteTable table(dev);
-    table.add("10.10.10.1", 0, 0, dev);
-    table.add("10.10.10.2", 0, 0, dev);
-    table.add("10.10.10.3", "10.10.10.10", 0, dev);
-    IPOut ipout(addr, table);
-    if (ipout.send(msg, proto, dst))
-        std::cout << "Enviado '" << msg << "' a " << dst << "\n";
-    else
-        std::cout << "NO SE PUDO ENVIAR '" << msg << "' a " << dst << "\n";
+    add_routes(table, ifs, dev);
+    IPOut ipout(addr, table, fwque);
+    std::string msg;
+    while (std::getline(std::cin, msg))
+    {
+        if (ipout.send(msg, proto, dst))
+            std::cout << "Enviado '" << msg << "' a " << dst << "\n";
+        else
+            std::cout << "NO SE PUDO ENVIAR '" << msg << "' a " << dst << "\n";
+    }
     return 0;
 }
 
+void add_routes(RouteTable& rt, std::istream& is, Dev& dev)
+{
+    std::string line;
+    while (std::getline(is, line))
+    {
+        std::istringstream iss(line);
+        std::string net;
+        std::string gw;
+        unsigned metric;
+        iss >> net >> gw >> metric;
+        if (net == "0") net = "0.0.0.0";
+        if (gw == "0") gw = "0.0.0.0";
+        rt.add(net.c_str(), gw.c_str(), metric, dev);
+    }
+}
+
 // vim: set et sw=4 sts=4 :