chiark / gitweb /
85c300982fa541f5b319f1edcfda08cbd8459b00
[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         struct ether_addr mac;
193
194         unsigned flags;
195
196         Network *network;
197
198         LinkState state;
199
200         unsigned addr_messages;
201         unsigned route_messages;
202         unsigned enslaving;
203
204         sd_dhcp_client *dhcp_client;
205         sd_dhcp_lease *dhcp_lease;
206         uint16_t original_mtu;
207 };
208
209 struct Manager {
210         sd_rtnl *rtnl;
211         sd_event *event;
212         sd_bus *bus;
213         struct udev *udev;
214         struct udev_monitor *udev_monitor;
215         sd_event_source *udev_event_source;
216         sd_event_source *sigterm_event_source;
217         sd_event_source *sigint_event_source;
218
219         Hashmap *links;
220         Hashmap *netdevs;
221         LIST_HEAD(Network, networks);
222
223         usec_t network_dirs_ts_usec;
224 };
225
226 extern const char* const network_dirs[];
227
228 /* Manager */
229
230 int manager_new(Manager **ret);
231 void manager_free(Manager *m);
232
233 int manager_load_config(Manager *m);
234 bool manager_should_reload(Manager *m);
235
236 int manager_udev_enumerate_links(Manager *m);
237 int manager_udev_listen(Manager *m);
238
239 int manager_rtnl_listen(Manager *m);
240 int manager_bus_listen(Manager *m);
241
242 int manager_update_resolv_conf(Manager *m);
243
244 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
245 #define _cleanup_manager_free_ _cleanup_(manager_freep)
246
247 /* NetDev */
248
249 int netdev_load(Manager *manager);
250
251 void netdev_free(NetDev *netdev);
252
253 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_free);
254 #define _cleanup_netdev_free_ _cleanup_(netdev_freep)
255
256 int netdev_get(Manager *manager, const char *name, NetDev **ret);
257 int netdev_set_ifindex(NetDev *netdev, int ifindex);
258 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
259
260 const char *netdev_kind_to_string(NetDevKind d) _const_;
261 NetDevKind netdev_kind_from_string(const char *d) _pure_;
262
263 const char *macvlan_mode_to_string(MacVlanMode d) _const_;
264 MacVlanMode macvlan_mode_from_string(const char *d) _pure_;
265
266 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);
267
268 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);
269
270 /* gperf */
271 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
272
273 /* Network */
274
275 int network_load(Manager *manager);
276
277 void network_free(Network *network);
278
279 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
280 #define _cleanup_network_free_ _cleanup_(network_freep)
281
282 int network_get(Manager *manager, struct udev_device *device, Network **ret);
283 int network_apply(Manager *manager, Network *network, Link *link);
284
285 int config_parse_bridge(const char *unit, const char *filename, unsigned line,
286                         const char *section, unsigned section_line, const char *lvalue,
287                         int ltype, const char *rvalue, void *data, void *userdata);
288
289 int config_parse_bond(const char *unit, const char *filename, unsigned line,
290                       const char *section, unsigned section_line, const char *lvalue,
291                       int ltype, const char *rvalue, void *data, void *userdata);
292
293 int config_parse_vlan(const char *unit, const char *filename, unsigned line,
294                       const char *section, unsigned section_line, const char *lvalue,
295                       int ltype, const char *rvalue, void *data, void *userdata);
296
297 int config_parse_macvlan(const char *unit, const char *filename, unsigned line,
298                          const char *section, unsigned section_line, const char *lvalue,
299                          int ltype, const char *rvalue, void *data, void *userdata);
300
301 /* gperf */
302 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
303
304 /* Route */
305 int route_new_static(Network *network, unsigned section, Route **ret);
306 int route_new_dynamic(Route **ret);
307 void route_free(Route *route);
308 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
309
310 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
311 #define _cleanup_route_free_ _cleanup_(route_freep)
312
313 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
314                          const char *section, unsigned section_line, const char *lvalue,
315                          int ltype, const char *rvalue, void *data, void *userdata);
316
317 int config_parse_destination(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 /* Address */
322 int address_new_static(Network *network, unsigned section, Address **ret);
323 int address_new_dynamic(Address **ret);
324 void address_free(Address *address);
325 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
326 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
327
328 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
329 #define _cleanup_address_free_ _cleanup_(address_freep)
330
331 int config_parse_dns(const char *unit, const char *filename, unsigned line,
332                      const char *section, unsigned section_line, const char *lvalue,
333                      int ltype, const char *rvalue, void *data, void *userdata);
334
335 int config_parse_address(const char *unit, const char *filename, unsigned line,
336                          const char *section, unsigned section_line, const char *lvalue,
337                          int ltype, const char *rvalue, void *data, void *userdata);
338
339 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
340                            const char *section, unsigned section_line, const char *lvalue,
341                            int ltype, const char *rvalue, void *data, void *userdata);
342
343 int config_parse_label(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 /* Link */
348
349 int link_new(Manager *manager, struct udev_device *device, Link **ret);
350 void link_free(Link *link);
351 int link_get(Manager *m, int ifindex, Link **ret);
352 int link_add(Manager *manager, struct udev_device *device, Link **ret);
353 int link_configure(Link *link);
354
355 int link_update(Link *link, sd_rtnl_message *message);
356
357 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
358 #define _cleanup_link_free_ _cleanup_(link_freep)
359
360 /* Macros which append INTERFACE= to the message */
361
362 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%s: " fmt, link->ifname, ##__VA_ARGS__)
363 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
364 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
365 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
366 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
367 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
368
369 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
370
371 /* More macros which append INTERFACE= to the message */
372
373 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->name, "%s: " fmt, netdev->name, ##__VA_ARGS__)
374 #define log_debug_netdev(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
375 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
376 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
377 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
378 #define log_error_netdev(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
379
380 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->name, __VA_ARGS__)
381
382 #define NETDEV(netdev) "INTERFACE=%s", netdev->name
383 #define ADDRESS_FMT_VAL(address)            \
384         (address).s_addr & 0xFF,            \
385         ((address).s_addr >> 8) & 0xFF,     \
386         ((address).s_addr >> 16) & 0xFF,    \
387         (address).s_addr >> 24