]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd.h
Merge pull request #375 from msekletar/test-install-crashers
[thirdparty/systemd.git] / src / network / networkd.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #pragma once
23
24 #include <arpa/inet.h>
25
26 #include "sd-event.h"
27 #include "sd-netlink.h"
28 #include "sd-bus.h"
29 #include "sd-dhcp-client.h"
30 #include "sd-dhcp-server.h"
31 #include "sd-ipv4ll.h"
32 #include "sd-icmp6-nd.h"
33 #include "sd-dhcp6-client.h"
34 #include "udev.h"
35 #include "sd-lldp.h"
36
37 #include "netlink-util.h"
38 #include "hashmap.h"
39 #include "list.h"
40 #include "set.h"
41 #include "condition.h"
42 #include "in-addr-util.h"
43
44 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
45 #define DHCP_ROUTE_METRIC 1024
46 #define IPV4LL_ROUTE_METRIC 2048
47
48 typedef struct NetDev NetDev;
49 typedef struct Network Network;
50 typedef struct Link Link;
51 typedef struct Address Address;
52 typedef struct Route Route;
53 typedef struct Manager Manager;
54 typedef struct AddressPool AddressPool;
55 typedef struct FdbEntry FdbEntry;
56
57 typedef enum AddressFamilyBoolean {
58 /* This is a bitmask, though it usually doesn't feel that way! */
59 ADDRESS_FAMILY_NO = 0,
60 ADDRESS_FAMILY_IPV4 = 1,
61 ADDRESS_FAMILY_IPV6 = 2,
62 ADDRESS_FAMILY_YES = 3,
63 _ADDRESS_FAMILY_BOOLEAN_MAX,
64 _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
65 } AddressFamilyBoolean;
66
67 typedef enum LLMNRSupport {
68 LLMNR_SUPPORT_NO,
69 LLMNR_SUPPORT_YES,
70 LLMNR_SUPPORT_RESOLVE,
71 _LLMNR_SUPPORT_MAX,
72 _LLMNR_SUPPORT_INVALID = -1,
73 } LLMNRSupport;
74
75 typedef enum LinkOperationalState {
76 LINK_OPERSTATE_OFF,
77 LINK_OPERSTATE_NO_CARRIER,
78 LINK_OPERSTATE_DORMANT,
79 LINK_OPERSTATE_CARRIER,
80 LINK_OPERSTATE_DEGRADED,
81 LINK_OPERSTATE_ROUTABLE,
82 _LINK_OPERSTATE_MAX,
83 _LINK_OPERSTATE_INVALID = -1
84 } LinkOperationalState;
85
86 typedef enum DCHPClientIdentifier {
87 DHCP_CLIENT_ID_MAC,
88 DHCP_CLIENT_ID_DUID,
89 _DHCP_CLIENT_ID_MAX,
90 _DHCP_CLIENT_ID_INVALID = -1,
91 } DCHPClientIdentifier;
92
93 typedef enum IPv6PrivacyExtensions {
94 /* The values map to the kernel's /proc/sys/net/ipv6/conf/xxx/use_tempaddr values */
95 IPV6_PRIVACY_EXTENSIONS_NO,
96 IPV6_PRIVACY_EXTENSIONS_PREFER_PUBLIC,
97 IPV6_PRIVACY_EXTENSIONS_YES, /* aka prefer-temporary */
98 _IPV6_PRIVACY_EXTENSIONS_MAX,
99 _IPV6_PRIVACY_EXTENSIONS_INVALID = -1,
100 } IPv6PrivacyExtensions;
101
102 struct FdbEntry {
103 Network *network;
104 unsigned section;
105
106 struct ether_addr *mac_addr;
107 uint16_t vlan_id;
108
109 LIST_FIELDS(FdbEntry, static_fdb_entries);
110 };
111
112 struct Network {
113 Manager *manager;
114
115 char *filename;
116 char *name;
117
118 struct ether_addr *match_mac;
119 char **match_path;
120 char **match_driver;
121 char **match_type;
122 char **match_name;
123
124 Condition *match_host;
125 Condition *match_virt;
126 Condition *match_kernel;
127 Condition *match_arch;
128
129 char *description;
130 NetDev *bridge;
131 NetDev *bond;
132 Hashmap *stacked_netdevs;
133 AddressFamilyBoolean dhcp;
134 DCHPClientIdentifier dhcp_client_identifier;
135 char *dhcp_vendor_class_identifier;
136 char *hostname;
137 bool dhcp_dns;
138 bool dhcp_ntp;
139 bool dhcp_mtu;
140 bool dhcp_hostname;
141 bool dhcp_domains;
142 bool dhcp_sendhost;
143 bool dhcp_broadcast;
144 bool dhcp_critical;
145 bool dhcp_routes;
146 unsigned dhcp_route_metric;
147 AddressFamilyBoolean link_local;
148 bool ipv4ll_route;
149 union in_addr_union ipv6_token;
150
151 bool dhcp_server;
152
153 bool use_bpdu;
154 bool hairpin;
155 bool fast_leave;
156 bool allow_port_to_be_root;
157 bool unicast_flood;
158 unsigned cost;
159
160 AddressFamilyBoolean ip_forward;
161 bool ip_masquerade;
162
163 IPv6PrivacyExtensions ipv6_privacy_extensions;
164
165 struct ether_addr *mac;
166 unsigned mtu;
167
168 bool lldp;
169
170 LIST_HEAD(Address, static_addresses);
171 LIST_HEAD(Route, static_routes);
172 LIST_HEAD(FdbEntry, static_fdb_entries);
173
174 Hashmap *addresses_by_section;
175 Hashmap *routes_by_section;
176 Hashmap *fdb_entries_by_section;
177
178 bool wildcard_domain;
179 char **domains, **dns, **ntp, **bind_carrier;
180
181 LLMNRSupport llmnr;
182
183 LIST_FIELDS(Network, networks);
184 };
185
186 struct Address {
187 Network *network;
188 unsigned section;
189
190 int family;
191 unsigned char prefixlen;
192 unsigned char scope;
193 uint32_t flags;
194 char *label;
195
196 struct in_addr broadcast;
197 struct ifa_cacheinfo cinfo;
198
199 union in_addr_union in_addr;
200 union in_addr_union in_addr_peer;
201
202 bool ip_masquerade_done;
203
204 LIST_FIELDS(Address, addresses);
205 };
206
207 struct Route {
208 Network *network;
209 unsigned section;
210
211 int family;
212 unsigned char dst_prefixlen;
213 unsigned char src_prefixlen;
214 unsigned char scope;
215 uint32_t metrics;
216 unsigned char protocol; /* RTPROT_* */
217
218 union in_addr_union in_addr;
219 union in_addr_union dst_addr;
220 union in_addr_union src_addr;
221 union in_addr_union prefsrc_addr;
222
223 LIST_FIELDS(Route, routes);
224 };
225
226 struct AddressPool {
227 Manager *manager;
228
229 int family;
230 unsigned prefixlen;
231
232 union in_addr_union in_addr;
233
234 LIST_FIELDS(AddressPool, address_pools);
235 };
236
237 struct Manager {
238 sd_netlink *rtnl;
239 sd_event *event;
240 sd_event_source *bus_retry_event_source;
241 sd_bus *bus;
242 sd_bus_slot *prepare_for_sleep_slot;
243 struct udev *udev;
244 struct udev_monitor *udev_monitor;
245 sd_event_source *udev_event_source;
246
247 bool enumerating;
248
249 char *state_file;
250 LinkOperationalState operational_state;
251
252 Hashmap *links;
253 Hashmap *netdevs;
254 Hashmap *networks_by_name;
255 LIST_HEAD(Network, networks);
256 LIST_HEAD(AddressPool, address_pools);
257
258 usec_t network_dirs_ts_usec;
259 };
260
261 extern const char* const network_dirs[];
262
263 /* Manager */
264
265 extern const sd_bus_vtable manager_vtable[];
266
267 int manager_new(Manager **ret);
268 void manager_free(Manager *m);
269
270 int manager_connect_bus(Manager *m);
271 int manager_run(Manager *m);
272
273 int manager_load_config(Manager *m);
274 bool manager_should_reload(Manager *m);
275
276 int manager_rtnl_enumerate_links(Manager *m);
277 int manager_rtnl_enumerate_addresses(Manager *m);
278
279 int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
280 int manager_save(Manager *m);
281
282 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
283
284 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
285 #define _cleanup_manager_free_ _cleanup_(manager_freep)
286
287 /* Network */
288
289 int network_load(Manager *manager);
290
291 void network_free(Network *network);
292
293 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
294 #define _cleanup_network_free_ _cleanup_(network_freep)
295
296 int network_get_by_name(Manager *manager, const char *name, Network **ret);
297 int network_get(Manager *manager, struct udev_device *device,
298 const char *ifname, const struct ether_addr *mac,
299 Network **ret);
300 int network_apply(Manager *manager, Network *network, Link *link);
301
302 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
303 const char *section, unsigned section_line, const char *lvalue,
304 int ltype, const char *rvalue, void *data, void *userdata);
305
306 int config_parse_domains(const char *unit,
307 const char *filename,
308 unsigned line,
309 const char *section,
310 unsigned section_line,
311 const char *lvalue,
312 int ltype,
313 const char *rvalue,
314 void *data,
315 void *userdata);
316
317 int config_parse_tunnel(const char *unit,
318 const char *filename,
319 unsigned line,
320 const char *section,
321 unsigned section_line,
322 const char *lvalue,
323 int ltype,
324 const char *rvalue,
325 void *data,
326 void *userdata);
327
328 extern const sd_bus_vtable network_vtable[];
329
330 int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
331 int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
332
333 /* gperf */
334 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
335
336 /* Route */
337 int route_new_static(Network *network, unsigned section, Route **ret);
338 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
339 void route_free(Route *route);
340 int route_configure(Route *route, Link *link, sd_netlink_message_handler_t callback);
341 int route_drop(Route *route, Link *link, sd_netlink_message_handler_t callback);
342
343
344 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
345 #define _cleanup_route_free_ _cleanup_(route_freep)
346
347 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
348 const char *section, unsigned section_line, const char *lvalue,
349 int ltype, const char *rvalue, void *data, void *userdata);
350
351 int config_parse_destination(const char *unit, const char *filename, unsigned line,
352 const char *section, unsigned section_line, const char *lvalue,
353 int ltype, const char *rvalue, void *data, void *userdata);
354
355 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
356 const char *section, unsigned section_line, const char *lvalue,
357 int ltype, const char *rvalue, void *data, void *userdata);
358
359 int config_parse_route_scope(const char *unit, const char *filename, unsigned line,
360 const char *section, unsigned section_line, const char *lvalue,
361 int ltype, const char *rvalue, void *data, void *userdata);
362 /* Address */
363 int address_new_static(Network *network, unsigned section, Address **ret);
364 int address_new_dynamic(Address **ret);
365 void address_free(Address *address);
366 int address_configure(Address *address, Link *link, sd_netlink_message_handler_t callback);
367 int address_update(Address *address, Link *link, sd_netlink_message_handler_t callback);
368 int address_drop(Address *address, Link *link, sd_netlink_message_handler_t callback);
369 int address_establish(Address *address, Link *link);
370 int address_release(Address *address, Link *link);
371 bool address_equal(Address *a1, Address *a2);
372
373 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
374 #define _cleanup_address_free_ _cleanup_(address_freep)
375
376 int config_parse_address(const char *unit, const char *filename, unsigned line,
377 const char *section, unsigned section_line, const char *lvalue,
378 int ltype, const char *rvalue, void *data, void *userdata);
379
380 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
381 const char *section, unsigned section_line, const char *lvalue,
382 int ltype, const char *rvalue, void *data, void *userdata);
383
384 int config_parse_label(const char *unit, const char *filename, unsigned line,
385 const char *section, unsigned section_line, const char *lvalue,
386 int ltype, const char *rvalue, void *data, void *userdata);
387
388 /* Forwarding database table. */
389 int fdb_entry_configure(Link *const link, FdbEntry *const fdb_entry);
390 void fdb_entry_free(FdbEntry *fdb_entry);
391 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
392
393 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
394 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
395
396 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
397 const char *section, unsigned section_line, const char *lvalue,
398 int ltype, const char *rvalue, void *data, void *userdata);
399
400 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
401 const char *section, unsigned section_line, const char *lvalue,
402 int ltype, const char *rvalue, void *data, void *userdata);
403
404 /* DHCP support */
405
406 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
407 const char *section, unsigned section_line, const char *lvalue,
408 int ltype, const char *rvalue, void *data, void *userdata);
409 int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line,
410 const char *section, unsigned section_line, const char *lvalue,
411 int ltype, const char *rvalue, void *data, void *userdata);
412
413 /* IPv4LL support (legacy) */
414
415 int config_parse_ipv4ll(const char *unit, const char *filename, unsigned line,
416 const char *section, unsigned section_line, const char *lvalue,
417 int ltype, const char *rvalue, void *data, void *userdata);
418
419 /* IPv6 support */
420 int config_parse_ipv6token(const char *unit, const char *filename, unsigned line,
421 const char *section, unsigned section_line, const char *lvalue,
422 int ltype, const char *rvalue, void *data, void *userdata);
423
424 /* LLMNR support */
425
426 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
427 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
428
429 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
430 const char *section, unsigned section_line, const char *lvalue,
431 int ltype, const char *rvalue, void *data, void *userdata);
432
433 /* Address Pool */
434
435 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
436 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
437 void address_pool_free(AddressPool *p);
438
439 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
440
441 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
442 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
443
444 int config_parse_address_family_boolean(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
445
446 /* IPForwarding parser */
447 int config_parse_address_family_boolean_with_kernel(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
448
449 /* Operational State */
450
451 const char* link_operstate_to_string(LinkOperationalState s) _const_;
452 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
453
454 /* IPv6 privacy extensions support */
455
456 const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;
457 IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
458
459 int config_parse_ipv6_privacy_extensions(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
460
461
462 /* Hostname */
463 int config_parse_hostname(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);