From cf7bfd8d92c43daa81de1ede78e117686902e93f Mon Sep 17 00:00:00 2001 From: Niklas Date: Mon, 19 Sep 2011 16:38:13 +0200 Subject: added a new version of the routemanager. now the delRoute and addRoute is working with libnl functions.but still there is an error: /usr/include/netlink/route/route.h:60:57: error: ‘realm_t’ has not been declared /usr/include/netlink/route/route.h:61:8: error: ‘realm_t’ does not name a type --- LogReceiver/routemanager.cpp | 114 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 10 deletions(-) (limited to 'LogReceiver/routemanager.cpp') diff --git a/LogReceiver/routemanager.cpp b/LogReceiver/routemanager.cpp index d3d5139..6328c21 100644 --- a/LogReceiver/routemanager.cpp +++ b/LogReceiver/routemanager.cpp @@ -5,7 +5,6 @@ * Author: niklas */ - #include "routemanager.h" routemanager::routemanager() { @@ -17,20 +16,115 @@ routemanager::~routemanager() { // TODO Auto-generated destructor stub } -void routemanager::addRoute(QString ifname, QString destination, QString netmask, QString gateway, int metric) { +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); } -void 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); +/** + * 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(); - inet_aton(gwaddr,&gw); - del_route(in, ds, nm, gw, metric); + + 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; } -- cgit v1.2.3-55-g7522