summaryrefslogtreecommitdiffstats
path: root/LogReceiver/routemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'LogReceiver/routemanager.cpp')
-rw-r--r--LogReceiver/routemanager.cpp142
1 files changed, 66 insertions, 76 deletions
diff --git a/LogReceiver/routemanager.cpp b/LogReceiver/routemanager.cpp
index 3063b21..98ce2ad 100644
--- a/LogReceiver/routemanager.cpp
+++ b/LogReceiver/routemanager.cpp
@@ -16,115 +16,105 @@ 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
+ * This method adds /replaces the default route.
+ * This method adds /replaces the default route.
+ * 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 ifName
+ * the interface name
*
* @param gateway
* the gateway address (e.g: 192.168.0.254)
- *
+ * @param mss
+ * the mss.
* @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 -1 if an error happened.
* return 0 if everything was ok.
*/
-int routemanager::doRoute(QString destination, QString gateway, int af, int action) {
+int routemanager::replaceDefaultRoute(QString ifname, QString gateway,
+ int mss, int af) {
+ struct nl_cache *cache;
struct nl_handle* rtsock;
- struct nl_addr * dst;
struct nl_addr * gw;
struct rtnl_route * route;
- int retval;
+ int retval, iface_idx;
- ba = destination.toAscii();
- char *dstaddr = ba.data();
+ QByteArray ba_ifn = ifname.toAscii();
+ char * ifn = ba_ifn.data();
- ba = gateway.toAscii();
- char * gwaddr = ba.data();
+ QByteArray ba_gw = gateway.toAscii();
+ char * gwaddr = ba_gw.data();
+
+ qDebug() << "---doRoute() gwaddr" << gwaddr;
- 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);
+ printf("Invalid router address given: %s\n", gwaddr);
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);
+ if ((cache = rtnl_link_alloc_cache(rtsock)) == NULL) {
+ printf("error with link cache alloc \n");
}
- else {
- qDebug() << "unknown action:" << action;
+
+ iface_idx = rtnl_link_name2i(cache, ifn);
+
+ route = rtnl_route_alloc();
+ rtnl_route_set_scope(route, RT_SCOPE_UNIVERSE);
+ rtnl_route_set_gateway(route, gw);
+ rtnl_route_set_oif(route, iface_idx);
+
+ if (mss > 0) {
+ rtnl_route_set_metric(route, RTAX_ADVMSS, mss);
}
+ retval = rtnl_route_add(rtsock, route, NLM_F_REPLACE);
+ qDebug() << "return value:" << retval << ":" << strerror(-retval);
rtnl_route_put(route);
- nl_addr_put(dst);
nl_addr_put(gw);
nl_handle_destroy(rtsock);
- return 0;
+ return retval;
}
+
+/**
+ * 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 ifName
+ * the interface name.
+ * @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 ifName, QString destination, QString gateway, int af, int action) {return 0;}