]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/netdev/netdev.h
Add an extra debug log to dissect_image()
[thirdparty/systemd.git] / src / network / netdev / netdev.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
0ef6f454
LP
2#pragma once
3
634f0f98 4#include "sd-netlink.h"
3be1d7e0 5
538f15cf 6#include "conf-parser.h"
5e20e1e3 7#include "ether-addr-util.h"
bfacb8fe 8#include "hash-funcs.h"
634f0f98 9#include "list.h"
60643448 10#include "log-link.h"
737f1405 11#include "networkd-link.h"
634f0f98 12#include "time-util.h"
fc2f9534 13
aaa5ca57
YW
14/* Special hardware address value to suppress generating persistent hardware address for the netdev. */
15#define HW_ADDR_NONE ((struct hw_addr_data) { .length = 1, })
16
130b812f
ZJS
17#define NETDEV_COMMON_SECTIONS "Match\0NetDev\0"
18/* This is the list of known sections. We need to ignore them in the initial parsing phase. */
19#define NETDEV_OTHER_SECTIONS \
e6980c72 20 "-BareUDP\0" \
c0267a59 21 "-BatmanAdvanced\0" \
130b812f
ZJS
22 "-Bond\0" \
23 "-Bridge\0" \
24 "-FooOverUDP\0" \
25 "-GENEVE\0" \
b90d0f83 26 "-IPoIB\0" \
130b812f
ZJS
27 "-IPVLAN\0" \
28 "-IPVTAP\0" \
29 "-L2TP\0" \
30 "-L2TPSession\0" \
31 "-MACsec\0" \
bc945c2b 32 "-MACsecReceiveAssociation\0" \
130b812f
ZJS
33 "-MACsecReceiveChannel\0" \
34 "-MACsecTransmitAssociation\0" \
130b812f 35 "-MACVLAN\0" \
bc945c2b 36 "-MACVTAP\0" \
130b812f 37 "-Peer\0" \
bc945c2b
YW
38 "-Tap\0" \
39 "-Tun\0" \
40 "-Tunnel\0" \
130b812f
ZJS
41 "-VLAN\0" \
42 "-VRF\0" \
43 "-VXCAN\0" \
44 "-VXLAN\0" \
ec4954d9 45 "-WLAN\0" \
130b812f
ZJS
46 "-WireGuard\0" \
47 "-WireGuardPeer\0" \
48 "-Xfrm\0"
49
3be1d7e0 50typedef enum NetDevKind {
bc945c2b
YW
51 NETDEV_KIND_BAREUDP,
52 NETDEV_KIND_BATADV,
3be1d7e0 53 NETDEV_KIND_BOND,
bc945c2b
YW
54 NETDEV_KIND_BRIDGE,
55 NETDEV_KIND_DUMMY,
56 NETDEV_KIND_ERSPAN,
57 NETDEV_KIND_FOU,
58 NETDEV_KIND_GENEVE,
3be1d7e0 59 NETDEV_KIND_GRE,
1af2536a 60 NETDEV_KIND_GRETAP,
bc945c2b 61 NETDEV_KIND_IFB,
b16492f8
SS
62 NETDEV_KIND_IP6GRE,
63 NETDEV_KIND_IP6GRETAP,
bc945c2b
YW
64 NETDEV_KIND_IP6TNL,
65 NETDEV_KIND_IPIP,
b90d0f83 66 NETDEV_KIND_IPOIB,
bc945c2b
YW
67 NETDEV_KIND_IPVLAN,
68 NETDEV_KIND_IPVTAP,
69 NETDEV_KIND_L2TP,
70 NETDEV_KIND_MACSEC,
71 NETDEV_KIND_MACVLAN,
72 NETDEV_KIND_MACVTAP,
73 NETDEV_KIND_NETDEVSIM,
74 NETDEV_KIND_NLMON,
3be1d7e0 75 NETDEV_KIND_SIT,
bc945c2b
YW
76 NETDEV_KIND_TAP,
77 NETDEV_KIND_TUN,
78 NETDEV_KIND_VCAN,
3be1d7e0 79 NETDEV_KIND_VETH,
bc945c2b
YW
80 NETDEV_KIND_VLAN,
81 NETDEV_KIND_VRF,
3be1d7e0 82 NETDEV_KIND_VTI,
9011ce77 83 NETDEV_KIND_VTI6,
d6df583c 84 NETDEV_KIND_VXCAN,
bc945c2b 85 NETDEV_KIND_VXLAN,
e5719363 86 NETDEV_KIND_WIREGUARD,
dedf2d00 87 NETDEV_KIND_WLAN,
98d20a17 88 NETDEV_KIND_XFRM,
3be1d7e0 89 _NETDEV_KIND_MAX,
cebe1257 90 _NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */
2d93c20e 91 _NETDEV_KIND_INVALID = -EINVAL,
3be1d7e0
TG
92} NetDevKind;
93
94typedef enum NetDevState {
f3c33b23 95 NETDEV_STATE_LOADING,
3be1d7e0
TG
96 NETDEV_STATE_FAILED,
97 NETDEV_STATE_CREATING,
98 NETDEV_STATE_READY,
99 NETDEV_STATE_LINGER,
100 _NETDEV_STATE_MAX,
2d93c20e 101 _NETDEV_STATE_INVALID = -EINVAL,
3be1d7e0
TG
102} NetDevState;
103
aa9f1140
TG
104typedef enum NetDevCreateType {
105 NETDEV_CREATE_INDEPENDENT,
aa9f1140
TG
106 NETDEV_CREATE_STACKED,
107 _NETDEV_CREATE_MAX,
2d93c20e 108 _NETDEV_CREATE_INVALID = -EINVAL,
aa9f1140
TG
109} NetDevCreateType;
110
634f0f98
ZJS
111typedef struct Manager Manager;
112typedef struct Condition Condition;
113
114typedef struct NetDev {
3be1d7e0
TG
115 Manager *manager;
116
cf4b2f99 117 unsigned n_ref;
3be1d7e0
TG
118
119 char *filename;
2cf9b1a0 120 char **dropins;
3be1d7e0 121
1beabe08 122 LIST_HEAD(Condition, conditions);
3be1d7e0 123
aa9f1140
TG
124 NetDevState state;
125 NetDevKind kind;
3be1d7e0
TG
126 char *description;
127 char *ifname;
5e20e1e3 128 struct hw_addr_data hw_addr;
4e964aa0 129 uint32_t mtu;
3be1d7e0 130 int ifindex;
634f0f98 131} NetDev;
3be1d7e0 132
634f0f98 133typedef struct NetDevVTable {
aa9f1140
TG
134 /* How much memory does an object of this unit type need */
135 size_t object_size;
136
137 /* Config file sections this netdev kind understands, separated
138 * by NUL chars */
139 const char *sections;
3be1d7e0 140
aa9f1140
TG
141 /* This should reset all type-specific variables. This should
142 * not allocate memory, and is called with zero-initialized
143 * data. It should hence only initialize variables that need
144 * to be set != 0. */
145 void (*init)(NetDev *n);
3be1d7e0 146
af7a86b8
YW
147 /* This is called when the interface is removed. */
148 void (*drop)(NetDev *n);
149
aa9f1140
TG
150 /* This should free all kind-specific variables. It should be
151 * idempotent. */
152 void (*done)(NetDev *n);
153
154 /* fill in message to create netdev */
1c4baffc 155 int (*fill_message_create)(NetDev *netdev, Link *link, sd_netlink_message *message);
aa9f1140
TG
156
157 /* specifies if netdev is independent, or a master device or a stacked device */
158 NetDevCreateType create_type;
3be1d7e0 159
562729d7
YW
160 /* This is used for stacked netdev. Return true when the underlying link is ready. */
161 int (*is_ready_to_create)(NetDev *netdev, Link *link);
162
3be1d7e0
TG
163 /* create netdev, if not done via rtnl */
164 int (*create)(NetDev *netdev);
165
540eb5f0 166 /* perform additional configuration after netdev has been createad */
c2b19b8f 167 int (*post_create)(NetDev *netdev, Link *link);
540eb5f0 168
3be1d7e0
TG
169 /* verify that compulsory configuration options were specified */
170 int (*config_verify)(NetDev *netdev, const char *filename);
daf0f8ca 171
c60cd572
YW
172 /* attach/detach additional interfaces, e.g. veth peer or L2TP sessions. */
173 int (*attach)(NetDev *netdev);
174 void (*detach)(NetDev *netdev);
175
176 /* set ifindex of the created interface. */
177 int (*set_ifindex)(NetDev *netdev, const char *name, int ifindex);
178
179 /* get ifindex of the netdev. */
180 int (*get_ifindex)(NetDev *netdev, const char *name);
181
9f0cf80d
YW
182 /* expected iftype, e.g. ARPHRD_ETHER. */
183 uint16_t iftype;
184
7f0ed7d1 185 /* Generate MAC address when MACAddress= is not specified. */
daf0f8ca 186 bool generate_mac;
1d4312d5
YW
187
188 /* When assigning ifindex to the netdev, skip to check if the netdev kind matches. */
189 bool skip_netdev_kind_check;
634f0f98 190} NetDevVTable;
3be1d7e0
TG
191
192extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
193
281bb5c1 194#define NETDEV_VTABLE(n) ((n)->kind != _NETDEV_KIND_INVALID ? netdev_vtable[(n)->kind] : NULL)
3be1d7e0 195
aa9f1140 196/* For casting a netdev into the various netdev kinds */
117843fe
ZJS
197#define DEFINE_NETDEV_CAST(UPPERCASE, MixedCase) \
198 static inline MixedCase* UPPERCASE(NetDev *n) { \
199 assert(n); \
200 assert(n->kind == NETDEV_KIND_##UPPERCASE); \
201 assert(n->state < _NETDEV_STATE_MAX); \
202 \
203 return (MixedCase*) n; \
aa9f1140
TG
204 }
205
206/* For casting the various netdev kinds into a netdev */
207#define NETDEV(n) (&(n)->meta)
208
bfacb8fe 209int netdev_attach_name(NetDev *netdev, const char *name);
0dc71b95
YW
210NetDev* netdev_detach_name(NetDev *netdev, const char *name);
211void netdev_detach(NetDev *netdev);
5dc20e1a 212int netdev_set_ifindex_internal(NetDev *netdev, int ifindex);
0dc71b95 213
e272b621 214int netdev_load(Manager *manager, bool reload);
e27aac11 215int netdev_load_one(Manager *manager, const char *filename);
3be1d7e0 216void netdev_drop(NetDev *netdev);
8f65304c 217void netdev_enter_failed(NetDev *netdev);
5dc20e1a 218int netdev_enter_ready(NetDev *netdev);
3be1d7e0
TG
219
220NetDev *netdev_unref(NetDev *netdev);
221NetDev *netdev_ref(NetDev *netdev);
302a796f 222DEFINE_TRIVIAL_DESTRUCTOR(netdev_destroy_callback, NetDev, netdev_unref);
3be1d7e0 223DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
3be1d7e0 224
9e2bbf99 225bool netdev_is_managed(NetDev *netdev);
3be1d7e0 226int netdev_get(Manager *manager, const char *name, NetDev **ret);
1788c346 227void link_assign_netdev(Link *link);
1c4baffc 228int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
b90d0f83 229int netdev_generate_hw_addr(NetDev *netdev, Link *link, const char *name,
a8ee2b8e 230 const struct hw_addr_data *hw_addr, struct hw_addr_data *ret);
3be1d7e0 231
b14686ff 232int link_request_stacked_netdev(Link *link, NetDev *netdev);
71a754f7 233
bfd5a068 234const char* netdev_kind_to_string(NetDevKind d) _const_;
3be1d7e0
TG
235NetDevKind netdev_kind_from_string(const char *d) _pure_;
236
859e9c04
YW
237static inline NetDevCreateType netdev_get_create_type(NetDev *netdev) {
238 assert(netdev);
239 assert(NETDEV_VTABLE(netdev));
240
241 return NETDEV_VTABLE(netdev)->create_type;
242}
243
538f15cf 244CONFIG_PARSER_PROTOTYPE(config_parse_netdev_kind);
aaa5ca57 245CONFIG_PARSER_PROTOTYPE(config_parse_netdev_hw_addr);
3be1d7e0
TG
246
247/* gperf */
c9f7b4d3 248const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
3be1d7e0
TG
249
250/* Macros which append INTERFACE= to the message */
251
60643448 252#define log_netdev_full_errno_zerook(netdev, level, error, ...) \
f2341e0a 253 ({ \
8dec4a9d 254 const NetDev *_n = (netdev); \
60643448 255 log_interface_full_errno_zerook(_n ? _n->ifname : NULL, level, error, __VA_ARGS__); \
f2341e0a 256 })
6a7a4e4d 257
60643448
YW
258#define log_netdev_full_errno(netdev, level, error, ...) \
259 ({ \
260 int _error = (error); \
261 ASSERT_NON_ZERO(_error); \
262 log_netdev_full_errno_zerook(netdev, level, _error, __VA_ARGS__); \
263 })
264
265#define log_netdev_full(netdev, level, ...) (void) log_netdev_full_errno_zerook(netdev, level, 0, __VA_ARGS__)
266
267#define log_netdev_debug(netdev, ...) log_netdev_full(netdev, LOG_DEBUG, __VA_ARGS__)
268#define log_netdev_info(netdev, ...) log_netdev_full(netdev, LOG_INFO, __VA_ARGS__)
269#define log_netdev_notice(netdev, ...) log_netdev_full(netdev, LOG_NOTICE, __VA_ARGS__)
270#define log_netdev_warning(netdev, ...) log_netdev_full(netdev, LOG_WARNING, __VA_ARGS__)
271#define log_netdev_error(netdev, ...) log_netdev_full(netdev, LOG_ERR, __VA_ARGS__)
272
273#define log_netdev_debug_errno(netdev, error, ...) log_netdev_full_errno(netdev, LOG_DEBUG, error, __VA_ARGS__)
274#define log_netdev_info_errno(netdev, error, ...) log_netdev_full_errno(netdev, LOG_INFO, error, __VA_ARGS__)
275#define log_netdev_notice_errno(netdev, error, ...) log_netdev_full_errno(netdev, LOG_NOTICE, error, __VA_ARGS__)
276#define log_netdev_warning_errno(netdev, error, ...) log_netdev_full_errno(netdev, LOG_WARNING, error, __VA_ARGS__)
277#define log_netdev_error_errno(netdev, error, ...) log_netdev_full_errno(netdev, LOG_ERR, error, __VA_ARGS__)
98b32556 278
f2341e0a
LP
279#define LOG_NETDEV_MESSAGE(netdev, fmt, ...) "MESSAGE=%s: " fmt, (netdev)->ifname, ##__VA_ARGS__
280#define LOG_NETDEV_INTERFACE(netdev) "INTERFACE=%s", (netdev)->ifname