From d3612f403d0122a6929837764fad849634b26e1b Mon Sep 17 00:00:00 2001 From: Niklas Date: Tue, 20 Sep 2011 16:46:11 +0200 Subject: the checkConnectivity method is working now. we use the rtnl functions of the libnl. --- LogReceiver/routemanager.cpp | 142 ++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 76 deletions(-) (limited to 'LogReceiver/routemanager.cpp') 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;} -- cgit v1.2.3-55-g7522