chiark / gitweb /
sd-ipv4ll/networkd: generate predictable addresses
[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-ipv4ll.h"
31 #include "udev.h"
32
33 #include "rtnl-util.h"
34 #include "hashmap.h"
35 #include "list.h"
36 #include "set.h"
37 #include "condition-util.h"
38
39 typedef struct NetDev NetDev;
40 typedef struct Network Network;
41 typedef struct Link Link;
42 typedef struct Address Address;
43 typedef struct Route Route;
44 typedef struct Manager Manager;
45
46 typedef struct netdev_enslave_callback netdev_enslave_callback;
47
48 struct netdev_enslave_callback {
49         sd_rtnl_message_handler_t callback;
50         Link *link;
51
52         LIST_FIELDS(netdev_enslave_callback, callbacks);
53 };
54
55 typedef enum MacVlanMode {
56         NETDEV_MACVLAN_MODE_PRIVATE = MACVLAN_MODE_PRIVATE,
57         NETDEV_MACVLAN_MODE_VEPA = MACVLAN_MODE_VEPA,
58         NETDEV_MACVLAN_MODE_BRIDGE = MACVLAN_MODE_BRIDGE,
59         NETDEV_MACVLAN_MODE_PASSTHRU = MACVLAN_MODE_PASSTHRU,
60         _NETDEV_MACVLAN_MODE_MAX,
61         _NETDEV_MACVLAN_MODE_INVALID = -1
62 } MacVlanMode;
63
64 typedef enum NetDevKind {
65         NETDEV_KIND_BRIDGE,
66         NETDEV_KIND_BOND,
67         NETDEV_KIND_VLAN,
68         NETDEV_KIND_MACVLAN,
69         _NETDEV_KIND_MAX,
70         _NETDEV_KIND_INVALID = -1
71 } NetDevKind;
72
73 typedef enum NetDevState {
74         NETDEV_STATE_FAILED,
75         NETDEV_STATE_CREATING,
76         NETDEV_STATE_READY,
77         _NETDEV_STATE_MAX,
78         _NETDEV_STATE_INVALID = -1,
79 } NetDevState;
80
81 struct NetDev {
82         Manager *manager;
83
84         char *filename;
85
86         Condition *match_host;
87         Condition *match_virt;
88         Condition *match_kernel;
89         Condition *match_arch;
90
91         char *description;
92         char *name;
93         NetDevKind kind;
94
95         uint64_t vlanid;
96         int32_t macvlan_mode;
97
98         int ifindex;
99         NetDevState state;
100
101         LIST_HEAD(netdev_enslave_callback, callbacks);
102 };
103
104 struct Network {
105         Manager *manager;
106
107         char *filename;
108
109         struct ether_addr *match_mac;
110         char *match_path;
111         char *match_driver;
112         char *match_type;
113         char *match_name;
114         Condition *match_host;
115         Condition *match_virt;
116         Condition *match_kernel;
117         Condition *match_arch;
118
119         char *description;
120         NetDev *bridge;
121         NetDev *bond;
122         Hashmap *vlans;
123         Hashmap *macvlans;
124         bool dhcp;
125         bool dhcp_dns;
126         bool dhcp_mtu;
127         bool dhcp_hostname;
128         bool dhcp_domainname;
129         bool dhcp_critical;
130         bool ipv4ll;
131
132         LIST_HEAD(Address, static_addresses);
133         LIST_HEAD(Route, static_routes);
134
135         Hashmap *addresses_by_section;
136         Hashmap *routes_by_section;
137
138         Set *dns;
139
140         LIST_FIELDS(Network, networks);
141 };
142
143 struct Address {
144         Network *network;
145         uint64_t section;
146
147         unsigned char family;
148         unsigned char prefixlen;
149         unsigned char scope;
150         char *label;
151
152         struct in_addr broadcast;
153
154         union {
155                 struct in_addr in;
156                 struct in6_addr in6;
157         } in_addr;
158
159         LIST_FIELDS(Address, static_addresses);
160 };
161
162 struct Route {
163         Network *network;
164         uint64_t section;
165
166         unsigned char family;
167         unsigned char dst_prefixlen;
168         unsigned char scope;
169         uint32_t metrics;
170
171         union {
172                 struct in_addr in;
173                 struct in6_addr in6;
174         } in_addr;
175
176         union {
177                 struct in_addr in;
178                 struct in6_addr in6;
179         } dst_addr;
180
181         LIST_FIELDS(Route, static_routes);
182 };
183
184 typedef enum LinkState {
185         LINK_STATE_ENSLAVING,
186         LINK_STATE_SETTING_ADDRESSES,
187         LINK_STATE_SETTING_ROUTES,
188         LINK_STATE_CONFIGURED,
189         LINK_STATE_FAILED,
190         _LINK_STATE_MAX,
191         _LINK_STATE_INVALID = -1
192 } LinkState;
193
194 struct Link {
195         Manager *manager;
196
197         uint64_t ifindex;
198         char *ifname;
199         char *state_file;
200         struct ether_addr mac;
201         struct udev_device *udev_device;
202
203         unsigned flags;
204
205         Network *network;
206
207         LinkState state;
208
209         unsigned addr_messages;
210         unsigned route_messages;
211         unsigned enslaving;
212
213         sd_dhcp_client *dhcp_client;
214         sd_dhcp_lease *dhcp_lease;
215         uint16_t original_mtu;
216         sd_ipv4ll *ipv4ll;
217 };
218
219 struct Manager {
220         sd_rtnl *rtnl;
221         sd_event *event;
222         sd_bus *bus;
223         struct udev *udev;
224         struct udev_monitor *udev_monitor;
225         sd_event_source *udev_event_source;
226         sd_event_source *sigterm_event_source;
227         sd_event_source *sigint_event_source;
228
229         Hashmap *links;
230         Hashmap *netdevs;
231         LIST_HEAD(Network, networks);
232
233         usec_t network_dirs_ts_usec;
234 };
235
236 extern const char* const network_dirs[];
237
238 /* Manager */
239
240 int manager_new(Manager **ret);
241 void manager_free(Manager *m);
242
243 int manager_load_config(Manager *m);
244 bool manager_should_reload(Manager *m);
245
246 int manager_udev_enumerate_links(Manager *m);
247 int manager_udev_listen(Manager *m);
248
249 int manager_rtnl_listen(Manager *m);
250 int manager_bus_listen(Manager *m);
251
252 int manager_update_resolv_conf(Manager *m);
253
254 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
255 #define _cleanup_manager_free_ _cleanup_(manager_freep)
256
257 /* NetDev */
258
259 int netdev_load(Manager *manager);
260
261 void netdev_free(NetDev *netdev);
262
263 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_free);
264 #define _cleanup_netdev_free_ _cleanup_(netdev_freep)
265
266 int netdev_get(Manager *manager, const char *name, NetDev **ret);
267 int netdev_set_ifindex(NetDev *netdev, int ifindex);
268 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
269
270 const char *netdev_kind_to_string(NetDevKind d) _const_;
271 NetDevKind netdev_kind_from_string(const char *d) _pure_;
272
273 const char *macvlan_mode_to_string(MacVlanMode d) _const_;
274 MacVlanMode macvlan_mode_from_string(const char *d) _pure_;
275
276 int config_parse_netdev_kind(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
277
278 int config_parse_macvlan_mode(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
279
280 /* gperf */
281 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
282
283 /* Network */
284
285 int network_load(Manager *manager);
286
287 void network_free(Network *network);
288
289 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
290 #define _cleanup_network_free_ _cleanup_(network_freep)
291
292 int network_get(Manager *manager, struct udev_device *device, Network **ret);
293 int network_apply(Manager *manager, Network *network, Link *link);
294
295 int config_parse_bridge(const char *unit, const char *filename, unsigned line,
296                         const char *section, unsigned section_line, const char *lvalue,
297                         int ltype, const char *rvalue, void *data, void *userdata);
298
299 int config_parse_bond(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_vlan(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_macvlan(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 /* gperf */
312 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
313
314 /* Route */
315 int route_new_static(Network *network, unsigned section, Route **ret);
316 int route_new_dynamic(Route **ret);
317 void route_free(Route *route);
318 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
319 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
320
321
322 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
323 #define _cleanup_route_free_ _cleanup_(route_freep)
324
325 int config_parse_gateway(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 int config_parse_destination(const char *unit, const char *filename, unsigned line,
330                              const char *section, unsigned section_line, const char *lvalue,
331                              int ltype, const char *rvalue, void *data, void *userdata);
332
333 /* Address */
334 int address_new_static(Network *network, unsigned section, Address **ret);
335 int address_new_dynamic(Address **ret);
336 void address_free(Address *address);
337 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
338 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
339
340 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
341 #define _cleanup_address_free_ _cleanup_(address_freep)
342
343 int config_parse_dns(const char *unit, const char *filename, unsigned line,
344                      const char *section, unsigned section_line, const char *lvalue,
345                      int ltype, const char *rvalue, void *data, void *userdata);
346
347 int config_parse_address(const char *unit, const char *filename, unsigned line,
348                          const char *section, unsigned section_line, const char *lvalue,
349                          int ltype, const char *rvalue, void *data, void *userdata);
350
351 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
352                            const char *section, unsigned section_line, const char *lvalue,
353                            int ltype, const char *rvalue, void *data, void *userdata);
354
355 int config_parse_label(const char *unit, const char *filename, unsigned line,
356                        const char *section, unsigned section_line, const char *lvalue,
357                        int ltype, const char *rvalue, void *data, void *userdata);
358
359 /* Link */
360
361 int link_new(Manager *manager, struct udev_device *device, Link **ret);
362 void link_free(Link *link);
363 int link_get(Manager *m, int ifindex, Link **ret);
364 int link_add(Manager *manager, struct udev_device *device, Link **ret);
365
366 int link_update(Link *link, sd_rtnl_message *message);
367
368 int link_save(Link *link);
369
370 const char* link_state_to_string(LinkState s) _const_;
371 LinkState link_state_from_string(const char *s) _pure_;
372
373 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
374 #define _cleanup_link_free_ _cleanup_(link_freep)
375
376 /* Macros which append INTERFACE= to the message */
377
378 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%s: " fmt, link->ifname, ##__VA_ARGS__)
379 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
380 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
381 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
382 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
383 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
384
385 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
386
387 /* More macros which append INTERFACE= to the message */
388
389 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->name, "%s: " fmt, netdev->name, ##__VA_ARGS__)
390 #define log_debug_netdev(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
391 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
392 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
393 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
394 #define log_error_netdev(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
395
396 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->name, __VA_ARGS__)
397
398 #define NETDEV(netdev) "INTERFACE=%s", netdev->name
399 #define ADDRESS_FMT_VAL(address)            \
400         (address).s_addr & 0xFF,            \
401         ((address).s_addr >> 8) & 0xFF,     \
402         ((address).s_addr >> 16) & 0xFF,    \
403         (address).s_addr >> 24