]>
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 | 34 | #include "udev.h" |
ce43e484 | 35 | #include "sd-lldp.h" |
f579559b TG |
36 | |
37 | #include "rtnl-util.h" | |
38 | #include "hashmap.h" | |
39 | #include "list.h" | |
06f021a8 | 40 | #include "set.h" |
134e56dc | 41 | #include "condition.h" |
3b653205 | 42 | #include "in-addr-util.h" |
f579559b | 43 | |
aba496a5 | 44 | #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU |
4faefc7f LP |
45 | #define DHCP_ROUTE_METRIC 1024 |
46 | #define IPV4LL_ROUTE_METRIC 2048 | |
aba496a5 | 47 | |
1a436809 | 48 | typedef struct NetDev NetDev; |
f579559b TG |
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; | |
11bf3cce | 54 | typedef struct AddressPool AddressPool; |
b98b483b | 55 | typedef struct FdbEntry FdbEntry; |
f579559b | 56 | |
cb9fc36a | 57 | typedef enum AddressFamilyBoolean { |
769d324c LP |
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, | |
cb9fc36a LP |
63 | _ADDRESS_FAMILY_BOOLEAN_MAX, |
64 | _ADDRESS_FAMILY_BOOLEAN_INVALID = -1, | |
65 | } AddressFamilyBoolean; | |
ed942a9e | 66 | |
bd8f6538 TG |
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 | ||
b98b483b AR |
75 | struct FdbEntry { |
76 | Network *network; | |
77 | unsigned section; | |
78 | ||
79 | struct ether_addr *mac_addr; | |
80 | uint16_t vlan_id; | |
81 | ||
82 | LIST_FIELDS(FdbEntry, static_fdb_entries); | |
83 | }; | |
84 | ||
f579559b TG |
85 | struct Network { |
86 | Manager *manager; | |
87 | ||
88 | char *filename; | |
89 | ||
90 | struct ether_addr *match_mac; | |
91 | char *match_path; | |
92 | char *match_driver; | |
93 | char *match_type; | |
94 | char *match_name; | |
edb85f0d SS |
95 | char *dhcp_vendor_class_identifier; |
96 | ||
2cc412b5 TG |
97 | Condition *match_host; |
98 | Condition *match_virt; | |
99 | Condition *match_kernel; | |
edbb03e9 | 100 | Condition *match_arch; |
f579559b TG |
101 | |
102 | char *description; | |
1a436809 TG |
103 | NetDev *bridge; |
104 | NetDev *bond; | |
6a0a2f86 | 105 | Hashmap *stacked_netdevs; |
cb9fc36a | 106 | AddressFamilyBoolean dhcp; |
5be4d38e | 107 | bool dhcp_dns; |
bcb7a07e | 108 | bool dhcp_ntp; |
4f882b2a | 109 | bool dhcp_mtu; |
1346b1f0 | 110 | bool dhcp_hostname; |
ad0734e8 | 111 | bool dhcp_domains; |
4cc7a82c | 112 | bool dhcp_sendhost; |
f5de5b00 | 113 | bool dhcp_broadcast; |
eb27aeca | 114 | bool dhcp_critical; |
e1ea665e | 115 | bool dhcp_routes; |
84b5b79a | 116 | unsigned dhcp_route_metric; |
5c1d3fc9 | 117 | bool ipv4ll; |
bfa695b5 | 118 | bool ipv4ll_route; |
f579559b | 119 | |
dd43110f TG |
120 | bool dhcp_server; |
121 | ||
e1853b00 SS |
122 | unsigned cost; |
123 | ||
769d324c | 124 | AddressFamilyBoolean ip_forward; |
5a8bcb67 | 125 | bool ip_masquerade; |
5a8bcb67 | 126 | |
c106cc36 TG |
127 | struct ether_addr *mac; |
128 | unsigned mtu; | |
129 | ||
ce43e484 SS |
130 | bool lldp; |
131 | ||
f048a16b TG |
132 | LIST_HEAD(Address, static_addresses); |
133 | LIST_HEAD(Route, static_routes); | |
b98b483b | 134 | LIST_HEAD(FdbEntry, static_fdb_entries); |
f579559b | 135 | |
6ae115c1 TG |
136 | Hashmap *addresses_by_section; |
137 | Hashmap *routes_by_section; | |
b98b483b | 138 | Hashmap *fdb_entries_by_section; |
6ae115c1 | 139 | |
67272d15 | 140 | bool wildcard_domain; |
6192b846 | 141 | char **domains, **dns, **ntp; |
06f021a8 | 142 | |
bd8f6538 TG |
143 | LLMNRSupport llmnr; |
144 | ||
f579559b TG |
145 | LIST_FIELDS(Network, networks); |
146 | }; | |
147 | ||
148 | struct Address { | |
149 | Network *network; | |
16aa63a0 | 150 | unsigned section; |
f579559b | 151 | |
0dd25fb9 | 152 | int family; |
f579559b | 153 | unsigned char prefixlen; |
5c1d3fc9 | 154 | unsigned char scope; |
81163121 | 155 | unsigned char flags; |
f579559b TG |
156 | char *label; |
157 | ||
eb0ea358 | 158 | struct in_addr broadcast; |
aba496a5 | 159 | struct ifa_cacheinfo cinfo; |
8cd11a0f | 160 | |
5d3de3fe | 161 | union in_addr_union in_addr; |
c081882f | 162 | union in_addr_union in_addr_peer; |
f579559b | 163 | |
fd6d906c | 164 | bool ip_masquerade_done; |
5a8bcb67 | 165 | |
3d3d4255 | 166 | LIST_FIELDS(Address, addresses); |
f579559b TG |
167 | }; |
168 | ||
169 | struct Route { | |
170 | Network *network; | |
16aa63a0 | 171 | unsigned section; |
f579559b | 172 | |
0dd25fb9 | 173 | int family; |
6ae115c1 | 174 | unsigned char dst_prefixlen; |
9e7e4408 | 175 | unsigned char src_prefixlen; |
5c1d3fc9 UTL |
176 | unsigned char scope; |
177 | uint32_t metrics; | |
28cc555d | 178 | unsigned char protocol; /* RTPROT_* */ |
f579559b | 179 | |
5d3de3fe LP |
180 | union in_addr_union in_addr; |
181 | union in_addr_union dst_addr; | |
9e7e4408 | 182 | union in_addr_union src_addr; |
46b0c76e | 183 | union in_addr_union prefsrc_addr; |
6ae115c1 | 184 | |
3d3d4255 | 185 | LIST_FIELDS(Route, routes); |
f579559b TG |
186 | }; |
187 | ||
11bf3cce LP |
188 | struct AddressPool { |
189 | Manager *manager; | |
190 | ||
0dd25fb9 | 191 | int family; |
11bf3cce LP |
192 | unsigned prefixlen; |
193 | ||
194 | union in_addr_union in_addr; | |
195 | ||
196 | LIST_FIELDS(AddressPool, address_pools); | |
197 | }; | |
198 | ||
f579559b TG |
199 | struct Manager { |
200 | sd_rtnl *rtnl; | |
201 | sd_event *event; | |
9c0a72f9 | 202 | sd_event_source *bus_retry_event_source; |
1346b1f0 | 203 | sd_bus *bus; |
9c0a72f9 | 204 | sd_bus_slot *prepare_for_sleep_slot; |
f579559b TG |
205 | struct udev *udev; |
206 | struct udev_monitor *udev_monitor; | |
207 | sd_event_source *udev_event_source; | |
208 | ||
bbf7c048 TG |
209 | char *state_file; |
210 | ||
f579559b | 211 | Hashmap *links; |
52433f6b | 212 | Hashmap *netdevs; |
f579559b | 213 | LIST_HEAD(Network, networks); |
11bf3cce | 214 | LIST_HEAD(AddressPool, address_pools); |
f579559b | 215 | |
f579559b TG |
216 | usec_t network_dirs_ts_usec; |
217 | }; | |
218 | ||
2ad8416d ZJS |
219 | extern const char* const network_dirs[]; |
220 | ||
f579559b TG |
221 | /* Manager */ |
222 | ||
223 | int manager_new(Manager **ret); | |
224 | void manager_free(Manager *m); | |
225 | ||
02b59d57 TG |
226 | int manager_load_config(Manager *m); |
227 | bool manager_should_reload(Manager *m); | |
228 | ||
505f8da7 | 229 | int manager_rtnl_enumerate_links(Manager *m); |
45af44d4 | 230 | int manager_rtnl_enumerate_addresses(Manager *m); |
f579559b | 231 | |
f882c247 | 232 | int manager_rtnl_listen(Manager *m); |
505f8da7 | 233 | int manager_udev_listen(Manager *m); |
1346b1f0 | 234 | int manager_bus_listen(Manager *m); |
f882c247 | 235 | |
bbf7c048 | 236 | int manager_save(Manager *m); |
3bef724f | 237 | |
0dd25fb9 | 238 | int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found); |
11bf3cce | 239 | |
f579559b TG |
240 | DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); |
241 | #define _cleanup_manager_free_ _cleanup_(manager_freep) | |
242 | ||
243 | /* Network */ | |
244 | ||
245 | int network_load(Manager *manager); | |
f579559b TG |
246 | |
247 | void network_free(Network *network); | |
248 | ||
249 | DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free); | |
250 | #define _cleanup_network_free_ _cleanup_(network_freep) | |
251 | ||
505f8da7 TG |
252 | int network_get(Manager *manager, struct udev_device *device, |
253 | const char *ifname, const struct ether_addr *mac, | |
254 | Network **ret); | |
f579559b TG |
255 | int network_apply(Manager *manager, Network *network, Link *link); |
256 | ||
69a93e7d | 257 | int config_parse_netdev(const char *unit, const char *filename, unsigned line, |
02b59d57 TG |
258 | const char *section, unsigned section_line, const char *lvalue, |
259 | int ltype, const char *rvalue, void *data, void *userdata); | |
260 | ||
6192b846 TG |
261 | int config_parse_domains(const char *unit, |
262 | const char *filename, | |
263 | unsigned line, | |
264 | const char *section, | |
265 | unsigned section_line, | |
266 | const char *lvalue, | |
267 | int ltype, | |
268 | const char *rvalue, | |
269 | void *data, | |
270 | void *userdata); | |
271 | ||
7951dea2 SS |
272 | int config_parse_tunnel(const char *unit, |
273 | const char *filename, | |
274 | unsigned line, | |
275 | const char *section, | |
276 | unsigned section_line, | |
277 | const char *lvalue, | |
278 | int ltype, | |
279 | const char *rvalue, | |
280 | void *data, | |
281 | void *userdata); | |
282 | ||
283 | int config_parse_tunnel_address(const char *unit, | |
284 | const char *filename, | |
285 | unsigned line, | |
286 | const char *section, | |
287 | unsigned section_line, | |
288 | const char *lvalue, | |
289 | int ltype, | |
290 | const char *rvalue, | |
291 | void *data, | |
292 | void *userdata); | |
293 | ||
85a8eeee SS |
294 | int config_parse_vxlan_group_address(const char *unit, |
295 | const char *filename, | |
296 | unsigned line, | |
297 | const char *section, | |
298 | unsigned section_line, | |
299 | const char *lvalue, | |
300 | int ltype, | |
301 | const char *rvalue, | |
302 | void *data, | |
303 | void *userdata); | |
304 | ||
02b59d57 | 305 | /* gperf */ |
c0dda186 | 306 | const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length); |
f579559b TG |
307 | |
308 | /* Route */ | |
f048a16b | 309 | int route_new_static(Network *network, unsigned section, Route **ret); |
28cc555d | 310 | int route_new_dynamic(Route **ret, unsigned char rtm_protocol); |
f579559b | 311 | void route_free(Route *route); |
f882c247 | 312 | int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback); |
5c1d3fc9 UTL |
313 | int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback); |
314 | ||
f579559b TG |
315 | |
316 | DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free); | |
317 | #define _cleanup_route_free_ _cleanup_(route_freep) | |
318 | ||
319 | int config_parse_gateway(const char *unit, const char *filename, unsigned line, | |
71a61510 TG |
320 | const char *section, unsigned section_line, const char *lvalue, |
321 | int ltype, const char *rvalue, void *data, void *userdata); | |
f579559b | 322 | |
6ae115c1 TG |
323 | int config_parse_destination(const char *unit, const char *filename, unsigned line, |
324 | const char *section, unsigned section_line, const char *lvalue, | |
325 | int ltype, const char *rvalue, void *data, void *userdata); | |
326 | ||
5d8e593d SS |
327 | int config_parse_route_priority(const char *unit, const char *filename, unsigned line, |
328 | const char *section, unsigned section_line, const char *lvalue, | |
329 | int ltype, const char *rvalue, void *data, void *userdata); | |
f579559b | 330 | /* Address */ |
f048a16b TG |
331 | int address_new_static(Network *network, unsigned section, Address **ret); |
332 | int address_new_dynamic(Address **ret); | |
f579559b | 333 | void address_free(Address *address); |
f882c247 | 334 | int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
aba496a5 | 335 | int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
407fe036 | 336 | int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback); |
5a8bcb67 LP |
337 | int address_establish(Address *address, Link *link); |
338 | int address_release(Address *address, Link *link); | |
9505d3c6 | 339 | bool address_equal(Address *a1, Address *a2); |
f579559b TG |
340 | |
341 | DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free); | |
342 | #define _cleanup_address_free_ _cleanup_(address_freep) | |
343 | ||
344 | int config_parse_address(const char *unit, const char *filename, unsigned line, | |
71a61510 TG |
345 | const char *section, unsigned section_line, const char *lvalue, |
346 | int ltype, const char *rvalue, void *data, void *userdata); | |
f579559b | 347 | |
eb0ea358 TG |
348 | int config_parse_broadcast(const char *unit, const char *filename, unsigned line, |
349 | const char *section, unsigned section_line, const char *lvalue, | |
350 | int ltype, const char *rvalue, void *data, void *userdata); | |
351 | ||
6ae115c1 TG |
352 | int config_parse_label(const char *unit, const char *filename, unsigned line, |
353 | const char *section, unsigned section_line, const char *lvalue, | |
354 | int ltype, const char *rvalue, void *data, void *userdata); | |
355 | ||
b98b483b AR |
356 | /* Forwarding database table. */ |
357 | int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex); | |
358 | void fdb_entry_free(FdbEntry *fdb_entry); | |
359 | int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret); | |
360 | ||
361 | DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free); | |
362 | #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep) | |
363 | ||
364 | int config_parse_fdb_hwaddr(const char *unit, const char *filename, unsigned line, | |
365 | const char *section, unsigned section_line, const char *lvalue, | |
366 | int ltype, const char *rvalue, void *data, void *userdata); | |
367 | ||
368 | int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line, | |
369 | const char *section, unsigned section_line, const char *lvalue, | |
370 | int ltype, const char *rvalue, void *data, void *userdata); | |
371 | ||
ed942a9e TG |
372 | /* DHCP support */ |
373 | ||
ed942a9e TG |
374 | int config_parse_dhcp(const char *unit, const char *filename, unsigned line, |
375 | const char *section, unsigned section_line, const char *lvalue, | |
376 | int ltype, const char *rvalue, void *data, void *userdata); | |
377 | ||
bd8f6538 TG |
378 | /* LLMNR support */ |
379 | ||
380 | const char* llmnr_support_to_string(LLMNRSupport i) _const_; | |
381 | LLMNRSupport llmnr_support_from_string(const char *s) _pure_; | |
382 | ||
383 | int config_parse_llmnr(const char *unit, const char *filename, unsigned line, | |
384 | const char *section, unsigned section_line, const char *lvalue, | |
385 | int ltype, const char *rvalue, void *data, void *userdata); | |
386 | ||
11bf3cce LP |
387 | /* Address Pool */ |
388 | ||
0dd25fb9 LP |
389 | int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen); |
390 | int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen); | |
11bf3cce LP |
391 | void address_pool_free(AddressPool *p); |
392 | ||
393 | int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found); | |
cb9fc36a LP |
394 | |
395 | const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_; | |
396 | AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_; | |
769d324c LP |
397 | |
398 | 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); |