]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-netdev.h
core,network: major per-object logging rework
[thirdparty/systemd.git] / src / network / networkd-netdev.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 "networkd.h"
25 #include "list.h"
26
27 typedef struct NetDevVTable NetDevVTable;
28
29 typedef struct netdev_join_callback netdev_join_callback;
30
31 struct netdev_join_callback {
32 sd_rtnl_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_IPVLAN,
44 NETDEV_KIND_VXLAN,
45 NETDEV_KIND_IPIP,
46 NETDEV_KIND_GRE,
47 NETDEV_KIND_GRETAP,
48 NETDEV_KIND_IP6GRE,
49 NETDEV_KIND_IP6GRETAP,
50 NETDEV_KIND_SIT,
51 NETDEV_KIND_VETH,
52 NETDEV_KIND_VTI,
53 NETDEV_KIND_VTI6,
54 NETDEV_KIND_IP6TNL,
55 NETDEV_KIND_DUMMY,
56 NETDEV_KIND_TUN,
57 NETDEV_KIND_TAP,
58 _NETDEV_KIND_MAX,
59 _NETDEV_KIND_INVALID = -1
60 } NetDevKind;
61
62 typedef enum NetDevState {
63 NETDEV_STATE_FAILED,
64 NETDEV_STATE_CREATING,
65 NETDEV_STATE_READY,
66 NETDEV_STATE_LINGER,
67 _NETDEV_STATE_MAX,
68 _NETDEV_STATE_INVALID = -1,
69 } NetDevState;
70
71 typedef enum NetDevCreateType {
72 NETDEV_CREATE_INDEPENDENT,
73 NETDEV_CREATE_MASTER,
74 NETDEV_CREATE_STACKED,
75 _NETDEV_CREATE_MAX,
76 _NETDEV_CREATE_INVALID = -1,
77 } NetDevCreateType;
78
79 struct NetDev {
80 Manager *manager;
81
82 int n_ref;
83
84 char *filename;
85
86 Condition *match_host;
87 Condition *match_virt;
88 Condition *match_kernel;
89 Condition *match_arch;
90
91 NetDevState state;
92 NetDevKind kind;
93 char *description;
94 char *ifname;
95 struct ether_addr *mac;
96 size_t mtu;
97 int ifindex;
98
99 LIST_HEAD(netdev_join_callback, callbacks);
100 };
101
102 #include "networkd-netdev-bridge.h"
103 #include "networkd-netdev-bond.h"
104 #include "networkd-netdev-vlan.h"
105 #include "networkd-netdev-macvlan.h"
106 #include "networkd-netdev-ipvlan.h"
107 #include "networkd-netdev-vxlan.h"
108 #include "networkd-netdev-veth.h"
109 #include "networkd-netdev-tunnel.h"
110 #include "networkd-netdev-dummy.h"
111 #include "networkd-netdev-tuntap.h"
112
113 struct NetDevVTable {
114 /* How much memory does an object of this unit type need */
115 size_t object_size;
116
117 /* Config file sections this netdev kind understands, separated
118 * by NUL chars */
119 const char *sections;
120
121 /* This should reset all type-specific variables. This should
122 * not allocate memory, and is called with zero-initialized
123 * data. It should hence only initialize variables that need
124 * to be set != 0. */
125 void (*init)(NetDev *n);
126
127 /* This should free all kind-specific variables. It should be
128 * idempotent. */
129 void (*done)(NetDev *n);
130
131 /* fill in message to create netdev */
132 int (*fill_message_create)(NetDev *netdev, Link *link, sd_rtnl_message *message);
133
134 /* specifies if netdev is independent, or a master device or a stacked device */
135 NetDevCreateType create_type;
136
137 /* create netdev, if not done via rtnl */
138 int (*create)(NetDev *netdev);
139
140 /* verify that compulsory configuration options were specified */
141 int (*config_verify)(NetDev *netdev, const char *filename);
142 };
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_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 DEFINE_CAST(BRIDGE, Bridge);
161 DEFINE_CAST(BOND, Bond);
162 DEFINE_CAST(VLAN, VLan);
163 DEFINE_CAST(MACVLAN, MacVlan);
164 DEFINE_CAST(IPVLAN, IPVlan);
165 DEFINE_CAST(VXLAN, VxLan);
166 DEFINE_CAST(IPIP, Tunnel);
167 DEFINE_CAST(GRE, Tunnel);
168 DEFINE_CAST(GRETAP, Tunnel);
169 DEFINE_CAST(IP6GRE, Tunnel);
170 DEFINE_CAST(IP6GRETAP, Tunnel);
171 DEFINE_CAST(SIT, Tunnel);
172 DEFINE_CAST(VTI, Tunnel);
173 DEFINE_CAST(VTI6, Tunnel);
174 DEFINE_CAST(IP6TNL, Tunnel);
175 DEFINE_CAST(VETH, Veth);
176 DEFINE_CAST(DUMMY, Dummy);
177 DEFINE_CAST(TUN, TunTap);
178 DEFINE_CAST(TAP, TunTap);
179
180 int netdev_load(Manager *manager);
181 void netdev_drop(NetDev *netdev);
182
183 NetDev *netdev_unref(NetDev *netdev);
184 NetDev *netdev_ref(NetDev *netdev);
185
186 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
187 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
188
189 int netdev_get(Manager *manager, const char *name, NetDev **ret);
190 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
191 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
192 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
193 int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
194
195 const char *netdev_kind_to_string(NetDevKind d) _const_;
196 NetDevKind netdev_kind_from_string(const char *d) _pure_;
197
198 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);
199
200 /* gperf */
201 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
202
203 /* Macros which append INTERFACE= to the message */
204
205 #define log_netdev_full(netdev, level, error, ...) \
206 ({ \
207 NetDev *_n = (netdev); \
208 _n ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _n->ifname, ##__VA_ARGS__) : \
209 log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
210 })
211
212 #define log_netdev_debug(netdev, ...) log_netdev_full(netdev, LOG_DEBUG, 0, ##__VA_ARGS__)
213 #define log_netdev_info(netdev, ...) log_netdev_full(netdev, LOG_INFO, 0, ##__VA_ARGS__)
214 #define log_netdev_notice(netdev, ...) log_netdev_full(netdev, LOG_NOTICE, 0, ##__VA_ARGS__)
215 #define log_netdev_warning(netdev, ...) log_netdev_full(netdev, LOG_WARNING, 0, ## __VA_ARGS__)
216 #define log_netdev_error(netdev, ...) log_netdev_full(netdev, LOG_ERR, 0, ##__VA_ARGS__)
217
218 #define log_netdev_debug_errno(netdev, error, ...) log_netdev_full(netdev, LOG_DEBUG, error, ##__VA_ARGS__)
219 #define log_netdev_info_errno(netdev, error, ...) log_netdev_full(netdev, LOG_INFO, error, ##__VA_ARGS__)
220 #define log_netdev_notice_errno(netdev, error, ...) log_netdev_full(netdev, LOG_NOTICE, error, ##__VA_ARGS__)
221 #define log_netdev_warning_errno(netdev, error, ...) log_netdev_full(netdev, LOG_WARNING, error, ##__VA_ARGS__)
222 #define log_netdev_error_errno(netdev, error, ...) log_netdev_full(netdev, LOG_ERR, error, ##__VA_ARGS__)
223
224 #define LOG_NETDEV_MESSAGE(netdev, fmt, ...) "MESSAGE=%s: " fmt, (netdev)->ifname, ##__VA_ARGS__
225 #define LOG_NETDEV_INTERFACE(netdev) "INTERFACE=%s", (netdev)->ifname