chiark / gitweb /
networkd: introduce vxlan
[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 "udev.h"
33
34 #include "rtnl-util.h"
35 #include "hashmap.h"
36 #include "list.h"
37 #include "set.h"
38 #include "condition-util.h"
39
40 #define CACHE_INFO_INFINITY_LIFE_TIME 0xFFFFFFFFU
41 #define VXLAN_VID_MAX (1u << 24) - 1
42
43 typedef struct NetDev NetDev;
44 typedef struct Network Network;
45 typedef struct Link Link;
46 typedef struct Address Address;
47 typedef struct Route Route;
48 typedef struct Manager Manager;
49
50 typedef struct netdev_enslave_callback netdev_enslave_callback;
51
52 struct netdev_enslave_callback {
53         sd_rtnl_message_handler_t callback;
54         Link *link;
55
56         LIST_FIELDS(netdev_enslave_callback, callbacks);
57 };
58
59 typedef enum MacVlanMode {
60         NETDEV_MACVLAN_MODE_PRIVATE = MACVLAN_MODE_PRIVATE,
61         NETDEV_MACVLAN_MODE_VEPA = MACVLAN_MODE_VEPA,
62         NETDEV_MACVLAN_MODE_BRIDGE = MACVLAN_MODE_BRIDGE,
63         NETDEV_MACVLAN_MODE_PASSTHRU = MACVLAN_MODE_PASSTHRU,
64         _NETDEV_MACVLAN_MODE_MAX,
65         _NETDEV_MACVLAN_MODE_INVALID = -1
66 } MacVlanMode;
67
68 typedef enum NetDevKind {
69         NETDEV_KIND_BRIDGE,
70         NETDEV_KIND_BOND,
71         NETDEV_KIND_VLAN,
72         NETDEV_KIND_MACVLAN,
73         NETDEV_KIND_VXLAN,
74         NETDEV_KIND_IPIP,
75         NETDEV_KIND_GRE,
76         NETDEV_KIND_SIT,
77         NETDEV_KIND_VETH,
78         NETDEV_KIND_VTI,
79         _NETDEV_KIND_MAX,
80         _NETDEV_KIND_INVALID = -1
81 } NetDevKind;
82
83 typedef enum NetDevState {
84         NETDEV_STATE_FAILED,
85         NETDEV_STATE_CREATING,
86         NETDEV_STATE_READY,
87         NETDEV_STATE_LINGER,
88         _NETDEV_STATE_MAX,
89         _NETDEV_STATE_INVALID = -1,
90 } NetDevState;
91
92 struct NetDev {
93         Manager *manager;
94
95         int n_ref;
96
97         char *filename;
98
99         Condition *match_host;
100         Condition *match_virt;
101         Condition *match_kernel;
102         Condition *match_arch;
103
104         char *description;
105         char *ifname;
106         char *ifname_peer;
107         size_t mtu;
108         struct ether_addr *mac;
109         struct ether_addr *mac_peer;
110         NetDevKind kind;
111
112         uint64_t vlanid;
113         uint64_t vxlanid;
114         int32_t macvlan_mode;
115
116         int ifindex;
117         NetDevState state;
118
119         bool tunnel_pmtudisc;
120         bool learning;
121         unsigned ttl;
122         unsigned tos;
123         struct in_addr local;
124         struct in_addr remote;
125         struct in_addr group;
126
127         LIST_HEAD(netdev_enslave_callback, callbacks);
128 };
129
130 struct Network {
131         Manager *manager;
132
133         char *filename;
134
135         struct ether_addr *match_mac;
136         char *match_path;
137         char *match_driver;
138         char *match_type;
139         char *match_name;
140         Condition *match_host;
141         Condition *match_virt;
142         Condition *match_kernel;
143         Condition *match_arch;
144
145         char *description;
146         NetDev *bridge;
147         NetDev *bond;
148         NetDev *tunnel;
149         Hashmap *vlans;
150         Hashmap *macvlans;
151         Hashmap *vxlans;
152         bool dhcp;
153         bool dhcp_dns;
154         bool dhcp_ntp;
155         bool dhcp_mtu;
156         bool dhcp_hostname;
157         bool dhcp_domainname;
158         bool dhcp_critical;
159         bool ipv4ll;
160
161         bool dhcp_server;
162
163         LIST_HEAD(Address, static_addresses);
164         LIST_HEAD(Route, static_routes);
165
166         Hashmap *addresses_by_section;
167         Hashmap *routes_by_section;
168
169         LIST_HEAD(Address, dns);
170         LIST_HEAD(Address, ntp);
171
172         LIST_FIELDS(Network, networks);
173 };
174
175 struct Address {
176         Network *network;
177         uint64_t section;
178
179         unsigned char family;
180         unsigned char prefixlen;
181         unsigned char scope;
182         char *label;
183
184         struct in_addr broadcast;
185         struct ifa_cacheinfo cinfo;
186
187         union {
188                 struct in_addr in;
189                 struct in6_addr in6;
190         } in_addr;
191
192         LIST_FIELDS(Address, addresses);
193 };
194
195 struct Route {
196         Network *network;
197         uint64_t section;
198
199         unsigned char family;
200         unsigned char dst_prefixlen;
201         unsigned char scope;
202         uint32_t metrics;
203
204         union {
205                 struct in_addr in;
206                 struct in6_addr in6;
207         } in_addr;
208
209         union {
210                 struct in_addr in;
211                 struct in6_addr in6;
212         } dst_addr;
213
214         LIST_FIELDS(Route, routes);
215 };
216
217 typedef enum LinkState {
218         LINK_STATE_INITIALIZING,
219         LINK_STATE_ENSLAVING,
220         LINK_STATE_SETTING_ADDRESSES,
221         LINK_STATE_SETTING_ROUTES,
222         LINK_STATE_CONFIGURED,
223         LINK_STATE_UNMANAGED,
224         LINK_STATE_FAILED,
225         LINK_STATE_LINGER,
226         _LINK_STATE_MAX,
227         _LINK_STATE_INVALID = -1
228 } LinkState;
229
230 typedef enum LinkOperationalState {
231         LINK_OPERSTATE_UNKNOWN,
232         LINK_OPERSTATE_DORMANT,
233         LINK_OPERSTATE_CARRIER,
234         LINK_OPERSTATE_DEGRADED,
235         LINK_OPERSTATE_ROUTABLE,
236         _LINK_OPERSTATE_MAX,
237         _LINK_OPERSTATE_INVALID = -1
238 } LinkOperationalState;
239
240 struct Link {
241         Manager *manager;
242
243         int n_ref;
244
245         uint64_t ifindex;
246         char *ifname;
247         char *state_file;
248         struct ether_addr mac;
249         struct udev_device *udev_device;
250
251         unsigned flags;
252         uint8_t kernel_operstate;
253
254         Network *network;
255
256         LinkState state;
257         LinkOperationalState operstate;
258
259         unsigned addr_messages;
260         unsigned route_messages;
261         unsigned enslaving;
262
263         LIST_HEAD(Address, addresses);
264
265         sd_dhcp_client *dhcp_client;
266         sd_dhcp_lease *dhcp_lease;
267         char *lease_file;
268         uint16_t original_mtu;
269         sd_ipv4ll *ipv4ll;
270
271         sd_dhcp_server *dhcp_server;
272 };
273
274 struct Manager {
275         sd_rtnl *rtnl;
276         sd_event *event;
277         sd_bus *bus;
278         struct udev *udev;
279         struct udev_monitor *udev_monitor;
280         sd_event_source *udev_event_source;
281         sd_event_source *sigterm_event_source;
282         sd_event_source *sigint_event_source;
283
284         char *state_file;
285
286         Hashmap *links;
287         Hashmap *netdevs;
288         LIST_HEAD(Network, networks);
289
290         usec_t network_dirs_ts_usec;
291 };
292
293 extern const char* const network_dirs[];
294
295 /* Manager */
296
297 int manager_new(Manager **ret);
298 void manager_free(Manager *m);
299
300 int manager_load_config(Manager *m);
301 bool manager_should_reload(Manager *m);
302
303 int manager_rtnl_enumerate_links(Manager *m);
304
305 int manager_rtnl_listen(Manager *m);
306 int manager_udev_listen(Manager *m);
307 int manager_bus_listen(Manager *m);
308
309 int manager_save(Manager *m);
310
311 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
312 #define _cleanup_manager_free_ _cleanup_(manager_freep)
313
314 /* NetDev */
315
316 int netdev_load(Manager *manager);
317 void netdev_drop(NetDev *netdev);
318
319 NetDev *netdev_unref(NetDev *netdev);
320 NetDev *netdev_ref(NetDev *netdev);
321
322 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
323 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
324
325 int netdev_get(Manager *manager, const char *name, NetDev **ret);
326 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
327 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
328 int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback);
329 int netdev_create_veth(NetDev *netdev, sd_rtnl_message_handler_t callback);
330 int netdev_create_vxlan(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
331
332 const char *netdev_kind_to_string(NetDevKind d) _const_;
333 NetDevKind netdev_kind_from_string(const char *d) _pure_;
334
335 const char *macvlan_mode_to_string(MacVlanMode d) _const_;
336 MacVlanMode macvlan_mode_from_string(const char *d) _pure_;
337
338 int config_parse_netdev_kind(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);
339
340 int config_parse_macvlan_mode(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);
341
342 /* gperf */
343 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
344
345 /* Network */
346
347 int network_load(Manager *manager);
348
349 void network_free(Network *network);
350
351 DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
352 #define _cleanup_network_free_ _cleanup_(network_freep)
353
354 int network_get(Manager *manager, struct udev_device *device,
355                 const char *ifname, const struct ether_addr *mac,
356                 Network **ret);
357 int network_apply(Manager *manager, Network *network, Link *link);
358
359 int config_parse_netdev(const char *unit, const char *filename, unsigned line,
360                         const char *section, unsigned section_line, const char *lvalue,
361                         int ltype, const char *rvalue, void *data, void *userdata);
362
363 int config_parse_tunnel(const char *unit,
364                         const char *filename,
365                         unsigned line,
366                         const char *section,
367                         unsigned section_line,
368                         const char *lvalue,
369                         int ltype,
370                         const char *rvalue,
371                         void *data,
372                         void *userdata);
373
374 int config_parse_tunnel_address(const char *unit,
375                                 const char *filename,
376                                 unsigned line,
377                                 const char *section,
378                                 unsigned section_line,
379                                 const char *lvalue,
380                                 int ltype,
381                                 const char *rvalue,
382                                 void *data,
383                                 void *userdata);
384
385 /* gperf */
386 const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
387
388 /* Route */
389 int route_new_static(Network *network, unsigned section, Route **ret);
390 int route_new_dynamic(Route **ret);
391 void route_free(Route *route);
392 int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback);
393 int route_drop(Route *route, Link *link, sd_rtnl_message_handler_t callback);
394
395
396 DEFINE_TRIVIAL_CLEANUP_FUNC(Route*, route_free);
397 #define _cleanup_route_free_ _cleanup_(route_freep)
398
399 int config_parse_gateway(const char *unit, const char *filename, unsigned line,
400                          const char *section, unsigned section_line, const char *lvalue,
401                          int ltype, const char *rvalue, void *data, void *userdata);
402
403 int config_parse_destination(const char *unit, const char *filename, unsigned line,
404                              const char *section, unsigned section_line, const char *lvalue,
405                              int ltype, const char *rvalue, void *data, void *userdata);
406
407 /* Address */
408 int address_new_static(Network *network, unsigned section, Address **ret);
409 int address_new_dynamic(Address **ret);
410 void address_free(Address *address);
411 int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback);
412 int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback);
413 int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback);
414 bool address_equal(Address *a1, Address *a2);
415
416 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
417 #define _cleanup_address_free_ _cleanup_(address_freep)
418
419 int config_parse_dns(const char *unit, const char *filename, unsigned line,
420                      const char *section, unsigned section_line, const char *lvalue,
421                      int ltype, const char *rvalue, void *data, void *userdata);
422
423 int config_parse_address(const char *unit, const char *filename, unsigned line,
424                          const char *section, unsigned section_line, const char *lvalue,
425                          int ltype, const char *rvalue, void *data, void *userdata);
426
427 int config_parse_broadcast(const char *unit, const char *filename, unsigned line,
428                            const char *section, unsigned section_line, const char *lvalue,
429                            int ltype, const char *rvalue, void *data, void *userdata);
430
431 int config_parse_label(const char *unit, const char *filename, unsigned line,
432                        const char *section, unsigned section_line, const char *lvalue,
433                        int ltype, const char *rvalue, void *data, void *userdata);
434
435 /* Link */
436
437 Link *link_unref(Link *link);
438 Link *link_ref(Link *link);
439 int link_get(Manager *m, int ifindex, Link **ret);
440 int link_add(Manager *manager, sd_rtnl_message *message, Link **ret);
441 void link_drop(Link *link);
442
443 int link_update(Link *link, sd_rtnl_message *message);
444 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata);
445
446 int link_initialized(Link *link, struct udev_device *device);
447
448 int link_save(Link *link);
449
450 bool link_has_carrier(unsigned flags, uint8_t operstate);
451
452 const char* link_state_to_string(LinkState s) _const_;
453 LinkState link_state_from_string(const char *s) _pure_;
454
455 const char* link_operstate_to_string(LinkOperationalState s) _const_;
456 LinkOperationalState link_operstate_from_string(const char *s) _pure_;
457
458 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
459 #define _cleanup_link_unref_ _cleanup_(link_unrefp)
460
461 /* Macros which append INTERFACE= to the message */
462
463 #define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
464 #define log_debug_link(link, ...)       log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
465 #define log_info_link(link, ...)        log_full_link(LOG_INFO, link, ##__VA_ARGS__)
466 #define log_notice_link(link, ...)      log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
467 #define log_warning_link(link, ...)     log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
468 #define log_error_link(link, ...)       log_full_link(LOG_ERR, link, ##__VA_ARGS__)
469
470 #define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
471
472 /* More macros which append INTERFACE= to the message */
473
474 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__)
475 #define log_debug_netdev(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
476 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
477 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
478 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
479 #define log_error_netdev(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
480
481 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
482
483 #define NETDEV(netdev) "INTERFACE=%s", netdev->ifname
484 #define ADDRESS_FMT_VAL(address)            \
485         (address).s_addr & 0xFF,            \
486         ((address).s_addr >> 8) & 0xFF,     \
487         ((address).s_addr >> 16) & 0xFF,    \
488         (address).s_addr >> 24