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