1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
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.
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.
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/>.
28 #include "in-addr-util.h"
30 typedef struct NetDevVTable NetDevVTable;
32 typedef struct netdev_join_callback netdev_join_callback;
34 struct netdev_join_callback {
35 sd_rtnl_message_handler_t callback;
38 LIST_FIELDS(netdev_join_callback, callbacks);
41 typedef enum NetDevKind {
57 _NETDEV_KIND_INVALID = -1
60 typedef enum NetDevState {
62 NETDEV_STATE_CREATING,
66 _NETDEV_STATE_INVALID = -1,
69 typedef enum NetDevCreateType {
70 NETDEV_CREATE_INDEPENDENT,
72 NETDEV_CREATE_STACKED,
74 _NETDEV_CREATE_INVALID = -1,
84 Condition *match_host;
85 Condition *match_virt;
86 Condition *match_kernel;
87 Condition *match_arch;
93 struct ether_addr *mac;
97 LIST_HEAD(netdev_join_callback, callbacks);
100 #include "networkd-netdev-bridge.h"
101 #include "networkd-netdev-bond.h"
102 #include "networkd-netdev-vlan.h"
103 #include "networkd-netdev-macvlan.h"
104 #include "networkd-netdev-ipvlan.h"
105 #include "networkd-netdev-vxlan.h"
106 #include "networkd-netdev-veth.h"
107 #include "networkd-netdev-tunnel.h"
108 #include "networkd-netdev-dummy.h"
109 #include "networkd-netdev-tuntap.h"
111 struct NetDevVTable {
112 /* How much memory does an object of this unit type need */
115 /* Config file sections this netdev kind understands, separated
117 const char *sections;
119 /* This should reset all type-specific variables. This should
120 * not allocate memory, and is called with zero-initialized
121 * data. It should hence only initialize variables that need
123 void (*init)(NetDev *n);
125 /* This should free all kind-specific variables. It should be
127 void (*done)(NetDev *n);
129 /* fill in message to create netdev */
130 int (*fill_message_create)(NetDev *netdev, Link *link, sd_rtnl_message *message);
132 /* specifies if netdev is independent, or a master device or a stacked device */
133 NetDevCreateType create_type;
135 /* create netdev, if not done via rtnl */
136 int (*create)(NetDev *netdev);
138 /* verify that compulsory configuration options were specified */
139 int (*config_verify)(NetDev *netdev, const char *filename);
142 extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
144 #define NETDEV_VTABLE(n) netdev_vtable[(n)->kind]
146 /* For casting a netdev into the various netdev kinds */
147 #define DEFINE_CAST(UPPERCASE, MixedCase) \
148 static inline MixedCase* UPPERCASE(NetDev *n) { \
149 if (_unlikely_(!n || n->kind != NETDEV_KIND_##UPPERCASE)) \
152 return (MixedCase*) n; \
155 /* For casting the various netdev kinds into a netdev */
156 #define NETDEV(n) (&(n)->meta)
158 DEFINE_CAST(BRIDGE, Bridge);
159 DEFINE_CAST(BOND, Bond);
160 DEFINE_CAST(VLAN, VLan);
161 DEFINE_CAST(MACVLAN, MacVlan);
162 DEFINE_CAST(IPVLAN, IPVlan);
163 DEFINE_CAST(VXLAN, VxLan);
164 DEFINE_CAST(IPIP, Tunnel);
165 DEFINE_CAST(GRE, Tunnel);
166 DEFINE_CAST(SIT, Tunnel);
167 DEFINE_CAST(VTI, Tunnel);
168 DEFINE_CAST(VETH, Veth);
169 DEFINE_CAST(DUMMY, Dummy);
170 DEFINE_CAST(TUN, TunTap);
171 DEFINE_CAST(TAP, TunTap);
173 int netdev_load(Manager *manager);
174 void netdev_drop(NetDev *netdev);
176 NetDev *netdev_unref(NetDev *netdev);
177 NetDev *netdev_ref(NetDev *netdev);
179 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
180 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
182 int netdev_get(Manager *manager, const char *name, NetDev **ret);
183 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
184 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
185 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
186 int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
188 const char *netdev_kind_to_string(NetDevKind d) _const_;
189 NetDevKind netdev_kind_from_string(const char *d) _pure_;
191 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);
194 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
196 /* Macros which append INTERFACE= to the message */
198 #define log_full_netdev(level, netdev, fmt, ...) log_object_internal(level, 0, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__)
199 #define log_netdev_debug(netdev, ...) log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
200 #define log_info_netdev(netdev, ...) log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
201 #define log_notice_netdev(netdev, ...) log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
202 #define log_warning_netdev(netdev, ...) log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
203 #define log_netdev_error(netdev, ...) log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
205 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
207 #define NETDEVIF(netdev) "INTERFACE=%s", netdev->ifname