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