summaryrefslogtreecommitdiffstats
path: root/LogReceiver/networkmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'LogReceiver/networkmanager.cpp')
-rw-r--r--LogReceiver/networkmanager.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/LogReceiver/networkmanager.cpp b/LogReceiver/networkmanager.cpp
new file mode 100644
index 0000000..9edcf5e
--- /dev/null
+++ b/LogReceiver/networkmanager.cpp
@@ -0,0 +1,178 @@
+/*
+ * 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;}