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