nm-platform.h 12.3 KB
Newer Older
Pavel Šimerda's avatar
Pavel Šimerda committed
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
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* nm-platform.c - Handle runtime kernel networking configuration
 *
 * 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, or (at your option)
 * any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Copyright (C) 2009 - 2010 Red Hat, Inc.
 */

#ifndef NM_PLATFORM_H
#define NM_PLATFORM_H

#include <glib-object.h>
#include <netinet/in.h>
#include <linux/if.h>

#define NM_TYPE_PLATFORM            (nm_platform_get_type ())
#define NM_PLATFORM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PLATFORM, NMPlatform))
#define NM_PLATFORM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_PLATFORM, NMPlatformClass))
#define NM_IS_PLATFORM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_PLATFORM))
#define NM_IS_PLATFORM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_PLATFORM))
#define NM_PLATFORM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_PLATFORM, NMPlatformClass))

/******************************************************************/

37
38
39
40
41
42
43
44
45
46
47
typedef enum {
	/* no error specified, sometimes this means the arguments were wrong */
	NM_PLATFORM_ERROR_NONE,
	/* object was not found */
	NM_PLATFORM_ERROR_NOT_FOUND,
	/* object already exists */
	NM_PLATFORM_ERROR_EXISTS,
	/* object is not a slave */
	NM_PLATFORM_ERROR_NOT_SLAVE
} NMPlatformError;

Pavel Šimerda's avatar
Pavel Šimerda committed
48
49
50
51
52
53
54
typedef enum {
	NM_LINK_TYPE_NONE,
	NM_LINK_TYPE_UNKNOWN,
	NM_LINK_TYPE_GENERIC,
	NM_LINK_TYPE_LOOPBACK,
	NM_LINK_TYPE_ETHERNET,
	NM_LINK_TYPE_DUMMY,
55
56
57
	NM_LINK_TYPE_BRIDGE,
	NM_LINK_TYPE_BOND,
	NM_LINK_TYPE_TEAM,
Pavel Šimerda's avatar
Pavel Šimerda committed
58
59
60
61
62
63
} NMLinkType;

typedef struct {
	int ifindex;
	char name[IFNAMSIZ];
	NMLinkType type;
64
	int master;
65
66
67
	gboolean up;
	gboolean connected;
	gboolean arp;
Pavel Šimerda's avatar
Pavel Šimerda committed
68
69
} NMPlatformLink;

Pavel Šimerda's avatar
Pavel Šimerda committed
70
71
72
73
74
75
76
77
78
79
80
81
typedef struct {
	int ifindex;
	in_addr_t address;
	int plen;
} NMPlatformIP4Address;

typedef struct {
	int ifindex;
	struct in6_addr address;
	int plen;
} NMPlatformIP6Address;

Pavel Šimerda's avatar
Pavel Šimerda committed
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
typedef struct {
	int ifindex;
	in_addr_t network;
	int plen;
	in_addr_t gateway;
	int metric;
} NMPlatformIP4Route;

typedef struct {
	int ifindex;
	struct in6_addr network;
	int plen;
	struct in6_addr gateway;
	int metric;
} NMPlatformIP6Route;

Pavel Šimerda's avatar
Pavel Šimerda committed
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
/******************************************************************/

/* NMPlatform abstract class and its implementations provide a layer between
 * networkmanager's device management classes and the operating system kernel.
 *
 * How it works, is best seen in tests/nm-platform-test.c source file.
 *
 * NMPlatform provides interface to configure kernel interfaces and receive
 * notifications about both internal and external configuration changes. It
 * respects the following rules:
 *
 * 1) Every change made through NMPlatform is readily available and the respective
 * signals are called synchronously.
 *
 * 2) State of an object retrieved from NMPlatform (through functions or events)
 * is at least as recent than the state retrieved before.
 *
 * Any failure of the above rules should be fixed in NMPlatform implementations
 * and tested in nm-platform-test. Synchronization hacks should never be put
 * to any other code. That's why NMPlatform was created and that's why the
 * testing code was written for it.
 *
 * In future, parts of linux platform implementation may be moved to the libnl
 * library.
 *
 * If you have any problems related to NMPlatform on your system, you should
 * always first run tests/nm-linux-platform-test as root and with all
 * network configuration daemons stopped. Look at the code first.
 */

