chiark / gitweb /
networkd: refactor socket activation a bit
[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_save(Manager *m);
233
234 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
235
236 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
237 #define _cleanup_manager_free_ _cleanup_(manager_freep)
238
239 /* Network */
240
241 int network_load(Manager *manager);
242
243 void network_free(Network *network);
244
245 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
246 #define _cleanup_network_free_ _cleanup_(network_freep)
247
248 int network_get(Manager *manager, struct udev_device *device,
249                 const char *ifname, const struct ether_addr *mac,
250                 Network **ret);
251 int network_apply(Manager *manager, Network *network, Link *link);
252
253 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
254                         const char *section, unsigned section_line, const char *lvalue,
255                         int ltype, const char *rvalue, void *data, void *userdata);
256
257 int config_parse_domains(const char *unit,
258                          const char *filename,
259                          unsigned line,
260                          const char *section,
261                          unsigned section_line,
262                          const char *lvalue,
263                          int ltype,
264                          const char *rvalue,
265                          void *data,
266                          void *userdata);
267
268 int config_parse_tunnel(const char *unit,
269                         const char *filename,
270                         unsigned line,
271                         const char *section,
272                         unsigned section_line,
273                         const char *lvalue,
274                         int ltype,
275                         const char *rvalue,
276                         void *data,
277                         void *userdata);
278
279 int config_parse_tunnel_address(const char *unit,
280                                 const char *filename,
281                                 unsigned line,
282                                 const char *section,
283                                 unsigned section_line,
284                                 const char *lvalue,
285                                 int ltype,
286                                 const char *rvalue,
287                                 void *data,
288                                 void *userdata);
289
290 int config_parse_vxlan_group_address(const char *unit,
291                                      const char *filename,
292                                      unsigned line,
293                                      const char *section,
294                                      unsigned section_line,
295                                      const char *lvalue,
296                                      int ltype,
297                                      const char *rvalue,
298                                      void *data,
299                                      void *userdata);
300
301 /* gperf */
302 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
303
304 /* Route */
305 int route_new_static(Network *network, unsigned section, Route **ret);
306 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
307 void route_free(Route *route);
308 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
309 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
310
311
312 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
313 #define _cleanup_route_free_ _cleanup_(route_freep)
314
315 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
316                          const char *section, unsigned section_line, const char *lvalue,
317                          int ltype, const char *rvalue, void *data, void *userdata);
318
319 int config_parse_destination(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_route_priority(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 /* Address */
327 int address_new_static(Network *network, unsigned section, Address **ret);
328 int address_new_dynamic(Address **ret);
329 void address_free(Address *address);
330 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
331 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
332 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
333 int address_establish(Address *address, Link *link);
334 int address_release(Address *address, Link *link);
335 bool address_equal(Address *a1, Address *a2);
336
337 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
338 #define _cleanup_address_free_ _cleanup_(address_freep)
339
340 int config_parse_address(const char *unit, const char *filename, unsigned line,
341                          const char *section, unsigned section_line, const char *lvalue,
342                          int ltype, const char *rvalue, void *data, void *userdata);
343
344 int config_parse_broadcast(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_label(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 /* Forwarding database table. */
353 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
354 void fdb_entry_free(FdbEntry *fdb_entry);
355 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
356
357 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
358 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
359
360 int config_parse_fdb_hwaddr(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_fdb_vlan_id(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 /* DHCP support */
369
370 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
371                       const char *section, unsigned section_line, const char *lvalue,
372                       int ltype, const char *rvalue, void *data, void *userdata);
373
374 /* LLMNR support */
375
376 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
377 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
378
379 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
380                       const char *section, unsigned section_line, const char *lvalue,
381                       int ltype, const char *rvalue, void *data, void *userdata);
382
383 /* Address Pool */
384
385 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
386 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
387 void address_pool_free(AddressPool *p);
388
389 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
390
391 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
392 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
393
394 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);