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