]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/netdev/netdev.h
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / network / netdev / netdev.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
0ef6f454
LP
2#pragma once
3
3be1d7e0
TG
4/***
5 This file is part of systemd.
6
7 Copyright 2013 Tom Gundersen <teg@jklm.no>
8
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
634f0f98 23#include "sd-netlink.h"
3be1d7e0 24
634f0f98
ZJS
25#include "list.h"
26#include "time-util.h"
fc2f9534 27
3be1d7e0 28typedef struct netdev_join_callback netdev_join_callback;
634f0f98 29typedef struct Link Link;
3be1d7e0
TG
30
31struct netdev_join_callback {
1c4baffc 32 sd_netlink_message_handler_t callback;
3be1d7e0
TG
33 Link *link;
34
35 LIST_FIELDS(netdev_join_callback, callbacks);
36};
37
38typedef enum NetDevKind {
39 NETDEV_KIND_BRIDGE,
40 NETDEV_KIND_BOND,
41 NETDEV_KIND_VLAN,
42 NETDEV_KIND_MACVLAN,
f33ff02b 43 NETDEV_KIND_MACVTAP,
c4a5ddc9 44 NETDEV_KIND_IPVLAN,
3be1d7e0
TG
45 NETDEV_KIND_VXLAN,
46 NETDEV_KIND_IPIP,
47 NETDEV_KIND_GRE,
1af2536a 48 NETDEV_KIND_GRETAP,
b16492f8
SS
49 NETDEV_KIND_IP6GRE,
50 NETDEV_KIND_IP6GRETAP,
3be1d7e0
TG
51 NETDEV_KIND_SIT,
52 NETDEV_KIND_VETH,
53 NETDEV_KIND_VTI,
9011ce77 54 NETDEV_KIND_VTI6,
855ee1a1 55 NETDEV_KIND_IP6TNL,
3be1d7e0
TG
56 NETDEV_KIND_DUMMY,
57 NETDEV_KIND_TUN,
58 NETDEV_KIND_TAP,
20897a0d 59 NETDEV_KIND_VRF,
92c918b0 60 NETDEV_KIND_VCAN,
6598e046 61 NETDEV_KIND_GENEVE,
3be1d7e0
TG
62 _NETDEV_KIND_MAX,
63 _NETDEV_KIND_INVALID = -1
64} NetDevKind;
65
66typedef enum NetDevState {
67 NETDEV_STATE_FAILED,
68 NETDEV_STATE_CREATING,
69 NETDEV_STATE_READY,
70 NETDEV_STATE_LINGER,
71 _NETDEV_STATE_MAX,
72 _NETDEV_STATE_INVALID = -1,
73} NetDevState;
74
aa9f1140
TG
75typedef enum NetDevCreateType {
76 NETDEV_CREATE_INDEPENDENT,
77 NETDEV_CREATE_MASTER,
78 NETDEV_CREATE_STACKED,
79 _NETDEV_CREATE_MAX,
80 _NETDEV_CREATE_INVALID = -1,
81} NetDevCreateType;
82
634f0f98
ZJS
83typedef struct Manager Manager;
84typedef struct Condition Condition;
85
86typedef struct NetDev {
3be1d7e0
TG
87 Manager *manager;
88
89 int n_ref;
90
91 char *filename;
92
93 Condition *match_host;
94 Condition *match_virt;
95 Condition *match_kernel;
96 Condition *match_arch;
97
aa9f1140
TG
98 NetDevState state;
99 NetDevKind kind;
3be1d7e0
TG
100 char *description;
101 char *ifname;
3be1d7e0 102 struct ether_addr *mac;
aa9f1140 103 size_t mtu;
3be1d7e0 104 int ifindex;
3be1d7e0
TG
105
106 LIST_HEAD(netdev_join_callback, callbacks);
634f0f98 107} NetDev;
3be1d7e0 108
634f0f98 109typedef struct NetDevVTable {
aa9f1140
TG
110 /* How much memory does an object of this unit type need */
111 size_t object_size;
112
113 /* Config file sections this netdev kind understands, separated
114 * by NUL chars */
115 const char *sections;
3be1d7e0 116
aa9f1140
TG
117 /* This should reset all type-specific variables. This should
118 * not allocate memory, and is called with zero-initialized
119 * data. It should hence only initialize variables that need
120 * to be set != 0. */
121 void (*init)(NetDev *n);
3be1d7e0 122
aa9f1140
TG
123 /* This should free all kind-specific variables. It should be
124 * idempotent. */
125 void (*done)(NetDev *n);
126
127 /* fill in message to create netdev */
1c4baffc 128 int (*fill_message_create)(NetDev *netdev, Link *link, sd_netlink_message *message);
aa9f1140
TG
129
130 /* specifies if netdev is independent, or a master device or a stacked device */
131 NetDevCreateType create_type;
3be1d7e0
TG
132
133 /* create netdev, if not done via rtnl */
134 int (*create)(NetDev *netdev);
135
540eb5f0
SS
136 /* perform additional configuration after netdev has been createad */
137 int (*post_create)(NetDev *netdev, Link *link, sd_netlink_message *message);
138
3be1d7e0
TG
139 /* verify that compulsory configuration options were specified */
140 int (*config_verify)(NetDev *netdev, const char *filename);
634f0f98 141} NetDevVTable;
3be1d7e0
TG
142
143extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
144
145#define NETDEV_VTABLE(n) netdev_vtable[(n)->kind]
146
aa9f1140 147/* For casting a netdev into the various netdev kinds */
634f0f98 148#define DEFINE_NETDEV_CAST(UPPERCASE, MixedCase) \
aa9f1140
TG
149 static inline MixedCase* UPPERCASE(NetDev *n) { \
150 if (_unlikely_(!n || n->kind != NETDEV_KIND_##UPPERCASE)) \
151 return NULL; \
152 \
153 return (MixedCase*) n; \
154 }
155
156/* For casting the various netdev kinds into a netdev */
157#define NETDEV(n) (&(n)->meta)
158
3be1d7e0
TG
159int netdev_load(Manager *manager);
160void netdev_drop(NetDev *netdev);
161
162NetDev *netdev_unref(NetDev *netdev);
163NetDev *netdev_ref(NetDev *netdev);
164
165DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
166#define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
167
168int netdev_get(Manager *manager, const char *name, NetDev **ret);
1c4baffc
TG
169int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
170int netdev_enslave(NetDev *netdev, Link *link, sd_netlink_message_handler_t callback);
3be1d7e0 171int netdev_get_mac(const char *ifname, struct ether_addr **ret);
1c4baffc 172int netdev_join(NetDev *netdev, Link *link, sd_netlink_message_handler_t cb);
3be1d7e0
TG
173
174const char *netdev_kind_to_string(NetDevKind d) _const_;
175NetDevKind netdev_kind_from_string(const char *d) _pure_;
176
177int 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);
178
179/* gperf */
c9f7b4d3 180const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
3be1d7e0
TG
181
182/* Macros which append INTERFACE= to the message */
183
f2341e0a
LP
184#define log_netdev_full(netdev, level, error, ...) \
185 ({ \
8dec4a9d 186 const NetDev *_n = (netdev); \
4b58153d 187 _n ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _n->ifname, NULL, NULL, ##__VA_ARGS__) : \
f2341e0a
LP
188 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
189 })
6a7a4e4d
LP
190
191#define log_netdev_debug(netdev, ...) log_netdev_full(netdev, LOG_DEBUG, 0, ##__VA_ARGS__)
192#define log_netdev_info(netdev, ...) log_netdev_full(netdev, LOG_INFO, 0, ##__VA_ARGS__)
193#define log_netdev_notice(netdev, ...) log_netdev_full(netdev, LOG_NOTICE, 0, ##__VA_ARGS__)
194#define log_netdev_warning(netdev, ...) log_netdev_full(netdev, LOG_WARNING, 0, ## __VA_ARGS__)
195#define log_netdev_error(netdev, ...) log_netdev_full(netdev, LOG_ERR, 0, ##__VA_ARGS__)
196
197#define log_netdev_debug_errno(netdev, error, ...) log_netdev_full(netdev, LOG_DEBUG, error, ##__VA_ARGS__)
198#define log_netdev_info_errno(netdev, error, ...) log_netdev_full(netdev, LOG_INFO, error, ##__VA_ARGS__)
199#define log_netdev_notice_errno(netdev, error, ...) log_netdev_full(netdev, LOG_NOTICE, error, ##__VA_ARGS__)
200#define log_netdev_warning_errno(netdev, error, ...) log_netdev_full(netdev, LOG_WARNING, error, ##__VA_ARGS__)
201#define log_netdev_error_errno(netdev, error, ...) log_netdev_full(netdev, LOG_ERR, error, ##__VA_ARGS__)
98b32556 202
f2341e0a
LP
203#define LOG_NETDEV_MESSAGE(netdev, fmt, ...) "MESSAGE=%s: " fmt, (netdev)->ifname, ##__VA_ARGS__
204#define LOG_NETDEV_INTERFACE(netdev) "INTERFACE=%s", (netdev)->ifname