chiark / gitweb /
a4ac8e3503ab1f71f293d97859fda68ad93bcf48
[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         char *state_file;
210
211         Hashmap *links;
212         Hashmap *netdevs;
213         LIST_HEAD(Network, networks);
214         LIST_HEAD(AddressPool, address_pools);
215
216         usec_t network_dirs_ts_usec;
217 };
218
219 extern const char* const network_dirs[];
220
221 /* Manager */
222
223 int manager_new(Manager **ret);
224 void manager_free(Manager *m);
225
226 int manager_load_config(Manager *m);
227 bool manager_should_reload(Manager *m);
228
229 int manager_rtnl_enumerate_links(Manager *m);
230 int manager_rtnl_enumerate_addresses(Manager *m);
231
232 int manager_rtnl_listen(Manager *m);
233 int manager_udev_listen(Manager *m);
234 int manager_bus_listen(Manager *m);
235
236 int manager_save(Manager *m);
237
238 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
239
240 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
241 #define _cleanup_manager_free_ _cleanup_(manager_freep)
242
243 /* Network */
244
245 int network_load(Manager *manager);
246
247 void network_free(Network *network);
248
249 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
250 #define _cleanup_network_free_ _cleanup_(network_freep)
251
252 int network_get(Manager *manager, struct udev_device *device,
253                 const char *ifname, const struct ether_addr *mac,
254                 Network **ret);
255 int network_apply(Manager *manager, Network *network, Link *link);
256
257 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
258                         const char *section, unsigned section_line, const char *lvalue,
259                         int ltype, const char *rvalue, void *data, void *userdata);
260
261 int config_parse_domains(const char *unit,
262                          const char *filename,
263                          unsigned line,
264                          const char *section,
265                          unsigned section_line,
266                          const char *lvalue,
267                          int ltype,
268                          const char *rvalue,
269                          void *data,
270                          void *userdata);
271
272 int config_parse_tunnel(const char *unit,
273                         const char *filename,
274                         unsigned line,
275                         const char *section,
276                         unsigned section_line,
277                         const char *lvalue,
278                         int ltype,
279                         const char *rvalue,
280                         void *data,
281                         void *userdata);
282
283 int config_parse_tunnel_address(const char *unit,
284                                 const char *filename,
285                                 unsigned line,
286                                 const char *section,
287                                 unsigned section_line,
288                                 const char *lvalue,
289                                 int ltype,
290                                 const char *rvalue,
291                                 void *data,
292                                 void *userdata);
293
294 int config_parse_vxlan_group_address(const char *unit,
295                                      const char *filename,
296                                      unsigned line,
297                                      const char *section,
298                                      unsigned section_line,
299                                      const char *lvalue,
300                                      int ltype,
301                                      const char *rvalue,
302                                      void *data,
303                                      void *userdata);
304
305 /* gperf */
306 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
307
308 /* Route */
309 int route_new_static(Network *network, unsigned section, Route **ret);
310 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
311 void route_free(Route *route);
312 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
313 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
314
315
316 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
317 #define _cleanup_route_free_ _cleanup_(route_freep)
318
319 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
320                          const char *section, unsigned section_line, const char *lvalue,
321                          int ltype, const char *rvalue, void *data, void *userdata);
322
323 int config_parse_destination(const char *unit, const char *filename, unsigned line,
324                              const char *section, unsigned section_line, const char *lvalue,
325                              int ltype, const char *rvalue, void *data, void *userdata);
326
327 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
328                                 const char *section, unsigned section_line, const char *lvalue,
329                                 int ltype, const char *rvalue, void *data, void *userdata);
330 /* Address */
331 int address_new_static(Network *network, unsigned section, Address **ret);
332 int address_new_dynamic(Address **ret);
333 void address_free(Address *address);
334 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
335 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
336 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
337 int address_establish(Address *address, Link *link);
338 int address_release(Address *address, Link *link);
339 bool address_equal(Address *a1, Address *a2);
340
341 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
342 #define _cleanup_address_free_ _cleanup_(address_freep)
343
344 int config_parse_address(const char *unit, const char *filename, unsigned line,
345                          const char *section, unsigned section_line, const char *lvalue,
346                          int ltype, const char *rvalue, void *data, void *userdata);
347
348 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
349                            const char *section, unsigned section_line, const char *lvalue,
350                            int ltype, const char *rvalue, void *data, void *userdata);
351
352 int config_parse_label(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 /* Forwarding database table. */
357 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
358 void fdb_entry_free(FdbEntry *fdb_entry);
359 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
360
361 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
362 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
363
364 int config_parse_fdb_hwaddr(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
368 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
369                              const char *section, unsigned section_line, const char *lvalue,
370                              int ltype, const char *rvalue, void *data, void *userdata);
371
372 /* DHCP support */
373
374 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
375                       const char *section, unsigned section_line, const char *lvalue,
376                       int ltype, const char *rvalue, void *data, void *userdata);
377
378 /* LLMNR support */
379
380 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
381 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
382
383 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
384                       const char *section, unsigned section_line, const char *lvalue,
385                       int ltype, const char *rvalue, void *data, void *userdata);
386
387 /* Address Pool */
388
389 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
390 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
391 void address_pool_free(AddressPool *p);
392
393 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
394
395 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
396 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
397
398 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);