typedef struct {
	GObject parent;

131
	NMPlatformError error;
Pavel Šimerda's avatar
Pavel Šimerda committed
132
133
134
135
136
137
138
} NMPlatform;

typedef struct {
	GObjectClass parent;

	gboolean (*setup) (NMPlatform *);

139
140
141
	gboolean (*sysctl_set) (NMPlatform *, const char *path, const char *value);
	char * (*sysctl_get) (NMPlatform *, const char *path);

Pavel Šimerda's avatar
Pavel Šimerda committed
142
143
144
145
146
147
	GArray *(*link_get_all) (NMPlatform *);
	gboolean (*link_add) (NMPlatform *, const char *name, NMLinkType type);
	gboolean (*link_delete) (NMPlatform *, int ifindex);
	int (*link_get_ifindex) (NMPlatform *, const char *name);
	const char *(*link_get_name) (NMPlatform *, int ifindex);
	NMLinkType (*link_get_type) (NMPlatform *, int ifindex);
148
149
150
151
152
153
154
155

	gboolean (*link_set_up) (NMPlatform *, int ifindex);
	gboolean (*link_set_down) (NMPlatform *, int ifindex);
	gboolean (*link_set_arp) (NMPlatform *, int ifindex);
	gboolean (*link_set_noarp) (NMPlatform *, int ifindex);
	gboolean (*link_is_up) (NMPlatform *, int ifindex);
	gboolean (*link_is_connected) (NMPlatform *, int ifindex);
	gboolean (*link_uses_arp) (NMPlatform *, int ifindex);
Pavel Šimerda's avatar
Pavel Šimerda committed
156

157
158
159
	gboolean (*link_supports_carrier_detect) (NMPlatform *, int ifindex);
	gboolean (*link_supports_vlans) (NMPlatform *, int ifindex);

160
161
162
	gboolean (*link_enslave) (NMPlatform *, int master, int slave);
	gboolean (*link_release) (NMPlatform *, int master, int slave);
	gboolean (*link_get_master) (NMPlatform *, int slave);
163
164
165
166
	gboolean (*master_set_option) (NMPlatform *, int ifindex, const char *option, const char *value);
	char * (*master_get_option) (NMPlatform *, int ifindex, const char *option);
	gboolean (*slave_set_option) (NMPlatform *, int ifindex, const char *option, const char *value);
	char * (*slave_get_option) (NMPlatform *, int ifindex, const char *option);
167

Pavel Šimerda's avatar
Pavel Šimerda committed
168
169
170
171
172
173
174
175
	GArray * (*ip4_address_get_all) (NMPlatform *, int ifindex);
	GArray * (*ip6_address_get_all) (NMPlatform *, int ifindex);
	gboolean (*ip4_address_add) (NMPlatform *, int ifindex, in_addr_t address, int plen);
	gboolean (*ip6_address_add) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
	gboolean (*ip4_address_delete) (NMPlatform *, int ifindex, in_addr_t address, int plen);
	gboolean (*ip6_address_delete) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
	gboolean (*ip4_address_exists) (NMPlatform *, int ifindex, in_addr_t address, int plen);
	gboolean (*ip6_address_exists) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
Pavel Šimerda's avatar
Pavel Šimerda committed
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190

	GArray * (*ip4_route_get_all) (NMPlatform *, int ifindex);
	GArray * (*ip6_route_get_all) (NMPlatform *, int ifindex);
	gboolean (*ip4_route_add) (NMPlatform *, int ifindex,
		in_addr_t network, int plen, in_addr_t gateway, int prio, int mss);
	gboolean (*ip6_route_add) (NMPlatform *, int ifindex,
		struct in6_addr network, int plen, struct in6_addr gateway, int prio, int mss);
	gboolean (*ip4_route_delete) (NMPlatform *, int ifindex,
		in_addr_t network, int plen, in_addr_t gateway, int metric);
	gboolean (*ip6_route_delete) (NMPlatform *, int ifindex,
		struct in6_addr network, int plen, struct in6_addr gateway, int metric);
	gboolean (*ip4_route_exists) (NMPlatform *, int ifindex,
		in_addr_t network, int plen, in_addr_t gateway, int metric);
	gboolean (*ip6_route_exists) (NMPlatform *, int ifindex,
		struct in6_addr network, int plen, struct in6_addr gateway, int metric);
Pavel Šimerda's avatar
Pavel Šimerda committed
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
} NMPlatformClass;

