chiark / gitweb /
a5c5b085bad58b0891f22438e790b7170e6ec40b
[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.h"
41 #include "in-addr-util.h"
42
43 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
44 #define DHCP_ROUTE_METRIC 1024
45 #define IPV4LL_ROUTE_METRIC 2048
46
47 typedef struct NetDev NetDev;
48 typedef struct Network Network;
49 typedef struct Link Link;
50 typedef struct Address Address;
51 typedef struct Route Route;
52 typedef struct Manager Manager;
53 typedef struct AddressPool AddressPool;
54 typedef struct FdbEntry FdbEntry;
55
56 typedef enum DHCPSupport {
57         DHCP_SUPPORT_NONE,
58         DHCP_SUPPORT_BOTH,
59         DHCP_SUPPORT_V4,
60         DHCP_SUPPORT_V6,
61         _DHCP_SUPPORT_MAX,
62         _DHCP_SUPPORT_INVALID = -1,
63 } DHCPSupport;
64
65 typedef enum LLMNRSupport {
66         LLMNR_SUPPORT_NO,
67         LLMNR_SUPPORT_YES,
68         LLMNR_SUPPORT_RESOLVE,
69         _LLMNR_SUPPORT_MAX,
70         _LLMNR_SUPPORT_INVALID = -1,
71 } LLMNRSupport;
72
73 struct FdbEntry {
74         Network *network;
75         unsigned section;
76
77         struct ether_addr *mac_addr;
78         uint16_t vlan_id;
79
80         LIST_FIELDS(FdbEntry, static_fdb_entries);
81 };
82
83 struct Network {
84         Manager *manager;
85
86         char *filename;
87
88         struct ether_addr *match_mac;
89         char *match_path;
90         char *match_driver;
91         char *match_type;
92         char *match_name;
93         char *dhcp_vendor_class_identifier;
94
95         Condition *match_host;
96         Condition *match_virt;
97         Condition *match_kernel;
98         Condition *match_arch;
99
100         char *description;
101         NetDev *bridge;
102         NetDev *bond;
103         Hashmap *stacked_netdevs;
104         DHCPSupport dhcp;
105         bool dhcp_dns;
106         bool dhcp_ntp;
107         bool dhcp_mtu;
108         bool dhcp_hostname;
109         bool dhcp_domains;
110         bool dhcp_sendhost;
111         bool dhcp_broadcast;
112         bool dhcp_critical;
113         bool dhcp_routes;
114         unsigned dhcp_route_metric;
115         bool ipv4ll;
116         bool ipv4ll_route;
117
118         bool dhcp_server;
119
120         unsigned cost;
121
122         struct ether_addr *mac;
123         unsigned mtu;
124
125         LIST_HEAD(Address, static_addresses);
126         LIST_HEAD(Route, static_routes);
127         LIST_HEAD(FdbEntry, static_fdb_entries);
128
129         Hashmap *addresses_by_section;
130         Hashmap *routes_by_section;
131         Hashmap *fdb_entries_by_section;
132
133         bool wildcard_domain;
134         char **domains, **dns, **ntp;
135
136         LLMNRSupport llmnr;
137
138         LIST_FIELDS(Network, networks);
139 };
140
141 struct Address {
142         Network *network;
143         unsigned section;
144
145         int family;
146         unsigned char prefixlen;
147         unsigned char scope;
148         unsigned char flags;
149         char *label;
150
151         struct in_addr broadcast;
152         struct ifa_cacheinfo cinfo;
153
154         union in_addr_union in_addr;
155         union in_addr_union in_addr_peer;
156
157         LIST_FIELDS(Address, addresses);
158 };
159
160 struct Route {
161         Network *network;
162         unsigned section;
163
164         int family;
165         unsigned char dst_prefixlen;
166         unsigned char src_prefixlen;
167         unsigned char scope;
168         uint32_t metrics;
169         unsigned char protocol;  /* RTPROT_* */
170
171         union in_addr_union in_addr;
172         union in_addr_union dst_addr;
173         union in_addr_union src_addr;
174         union in_addr_union prefsrc_addr;
175
176         LIST_FIELDS(Route, routes);
177 };
178
179 struct AddressPool {
180         Manager *manager;
181
182         int family;
183         unsigned prefixlen;
184
185         union in_addr_union in_addr;
186
187         LIST_FIELDS(AddressPool, address_pools);
188 };
189
190 struct Manager {
191         sd_rtnl *rtnl;
192         sd_event *event;
193         sd_bus *bus;
194         struct udev *udev;
195         struct udev_monitor *udev_monitor;
196         sd_event_source *udev_event_source;
197
198         char *state_file;
199
200         Hashmap *links;
201         Hashmap *netdevs;
202         LIST_HEAD(Network, networks);
203         LIST_HEAD(AddressPool, address_pools);
204
205         usec_t network_dirs_ts_usec;
206 };
207
208 extern const char* const network_dirs[];
209
210 /* Manager */
211
212 int manager_new(Manager **ret);
213 void manager_free(Manager *m);
214
215 int manager_load_config(Manager *m);
216 bool manager_should_reload(Manager *m);
217
218 int manager_rtnl_enumerate_links(Manager *m);
219 int manager_rtnl_enumerate_addresses(Manager *m);
220
221 int manager_rtnl_listen(Manager *m);
222 int manager_udev_listen(Manager *m);
223 int manager_bus_listen(Manager *m);
224
225 int manager_save(Manager *m);
226
227 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
228
229 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
230 #define _cleanup_manager_free_ _cleanup_(manager_freep)
231
232 /* Network */
233
234 int network_load(Manager *manager);
235
236 void network_free(Network *network);
237
238 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
239 #define _cleanup_network_free_ _cleanup_(network_freep)
240
241 int network_get(Manager *manager, struct udev_device *device,
242                 const char *ifname, const struct ether_addr *mac,
243                 Network **ret);
244 int network_apply(Manager *manager, Network *network, Link *link);
245
246 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
247                         const char *section, unsigned section_line, const char *lvalue,
248                         int ltype, const char *rvalue, void *data, void *userdata);
249
250 int config_parse_domains(const char *unit,
251                          const char *filename,
252                          unsigned line,
253                          const char *section,
254                          unsigned section_line,
255                          const char *lvalue,
256                          int ltype,
257                          const char *rvalue,
258                          void *data,
259                          void *userdata);
260
261 int config_parse_tunnel(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_address(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_vxlan_group_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 /* gperf */
295 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
296
297 /* Route */
298 int route_new_static(Network *network, unsigned section, Route **ret);
299 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
300 void route_free(Route *route);
301 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
302 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
303
304
305 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
306 #define _cleanup_route_free_ _cleanup_(route_freep)
307
308 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
309                          const char *section, unsigned section_line, const char *lvalue,
310                          int ltype, const char *rvalue, void *data, void *userdata);
311
312 int config_parse_destination(const char *unit, const char *filename, unsigned line,
313                              const char *section, unsigned section_line, const char *lvalue,
314                              int ltype, const char *rvalue, void *data, void *userdata);
315
316 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
317                                 const char *section, unsigned section_line, const char *lvalue,
318                                 int ltype, const char *rvalue, void *data, void *userdata);
319 /* Address */
320 int address_new_static(Network *network, unsigned section, Address **ret);
321 int address_new_dynamic(Address **ret);
322 void address_free(Address *address);
323 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
324 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
325 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
326 bool address_equal(Address *a1, Address *a2);
327
328 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
329 #define _cleanup_address_free_ _cleanup_(address_freep)
330
331 int config_parse_address(const char *unit, const char *filename, unsigned line,
332                          const char *section, unsigned section_line, const char *lvalue,
333                          int ltype, const char *rvalue, void *data, void *userdata);
334
335 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
336                            const char *section, unsigned section_line, const char *lvalue,
337                            int ltype, const char *rvalue, void *data, void *userdata);
338
339 int config_parse_label(const char *unit, const char *filename, unsigned line,
340                        const char *section, unsigned section_line, const char *lvalue,
341                        int ltype, const char *rvalue, void *data, void *userdata);
342
343 /* Forwarding database table. */
344 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
345 void fdb_entry_free(FdbEntry *fdb_entry);
346 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
347
348 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
349 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
350
351 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
352                             const char *section, unsigned section_line, const char *lvalue,
353                             int ltype, const char *rvalue, void *data, void *userdata);
354
355 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
356                              const char *section, unsigned section_line, const char *lvalue,
357                              int ltype, const char *rvalue, void *data, void *userdata);
358
359 /* DHCP support */
360
361 const char* dhcp_support_to_string(DHCPSupport i) _const_;
362 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
363
364 int config_parse_dhcp(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 /* LLMNR support */
369
370 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
371 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
372
373 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
374                       const char *section, unsigned section_line, const char *lvalue,
375                       int ltype, const char *rvalue, void *data, void *userdata);
376
377 /* Address Pool */
378
379 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
380 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
381 void address_pool_free(AddressPool *p);
382
383 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);