]> git.proxmox.com Git - systemd.git/blob - src/network/netdev/netdev.h
New upstream version 236
[systemd.git] / src / network / netdev / netdev.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
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
23 #include "sd-netlink.h"
24
25 #include "list.h"
26 #include "time-util.h"
27
28 typedef struct netdev_join_callback netdev_join_callback;
29 typedef struct Link Link;
30
31 struct netdev_join_callback {
32 sd_netlink_message_handler_t callback;
33 Link *link;
34
35 LIST_FIELDS(netdev_join_callback, callbacks);
36 };
37
38 typedef enum NetDevKind {
39 NETDEV_KIND_BRIDGE,
40 NETDEV_KIND_BOND,
41 NETDEV_KIND_VLAN,
42 NETDEV_KIND_MACVLAN,
43 NETDEV_KIND_MACVTAP,
44 NETDEV_KIND_IPVLAN,
45 NETDEV_KIND_VXLAN,
46 NETDEV_KIND_IPIP,
47 NETDEV_KIND_GRE,
48 NETDEV_KIND_GRETAP,
49 NETDEV_KIND_IP6GRE,
50 NETDEV_KIND_IP6GRETAP,
51 NETDEV_KIND_SIT,
52 NETDEV_KIND_VETH,
53 NETDEV_KIND_VTI,
54 NETDEV_KIND_VTI6,
55 NETDEV_KIND_IP6TNL,
56 NETDEV_KIND_DUMMY,
57 NETDEV_KIND_TUN,
58 NETDEV_KIND_TAP,
59 NETDEV_KIND_VRF,
60 NETDEV_KIND_VCAN,
61 NETDEV_KIND_GENEVE,
62 NETDEV_KIND_VXCAN,
63 _NETDEV_KIND_MAX,
64 _NETDEV_KIND_INVALID = -1
65 } NetDevKind;
66
67 typedef enum NetDevState {
68 NETDEV_STATE_FAILED,
69 NETDEV_STATE_CREATING,
70 NETDEV_STATE_READY,
71 NETDEV_STATE_LINGER,
72 _NETDEV_STATE_MAX,
73 _NETDEV_STATE_INVALID = -1,
74 } NetDevState;
75
76 typedef enum NetDevCreateType {
77 NETDEV_CREATE_INDEPENDENT,
78 NETDEV_CREATE_MASTER,
79 NETDEV_CREATE_STACKED,
80 _NETDEV_CREATE_MAX,
81 _NETDEV_CREATE_INVALID = -1,
82 } NetDevCreateType;
83
84 typedef struct Manager Manager;
85 typedef struct Condition Condition;
86
87 typedef struct NetDev {
88 Manager *manager;
89
90 int n_ref;
91
92 char *filename;
93
94 Condition *match_host;
95 Condition *match_virt;
96 Condition *match_kernel;
97 Condition *match_arch;
98
99 NetDevState state;
100 NetDevKind kind;
101 char *description;
102 char *ifname;
103 struct ether_addr *mac;
104 size_t mtu;
105 int ifindex;
106
107 LIST_HEAD(netdev_join_callback, callbacks);
108 } NetDev;
109
110 typedef struct NetDevVTable {
111 /* How much memory does an object of this unit type need */
112 size_t object_size;
113
114 /* Config file sections this netdev kind understands, separated
115 * by NUL chars */
116 const char *sections;
117
118 /* This should reset all type-specific variables. This should
119 * not allocate memory, and is called with zero-initialized
120 * data. It should hence only initialize variables that need
121 * to be set != 0. */
122 void (*init)(NetDev *n);
123
124 /* This should free all kind-specific variables. It should be
125 * idempotent. */
126 void (*done)(NetDev *n);
127
128 /* fill in message to create netdev */
129 int (*fill_message_create)(NetDev *netdev, Link *link, sd_netlink_message *message);
130
131 /* specifies if netdev is independent, or a master device or a stacked device */
132 NetDevCreateType create_type;
133
134 /* create netdev, if not done via rtnl */
135 int (*create)(NetDev *netdev);
136
137 /* perform additional configuration after netdev has been createad */
138 int (*post_create)(NetDev *netdev, Link *link, sd_netlink_message *message);
139
140 /* verify that compulsory configuration options were specified */
141 int (*config_verify)(NetDev *netdev, const char *filename);
142 } NetDevVTable;
143
144 extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
145
146 #define NETDEV_VTABLE(n) netdev_vtable[(n)->kind]
147
148 /* For casting a netdev into the various netdev kinds */
149 #define DEFINE_NETDEV_CAST(UPPERCASE, MixedCase) \
150 static inline MixedCase* UPPERCASE(NetDev *n) { \
151 if (_unlikely_(!n || n->kind != NETDEV_KIND_##UPPERCASE)) \
152 return NULL; \
153 \
154 return (MixedCase*) n; \
155 }
156
157 /* For casting the various netdev kinds into a netdev */
158 #define NETDEV(n) (&(n)->meta)
159
160 int netdev_load(Manager *manager);
161 void netdev_drop(NetDev *netdev);
162
163 NetDev *netdev_unref(NetDev *netdev);
164 NetDev *netdev_ref(NetDev *netdev);
165
166 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
167 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
168
169 int netdev_get(Manager *manager, const char *name, NetDev **ret);
170 int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
171 int netdev_enslave(NetDev *netdev, Link *link, sd_netlink_message_handler_t callback);
172 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
173 int netdev_join(NetDev *netdev, Link *link, sd_netlink_message_handler_t cb);
174
175 const char *netdev_kind_to_string(NetDevKind d) _const_;
176 NetDevKind netdev_kind_from_string(const char *d) _pure_;
177
178 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);
179
180 /* gperf */
181 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
182
183 /* Macros which append INTERFACE= to the message */
184
185 #define log_netdev_full(netdev, level, error, ...) \
186 ({ \
187 const NetDev *_n = (netdev); \
188 _n ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _n->ifname, NULL, NULL, ##__VA_ARGS__) : \
189 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
190 })
191
192 #define log_netdev_debug(netdev, ...) log_netdev_full(netdev, LOG_DEBUG, 0, ##__VA_ARGS__)
193 #define log_netdev_info(netdev, ...) log_netdev_full(netdev, LOG_INFO, 0, ##__VA_ARGS__)
194 #define log_netdev_notice(netdev, ...) log_netdev_full(netdev, LOG_NOTICE, 0, ##__VA_ARGS__)
195 #define log_netdev_warning(netdev, ...) log_netdev_full(netdev, LOG_WARNING, 0, ## __VA_ARGS__)
196 #define log_netdev_error(netdev, ...) log_netdev_full(netdev, LOG_ERR, 0, ##__VA_ARGS__)
197
198 #define log_netdev_debug_errno(netdev, error, ...) log_netdev_full(netdev, LOG_DEBUG, error, ##__VA_ARGS__)
199 #define log_netdev_info_errno(netdev, error, ...) log_netdev_full(netdev, LOG_INFO, error, ##__VA_ARGS__)
200 #define log_netdev_notice_errno(netdev, error, ...) log_netdev_full(netdev, LOG_NOTICE, error, ##__VA_ARGS__)
201 #define log_netdev_warning_errno(netdev, error, ...) log_netdev_full(netdev, LOG_WARNING, error, ##__VA_ARGS__)
202 #define log_netdev_error_errno(netdev, error, ...) log_netdev_full(netdev, LOG_ERR, error, ##__VA_ARGS__)
203
204 #define LOG_NETDEV_MESSAGE(netdev, fmt, ...) "MESSAGE=%s: " fmt, (netdev)->ifname, ##__VA_ARGS__
205 #define LOG_NETDEV_INTERFACE(netdev) "INTERFACE=%s", (netdev)->ifname