chiark / gitweb /
networkd: remove "*" from domains list
[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         bool wildcard_domain;
115         char **domains, **dns, **ntp;
116
117         LLMNRSupport llmnr;
118
119         LIST_FIELDS(Network, networks);
120 };
121
122 struct Address {
123         Network *network;
124         unsigned section;
125
126         int family;
127         unsigned char prefixlen;
128         unsigned char scope;
129         char *label;
130
131         struct in_addr broadcast;
132         struct ifa_cacheinfo cinfo;
133
134         union in_addr_union in_addr;
135         union in_addr_union in_addr_peer;
136
137         LIST_FIELDS(Address, addresses);
138 };
139
140 struct Route {
141         Network *network;
142         unsigned section;
143
144         int family;
145         unsigned char dst_prefixlen;
146         unsigned char scope;
147         uint32_t metrics;
148         unsigned char protocol;  /* RTPROT_* */
149
150         union in_addr_union in_addr;
151         union in_addr_union dst_addr;
152
153         LIST_FIELDS(Route, routes);
154 };
155
156 struct AddressPool {
157         Manager *manager;
158
159         int family;
160         unsigned prefixlen;
161
162         union in_addr_union in_addr;
163
164         LIST_FIELDS(AddressPool, address_pools);
165 };
166
167 struct Manager {
168         sd_rtnl *rtnl;
169         sd_event *event;
170         sd_bus *bus;
171         struct udev *udev;
172         struct udev_monitor *udev_monitor;
173         sd_event_source *udev_event_source;
174         sd_event_source *sigterm_event_source;
175         sd_event_source *sigint_event_source;
176
177         char *state_file;
178
179         Hashmap *links;
180         Hashmap *netdevs;
181         LIST_HEAD(Network, networks);
182         LIST_HEAD(AddressPool, address_pools);
183
184         usec_t network_dirs_ts_usec;
185 };
186
187 extern const char* const network_dirs[];
188
189 /* Manager */
190
191 int manager_new(Manager **ret);
192 void manager_free(Manager *m);
193
194 int manager_load_config(Manager *m);
195 bool manager_should_reload(Manager *m);
196
197 int manager_rtnl_enumerate_links(Manager *m);
198
199 int manager_rtnl_listen(Manager *m);
200 int manager_udev_listen(Manager *m);
201 int manager_bus_listen(Manager *m);
202
203 int manager_save(Manager *m);
204
205 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
206
207 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
208 #define _cleanup_manager_free_ _cleanup_(manager_freep)
209
210 /* Network */
211
212 int network_load(Manager *manager);
213
214 void network_free(Network *network);
215
216 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
217 #define _cleanup_network_free_ _cleanup_(network_freep)
218
219 int network_get(Manager *manager, struct udev_device *device,
220                 const char *ifname, const struct ether_addr *mac,
221                 Network **ret);
222 int network_apply(Manager *manager, Network *network, Link *link);
223
224 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
225                         const char *section, unsigned section_line, const char *lvalue,
226                         int ltype, const char *rvalue, void *data, void *userdata);
227
228 int config_parse_domains(const char *unit,
229                          const char *filename,
230                          unsigned line,
231                          const char *section,
232                          unsigned section_line,
233                          const char *lvalue,
234                          int ltype,
235                          const char *rvalue,
236                          void *data,
237                          void *userdata);
238
239 int config_parse_tunnel(const char *unit,
240                         const char *filename,
241                         unsigned line,
242                         const char *section,
243                         unsigned section_line,
244                         const char *lvalue,
245                         int ltype,
246                         const char *rvalue,
247                         void *data,
248                         void *userdata);
249
250 int config_parse_tunnel_address(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 /* gperf */
262 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
263
264 /* Route */
265 int route_new_static(Network *network, unsigned section, Route **ret);
266 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
267 void route_free(Route *route);
268 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
269 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
270
271
272 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
273 #define _cleanup_route_free_ _cleanup_(route_freep)
274
275 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
276                          const char *section, unsigned section_line, const char *lvalue,
277                          int ltype, const char *rvalue, void *data, void *userdata);
278
279 int config_parse_destination(const char *unit, const char *filename, unsigned line,
280                              const char *section, unsigned section_line, const char *lvalue,
281                              int ltype, const char *rvalue, void *data, void *userdata);
282
283 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
284                                 const char *section, unsigned section_line, const char *lvalue,
285                                 int ltype, const char *rvalue, void *data, void *userdata);
286 /* Address */
287 int address_new_static(Network *network, unsigned section, Address **ret);
288 int address_new_dynamic(Address **ret);
289 void address_free(Address *address);
290 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
291 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
292 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
293 bool address_equal(Address *a1, Address *a2);
294
295 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
296 #define _cleanup_address_free_ _cleanup_(address_freep)
297
298 int config_parse_address(const char *unit, const char *filename, unsigned line,
299                          const char *section, unsigned section_line, const char *lvalue,
300                          int ltype, const char *rvalue, void *data, void *userdata);
301
302 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
303                            const char *section, unsigned section_line, const char *lvalue,
304                            int ltype, const char *rvalue, void *data, void *userdata);
305
306 int config_parse_label(const char *unit, const char *filename, unsigned line,
307                        const char *section, unsigned section_line, const char *lvalue,
308                        int ltype, const char *rvalue, void *data, void *userdata);
309
310 /* DHCP support */
311
312 const char* dhcp_support_to_string(DHCPSupport i) _const_;
313 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
314
315 int config_parse_dhcp(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 /* LLMNR support */
320
321 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
322 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
323
324 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
325                       const char *section, unsigned section_line, const char *lvalue,
326                       int ltype, const char *rvalue, void *data, void *userdata);
327
328 /* Address Pool */
329
330 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
331 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
332 void address_pool_free(AddressPool *p);
333
334 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
335
336 /* Macros which append INTERFACE= to the message */
337
338 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
339 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
340 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
341 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
342 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
343 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
344
345 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
346
347 #define ADDRESS_FMT_VAL(address)            \
348         (address).s_addr & 0xFF,            \
349         ((address).s_addr >> 8) & 0xFF,     \
350         ((address).s_addr >> 16) & 0xFF,    \
351         (address).s_addr >> 24