/* NMPlatform signals
 *
 * Each signal handler is called with a type-specific object that provides
 * key attributes that constitute identity of the object. They may also
 * provide additional attributes for convenience.
 *
 * The object only intended to be used by the signal handler to determine
 * the current values. It is no longer valid after the signal handler exits
 * but you are free to copy the provided information and use it for later
 * reference.
 */
#define NM_PLATFORM_LINK_ADDED "link-added"
#define NM_PLATFORM_LINK_CHANGED "link-changed"
#define NM_PLATFORM_LINK_REMOVED "link-removed"
Pavel Šimerda's avatar
Pavel Šimerda committed
207
208
209
210
211
212
#define NM_PLATFORM_IP4_ADDRESS_ADDED "ip4-address-added"
#define NM_PLATFORM_IP4_ADDRESS_CHANGED "ip4-address-changed"
#define NM_PLATFORM_IP4_ADDRESS_REMOVED "ip4-address-removed"
#define NM_PLATFORM_IP6_ADDRESS_ADDED "ip6-address-added"
#define NM_PLATFORM_IP6_ADDRESS_CHANGED "ip6-address-changed"
#define NM_PLATFORM_IP6_ADDRESS_REMOVED "ip6-address-removed"
Pavel Šimerda's avatar
Pavel Šimerda committed
213
214
215
216
217
218
#define NM_PLATFORM_IP4_ROUTE_ADDED "ip4-route-added"
#define NM_PLATFORM_IP4_ROUTE_CHANGED "ip4-route-changed"
#define NM_PLATFORM_IP4_ROUTE_REMOVED "ip4-route-removed"
#define NM_PLATFORM_IP6_ROUTE_ADDED "ip6-route-added"
#define NM_PLATFORM_IP6_ROUTE_CHANGED "ip6-route-changed"
#define NM_PLATFORM_IP6_ROUTE_REMOVED "ip6-route-removed"
Pavel Šimerda's avatar
Pavel Šimerda committed
219
220
221
222
223
224
225
226
227
228
229

/******************************************************************/

GType nm_platform_get_type (void);

void nm_platform_setup (GType type);
NMPlatform *nm_platform_get (void);
void nm_platform_free (void);

/******************************************************************/

230
231
void nm_platform_set_error (NMPlatformError error);
NMPlatformError nm_platform_get_error (void);
Pavel Šimerda's avatar
Pavel Šimerda committed
232
233
const char *nm_platform_get_error_msg (void);

234
235
236
gboolean nm_platform_sysctl_set (const char *path, const char *value);
char *nm_platform_sysctl_get (const char *path);

