#include "ipout.h"
#include "ipaddr.h"
+#include "routetable.h"
#include "dev.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, 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, 25);
- 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 = 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)
+ 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);
+ Dev dev(addr, mtu, queue_id);
+ Dev fwque(addr, DEV_MAX_MTU, queue_id+1);
+ RouteTable table(dev);
+ add_routes(table, ifs, 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, 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 :