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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
|
/*
* Copyright (C) 2008-2016 Tobias Brunner
* Copyright (C) 2007 Martin Willi
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup kernel_net kernel_net
* @{ @ingroup kernel
*/
#ifndef KERNEL_NET_H_
#define KERNEL_NET_H_
typedef struct kernel_net_t kernel_net_t;
typedef enum kernel_address_type_t kernel_address_type_t;
#include <collections/enumerator.h>
#include <networking/host.h>
#include <plugins/plugin.h>
#include <kernel/kernel_interface.h>
/**
* Type of addresses (e.g. when enumerating them)
*/
enum kernel_address_type_t {
/** normal addresses (on regular, up, non-ignored) interfaces */
ADDR_TYPE_REGULAR = (1 << 0),
/** addresses on down interfaces */
ADDR_TYPE_DOWN = (1 << 1),
/** addresses on ignored interfaces */
ADDR_TYPE_IGNORED = (1 << 2),
/** addresses on loopback interfaces */
ADDR_TYPE_LOOPBACK = (1 << 3),
/** virtual IP addresses */
ADDR_TYPE_VIRTUAL = (1 << 4),
/** to enumerate all available addresses */
ADDR_TYPE_ALL = (1 << 5) - 1,
};
/**
* Interface to the network subsystem of the kernel.
*
* The kernel network interface handles the communication with the kernel
* for interface and IP address management.
*/
struct kernel_net_t {
/**
* Get the feature set supported by this kernel backend.
*
* @return ORed feature-set of backend
*/
kernel_feature_t (*get_features)(kernel_net_t *this);
/**
* Get our outgoing source address for a destination.
*
* Does a route lookup to get the source address used to reach dest.
* The returned host is allocated and must be destroyed.
* An optional src address can be used to check if a route is available
* for the given source to dest.
*
* @param dest target destination address
* @param src source address to check, or NULL
* @return outgoing source address, NULL if unreachable
*/
host_t* (*get_source_addr)(kernel_net_t *this, host_t *dest, host_t *src);
/**
* Get the next hop for a destination.
*
* Does a route lookup to get the next hop used to reach dest.
* The returned host is allocated and must be destroyed.
* An optional src address can be used to check if a route is available
* for the given source to dest.
*
* @param dest target destination address
* @param prefix prefix length if dest is a subnet, -1 for auto
* @param src source address to check, or NULL
* @param[out] iface allocated name of the interface to reach dest, if
* available (optional)
* @return next hop address, NULL if unreachable
*/
host_t* (*get_nexthop)(kernel_net_t *this, host_t *dest, int prefix,
host_t *src, char **iface);
/**
* Get the interface name of a local address. Interfaces that are down or
* ignored by config are not considered.
*
* @param host address to get interface name from
* @param name allocated interface name (optional)
* @return TRUE if interface found and usable
*/
bool (*get_interface) (kernel_net_t *this, host_t *host, char **name);
/**
* Creates an enumerator over all local addresses.
*
* This function blocks an internal cached address list until the
* enumerator gets destroyed.
* The hosts are read-only, do not modify of free.
*
* @param which a combination of address types to enumerate
* @return enumerator over host_t's
*/
enumerator_t *(*create_address_enumerator) (kernel_net_t *this,
kernel_address_type_t which);
/**
* Creates an enumerator over all local subnets.
*
* Local subnets are subnets the host is directly connected to.
*
* The enumerator returns the network, subnet mask and interface.
*
* @return enumerator over host_t*, uint8_t, char*
*/
enumerator_t *(*create_local_subnet_enumerator)(kernel_net_t *this);
/**
* Add a virtual IP to an interface.
*
* Virtual IPs are attached to an interface. If an IP is added multiple
* times, the IP is refcounted and not removed until del_ip() was called
* as many times as add_ip().
*
* @param virtual_ip virtual ip address to assign
* @param prefix prefix length to install with IP address, -1 for auto
* @param iface interface to install virtual IP on
* @return SUCCESS if operation completed
*/
status_t (*add_ip) (kernel_net_t *this, host_t *virtual_ip, int prefix,
char *iface);
/**
* Remove a virtual IP from an interface.
*
* The kernel interface uses refcounting, see add_ip().
*
* @param virtual_ip virtual ip address to remove
* @param prefix prefix length of the IP to uninstall, -1 for auto
* @param wait TRUE to wait until IP is gone
* @return SUCCESS if operation completed
*/
status_t (*del_ip) (kernel_net_t *this, host_t *virtual_ip, int prefix,
bool wait);
/**
* Add a route.
*
* @param dst_net destination net
* @param prefixlen destination net prefix length
* @param gateway gateway for this route
* @param src_ip source ip of the route
* @param if_name name of the interface the route is bound to
* @return SUCCESS if operation completed
* ALREADY_DONE if the route already exists
*/
status_t (*add_route) (kernel_net_t *this, chunk_t dst_net,
uint8_t prefixlen, host_t *gateway, host_t *src_ip,
char *if_name);
/**
* Delete a route.
*
* @param dst_net destination net
* @param prefixlen destination net prefix length
* @param gateway gateway for this route
* @param src_ip source ip of the route
* @param if_name name of the interface the route is bound to
* @return SUCCESS if operation completed
*/
status_t (*del_route) (kernel_net_t *this, chunk_t dst_net,
uint8_t prefixlen, host_t *gateway, host_t *src_ip,
char *if_name);
/**
* Destroy the implementation.
*/
void (*destroy) (kernel_net_t *this);
};
/**
* Helper function to (un-)register net kernel interfaces from plugin features.
*
* This function is a plugin_feature_callback_t and can be used with the
* PLUGIN_CALLBACK macro to register an net kernel interface constructor.
*
* @param plugin plugin registering the kernel interface
* @param feature associated plugin feature
* @param reg TRUE to register, FALSE to unregister
* @param data data passed to callback, an kernel_net_constructor_t
*/
bool kernel_net_register(plugin_t *plugin, plugin_feature_t *feature,
bool reg, void *data);
#endif /** KERNEL_NET_H_ @}*/
|