summaryrefslogtreecommitdiffstats
path: root/LogReceiver/routemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'LogReceiver/routemanager.cpp')
-rw-r--r--LogReceiver/routemanager.cpp114
1 files changed, 104 insertions, 10 deletions
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;
}