chiark / gitweb /
networkd: add basic org.freedesktop.network1.Network interface
[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
108         Condition *match_host;
109         Condition *match_virt;
110         Condition *match_kernel;
111         Condition *match_arch;
112
113         char *description;
114         NetDev *bridge;
115         NetDev *bond;
116         Hashmap *stacked_netdevs;
117         AddressFamilyBoolean dhcp;
118         char *dhcp_vendor_class_identifier;
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 extern const sd_bus_vtable network_vtable[];
325
326 int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
327 int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
328
329 /* gperf */
330 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
331
332 /* Route */
333 int route_new_static(Network *network, unsigned section, Route **ret);
334 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
335 void route_free(Route *route);
336 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
337 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
338
339
340 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
341 #define _cleanup_route_free_ _cleanup_(route_freep)
342
343 int config_parse_gateway(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 int config_parse_destination(const char *unit, const char *filename, unsigned line,
348                              const char *section, unsigned section_line, const char *lvalue,
349                              int ltype, const char *rvalue, void *data, void *userdata);
350
351 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
352                                 const char *section, unsigned section_line, const char *lvalue,
353                                 int ltype, const char *rvalue, void *data, void *userdata);
354 /* Address */
355 int address_new_static(Network *network, unsigned section, Address **ret);
356 int address_new_dynamic(Address **ret);
357 void address_free(Address *address);
358 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
359 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
360 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
361 int address_establish(Address *address, Link *link);
362 int address_release(Address *address, Link *link);
363 bool address_equal(Address *a1, Address *a2);
364
365 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
366 #define _cleanup_address_free_ _cleanup_(address_freep)
367
368 int config_parse_address(const char *unit, const char *filename, unsigned line,
369                          const char *section, unsigned section_line, const char *lvalue,
370                          int ltype, const char *rvalue, void *data, void *userdata);
371
372 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
373                            const char *section, unsigned section_line, const char *lvalue,
374                            int ltype, const char *rvalue, void *data, void *userdata);
375
376 int config_parse_label(const char *unit, const char *filename, unsigned line,
377                        const char *section, unsigned section_line, const char *lvalue,
378                        int ltype, const char *rvalue, void *data, void *userdata);
379
380 /* Forwarding database table. */
381 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
382 void fdb_entry_free(FdbEntry *fdb_entry);
383 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
384
385 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
386 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
387
388 int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
389                             const char *section, unsigned section_line, const char *lvalue,
390                             int ltype, const char *rvalue, void *data, void *userdata);
391
392 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
393                              const char *section, unsigned section_line, const char *lvalue,
394                              int ltype, const char *rvalue, void *data, void *userdata);
395
396 /* DHCP support */
397
398 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
399                       const char *section, unsigned section_line, const char *lvalue,
400                       int ltype, const char *rvalue, void *data, void *userdata);
401
402 /* LLMNR support */
403
404 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
405 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
406
407 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
408                       const char *section, unsigned section_line, const char *lvalue,
409                       int ltype, const char *rvalue, void *data, void *userdata);
410
411 /* Address Pool */
412
413 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
414 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
415 void address_pool_free(AddressPool *p);
416
417 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
418
419 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
420 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
421
422 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);
423
424 /* Opeartional State */
425
426 const char* link_operstate_to_string(LinkOperationalState s) _const_;
427 LinkOperationalState link_operstate_from_string(const char *s) _pure_;