]>
Commit | Line | Data |
---|---|---|
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 | 47 | typedef struct NetDev NetDev; |
f579559b TG |
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; | |
11bf3cce | 53 | typedef struct AddressPool AddressPool; |
f579559b | 54 | |
ed942a9e TG |
55 | typedef 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 |
64 | typedef 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 |
72 | struct 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 | ||
128 | struct 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 | ||
147 | struct 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 |
166 | struct 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 |
177 | struct 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 |
195 | extern const char* const network_dirs[]; |
196 | ||
f579559b TG |
197 | /* Manager */ |
198 | ||
199 | int manager_new(Manager **ret); | |
200 | void manager_free(Manager *m); | |
201 | ||
02b59d57 TG |
202 | int manager_load_config(Manager *m); |
203 | bool manager_should_reload(Manager *m); | |
204 | ||
505f8da7 | 205 | int manager_rtnl_enumerate_links(Manager *m); |
f579559b | 206 | |
f882c247 | 207 | int manager_rtnl_listen(Manager *m); |
505f8da7 | 208 | int manager_udev_listen(Manager *m); |
1346b1f0 | 209 | int manager_bus_listen(Manager *m); |
f882c247 | 210 | |
bbf7c048 | 211 | int manager_save(Manager *m); |
3bef724f | 212 | |
0dd25fb9 | 213 | int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found); |
11bf3cce | 214 | |
f579559b TG |
215 | DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); |
216 | #define _cleanup_manager_free_ _cleanup_(manager_freep) | |
217 | ||
218 | /* Network */ | |
219 | ||
220 | int network_load(Manager *manager); | |
f579559b TG |
221 | |
222 | void network_free(Network *network); | |
223 | ||
224 | DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free); | |
225 | #define _cleanup_network_free_ _cleanup_(network_freep) | |
226 | ||
505f8da7 TG |
227 | int network_get(Manager *manager, struct udev_device *device, |
228 | const char *ifname, const struct ether_addr *mac, | |
229 | Network **ret); | |
f579559b TG |
230 | int network_apply(Manager *manager, Network *network, Link *link); |
231 | ||
69a93e7d | 232 | int 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 |
236 | int 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 |
247 | int 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 | ||
258 | int 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 |
269 | int 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 | 281 | const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length); |
f579559b TG |
282 | |
283 | /* Route */ | |
f048a16b | 284 | int route_new_static(Network *network, unsigned section, Route **ret); |
28cc555d | 285 | int route_new_dynamic(Route **ret, unsigned char rtm_protocol); |
f579559b | 286 | void route_free(Route *route); |
f882c247 | 287 | int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback); |
5c1d3fc9 UTL |
288 | int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback); |
289 | ||
f579559b TG |
290 | |
291 | DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free); | |
292 | #define _cleanup_route_free_ _cleanup_(route_freep) | |
293 | ||
294 | int 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 |
298 | int 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 |
302 | int 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 |
306 | int address_new_static(Network *network, unsigned section, Address **ret); |
307 | int address_new_dynamic(Address **ret); | |
f579559b | 308 | void address_free(Address *address); |
f882c247 | 309 | int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
aba496a5 | 310 | int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
407fe036 | 311 | int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
9505d3c6 | 312 | bool address_equal(Address *a1, Address *a2); |
f579559b TG |
313 | |
314 | DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free); | |
315 | #define _cleanup_address_free_ _cleanup_(address_freep) | |
316 | ||
317 | int 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 |
321 | int 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 |
325 | int 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 | ||
331 | const char* dhcp_support_to_string(DHCPSupport i) _const_; | |
332 | DHCPSupport dhcp_support_from_string(const char *s) _pure_; | |
333 | ||
334 | int 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 | ||
340 | const char* llmnr_support_to_string(LLMNRSupport i) _const_; | |
341 | LLMNRSupport llmnr_support_from_string(const char *s) _pure_; | |
342 | ||
343 | int 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 |
349 | int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen); |
350 | int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen); | |
11bf3cce LP |
351 | void address_pool_free(AddressPool *p); |
352 | ||
353 | int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found); |