]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/test_ipout.cpp
Se generaliza el devque para seguir (ab)usándolo como cola y poder pedir de
[z.facultad/75.74/practicos.git] / practicas / pipi / src / test_ipout.cpp
1
2 #include "ipout.h"
3 #include "ipaddr.h"
4 #include "routetable.h"
5 #include "devque.h"
6 #include <iostream>
7 #include <fstream>
8 #include <sstream>
9 #include <string>
10 #include <cassert>
11 #include <unistd.h>
12 #include <fcntl.h>
13 #include <sys/types.h>
14 #include <sys/ipc.h>
15 #include <sys/msg.h>
16
17 // Uso: ./test_ipout ip dst mtu routes_file proto queue_id
18
19 void add_routes(RouteTable& rt, std::istream& is, size_t mtu, Dev& dev);
20
21 int main(int argc, char* argv[])
22 {
23     IPAddr addr("10.10.10.2");
24     IPAddr dst("10.10.10.1");
25     unsigned mtu = 25;
26     unsigned proto = 0;
27     key_t queue_id = DEVQUE_DEFAULT_KEY;
28     std::string fname = "route.txt";
29     if (argc > 1)
30         addr = IPAddr(argv[1]);
31     if (argc > 2)
32         dst = IPAddr(argv[2]);
33     if (argc > 3)
34         mtu = atoi(argv[3]);
35     if (argc > 4)
36         fname = argv[4];
37     if (argc > 5)
38         proto = atoi(argv[5]);
39     if (argc > 6)
40         queue_id = atoi(argv[6]);
41     int que_id = msgget(queue_id, IPC_CREAT | 0666); assert(que_id != -1);
42     que_id = msgget(queue_id+1, IPC_CREAT | 0666); assert(que_id != -1);
43     std::ifstream ifs(fname.c_str()); assert(ifs);
44     DevQue dev(addr, mtu, queue_id);
45     DevQue fwque(addr, DEV_MAX_MTU, queue_id+1);
46     RouteTable table(dev);
47     add_routes(table, ifs, mtu, dev);
48     IPOut ipout(addr, table, fwque, std::cerr);
49     std::string msg;
50     while (std::getline(std::cin, msg))
51     {
52         if (ipout.send(msg, proto, dst))
53             std::cout << "Enviado '" << msg << "' a " << dst << "\n";
54         else
55             std::cout << "NO SE PUDO ENVIAR '" << msg << "' a " << dst << "\n";
56     }
57     return 0;
58 }
59
60 void add_routes(RouteTable& rt, std::istream& is, size_t mtu, Dev& dev)
61 {
62     std::string line;
63     while (std::getline(is, line))
64     {
65         std::istringstream iss(line);
66         std::string net;
67         std::string gw;
68         unsigned metric;
69         iss >> net >> gw >> metric;
70         if (net == "0") net = "0.0.0.0";
71         if (gw == "0") gw = "0.0.0.0";
72         rt.add(net, gw, mtu, metric, dev);
73     }
74 }
75
76 // vim: set et sw=4 sts=4 :