chiark / gitweb /
machine: make sure unpriviliged "machinectl status" can show the machine's OS version
[elogind.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-rtnl.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
36 #include "rtnl-util.h"
37 #include "hashmap.h"
38 #include "list.h"
39 #include "set.h"
40 #include "condition-util.h"
41 #include "in-addr-util.h"
42
43 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
44 #define DHCP_ROUTE_METRIC 1024
45 #define IPV4LL_ROUTE_METRIC 2048
46
47 typedef struct NetDev NetDev;
48 typedef struct Network Network;
49 typedef struct Link Link;
50 typedef struct Address Address;
51 typedef struct Route Route;
52 typedef struct Manager Manager;
53 typedef struct AddressPool AddressPool;
54
55 typedef enum DHCPSupport {
56         DHCP_SUPPORT_NONE,
57         DHCP_SUPPORT_BOTH,
58         DHCP_SUPPORT_V4,
59         DHCP_SUPPORT_V6,
60         _DHCP_SUPPORT_MAX,
61         _DHCP_SUPPORT_INVALID = -1,
62 } DHCPSupport;
63
64 typedef enum LLMNRSupport {
65         LLMNR_SUPPORT_NO,
66         LLMNR_SUPPORT_YES,
67         LLMNR_SUPPORT_RESOLVE,
68         _LLMNR_SUPPORT_MAX,
69         _LLMNR_SUPPORT_INVALID = -1,
70 } LLMNRSupport;
71
72 struct Network {
73         Manager *manager;
74
75         char *filename;
76
77         struct ether_addr *match_mac;
78         char *match_path;
79         char *match_driver;
80         char *match_type;
81         char *match_name;
82         char *dhcp_vendor_class_identifier;
83
84         Condition *match_host;
85         Condition *match_virt;
86         Condition *match_kernel;
87         Condition *match_arch;
88
89         char *description;
90         NetDev *bridge;
91         NetDev *bond;
92         Hashmap *stacked_netdevs;
93         DHCPSupport dhcp;
94         bool dhcp_dns;
95         bool dhcp_ntp;
96         bool dhcp_mtu;
97         bool dhcp_hostname;
98         bool dhcp_domainname;
99         bool dhcp_sendhost;
100         bool dhcp_broadcast;
101         bool dhcp_critical;
102         bool dhcp_routes;
103         bool ipv4ll;
104         bool ipv4ll_route;
105
106         bool dhcp_server;
107
108         LIST_HEAD(Address, static_addresses);
109         LIST_HEAD(Route, static_routes);
110
111         Hashmap *addresses_by_section;
112         Hashmap *routes_by_section;
113
114         char **dns, **ntp;
115
116         LLMNRSupport llmnr;
117
118         LIST_FIELDS(Network, networks);
119 };
120
121 struct Address {
122         Network *network;
123         unsigned section;
124
125         int family;
126         unsigned char prefixlen;
127         unsigned char scope;
128         char *label;
129
130         struct in_addr broadcast;
131         struct ifa_cacheinfo cinfo;
132
133         union in_addr_union in_addr;
134         union in_addr_union in_addr_peer;
135
136         LIST_FIELDS(Address, addresses);
137 };
138
139 struct Route {
140         Network *network;
141         unsigned section;
142
143         int family;
144         unsigned char dst_prefixlen;
145         unsigned char scope;
146         uint32_t metrics;
147         unsigned char protocol;  /* RTPROT_* */
148
149         union in_addr_union in_addr;
150         union in_addr_union dst_addr;
151
152         LIST_FIELDS(Route, routes);
153 };
154
155 typedef enum LinkState {
156         LINK_STATE_INITIALIZING,
157         LINK_STATE_ENSLAVING,
158         LINK_STATE_SETTING_ADDRESSES,
159         LINK_STATE_SETTING_ROUTES,
160         LINK_STATE_CONFIGURED,
161         LINK_STATE_UNMANAGED,
162         LINK_STATE_FAILED,
163         LINK_STATE_LINGER,
164         _LINK_STATE_MAX,
165         _LINK_STATE_INVALID = -1
166 } LinkState;
167
168 typedef enum LinkOperationalState {
169         LINK_OPERSTATE_UNKNOWN,
170         LINK_OPERSTATE_DORMANT,
171         LINK_OPERSTATE_CARRIER,
172         LINK_OPERSTATE_DEGRADED,
173         LINK_OPERSTATE_ROUTABLE,
174         _LINK_OPERSTATE_MAX,
175         _LINK_OPERSTATE_INVALID = -1
176 } LinkOperationalState;
177
178 struct Link {
179         Manager *manager;
180
181         int n_ref;
182
183         int ifindex;
184         char *ifname;
185         char *state_file;
186         struct ether_addr mac;
187         uint32_t mtu;
188         struct udev_device *udev_device;
189
190         unsigned flags;
191         uint8_t kernel_operstate;
192
193         Network *network;
194
195         LinkState state;
196         LinkOperationalState operstate;
197
198         unsigned addr_messages;
199         unsigned route_messages;
200         unsigned enslaving;
201
202         LIST_HEAD(Address, addresses);
203
204         sd_dhcp_client *dhcp_client;
205         sd_dhcp_lease *dhcp_lease;
206         char *lease_file;
207         uint16_t original_mtu;
208         sd_ipv4ll *ipv4ll;
209
210         LIST_HEAD(Address, pool_addresses);
211
212         sd_dhcp_server *dhcp_server;
213
214         sd_icmp6_nd *icmp6_router_discovery;
215         sd_dhcp6_client *dhcp6_client;
216 };
217
218 struct AddressPool {
219         Manager *manager;
220
221         int family;
222         unsigned prefixlen;
223
224         union in_addr_union in_addr;
225
226         LIST_FIELDS(AddressPool, address_pools);
227 };
228
229 struct Manager {
230         sd_rtnl *rtnl;
231         sd_event *event;
232         sd_bus *bus;
233         struct udev *udev;
234         struct udev_monitor *udev_monitor;
235         sd_event_source *udev_event_source;
236         sd_event_source *sigterm_event_source;
237         sd_event_source *sigint_event_source;
238
239         char *state_file;
240
241         Hashmap *links;
242         Hashmap *netdevs;
243         LIST_HEAD(Network, networks);
244         LIST_HEAD(AddressPool, address_pools);
245
246         usec_t network_dirs_ts_usec;
247 };
248
249 extern const char* const network_dirs[];
250
251 /* Manager */
252
253 int manager_new(Manager **ret);
254 void manager_free(Manager *m);
255
256 int manager_load_config(Manager *m);
257 bool manager_should_reload(Manager *m);
258
259 int manager_rtnl_enumerate_links(Manager *m);
260
261 int manager_rtnl_listen(Manager *m);
262 int manager_udev_listen(Manager *m);
263 int manager_bus_listen(Manager *m);
264
265 int manager_save(Manager *m);
266
267 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
268
269 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
270 #define _cleanup_manager_free_ _cleanup_(manager_freep)
271
272 /* Network */
273
274 int network_load(Manager *manager);
275
276 void network_free(Network *network);
277
278 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
279 #define _cleanup_network_free_ _cleanup_(network_freep)
280
281 int network_get(Manager *manager, struct udev_device *device,
282                 const char *ifname, const struct ether_addr *mac,
283                 Network **ret);
284 int network_apply(Manager *manager, Network *network, Link *link);
285
286 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
287                         const char *section, unsigned section_line, const char *lvalue,
288                         int ltype, const char *rvalue, void *data, void *userdata);
289
290 int config_parse_tunnel(const char *unit,
291                         const char *filename,
292                         unsigned line,
293                         const char *section,
294                         unsigned section_line,
295                         const char *lvalue,
296                         int ltype,
297                         const char *rvalue,
298                         void *data,
299                         void *userdata);
300
301 int config_parse_tunnel_address(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 /* gperf */
313 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
314
315 /* Route */
316 int route_new_static(Network *network, unsigned section, Route **ret);
317 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
318 void route_free(Route *route);
319 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
320 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
321
322
323 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
324 #define _cleanup_route_free_ _cleanup_(route_freep)
325
326 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
327                          const char *section, unsigned section_line, const char *lvalue,
328                          int ltype, const char *rvalue, void *data, void *userdata);
329
330 int config_parse_destination(const char *unit, const char *filename, unsigned line,
331                              const char *section, unsigned section_line, const char *lvalue,
332                              int ltype, const char *rvalue, void *data, void *userdata);
333
334 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
335                                 const char *section, unsigned section_line, const char *lvalue,
336                                 int ltype, const char *rvalue, void *data, void *userdata);
337 /* Address */
338 int address_new_static(Network *network, unsigned section, Address **ret);
339 int address_new_dynamic(Address **ret);
340 void address_free(Address *address);
341 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
342 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
343 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
344 bool address_equal(Address *a1, Address *a2);
345
346 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
347 #define _cleanup_address_free_ _cleanup_(address_freep)
348
349 int config_parse_address(const char *unit, const char *filename, unsigned line,
350                          const char *section, unsigned section_line, const char *lvalue,
351                          int ltype, const char *rvalue, void *data, void *userdata);
352
353 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
354                            const char *section, unsigned section_line, const char *lvalue,
355                            int ltype, const char *rvalue, void *data, void *userdata);
356
357 int config_parse_label(const char *unit, const char *filename, unsigned line,
358                        const char *section, unsigned section_line, const char *lvalue,
359                        int ltype, const char *rvalue, void *data, void *userdata);
360
361 /* Link */
362
363 Link *link_unref(Link *link);
364 Link *link_ref(Link *link);
365 int link_get(Manager *m, int ifindex, Link **ret);
366 int link_add(Manager *manager, sd_rtnl_message *message, Link **ret);
367 void link_drop(Link *link);
368
369 int link_update(Link *link, sd_rtnl_message *message);
370 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata);
371
372 int link_initialized(Link *link, struct udev_device *device);
373
374 int link_save(Link *link);
375
376 bool link_has_carrier(unsigned flags, uint8_t operstate);
377
378 const char* link_state_to_string(LinkState s) _const_;
379 LinkState link_state_from_string(const char *s) _pure_;
380
381 const char* link_operstate_to_string(LinkOperationalState s) _const_;
382 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
383
384 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
385 #define _cleanup_link_unref_ _cleanup_(link_unrefp)
386
387 /* DHCP support */
388
389 const char* dhcp_support_to_string(DHCPSupport i) _const_;
390 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
391
392 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
393                       const char *section, unsigned section_line, const char *lvalue,
394                       int ltype, const char *rvalue, void *data, void *userdata);
395
396 /* LLMNR support */
397
398 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
399 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
400
401 int config_parse_llmnr(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
405 /* Address Pool */
406
407 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
408 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
409 void address_pool_free(AddressPool *p);
410
411 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
412
413 /* Macros which append INTERFACE= to the message */
414
415 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
416 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
417 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
418 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
419 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
420 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
421
422 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
423
424 #define ADDRESS_FMT_VAL(address)            \
425         (address).s_addr & 0xFF,            \
426         ((address).s_addr >> 8) & 0xFF,     \
427         ((address).s_addr >> 16) & 0xFF,    \
428         (address).s_addr >> 24