chiark / gitweb /
networkd: integrate LLDP
[elogind.git] / src / network / networkd.h
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>
25
26 #include "sd-event.h"
27 #include "sd-rtnl.h"
28 #include "sd-bus.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"
34 #include "udev.h"
35 #include "sd-lldp.h"
36
37 #include "rtnl-util.h"
38 #include "hashmap.h"
39 #include "list.h"
40 #include "set.h"
41 #include "condition.h"
42 #include "in-addr-util.h"
43
44 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
45 #define DHCP_ROUTE_METRIC 1024
46 #define IPV4LL_ROUTE_METRIC 2048
47
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;
56
57 typedef enum DHCPSupport {
58         DHCP_SUPPORT_NONE,
59         DHCP_SUPPORT_BOTH,
60         DHCP_SUPPORT_V4,
61         DHCP_SUPPORT_V6,
62         _DHCP_SUPPORT_MAX,
63         _DHCP_SUPPORT_INVALID = -1,
64 } DHCPSupport;
65
66 typedef enum LLMNRSupport {
67         LLMNR_SUPPORT_NO,
68         LLMNR_SUPPORT_YES,
69         LLMNR_SUPPORT_RESOLVE,
70         _LLMNR_SUPPORT_MAX,
71         _LLMNR_SUPPORT_INVALID = -1,
72 } LLMNRSupport;
73
74 struct FdbEntry {
75         Network *network;
76         unsigned section;
77
78         struct ether_addr *mac_addr;
79         uint16_t vlan_id;
80
81         LIST_FIELDS(FdbEntry, static_fdb_entries);
82 };
83
84 struct Network {
85         Manager *manager;
86
87         char *filename;
88
89         struct ether_addr *match_mac;
90         char *match_path;
91         char *match_driver;
92         char *match_type;
93         char *match_name;
94         char *dhcp_vendor_class_identifier;
95
96         Condition *match_host;
97         Condition *match_virt;
98         Condition *match_kernel;
99         Condition *match_arch;
100
101         char *description;
102         NetDev *bridge;
103         NetDev *bond;
104         Hashmap *stacked_netdevs;
105         DHCPSupport dhcp;
106         bool dhcp_dns;
107         bool dhcp_ntp;
108         bool dhcp_mtu;
109         bool dhcp_hostname;
110         bool dhcp_domains;
111         bool dhcp_sendhost;
112         bool dhcp_broadcast;
113         bool dhcp_critical;
114         bool dhcp_routes;
115         unsigned dhcp_route_metric;
116         bool ipv4ll;
117         bool ipv4ll_route;
118
119         bool dhcp_server;
120
121         unsigned cost;
122
123         struct ether_addr *mac;
124         unsigned mtu;
125
126         bool lldp;
127
128         LIST_HEAD(Address, static_addresses);
129         LIST_HEAD(Route, static_routes);
130         LIST_HEAD(FdbEntry, static_fdb_entries);
131
132         Hashmap *addresses_by_section;
133         Hashmap *routes_by_section;
134         Hashmap *fdb_entries_by_section;
135
136         bool wildcard_domain;
137         char **domains, **dns, **ntp;
138
139         LLMNRSupport llmnr;
140
141         LIST_FIELDS(Network, networks);
142 };
143
144 struct Address {
145         Network *network;
146         unsigned section;
147
148         int family;
149         unsigned char prefixlen;
150         unsigned char scope;
151         unsigned char flags;
152         char *label;
153
154         struct in_addr broadcast;
155         struct ifa_cacheinfo cinfo;
156
157         union in_addr_union in_addr;
158         union in_addr_union in_addr_peer;
159
160         LIST_FIELDS(Address, addresses);
161 };
162
163 struct Route {
164         Network *network;
165         unsigned section;
166
167         int family;
168         unsigned char dst_prefixlen;
169         unsigned char src_prefixlen;
170         unsigned char scope;
171         uint32_t metrics;
172         unsigned char protocol;  /* RTPROT_* */
173
174         union in_addr_union in_addr;
175         union in_addr_union dst_addr;
176         union in_addr_union src_addr;
177         union in_addr_union prefsrc_addr;
178
179         LIST_FIELDS(Route, routes);
180 };
181
182 struct AddressPool {
183         Manager *manager;
184
185         int family;
186         unsigned prefixlen;
187
188         union in_addr_union in_addr;
189
190         LIST_FIELDS(AddressPool, address_pools);
191 };
192
193 struct Manager {
194         sd_rtnl *rtnl;
195         sd_event *event;
196         sd_bus *bus;
197         struct udev *udev;
198         struct udev_monitor *udev_monitor;
199         sd_event_source *udev_event_source;
200
201         char *state_file;
202
203         Hashmap *links;
204         Hashmap *netdevs;
205         LIST_HEAD(Network, networks);
206         LIST_HEAD(AddressPool, address_pools);
207
208         usec_t network_dirs_ts_usec;
209 };
210
211 extern const char* const network_dirs[];
212
213 /* Manager */
214
215 int manager_new(Manager **ret);
216 void manager_free(Manager *m);
217
218 int manager_load_config(Manager *m);
219 bool manager_should_reload(Manager *m);
220
221 int manager_rtnl_enumerate_links(Manager *m);
222 int manager_rtnl_enumerate_addresses(Manager *m);
223
224 int manager_rtnl_listen(Manager *m);
225 int manager_udev_listen(Manager *m);
226 int manager_bus_listen(Manager *m);
227
228 int manager_save(Manager *m);
229
230 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found);
231
232 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
233 #define _cleanup_manager_free_ _cleanup_(manager_freep)
234
235 /* Network */
236
237 int network_load(Manager *manager);
238
239 void network_free(Network *network);
240
241 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
242 #define _cleanup_network_free_ _cleanup_(network_freep)
243
244 int network_get(Manager *manager, struct udev_device *device,
245                 const char *ifname, const struct ether_addr *mac,
246                 Network **ret);
247 int network_apply(Manager *manager, Network *network, Link *link);
248
249 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
250                         const char *section, unsigned section_line, const char *lvalue,
251                         int ltype, const char *rvalue, void *data, void *userdata);
252
253 int config_parse_domains(const char *unit,
254                          const char *filename,
255                          unsigned line,
256                          const char *section,
257                          unsigned section_line,
258                          const char *lvalue,
259                          int ltype,
260                          const char *rvalue,
261                          void *data,
262                          void *userdata);
263
264 int config_parse_tunnel(const char *unit,
265                         const char *filename,
266                         unsigned line,
267                         const char *section,
268                         unsigned section_line,
269                         const char *lvalue,
270                         int ltype,
271                         const char *rvalue,
272                         void *data,
273                         void *userdata);
274
275 int config_parse_tunnel_address(const char *unit,
276                                 const char *filename,
277                                 unsigned line,
278                                 const char *section,
279                                 unsigned section_line,
280                                 const char *lvalue,
281                                 int ltype,
282                                 const char *rvalue,
283                                 void *data,
284                                 void *userdata);
285
286 int config_parse_vxlan_group_address(const char *unit,
287                                      const char *filename,
288                                      unsigned line,
289                                      const char *section,
290                                      unsigned section_line,
291                                      const char *lvalue,
292                                      int ltype,
293                                      const char *rvalue,
294                                      void *data,
295                                      void *userdata);
296
297 /* gperf */
298 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
299
300 /* Route */
301 int route_new_static(Network *network, unsigned section, Route **ret);
302 int route_new_dynamic(Route **ret, unsigned char rtm_protocol);
303 void route_free(Route *route);
304 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
305 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
306
307
308 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
309 #define _cleanup_route_free_ _cleanup_(route_freep)
310
311 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
312                          const char *section, unsigned section_line, const char *lvalue,
313                          int ltype, const char *rvalue, void *data, void *userdata);
314
315 int config_parse_destination(const char *unit, const char *filename, unsigned line,
316                              const char *section, unsigned section_line, const char *lvalue,
317                              int ltype, const char *rvalue, void *data, void *userdata);
318
319 int config_parse_route_priority(const char *unit, const char *filename, unsigned line,
320                                 const char *section, unsigned section_line, const char *lvalue,
321                                 int ltype, const char *rvalue, void *data, void *userdata);
322 /* Address */
323 int address_new_static(Network *network, unsigned section, Address **ret);
324 int address_new_dynamic(Address **ret);
325 void address_free(Address *address);
326 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
327 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
328 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
329 bool address_equal(Address *a1, Address *a2);
330
331 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
332 #define _cleanup_address_free_ _cleanup_(address_freep)
333
334 int config_parse_address(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
338 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
339                            const char *section, unsigned section_line, const char *lvalue,
340                            int ltype, const char *rvalue, void *data, void *userdata);
341
342 int config_parse_label(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);
345
346 /* Forwarding database table. */
347 int fdb_entry_configure(sd_rtnl *const rtnl, FdbEntry *const fdb_entry, const int ifindex);
348 void fdb_entry_free(FdbEntry *fdb_entry);
349 int fdb_entry_new_static(Network *const network, const unsigned section, FdbEntry **ret);
350
351 DEFINE_TRIVIAL_CLEANUP_FUNC(FdbEntry*, fdb_entry_free);
352 #define _cleanup_fdbentry_free_ _cleanup_(fdb_entry_freep)
353
354 int config_parse_fdb_hwaddr(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);
357
358 int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned line,
359                              const char *section, unsigned section_line, const char *lvalue,
360                              int ltype, const char *rvalue, void *data, void *userdata);
361
362 /* DHCP support */
363
364 const char* dhcp_support_to_string(DHCPSupport i) _const_;
365 DHCPSupport dhcp_support_from_string(const char *s) _pure_;
366
367 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
368                       const char *section, unsigned section_line, const char *lvalue,
369                       int ltype, const char *rvalue, void *data, void *userdata);
370
371 /* LLMNR support */
372
373 const char* llmnr_support_to_string(LLMNRSupport i) _const_;
374 LLMNRSupport llmnr_support_from_string(const char *s) _pure_;
375
376 int config_parse_llmnr(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);
379
380 /* Address Pool */
381
382 int address_pool_new(Manager *m, AddressPool **ret, int family, const union in_addr_union *u, unsigned prefixlen);
383 int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, const char *p, unsigned prefixlen);
384 void address_pool_free(AddressPool *p);
385
386 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);