chiark / gitweb /
26d7f6baa65f16dd3cf93f8197de6eb6184dc3c7
[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 #include <linux/rtnetlink.h>
26
27 #include "sd-event.h"
28 #include "sd-rtnl.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
36 typedef struct Bridge Bridge;
37 typedef struct Network Network;
38 typedef struct Link Link;
39 typedef struct Address Address;
40 typedef struct Route Route;
41 typedef struct Manager Manager;
42
43 typedef struct bridge_join_callback bridge_join_callback;
44
45 struct bridge_join_callback {
46         sd_rtnl_message_handler_t callback;
47         Link *link;
48
49         LIST_FIELDS(bridge_join_callback, callbacks);
50 };
51
52 typedef enum BridgeState {
53         BRIDGE_STATE_FAILED,
54         BRIDGE_STATE_CREATING,
55         BRIDGE_STATE_READY,
56         _BRIDGE_STATE_MAX,
57         _BRIDGE_STATE_INVALID = -1,
58 } BridgeState;
59
60 struct Bridge {
61         Manager *manager;
62
63         char *filename;
64
65         char *description;
66         char *name;
67
68         Link *link;
69         BridgeState state;
70
71         LIST_HEAD(bridge_join_callback, callbacks);
72 };
73
74 struct Network {
75         Manager *manager;
76
77         char *filename;
78
79         struct ether_addr *match_mac;
80         char *match_path;
81         char *match_driver;
82         char *match_type;
83         char *match_name;
84
85         char *description;
86         Bridge *bridge;
87         bool dhcp;
88         bool dhcp_dns;
89
90         LIST_HEAD(Address, static_addresses);
91         LIST_HEAD(Route, static_routes);
92         Address *dns;
93
94         Hashmap *addresses_by_section;
95         Hashmap *routes_by_section;
96
97         LIST_FIELDS(Network, networks);
98 };
99
100 struct Address {
101         Network *network;
102         uint64_t section;
103
104         unsigned char family;
105         unsigned char prefixlen;
106         char *label;
107
108         struct in_addr netmask;
109
110         union {
111                 struct in_addr in;
112                 struct in6_addr in6;
113         } in_addr;
114
115         LIST_FIELDS(Address, static_addresses);
116 };
117
118 struct Route {
119         Network *network;
120         uint64_t section;
121
122         unsigned char family;
123         unsigned char dst_family;
124         unsigned char dst_prefixlen;
125
126         union {
127                 struct in_addr in;
128                 struct in6_addr in6;
129         } in_addr;
130
131         union {
132                 struct in_addr in;
133                 struct in6_addr in6;
134         } dst_addr;
135
136         LIST_FIELDS(Route, static_routes);
137 };
138
139 typedef enum LinkState {
140         LINK_STATE_JOINING_BRIDGE,
141         LINK_STATE_SETTING_ADDRESSES,
142         LINK_STATE_SETTING_ROUTES,
143         LINK_STATE_CONFIGURED,
144         LINK_STATE_FAILED,
145         _LINK_STATE_MAX,
146         _LINK_STATE_INVALID = -1
147 } LinkState;
148
149 struct Link {
150         Manager *manager;
151
152         uint64_t ifindex;
153         char *ifname;
154         struct ether_addr mac;
155
156         unsigned flags;
157
158         Network *network;
159
160         Route *dhcp_route;
161         Address *dhcp_address;
162         Address *dns;
163
164         LinkState state;
165
166         unsigned addr_messages;
167         unsigned route_messages;
168
169         sd_dhcp_client *dhcp;
170 };
171
172 struct Manager {
173         sd_rtnl *rtnl;
174         sd_event *event;
175         struct udev *udev;
176         struct udev_monitor *udev_monitor;
177         sd_event_source *udev_event_source;
178
179         Hashmap *links;
180         Hashmap *bridges;
181         LIST_HEAD(Network, networks);
182
183         usec_t network_dirs_ts_usec;
184 };
185
186 extern const char* const network_dirs[];
187
188 /* Manager */
189
190 int manager_new(Manager **ret);
191 void manager_free(Manager *m);
192
193 int manager_load_config(Manager *m);
194 bool manager_should_reload(Manager *m);
195
196 int manager_udev_enumerate_links(Manager *m);
197 int manager_udev_listen(Manager *m);
198
199 int manager_rtnl_listen(Manager *m);
200
201 int manager_update_resolv_conf(Manager *m);
202
203 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
204 #define _cleanup_manager_free_ _cleanup_(manager_freep)
205
206 /* Bridge */
207
208 int bridge_load(Manager *manager);
209
210 void bridge_free(Bridge *bridge);
211
212 DEFINE_TRIVIAL_CLEANUP_FUNC(Bridge*, bridge_free);
213 #define _cleanup_bridge_free_ _cleanup_(bridge_freep)
214
215 int bridge_get(Manager *manager, const char *name, Bridge **ret);
216 int bridge_set_link(Manager *m, Link *link);
217 int bridge_join(Bridge *bridge, Link *link, sd_rtnl_message_handler_t cb);
218
219 /* Network */
220
221 int network_load(Manager *manager);
222
223 void network_free(Network *network);
224
225 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
226 #define _cleanup_network_free_ _cleanup_(network_freep)
227
228 int network_get(Manager *manager, struct udev_device *device, Network **ret);
229 int network_apply(Manager *manager, Network *network, Link *link);
230
231 int config_parse_bridge(const char *unit, const char *filename, unsigned line,
232                         const char *section, unsigned section_line, const char *lvalue,
233                         int ltype, const char *rvalue, void *data, void *userdata);
234
235 /* gperf */
236
237 const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
238
239 /* Route */
240 int route_new_static(Network *network, unsigned section, Route **ret);
241 int route_new_dynamic(Route **ret);
242 void route_free(Route *route);
243 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
244
245 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
246 #define _cleanup_route_free_ _cleanup_(route_freep)
247
248 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
249                          const char *section, unsigned section_line, const char *lvalue,
250                          int ltype, const char *rvalue, void *data, void *userdata);
251
252 int config_parse_destination(const char *unit, const char *filename, unsigned line,
253                              const char *section, unsigned section_line, const char *lvalue,
254                              int ltype, const char *rvalue, void *data, void *userdata);
255
256 /* Address */
257 int address_new_static(Network *network, unsigned section, Address **ret);
258 int address_new_dynamic(Address **ret);
259 void address_free(Address *address);
260 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
261 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
262
263 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
264 #define _cleanup_address_free_ _cleanup_(address_freep)
265
266 int config_parse_dns(const char *unit, const char *filename, unsigned line,
267                      const char *section, unsigned section_line, const char *lvalue,
268                      int ltype, const char *rvalue, void *data, void *userdata);
269
270 int config_parse_address(const char *unit, const char *filename, unsigned line,
271                          const char *section, unsigned section_line, const char *lvalue,
272                          int ltype, const char *rvalue, void *data, void *userdata);
273
274 int config_parse_label(const char *unit, const char *filename, unsigned line,
275                        const char *section, unsigned section_line, const char *lvalue,
276                        int ltype, const char *rvalue, void *data, void *userdata);
277
278 /* Link */
279
280 int link_new(Manager *manager, struct udev_device *device, Link **ret);
281 void link_free(Link *link);
282 int link_add(Manager *manager, struct udev_device *device, Link **ret);
283 int link_configure(Link *link);
284
285 int link_update(Link *link, sd_rtnl_message *message);
286
287 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
288 #define _cleanup_link_free_ _cleanup_(link_freep)
289
290 /* Macros which append INTERFACE= to the message */
291
292 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%s: " fmt, link->ifname, ##__VA_ARGS__)
293 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
294 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
295 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
296 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
297 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
298
299 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
300
301 /* More macros which append INTERFACE= to the message */
302
303 #define log_full_bridge(level, bridge, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", bridge->name, "%s: " fmt, bridge->name, ##__VA_ARGS__)
304 #define log_debug_bridge(bridge, ...)       log_full_bridge(LOG_DEBUG, bridge, ##__VA_ARGS__)
305 #define log_info_bridge(bridge, ...)        log_full_bridge(LOG_INFO, bridge, ##__VA_ARGS__)
306 #define log_notice_bridge(bridge, ...)      log_full_bridge(LOG_NOTICE, bridge, ##__VA_ARGS__)
307 #define log_warning_bridge(bridge, ...)     log_full_bridge(LOG_WARNING, bridge,## __VA_ARGS__)
308 #define log_error_bridge(bridge, ...)       log_full_bridge(LOG_ERR, bridge, ##__VA_ARGS__)
309
310 #define log_struct_bridge(level, bridge, ...) log_struct(level, "INTERFACE=%s", bridge->name, __VA_ARGS__)
311
312 #define BRIDGE(bridge) "INTERFACE=%s", bridge->name
313 #define ADDRESS_FMT_VAL(address)            \
314         (address).s_addr & 0xFF,            \
315         ((address).s_addr >> 8) & 0xFF,     \
316         ((address).s_addr >> 16) & 0xFF,    \
317         (address).s_addr >> 24