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
;
155 AddressFamilyBoolean ip_forward
;
158 IPv6PrivacyExtensions ipv6_privacy_extensions
;
160 struct ether_addr
*mac
;
165 LIST_HEAD(Address
, static_addresses
);
166 LIST_HEAD(Route
, static_routes
);
167 LIST_HEAD(FdbEntry
, static_fdb_entries
);
169 Hashmap
*addresses_by_section
;
170 Hashmap
*routes_by_section
;
171 Hashmap
*fdb_entries_by_section
;
173 bool wildcard_domain
;
174 char **domains
, **dns
, **ntp
, **bind_carrier
;
178 LIST_FIELDS(Network
, networks
);
186 unsigned char prefixlen
;
191 struct in_addr broadcast
;
192 struct ifa_cacheinfo cinfo
;
194 union in_addr_union in_addr
;
195 union in_addr_union in_addr_peer
;
197 bool ip_masquerade_done
;
199 LIST_FIELDS(Address
, addresses
);
207 unsigned char dst_prefixlen
;
208 unsigned char src_prefixlen
;
211 unsigned char protocol
; /* RTPROT_* */
213 union in_addr_union in_addr
;
214 union in_addr_union dst_addr
;
215 union in_addr_union src_addr
;
216 union in_addr_union prefsrc_addr
;
218 LIST_FIELDS(Route
, routes
);
227 union in_addr_union in_addr
;
229 LIST_FIELDS(AddressPool
, address_pools
);
235 sd_event_source
*bus_retry_event_source
;
237 sd_bus_slot
*prepare_for_sleep_slot
;
239 struct udev_monitor
*udev_monitor
;
240 sd_event_source
*udev_event_source
;
245 LinkOperationalState operational_state
;
249 Hashmap
*networks_by_name
;
250 LIST_HEAD(Network
, networks
);
251 LIST_HEAD(AddressPool
, address_pools
);
253 usec_t network_dirs_ts_usec
;
256 extern const char* const network_dirs
[];
260 extern const sd_bus_vtable manager_vtable
[];
262 int manager_new(Manager
**ret
);
263 void manager_free(Manager
*m
);
265 int manager_connect_bus(Manager
*m
);
266 int manager_run(Manager
*m
);
268 int manager_load_config(Manager
*m
);
269 bool manager_should_reload(Manager
*m
);
271 int manager_rtnl_enumerate_links(Manager
*m
);
272 int manager_rtnl_enumerate_addresses(Manager
*m
);
274 int manager_send_changed(Manager
*m
, const char *property
, ...) _sentinel_
;
275 int manager_save(Manager
*m
);
277 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
);
279 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
280 #define _cleanup_manager_free_ _cleanup_(manager_freep)
284 int network_load(Manager
*manager
);
286 void network_free(Network
*network
);
288 DEFINE_TRIVIAL_CLEANUP_FUNC(Network
*, network_free
);
289 #define _cleanup_network_free_ _cleanup_(network_freep)
291 int network_get_by_name(Manager
*manager
, const char *name
, Network
**ret
);
292 int network_get(Manager
*manager
, struct udev_device
*device
,
293 const char *ifname
, const struct ether_addr
*mac
,
295 int network_apply(Manager
*manager
, Network
*network
, Link
*link
);
297 int config_parse_netdev(const char *unit
, const char *filename
, unsigned line
,
298 const char *section
, unsigned section_line
, const char *lvalue
,
299 int ltype
, const char *rvalue
, void *data
, void *userdata
);
301 int config_parse_domains(const char *unit
,
302 const char *filename
,
305 unsigned section_line
,
312 int config_parse_tunnel(const char *unit
,
313 const char *filename
,
316 unsigned section_line
,
323 extern const sd_bus_vtable network_vtable
[];
325 int network_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
);
326 int network_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
);
329 const struct ConfigPerfItem
* network_network_gperf_lookup(const char *key
, unsigned length
);
332 int route_new_static(Network
*network
, unsigned section
, Route
**ret
);
333 int route_new_dynamic(Route
**ret
, unsigned char rtm_protocol
);
334 void route_free(Route
*route
);
335 int route_configure(Route
*route
, Link
*link
, sd_netlink_message_handler_t callback
);
336 int route_drop(Route
*route
, Link
*link
, sd_netlink_message_handler_t callback
);
339 DEFINE_TRIVIAL_CLEANUP_FUNC(Route
*, route_free
);
340 #define _cleanup_route_free_ _cleanup_(route_freep)
342 int config_parse_gateway(const char *unit
, const char *filename
, unsigned line
,
343 const char *section
, unsigned section_line
, const char *lvalue
,
344 int ltype
, const char *rvalue
, void *data
, void *userdata
);
346 int config_parse_destination(const char *unit
, const char *filename
, unsigned line
,
347 const char *section
, unsigned section_line
, const char *lvalue
,
348 int ltype
, const char *rvalue
, void *data
, void *userdata
);
350 int config_parse_route_priority(const char *unit
, const char *filename
, unsigned line
,
351 const char *section
, unsigned section_line
, const char *lvalue
,
352 int ltype
, const char *rvalue
, void *data
, void *userdata
);
354 int config_parse_route_scope(const char *unit
, const char *filename
, unsigned line
,
355 const char *section
, unsigned section_line
, const char *lvalue
,
356 int ltype
, const char *rvalue
, void *data
, void *userdata
);
358 int address_new_static(Network
*network
, unsigned section
, Address
**ret
);
359 int address_new_dynamic(Address
**ret
);
360 void address_free(Address
*address
);
361 int address_configure(Address
*address
, Link
*link
, sd_netlink_message_handler_t callback
);
362 int address_update(Address
*address
, Link
*link
, sd_netlink_message_handler_t callback
);
363 int address_drop(Address
*address
, Link
*link
, sd_netlink_message_handler_t callback
);
364 int address_establish(Address
*address
, Link
*link
);
365 int address_release(Address
*address
, Link
*link
);
366 bool address_equal(Address
*a1
, Address
*a2
);
368 DEFINE_TRIVIAL_CLEANUP_FUNC(Address
*, address_free
);
369 #define _cleanup_address_free_ _cleanup_(address_freep)
371 int config_parse_address(const char *unit
, const char *filename
, unsigned line
,
372 const char *section
, unsigned section_line
, const char *lvalue
,
373 int ltype
, const char *rvalue
, void *data
, void *userdata
);
375 int config_parse_broadcast(const char *unit
, const char *filename
, unsigned line
,
376 const char *section
, unsigned section_line
, const char *lvalue
,
377 int ltype
, const char *rvalue
, void *data
, void *userdata
);
379 int config_parse_label(const char *unit
, const char *filename
, unsigned line
,
380 const char *section
, unsigned section_line
, const char *lvalue
,
381 int ltype
, const char *rvalue
, void *data
, void *userdata
);
383 /* Forwarding database table. */
384 int fdb_entry_configure(Link
*const link
, FdbEntry
*const fdb_entry
);
385 void fdb_entry_free(FdbEntry
*fdb_entry
);
386 int fdb_entry_new_static(Network
*const network
, const unsigned section
, FdbEntry
**ret
);
388 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry
*, fdb_entry_free
);
389 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
391 int config_parse_fdb_hwaddr(const char *unit
, const char *filename
, unsigned line
,
392 const char *section
, unsigned section_line
, const char *lvalue
,
393 int ltype
, const char *rvalue
, void *data
, void *userdata
);
395 int config_parse_fdb_vlan_id(const char *unit
, const char *filename
, unsigned line
,
396 const char *section
, unsigned section_line
, const char *lvalue
,
397 int ltype
, const char *rvalue
, void *data
, void *userdata
);
401 int config_parse_dhcp(const char *unit
, const char *filename
, unsigned line
,
402 const char *section
, unsigned section_line
, const char *lvalue
,
403 int ltype
, const char *rvalue
, void *data
, void *userdata
);
404 int config_parse_dhcp_client_identifier(const char *unit
, const char *filename
, unsigned line
,
405 const char *section
, unsigned section_line
, const char *lvalue
,
406 int ltype
, const char *rvalue
, void *data
, void *userdata
);
408 /* IPv4LL support (legacy) */
410 int config_parse_ipv4ll(const char *unit
, const char *filename
, unsigned line
,
411 const char *section
, unsigned section_line
, const char *lvalue
,
412 int ltype
, const char *rvalue
, void *data
, void *userdata
);
415 int config_parse_ipv6token(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
);
421 const char* llmnr_support_to_string(LLMNRSupport i
) _const_
;
422 LLMNRSupport
llmnr_support_from_string(const char *s
) _pure_
;
424 int config_parse_llmnr(const char *unit
, const char *filename
, unsigned line
,
425 const char *section
, unsigned section_line
, const char *lvalue
,
426 int ltype
, const char *rvalue
, void *data
, void *userdata
);
430 int address_pool_new(Manager
*m
, AddressPool
**ret
, int family
, const union in_addr_union
*u
, unsigned prefixlen
);
431 int address_pool_new_from_string(Manager
*m
, AddressPool
**ret
, int family
, const char *p
, unsigned prefixlen
);
432 void address_pool_free(AddressPool
*p
);
434 int address_pool_acquire(AddressPool
*p
, unsigned prefixlen
, union in_addr_union
*found
);
436 const char *address_family_boolean_to_string(AddressFamilyBoolean b
) _const_
;
437 AddressFamilyBoolean
address_family_boolean_from_string(const char *s
) _const_
;
439 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
);
441 /* IPForwarding parser */
442 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
);
444 /* Operational State */
446 const char* link_operstate_to_string(LinkOperationalState s
) _const_
;
447 LinkOperationalState
link_operstate_from_string(const char *s
) _pure_
;
449 /* IPv6 privacy extensions support */
451 const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i
) _const_
;
452 IPv6PrivacyExtensions
ipv6_privacy_extensions_from_string(const char *s
) _pure_
;
454 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
);
458 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
);