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