summaryrefslogblamecommitdiffstats
path: root/LogReceiver/routemanager.cpp
blob: 6328c21ecc12c1bc61b7d00fcfd012012384dbe7 (plain) (tree)
1
2
3
4
5
6
7






                           










                                               








                                                                

                                                       

                                                          
 


















                                                                

 




































                                                                                     

                                  




































                                                                        
 
/*
 * 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;
}