]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd.h
journal: Fix navigating backwards missing entries
[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
TG
34#include "udev.h"
35
36#include "rtnl-util.h"
37#include "hashmap.h"
38#include "list.h"
06f021a8 39#include "set.h"
134e56dc 40#include "condition.h"
3b653205 41#include "in-addr-util.h"
f579559b 42
aba496a5 43#define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
4faefc7f
LP
44#define DHCP_ROUTE_METRIC 1024
45#define IPV4LL_ROUTE_METRIC 2048
aba496a5 46
1a436809 47typedef struct NetDev NetDev;
f579559b
TG
48typedef struct Network Network;
49typedef struct Link Link;
50typedef struct Address Address;
51typedef struct Route Route;
52typedef struct Manager Manager;
11bf3cce 53typedef struct AddressPool AddressPool;
f579559b 54
ed942a9e
TG
55typedef enum DHCPSupport {
56 DHCP_SUPPORT_NONE,
57 DHCP_SUPPORT_BOTH,
58 DHCP_SUPPORT_V4,
59 DHCP_SUPPORT_V6,
60 _DHCP_SUPPORT_MAX,
61 _DHCP_SUPPORT_INVALID = -1,
62} DHCPSupport;
63
bd8f6538
TG
64typedef enum LLMNRSupport {
65 LLMNR_SUPPORT_NO,
66 LLMNR_SUPPORT_YES,
67 LLMNR_SUPPORT_RESOLVE,
68 _LLMNR_SUPPORT_MAX,
69 _LLMNR_SUPPORT_INVALID = -1,
70} LLMNRSupport;
71
f579559b
TG
72struct Network {
73 Manager *manager;
74
75 char *filename;
76
77 struct ether_addr *match_mac;
78 char *match_path;
79 char *match_driver;
80 char *match_type;
81 char *match_name;
edb85f0d
SS
82 char *dhcp_vendor_class_identifier;
83
2cc412b5
TG
84 Condition *match_host;
85 Condition *match_virt;
86 Condition *match_kernel;
edbb03e9 87 Condition *match_arch;
f579559b
TG
88
89 char *description;
1a436809
TG
90 NetDev *bridge;
91 NetDev *bond;
6a0a2f86 92 Hashmap *stacked_netdevs;
ed942a9e 93 DHCPSupport dhcp;
5be4d38e 94 bool dhcp_dns;
bcb7a07e 95 bool dhcp_ntp;
4f882b2a 96 bool dhcp_mtu;
1346b1f0 97 bool dhcp_hostname;
ad0734e8 98 bool dhcp_domains;
4cc7a82c 99 bool dhcp_sendhost;
f5de5b00 100 bool dhcp_broadcast;
eb27aeca 101 bool dhcp_critical;
e1ea665e 102 bool dhcp_routes;
84b5b79a 103 unsigned dhcp_route_metric;
5c1d3fc9 104 bool ipv4ll;
bfa695b5 105 bool ipv4ll_route;
f579559b 106
dd43110f
TG
107 bool dhcp_server;
108
e1853b00
SS
109 unsigned cost;
110
c106cc36
TG
111 struct ether_addr *mac;
112 unsigned mtu;
113
f048a16b
TG
114 LIST_HEAD(Address, static_addresses);
115 LIST_HEAD(Route, static_routes);
f579559b 116
6ae115c1
TG
117 Hashmap *addresses_by_section;
118 Hashmap *routes_by_section;
119
67272d15 120 bool wildcard_domain;
6192b846 121 char **domains, **dns, **ntp;
06f021a8 122
bd8f6538
TG
123 LLMNRSupport llmnr;
124
f579559b
TG
125 LIST_FIELDS(Network, networks);
126};
127
128struct Address {
129 Network *network;
16aa63a0 130 unsigned section;
f579559b 131
0dd25fb9 132 int family;
f579559b 133 unsigned char prefixlen;
5c1d3fc9 134 unsigned char scope;
81163121 135 unsigned char flags;
f579559b
TG
136 char *label;
137
eb0ea358 138 struct in_addr broadcast;
aba496a5 139 struct ifa_cacheinfo cinfo;
8cd11a0f 140
5d3de3fe 141 union in_addr_union in_addr;
c081882f 142 union in_addr_union in_addr_peer;
f579559b 143
3d3d4255 144 LIST_FIELDS(Address, addresses);
f579559b
TG
145};
146
147struct Route {
148 Network *network;
16aa63a0 149 unsigned section;
f579559b 150
0dd25fb9 151 int family;
6ae115c1 152 unsigned char dst_prefixlen;
9e7e4408 153 unsigned char src_prefixlen;
5c1d3fc9
UTL
154 unsigned char scope;
155 uint32_t metrics;
28cc555d 156 unsigned char protocol; /* RTPROT_* */
f579559b 157
5d3de3fe
LP
158 union in_addr_union in_addr;
159 union in_addr_union dst_addr;
9e7e4408 160 union in_addr_union src_addr;
46b0c76e 161 union in_addr_union prefsrc_addr;
6ae115c1 162
3d3d4255 163 LIST_FIELDS(Route, routes);
f579559b
TG
164};
165
11bf3cce
LP
166struct AddressPool {
167 Manager *manager;
168
0dd25fb9 169 int family;
11bf3cce
LP
170 unsigned prefixlen;
171
172 union in_addr_union in_addr;
173
174 LIST_FIELDS(AddressPool, address_pools);
175};
176
f579559b
TG
177struct Manager {
178 sd_rtnl *rtnl;
179 sd_event *event;
1346b1f0 180 sd_bus *bus;
f579559b
TG
181 struct udev *udev;
182 struct udev_monitor *udev_monitor;
183 sd_event_source *udev_event_source;
184
bbf7c048
TG
185 char *state_file;
186
f579559b 187 Hashmap *links;
52433f6b 188 Hashmap *netdevs;
f579559b 189 LIST_HEAD(Network, networks);
11bf3cce 190 LIST_HEAD(AddressPool, address_pools);
f579559b 191
f579559b
TG
192 usec_t network_dirs_ts_usec;
193};
194
2ad8416d
ZJS
195extern const char* const network_dirs[];
196
f579559b
TG
197/* Manager */
198
199int manager_new(Manager **ret);
200void manager_free(Manager *m);
201
02b59d57
TG
202int manager_load_config(Manager *m);
203bool manager_should_reload(Manager *m);
204
505f8da7 205int manager_rtnl_enumerate_links(Manager *m);
f579559b 206
f882c247 207int manager_rtnl_listen(Manager *m);
505f8da7 208int manager_udev_listen(Manager *m);
1346b1f0 209int manager_bus_listen(Manager *m);
f882c247 210
bbf7c048 211int manager_save(Manager *m);
3bef724f 212
0dd25fb9 213int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
11bf3cce 214
f579559b
TG
215DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
216#define _cleanup_manager_free_ _cleanup_(manager_freep)
217
218/* Network */
219
220int network_load(Manager *manager);
f579559b
TG
221
222void network_free(Network *network);
223
224DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
225#define _cleanup_network_free_ _cleanup_(network_freep)
226
505f8da7
TG
227int network_get(Manager *manager, struct udev_device *device,
228 const char *ifname, const struct ether_addr *mac,
229 Network **ret);
f579559b
TG
230int network_apply(Manager *manager, Network *network, Link *link);
231
69a93e7d 232int config_parse_netdev(const char *unit, const char *filename, unsigned line,
02b59d57
TG
233 const char *section, unsigned section_line, const char *lvalue,
234 int ltype, const char *rvalue, void *data, void *userdata);
235
6192b846
TG
236int config_parse_domains(const char *unit,
237 const char *filename,
238 unsigned line,
239 const char *section,
240 unsigned section_line,
241 const char *lvalue,
242 int ltype,
243 const char *rvalue,
244 void *data,
245 void *userdata);
246
7951dea2
SS
247int config_parse_tunnel(const char *unit,
248 const char *filename,
249 unsigned line,
250 const char *section,
251 unsigned section_line,
252 const char *lvalue,
253 int ltype,
254 const char *rvalue,
255 void *data,
256 void *userdata);
257
258int config_parse_tunnel_address(const char *unit,
259 const char *filename,
260 unsigned line,
261 const char *section,
262 unsigned section_line,
263 const char *lvalue,
264 int ltype,
265 const char *rvalue,
266 void *data,
267 void *userdata);
268
85a8eeee
SS
269int config_parse_vxlan_group_address(const char *unit,
270 const char *filename,
271 unsigned line,
272 const char *section,
273 unsigned section_line,
274 const char *lvalue,
275 int ltype,
276 const char *rvalue,
277 void *data,
278 void *userdata);
279
02b59d57 280/* gperf */
c0dda186 281const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
f579559b
TG
282
283/* Route */
f048a16b 284int route_new_static(Network *network, unsigned section, Route **ret);
28cc555d 285int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
f579559b 286void route_free(Route *route);
f882c247 287int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
5c1d3fc9
UTL
288int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
289
f579559b
TG
290
291DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
292#define _cleanup_route_free_ _cleanup_(route_freep)
293
294int config_parse_gateway(const char *unit, const char *filename, unsigned line,
71a61510
TG
295 const char *section, unsigned section_line, const char *lvalue,
296 int ltype, const char *rvalue, void *data, void *userdata);
f579559b 297
6ae115c1
TG
298int config_parse_destination(const char *unit, const char *filename, unsigned line,
299 const char *section, unsigned section_line, const char *lvalue,
300 int ltype, const char *rvalue, void *data, void *userdata);
301
5d8e593d
SS
302int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
303 const char *section, unsigned section_line, const char *lvalue,
304 int ltype, const char *rvalue, void *data, void *userdata);
f579559b 305/* Address */
f048a16b
TG
306int address_new_static(Network *network, unsigned section, Address **ret);
307int address_new_dynamic(Address **ret);
f579559b 308void address_free(Address *address);
f882c247 309int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
aba496a5 310int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
407fe036 311int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
9505d3c6 312bool address_equal(Address *a1, Address *a2);
f579559b
TG
313
314DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
315#define _cleanup_address_free_ _cleanup_(address_freep)
316
317int config_parse_address(const char *unit, const char *filename, unsigned line,
71a61510
TG
318 const char *section, unsigned section_line, const char *lvalue,
319 int ltype, const char *rvalue, void *data, void *userdata);
f579559b 320
eb0ea358
TG
321int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
322 const char *section, unsigned section_line, const char *lvalue,
323 int ltype, const char *rvalue, void *data, void *userdata);
324
6ae115c1
TG
325int config_parse_label(const char *unit, const char *filename, unsigned line,
326 const char *section, unsigned section_line, const char *lvalue,
327 int ltype, const char *rvalue, void *data, void *userdata);
328
ed942a9e
TG
329/* DHCP support */
330
331const char* dhcp_support_to_string(DHCPSupport i) _const_;
332DHCPSupport dhcp_support_from_string(const char *s) _pure_;
333
334int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
335 const char *section, unsigned section_line, const char *lvalue,
336 int ltype, const char *rvalue, void *data, void *userdata);
337
bd8f6538
TG
338/* LLMNR support */
339
340const char* llmnr_support_to_string(LLMNRSupport i) _const_;
341LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
342
343int config_parse_llmnr(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
11bf3cce
LP
347/* Address Pool */
348
0dd25fb9
LP
349int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
350int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
11bf3cce
LP
351void address_pool_free(AddressPool *p);
352
353int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);