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