1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
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.
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.
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/>.
24 #include <arpa/inet.h>
27 #include "sd-netlink.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"
37 #include "netlink-util.h"
41 #include "condition.h"
42 #include "in-addr-util.h"
44 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
45 #define DHCP_ROUTE_METRIC 1024
46 #define IPV4LL_ROUTE_METRIC 2048
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
;
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
;
67 typedef enum LLMNRSupport
{
70 LLMNR_SUPPORT_RESOLVE
,
72 _LLMNR_SUPPORT_INVALID
= -1,
75 typedef enum LinkOperationalState
{
77 LINK_OPERSTATE_NO_CARRIER
,
78 LINK_OPERSTATE_DORMANT
,
79 LINK_OPERSTATE_CARRIER
,
80 LINK_OPERSTATE_DEGRADED
,
81 LINK_OPERSTATE_ROUTABLE
,
83 _LINK_OPERSTATE_INVALID
= -1
84 } LinkOperationalState
;
86 typedef enum DCHPClientIdentifier
{
90 _DHCP_CLIENT_ID_INVALID
= -1,
91 } DCHPClientIdentifier
;
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
;
106 struct ether_addr
*mac_addr
;
109 LIST_FIELDS(FdbEntry
, static_fdb_entries
);
118 struct ether_addr
*match_mac
;
124 Condition
*match_host
;
125 Condition
*match_virt
;
126 Condition
*match_kernel
;
127 Condition
*match_arch
;
132 Hashmap
*stacked_netdevs
;
133 AddressFamilyBoolean dhcp
;
134 DCHPClientIdentifier dhcp_client_identifier
;
135 char *dhcp_vendor_class_identifier
;
146 unsigned dhcp_route_metric
;
147 AddressFamilyBoolean link_local
;
149 union in_addr_union ipv6_token
;
156 bool allow_port_to_be_root
;
160 AddressFamilyBoolean ip_forward
;
163 IPv6PrivacyExtensions ipv6_privacy_extensions
;
165 struct ether_addr
*mac
;
170 LIST_HEAD(Address
, static_addresses
);
171 LIST_HEAD(Route
, static_routes
);
172 LIST_HEAD(FdbEntry
, static_fdb_entries
);
174 Hashmap
*addresses_by_section
;
175 Hashmap
*routes_by_section
;
176 Hashmap
*fdb_entries_by_section
;
178 bool wildcard_domain
;
179 char **domains
, **dns
, **ntp
, **bind_carrier
;
183 LIST_FIELDS(Network
, networks
);
191 unsigned char prefixlen
;
196 struct in_addr broadcast
;
197 struct ifa_cacheinfo cinfo
;
199 union in_addr_union in_addr
;
200 union in_addr_union in_addr_peer
;
202 bool ip_masquerade_done
;
204 LIST_FIELDS(Address
, addresses
);
212 unsigned char dst_prefixlen
;
213 unsigned char src_prefixlen
;
216 unsigned char protocol
; /* RTPROT_* */
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
;
223 LIST_FIELDS(Route
, routes
);
232 union in_addr_union in_addr
;
234 LIST_FIELDS(AddressPool
, address_pools
);
240 sd_event_source
*bus_retry_event_source
;
242 sd_bus_slot
*prepare_for_sleep_slot
;
244 struct udev_monitor
*udev_monitor
;
245 sd_event_source
*udev_event_source
;
250 LinkOperationalState operational_state
;
254 Hashmap
*networks_by_name
;
255 LIST_HEAD(Network
, networks
);
256 LIST_HEAD(AddressPool
, address_pools
);
258 usec_t network_dirs_ts_usec
;
261 extern const char* const network_dirs
[];
265 extern const sd_bus_vtable manager_vtable
[];
267 int manager_new(Manager
**ret
);
268 void manager_free(Manager
*m
);
270 int manager_connect_bus(Manager
*m
);
271 int manager_run(Manager
*m
);
273 int manager_load_config(Manager
*m
);
274 bool manager_should_reload(Manager
*m
);
276 int manager_rtnl_enumerate_links(Manager
*m
);
277 int manager_rtnl_enumerate_addresses(Manager
*m
);
279 int manager_send_changed(Manager
*m
, const char *property
, ...) _sentinel_
;
280 int manager_save(Manager
*m
);
282 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
);
284 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
285 #define _cleanup_manager_free_ _cleanup_(manager_freep)
289 int network_load(Manager
*manager
);
291 void network_free(Network
*network
);
293 DEFINE_TRIVIAL_CLEANUP_FUNC(Network
*, network_free
);
294 #define _cleanup_network_free_ _cleanup_(network_freep)
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
,
300 int network_apply(Manager
*manager
, Network
*network
, Link
*link
);
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
);
306 int config_parse_domains(const char *unit
,
307 const char *filename
,
310 unsigned section_line
,
317 int config_parse_tunnel(const char *unit
,
318 const char *filename
,
321 unsigned section_line
,
328 extern const sd_bus_vtable network_vtable
[];
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
);
334 const struct ConfigPerfItem
* network_network_gperf_lookup(const char *key
, unsigned length
);
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
);
344 DEFINE_TRIVIAL_CLEANUP_FUNC(Route
*, route_free
);
345 #define _cleanup_route_free_ _cleanup_(route_freep)
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
);
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
);
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
);
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
);
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
);
373 DEFINE_TRIVIAL_CLEANUP_FUNC(Address
*, address_free
);
374 #define _cleanup_address_free_ _cleanup_(address_freep)
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
);
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
);
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
);
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
);
393 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry
*, fdb_entry_free
);
394 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
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
);
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
);
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
);
413 /* IPv4LL support (legacy) */
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
);
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
);
426 const char* llmnr_support_to_string(LLMNRSupport i
) _const_
;
427 LLMNRSupport
llmnr_support_from_string(const char *s
) _pure_
;
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
);
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
);
439 int address_pool_acquire(AddressPool
*p
, unsigned prefixlen
, union in_addr_union
*found
);
441 const char *address_family_boolean_to_string(AddressFamilyBoolean b
) _const_
;
442 AddressFamilyBoolean
address_family_boolean_from_string(const char *s
) _const_
;
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
);
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
);
449 /* Operational State */
451 const char* link_operstate_to_string(LinkOperationalState s
) _const_
;
452 LinkOperationalState
link_operstate_from_string(const char *s
) _pure_
;
454 /* IPv6 privacy extensions support */
456 const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i
) _const_
;
457 IPv6PrivacyExtensions
ipv6_privacy_extensions_from_string(const char *s
) _pure_
;
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
);
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
);