chiark / gitweb /
networkd: don't warn about missing links unnecessarily
[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 struct FdbEntry {
76         Network *network;
77         unsigned section;
78
79         struct ether_addr *mac_addr;
80         uint16_t vlan_id;
81
82         LIST_FIELDS(FdbEntry, static_fdb_entries);
83 };
84
85 struct Network {
86         Manager *manager;
87
88         char *filename;
89
90         struct ether_addr *match_mac;
91         char *match_path;
92         char *match_driver;
93         char *match_type;
94         char *match_name;
95         char *dhcp_vendor_class_identifier;
96
97         Condition *match_host;
98         Condition *match_virt;
99         Condition *match_kernel;
100         Condition *match_arch;
101
102         char *description;
103         NetDev *bridge;
104         NetDev *bond;
105         Hashmap *stacked_netdevs;
106         AddressFamilyBoolean dhcp;
107         bool dhcp_dns;
108         bool dhcp_ntp;
109         bool dhcp_mtu;
110         bool dhcp_hostname;
111         bool dhcp_domains;
112         bool dhcp_sendhost;
113         bool dhcp_broadcast;
114         bool dhcp_critical;
115         bool dhcp_routes;
116         unsigned dhcp_route_metric;
117         bool ipv4ll;
118         bool ipv4ll_route;
119
120         bool dhcp_server;
121
122         unsigned cost;
123
124         AddressFamilyBoolean ip_forward;
125         bool ip_masquerade;
126
127         struct ether_addr *mac;
128         unsigned mtu;
129
130         bool lldp;
131
132         LIST_HEAD(Address, static_addresses);
133         LIST_HEAD(Route, static_routes);
134         LIST_HEAD(FdbEntry, static_fdb_entries);
135
136         Hashmap *addresses_by_section;
137         Hashmap *routes_by_section;
138         Hashmap *fdb_entries_by_section;
139
140         bool wildcard_domain;
141         char **domains, **dns, **ntp;
142
143         LLMNRSupport llmnr;
144
145         LIST_FIELDS(Network, networks);
146 };
147
148 struct Address {
149         Network *network;
150         unsigned section;
151
152         int family;
153         unsigned char prefixlen;
154         unsigned char scope;
155         unsigned char flags;
156         char *label;
157
158         struct in_addr broadcast;
159         struct ifa_cacheinfo cinfo;
160
161         union in_addr_union in_addr;
162         union in_addr_union in_addr_peer;
163
164         bool ip_masquerade_done;
165
166         LIST_FIELDS(Address, addresses);
167 };
168
169 struct Route {
170         Network *network;
171         unsigned section;
172
173         int family;
174         unsigned char dst_prefixlen;
175         unsigned char src_prefixlen;
176         unsigned char scope;
177         uint32_t metrics;
178         unsigned char protocol;  /* RTPROT_* */
179
180         union in_addr_union in_addr;
181         union in_addr_union dst_addr;
182         union in_addr_union src_addr;
183         union in_addr_union prefsrc_addr;
184
185         LIST_FIELDS(Route, routes);
186 };
187
188 struct AddressPool {
189         Manager *manager;
190
191         int family;
192         unsigned prefixlen;
193
194         union in_addr_union in_addr;
195
196         LIST_FIELDS(AddressPool, address_pools);
197 };
198
199 struct Manager {
200         sd_rtnl *rtnl;
201         sd_event *event;
202         sd_event_source *bus_retry_event_source;
203         sd_bus *bus;
204         sd_bus_slot *prepare_for_sleep_slot;
205         struct udev *udev;
206         struct udev_monitor *udev_monitor;
207         sd_event_source *udev_event_source;
208
209         bool enumerating;
210
211         char *state_file;
212
213         Hashmap *links;
214         Hashmap *netdevs;
215         LIST_HEAD(Network, networks);
216         LIST_HEAD(AddressPool, address_pools);
217
218         usec_t network_dirs_ts_usec;
219 };
220
221 extern const char* const network_dirs[];
222
223 /* Manager */
224
225 int manager_new(Manager **ret);
226 void manager_free(Manager *m);
227
228 int manager_load_config(Manager *m);
229 bool manager_should_reload(Manager *m);
230
231 int manager_rtnl_enumerate_links(Manager *m);
232 int manager_rtnl_enumerate_addresses(Manager *m);
233
234 int manager_save(Manager *m);
235
236 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
237
238 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
239 #define _cleanup_manager_free_ _cleanup_(manager_freep)
240
241 /* Network */
242
243 int network_load(Manager *manager);
244
245 void network_free(Network *network);
246
247 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
248 #define _cleanup_network_free_ _cleanup_(network_freep)
249
250 int network_get(Manager *manager, struct udev_device *device,
251                 const char *ifname, const struct ether_addr *mac,
252                 Network **ret);
253 int network_apply(Manager *manager, Network *network, Link *link);
254
255 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
256                         const char *section, unsigned section_line, const char *lvalue,
257                         int ltype, const char *rvalue, void *data, void *userdata);
258
259 int config_parse_domains(const char *unit,
260                          const char *filename,
261                          unsigned line,
262                          const char *section,
263                          unsigned section_line,
264                          const char *lvalue,
265                          int ltype,
266                          const char *rvalue,
267                          void *data,
268                          void *userdata);
269
270 int config_parse_tunnel(const char *unit,
271                         const char *filename,
272                         unsigned line,
273                         const char *section,
274                         unsigned section_line,
275                         const char *lvalue,
276                         int ltype,
277                         const char *rvalue,
278                         void *data,
279                         void *userdata);
280
281 int config_parse_tunnel_address(const char *unit,
282                                 const char *filename,
283                                 unsigned line,
284                                 const char *section,
285                                 unsigned section_line,
286                                 const char *lvalue,
287                                 int ltype,
288                                 const char *rvalue,
289                                 void *data,
290                                 void *userdata);
291
292 int config_parse_vxlan_group_address(const char *unit,
293                                      const char *filename,
294                                      unsigned line,
295                                      const char *section,
296                                      unsigned section_line,
297                                      const char *lvalue,
298                                      int ltype,
299                                      const char *rvalue,
300                                      void *data,
301                                      void *userdata);
302
303 /* gperf */
304 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
305
306 /* Route */
307 int route_new_static(Network *network, unsigned section, Route **ret);
308 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
309 void route_free(Route *route);
310 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
311 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
312
313
314 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
315 #define _cleanup_route_free_ _cleanup_(route_freep)
316
317 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
318                          const char *section, unsigned section_line, const char *lvalue,
319                          int ltype, const char *rvalue, void *data, void *userdata);
320
321 int config_parse_destination(const char *unit, const char *filename, unsigned line,
322                              const char *section, unsigned section_line, const char *lvalue,
323                              int ltype, const char *rvalue, void *data, void *userdata);
324
325 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
326                                 const char *section, unsigned section_line, const char *lvalue,
327                                 int ltype, const char *rvalue, void *data, void *userdata);
328 /* Address */
329 int address_new_static(Network *network, unsigned section, Address **ret);
330 int address_new_dynamic(Address **ret);
331 void address_free(Address *address);
332 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
333 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
334 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
335 int address_establish(Address *address, Link *link);
336 int address_release(Address *address, Link *link);
337 bool address_equal(Address *a1, Address *a2);
338
339 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
340 #define _cleanup_address_free_ _cleanup_(address_freep)
341
342 int config_parse_address(const char *unit, const char *filename, unsigned line,
343                          const char *section, unsigned section_line, const char *lvalue,
344                          int ltype, const char *rvalue, void *data, void *userdata);
345
346 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
347                            const char *section, unsigned section_line, const char *lvalue,
348                            int ltype, const char *rvalue, void *data, void *userdata);
349
350 int config_parse_label(const char *unit, const char *filename, unsigned line,
351                        const char *section, unsigned section_line, const char *lvalue,
352                        int ltype, const char *rvalue, void *data, void *userdata);
353
354 /* Forwarding database table. */
355 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
356 void fdb_entry_free(FdbEntry *fdb_entry);
357 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
358
359 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
360 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
361
362 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
363                             const char *section, unsigned section_line, const char *lvalue,
364                             int ltype, const char *rvalue, void *data, void *userdata);
365
366 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
367                              const char *section, unsigned section_line, const char *lvalue,
368                              int ltype, const char *rvalue, void *data, void *userdata);
369
370 /* DHCP support */
371
372 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
373                       const char *section, unsigned section_line, const char *lvalue,
374                       int ltype, const char *rvalue, void *data, void *userdata);
375
376 /* LLMNR support */
377
378 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
379 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
380
381 int config_parse_llmnr(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 /* Address Pool */
386
387 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
388 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
389 void address_pool_free(AddressPool *p);
390
391 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
392
393 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
394 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
395
396 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);