summaryrefslogtreecommitdiffstats
path: root/LogReceiver/networkmanager.cpp
blob: 9edcf5e53839ed52f87e42af42a25641fdad9ec6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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;}