summaryrefslogtreecommitdiffstats
path: root/LogReceiver/routemanager.cpp
blob: ceb9b28d5ce20d77b30310ec9bf66a523cd64665 (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
/*
 * routemanager.cpp
 *
 *  Created on: Sep 5, 2011
 *      Author: niklas
 */

#include "routemanager.h"

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

}

routemanager::~routemanager() {
	// 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 routemanager::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;
}

int routemanager::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";
		rtnl_link_change(rtsock, old, request, 0);
	} else {
		qDebug() << "change failed";
	}

	retval = 0;

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