chiark / gitweb /
Revert "socket: add support for TCP fast Open"
[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 "condition-util.h"
29 #include "in-addr-util.h"
30
31 typedef struct NetDevVTable NetDevVTable;
32
33 typedef struct netdev_join_callback netdev_join_callback;
34
35 struct netdev_join_callback {
36         sd_rtnl_message_handler_t callback;
37         Link *link;
38
39         LIST_FIELDS(netdev_join_callback, callbacks);
40 };
41
42 typedef enum NetDevKind {
43         NETDEV_KIND_BRIDGE,
44         NETDEV_KIND_BOND,
45         NETDEV_KIND_VLAN,
46         NETDEV_KIND_MACVLAN,
47         NETDEV_KIND_VXLAN,
48         NETDEV_KIND_IPIP,
49         NETDEV_KIND_GRE,
50         NETDEV_KIND_SIT,
51         NETDEV_KIND_VETH,
52         NETDEV_KIND_VTI,
53         NETDEV_KIND_DUMMY,
54         NETDEV_KIND_TUN,
55         NETDEV_KIND_TAP,
56         _NETDEV_KIND_MAX,
57         _NETDEV_KIND_INVALID = -1
58 } NetDevKind;
59
60 typedef enum NetDevState {
61         NETDEV_STATE_FAILED,
62         NETDEV_STATE_CREATING,
63         NETDEV_STATE_READY,
64         NETDEV_STATE_LINGER,
65         _NETDEV_STATE_MAX,
66         _NETDEV_STATE_INVALID = -1,
67 } NetDevState;
68
69 typedef enum NetDevCreateType {
70         NETDEV_CREATE_INDEPENDENT,
71         NETDEV_CREATE_MASTER,
72         NETDEV_CREATE_STACKED,
73         _NETDEV_CREATE_MAX,
74         _NETDEV_CREATE_INVALID = -1,
75 } NetDevCreateType;
76
77 struct NetDev {
78         Manager *manager;
79
80         int n_ref;
81
82         char *filename;
83
84         Condition *match_host;
85         Condition *match_virt;
86         Condition *match_kernel;
87         Condition *match_arch;
88
89         NetDevState state;
90         NetDevKind kind;
91         char *description;
92         char *ifname;
93         struct ether_addr *mac;
94         size_t mtu;
95         int ifindex;
96
97         LIST_HEAD(netdev_join_callback, callbacks);
98 };
99
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-vxlan.h"
105 #include "networkd-netdev-veth.h"
106 #include "networkd-netdev-tunnel.h"
107 #include "networkd-netdev-dummy.h"
108 #include "networkd-netdev-tuntap.h"
109
110 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_rtnl_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         /* verify that compulsory configuration options were specified */
138         int (*config_verify)(NetDev *netdev, const char *filename);
139 };
140
141 extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];
142
143 #define NETDEV_VTABLE(n) netdev_vtable[(n)->kind]
144
145 /* For casting a netdev into the various netdev kinds */
146 #define DEFINE_CAST(UPPERCASE, MixedCase)                                   \
147         static inline MixedCase* UPPERCASE(NetDev *n) {                     \
148                 if (_unlikely_(!n || n->kind != NETDEV_KIND_##UPPERCASE))   \
149                         return NULL;                                        \
150                                                                             \
151                 return (MixedCase*) n;                                      \
152         }
153
154 /* For casting the various netdev kinds into a netdev */
155 #define NETDEV(n) (&(n)->meta)
156
157 DEFINE_CAST(BRIDGE, Bridge);
158 DEFINE_CAST(BOND, Bond);
159 DEFINE_CAST(VLAN, VLan);
160 DEFINE_CAST(MACVLAN, MacVlan);
161 DEFINE_CAST(VXLAN, VxLan);
162 DEFINE_CAST(IPIP, Tunnel);
163 DEFINE_CAST(GRE, Tunnel);
164 DEFINE_CAST(SIT, Tunnel);
165 DEFINE_CAST(VTI, Tunnel);
166 DEFINE_CAST(VETH, Veth);
167 DEFINE_CAST(DUMMY, Dummy);
168 DEFINE_CAST(TUN, TunTap);
169 DEFINE_CAST(TAP, TunTap);
170
171 int netdev_load(Manager *manager);
172 void netdev_drop(NetDev *netdev);
173
174 NetDev *netdev_unref(NetDev *netdev);
175 NetDev *netdev_ref(NetDev *netdev);
176
177 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
178 #define _cleanup_netdev_unref_ _cleanup_(netdev_unrefp)
179
180 int netdev_get(Manager *manager, const char *name, NetDev **ret);
181 int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *newlink);
182 int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback);
183 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
184 int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t cb);
185
186 const char *netdev_kind_to_string(NetDevKind d) _const_;
187 NetDevKind netdev_kind_from_string(const char *d) _pure_;
188
189 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);
190
191 /* gperf */
192 const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
193
194 /* Macros which append INTERFACE= to the message */
195
196 #define log_full_netdev(level, netdev, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", netdev->ifname, "%-*s: " fmt, IFNAMSIZ, netdev->ifname, ##__VA_ARGS__)
197 #define log_debug_netdev(netdev, ...)       log_full_netdev(LOG_DEBUG, netdev, ##__VA_ARGS__)
198 #define log_info_netdev(netdev, ...)        log_full_netdev(LOG_INFO, netdev, ##__VA_ARGS__)
199 #define log_notice_netdev(netdev, ...)      log_full_netdev(LOG_NOTICE, netdev, ##__VA_ARGS__)
200 #define log_warning_netdev(netdev, ...)     log_full_netdev(LOG_WARNING, netdev,## __VA_ARGS__)
201 #define log_error_netdev(netdev, ...)       log_full_netdev(LOG_ERR, netdev, ##__VA_ARGS__)
202
203 #define log_struct_netdev(level, netdev, ...) log_struct(level, "INTERFACE=%s", netdev->ifname, __VA_ARGS__)
204
205 #define NETDEVIF(netdev) "INTERFACE=%s", netdev->ifname