chiark / gitweb /
networkd: Make DHCP client ID creation configurable
[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 #include "sd-lldp.h"
36
37 #include "rtnl-util.h"
38 #include "hashmap.h"
39 #include "list.h"
40 #include "set.h"
41 #include "condition.h"
42 #include "in-addr-util.h"
43
44 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
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 typedef struct FdbEntry FdbEntry;
56
57 typedef enum AddressFamilyBoolean {
58         /* This is a bitmask, though it usually doesn't feel that way! */
59         ADDRESS_FAMILY_NO = 0,
60         ADDRESS_FAMILY_IPV4 = 1,
61         ADDRESS_FAMILY_IPV6 = 2,
62         ADDRESS_FAMILY_YES = 3,
63         _ADDRESS_FAMILY_BOOLEAN_MAX,
64         _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
65 } AddressFamilyBoolean;
66
67 typedef enum LLMNRSupport {
68         LLMNR_SUPPORT_NO,
69         LLMNR_SUPPORT_YES,
70         LLMNR_SUPPORT_RESOLVE,
71         _LLMNR_SUPPORT_MAX,
72         _LLMNR_SUPPORT_INVALID = -1,
73 } LLMNRSupport;
74
75 typedef enum LinkOperationalState {
76         LINK_OPERSTATE_OFF,
77         LINK_OPERSTATE_NO_CARRIER,
78         LINK_OPERSTATE_DORMANT,
79         LINK_OPERSTATE_CARRIER,
80         LINK_OPERSTATE_DEGRADED,
81         LINK_OPERSTATE_ROUTABLE,
82         _LINK_OPERSTATE_MAX,
83         _LINK_OPERSTATE_INVALID = -1
84 } LinkOperationalState;
85
86 typedef enum DCHPClientIdentifier {
87         DHCP_CLIENT_ID_MAC,
88         DHCP_CLIENT_ID_DUID,
89         _DHCP_CLIENT_ID_MAX,
90         _DHCP_CLIENT_ID_INVALID = -1,
91 } DCHPClientIdentifier;
92
93 struct FdbEntry {
94         Network *network;
95         unsigned section;
96
97         struct ether_addr *mac_addr;
98         uint16_t vlan_id;
99
100         LIST_FIELDS(FdbEntry, static_fdb_entries);
101 };
102
103 struct Network {
104         Manager *manager;
105
106         char *filename;
107         char *name;
108
109         struct ether_addr *match_mac;
110         char **match_path;
111         char **match_driver;
112         char **match_type;
113         char **match_name;
114
115         Condition *match_host;
116         Condition *match_virt;
117         Condition *match_kernel;
118         Condition *match_arch;
119
120         char *description;
121         NetDev *bridge;
122         NetDev *bond;
123         Hashmap *stacked_netdevs;
124         AddressFamilyBoolean dhcp;
125         DCHPClientIdentifier dhcp_client_identifier;
126         char *dhcp_vendor_class_identifier;
127         bool dhcp_dns;
128         bool dhcp_ntp;
129         bool dhcp_mtu;
130         bool dhcp_hostname;
131         bool dhcp_domains;
132         bool dhcp_sendhost;
133         bool dhcp_broadcast;
134         bool dhcp_critical;
135         bool dhcp_routes;
136         unsigned dhcp_route_metric;
137         AddressFamilyBoolean link_local;
138         bool ipv4ll_route;
139         union in_addr_union ipv6_token;
140
141         bool dhcp_server;
142
143         unsigned cost;
144
145         AddressFamilyBoolean ip_forward;
146         bool ip_masquerade;
147
148         struct ether_addr *mac;
149         unsigned mtu;
150
151         bool lldp;
152
153         LIST_HEAD(Address, static_addresses);
154         LIST_HEAD(Route, static_routes);
155         LIST_HEAD(FdbEntry, static_fdb_entries);
156
157         Hashmap *addresses_by_section;
158         Hashmap *routes_by_section;
159         Hashmap *fdb_entries_by_section;
160
161         bool wildcard_domain;
162         char **domains, **dns, **ntp, **bind_carrier;
163
164         LLMNRSupport llmnr;
165
166         LIST_FIELDS(Network, networks);
167 };
168
169 struct Address {
170         Network *network;
171         unsigned section;
172
173         int family;
174         unsigned char prefixlen;
175         unsigned char scope;
176         unsigned char flags;
177         char *label;
178
179         struct in_addr broadcast;
180         struct ifa_cacheinfo cinfo;
181
182         union in_addr_union in_addr;
183         union in_addr_union in_addr_peer;
184
185         bool ip_masquerade_done;
186
187         LIST_FIELDS(Address, addresses);
188 };
189
190 struct Route {
191         Network *network;
192         unsigned section;
193
194         int family;
195         unsigned char dst_prefixlen;
196         unsigned char src_prefixlen;
197         unsigned char scope;
198         uint32_t metrics;
199         unsigned char protocol;  /* RTPROT_* */
200
201         union in_addr_union in_addr;
202         union in_addr_union dst_addr;
203         union in_addr_union src_addr;
204         union in_addr_union prefsrc_addr;
205
206         LIST_FIELDS(Route, routes);
207 };
208
209 struct AddressPool {
210         Manager *manager;
211
212         int family;
213         unsigned prefixlen;
214
215         union in_addr_union in_addr;
216
217         LIST_FIELDS(AddressPool, address_pools);
218 };
219
220 struct Manager {
221         sd_rtnl *rtnl;
222         sd_event *event;
223         sd_event_source *bus_retry_event_source;
224         sd_bus *bus;
225         sd_bus_slot *prepare_for_sleep_slot;
226         struct udev *udev;
227         struct udev_monitor *udev_monitor;
228         sd_event_source *udev_event_source;
229
230         bool enumerating;
231
232         char *state_file;
233         LinkOperationalState operational_state;
234
235         Hashmap *links;
236         Hashmap *netdevs;
237         Hashmap *networks_by_name;
238         LIST_HEAD(Network, networks);
239         LIST_HEAD(AddressPool, address_pools);
240
241         usec_t network_dirs_ts_usec;
242 };
243
244 extern const char* const network_dirs[];
245
246 /* Manager */
247
248 extern const sd_bus_vtable manager_vtable[];
249
250 int manager_new(Manager **ret);
251 void manager_free(Manager *m);
252
253 int manager_connect_bus(Manager *m);
254 int manager_run(Manager *m);
255
256 int manager_load_config(Manager *m);
257 bool manager_should_reload(Manager *m);
258
259 int manager_rtnl_enumerate_links(Manager *m);
260 int manager_rtnl_enumerate_addresses(Manager *m);
261
262 int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
263 int manager_save(Manager *m);
264
265 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
266
267 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
268 #define _cleanup_manager_free_ _cleanup_(manager_freep)
269
270 /* Network */
271
272 int network_load(Manager *manager);
273
274 void network_free(Network *network);
275
276 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
277 #define _cleanup_network_free_ _cleanup_(network_freep)
278
279 int network_get_by_name(Manager *manager, const char *name, Network **ret);
280 int network_get(Manager *manager, struct udev_device *device,
281                 const char *ifname, const struct ether_addr *mac,
282                 Network **ret);
283 int network_apply(Manager *manager, Network *network, Link *link);
284
285 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
286                         const char *section, unsigned section_line, const char *lvalue,
287                         int ltype, const char *rvalue, void *data, void *userdata);
288
289 int config_parse_domains(const char *unit,
290                          const char *filename,
291                          unsigned line,
292                          const char *section,
293                          unsigned section_line,
294                          const char *lvalue,
295                          int ltype,
296                          const char *rvalue,
297                          void *data,
298                          void *userdata);
299
300 int config_parse_tunnel(const char *unit,
301                         const char *filename,
302                         unsigned line,
303                         const char *section,
304                         unsigned section_line,
305                         const char *lvalue,
306                         int ltype,
307                         const char *rvalue,
308                         void *data,
309                         void *userdata);
310
311 int config_parse_tunnel_address(const char *unit,
312                                 const char *filename,
313                                 unsigned line,
314                                 const char *section,
315                                 unsigned section_line,
316                                 const char *lvalue,
317                                 int ltype,
318                                 const char *rvalue,
319                                 void *data,
320                                 void *userdata);
321
322 int config_parse_vxlan_group_address(const char *unit,
323                                      const char *filename,
324                                      unsigned line,
325                                      const char *section,
326                                      unsigned section_line,
327                                      const char *lvalue,
328                                      int ltype,
329                                      const char *rvalue,
330                                      void *data,
331                                      void *userdata);
332
333 extern const sd_bus_vtable network_vtable[];
334
335 int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
336 int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
337
338 /* gperf */
339 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
340
341 /* Route */
342 int route_new_static(Network *network, unsigned section, Route **ret);
343 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
344 void route_free(Route *route);
345 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
346 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
347
348
349 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
350 #define _cleanup_route_free_ _cleanup_(route_freep)
351
352 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
353                          const char *section, unsigned section_line, const char *lvalue,
354                          int ltype, const char *rvalue, void *data, void *userdata);
355
356 int config_parse_destination(const char *unit, const char *filename, unsigned line,
357                              const char *section, unsigned section_line, const char *lvalue,
358                              int ltype, const char *rvalue, void *data, void *userdata);
359
360 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
361                                 const char *section, unsigned section_line, const char *lvalue,
362                                 int ltype, const char *rvalue, void *data, void *userdata);
363
364 int config_parse_route_scope(const char *unit, const char *filename, unsigned line,
365                              const char *section, unsigned section_line, const char *lvalue,
366                              int ltype, const char *rvalue, void *data, void *userdata);
367 /* Address */
368 int address_new_static(Network *network, unsigned section, Address **ret);
369 int address_new_dynamic(Address **ret);
370 void address_free(Address *address);
371 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
372 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
373 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
374 int address_establish(Address *address, Link *link);
375 int address_release(Address *address, Link *link);
376 bool address_equal(Address *a1, Address *a2);
377
378 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
379 #define _cleanup_address_free_ _cleanup_(address_freep)
380
381 int config_parse_address(const char *unit, const char *filename, unsigned line,
382                          const char *section, unsigned section_line, const char *lvalue,
383                          int ltype, const char *rvalue, void *data, void *userdata);
384
385 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
386                            const char *section, unsigned section_line, const char *lvalue,
387                            int ltype, const char *rvalue, void *data, void *userdata);
388
389 int config_parse_label(const char *unit, const char *filename, unsigned line,
390                        const char *section, unsigned section_line, const char *lvalue,
391                        int ltype, const char *rvalue, void *data, void *userdata);
392
393 /* Forwarding database table. */
394 int fdb_entry_configure(Link *const link, FdbEntry *const fdb_entry);
395 void fdb_entry_free(FdbEntry *fdb_entry);
396 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
397
398 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
399 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
400
401 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
402                             const char *section, unsigned section_line, const char *lvalue,
403                             int ltype, const char *rvalue, void *data, void *userdata);
404
405 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
406                              const char *section, unsigned section_line, const char *lvalue,
407                              int ltype, const char *rvalue, void *data, void *userdata);
408
409 /* DHCP support */
410
411 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
412                       const char *section, unsigned section_line, const char *lvalue,
413                       int ltype, const char *rvalue, void *data, void *userdata);
414 int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line,
415                                         const char *section, unsigned section_line, const char *lvalue,
416                                         int ltype, const char *rvalue, void *data, void *userdata);
417
418 /* IPv4LL support (legacy) */
419
420 int config_parse_ipv4ll(const char *unit, const char *filename, unsigned line,
421                         const char *section, unsigned section_line, const char *lvalue,
422                         int ltype, const char *rvalue, void *data, void *userdata);
423
424 /* IPv6 support */
425 int config_parse_ipv6token(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 /* LLMNR support */
430
431 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
432 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
433
434 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
435                       const char *section, unsigned section_line, const char *lvalue,
436                       int ltype, const char *rvalue, void *data, void *userdata);
437
438 /* Address Pool */
439
440 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
441 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
442 void address_pool_free(AddressPool *p);
443
444 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
445
446 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
447 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
448
449 int config_parse_address_family_boolean(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);
450
451 /* Opeartional State */
452
453 const char* link_operstate_to_string(LinkOperationalState s) _const_;
454 LinkOperationalState link_operstate_from_string(const char *s) _pure_;