chiark / gitweb /
networkd: dhcp add vendor class indentifier option 60
[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_enslave_callback netdev_enslave_callback;
57
58 struct netdev_enslave_callback {
59         sd_rtnl_message_handler_t callback;
60         Link *link;
61
62         LIST_FIELDS(netdev_enslave_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_enslave_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_enslave(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
391
392 const char *netdev_kind_to_string(NetDevKind d) _const_;
393 NetDevKind netdev_kind_from_string(const char *d) _pure_;
394
395 const char *macvlan_mode_to_string(MacVlanMode d) _const_;
396 MacVlanMode macvlan_mode_from_string(const char *d) _pure_;
397
398 const char *bond_mode_to_string(BondMode d) _const_;
399 BondMode bond_mode_from_string(const char *d) _pure_;
400
401 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);
402
403 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);
404
405 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);
406
407 /* gperf */
408 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
409
410 /* Network */
411
412 int network_load(Manager *manager);
413
414 void network_free(Network *network);
415
416 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
417 #define _cleanup_network_free_ _cleanup_(network_freep)
418
419 int network_get(Manager *manager, struct udev_device *device,
420                 const char *ifname, const struct ether_addr *mac,
421                 Network **ret);
422 int network_apply(Manager *manager, Network *network, Link *link);
423
424 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
425                         const char *section, unsigned section_line, const char *lvalue,
426                         int ltype, const char *rvalue, void *data, void *userdata);
427
428 int config_parse_tunnel(const char *unit,
429                         const char *filename,
430                         unsigned line,
431                         const char *section,
432                         unsigned section_line,
433                         const char *lvalue,
434                         int ltype,
435                         const char *rvalue,
436                         void *data,
437                         void *userdata);
438
439 int config_parse_tunnel_address(const char *unit,
440                                 const char *filename,
441                                 unsigned line,
442                                 const char *section,
443                                 unsigned section_line,
444                                 const char *lvalue,
445                                 int ltype,
446                                 const char *rvalue,
447                                 void *data,
448                                 void *userdata);
449
450 /* gperf */
451 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
452
453 /* Route */
454 int route_new_static(Network *network, unsigned section, Route **ret);
455 int route_new_dynamic(Route **ret);
456 void route_free(Route *route);
457 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
458 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
459
460
461 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
462 #define _cleanup_route_free_ _cleanup_(route_freep)
463
464 int config_parse_gateway(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_destination(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_route_priority(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 /* Address */
476 int address_new_static(Network *network, unsigned section, Address **ret);
477 int address_new_dynamic(Address **ret);
478 void address_free(Address *address);
479 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
480 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
481 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
482 bool address_equal(Address *a1, Address *a2);
483
484 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
485 #define _cleanup_address_free_ _cleanup_(address_freep)
486
487 int config_parse_dns(const char *unit, const char *filename, unsigned line,
488                      const char *section, unsigned section_line, const char *lvalue,
489                      int ltype, const char *rvalue, void *data, void *userdata);
490
491 int config_parse_address(const char *unit, const char *filename, unsigned line,
492                          const char *section, unsigned section_line, const char *lvalue,
493                          int ltype, const char *rvalue, void *data, void *userdata);
494
495 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
496                            const char *section, unsigned section_line, const char *lvalue,
497                            int ltype, const char *rvalue, void *data, void *userdata);
498
499 int config_parse_label(const char *unit, const char *filename, unsigned line,
500                        const char *section, unsigned section_line, const char *lvalue,
501                        int ltype, const char *rvalue, void *data, void *userdata);
502
503 /* Link */
504
505 Link *link_unref(Link *link);
506 Link *link_ref(Link *link);
507 int link_get(Manager *m, int ifindex, Link **ret);
508 int link_add(Manager *manager, sd_rtnl_message *message, Link **ret);
509 void link_drop(Link *link);
510
511 int link_update(Link *link, sd_rtnl_message *message);
512 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata);
513
514 int link_initialized(Link *link, struct udev_device *device);
515
516 int link_save(Link *link);
517
518 bool link_has_carrier(unsigned flags, uint8_t operstate);
519
520 const char* link_state_to_string(LinkState s) _const_;
521 LinkState link_state_from_string(const char *s) _pure_;
522
523 const char* link_operstate_to_string(LinkOperationalState s) _const_;
524 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
525
526 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
527 #define _cleanup_link_unref_ _cleanup_(link_unrefp)
528
529 /* DHCP support */
530
531 const char* dhcp_support_to_string(DHCPSupport i) _const_;
532 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
533
534 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
535                       const char *section, unsigned section_line, const char *lvalue,
536                       int ltype, const char *rvalue, void *data, void *userdata);
537
538 /* Address Pool */
539
540 int address_pool_new(Manager *m, AddressPool **ret, unsigned family, const union in_addr_union *u, unsigned prefixlen);
541 int address_pool_new_from_string(Manager *m, AddressPool **ret, unsigned family, const char *p, unsigned prefixlen);
542 void address_pool_free(AddressPool *p);
543
544 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
545
546 /* Macros which append INTERFACE= to the message */
547
548 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
549 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
550 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
551 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
552 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
553 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
554
555 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
556
557 /* More macros which append INTERFACE= to the message */
558
559 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__)
560 #define log_debug_netdev(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
561 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
562 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
563 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
564 #define log_error_netdev(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
565
566 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
567
568 #define NETDEV(netdev) "INTERFACE=%s", netdev->ifname
569 #define ADDRESS_FMT_VAL(address)            \
570         (address).s_addr & 0xFF,            \
571         ((address).s_addr >> 8) & 0xFF,     \
572         ((address).s_addr >> 16) & 0xFF,    \
573         (address).s_addr >> 24