Line data Source code
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-netlink.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 "netlink-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 : typedef enum DCHPClientIdentifier {
87 : DHCP_CLIENT_ID_MAC,
88 : DHCP_CLIENT_ID_DUID,
89 : _DHCP_CLIENT_ID_MAX,
90 : _DHCP_CLIENT_ID_INVALID = -1,
91 : } DCHPClientIdentifier;
92 :
93 : typedef enum IPv6PrivacyExtensions {
94 : /* The values map to the kernel's /proc/sys/net/ipv6/conf/xxx/use_tempaddr values */
95 : IPV6_PRIVACY_EXTENSIONS_NO,
96 : IPV6_PRIVACY_EXTENSIONS_PREFER_PUBLIC,
97 : IPV6_PRIVACY_EXTENSIONS_YES, /* aka prefer-temporary */
98 : _IPV6_PRIVACY_EXTENSIONS_MAX,
99 : _IPV6_PRIVACY_EXTENSIONS_INVALID = -1,
100 : } IPv6PrivacyExtensions;
101 :
102 : struct FdbEntry {
103 : Network *network;
104 : unsigned section;
105 :
106 : struct ether_addr *mac_addr;
107 : uint16_t vlan_id;
108 :
109 : LIST_FIELDS(FdbEntry, static_fdb_entries);
110 : };
111 :
112 : struct Network {
113 : Manager *manager;
114 :
115 : char *filename;
116 : char *name;
117 :
118 : struct ether_addr *match_mac;
119 : char **match_path;
120 : char **match_driver;
121 : char **match_type;
122 : char **match_name;
123 :
124 : Condition *match_host;
125 : Condition *match_virt;
126 : Condition *match_kernel;
127 : Condition *match_arch;
128 :
129 : char *description;
130 : NetDev *bridge;
131 : NetDev *bond;
132 : Hashmap *stacked_netdevs;
133 : AddressFamilyBoolean dhcp;
134 : DCHPClientIdentifier dhcp_client_identifier;
135 : char *dhcp_vendor_class_identifier;
136 : char *hostname;
137 : bool dhcp_dns;
138 : bool dhcp_ntp;
139 : bool dhcp_mtu;
140 : bool dhcp_hostname;
141 : bool dhcp_domains;
142 : bool dhcp_sendhost;
143 : bool dhcp_broadcast;
144 : bool dhcp_critical;
145 : bool dhcp_routes;
146 : unsigned dhcp_route_metric;
147 : AddressFamilyBoolean link_local;
148 : bool ipv4ll_route;
149 : union in_addr_union ipv6_token;
150 :
151 : bool dhcp_server;
152 :
153 : bool use_bpdu;
154 : bool hairpin;
155 : bool fast_leave;
156 : bool allow_port_to_be_root;
157 : bool unicast_flood;
158 : unsigned cost;
159 :
160 : AddressFamilyBoolean ip_forward;
161 : bool ip_masquerade;
162 :
163 : IPv6PrivacyExtensions ipv6_privacy_extensions;
164 :
165 : struct ether_addr *mac;
166 : unsigned mtu;
167 :
168 : bool lldp;
169 :
170 : LIST_HEAD(Address, static_addresses);
171 : LIST_HEAD(Route, static_routes);
172 : LIST_HEAD(FdbEntry, static_fdb_entries);
173 :
174 : Hashmap *addresses_by_section;
175 : Hashmap *routes_by_section;
176 : Hashmap *fdb_entries_by_section;
177 :
178 : bool wildcard_domain;
179 : char **domains, **dns, **ntp, **bind_carrier;
180 :
181 : LLMNRSupport llmnr;
182 :
183 : LIST_FIELDS(Network, networks);
184 : };
185 :
186 : struct Address {
187 : Network *network;
188 : unsigned section;
189 :
190 : int family;
191 : unsigned char prefixlen;
192 : unsigned char scope;
193 : uint32_t flags;
194 : char *label;
195 :
196 : struct in_addr broadcast;
197 : struct ifa_cacheinfo cinfo;
198 :
199 : union in_addr_union in_addr;
200 : union in_addr_union in_addr_peer;
201 :
202 : bool ip_masquerade_done;
203 :
204 : LIST_FIELDS(Address, addresses);
205 : };
206 :
207 : struct Route {
208 : Network *network;
209 : unsigned section;
210 :
211 : int family;
212 : unsigned char dst_prefixlen;
213 : unsigned char src_prefixlen;
214 : unsigned char scope;
215 : uint32_t metrics;
216 : unsigned char protocol; /* RTPROT_* */
217 :
218 : union in_addr_union in_addr;
219 : union in_addr_union dst_addr;
220 : union in_addr_union src_addr;
221 : union in_addr_union prefsrc_addr;
222 :
223 : LIST_FIELDS(Route, routes);
224 : };
225 :
226 : struct AddressPool {
227 : Manager *manager;
228 :
229 : int family;
230 : unsigned prefixlen;
231 :
232 : union in_addr_union in_addr;
233 :
234 : LIST_FIELDS(AddressPool, address_pools);
235 : };
236 :
237 : struct Manager {
238 : sd_netlink *rtnl;
239 : sd_event *event;
240 : sd_event_source *bus_retry_event_source;
241 : sd_bus *bus;
242 : sd_bus_slot *prepare_for_sleep_slot;
243 : struct udev *udev;
244 : struct udev_monitor *udev_monitor;
245 : sd_event_source *udev_event_source;
246 :
247 : bool enumerating;
248 :
249 : char *state_file;
250 : LinkOperationalState operational_state;
251 :
252 : Hashmap *links;
253 : Hashmap *netdevs;
254 : Hashmap *networks_by_name;
255 : LIST_HEAD(Network, networks);
256 : LIST_HEAD(AddressPool, address_pools);
257 :
258 : usec_t network_dirs_ts_usec;
259 : };
260 :
261 : extern const char* const network_dirs[];
262 :
263 : /* Manager */
264 :
265 : extern const sd_bus_vtable manager_vtable[];
266 :
267 : int manager_new(Manager **ret);
268 : void manager_free(Manager *m);
269 :
270 : int manager_connect_bus(Manager *m);
271 : int manager_run(Manager *m);
272 :
273 : int manager_load_config(Manager *m);
274 : bool manager_should_reload(Manager *m);
275 :
276 : int manager_rtnl_enumerate_links(Manager *m);
277 : int manager_rtnl_enumerate_addresses(Manager *m);
278 :
279 : int manager_send_changed(Manager *m, const char *property, ...) _sentinel_;
280 : int manager_save(Manager *m);
281 :
282 : int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
283 :
284 2 : DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
285 : #define _cleanup_manager_free_ _cleanup_(manager_freep)
286 :
287 : /* Network */
288 :
289 : int network_load(Manager *manager);
290 :
291 : void network_free(Network *network);
292 :
293 3 : DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
294 : #define _cleanup_network_free_ _cleanup_(network_freep)
295 :
296 : int network_get_by_name(Manager *manager, const char *name, Network **ret);
297 : int network_get(Manager *manager, struct udev_device *device,
298 : const char *ifname, const struct ether_addr *mac,
299 : Network **ret);
300 : int network_apply(Manager *manager, Network *network, Link *link);
301 :
302 : int config_parse_netdev(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);
305 :
306 : int config_parse_domains(const char *unit,
307 : const char *filename,
308 : unsigned line,
309 : const char *section,
310 : unsigned section_line,
311 : const char *lvalue,
312 : int ltype,
313 : const char *rvalue,
314 : void *data,
315 : void *userdata);
316 :
317 : int config_parse_tunnel(const char *unit,
318 : const char *filename,
319 : unsigned line,
320 : const char *section,
321 : unsigned section_line,
322 : const char *lvalue,
323 : int ltype,
324 : const char *rvalue,
325 : void *data,
326 : void *userdata);
327 :
328 : extern const sd_bus_vtable network_vtable[];
329 :
330 : int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
331 : int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
332 :
333 : /* gperf */
334 : const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
335 :
336 : /* Route */
337 : int route_new_static(Network *network, unsigned section, Route **ret);
338 : int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
339 : void route_free(Route *route);
340 : int route_configure(Route *route, Link *link, sd_netlink_message_handler_t callback);
341 : int route_drop(Route *route, Link *link, sd_netlink_message_handler_t callback);
342 :
343 :
344 0 : DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
345 : #define _cleanup_route_free_ _cleanup_(route_freep)
346 :
347 : int config_parse_gateway(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_destination(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 :
355 : int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
356 : const char *section, unsigned section_line, const char *lvalue,
357 : int ltype, const char *rvalue, void *data, void *userdata);
358 :
359 : int config_parse_route_scope(const char *unit, const char *filename, unsigned line,
360 : const char *section, unsigned section_line, const char *lvalue,
361 : int ltype, const char *rvalue, void *data, void *userdata);
362 : /* Address */
363 : int address_new_static(Network *network, unsigned section, Address **ret);
364 : int address_new_dynamic(Address **ret);
365 : void address_free(Address *address);
366 : int address_configure(Address *address, Link *link, sd_netlink_message_handler_t callback);
367 : int address_update(Address *address, Link *link, sd_netlink_message_handler_t callback);
368 : int address_drop(Address *address, Link *link, sd_netlink_message_handler_t callback);
369 : int address_establish(Address *address, Link *link);
370 : int address_release(Address *address, Link *link);
371 : bool address_equal(Address *a1, Address *a2);
372 :
373 6 : DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
374 : #define _cleanup_address_free_ _cleanup_(address_freep)
375 :
376 : int config_parse_address(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 : int config_parse_broadcast(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 :
384 : int config_parse_label(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 :
388 : /* Forwarding database table. */
389 : int fdb_entry_configure(Link *const link, FdbEntry *const fdb_entry);
390 : void fdb_entry_free(FdbEntry *fdb_entry);
391 : int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
392 :
393 0 : DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
394 : #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
395 :
396 : int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line,
397 : const char *section, unsigned section_line, const char *lvalue,
398 : int ltype, const char *rvalue, void *data, void *userdata);
399 :
400 : int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
401 : const char *section, unsigned section_line, const char *lvalue,
402 : int ltype, const char *rvalue, void *data, void *userdata);
403 :
404 : /* DHCP support */
405 :
406 : int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
407 : const char *section, unsigned section_line, const char *lvalue,
408 : int ltype, const char *rvalue, void *data, void *userdata);
409 : int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line,
410 : const char *section, unsigned section_line, const char *lvalue,
411 : int ltype, const char *rvalue, void *data, void *userdata);
412 :
413 : /* IPv4LL support (legacy) */
414 :
415 : int config_parse_ipv4ll(const char *unit, const char *filename, unsigned line,
416 : const char *section, unsigned section_line, const char *lvalue,
417 : int ltype, const char *rvalue, void *data, void *userdata);
418 :
419 : /* IPv6 support */
420 : int config_parse_ipv6token(const char *unit, const char *filename, unsigned line,
421 : const char *section, unsigned section_line, const char *lvalue,
422 : int ltype, const char *rvalue, void *data, void *userdata);
423 :
424 : /* LLMNR support */
425 :
426 : const char* llmnr_support_to_string(LLMNRSupport i) _const_;
427 : LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
428 :
429 : int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
430 : const char *section, unsigned section_line, const char *lvalue,
431 : int ltype, const char *rvalue, void *data, void *userdata);
432 :
433 : /* Address Pool */
434 :
435 : int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
436 : int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
437 : void address_pool_free(AddressPool *p);
438 :
439 : int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
440 :
441 : const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
442 : AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
443 :
444 : 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);
445 :
446 : /* IPForwarding parser */
447 : int config_parse_address_family_boolean_with_kernel(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);
448 :
449 : /* Operational State */
450 :
451 : const char* link_operstate_to_string(LinkOperationalState s) _const_;
452 : LinkOperationalState link_operstate_from_string(const char *s) _pure_;
453 :
454 : /* IPv6 privacy extensions support */
455 :
456 : const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;
457 : IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
458 :
459 : int config_parse_ipv6_privacy_extensions(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);
460 :
461 :
462 : /* Hostname */
463 : int config_parse_hostname(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);
|