chiark / gitweb /
networkd: add support for Domains= to .network files
[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-util.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
55 typedef enum DHCPSupport {
56         DHCP_SUPPORT_NONE,
57         DHCP_SUPPORT_BOTH,
58         DHCP_SUPPORT_V4,
59         DHCP_SUPPORT_V6,
60         _DHCP_SUPPORT_MAX,
61         _DHCP_SUPPORT_INVALID = -1,
62 } DHCPSupport;
63
64 typedef enum LLMNRSupport {
65         LLMNR_SUPPORT_NO,
66         LLMNR_SUPPORT_YES,
67         LLMNR_SUPPORT_RESOLVE,
68         _LLMNR_SUPPORT_MAX,
69         _LLMNR_SUPPORT_INVALID = -1,
70 } LLMNRSupport;
71
72 struct Network {
73         Manager *manager;
74
75         char *filename;
76
77         struct ether_addr *match_mac;
78         char *match_path;
79         char *match_driver;
80         char *match_type;
81         char *match_name;
82         char *dhcp_vendor_class_identifier;
83
84         Condition *match_host;
85         Condition *match_virt;
86         Condition *match_kernel;
87         Condition *match_arch;
88
89         char *description;
90         NetDev *bridge;
91         NetDev *bond;
92         Hashmap *stacked_netdevs;
93         DHCPSupport dhcp;
94         bool dhcp_dns;
95         bool dhcp_ntp;
96         bool dhcp_mtu;
97         bool dhcp_hostname;
98         bool dhcp_domains;
99         bool dhcp_sendhost;
100         bool dhcp_broadcast;
101         bool dhcp_critical;
102         bool dhcp_routes;
103         bool ipv4ll;
104         bool ipv4ll_route;
105
106         bool dhcp_server;
107
108         LIST_HEAD(Address, static_addresses);
109         LIST_HEAD(Route, static_routes);
110
111         Hashmap *addresses_by_section;
112         Hashmap *routes_by_section;
113
114         char **domains, **dns, **ntp;
115
116         LLMNRSupport llmnr;
117
118         LIST_FIELDS(Network, networks);
119 };
120
121 struct Address {
122         Network *network;
123         unsigned section;
124
125         int family;
126         unsigned char prefixlen;
127         unsigned char scope;
128         char *label;
129
130         struct in_addr broadcast;
131         struct ifa_cacheinfo cinfo;
132
133         union in_addr_union in_addr;
134         union in_addr_union in_addr_peer;
135
136         LIST_FIELDS(Address, addresses);
137 };
138
139 struct Route {
140         Network *network;
141         unsigned section;
142
143         int family;
144         unsigned char dst_prefixlen;
145         unsigned char scope;
146         uint32_t metrics;
147         unsigned char protocol;  /* RTPROT_* */
148
149         union in_addr_union in_addr;
150         union in_addr_union dst_addr;
151
152         LIST_FIELDS(Route, routes);
153 };
154
155 struct AddressPool {
156         Manager *manager;
157
158         int family;
159         unsigned prefixlen;
160
161         union in_addr_union in_addr;
162
163         LIST_FIELDS(AddressPool, address_pools);
164 };
165
166 struct Manager {
167         sd_rtnl *rtnl;
168         sd_event *event;
169         sd_bus *bus;
170         struct udev *udev;
171         struct udev_monitor *udev_monitor;
172         sd_event_source *udev_event_source;
173         sd_event_source *sigterm_event_source;
174         sd_event_source *sigint_event_source;
175
176         char *state_file;
177
178         Hashmap *links;
179         Hashmap *netdevs;
180         LIST_HEAD(Network, networks);
181         LIST_HEAD(AddressPool, address_pools);
182
183         usec_t network_dirs_ts_usec;
184 };
185
186 extern const char* const network_dirs[];
187
188 /* Manager */
189
190 int manager_new(Manager **ret);
191 void manager_free(Manager *m);
192
193 int manager_load_config(Manager *m);
194 bool manager_should_reload(Manager *m);
195
196 int manager_rtnl_enumerate_links(Manager *m);
197
198 int manager_rtnl_listen(Manager *m);
199 int manager_udev_listen(Manager *m);
200 int manager_bus_listen(Manager *m);
201
202 int manager_save(Manager *m);
203
204 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
205
206 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
207 #define _cleanup_manager_free_ _cleanup_(manager_freep)
208
209 /* Network */
210
211 int network_load(Manager *manager);
212
213 void network_free(Network *network);
214
215 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
216 #define _cleanup_network_free_ _cleanup_(network_freep)
217
218 int network_get(Manager *manager, struct udev_device *device,
219                 const char *ifname, const struct ether_addr *mac,
220                 Network **ret);
221 int network_apply(Manager *manager, Network *network, Link *link);
222
223 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
224                         const char *section, unsigned section_line, const char *lvalue,
225                         int ltype, const char *rvalue, void *data, void *userdata);
226
227 int config_parse_domains(const char *unit,
228                          const char *filename,
229                          unsigned line,
230                          const char *section,
231                          unsigned section_line,
232                          const char *lvalue,
233                          int ltype,
234                          const char *rvalue,
235                          void *data,
236                          void *userdata);
237
238 int config_parse_tunnel(const char *unit,
239                         const char *filename,
240                         unsigned line,
241                         const char *section,
242                         unsigned section_line,
243                         const char *lvalue,
244                         int ltype,
245                         const char *rvalue,
246                         void *data,
247                         void *userdata);
248
249 int config_parse_tunnel_address(const char *unit,
250                                 const char *filename,
251                                 unsigned line,
252                                 const char *section,
253                                 unsigned section_line,
254                                 const char *lvalue,
255                                 int ltype,
256                                 const char *rvalue,
257                                 void *data,
258                                 void *userdata);
259
260 /* gperf */
261 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
262
263 /* Route */
264 int route_new_static(Network *network, unsigned section, Route **ret);
265 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
266 void route_free(Route *route);
267 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
268 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
269
270
271 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
272 #define _cleanup_route_free_ _cleanup_(route_freep)
273
274 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
275                          const char *section, unsigned section_line, const char *lvalue,
276                          int ltype, const char *rvalue, void *data, void *userdata);
277
278 int config_parse_destination(const char *unit, const char *filename, unsigned line,
279                              const char *section, unsigned section_line, const char *lvalue,
280                              int ltype, const char *rvalue, void *data, void *userdata);
281
282 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
283                                 const char *section, unsigned section_line, const char *lvalue,
284                                 int ltype, const char *rvalue, void *data, void *userdata);
285 /* Address */
286 int address_new_static(Network *network, unsigned section, Address **ret);
287 int address_new_dynamic(Address **ret);
288 void address_free(Address *address);
289 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
290 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
291 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
292 bool address_equal(Address *a1, Address *a2);
293
294 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
295 #define _cleanup_address_free_ _cleanup_(address_freep)
296
297 int config_parse_address(const char *unit, const char *filename, unsigned line,
298                          const char *section, unsigned section_line, const char *lvalue,
299                          int ltype, const char *rvalue, void *data, void *userdata);
300
301 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
302                            const char *section, unsigned section_line, const char *lvalue,
303                            int ltype, const char *rvalue, void *data, void *userdata);
304
305 int config_parse_label(const char *unit, const char *filename, unsigned line,
306                        const char *section, unsigned section_line, const char *lvalue,
307                        int ltype, const char *rvalue, void *data, void *userdata);
308
309 /* DHCP support */
310
311 const char* dhcp_support_to_string(DHCPSupport i) _const_;
312 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
313
314 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
315                       const char *section, unsigned section_line, const char *lvalue,
316                       int ltype, const char *rvalue, void *data, void *userdata);
317
318 /* LLMNR support */
319
320 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
321 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
322
323 int config_parse_llmnr(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 /* Address Pool */
328
329 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
330 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
331 void address_pool_free(AddressPool *p);
332
333 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
334
335 /* Macros which append INTERFACE= to the message */
336
337 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
338 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
339 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
340 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
341 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
342 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
343
344 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
345
346 #define ADDRESS_FMT_VAL(address)            \
347         (address).s_addr & 0xFF,            \
348         ((address).s_addr >> 8) & 0xFF,     \
349         ((address).s_addr >> 16) & 0xFF,    \
350         (address).s_addr >> 24