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