]> git.proxmox.com Git - mirror_ovs.git/blob - lib/netdev-provider.h
Merge citrix branch into master.
[mirror_ovs.git] / lib / netdev-provider.h
1 /*
2 * Copyright (c) 2009 Nicira Networks.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef NETDEV_PROVIDER_H
18 #define NETDEV_PROVIDER_H 1
19
20 /* Generic interface to network devices. */
21
22 #include <assert.h>
23 #include "netdev.h"
24 #include "list.h"
25
26 /* A network device (e.g. an Ethernet device).
27 *
28 * This structure should be treated as opaque by network device
29 * implementations. */
30 struct netdev {
31 const struct netdev_class *class;
32 char *name; /* e.g. "eth0" */
33 enum netdev_flags save_flags; /* Initial device flags. */
34 enum netdev_flags changed_flags; /* Flags that we changed. */
35 struct list node; /* Element in global list. */
36 };
37
38 void netdev_init(struct netdev *, const char *name,
39 const struct netdev_class *);
40 static inline void netdev_assert_class(const struct netdev *netdev,
41 const struct netdev_class *class)
42 {
43 assert(netdev->class == class);
44 }
45
46 /* A network device notifier.
47 *
48 * Network device implementations should use netdev_notifier_init() to
49 * initialize this structure, but they may freely read its members after
50 * initialization. */
51 struct netdev_notifier {
52 struct netdev *netdev;
53 void (*cb)(struct netdev_notifier *);
54 void *aux;
55 };
56 void netdev_notifier_init(struct netdev_notifier *, struct netdev *,
57 void (*cb)(struct netdev_notifier *), void *aux);
58
59 /* Network device class structure, to be defined by each implementation of a
60 * network device.
61 *
62 * These functions return 0 if successful or a positive errno value on failure,
63 * except where otherwise noted. */
64 struct netdev_class {
65 /* Prefix for names of netdevs in this class, e.g. "ndunix:".
66 *
67 * One netdev class may have the empty string "" as its prefix, in which
68 * case that netdev class is associated with netdev names that do not
69 * contain a colon. */
70 const char *prefix;
71
72 /* Class name, for use in error messages. */
73 const char *name;
74
75 /* Called only once, at program startup. Returning an error from this
76 * function will prevent any network device in this class from being
77 * opened.
78 *
79 * This function may be set to null if a network device class needs no
80 * initialization at program startup. */
81 int (*init)(void);
82
83 /* Performs periodic work needed by netdevs of this class. May be null if
84 * no periodic work is necessary. */
85 void (*run)(void);
86
87 /* Arranges for poll_block() to wake up if the "run" member function needs
88 * to be called. May be null if nothing is needed here. */
89 void (*wait)(void);
90
91 /* Attempts to open a network device. On success, sets '*netdevp' to the
92 * new network device. 'name' is the full network device name provided by
93 * the user. This name is useful for error messages but must not be
94 * modified.
95 *
96 * 'suffix' is a copy of 'name' following the netdev's 'prefix'.
97 *
98 * 'ethertype' may be a 16-bit Ethernet protocol value in host byte order
99 * to capture frames of that type received on the device. It may also be
100 * one of the 'enum netdev_pseudo_ethertype' values to receive frames in
101 * one of those categories. */
102 int (*open)(const char *name, char *suffix, int ethertype,
103 struct netdev **netdevp);
104
105 /* Closes 'netdev'. */
106 void (*close)(struct netdev *netdev);
107
108 /* Enumerates the names of all network devices of this class.
109 *
110 * The caller has already initialized 'all_names' and might already have
111 * added some names to it. This function should not disturb any existing
112 * names in 'all_names'.
113 *
114 * If this netdev class does not support enumeration, this may be a null
115 * pointer. */
116 int (*enumerate)(struct svec *all_names);
117
118 /* Attempts to receive a packet from 'netdev' into the 'size' bytes in
119 * 'buffer'. If successful, returns the number of bytes in the received
120 * packet, otherwise a negative errno value. Returns -EAGAIN immediately
121 * if no packet is ready to be received. */
122 int (*recv)(struct netdev *netdev, void *buffer, size_t size);
123
124 /* Registers with the poll loop to wake up from the next call to
125 * poll_block() when a packet is ready to be received with netdev_recv() on
126 * 'netdev'. */
127 void (*recv_wait)(struct netdev *netdev);
128
129 /* Discards all packets waiting to be received from 'netdev'. */
130 int (*drain)(struct netdev *netdev);
131
132 /* Sends the 'size'-byte packet in 'buffer' on 'netdev'. Returns 0 if
133 * successful, otherwise a positive errno value. Returns EAGAIN without
134 * blocking if the packet cannot be queued immediately. Returns EMSGSIZE
135 * if a partial packet was transmitted or if the packet is too big or too
136 * small to transmit on the device.
137 *
138 * The caller retains ownership of 'buffer' in all cases.
139 *
140 * The network device is expected to maintain a packet transmission queue,
141 * so that the caller does not ordinarily have to do additional queuing of
142 * packets. */
143 int (*send)(struct netdev *netdev, const void *buffer, size_t size);
144
145 /* Registers with the poll loop to wake up from the next call to
146 * poll_block() when the packet transmission queue for 'netdev' has
147 * sufficient room to transmit a packet with netdev_send().
148 *
149 * The network device is expected to maintain a packet transmission queue,
150 * so that the caller does not ordinarily have to do additional queuing of
151 * packets. Thus, this function is unlikely to ever be useful. */
152 void (*send_wait)(struct netdev *netdev);
153
154 /* Sets 'netdev''s Ethernet address to 'mac' */
155 int (*set_etheraddr)(struct netdev *netdev, const uint8_t mac[6]);
156
157 /* Retrieves 'netdev''s Ethernet address into 'mac'. */
158 int (*get_etheraddr)(const struct netdev *netdev, uint8_t mac[6]);
159
160 /* Retrieves 'netdev''s MTU into '*mtup'.
161 *
162 * The MTU is the maximum size of transmitted (and received) packets, in
163 * bytes, not including the hardware header; thus, this is typically 1500
164 * bytes for Ethernet devices.*/
165 int (*get_mtu)(const struct netdev *, int *mtup);
166
167 /* Sets 'carrier' to true if carrier is active (link light is on) on
168 * 'netdev'. */
169 int (*get_carrier)(const struct netdev *netdev, bool *carrier);
170
171 /* Retrieves current device stats for 'netdev' into 'stats'.
172 *
173 * A network device that supports some statistics but not others, it should
174 * set the values of the unsupported statistics to all-1-bits
175 * (UINT64_MAX). */
176 int (*get_stats)(const struct netdev *netdev, struct netdev_stats *stats);
177
178 /* Stores the features supported by 'netdev' into each of '*current',
179 * '*advertised', '*supported', and '*peer'. Each value is a bitmap of
180 * "enum ofp_port_features" bits, in host byte order. */
181 int (*get_features)(struct netdev *netdev,
182 uint32_t *current, uint32_t *advertised,
183 uint32_t *supported, uint32_t *peer);
184
185 /* Set the features advertised by 'netdev' to 'advertise', which is a
186 * bitmap of "enum ofp_port_features" bits, in host byte order.
187 *
188 * This function may be set to null for a network device that does not
189 * support configuring advertisements. */
190 int (*set_advertisements)(struct netdev *, uint32_t advertise);
191
192 /* If 'netdev' is a VLAN network device (e.g. one created with vconfig(8)),
193 * sets '*vlan_vid' to the VLAN VID associated with that device and returns
194 * 0.
195 *
196 * Returns ENOENT if 'netdev_name' is the name of a network device that is
197 * not a VLAN device.
198 *
199 * This function should be set to null if it doesn't make any sense for
200 * your network device (it probably doesn't). */
201 int (*get_vlan_vid)(const struct netdev *netdev, int *vlan_vid);
202
203 /* Attempts to set input rate limiting (policing) policy, such that up to
204 * 'kbits_rate' kbps of traffic is accepted, with a maximum accumulative
205 * burst size of 'kbits' kb.
206 *
207 * This function may be set to null if policing is not supported. */
208 int (*set_policing)(struct netdev *netdev, unsigned int kbits_rate,
209 unsigned int kbits_burst);
210
211 /* If 'netdev' has an assigned IPv4 address, sets '*address' to that
212 * address and '*netmask' to the associated netmask.
213 *
214 * The following error values have well-defined meanings:
215 *
216 * - EADDRNOTAVAIL: 'netdev' has no assigned IPv4 address.
217 *
218 * - EOPNOTSUPP: No IPv4 network stack attached to 'netdev'.
219 *
220 * This function may be set to null if it would always return EOPNOTSUPP
221 * anyhow. */
222 int (*get_in4)(const struct netdev *netdev, struct in_addr *address,
223 struct in_addr *netmask);
224
225 /* Assigns 'addr' as 'netdev''s IPv4 address and 'mask' as its netmask. If
226 * 'addr' is INADDR_ANY, 'netdev''s IPv4 address is cleared.
227 *
228 * This function may be set to null if it would always return EOPNOTSUPP
229 * anyhow. */
230 int (*set_in4)(struct netdev *, struct in_addr addr, struct in_addr mask);
231
232 /* If 'netdev' has an assigned IPv6 address, sets '*in6' to that address.
233 *
234 * The following error values have well-defined meanings:
235 *
236 * - EADDRNOTAVAIL: 'netdev' has no assigned IPv6 address.
237 *
238 * - EOPNOTSUPP: No IPv6 network stack attached to 'netdev'.
239 *
240 * This function may be set to null if it would always return EOPNOTSUPP
241 * anyhow. */
242 int (*get_in6)(const struct netdev *netdev, struct in6_addr *in6);
243
244 /* Adds 'router' as a default IP gateway for the TCP/IP stack that
245 * corresponds to 'netdev'.
246 *
247 * This function may be set to null if it would always return EOPNOTSUPP
248 * anyhow. */
249 int (*add_router)(struct netdev *netdev, struct in_addr router);
250
251 /* Looks up the next hop for 'host'. If succesful, stores the next hop
252 * gateway's address (0 if 'host' is on a directly connected network) in
253 * '*next_hop' and a copy of the name of the device to reach 'host' in
254 * '*netdev_name', and returns 0. The caller is responsible for freeing
255 * '*netdev_name' (by calling free()).
256 *
257 * This function may be set to null if it would always return EOPNOTSUPP
258 * anyhow. */
259 int (*get_next_hop)(const struct in_addr *host, struct in_addr *next_hop,
260 char **netdev_name);
261
262 /* Looks up the ARP table entry for 'ip' on 'netdev' and stores the
263 * corresponding MAC address in 'mac'. A return value of ENXIO, in
264 * particular, indicates that there is no ARP table entry for 'ip' on
265 * 'netdev'.
266 *
267 * This function may be set to null if it would always return EOPNOTSUPP
268 * anyhow. */
269 int (*arp_lookup)(const struct netdev *, uint32_t ip, uint8_t mac[6]);
270
271 /* Retrieves the current set of flags on 'netdev' into '*old_flags'. Then,
272 * turns off the flags that are set to 1 in 'off' and turns on the flags
273 * that are set to 1 in 'on'. (No bit will be set to 1 in both 'off' and
274 * 'on'; that is, off & on == 0.)
275 *
276 * This function may be invoked from a signal handler. Therefore, it
277 * should not do anything that is not signal-safe (such as logging). */
278 int (*update_flags)(struct netdev *netdev, enum netdev_flags off,
279 enum netdev_flags on, enum netdev_flags *old_flags);
280
281 /* Arranges for 'cb' to be called whenever one of the attributes of
282 * 'netdev' changes and sets '*notifierp' to a newly created
283 * netdev_notifier that represents this arrangement. The created notifier
284 * will have its 'netdev', 'cb', and 'aux' members set to the values of the
285 * corresponding parameters. */
286 int (*poll_add)(struct netdev *netdev,
287 void (*cb)(struct netdev_notifier *), void *aux,
288 struct netdev_notifier **notifierp);
289
290 /* Cancels poll notification for 'notifier'. */
291 void (*poll_remove)(struct netdev_notifier *notifier);
292 };
293
294 extern const struct netdev_class netdev_linux_class;
295 extern const struct netdev_class netdev_tap_class;
296
297 #endif /* netdev.h */