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