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