]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/test_ipout.cpp
Se vuelven para atrás los cambios de buffer y filtrado y, por el contrario, ya
[z.facultad/75.74/practicos.git] / practicas / pipi / src / test_ipout.cpp
index dff222a011a0c951c2602444c185a6eae18f9428..1f11fc1535ddd9053e61c74f50d045c222fa2721 100644 (file)
@@ -1,8 +1,12 @@
 
 #include "ipout.h"
 #include "ipaddr.h"
-#include "dev.h"
+#include "routetable.h"
+#include "devque.h"
 #include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
 #include <cassert>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ipc.h>
 #include <sys/msg.h>
 
-int main()
+// Uso: ./test_ipout ip dst mtu routes_file proto queue_id
+
+void add_routes(RouteTable& rt, std::istream& is, size_t mtu, Dev& dev);
+
+int main(int argc, char* argv[])
 {
-    int que_id = msgget(DEV_DEFAULT_KEY, IPC_CREAT | 0666);
-    assert(que_id != -1);
     IPAddr addr("10.10.10.2");
-    Dev dev(addr);
-    IPOut ipout(addr, dev);
-    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";
+    IPAddr dst("10.10.10.1");
+    unsigned mtu = 25;
+    unsigned proto = 0;
+    key_t queue_id = DEVQUE_DEFAULT_KEY;
+    std::string fname = "route.txt";
+    if (argc > 1)
+        addr = IPAddr(argv[1]);
+    if (argc > 2)
+        dst = IPAddr(argv[2]);
+    if (argc > 3)
+        mtu = atoi(argv[3]);
+    if (argc > 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);
+    que_id = msgget(queue_id+1, IPC_CREAT | 0666); assert(que_id != -1);
+    std::ifstream ifs(fname.c_str()); assert(ifs);
+    DevQue dev(addr, mtu, queue_id);
+    DevQue fwque(addr, DEV_MAX_MTU, queue_id+1);
+    RouteTable table(dev);
+    add_routes(table, ifs, mtu, dev);
+    IPOut ipout(addr, table, fwque, std::cerr);
+    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, size_t mtu, 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, gw, mtu, metric, dev);
+    }
+}
+
 // vim: set et sw=4 sts=4 :