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