chiark / gitweb /
change type for address family to "int"
[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 struct Network {
65         Manager *manager;
66
67         char *filename;
68
69         struct ether_addr *match_mac;
70         char *match_path;
71         char *match_driver;
72         char *match_type;
73         char *match_name;
74         char *dhcp_vendor_class_identifier;
75
76         Condition *match_host;
77         Condition *match_virt;
78         Condition *match_kernel;
79         Condition *match_arch;
80
81         char *description;
82         NetDev *bridge;
83         NetDev *bond;
84         NetDev *tunnel;
85         Hashmap *vlans;
86         Hashmap *macvlans;
87         Hashmap *vxlans;
88         DHCPSupport dhcp;
89         bool dhcp_dns;
90         bool dhcp_ntp;
91         bool dhcp_mtu;
92         bool dhcp_hostname;
93         bool dhcp_domainname;
94         bool dhcp_sendhost;
95         bool dhcp_broadcast;
96         bool dhcp_critical;
97         bool dhcp_routes;
98         bool ipv4ll;
99
100         bool dhcp_server;
101
102         LIST_HEAD(Address, static_addresses);
103         LIST_HEAD(Route, static_routes);
104
105         Hashmap *addresses_by_section;
106         Hashmap *routes_by_section;
107
108         LIST_HEAD(Address, dns);
109         LIST_HEAD(Address, ntp);
110
111         LIST_FIELDS(Network, networks);
112 };
113
114 struct Address {
115         Network *network;
116         uint64_t section;
117
118         int family;
119         unsigned char prefixlen;
120         unsigned char scope;
121         char *label;
122
123         struct in_addr broadcast;
124         struct ifa_cacheinfo cinfo;
125
126         union in_addr_union in_addr;
127         union in_addr_union in_addr_peer;
128
129         LIST_FIELDS(Address, addresses);
130 };
131
132 struct Route {
133         Network *network;
134         uint64_t section;
135
136         int family;
137         unsigned char dst_prefixlen;
138         unsigned char scope;
139         uint32_t metrics;
140
141         union in_addr_union in_addr;
142         union in_addr_union dst_addr;
143
144         LIST_FIELDS(Route, routes);
145 };
146
147 typedef enum LinkState {
148         LINK_STATE_INITIALIZING,
149         LINK_STATE_ENSLAVING,
150         LINK_STATE_SETTING_ADDRESSES,
151         LINK_STATE_SETTING_ROUTES,
152         LINK_STATE_CONFIGURED,
153         LINK_STATE_UNMANAGED,
154         LINK_STATE_FAILED,
155         LINK_STATE_LINGER,
156         _LINK_STATE_MAX,
157         _LINK_STATE_INVALID = -1
158 } LinkState;
159
160 typedef enum LinkOperationalState {
161         LINK_OPERSTATE_UNKNOWN,
162         LINK_OPERSTATE_DORMANT,
163         LINK_OPERSTATE_CARRIER,
164         LINK_OPERSTATE_DEGRADED,
165         LINK_OPERSTATE_ROUTABLE,
166         _LINK_OPERSTATE_MAX,
167         _LINK_OPERSTATE_INVALID = -1
168 } LinkOperationalState;
169
170 struct Link {
171         Manager *manager;
172
173         int n_ref;
174
175         uint64_t ifindex;
176         char *ifname;
177         char *state_file;
178         struct ether_addr mac;
179         struct udev_device *udev_device;
180
181         unsigned flags;
182         uint8_t kernel_operstate;
183
184         Network *network;
185
186         LinkState state;
187         LinkOperationalState operstate;
188
189         unsigned addr_messages;
190         unsigned route_messages;
191         unsigned enslaving;
192
193         LIST_HEAD(Address, addresses);
194
195         sd_dhcp_client *dhcp_client;
196         sd_dhcp_lease *dhcp_lease;
197         char *lease_file;
198         uint16_t original_mtu;
199         sd_ipv4ll *ipv4ll;
200
201         LIST_HEAD(Address, pool_addresses);
202
203         sd_dhcp_server *dhcp_server;
204
205         sd_icmp6_nd *icmp6_router_discovery;
206         sd_dhcp6_client *dhcp6_client;
207 };
208
209 struct AddressPool {
210         Manager *manager;
211
212         int family;
213         unsigned prefixlen;
214
215         union in_addr_union in_addr;
216
217         LIST_FIELDS(AddressPool, address_pools);
218 };
219
220 struct Manager {
221         sd_rtnl *rtnl;
222         sd_event *event;
223         sd_bus *bus;
224         struct udev *udev;
225         struct udev_monitor *udev_monitor;
226         sd_event_source *udev_event_source;
227         sd_event_source *sigterm_event_source;
228         sd_event_source *sigint_event_source;
229
230         char *state_file;
231
232         Hashmap *links;
233         Hashmap *netdevs;
234         LIST_HEAD(Network, networks);
235         LIST_HEAD(AddressPool, address_pools);
236
237         usec_t network_dirs_ts_usec;
238 };
239
240 extern const char* const network_dirs[];
241
242 /* Manager */
243
244 int manager_new(Manager **ret);
245 void manager_free(Manager *m);
246
247 int manager_load_config(Manager *m);
248 bool manager_should_reload(Manager *m);
249
250 int manager_rtnl_enumerate_links(Manager *m);
251
252 int manager_rtnl_listen(Manager *m);
253 int manager_udev_listen(Manager *m);
254 int manager_bus_listen(Manager *m);
255
256 int manager_save(Manager *m);
257
258 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
259
260 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
261 #define _cleanup_manager_free_ _cleanup_(manager_freep)
262
263 /* Network */
264
265 int network_load(Manager *manager);
266
267 void network_free(Network *network);
268
269 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
270 #define _cleanup_network_free_ _cleanup_(network_freep)
271
272 int network_get(Manager *manager, struct udev_device *device,
273                 const char *ifname, const struct ether_addr *mac,
274                 Network **ret);
275 int network_apply(Manager *manager, Network *network, Link *link);
276
277 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
278                         const char *section, unsigned section_line, const char *lvalue,
279                         int ltype, const char *rvalue, void *data, void *userdata);
280
281 int config_parse_tunnel(const char *unit,
282                         const char *filename,
283                         unsigned line,
284                         const char *section,
285                         unsigned section_line,
286                         const char *lvalue,
287                         int ltype,
288                         const char *rvalue,
289                         void *data,
290                         void *userdata);
291
292 int config_parse_tunnel_address(const char *unit,
293                                 const char *filename,
294                                 unsigned line,
295                                 const char *section,
296                                 unsigned section_line,
297                                 const char *lvalue,
298                                 int ltype,
299                                 const char *rvalue,
300                                 void *data,
301                                 void *userdata);
302
303 /* gperf */
304 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
305
306 /* Route */
307 int route_new_static(Network *network, unsigned section, Route **ret);
308 int route_new_dynamic(Route **ret);
309 void route_free(Route *route);
310 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
311 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
312
313
314 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
315 #define _cleanup_route_free_ _cleanup_(route_freep)
316
317 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
318                          const char *section, unsigned section_line, const char *lvalue,
319                          int ltype, const char *rvalue, void *data, void *userdata);
320
321 int config_parse_destination(const char *unit, const char *filename, unsigned line,
322                              const char *section, unsigned section_line, const char *lvalue,
323                              int ltype, const char *rvalue, void *data, void *userdata);
324
325 int config_parse_route_priority(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 /* Address */
329 int address_new_static(Network *network, unsigned section, Address **ret);
330 int address_new_dynamic(Address **ret);
331 void address_free(Address *address);
332 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
333 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
334 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
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_dns(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_address(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_broadcast(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 int config_parse_label(const char *unit, const char *filename, unsigned line,
353                        const char *section, unsigned section_line, const char *lvalue,
354                        int ltype, const char *rvalue, void *data, void *userdata);
355
356 /* Link */
357
358 Link *link_unref(Link *link);
359 Link *link_ref(Link *link);
360 int link_get(Manager *m, int ifindex, Link **ret);
361 int link_add(Manager *manager, sd_rtnl_message *message, Link **ret);
362 void link_drop(Link *link);
363
364 int link_update(Link *link, sd_rtnl_message *message);
365 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata);
366
367 int link_initialized(Link *link, struct udev_device *device);
368
369 int link_save(Link *link);
370
371 bool link_has_carrier(unsigned flags, uint8_t operstate);
372
373 const char* link_state_to_string(LinkState s) _const_;
374 LinkState link_state_from_string(const char *s) _pure_;
375
376 const char* link_operstate_to_string(LinkOperationalState s) _const_;
377 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
378
379 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
380 #define _cleanup_link_unref_ _cleanup_(link_unrefp)
381
382 /* DHCP support */
383
384 const char* dhcp_support_to_string(DHCPSupport i) _const_;
385 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
386
387 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
388                       const char *section, unsigned section_line, const char *lvalue,
389                       int ltype, const char *rvalue, void *data, void *userdata);
390
391 /* Address Pool */
392
393 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
394 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
395 void address_pool_free(AddressPool *p);
396
397 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
398
399 /* Macros which append INTERFACE= to the message */
400
401 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
402 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
403 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
404 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
405 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
406 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
407
408 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
409
410 #define ADDRESS_FMT_VAL(address)            \
411         (address).s_addr & 0xFF,            \
412         ((address).s_addr >> 8) & 0xFF,     \
413         ((address).s_addr >> 16) & 0xFF,    \
414         (address).s_addr >> 24