chiark / gitweb /
networkd: split out networkd-link.h
[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_domainname;
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 **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_tunnel(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_address(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 /* gperf */
250 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
251
252 /* Route */
253 int route_new_static(Network *network, unsigned section, Route **ret);
254 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
255 void route_free(Route *route);
256 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
257 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
258
259
260 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
261 #define _cleanup_route_free_ _cleanup_(route_freep)
262
263 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
264                          const char *section, unsigned section_line, const char *lvalue,
265                          int ltype, const char *rvalue, void *data, void *userdata);
266
267 int config_parse_destination(const char *unit, const char *filename, unsigned line,
268                              const char *section, unsigned section_line, const char *lvalue,
269                              int ltype, const char *rvalue, void *data, void *userdata);
270
271 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
272                                 const char *section, unsigned section_line, const char *lvalue,
273                                 int ltype, const char *rvalue, void *data, void *userdata);
274 /* Address */
275 int address_new_static(Network *network, unsigned section, Address **ret);
276 int address_new_dynamic(Address **ret);
277 void address_free(Address *address);
278 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
279 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
280 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
281 bool address_equal(Address *a1, Address *a2);
282
283 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
284 #define _cleanup_address_free_ _cleanup_(address_freep)
285
286 int config_parse_address(const char *unit, const char *filename, unsigned line,
287                          const char *section, unsigned section_line, const char *lvalue,
288                          int ltype, const char *rvalue, void *data, void *userdata);
289
290 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
291                            const char *section, unsigned section_line, const char *lvalue,
292                            int ltype, const char *rvalue, void *data, void *userdata);
293
294 int config_parse_label(const char *unit, const char *filename, unsigned line,
295                        const char *section, unsigned section_line, const char *lvalue,
296                        int ltype, const char *rvalue, void *data, void *userdata);
297
298 /* DHCP support */
299
300 const char* dhcp_support_to_string(DHCPSupport i) _const_;
301 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
302
303 int config_parse_dhcp(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 /* LLMNR support */
308
309 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
310 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
311
312 int config_parse_llmnr(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 /* Address Pool */
317
318 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
319 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
320 void address_pool_free(AddressPool *p);
321
322 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
323
324 /* Macros which append INTERFACE= to the message */
325
326 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
327 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
328 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
329 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
330 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
331 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
332
333 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
334
335 #define ADDRESS_FMT_VAL(address)            \
336         (address).s_addr & 0xFF,            \
337         ((address).s_addr >> 8) & 0xFF,     \
338         ((address).s_addr >> 16) & 0xFF,    \
339         (address).s_addr >> 24