chiark / gitweb /
d144c11edc75af81135b80ad332d3bf35f68a0e8
[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-dhcp-server.h"
31 #include "sd-ipv4ll.h"
32 #include "sd-icmp6-nd.h"
33 #include "sd-dhcp6-client.h"
34 #include "udev.h"
35 #include "sd-lldp.h"
36
37 #include "rtnl-util.h"
38 #include "hashmap.h"
39 #include "list.h"
40 #include "set.h"
41 #include "condition.h"
42 #include "in-addr-util.h"
43
44 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
45 #define DHCP_ROUTE_METRIC 1024
46 #define IPV4LL_ROUTE_METRIC 2048
47
48 typedef struct NetDev NetDev;
49 typedef struct Network Network;
50 typedef struct Link Link;
51 typedef struct Address Address;
52 typedef struct Route Route;
53 typedef struct Manager Manager;
54 typedef struct AddressPool AddressPool;
55 typedef struct FdbEntry FdbEntry;
56
57 typedef enum AddressFamilyBoolean {
58         /* This is a bitmask, though it usually doesn't feel that way! */
59         ADDRESS_FAMILY_NO = 0,
60         ADDRESS_FAMILY_IPV4 = 1,
61         ADDRESS_FAMILY_IPV6 = 2,
62         ADDRESS_FAMILY_YES = 3,
63         _ADDRESS_FAMILY_BOOLEAN_MAX,
64         _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
65 } AddressFamilyBoolean;
66
67 typedef enum LLMNRSupport {
68         LLMNR_SUPPORT_NO,
69         LLMNR_SUPPORT_YES,
70         LLMNR_SUPPORT_RESOLVE,
71         _LLMNR_SUPPORT_MAX,
72         _LLMNR_SUPPORT_INVALID = -1,
73 } LLMNRSupport;
74
75 typedef enum LinkOperationalState {
76         LINK_OPERSTATE_OFF,
77         LINK_OPERSTATE_NO_CARRIER,
78         LINK_OPERSTATE_DORMANT,
79         LINK_OPERSTATE_CARRIER,
80         LINK_OPERSTATE_DEGRADED,
81         LINK_OPERSTATE_ROUTABLE,
82         _LINK_OPERSTATE_MAX,
83         _LINK_OPERSTATE_INVALID = -1
84 } LinkOperationalState;
85
86 struct FdbEntry {
87         Network *network;
88         unsigned section;
89
90         struct ether_addr *mac_addr;
91         uint16_t vlan_id;
92
93         LIST_FIELDS(FdbEntry, static_fdb_entries);
94 };
95
96 struct Network {
97         Manager *manager;
98
99         char *filename;
100         char *name;
101
102         struct ether_addr *match_mac;
103         char *match_path;
104         char *match_driver;
105         char *match_type;
106         char *match_name;
107         char *dhcp_vendor_class_identifier;
108
109         Condition *match_host;
110         Condition *match_virt;
111         Condition *match_kernel;
112         Condition *match_arch;
113
114         char *description;
115         NetDev *bridge;
116         NetDev *bond;
117         Hashmap *stacked_netdevs;
118         AddressFamilyBoolean dhcp;
119         bool dhcp_dns;
120         bool dhcp_ntp;
121         bool dhcp_mtu;
122         bool dhcp_hostname;
123         bool dhcp_domains;
124         bool dhcp_sendhost;
125         bool dhcp_broadcast;
126         bool dhcp_critical;
127         bool dhcp_routes;
128         unsigned dhcp_route_metric;
129         bool ipv4ll;
130         bool ipv4ll_route;
131
132         bool dhcp_server;
133
134         unsigned cost;
135
136         AddressFamilyBoolean ip_forward;
137         bool ip_masquerade;
138
139         struct ether_addr *mac;
140         unsigned mtu;
141
142         bool lldp;
143
144         LIST_HEAD(Address, static_addresses);
145         LIST_HEAD(Route, static_routes);
146         LIST_HEAD(FdbEntry, static_fdb_entries);
147
148         Hashmap *addresses_by_section;
149         Hashmap *routes_by_section;
150         Hashmap *fdb_entries_by_section;
151
152         bool wildcard_domain;
153         char **domains, **dns, **ntp;
154
155         LLMNRSupport llmnr;
156
157         LIST_FIELDS(Network, networks);
158 };
159
160 struct Address {
161         Network *network;
162         unsigned section;
163
164         int family;
165         unsigned char prefixlen;
166         unsigned char scope;
167         unsigned char flags;
168         char *label;
169
170         struct in_addr broadcast;
171         struct ifa_cacheinfo cinfo;
172
173         union in_addr_union in_addr;
174         union in_addr_union in_addr_peer;
175
176         bool ip_masquerade_done;
177
178         LIST_FIELDS(Address, addresses);
179 };
180
181 struct Route {
182         Network *network;
183         unsigned section;
184
185         int family;
186         unsigned char dst_prefixlen;
187         unsigned char src_prefixlen;
188         unsigned char scope;
189         uint32_t metrics;
190         unsigned char protocol;  /* RTPROT_* */
191
192         union in_addr_union in_addr;
193         union in_addr_union dst_addr;
194         union in_addr_union src_addr;
195         union in_addr_union prefsrc_addr;
196
197         LIST_FIELDS(Route, routes);
198 };
199
200 struct AddressPool {
201         Manager *manager;
202
203         int family;
204         unsigned prefixlen;
205
206         union in_addr_union in_addr;
207
208         LIST_FIELDS(AddressPool, address_pools);
209 };
210
211 struct Manager {
212         sd_rtnl *rtnl;
213         sd_event *event;
214         sd_event_source *bus_retry_event_source;
215         sd_bus *bus;
216         sd_bus_slot *prepare_for_sleep_slot;
217         struct udev *udev;
218         struct udev_monitor *udev_monitor;
219         sd_event_source *udev_event_source;
220
221         bool enumerating;
222
223         char *state_file;
224         LinkOperationalState operational_state;
225
226         Hashmap *links;
227         Hashmap *netdevs;
228         Hashmap *networks_by_name;
229         LIST_HEAD(Network, networks);
230         LIST_HEAD(AddressPool, address_pools);
231
232         usec_t network_dirs_ts_usec;
233 };
234
235 extern const char* const network_dirs[];
236
237 /* Manager */
238
239 extern const sd_bus_vtable manager_vtable[];
240
241 int manager_new(Manager **ret);
242 void manager_free(Manager *m);
243
244 int manager_connect_bus(Manager *m);
245 int manager_run(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 int manager_rtnl_enumerate_addresses(Manager *m);
252
253 int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
254 int manager_save(Manager *m);
255
256 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
257
258 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
259 #define _cleanup_manager_free_ _cleanup_(manager_freep)
260
261 /* Network */
262
263 int network_load(Manager *manager);
264
265 void network_free(Network *network);
266
267 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
268 #define _cleanup_network_free_ _cleanup_(network_freep)
269
270 int network_get_by_name(Manager *manager, const char *name, Network **ret);
271 int network_get(Manager *manager, struct udev_device *device,
272                 const char *ifname, const struct ether_addr *mac,
273                 Network **ret);
274 int network_apply(Manager *manager, Network *network, Link *link);
275
276 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
277                         const char *section, unsigned section_line, const char *lvalue,
278                         int ltype, const char *rvalue, void *data, void *userdata);
279
280 int config_parse_domains(const char *unit,
281                          const char *filename,
282                          unsigned line,
283                          const char *section,
284                          unsigned section_line,
285                          const char *lvalue,
286                          int ltype,
287                          const char *rvalue,
288                          void *data,
289                          void *userdata);
290
291 int config_parse_tunnel(const char *unit,
292                         const char *filename,
293                         unsigned line,
294                         const char *section,
295                         unsigned section_line,
296                         const char *lvalue,
297                         int ltype,
298                         const char *rvalue,
299                         void *data,
300                         void *userdata);
301
302 int config_parse_tunnel_address(const char *unit,
303                                 const char *filename,
304                                 unsigned line,
305                                 const char *section,
306                                 unsigned section_line,
307                                 const char *lvalue,
308                                 int ltype,
309                                 const char *rvalue,
310                                 void *data,
311                                 void *userdata);
312
313 int config_parse_vxlan_group_address(const char *unit,
314                                      const char *filename,
315                                      unsigned line,
316                                      const char *section,
317                                      unsigned section_line,
318                                      const char *lvalue,
319                                      int ltype,
320                                      const char *rvalue,
321                                      void *data,
322                                      void *userdata);
323
324 /* gperf */
325 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
326
327 /* Route */
328 int route_new_static(Network *network, unsigned section, Route **ret);
329 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
330 void route_free(Route *route);
331 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
332 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
333
334
335 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
336 #define _cleanup_route_free_ _cleanup_(route_freep)
337
338 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
339                          const char *section, unsigned section_line, const char *lvalue,
340                          int ltype, const char *rvalue, void *data, void *userdata);
341
342 int config_parse_destination(const char *unit, const char *filename, unsigned line,
343                              const char *section, unsigned section_line, const char *lvalue,
344                              int ltype, const char *rvalue, void *data, void *userdata);
345
346 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
347                                 const char *section, unsigned section_line, const char *lvalue,
348                                 int ltype, const char *rvalue, void *data, void *userdata);
349 /* Address */
350 int address_new_static(Network *network, unsigned section, Address **ret);
351 int address_new_dynamic(Address **ret);
352 void address_free(Address *address);
353 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
354 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
355 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
356 int address_establish(Address *address, Link *link);
357 int address_release(Address *address, Link *link);
358 bool address_equal(Address *a1, Address *a2);
359
360 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
361 #define _cleanup_address_free_ _cleanup_(address_freep)
362
363 int config_parse_address(const char *unit, const char *filename, unsigned line,
364                          const char *section, unsigned section_line, const char *lvalue,
365                          int ltype, const char *rvalue, void *data, void *userdata);
366
367 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
368                            const char *section, unsigned section_line, const char *lvalue,
369                            int ltype, const char *rvalue, void *data, void *userdata);
370
371 int config_parse_label(const char *unit, const char *filename, unsigned line,
372                        const char *section, unsigned section_line, const char *lvalue,
373                        int ltype, const char *rvalue, void *data, void *userdata);
374
375 /* Forwarding database table. */
376 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
377 void fdb_entry_free(FdbEntry *fdb_entry);
378 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
379
380 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
381 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
382
383 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
384                             const char *section, unsigned section_line, const char *lvalue,
385                             int ltype, const char *rvalue, void *data, void *userdata);
386
387 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
388                              const char *section, unsigned section_line, const char *lvalue,
389                              int ltype, const char *rvalue, void *data, void *userdata);
390
391 /* DHCP support */
392
393 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
394                       const char *section, unsigned section_line, const char *lvalue,
395                       int ltype, const char *rvalue, void *data, void *userdata);
396
397 /* LLMNR support */
398
399 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
400 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
401
402 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
403                       const char *section, unsigned section_line, const char *lvalue,
404                       int ltype, const char *rvalue, void *data, void *userdata);
405
406 /* Address Pool */
407
408 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
409 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
410 void address_pool_free(AddressPool *p);
411
412 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
413
414 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
415 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
416
417 int config_parse_address_family_boolean(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);
418
419 /* Opeartional State */
420
421 const char* link_operstate_to_string(LinkOperationalState s) _const_;
422 LinkOperationalState link_operstate_from_string(const char *s) _pure_;