]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd.h
build-sys: properly enable the networkd dbus activation
[thirdparty/systemd.git] / src / network / networkd.h
CommitLineData
f579559b
TG
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>
f579559b
TG
25
26#include "sd-event.h"
27#include "sd-rtnl.h"
1346b1f0 28#include "sd-bus.h"
f5be5601 29#include "sd-dhcp-client.h"
dd43110f 30#include "sd-dhcp-server.h"
5c1d3fc9 31#include "sd-ipv4ll.h"
4138fb2c
PF
32#include "sd-icmp6-nd.h"
33#include "sd-dhcp6-client.h"
f579559b 34#include "udev.h"
ce43e484 35#include "sd-lldp.h"
f579559b
TG
36
37#include "rtnl-util.h"
38#include "hashmap.h"
39#include "list.h"
06f021a8 40#include "set.h"
134e56dc 41#include "condition.h"
3b653205 42#include "in-addr-util.h"
f579559b 43
aba496a5 44#define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
4faefc7f
LP
45#define DHCP_ROUTE_METRIC 1024
46#define IPV4LL_ROUTE_METRIC 2048
aba496a5 47
1a436809 48typedef struct NetDev NetDev;
f579559b
TG
49typedef struct Network Network;
50typedef struct Link Link;
51typedef struct Address Address;
52typedef struct Route Route;
53typedef struct Manager Manager;
11bf3cce 54typedef struct AddressPool AddressPool;
b98b483b 55typedef struct FdbEntry FdbEntry;
f579559b 56
cb9fc36a 57typedef enum AddressFamilyBoolean {
769d324c
LP
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,
cb9fc36a
LP
63 _ADDRESS_FAMILY_BOOLEAN_MAX,
64 _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
65} AddressFamilyBoolean;
ed942a9e 66
bd8f6538
TG
67typedef 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
e331e246
TG
75typedef 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
b98b483b
AR
86struct 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
f579559b
TG
96struct Network {
97 Manager *manager;
98
99 char *filename;
100
101 struct ether_addr *match_mac;
102 char *match_path;
103 char *match_driver;
104 char *match_type;
105 char *match_name;
edb85f0d
SS
106 char *dhcp_vendor_class_identifier;
107
2cc412b5
TG
108 Condition *match_host;
109 Condition *match_virt;
110 Condition *match_kernel;
edbb03e9 111 Condition *match_arch;
f579559b
TG
112
113 char *description;
1a436809
TG
114 NetDev *bridge;
115 NetDev *bond;
6a0a2f86 116 Hashmap *stacked_netdevs;
cb9fc36a 117 AddressFamilyBoolean dhcp;
5be4d38e 118 bool dhcp_dns;
bcb7a07e 119 bool dhcp_ntp;
4f882b2a 120 bool dhcp_mtu;
1346b1f0 121 bool dhcp_hostname;
ad0734e8 122 bool dhcp_domains;
4cc7a82c 123 bool dhcp_sendhost;
f5de5b00 124 bool dhcp_broadcast;
eb27aeca 125 bool dhcp_critical;
e1ea665e 126 bool dhcp_routes;
84b5b79a 127 unsigned dhcp_route_metric;
5c1d3fc9 128 bool ipv4ll;
bfa695b5 129 bool ipv4ll_route;
f579559b 130
dd43110f
TG
131 bool dhcp_server;
132
e1853b00
SS
133 unsigned cost;
134
769d324c 135 AddressFamilyBoolean ip_forward;
5a8bcb67 136 bool ip_masquerade;
5a8bcb67 137
c106cc36
TG
138 struct ether_addr *mac;
139 unsigned mtu;
140
ce43e484
SS
141 bool lldp;
142
f048a16b
TG
143 LIST_HEAD(Address, static_addresses);
144 LIST_HEAD(Route, static_routes);
b98b483b 145 LIST_HEAD(FdbEntry, static_fdb_entries);
f579559b 146
6ae115c1
TG
147 Hashmap *addresses_by_section;
148 Hashmap *routes_by_section;
b98b483b 149 Hashmap *fdb_entries_by_section;
6ae115c1 150
67272d15 151 bool wildcard_domain;
6192b846 152 char **domains, **dns, **ntp;
06f021a8 153
bd8f6538
TG
154 LLMNRSupport llmnr;
155
f579559b
TG
156 LIST_FIELDS(Network, networks);
157};
158
159struct Address {
160 Network *network;
16aa63a0 161 unsigned section;
f579559b 162
0dd25fb9 163 int family;
f579559b 164 unsigned char prefixlen;
5c1d3fc9 165 unsigned char scope;
81163121 166 unsigned char flags;
f579559b
TG
167 char *label;
168
eb0ea358 169 struct in_addr broadcast;
aba496a5 170 struct ifa_cacheinfo cinfo;
8cd11a0f 171
5d3de3fe 172 union in_addr_union in_addr;
c081882f 173 union in_addr_union in_addr_peer;
f579559b 174
fd6d906c 175 bool ip_masquerade_done;
5a8bcb67 176
3d3d4255 177 LIST_FIELDS(Address, addresses);
f579559b
TG
178};
179
180struct Route {
181 Network *network;
16aa63a0 182 unsigned section;
f579559b 183
0dd25fb9 184 int family;
6ae115c1 185 unsigned char dst_prefixlen;
9e7e4408 186 unsigned char src_prefixlen;
5c1d3fc9
UTL
187 unsigned char scope;
188 uint32_t metrics;
28cc555d 189 unsigned char protocol; /* RTPROT_* */
f579559b 190
5d3de3fe
LP
191 union in_addr_union in_addr;
192 union in_addr_union dst_addr;
9e7e4408 193 union in_addr_union src_addr;
46b0c76e 194 union in_addr_union prefsrc_addr;
6ae115c1 195
3d3d4255 196 LIST_FIELDS(Route, routes);
f579559b
TG
197};
198
11bf3cce
LP
199struct AddressPool {
200 Manager *manager;
201
0dd25fb9 202 int family;
11bf3cce
LP
203 unsigned prefixlen;
204
205 union in_addr_union in_addr;
206
207 LIST_FIELDS(AddressPool, address_pools);
208};
209
f579559b
TG
210struct Manager {
211 sd_rtnl *rtnl;
212 sd_event *event;
9c0a72f9 213 sd_event_source *bus_retry_event_source;
1346b1f0 214 sd_bus *bus;
9c0a72f9 215 sd_bus_slot *prepare_for_sleep_slot;
f579559b
TG
216 struct udev *udev;
217 struct udev_monitor *udev_monitor;
218 sd_event_source *udev_event_source;
219
6a24f148
TG
220 bool enumerating;
221
bbf7c048 222 char *state_file;
e331e246 223 LinkOperationalState operational_state;
bbf7c048 224
f579559b 225 Hashmap *links;
52433f6b 226 Hashmap *netdevs;
f579559b 227 LIST_HEAD(Network, networks);
11bf3cce 228 LIST_HEAD(AddressPool, address_pools);
f579559b 229
f579559b
TG
230 usec_t network_dirs_ts_usec;
231};
232
2ad8416d
ZJS
233extern const char* const network_dirs[];
234
f579559b
TG
235/* Manager */
236
e331e246
TG
237extern const sd_bus_vtable manager_vtable[];
238
f579559b
TG
239int manager_new(Manager **ret);
240void manager_free(Manager *m);
241
8f203c16 242int manager_connect_bus(Manager *m);
a97dcc12
TG
243int manager_run(Manager *m);
244
02b59d57
TG
245int manager_load_config(Manager *m);
246bool manager_should_reload(Manager *m);
247
505f8da7 248int manager_rtnl_enumerate_links(Manager *m);
45af44d4 249int manager_rtnl_enumerate_addresses(Manager *m);
f579559b 250
e331e246 251int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
bbf7c048 252int manager_save(Manager *m);
3bef724f 253
0dd25fb9 254int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
11bf3cce 255
f579559b
TG
256DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
257#define _cleanup_manager_free_ _cleanup_(manager_freep)
258
259/* Network */
260
261int network_load(Manager *manager);
f579559b
TG
262
263void network_free(Network *network);
264
265DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
266#define _cleanup_network_free_ _cleanup_(network_freep)
267
505f8da7
TG
268int network_get(Manager *manager, struct udev_device *device,
269 const char *ifname, const struct ether_addr *mac,
270 Network **ret);
f579559b
TG
271int network_apply(Manager *manager, Network *network, Link *link);
272
69a93e7d 273int config_parse_netdev(const char *unit, const char *filename, unsigned line,
02b59d57
TG
274 const char *section, unsigned section_line, const char *lvalue,
275 int ltype, const char *rvalue, void *data, void *userdata);
276
6192b846
TG
277int config_parse_domains(const char *unit,
278 const char *filename,
279 unsigned line,
280 const char *section,
281 unsigned section_line,
282 const char *lvalue,
283 int ltype,
284 const char *rvalue,
285 void *data,
286 void *userdata);
287
7951dea2
SS
288int config_parse_tunnel(const char *unit,
289 const char *filename,
290 unsigned line,
291 const char *section,
292 unsigned section_line,
293 const char *lvalue,
294 int ltype,
295 const char *rvalue,
296 void *data,
297 void *userdata);
298
299int config_parse_tunnel_address(const char *unit,
300 const char *filename,
301 unsigned line,
302 const char *section,
303 unsigned section_line,
304 const char *lvalue,
305 int ltype,
306 const char *rvalue,
307 void *data,
308 void *userdata);
309
85a8eeee
SS
310int config_parse_vxlan_group_address(const char *unit,
311 const char *filename,
312 unsigned line,
313 const char *section,
314 unsigned section_line,
315 const char *lvalue,
316 int ltype,
317 const char *rvalue,
318 void *data,
319 void *userdata);
320
02b59d57 321/* gperf */
c0dda186 322const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
f579559b
TG
323
324/* Route */
f048a16b 325int route_new_static(Network *network, unsigned section, Route **ret);
28cc555d 326int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
f579559b 327void route_free(Route *route);
f882c247 328int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
5c1d3fc9
UTL
329int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
330
f579559b
TG
331
332DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
333#define _cleanup_route_free_ _cleanup_(route_freep)
334
335int config_parse_gateway(const char *unit, const char *filename, unsigned line,
71a61510
TG
336 const char *section, unsigned section_line, const char *lvalue,
337 int ltype, const char *rvalue, void *data, void *userdata);
f579559b 338
6ae115c1
TG
339int config_parse_destination(const char *unit, const char *filename, unsigned line,
340 const char *section, unsigned section_line, const char *lvalue,
341 int ltype, const char *rvalue, void *data, void *userdata);
342
5d8e593d
SS
343int config_parse_route_priority(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);
f579559b 346/* Address */
f048a16b
TG
347int address_new_static(Network *network, unsigned section, Address **ret);
348int address_new_dynamic(Address **ret);
f579559b 349void address_free(Address *address);
f882c247 350int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
aba496a5 351int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
407fe036 352int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
5a8bcb67
LP
353int address_establish(Address *address, Link *link);
354int address_release(Address *address, Link *link);
9505d3c6 355bool address_equal(Address *a1, Address *a2);
f579559b
TG
356
357DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
358#define _cleanup_address_free_ _cleanup_(address_freep)
359
360int config_parse_address(const char *unit, const char *filename, unsigned line,
71a61510
TG
361 const char *section, unsigned section_line, const char *lvalue,
362 int ltype, const char *rvalue, void *data, void *userdata);
f579559b 363
eb0ea358
TG
364int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
365 const char *section, unsigned section_line, const char *lvalue,
366 int ltype, const char *rvalue, void *data, void *userdata);
367
6ae115c1
TG
368int config_parse_label(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
b98b483b
AR
372/* Forwarding database table. */
373int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
374void fdb_entry_free(FdbEntry *fdb_entry);
375int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
376
377DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
378#define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
379
380int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
381 const char *section, unsigned section_line, const char *lvalue,
382 int ltype, const char *rvalue, void *data, void *userdata);
383
384int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
385 const char *section, unsigned section_line, const char *lvalue,
386 int ltype, const char *rvalue, void *data, void *userdata);
387
ed942a9e
TG
388/* DHCP support */
389
ed942a9e
TG
390int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
391 const char *section, unsigned section_line, const char *lvalue,
392 int ltype, const char *rvalue, void *data, void *userdata);
393
bd8f6538
TG
394/* LLMNR support */
395
396const char* llmnr_support_to_string(LLMNRSupport i) _const_;
397LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
398
399int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
400 const char *section, unsigned section_line, const char *lvalue,
401 int ltype, const char *rvalue, void *data, void *userdata);
402
11bf3cce
LP
403/* Address Pool */
404
0dd25fb9
LP
405int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
406int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
11bf3cce
LP
407void address_pool_free(AddressPool *p);
408
409int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
cb9fc36a
LP
410
411const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
412AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
769d324c
LP
413
414int 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);
e331e246
TG
415
416/* Opeartional State */
417
418const char* link_operstate_to_string(LinkOperationalState s) _const_;
419LinkOperationalState link_operstate_from_string(const char *s) _pure_;