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>
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"
36 #include "rtnl-util.h"
40 #include "condition.h"
41 #include "in-addr-util.h"
43 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
44 #define DHCP_ROUTE_METRIC 1024
45 #define IPV4LL_ROUTE_METRIC 2048
47 typedef struct NetDev NetDev;
48 typedef struct Network Network;
49 typedef struct Link Link;
50 typedef struct Address Address;
51 typedef struct Route Route;
52 typedef struct Manager Manager;
53 typedef struct AddressPool AddressPool;
55 typedef enum DHCPSupport {
61 _DHCP_SUPPORT_INVALID = -1,
64 typedef enum LLMNRSupport {
67 LLMNR_SUPPORT_RESOLVE,
69 _LLMNR_SUPPORT_INVALID = -1,
77 struct ether_addr *match_mac;
82 char *dhcp_vendor_class_identifier;
84 Condition *match_host;
85 Condition *match_virt;
86 Condition *match_kernel;
87 Condition *match_arch;
92 Hashmap *stacked_netdevs;
103 unsigned dhcp_route_metric;
111 LIST_HEAD(Address, static_addresses);
112 LIST_HEAD(Route, static_routes);
114 Hashmap *addresses_by_section;
115 Hashmap *routes_by_section;
117 bool wildcard_domain;
118 char **domains, **dns, **ntp;
122 LIST_FIELDS(Network, networks);
130 unsigned char prefixlen;
135 struct in_addr broadcast;
136 struct ifa_cacheinfo cinfo;
138 union in_addr_union in_addr;
139 union in_addr_union in_addr_peer;
141 LIST_FIELDS(Address, addresses);
149 unsigned char dst_prefixlen;
150 unsigned char src_prefixlen;
153 unsigned char protocol; /* RTPROT_* */
155 union in_addr_union in_addr;
156 union in_addr_union dst_addr;
157 union in_addr_union src_addr;
158 union in_addr_union prefsrc_addr;
160 LIST_FIELDS(Route, routes);
169 union in_addr_union in_addr;
171 LIST_FIELDS(AddressPool, address_pools);
179 struct udev_monitor *udev_monitor;
180 sd_event_source *udev_event_source;
186 LIST_HEAD(Network, networks);
187 LIST_HEAD(AddressPool, address_pools);
189 usec_t network_dirs_ts_usec;
192 extern const char* const network_dirs[];
196 int manager_new(Manager **ret);
197 void manager_free(Manager *m);
199 int manager_load_config(Manager *m);
200 bool manager_should_reload(Manager *m);
202 int manager_rtnl_enumerate_links(Manager *m);
204 int manager_rtnl_listen(Manager *m);
205 int manager_udev_listen(Manager *m);
206 int manager_bus_listen(Manager *m);
208 int manager_save(Manager *m);
210 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
212 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
213 #define _cleanup_manager_free_ _cleanup_(manager_freep)
217 int network_load(Manager *manager);
219 void network_free(Network *network);
221 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
222 #define _cleanup_network_free_ _cleanup_(network_freep)
224 int network_get(Manager *manager, struct udev_device *device,
225 const char *ifname, const struct ether_addr *mac,
227 int network_apply(Manager *manager, Network *network, Link *link);
229 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
230 const char *section, unsigned section_line, const char *lvalue,
231 int ltype, const char *rvalue, void *data, void *userdata);
233 int config_parse_domains(const char *unit,
234 const char *filename,
237 unsigned section_line,
244 int config_parse_tunnel(const char *unit,
245 const char *filename,
248 unsigned section_line,
255 int config_parse_tunnel_address(const char *unit,
256 const char *filename,
259 unsigned section_line,
266 int config_parse_vxlan_group_address(const char *unit,
267 const char *filename,
270 unsigned section_line,
278 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
281 int route_new_static(Network *network, unsigned section, Route **ret);
282 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
283 void route_free(Route *route);
284 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
285 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
288 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
289 #define _cleanup_route_free_ _cleanup_(route_freep)
291 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
292 const char *section, unsigned section_line, const char *lvalue,
293 int ltype, const char *rvalue, void *data, void *userdata);
295 int config_parse_destination(const char *unit, const char *filename, unsigned line,
296 const char *section, unsigned section_line, const char *lvalue,
297 int ltype, const char *rvalue, void *data, void *userdata);
299 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
300 const char *section, unsigned section_line, const char *lvalue,
301 int ltype, const char *rvalue, void *data, void *userdata);
303 int address_new_static(Network *network, unsigned section, Address **ret);
304 int address_new_dynamic(Address **ret);
305 void address_free(Address *address);
306 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
307 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
308 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
309 bool address_equal(Address *a1, Address *a2);
311 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
312 #define _cleanup_address_free_ _cleanup_(address_freep)
314 int config_parse_address(const char *unit, const char *filename, unsigned line,
315 const char *section, unsigned section_line, const char *lvalue,
316 int ltype, const char *rvalue, void *data, void *userdata);
318 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
319 const char *section, unsigned section_line, const char *lvalue,
320 int ltype, const char *rvalue, void *data, void *userdata);
322 int config_parse_label(const char *unit, const char *filename, unsigned line,
323 const char *section, unsigned section_line, const char *lvalue,
324 int ltype, const char *rvalue, void *data, void *userdata);
328 const char* dhcp_support_to_string(DHCPSupport i) _const_;
329 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
331 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
332 const char *section, unsigned section_line, const char *lvalue,
333 int ltype, const char *rvalue, void *data, void *userdata);
337 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
338 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
340 int config_parse_llmnr(const char *unit, const char *filename, unsigned line,
341 const char *section, unsigned section_line, const char *lvalue,
342 int ltype, const char *rvalue, void *data, void *userdata);
346 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
347 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
348 void address_pool_free(AddressPool *p);
350 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);