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
|
/*
* 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))) {
printf("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) {
printf("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 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;}
|