#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, DEV_MAX_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::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 :