/* * routemanager.cpp * * Created on: Sep 5, 2011 * Author: niklas */ #include "routemanager.h" routemanager::routemanager() { // TODO Auto-generated constructor stub } routemanager::~routemanager() { // TODO Auto-generated destructor stub } int routemanager::addRoute(QString ifname, QString destination, QString netmask, QString gateway, int metric) { //struct in_addr destination, netmask, gateway; //add_route(); return doRoute(destination, gateway, AF_INET, 0); } int routemanager::addRoute6(QString ifname, QString destination, QString netmask, QString gateway, int metric) { //struct in_addr destination, netmask, gateway; //add_route(); return doRoute(destination, gateway, AF_INET6, 0); } int routemanager::delRoute(QString ifname, QString destination, QString netmask, QString gateway, int metric) { /*struct in_addr ds, nm, gw; ba = ifname.toAscii(); const char *in = ba.constData(); inet_aton("0.0.0.0", &ds); inet_aton("0.0.0.0", &nm); ba = gateway.toAscii(); char * gwaddr = ba.data(); inet_aton(gwaddr,&gw); del_route(in, ds, nm, gw, metric); */ return doRoute(destination, gateway, AF_INET, 1); } int routemanager::delRoute6(QString ifname, QString destination, QString netmask, QString gateway, int metric) { return doRoute(destination, gateway, AF_INET6, 1); } /** * This method adds or deletes a route. * This method adds or deletes a route. According to the action, * you can delete a route or add a route from/to the * main routing table. In most cases, this method will be used for deleting * or adding a default rout. To keep it modular, it is possible * to specify an ip address family. * * @param destination * the destination address (e.g: 0.0.0.0) * * @param gateway * the gateway address (e.g: 192.168.0.254) * * @param af * specify the family type of the ip address. * possible values are: AF_INET for an IPv4 address * AF_INET6 for an IPv6 address * * @param action * possible values are: 0: perform add route * 1: perform delete route * * @return * return 1 if an error happened. * return 0 if everything was ok. */ int routemanager::doRoute(QString destination, QString gateway, int af, int action) { struct nl_handle* rtsock; struct nl_addr * dst; struct nl_addr * gw; struct rtnl_route * route; int retval; ba = destination.toAscii(); char *dstaddr = ba.data(); ba = gateway.toAscii(); char * gwaddr = ba.data(); if (!(dst = nl_addr_parse(dstaddr, af))) { qDebug() << "Invalid network address given:" << dstaddr; return 1; } if (!(gw = nl_addr_parse(gwaddr, af))) { qDebug() << "Invalid router address given: " << gwaddr; nl_addr_put(dst); return 1; } route = rtnl_route_alloc(); rtnl_route_set_family(route, af); rtnl_route_set_scope(route, RT_SCOPE_UNIVERSE); rtnl_route_set_dst(route, dst); rtnl_route_set_gateway(route, gw); rtsock = nl_handle_alloc(); nl_connect(rtsock, NETLINK_ROUTE); if (action == 0) { rtnl_route_add(rtsock, route, 0); } else if (action == 1) { rtnl_route_del(rtsock, route, 0); } else { qDebug() << "unknown action:" << action; } rtnl_route_put(route); nl_addr_put(dst); nl_addr_put(gw); nl_handle_destroy(rtsock); return 0; }