summaryrefslogblamecommitdiffstats
path: root/LogReceiver/networkmanager.cpp
blob: 9edcf5e53839ed52f87e42af42a25641fdad9ec6 (plain) (tree)
1
2
3
4
5
6
7
8
9
  
                     




                           
                           
 
                                  



                                               
                                   


                                              
   


                                                

                                   

                      


                                            

             




                                                     
 
          
                                   

                                  
                                                                        

                                  
                                 

                                  
                              
 

                                             
 



                                                    
 
                                                
                                                                         
                          

         


                                          
                                                              
                                                             
         









                                                               

         

                                                                           

                              

                                  


                      












                                                                             
                                                                   





























                                                                   
                                                                   

                                            

                                                                                   

         



                                  
 
                      
 





























                                                                           
                                                                                                                 
/*
 * networkmanager.cpp
 *
 *  Created on: Sep 5, 2011
 *      Author: niklas
 */

#include "networkmanager.h"

NetworkManager::NetworkManager() {
	// TODO Auto-generated constructor stub

}

NetworkManager::~NetworkManager() {
	// TODO Auto-generated destructor stub
}

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

 * @return
 *  return -1 if an error happened.
 *  return 0 if everything was ok.
 */
int NetworkManager::replaceDefaultRoute(QString ifname, QString gateway,
		int mss, int af) {
	struct nl_cache *cache;
	struct nl_handle* rtsock;
	struct nl_addr * gw;
	struct rtnl_route * route;
	int retval, iface_idx;

	QByteArray ba_ifn = ifname.toAscii();
	char * ifn = ba_ifn.data();

	QByteArray ba_gw = gateway.toAscii();
	char * gwaddr = ba_gw.data();

	qDebug() << "---doRoute() gwaddr" << gwaddr;

	if (!(gw = nl_addr_parse(gwaddr, af))) {
		qDebug() << "Invalid router address given: %s\n", gwaddr;
		return -1;
	}

	rtsock = nl_handle_alloc();
	nl_connect(rtsock, NETLINK_ROUTE);

	if ((cache = rtnl_link_alloc_cache(rtsock)) == NULL) {
		qDebug() << "error with link cache alloc \n";
	}

	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(gw);
	nl_handle_destroy(rtsock);

	return retval;
}
/**
 * This method brings an interface up or down.
 *
 * @param ifname
 *   is a string which contains the interface name which is going down or up.
 *
 * @param up
 *   is a bool. true means. we bring the interface up.
 *              false meand. we bring the interface down.
 * @return
 *   0 if everything is ok
 *   else an error
 */
int NetworkManager::bringInterfaceUpDown(QString ifname, bool up) {
	struct nl_cache *cache;
	struct nl_handle* rtsock;
	struct rtnl_link* request = NULL;
	struct rtnl_link* old = NULL;
	int retval;

	QByteArray ba_ifn = ifname.toAscii();
	char * ifn = ba_ifn.data();

	if(!(request = rtnl_link_alloc())) {
		qDebug() << "error. couldn't allocate a rtnl link";
		return -1;
	}

	rtsock = nl_handle_alloc();
	nl_connect(rtsock, NETLINK_ROUTE);

	if(up) {
		rtnl_link_set_flags(request,IFF_UP);
	} else {
		rtnl_link_unset_flags(request, IFF_UP);
	}

	if ((cache = rtnl_link_alloc_cache(rtsock)) == NULL) {
		qDebug() << "error with link cache alloc ";
	}

	old = rtnl_link_get_by_name(cache,ifn);
	if (old) {
		qDebug() << "change link";
		retval = rtnl_link_change(rtsock, old, request, 0);
	} else {
		qDebug() << "change failed";
		retval = -1;
		qDebug() << "return value:" << retval << ":"  << strerror(-retval);
	}


	rtnl_link_put(old);
	rtnl_link_put(request);
	nl_handle_destroy(rtsock);

	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 NetworkManager::doRoute(QString ifName, QString destination, QString gateway, int af, int action) {return 0;}