]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd.h
Merge pull request #549 from ssahani/dhcp
[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 unsigned cost;
154
155 AddressFamilyBoolean ip_forward;
156 bool ip_masquerade;
157
158 IPv6PrivacyExtensions ipv6_privacy_extensions;
159
160 struct ether_addr *mac;
161 unsigned mtu;
162
163 bool lldp;
164
165 LIST_HEAD(Address, static_addresses);
166 LIST_HEAD(Route, static_routes);
167 LIST_HEAD(FdbEntry, static_fdb_entries);
168
169 Hashmap *addresses_by_section;
170 Hashmap *routes_by_section;
171 Hashmap *fdb_entries_by_section;
172
173 bool wildcard_domain;
174 char **domains, **dns, **ntp, **bind_carrier;
175
176 LLMNRSupport llmnr;
177
178 LIST_FIELDS(Network, networks);
179 };
180
181 struct Address {
182 Network *network;
183 unsigned section;
184
185 int family;
186 unsigned char prefixlen;
187 unsigned char scope;
188 uint32_t flags;
189 char *label;
190
191 struct in_addr broadcast;
192 struct ifa_cacheinfo cinfo;
193
194 union in_addr_union in_addr;
195 union in_addr_union in_addr_peer;
196
197 bool ip_masquerade_done;
198
199 LIST_FIELDS(Address, addresses);
200 };
201
202 struct Route {
203 Network *network;
204 unsigned section;
205
206 int family;
207 unsigned char dst_prefixlen;
208 unsigned char src_prefixlen;
209 unsigned char scope;
210 uint32_t metrics;
211 unsigned char protocol; /* RTPROT_* */
212
213 union in_addr_union in_addr;
214 union in_addr_union dst_addr;
215 union in_addr_union src_addr;
216 union in_addr_union prefsrc_addr;
217
218 LIST_FIELDS(Route, routes);
219 };
220
221 struct AddressPool {
222 Manager *manager;
223
224 int family;
225 unsigned prefixlen;
226
227 union in_addr_union in_addr;
228
229 LIST_FIELDS(AddressPool, address_pools);
230 };
231
232 struct Manager {
233 sd_netlink *rtnl;
234 sd_event *event;
235 sd_event_source *bus_retry_event_source;
236 sd_bus *bus;
237 sd_bus_slot *prepare_for_sleep_slot;
238 struct udev *udev;
239 struct udev_monitor *udev_monitor;
240 sd_event_source *udev_event_source;
241
242 bool enumerating;
243
244 char *state_file;
245 LinkOperationalState operational_state;
246
247 Hashmap *links;
248 Hashmap *netdevs;
249 Hashmap *networks_by_name;
250 LIST_HEAD(Network, networks);
251 LIST_HEAD(AddressPool, address_pools);
252
253 usec_t network_dirs_ts_usec;
254 };
255
256 extern const char* const network_dirs[];
257
258 /* Manager */
259
260 extern const sd_bus_vtable manager_vtable[];
261
262 int manager_new(Manager **ret);
263 void manager_free(Manager *m);
264
265 int manager_connect_bus(Manager *m);
266 int manager_run(Manager *m);
267
268 int manager_load_config(Manager *m);
269 bool manager_should_reload(Manager *m);
270
271 int manager_rtnl_enumerate_links(Manager *m);
272 int manager_rtnl_enumerate_addresses(Manager *m);
273
274 int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
275 int manager_save(Manager *m);
276
277 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
278
279 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
280 #define _cleanup_manager_free_ _cleanup_(manager_freep)
281
282 /* Network */
283
284 int network_load(Manager *manager);
285
286 void network_free(Network *network);
287
288 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
289 #define _cleanup_network_free_ _cleanup_(network_freep)
290
291 int network_get_by_name(Manager *manager, const char *name, Network **ret);
292 int network_get(Manager *manager, struct udev_device *device,
293 const char *ifname, const struct ether_addr *mac,
294 Network **ret);
295 int network_apply(Manager *manager, Network *network, Link *link);
296
297 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
298 const char *section, unsigned section_line, const char *lvalue,
299 int ltype, const char *rvalue, void *data, void *userdata);
300
301 int config_parse_domains(const char *unit,
302 const char *filename,
303 unsigned line,
304 const char *section,
305 unsigned section_line,
306 const char *lvalue,
307 int ltype,
308 const char *rvalue,
309 void *data,
310 void *userdata);
311
312 int config_parse_tunnel(const char *unit,
313 const char *filename,
314 unsigned line,
315 const char *section,
316 unsigned section_line,
317 const char *lvalue,
318 int ltype,
319 const char *rvalue,
320 void *data,
321 void *userdata);
322
323 extern const sd_bus_vtable network_vtable[];
324
325 int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
326 int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
327
328 /* gperf */
329 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
330
331 /* Route */
332 int route_new_static(Network *network, unsigned section, Route **ret);
333 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
334 void route_free(Route *route);
335 int route_configure(Route *route, Link *link, sd_netlink_message_handler_t callback);
336 int route_drop(Route *route, Link *link, sd_netlink_message_handler_t callback);
337
338
339 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
340 #define _cleanup_route_free_ _cleanup_(route_freep)
341
342 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
343 const char *section, unsigned section_line, const char *lvalue,
344 int ltype, const char *rvalue, void *data, void *userdata);
345
346 int config_parse_destination(const char *unit, const char *filename, unsigned line,
347 const char *section, unsigned section_line, const char *lvalue,
348 int ltype, const char *rvalue, void *data, void *userdata);
349
350 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
351 const char *section, unsigned section_line, const char *lvalue,
352 int ltype, const char *rvalue, void *data, void *userdata);
353
354 int config_parse_route_scope(const char *unit, const char *filename, unsigned line,
355 const char *section, unsigned section_line, const char *lvalue,
356 int ltype, const char *rvalue, void *data, void *userdata);
357 /* Address */
358 int address_new_static(Network *network, unsigned section, Address **ret);
359 int address_new_dynamic(Address **ret);
360 void address_free(Address *address);
361 int address_configure(Address *address, Link *link, sd_netlink_message_handler_t callback);
362 int address_update(Address *address, Link *link, sd_netlink_message_handler_t callback);
363 int address_drop(Address *address, Link *link, sd_netlink_message_handler_t callback);
364 int address_establish(Address *address, Link *link);
365 int address_release(Address *address, Link *link);
366 bool address_equal(Address *a1, Address *a2);
367
368 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
369 #define _cleanup_address_free_ _cleanup_(address_freep)
370
371 int config_parse_address(const char *unit, const char *filename, unsigned line,
372 const char *section, unsigned section_line, const char *lvalue,
373 int ltype, const char *rvalue, void *data, void *userdata);
374
375 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
376 const char *section, unsigned section_line, const char *lvalue,
377 int ltype, const char *rvalue, void *data, void *userdata);
378
379 int config_parse_label(const char *unit, const char *filename, unsigned line,
380 const char *section, unsigned section_line, const char *lvalue,
381 int ltype, const char *rvalue, void *data, void *userdata);
382
383 /* Forwarding database table. */
384 int fdb_entry_configure(Link *const link, FdbEntry *const fdb_entry);
385 void fdb_entry_free(FdbEntry *fdb_entry);
386 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
387
388 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
389 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
390
391 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
392 const char *section, unsigned section_line, const char *lvalue,
393 int ltype, const char *rvalue, void *data, void *userdata);
394
395 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
396 const char *section, unsigned section_line, const char *lvalue,
397 int ltype, const char *rvalue, void *data, void *userdata);
398
399 /* DHCP support */
400
401 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
402 const char *section, unsigned section_line, const char *lvalue,
403 int ltype, const char *rvalue, void *data, void *userdata);
404 int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line,
405 const char *section, unsigned section_line, const char *lvalue,
406 int ltype, const char *rvalue, void *data, void *userdata);
407
408 /* IPv4LL support (legacy) */
409
410 int config_parse_ipv4ll(const char *unit, const char *filename, unsigned line,
411 const char *section, unsigned section_line, const char *lvalue,
412 int ltype, const char *rvalue, void *data, void *userdata);
413
414 /* IPv6 support */
415 int config_parse_ipv6token(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 /* LLMNR support */
420
421 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
422 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
423
424 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
425 const char *section, unsigned section_line, const char *lvalue,
426 int ltype, const char *rvalue, void *data, void *userdata);
427
428 /* Address Pool */
429
430 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
431 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
432 void address_pool_free(AddressPool *p);
433
434 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
435
436 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
437 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
438
439 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);
440
441 /* IPForwarding parser */
442 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);
443
444 /* Operational State */
445
446 const char* link_operstate_to_string(LinkOperationalState s) _const_;
447 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
448
449 /* IPv6 privacy extensions support */
450
451 const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;
452 IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
453
454 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);
455
456
457 /* Hostname */
458 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);