chiark / gitweb /
e0232af1e55f6e20393a22145b123c08d6dbc672
[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 "socket-util.h"
42
43 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
44 #define VXLAN_VID_MAX (1u << 24) - 1
45 #define DHCP_STATIC_ROUTE_METRIC 1024
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 struct netdev_enslave_callback netdev_enslave_callback;
56
57 struct netdev_enslave_callback {
58         sd_rtnl_message_handler_t callback;
59         Link *link;
60
61         LIST_FIELDS(netdev_enslave_callback, callbacks);
62 };
63
64 typedef enum MacVlanMode {
65         NETDEV_MACVLAN_MODE_PRIVATE = MACVLAN_MODE_PRIVATE,
66         NETDEV_MACVLAN_MODE_VEPA = MACVLAN_MODE_VEPA,
67         NETDEV_MACVLAN_MODE_BRIDGE = MACVLAN_MODE_BRIDGE,
68         NETDEV_MACVLAN_MODE_PASSTHRU = MACVLAN_MODE_PASSTHRU,
69         _NETDEV_MACVLAN_MODE_MAX,
70         _NETDEV_MACVLAN_MODE_INVALID = -1
71 } MacVlanMode;
72
73 typedef enum NetDevKind {
74         NETDEV_KIND_BRIDGE,
75         NETDEV_KIND_BOND,
76         NETDEV_KIND_VLAN,
77         NETDEV_KIND_MACVLAN,
78         NETDEV_KIND_VXLAN,
79         NETDEV_KIND_IPIP,
80         NETDEV_KIND_GRE,
81         NETDEV_KIND_SIT,
82         NETDEV_KIND_VETH,
83         NETDEV_KIND_VTI,
84         NETDEV_KIND_DUMMY,
85         _NETDEV_KIND_MAX,
86         _NETDEV_KIND_INVALID = -1
87 } NetDevKind;
88
89 typedef enum NetDevState {
90         NETDEV_STATE_FAILED,
91         NETDEV_STATE_CREATING,
92         NETDEV_STATE_READY,
93         NETDEV_STATE_LINGER,
94         _NETDEV_STATE_MAX,
95         _NETDEV_STATE_INVALID = -1,
96 } NetDevState;
97
98 struct NetDev {
99         Manager *manager;
100
101         int n_ref;
102
103         char *filename;
104
105         Condition *match_host;
106         Condition *match_virt;
107         Condition *match_kernel;
108         Condition *match_arch;
109
110         char *description;
111         char *ifname;
112         char *ifname_peer;
113         size_t mtu;
114         struct ether_addr *mac;
115         struct ether_addr *mac_peer;
116         NetDevKind kind;
117
118         uint64_t vlanid;
119         uint64_t vxlanid;
120         int32_t macvlan_mode;
121
122         int ifindex;
123         NetDevState state;
124
125         bool tunnel_pmtudisc;
126         bool learning;
127         unsigned ttl;
128         unsigned tos;
129         struct in_addr local;
130         struct in_addr remote;
131         struct in_addr group;
132
133         LIST_HEAD(netdev_enslave_callback, callbacks);
134 };
135
136 typedef enum DHCPSupport {
137         DHCP_SUPPORT_NONE,
138         DHCP_SUPPORT_BOTH,
139         DHCP_SUPPORT_V4,
140         DHCP_SUPPORT_V6,
141         _DHCP_SUPPORT_MAX,
142         _DHCP_SUPPORT_INVALID = -1,
143 } DHCPSupport;
144
145 struct Network {
146         Manager *manager;
147
148         char *filename;
149
150         struct ether_addr *match_mac;
151         char *match_path;
152         char *match_driver;
153         char *match_type;
154         char *match_name;
155         Condition *match_host;
156         Condition *match_virt;
157         Condition *match_kernel;
158         Condition *match_arch;
159
160         char *description;
161         NetDev *bridge;
162         NetDev *bond;
163         NetDev *tunnel;
164         Hashmap *vlans;
165         Hashmap *macvlans;
166         Hashmap *vxlans;
167         DHCPSupport dhcp;
168         bool dhcp_dns;
169         bool dhcp_ntp;
170         bool dhcp_mtu;
171         bool dhcp_hostname;
172         bool dhcp_domainname;
173         bool dhcp_sendhost;
174         bool dhcp_critical;
175         bool dhcp_routes;
176         bool ipv4ll;
177
178         bool dhcp_server;
179
180         LIST_HEAD(Address, static_addresses);
181         LIST_HEAD(Route, static_routes);
182
183         Hashmap *addresses_by_section;
184         Hashmap *routes_by_section;
185
186         LIST_HEAD(Address, dns);
187         LIST_HEAD(Address, ntp);
188
189         LIST_FIELDS(Network, networks);
190 };
191
192 struct Address {
193         Network *network;
194         uint64_t section;
195
196         unsigned char family;
197         unsigned char prefixlen;
198         unsigned char scope;
199         char *label;
200
201         struct in_addr broadcast;
202         struct ifa_cacheinfo cinfo;
203
204         union in_addr_union in_addr;
205
206         LIST_FIELDS(Address, addresses);
207 };
208
209 struct Route {
210         Network *network;
211         uint64_t section;
212
213         unsigned char family;
214         unsigned char dst_prefixlen;
215         unsigned char scope;
216         uint32_t metrics;
217
218         union in_addr_union in_addr;
219         union in_addr_union dst_addr;
220
221         LIST_FIELDS(Route, routes);
222 };
223
224 typedef enum LinkState {
225         LINK_STATE_INITIALIZING,
226         LINK_STATE_ENSLAVING,
227         LINK_STATE_SETTING_ADDRESSES,
228         LINK_STATE_SETTING_ROUTES,
229         LINK_STATE_CONFIGURED,
230         LINK_STATE_UNMANAGED,
231         LINK_STATE_FAILED,
232         LINK_STATE_LINGER,
233         _LINK_STATE_MAX,
234         _LINK_STATE_INVALID = -1
235 } LinkState;
236
237 typedef enum LinkOperationalState {
238         LINK_OPERSTATE_UNKNOWN,
239         LINK_OPERSTATE_DORMANT,
240         LINK_OPERSTATE_CARRIER,
241         LINK_OPERSTATE_DEGRADED,
242         LINK_OPERSTATE_ROUTABLE,
243         _LINK_OPERSTATE_MAX,
244         _LINK_OPERSTATE_INVALID = -1
245 } LinkOperationalState;
246
247 struct Link {
248         Manager *manager;
249
250         int n_ref;
251
252         uint64_t ifindex;
253         char *ifname;
254         char *state_file;
255         struct ether_addr mac;
256         struct udev_device *udev_device;
257
258         unsigned flags;
259         uint8_t kernel_operstate;
260
261         Network *network;
262
263         LinkState state;
264         LinkOperationalState operstate;
265
266         unsigned addr_messages;
267         unsigned route_messages;
268         unsigned enslaving;
269
270         LIST_HEAD(Address, addresses);
271
272         sd_dhcp_client *dhcp_client;
273         sd_dhcp_lease *dhcp_lease;
274         char *lease_file;
275         uint16_t original_mtu;
276         sd_ipv4ll *ipv4ll;
277
278         LIST_HEAD(Address, pool_addresses);
279
280         sd_dhcp_server *dhcp_server;
281
282         sd_icmp6_nd *icmp6_router_discovery;
283         sd_dhcp6_client *dhcp6_client;
284 };
285
286 struct AddressPool {
287         Manager *manager;
288
289         unsigned family;
290         unsigned prefixlen;
291
292         union in_addr_union in_addr;
293
294         LIST_FIELDS(AddressPool, address_pools);
295 };
296
297 struct Manager {
298         sd_rtnl *rtnl;
299         sd_event *event;
300         sd_bus *bus;
301         struct udev *udev;
302         struct udev_monitor *udev_monitor;
303         sd_event_source *udev_event_source;
304         sd_event_source *sigterm_event_source;
305         sd_event_source *sigint_event_source;
306
307         char *state_file;
308
309         Hashmap *links;
310         Hashmap *netdevs;
311         LIST_HEAD(Network, networks);
312         LIST_HEAD(AddressPool, address_pools);
313
314         usec_t network_dirs_ts_usec;
315 };
316
317 extern const char* const network_dirs[];
318
319 /* Manager */
320
321 int manager_new(Manager **ret);
322 void manager_free(Manager *m);
323
324 int manager_load_config(Manager *m);
325 bool manager_should_reload(Manager *m);
326
327 int manager_rtnl_enumerate_links(Manager *m);
328
329 int manager_rtnl_listen(Manager *m);
330 int manager_udev_listen(Manager *m);
331 int manager_bus_listen(Manager *m);
332
333 int manager_save(Manager *m);
334
335 int manager_address_pool_acquire(Manager *m, unsigned family, unsigned prefixlen, union in_addr_union *found);
336
337 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
338 #define _cleanup_manager_free_ _cleanup_(manager_freep)
339
340 /* NetDev */
341
342 int netdev_load(Manager *manager);
343 void netdev_drop(NetDev *netdev);
344
345 NetDev *netdev_unref(NetDev *netdev);
346 NetDev *netdev_ref(NetDev *netdev);
347
348 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
349 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
350
351 int netdev_get(Manager *manager, const char *name, NetDev **ret);
352 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
353 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
354 int netdev_create_tunnel(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
355 int netdev_create_veth(NetDev *netdev, sd_rtnl_message_handler_t callback);
356 int netdev_create_vxlan(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
357 int netdev_create_dummy(NetDev *netdev, sd_rtnl_message_handler_t callback);
358
359 const char *netdev_kind_to_string(NetDevKind d) _const_;
360 NetDevKind netdev_kind_from_string(const char *d) _pure_;
361
362 const char *macvlan_mode_to_string(MacVlanMode d) _const_;
363 MacVlanMode macvlan_mode_from_string(const char *d) _pure_;
364
365 int config_parse_netdev_kind(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);
366
367 int config_parse_macvlan_mode(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);
368
369 /* gperf */
370 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
371
372 /* Network */
373
374 int network_load(Manager *manager);
375
376 void network_free(Network *network);
377
378 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
379 #define _cleanup_network_free_ _cleanup_(network_freep)
380
381 int network_get(Manager *manager, struct udev_device *device,
382                 const char *ifname, const struct ether_addr *mac,
383                 Network **ret);
384 int network_apply(Manager *manager, Network *network, Link *link);
385
386 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
387                         const char *section, unsigned section_line, const char *lvalue,
388                         int ltype, const char *rvalue, void *data, void *userdata);
389
390 int config_parse_tunnel(const char *unit,
391                         const char *filename,
392                         unsigned line,
393                         const char *section,
394                         unsigned section_line,
395                         const char *lvalue,
396                         int ltype,
397                         const char *rvalue,
398                         void *data,
399                         void *userdata);
400
401 int config_parse_tunnel_address(const char *unit,
402                                 const char *filename,
403                                 unsigned line,
404                                 const char *section,
405                                 unsigned section_line,
406                                 const char *lvalue,
407                                 int ltype,
408                                 const char *rvalue,
409                                 void *data,
410                                 void *userdata);
411
412 /* gperf */
413 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
414
415 /* Route */
416 int route_new_static(Network *network, unsigned section, Route **ret);
417 int route_new_dynamic(Route **ret);
418 void route_free(Route *route);
419 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
420 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
421
422
423 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
424 #define _cleanup_route_free_ _cleanup_(route_freep)
425
426 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
427                          const char *section, unsigned section_line, const char *lvalue,
428                          int ltype, const char *rvalue, void *data, void *userdata);
429
430 int config_parse_destination(const char *unit, const char *filename, unsigned line,
431                              const char *section, unsigned section_line, const char *lvalue,
432                              int ltype, const char *rvalue, void *data, void *userdata);
433
434 /* Address */
435 int address_new_static(Network *network, unsigned section, Address **ret);
436 int address_new_dynamic(Address **ret);
437 void address_free(Address *address);
438 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
439 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
440 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
441 bool address_equal(Address *a1, Address *a2);
442
443 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
444 #define _cleanup_address_free_ _cleanup_(address_freep)
445
446 int config_parse_dns(const char *unit, const char *filename, unsigned line,
447                      const char *section, unsigned section_line, const char *lvalue,
448                      int ltype, const char *rvalue, void *data, void *userdata);
449
450 int config_parse_address(const char *unit, const char *filename, unsigned line,
451                          const char *section, unsigned section_line, const char *lvalue,
452                          int ltype, const char *rvalue, void *data, void *userdata);
453
454 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
455                            const char *section, unsigned section_line, const char *lvalue,
456                            int ltype, const char *rvalue, void *data, void *userdata);
457
458 int config_parse_label(const char *unit, const char *filename, unsigned line,
459                        const char *section, unsigned section_line, const char *lvalue,
460                        int ltype, const char *rvalue, void *data, void *userdata);
461
462 /* Link */
463
464 Link *link_unref(Link *link);
465 Link *link_ref(Link *link);
466 int link_get(Manager *m, int ifindex, Link **ret);
467 int link_add(Manager *manager, sd_rtnl_message *message, Link **ret);
468 void link_drop(Link *link);
469
470 int link_update(Link *link, sd_rtnl_message *message);
471 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata);
472
473 int link_initialized(Link *link, struct udev_device *device);
474
475 int link_save(Link *link);
476
477 bool link_has_carrier(unsigned flags, uint8_t operstate);
478
479 const char* link_state_to_string(LinkState s) _const_;
480 LinkState link_state_from_string(const char *s) _pure_;
481
482 const char* link_operstate_to_string(LinkOperationalState s) _const_;
483 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
484
485 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
486 #define _cleanup_link_unref_ _cleanup_(link_unrefp)
487
488 /* DHCP support */
489
490 const char* dhcp_support_to_string(DHCPSupport i) _const_;
491 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
492
493 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
494                       const char *section, unsigned section_line, const char *lvalue,
495                       int ltype, const char *rvalue, void *data, void *userdata);
496
497 /* Address Pool */
498
499 int address_pool_new(Manager *m, AddressPool **ret, unsigned family, const union in_addr_union *u, unsigned prefixlen);
500 int address_pool_new_from_string(Manager *m, AddressPool **ret, unsigned family, const char *p, unsigned prefixlen);
501 void address_pool_free(AddressPool *p);
502
503 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
504
505 /* Macros which append INTERFACE= to the message */
506
507 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
508 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
509 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
510 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
511 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
512 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
513
514 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
515
516 /* More macros which append INTERFACE= to the message */
517
518 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__)
519 #define log_debug_netdev(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
520 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
521 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
522 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
523 #define log_error_netdev(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
524
525 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
526
527 #define NETDEV(netdev) "INTERFACE=%s", netdev->ifname
528 #define ADDRESS_FMT_VAL(address)            \
529         (address).s_addr & 0xFF,            \
530         ((address).s_addr >> 8) & 0xFF,     \
531         ((address).s_addr >> 16) & 0xFF,    \
532         (address).s_addr >> 24