Pavel Šimerda's avatar
Pavel Šimerda committed
237
238
GArray *nm_platform_link_get_all (void);
gboolean nm_platform_dummy_add (const char *name);
239
240
241
gboolean nm_platform_bridge_add (const char *name);
gboolean nm_platform_bond_add (const char *name);
gboolean nm_platform_team_add (const char *name);
Pavel Šimerda's avatar
Pavel Šimerda committed
242
243
244
245
246
247
248
gboolean nm_platform_link_exists (const char *name);
gboolean nm_platform_link_delete (int ifindex);
gboolean nm_platform_link_delete_by_name (const char *ifindex);
int nm_platform_link_get_ifindex (const char *name);
const char *nm_platform_link_get_name (int ifindex);
NMLinkType nm_platform_link_get_type (int ifindex);

249
250
251
252
253
254
255
256
gboolean nm_platform_link_set_up (int ifindex);
gboolean nm_platform_link_set_down (int ifindex);
gboolean nm_platform_link_set_arp (int ifindex);
gboolean nm_platform_link_set_noarp (int ifindex);
gboolean nm_platform_link_is_up (int ifindex);
gboolean nm_platform_link_is_connected (int ifindex);
gboolean nm_platform_link_uses_arp (int ifindex);

257
258
259
gboolean nm_platform_link_supports_carrier_detect (int ifindex);
gboolean nm_platform_link_supports_vlans (int ifindex);

260
261
262
gboolean nm_platform_link_enslave (int master, int slave);
gboolean nm_platform_link_release (int master, int slave);
int nm_platform_link_get_master (int slave);
263
264
265
266
gboolean nm_platform_master_set_option (int ifindex, const char *option, const char *value);
char *nm_platform_master_get_option (int ifindex, const char *option);
gboolean nm_platform_slave_set_option (int ifindex, const char *option, const char *value);
char *nm_platform_slave_get_option (int ifindex, const char *option);
267

Pavel Šimerda's avatar
Pavel Šimerda committed
268
269
270
271
272
273
274
275
276
GArray *nm_platform_ip4_address_get_all (int ifindex);
GArray *nm_platform_ip6_address_get_all (int ifindex);
gboolean nm_platform_ip4_address_add (int ifindex, in_addr_t address, int plen);
gboolean nm_platform_ip6_address_add (int ifindex, struct in6_addr address, int plen);
gboolean nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen);
gboolean nm_platform_ip6_address_delete (int ifindex, struct in6_addr address, int plen);
gboolean nm_platform_ip4_address_exists (int ifindex, in_addr_t address, int plen);
gboolean nm_platform_ip6_address_exists (int ifindex, struct in6_addr address, int plen);

Pavel Šimerda's avatar
Pavel Šimerda committed
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
GArray *nm_platform_ip4_route_get_all (int ifindex);
GArray *nm_platform_ip6_route_get_all (int ifindex);
gboolean nm_platform_route_set_metric (int ifindex, int metric);
gboolean nm_platform_ip4_route_add (int ifindex,
		in_addr_t network, int plen, in_addr_t gateway, int metric, int mss);
gboolean nm_platform_ip6_route_add (int ifindex,
		struct in6_addr network, int plen, struct in6_addr gateway, int metric, int mss);
gboolean nm_platform_ip4_route_delete (int ifindex,
		in_addr_t network, int plen, in_addr_t gateway, int metric);
gboolean nm_platform_ip6_route_delete (int ifindex,
		struct in6_addr network, int plen, struct in6_addr gateway, int metric);
gboolean nm_platform_ip4_route_exists (int ifindex,
		in_addr_t network, int plen, in_addr_t gateway, int metric);
gboolean nm_platform_ip6_route_exists (int ifindex,
		struct in6_addr network, int plen, struct in6_addr gateway, int metric);

293
294
295
296
297
298
299
300
301
302
303
304
#define auto_g_free __attribute__((cleanup(put_g_free)))
static void __attribute__((unused))
put_g_free (void *ptr)
{
	gpointer *object = ptr;

	if (object && *object) {
		g_free (*object);
		*object = NULL;
	}
}

Pavel Šimerda's avatar
Pavel Šimerda committed
305
#endif /* NM_PLATFORM_H */