chiark / gitweb /
networkd: refactor socket activation a bit
[elogind.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 "hashmap.h"
26 #include "list.h"
27 #include "set.h"
28 #include "in-addr-util.h"
29
30 typedef struct NetDevVTable NetDevVTable;
31
32 typedef struct netdev_join_callback netdev_join_callback;
33
34 struct netdev_join_callback {
35         sd_rtnl_message_handler_t callback;
36         Link *link;
37
38         LIST_FIELDS(netdev_join_callback, callbacks);
39 };
40
41 typedef enum NetDevKind {
42         NETDEV_KIND_BRIDGE,
43         NETDEV_KIND_BOND,
44         NETDEV_KIND_VLAN,
45         NETDEV_KIND_MACVLAN,
46         NETDEV_KIND_IPVLAN,
47         NETDEV_KIND_VXLAN,
48         NETDEV_KIND_IPIP,
49         NETDEV_KIND_GRE,
50         NETDEV_KIND_GRETAP,
51         NETDEV_KIND_IP6GRE,
52         NETDEV_KIND_IP6GRETAP,
53         NETDEV_KIND_SIT,
54         NETDEV_KIND_VETH,
55         NETDEV_KIND_VTI,
56         NETDEV_KIND_IP6TNL,
57         NETDEV_KIND_DUMMY,
58         NETDEV_KIND_TUN,
59         NETDEV_KIND_TAP,
60         _NETDEV_KIND_MAX,
61         _NETDEV_KIND_INVALID = -1
62 } NetDevKind;
63
64 typedef enum NetDevState {
65         NETDEV_STATE_FAILED,
66         NETDEV_STATE_CREATING,
67         NETDEV_STATE_READY,
68         NETDEV_STATE_LINGER,
69         _NETDEV_STATE_MAX,
70         _NETDEV_STATE_INVALID = -1,
71 } NetDevState;
72
73 typedef enum NetDevCreateType {
74         NETDEV_CREATE_INDEPENDENT,
75         NETDEV_CREATE_MASTER,
76         NETDEV_CREATE_STACKED,
77         _NETDEV_CREATE_MAX,
78         _NETDEV_CREATE_INVALID = -1,
79 } NetDevCreateType;
80
81 struct NetDev {
82         Manager *manager;
83
84         int n_ref;
85
86         char *filename;
87
88         Condition *match_host;
89         Condition *match_virt;
90         Condition *match_kernel;
91         Condition *match_arch;
92
93         NetDevState state;
94         NetDevKind kind;
95         char *description;
96         char *ifname;
97         struct ether_addr *mac;
98         size_t mtu;
99         int ifindex;
100
101         LIST_HEAD(netdev_join_callback, callbacks);
102 };
103
104 #include "networkd-netdev-bridge.h"
105 #include "networkd-netdev-bond.h"
106 #include "networkd-netdev-vlan.h"
107 #include "networkd-netdev-macvlan.h"
108 #include "networkd-netdev-ipvlan.h"
109 #include "networkd-netdev-vxlan.h"
110 #include "networkd-netdev-veth.h"
111 #include "networkd-netdev-tunnel.h"
112 #include "networkd-netdev-dummy.h"
113 #include "networkd-netdev-tuntap.h"
114
115 struct NetDevVTable {
116         /* How much memory does an object of this unit type need */
117         size_t object_size;
118
119         /* Config file sections this netdev kind understands, separated
120          * by NUL chars */
121         const char *sections;
122
123         /* This should reset all type-specific variables. This should
124          * not allocate memory, and is called with zero-initialized
125          * data. It should hence only initialize variables that need
126          * to be set != 0. */
127         void (*init)(NetDev *n);
128
129         /* This should free all kind-specific variables. It should be
130          * idempotent. */
131         void (*done)(NetDev *n);
132
133         /* fill in message to create netdev */
134         int (*fill_message_create)(NetDev *netdev, Link *link, sd_rtnl_message *message);
135
136         /* specifies if netdev is independent, or a master device or a stacked device */
137         NetDevCreateType create_type;
138
139         /* create netdev, if not done via rtnl */
140         int (*create)(NetDev *netdev);
141
142         /* verify that compulsory configuration options were specified */
143         int (*config_verify)(NetDev *netdev, const char *filename);
144 };
145
146 extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
147
148 #define NETDEV_VTABLE(n) netdev_vtable[(n)->kind]
149
150 /* For casting a netdev into the various netdev kinds */
151 #define DEFINE_CAST(UPPERCASE, MixedCase)                                   \
152         static inline MixedCase* UPPERCASE(NetDev *n) {                     \
153                 if (_unlikely_(!n || n->kind != NETDEV_KIND_##UPPERCASE))   \
154                         return NULL;                                        \
155                                                                             \
156                 return (MixedCase*) n;                                      \
157         }
158
159 /* For casting the various netdev kinds into a netdev */
160 #define NETDEV(n) (&(n)->meta)
161
162 DEFINE_CAST(BRIDGE, Bridge);
163 DEFINE_CAST(BOND, Bond);
164 DEFINE_CAST(VLAN, VLan);
165 DEFINE_CAST(MACVLAN, MacVlan);
166 DEFINE_CAST(IPVLAN, IPVlan);
167 DEFINE_CAST(VXLAN, VxLan);
168 DEFINE_CAST(IPIP, Tunnel);
169 DEFINE_CAST(GRE, Tunnel);
170 DEFINE_CAST(GRETAP, Tunnel);
171 DEFINE_CAST(IP6GRE, Tunnel);
172 DEFINE_CAST(IP6GRETAP, Tunnel);
173 DEFINE_CAST(SIT, Tunnel);
174 DEFINE_CAST(VTI, Tunnel);
175 DEFINE_CAST(IP6TNL, Tunnel);
176 DEFINE_CAST(VETH, Veth);
177 DEFINE_CAST(DUMMY, Dummy);
178 DEFINE_CAST(TUN, TunTap);
179 DEFINE_CAST(TAP, TunTap);
180
181 int netdev_load(Manager *manager);
182 void netdev_drop(NetDev *netdev);
183
184 NetDev *netdev_unref(NetDev *netdev);
185 NetDev *netdev_ref(NetDev *netdev);
186
187 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
188 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
189
190 int netdev_get(Manager *manager, const char *name, NetDev **ret);
191 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
192 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
193 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
194 int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
195
196 const char *netdev_kind_to_string(NetDevKind d) _const_;
197 NetDevKind netdev_kind_from_string(const char *d) _pure_;
198
199 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);
200
201 /* gperf */
202 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
203
204 /* Macros which append INTERFACE= to the message */
205
206 #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__)
207 #define log_netdev_debug(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
208 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
209 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
210 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
211 #define log_netdev_error(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
212
213 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
214
215 #define NETDEVIF(netdev) "INTERFACE=%s", netdev->ifname