ofproto-dpif: Implement patch ports in userspace.
[sliver-openvswitch.git] / lib / netdev.c
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
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 #include <config.h>
18 #include "netdev.h"
19
20 #include <errno.h>
21 #include <inttypes.h>
22 #include <netinet/in.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26
27 #include "coverage.h"
28 #include "dynamic-string.h"
29 #include "fatal-signal.h"
30 #include "hash.h"
31 #include "list.h"
32 #include "netdev-provider.h"
33 #include "netdev-vport.h"
34 #include "ofpbuf.h"
35 #include "openflow/openflow.h"
36 #include "packets.h"
37 #include "poll-loop.h"
38 #include "shash.h"
39 #include "smap.h"
40 #include "sset.h"
41 #include "svec.h"
42 #include "vlog.h"
43
44 VLOG_DEFINE_THIS_MODULE(netdev);
45
46 COVERAGE_DEFINE(netdev_received);
47 COVERAGE_DEFINE(netdev_sent);
48 COVERAGE_DEFINE(netdev_add_router);
49 COVERAGE_DEFINE(netdev_get_stats);
50
51 static struct shash netdev_classes = SHASH_INITIALIZER(&netdev_classes);
52
53 /* All created network devices. */
54 static struct shash netdev_dev_shash = SHASH_INITIALIZER(&netdev_dev_shash);
55
56 /* All open network devices. */
57 static struct list netdev_list = LIST_INITIALIZER(&netdev_list);
58
59 /* This is set pretty low because we probably won't learn anything from the
60  * additional log messages. */
61 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
62
63 static void close_all_netdevs(void *aux OVS_UNUSED);
64 static int restore_flags(struct netdev *netdev);
65 void update_device_args(struct netdev_dev *, const struct shash *args);
66
67 static void
68 netdev_initialize(void)
69 {
70     static bool inited;
71
72     if (!inited) {
73         inited = true;
74
75         fatal_signal_add_hook(close_all_netdevs, NULL, NULL, true);
76
77 #ifdef LINUX_DATAPATH
78         netdev_register_provider(&netdev_linux_class);
79         netdev_register_provider(&netdev_internal_class);
80         netdev_register_provider(&netdev_tap_class);
81         netdev_vport_register();
82 #endif
83 #ifdef __FreeBSD__
84         netdev_register_provider(&netdev_tap_class);
85         netdev_register_provider(&netdev_bsd_class);
86 #endif
87     }
88 }
89
90 /* Performs periodic work needed by all the various kinds of netdevs.
91  *
92  * If your program opens any netdevs, it must call this function within its
93  * main poll loop. */
94 void
95 netdev_run(void)
96 {
97     struct shash_node *node;
98     SHASH_FOR_EACH(node, &netdev_classes) {
99         const struct netdev_class *netdev_class = node->data;
100         if (netdev_class->run) {
101             netdev_class->run();
102         }
103     }
104 }
105
106 /* Arranges for poll_block() to wake up when netdev_run() needs to be called.
107  *
108  * If your program opens any netdevs, it must call this function within its
109  * main poll loop. */
110 void
111 netdev_wait(void)
112 {
113     struct shash_node *node;
114     SHASH_FOR_EACH(node, &netdev_classes) {
115         const struct netdev_class *netdev_class = node->data;
116         if (netdev_class->wait) {
117             netdev_class->wait();
118         }
119     }
120 }
121
122 /* Initializes and registers a new netdev provider.  After successful
123  * registration, new netdevs of that type can be opened using netdev_open(). */
124 int
125 netdev_register_provider(const struct netdev_class *new_class)
126 {
127     if (shash_find(&netdev_classes, new_class->type)) {
128         VLOG_WARN("attempted to register duplicate netdev provider: %s",
129                    new_class->type);
130         return EEXIST;
131     }
132
133     if (new_class->init) {
134         int error = new_class->init();
135         if (error) {
136             VLOG_ERR("failed to initialize %s network device class: %s",
137                      new_class->type, strerror(error));
138             return error;
139         }
140     }
141
142     shash_add(&netdev_classes, new_class->type, new_class);
143
144     return 0;
145 }
146
147 /* Unregisters a netdev provider.  'type' must have been previously
148  * registered and not currently be in use by any netdevs.  After unregistration
149  * new netdevs of that type cannot be opened using netdev_open(). */
150 int
151 netdev_unregister_provider(const char *type)
152 {
153     struct shash_node *del_node, *netdev_dev_node;
154
155     del_node = shash_find(&netdev_classes, type);
156     if (!del_node) {
157         VLOG_WARN("attempted to unregister a netdev provider that is not "
158                   "registered: %s", type);
159         return EAFNOSUPPORT;
160     }
161
162     SHASH_FOR_EACH(netdev_dev_node, &netdev_dev_shash) {
163         struct netdev_dev *netdev_dev = netdev_dev_node->data;
164         if (!strcmp(netdev_dev->netdev_class->type, type)) {
165             VLOG_WARN("attempted to unregister in use netdev provider: %s",
166                       type);
167             return EBUSY;
168         }
169     }
170
171     shash_delete(&netdev_classes, del_node);
172
173     return 0;
174 }
175
176 const struct netdev_class *
177 netdev_lookup_provider(const char *type)
178 {
179     netdev_initialize();
180     return shash_find_data(&netdev_classes, type && type[0] ? type : "system");
181 }
182
183 /* Clears 'types' and enumerates the types of all currently registered netdev
184  * providers into it.  The caller must first initialize the sset. */
185 void
186 netdev_enumerate_types(struct sset *types)
187 {
188     struct shash_node *node;
189
190     netdev_initialize();
191     sset_clear(types);
192
193     SHASH_FOR_EACH(node, &netdev_classes) {
194         const struct netdev_class *netdev_class = node->data;
195         sset_add(types, netdev_class->type);
196     }
197 }
198
199 /* Opens the network device named 'name' (e.g. "eth0") of the specified 'type'
200  * (e.g. "system") and returns zero if successful, otherwise a positive errno
201  * value.  On success, sets '*netdevp' to the new network device, otherwise to
202  * null.
203  *
204  * Some network devices may need to be configured (with netdev_set_config())
205  * before they can be used. */
206 int
207 netdev_open(const char *name, const char *type, struct netdev **netdevp)
208 {
209     struct netdev_dev *netdev_dev;
210     int error;
211
212     *netdevp = NULL;
213     netdev_initialize();
214
215     netdev_dev = shash_find_data(&netdev_dev_shash, name);
216
217     if (!netdev_dev) {
218         const struct netdev_class *class;
219
220         class = netdev_lookup_provider(type);
221         if (!class) {
222             VLOG_WARN("could not create netdev %s of unknown type %s",
223                       name, type);
224             return EAFNOSUPPORT;
225         }
226         error = class->create(class, name, &netdev_dev);
227         if (error) {
228             return error;
229         }
230         ovs_assert(netdev_dev->netdev_class == class);
231
232     }
233
234     error = netdev_dev->netdev_class->open(netdev_dev, netdevp);
235
236     if (!error) {
237         netdev_dev->ref_cnt++;
238     } else {
239         if (!netdev_dev->ref_cnt) {
240             netdev_dev_uninit(netdev_dev, true);
241         }
242     }
243
244     return error;
245 }
246
247 /* Reconfigures the device 'netdev' with 'args'.  'args' may be empty
248  * or NULL if none are needed. */
249 int
250 netdev_set_config(struct netdev *netdev, const struct smap *args)
251 {
252     struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
253
254     if (netdev_dev->netdev_class->set_config) {
255         struct smap no_args = SMAP_INITIALIZER(&no_args);
256         return netdev_dev->netdev_class->set_config(netdev_dev,
257                                                     args ? args : &no_args);
258     } else if (args && !smap_is_empty(args)) {
259         VLOG_WARN("%s: arguments provided to device that is not configurable",
260                   netdev_get_name(netdev));
261     }
262
263     return 0;
264 }
265
266 /* Returns the current configuration for 'netdev' in 'args'.  The caller must
267  * have already initialized 'args' with smap_init().  Returns 0 on success, in
268  * which case 'args' will be filled with 'netdev''s configuration.  On failure
269  * returns a positive errno value, in which case 'args' will be empty.
270  *
271  * The caller owns 'args' and its contents and must eventually free them with
272  * smap_destroy(). */
273 int
274 netdev_get_config(const struct netdev *netdev, struct smap *args)
275 {
276     struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
277     int error;
278
279     smap_clear(args);
280     if (netdev_dev->netdev_class->get_config) {
281         error = netdev_dev->netdev_class->get_config(netdev_dev, args);
282         if (error) {
283             smap_clear(args);
284         }
285     } else {
286         error = 0;
287     }
288
289     return error;
290 }
291
292 const struct netdev_tunnel_config *
293 netdev_get_tunnel_config(const struct netdev *netdev)
294 {
295     struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
296
297     if (netdev_dev->netdev_class->get_tunnel_config) {
298         return netdev_dev->netdev_class->get_tunnel_config(netdev_dev);
299     } else {
300         return NULL;
301     }
302 }
303
304 /* Closes and destroys 'netdev'. */
305 void
306 netdev_close(struct netdev *netdev)
307 {
308     if (netdev) {
309         struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
310
311         ovs_assert(netdev_dev->ref_cnt);
312         netdev_dev->ref_cnt--;
313         netdev_uninit(netdev, true);
314
315         /* If the reference count for the netdev device is zero, destroy it. */
316         if (!netdev_dev->ref_cnt) {
317             netdev_dev_uninit(netdev_dev, true);
318         }
319     }
320 }
321
322 /* Returns true if a network device named 'name' exists and may be opened,
323  * otherwise false. */
324 bool
325 netdev_exists(const char *name)
326 {
327     struct netdev *netdev;
328     int error;
329
330     error = netdev_open(name, "system", &netdev);
331     if (!error) {
332         netdev_close(netdev);
333         return true;
334     } else {
335         if (error != ENODEV) {
336             VLOG_WARN("failed to open network device %s: %s",
337                       name, strerror(error));
338         }
339         return false;
340     }
341 }
342
343 /* Returns true if a network device named 'name' is currently opened,
344  * otherwise false. */
345 bool
346 netdev_is_open(const char *name)
347 {
348     return !!shash_find_data(&netdev_dev_shash, name);
349 }
350
351 /* Parses 'netdev_name_', which is of the form [type@]name into its component
352  * pieces.  'name' and 'type' must be freed by the caller. */
353 void
354 netdev_parse_name(const char *netdev_name_, char **name, char **type)
355 {
356     char *netdev_name = xstrdup(netdev_name_);
357     char *separator;
358
359     separator = strchr(netdev_name, '@');
360     if (separator) {
361         *separator = '\0';
362         *type = netdev_name;
363         *name = xstrdup(separator + 1);
364     } else {
365         *name = netdev_name;
366         *type = xstrdup("system");
367     }
368 }
369
370 /* Attempts to set up 'netdev' for receiving packets with netdev_recv().
371  * Returns 0 if successful, otherwise a positive errno value.  EOPNOTSUPP
372  * indicates that the network device does not implement packet reception
373  * through this interface. */
374 int
375 netdev_listen(struct netdev *netdev)
376 {
377     int (*listen)(struct netdev *);
378
379     listen = netdev_get_dev(netdev)->netdev_class->listen;
380     return listen ? (listen)(netdev) : EOPNOTSUPP;
381 }
382
383 /* Attempts to receive a packet from 'netdev' into 'buffer', which the caller
384  * must have initialized with sufficient room for the packet.  The space
385  * required to receive any packet is ETH_HEADER_LEN bytes, plus VLAN_HEADER_LEN
386  * bytes, plus the device's MTU (which may be retrieved via netdev_get_mtu()).
387  * (Some devices do not allow for a VLAN header, in which case VLAN_HEADER_LEN
388  * need not be included.)
389  *
390  * This function can only be expected to return a packet if ->listen() has
391  * been called successfully.
392  *
393  * If a packet is successfully retrieved, returns 0.  In this case 'buffer' is
394  * guaranteed to contain at least ETH_TOTAL_MIN bytes.  Otherwise, returns a
395  * positive errno value.  Returns EAGAIN immediately if no packet is ready to
396  * be returned.
397  *
398  * Some network devices may not implement support for this function.  In such
399  * cases this function will always return EOPNOTSUPP. */
400 int
401 netdev_recv(struct netdev *netdev, struct ofpbuf *buffer)
402 {
403     int (*recv)(struct netdev *, void *, size_t);
404     int retval;
405
406     ovs_assert(buffer->size == 0);
407     ovs_assert(ofpbuf_tailroom(buffer) >= ETH_TOTAL_MIN);
408
409     recv = netdev_get_dev(netdev)->netdev_class->recv;
410     retval = (recv
411               ? (recv)(netdev, buffer->data, ofpbuf_tailroom(buffer))
412               : -EOPNOTSUPP);
413     if (retval >= 0) {
414         COVERAGE_INC(netdev_received);
415         buffer->size += retval;
416         if (buffer->size < ETH_TOTAL_MIN) {
417             ofpbuf_put_zeros(buffer, ETH_TOTAL_MIN - buffer->size);
418         }
419         return 0;
420     } else {
421         return -retval;
422     }
423 }
424
425 /* Registers with the poll loop to wake up from the next call to poll_block()
426  * when a packet is ready to be received with netdev_recv() on 'netdev'. */
427 void
428 netdev_recv_wait(struct netdev *netdev)
429 {
430     void (*recv_wait)(struct netdev *);
431
432     recv_wait = netdev_get_dev(netdev)->netdev_class->recv_wait;
433     if (recv_wait) {
434         recv_wait(netdev);
435     }
436 }
437
438 /* Discards all packets waiting to be received from 'netdev'. */
439 int
440 netdev_drain(struct netdev *netdev)
441 {
442     int (*drain)(struct netdev *);
443
444     drain = netdev_get_dev(netdev)->netdev_class->drain;
445     return drain ? drain(netdev) : 0;
446 }
447
448 /* Sends 'buffer' on 'netdev'.  Returns 0 if successful, otherwise a positive
449  * errno value.  Returns EAGAIN without blocking if the packet cannot be queued
450  * immediately.  Returns EMSGSIZE if a partial packet was transmitted or if
451  * the packet is too big or too small to transmit on the device.
452  *
453  * The caller retains ownership of 'buffer' in all cases.
454  *
455  * The kernel maintains a packet transmission queue, so the caller is not
456  * expected to do additional queuing of packets.
457  *
458  * Some network devices may not implement support for this function.  In such
459  * cases this function will always return EOPNOTSUPP. */
460 int
461 netdev_send(struct netdev *netdev, const struct ofpbuf *buffer)
462 {
463     int (*send)(struct netdev *, const void *, size_t);
464     int error;
465
466     send = netdev_get_dev(netdev)->netdev_class->send;
467     error = send ? (send)(netdev, buffer->data, buffer->size) : EOPNOTSUPP;
468     if (!error) {
469         COVERAGE_INC(netdev_sent);
470     }
471     return error;
472 }
473
474 /* Registers with the poll loop to wake up from the next call to poll_block()
475  * when the packet transmission queue has sufficient room to transmit a packet
476  * with netdev_send().
477  *
478  * The kernel maintains a packet transmission queue, so the client is not
479  * expected to do additional queuing of packets.  Thus, this function is
480  * unlikely to ever be used.  It is included for completeness. */
481 void
482 netdev_send_wait(struct netdev *netdev)
483 {
484     void (*send_wait)(struct netdev *);
485
486     send_wait = netdev_get_dev(netdev)->netdev_class->send_wait;
487     if (send_wait) {
488         send_wait(netdev);
489     }
490 }
491
492 /* Attempts to set 'netdev''s MAC address to 'mac'.  Returns 0 if successful,
493  * otherwise a positive errno value. */
494 int
495 netdev_set_etheraddr(struct netdev *netdev, const uint8_t mac[ETH_ADDR_LEN])
496 {
497     return netdev_get_dev(netdev)->netdev_class->set_etheraddr(netdev, mac);
498 }
499
500 /* Retrieves 'netdev''s MAC address.  If successful, returns 0 and copies the
501  * the MAC address into 'mac'.  On failure, returns a positive errno value and
502  * clears 'mac' to all-zeros. */
503 int
504 netdev_get_etheraddr(const struct netdev *netdev, uint8_t mac[ETH_ADDR_LEN])
505 {
506     return netdev_get_dev(netdev)->netdev_class->get_etheraddr(netdev, mac);
507 }
508
509 /* Returns the name of the network device that 'netdev' represents,
510  * e.g. "eth0".  The caller must not modify or free the returned string. */
511 const char *
512 netdev_get_name(const struct netdev *netdev)
513 {
514     return netdev_get_dev(netdev)->name;
515 }
516
517 /* Retrieves the MTU of 'netdev'.  The MTU is the maximum size of transmitted
518  * (and received) packets, in bytes, not including the hardware header; thus,
519  * this is typically 1500 bytes for Ethernet devices.
520  *
521  * If successful, returns 0 and stores the MTU size in '*mtup'.  Returns
522  * EOPNOTSUPP if 'netdev' does not have an MTU (as e.g. some tunnels do not).
523  * On other failure, returns a positive errno value.  On failure, sets '*mtup'
524  * to 0. */
525 int
526 netdev_get_mtu(const struct netdev *netdev, int *mtup)
527 {
528     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
529     int error;
530
531     error = class->get_mtu ? class->get_mtu(netdev, mtup) : EOPNOTSUPP;
532     if (error) {
533         *mtup = 0;
534         if (error != EOPNOTSUPP) {
535             VLOG_DBG_RL(&rl, "failed to retrieve MTU for network device %s: "
536                          "%s", netdev_get_name(netdev), strerror(error));
537         }
538     }
539     return error;
540 }
541
542 /* Sets the MTU of 'netdev'.  The MTU is the maximum size of transmitted
543  * (and received) packets, in bytes.
544  *
545  * If successful, returns 0.  Returns EOPNOTSUPP if 'netdev' does not have an
546  * MTU (as e.g. some tunnels do not).  On other failure, returns a positive
547  * errno value. */
548 int
549 netdev_set_mtu(const struct netdev *netdev, int mtu)
550 {
551     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
552     int error;
553
554     error = class->set_mtu ? class->set_mtu(netdev, mtu) : EOPNOTSUPP;
555     if (error && error != EOPNOTSUPP) {
556         VLOG_DBG_RL(&rl, "failed to set MTU for network device %s: %s",
557                      netdev_get_name(netdev), strerror(error));
558     }
559
560     return error;
561 }
562
563 /* Returns the ifindex of 'netdev', if successful, as a positive number.  On
564  * failure, returns a negative errno value.
565  *
566  * The desired semantics of the ifindex value are a combination of those
567  * specified by POSIX for if_nametoindex() and by SNMP for ifIndex.  An ifindex
568  * value should be unique within a host and remain stable at least until
569  * reboot.  SNMP says an ifindex "ranges between 1 and the value of ifNumber"
570  * but many systems do not follow this rule anyhow.
571  *
572  * Some network devices may not implement support for this function.  In such
573  * cases this function will always return -EOPNOTSUPP.
574  */
575 int
576 netdev_get_ifindex(const struct netdev *netdev)
577 {
578     int (*get_ifindex)(const struct netdev *);
579
580     get_ifindex = netdev_get_dev(netdev)->netdev_class->get_ifindex;
581
582     return get_ifindex ? get_ifindex(netdev) : -EOPNOTSUPP;
583 }
584
585 /* Stores the features supported by 'netdev' into each of '*current',
586  * '*advertised', '*supported', and '*peer' that are non-null.  Each value is a
587  * bitmap of "enum ofp_port_features" bits, in host byte order.  Returns 0 if
588  * successful, otherwise a positive errno value.  On failure, all of the
589  * passed-in values are set to 0.
590  *
591  * Some network devices may not implement support for this function.  In such
592  * cases this function will always return EOPNOTSUPP. */
593 int
594 netdev_get_features(const struct netdev *netdev,
595                     enum netdev_features *current,
596                     enum netdev_features *advertised,
597                     enum netdev_features *supported,
598                     enum netdev_features *peer)
599 {
600     int (*get_features)(const struct netdev *netdev,
601                         enum netdev_features *current,
602                         enum netdev_features *advertised,
603                         enum netdev_features *supported,
604                         enum netdev_features *peer);
605     enum netdev_features dummy[4];
606     int error;
607
608     if (!current) {
609         current = &dummy[0];
610     }
611     if (!advertised) {
612         advertised = &dummy[1];
613     }
614     if (!supported) {
615         supported = &dummy[2];
616     }
617     if (!peer) {
618         peer = &dummy[3];
619     }
620
621     get_features = netdev_get_dev(netdev)->netdev_class->get_features;
622     error = get_features
623                     ? get_features(netdev, current, advertised, supported,
624                                    peer)
625                     : EOPNOTSUPP;
626     if (error) {
627         *current = *advertised = *supported = *peer = 0;
628     }
629     return error;
630 }
631
632 /* Returns the maximum speed of a network connection that has the NETDEV_F_*
633  * bits in 'features', in bits per second.  If no bits that indicate a speed
634  * are set in 'features', returns 'default_bps'. */
635 uint64_t
636 netdev_features_to_bps(enum netdev_features features,
637                        uint64_t default_bps)
638 {
639     enum {
640         F_1000000MB = NETDEV_F_1TB_FD,
641         F_100000MB = NETDEV_F_100GB_FD,
642         F_40000MB = NETDEV_F_40GB_FD,
643         F_10000MB = NETDEV_F_10GB_FD,
644         F_1000MB = NETDEV_F_1GB_HD | NETDEV_F_1GB_FD,
645         F_100MB = NETDEV_F_100MB_HD | NETDEV_F_100MB_FD,
646         F_10MB = NETDEV_F_10MB_HD | NETDEV_F_10MB_FD
647     };
648
649     return (  features & F_1000000MB ? UINT64_C(1000000000000)
650             : features & F_100000MB  ? UINT64_C(100000000000)
651             : features & F_40000MB   ? UINT64_C(40000000000)
652             : features & F_10000MB   ? UINT64_C(10000000000)
653             : features & F_1000MB    ? UINT64_C(1000000000)
654             : features & F_100MB     ? UINT64_C(100000000)
655             : features & F_10MB      ? UINT64_C(10000000)
656                                      : default_bps);
657 }
658
659 /* Returns true if any of the NETDEV_F_* bits that indicate a full-duplex link
660  * are set in 'features', otherwise false. */
661 bool
662 netdev_features_is_full_duplex(enum netdev_features features)
663 {
664     return (features & (NETDEV_F_10MB_FD | NETDEV_F_100MB_FD | NETDEV_F_1GB_FD
665                         | NETDEV_F_10GB_FD | NETDEV_F_40GB_FD
666                         | NETDEV_F_100GB_FD | NETDEV_F_1TB_FD)) != 0;
667 }
668
669 /* Set the features advertised by 'netdev' to 'advertise'.  Returns 0 if
670  * successful, otherwise a positive errno value. */
671 int
672 netdev_set_advertisements(struct netdev *netdev,
673                           enum netdev_features advertise)
674 {
675     return (netdev_get_dev(netdev)->netdev_class->set_advertisements
676             ? netdev_get_dev(netdev)->netdev_class->set_advertisements(
677                     netdev, advertise)
678             : EOPNOTSUPP);
679 }
680
681 /* If 'netdev' has an assigned IPv4 address, sets '*address' to that address
682  * and '*netmask' to its netmask and returns 0.  Otherwise, returns a positive
683  * errno value and sets '*address' to 0 (INADDR_ANY).
684  *
685  * The following error values have well-defined meanings:
686  *
687  *   - EADDRNOTAVAIL: 'netdev' has no assigned IPv4 address.
688  *
689  *   - EOPNOTSUPP: No IPv4 network stack attached to 'netdev'.
690  *
691  * 'address' or 'netmask' or both may be null, in which case the address or
692  * netmask is not reported. */
693 int
694 netdev_get_in4(const struct netdev *netdev,
695                struct in_addr *address_, struct in_addr *netmask_)
696 {
697     struct in_addr address;
698     struct in_addr netmask;
699     int error;
700
701     error = (netdev_get_dev(netdev)->netdev_class->get_in4
702              ? netdev_get_dev(netdev)->netdev_class->get_in4(netdev,
703                     &address, &netmask)
704              : EOPNOTSUPP);
705     if (address_) {
706         address_->s_addr = error ? 0 : address.s_addr;
707     }
708     if (netmask_) {
709         netmask_->s_addr = error ? 0 : netmask.s_addr;
710     }
711     return error;
712 }
713
714 /* Assigns 'addr' as 'netdev''s IPv4 address and 'mask' as its netmask.  If
715  * 'addr' is INADDR_ANY, 'netdev''s IPv4 address is cleared.  Returns a
716  * positive errno value. */
717 int
718 netdev_set_in4(struct netdev *netdev, struct in_addr addr, struct in_addr mask)
719 {
720     return (netdev_get_dev(netdev)->netdev_class->set_in4
721             ? netdev_get_dev(netdev)->netdev_class->set_in4(netdev, addr, mask)
722             : EOPNOTSUPP);
723 }
724
725 /* Obtains ad IPv4 address from device name and save the address in
726  * in4.  Returns 0 if successful, otherwise a positive errno value.
727  */
728 int
729 netdev_get_in4_by_name(const char *device_name, struct in_addr *in4)
730 {
731     struct netdev *netdev;
732     int error;
733
734     error = netdev_open(device_name, "system", &netdev);
735     if (error) {
736         in4->s_addr = htonl(0);
737         return error;
738     }
739
740     error = netdev_get_in4(netdev, in4, NULL);
741     netdev_close(netdev);
742     return error;
743 }
744
745 /* Adds 'router' as a default IP gateway for the TCP/IP stack that corresponds
746  * to 'netdev'. */
747 int
748 netdev_add_router(struct netdev *netdev, struct in_addr router)
749 {
750     COVERAGE_INC(netdev_add_router);
751     return (netdev_get_dev(netdev)->netdev_class->add_router
752             ? netdev_get_dev(netdev)->netdev_class->add_router(netdev, router)
753             : EOPNOTSUPP);
754 }
755
756 /* Looks up the next hop for 'host' for the TCP/IP stack that corresponds to
757  * 'netdev'.  If a route cannot not be determined, sets '*next_hop' to 0,
758  * '*netdev_name' to null, and returns a positive errno value.  Otherwise, if a
759  * next hop is found, stores the next hop gateway's address (0 if 'host' is on
760  * a directly connected network) in '*next_hop' and a copy of the name of the
761  * device to reach 'host' in '*netdev_name', and returns 0.  The caller is
762  * responsible for freeing '*netdev_name' (by calling free()). */
763 int
764 netdev_get_next_hop(const struct netdev *netdev,
765                     const struct in_addr *host, struct in_addr *next_hop,
766                     char **netdev_name)
767 {
768     int error = (netdev_get_dev(netdev)->netdev_class->get_next_hop
769                  ? netdev_get_dev(netdev)->netdev_class->get_next_hop(
770                         host, next_hop, netdev_name)
771                  : EOPNOTSUPP);
772     if (error) {
773         next_hop->s_addr = 0;
774         *netdev_name = NULL;
775     }
776     return error;
777 }
778
779 /* Populates 'smap' with status information.
780  *
781  * Populates 'smap' with 'netdev' specific status information.  This
782  * information may be used to populate the status column of the Interface table
783  * as defined in ovs-vswitchd.conf.db(5). */
784 int
785 netdev_get_status(const struct netdev *netdev, struct smap *smap)
786 {
787     struct netdev_dev *dev = netdev_get_dev(netdev);
788
789     return (dev->netdev_class->get_status
790             ? dev->netdev_class->get_status(netdev, smap)
791             : EOPNOTSUPP);
792 }
793
794 /* If 'netdev' has an assigned IPv6 address, sets '*in6' to that address and
795  * returns 0.  Otherwise, returns a positive errno value and sets '*in6' to
796  * all-zero-bits (in6addr_any).
797  *
798  * The following error values have well-defined meanings:
799  *
800  *   - EADDRNOTAVAIL: 'netdev' has no assigned IPv6 address.
801  *
802  *   - EOPNOTSUPP: No IPv6 network stack attached to 'netdev'.
803  *
804  * 'in6' may be null, in which case the address itself is not reported. */
805 int
806 netdev_get_in6(const struct netdev *netdev, struct in6_addr *in6)
807 {
808     struct in6_addr dummy;
809     int error;
810
811     error = (netdev_get_dev(netdev)->netdev_class->get_in6
812              ? netdev_get_dev(netdev)->netdev_class->get_in6(netdev,
813                     in6 ? in6 : &dummy)
814              : EOPNOTSUPP);
815     if (error && in6) {
816         memset(in6, 0, sizeof *in6);
817     }
818     return error;
819 }
820
821 /* On 'netdev', turns off the flags in 'off' and then turns on the flags in
822  * 'on'.  If 'permanent' is true, the changes will persist; otherwise, they
823  * will be reverted when 'netdev' is closed or the program exits.  Returns 0 if
824  * successful, otherwise a positive errno value. */
825 static int
826 do_update_flags(struct netdev *netdev, enum netdev_flags off,
827                 enum netdev_flags on, enum netdev_flags *old_flagsp,
828                 bool permanent)
829 {
830     enum netdev_flags old_flags;
831     int error;
832
833     error = netdev_get_dev(netdev)->netdev_class->update_flags(netdev,
834                 off & ~on, on, &old_flags);
835     if (error) {
836         VLOG_WARN_RL(&rl, "failed to %s flags for network device %s: %s",
837                      off || on ? "set" : "get", netdev_get_name(netdev),
838                      strerror(error));
839         old_flags = 0;
840     } else if ((off || on) && !permanent) {
841         enum netdev_flags new_flags = (old_flags & ~off) | on;
842         enum netdev_flags changed_flags = old_flags ^ new_flags;
843         if (changed_flags) {
844             if (!netdev->changed_flags) {
845                 netdev->save_flags = old_flags;
846             }
847             netdev->changed_flags |= changed_flags;
848         }
849     }
850     if (old_flagsp) {
851         *old_flagsp = old_flags;
852     }
853     return error;
854 }
855
856 /* Obtains the current flags for 'netdev' and stores them into '*flagsp'.
857  * Returns 0 if successful, otherwise a positive errno value.  On failure,
858  * stores 0 into '*flagsp'. */
859 int
860 netdev_get_flags(const struct netdev *netdev_, enum netdev_flags *flagsp)
861 {
862     struct netdev *netdev = CONST_CAST(struct netdev *, netdev_);
863     return do_update_flags(netdev, 0, 0, flagsp, false);
864 }
865
866 /* Sets the flags for 'netdev' to 'flags'.
867  * If 'permanent' is true, the changes will persist; otherwise, they
868  * will be reverted when 'netdev' is closed or the program exits.
869  * Returns 0 if successful, otherwise a positive errno value. */
870 int
871 netdev_set_flags(struct netdev *netdev, enum netdev_flags flags,
872                  bool permanent)
873 {
874     return do_update_flags(netdev, -1, flags, NULL, permanent);
875 }
876
877 /* Turns on the specified 'flags' on 'netdev'.
878  * If 'permanent' is true, the changes will persist; otherwise, they
879  * will be reverted when 'netdev' is closed or the program exits.
880  * Returns 0 if successful, otherwise a positive errno value. */
881 int
882 netdev_turn_flags_on(struct netdev *netdev, enum netdev_flags flags,
883                      bool permanent)
884 {
885     return do_update_flags(netdev, 0, flags, NULL, permanent);
886 }
887
888 /* Turns off the specified 'flags' on 'netdev'.
889  * If 'permanent' is true, the changes will persist; otherwise, they
890  * will be reverted when 'netdev' is closed or the program exits.
891  * Returns 0 if successful, otherwise a positive errno value. */
892 int
893 netdev_turn_flags_off(struct netdev *netdev, enum netdev_flags flags,
894                       bool permanent)
895 {
896     return do_update_flags(netdev, flags, 0, NULL, permanent);
897 }
898
899 /* Looks up the ARP table entry for 'ip' on 'netdev'.  If one exists and can be
900  * successfully retrieved, it stores the corresponding MAC address in 'mac' and
901  * returns 0.  Otherwise, it returns a positive errno value; in particular,
902  * ENXIO indicates that there is no ARP table entry for 'ip' on 'netdev'. */
903 int
904 netdev_arp_lookup(const struct netdev *netdev,
905                   ovs_be32 ip, uint8_t mac[ETH_ADDR_LEN])
906 {
907     int error = (netdev_get_dev(netdev)->netdev_class->arp_lookup
908                  ? netdev_get_dev(netdev)->netdev_class->arp_lookup(netdev,
909                         ip, mac)
910                  : EOPNOTSUPP);
911     if (error) {
912         memset(mac, 0, ETH_ADDR_LEN);
913     }
914     return error;
915 }
916
917 /* Returns true if carrier is active (link light is on) on 'netdev'. */
918 bool
919 netdev_get_carrier(const struct netdev *netdev)
920 {
921     int error;
922     enum netdev_flags flags;
923     bool carrier;
924
925     netdev_get_flags(netdev, &flags);
926     if (!(flags & NETDEV_UP)) {
927         return false;
928     }
929
930     if (!netdev_get_dev(netdev)->netdev_class->get_carrier) {
931         return true;
932     }
933
934     error = netdev_get_dev(netdev)->netdev_class->get_carrier(netdev,
935                                                               &carrier);
936     if (error) {
937         VLOG_DBG("%s: failed to get network device carrier status, assuming "
938                  "down: %s", netdev_get_name(netdev), strerror(error));
939         carrier = false;
940     }
941
942     return carrier;
943 }
944
945 /* Returns the number of times 'netdev''s carrier has changed. */
946 long long int
947 netdev_get_carrier_resets(const struct netdev *netdev)
948 {
949     return (netdev_get_dev(netdev)->netdev_class->get_carrier_resets
950             ? netdev_get_dev(netdev)->netdev_class->get_carrier_resets(netdev)
951             : 0);
952 }
953
954 /* Attempts to force netdev_get_carrier() to poll 'netdev''s MII registers for
955  * link status instead of checking 'netdev''s carrier.  'netdev''s MII
956  * registers will be polled once ever 'interval' milliseconds.  If 'netdev'
957  * does not support MII, another method may be used as a fallback.  If
958  * 'interval' is less than or equal to zero, reverts netdev_get_carrier() to
959  * its normal behavior.
960  *
961  * Returns 0 if successful, otherwise a positive errno value. */
962 int
963 netdev_set_miimon_interval(struct netdev *netdev, long long int interval)
964 {
965     struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
966     return (netdev_dev->netdev_class->set_miimon_interval
967             ? netdev_dev->netdev_class->set_miimon_interval(netdev, interval)
968             : EOPNOTSUPP);
969 }
970
971 /* Retrieves current device stats for 'netdev'. */
972 int
973 netdev_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
974 {
975     int error;
976
977     COVERAGE_INC(netdev_get_stats);
978     error = (netdev_get_dev(netdev)->netdev_class->get_stats
979              ? netdev_get_dev(netdev)->netdev_class->get_stats(netdev, stats)
980              : EOPNOTSUPP);
981     if (error) {
982         memset(stats, 0xff, sizeof *stats);
983     }
984     return error;
985 }
986
987 /* Attempts to change the stats for 'netdev' to those provided in 'stats'.
988  * Returns 0 if successful, otherwise a positive errno value.
989  *
990  * This will probably fail for most network devices.  Some devices might only
991  * allow setting their stats to 0. */
992 int
993 netdev_set_stats(struct netdev *netdev, const struct netdev_stats *stats)
994 {
995     return (netdev_get_dev(netdev)->netdev_class->set_stats
996              ? netdev_get_dev(netdev)->netdev_class->set_stats(netdev, stats)
997              : EOPNOTSUPP);
998 }
999
1000 /* Attempts to set input rate limiting (policing) policy, such that up to
1001  * 'kbits_rate' kbps of traffic is accepted, with a maximum accumulative burst
1002  * size of 'kbits' kb. */
1003 int
1004 netdev_set_policing(struct netdev *netdev, uint32_t kbits_rate,
1005                     uint32_t kbits_burst)
1006 {
1007     return (netdev_get_dev(netdev)->netdev_class->set_policing
1008             ? netdev_get_dev(netdev)->netdev_class->set_policing(netdev,
1009                     kbits_rate, kbits_burst)
1010             : EOPNOTSUPP);
1011 }
1012
1013 /* Adds to 'types' all of the forms of QoS supported by 'netdev', or leaves it
1014  * empty if 'netdev' does not support QoS.  Any names added to 'types' should
1015  * be documented as valid for the "type" column in the "QoS" table in
1016  * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
1017  *
1018  * Every network device supports disabling QoS with a type of "", but this type
1019  * will not be added to 'types'.
1020  *
1021  * The caller must initialize 'types' (e.g. with sset_init()) before calling
1022  * this function.  The caller is responsible for destroying 'types' (e.g. with
1023  * sset_destroy()) when it is no longer needed.
1024  *
1025  * Returns 0 if successful, otherwise a positive errno value. */
1026 int
1027 netdev_get_qos_types(const struct netdev *netdev, struct sset *types)
1028 {
1029     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1030     return (class->get_qos_types
1031             ? class->get_qos_types(netdev, types)
1032             : 0);
1033 }
1034
1035 /* Queries 'netdev' for its capabilities regarding the specified 'type' of QoS,
1036  * which should be "" or one of the types returned by netdev_get_qos_types()
1037  * for 'netdev'.  Returns 0 if successful, otherwise a positive errno value.
1038  * On success, initializes 'caps' with the QoS capabilities; on failure, clears
1039  * 'caps' to all zeros. */
1040 int
1041 netdev_get_qos_capabilities(const struct netdev *netdev, const char *type,
1042                             struct netdev_qos_capabilities *caps)
1043 {
1044     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1045
1046     if (*type) {
1047         int retval = (class->get_qos_capabilities
1048                       ? class->get_qos_capabilities(netdev, type, caps)
1049                       : EOPNOTSUPP);
1050         if (retval) {
1051             memset(caps, 0, sizeof *caps);
1052         }
1053         return retval;
1054     } else {
1055         /* Every netdev supports turning off QoS. */
1056         memset(caps, 0, sizeof *caps);
1057         return 0;
1058     }
1059 }
1060
1061 /* Obtains the number of queues supported by 'netdev' for the specified 'type'
1062  * of QoS.  Returns 0 if successful, otherwise a positive errno value.  Stores
1063  * the number of queues (zero on failure) in '*n_queuesp'.
1064  *
1065  * This is just a simple wrapper around netdev_get_qos_capabilities(). */
1066 int
1067 netdev_get_n_queues(const struct netdev *netdev,
1068                     const char *type, unsigned int *n_queuesp)
1069 {
1070     struct netdev_qos_capabilities caps;
1071     int retval;
1072
1073     retval = netdev_get_qos_capabilities(netdev, type, &caps);
1074     *n_queuesp = caps.n_queues;
1075     return retval;
1076 }
1077
1078 /* Queries 'netdev' about its currently configured form of QoS.  If successful,
1079  * stores the name of the current form of QoS into '*typep', stores any details
1080  * of configuration as string key-value pairs in 'details', and returns 0.  On
1081  * failure, sets '*typep' to NULL and returns a positive errno value.
1082  *
1083  * A '*typep' of "" indicates that QoS is currently disabled on 'netdev'.
1084  *
1085  * The caller must initialize 'details' as an empty smap (e.g. with
1086  * smap_init()) before calling this function.  The caller must free 'details'
1087  * when it is no longer needed (e.g. with smap_destroy()).
1088  *
1089  * The caller must not modify or free '*typep'.
1090  *
1091  * '*typep' will be one of the types returned by netdev_get_qos_types() for
1092  * 'netdev'.  The contents of 'details' should be documented as valid for
1093  * '*typep' in the "other_config" column in the "QoS" table in
1094  * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)). */
1095 int
1096 netdev_get_qos(const struct netdev *netdev,
1097                const char **typep, struct smap *details)
1098 {
1099     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1100     int retval;
1101
1102     if (class->get_qos) {
1103         retval = class->get_qos(netdev, typep, details);
1104         if (retval) {
1105             *typep = NULL;
1106             smap_clear(details);
1107         }
1108         return retval;
1109     } else {
1110         /* 'netdev' doesn't support QoS, so report that QoS is disabled. */
1111         *typep = "";
1112         return 0;
1113     }
1114 }
1115
1116 /* Attempts to reconfigure QoS on 'netdev', changing the form of QoS to 'type'
1117  * with details of configuration from 'details'.  Returns 0 if successful,
1118  * otherwise a positive errno value.  On error, the previous QoS configuration
1119  * is retained.
1120  *
1121  * When this function changes the type of QoS (not just 'details'), this also
1122  * resets all queue configuration for 'netdev' to their defaults (which depend
1123  * on the specific type of QoS).  Otherwise, the queue configuration for
1124  * 'netdev' is unchanged.
1125  *
1126  * 'type' should be "" (to disable QoS) or one of the types returned by
1127  * netdev_get_qos_types() for 'netdev'.  The contents of 'details' should be
1128  * documented as valid for the given 'type' in the "other_config" column in the
1129  * "QoS" table in vswitchd/vswitch.xml (which is built as
1130  * ovs-vswitchd.conf.db(8)).
1131  *
1132  * NULL may be specified for 'details' if there are no configuration
1133  * details. */
1134 int
1135 netdev_set_qos(struct netdev *netdev,
1136                const char *type, const struct smap *details)
1137 {
1138     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1139
1140     if (!type) {
1141         type = "";
1142     }
1143
1144     if (class->set_qos) {
1145         if (!details) {
1146             static struct smap empty = SMAP_INITIALIZER(&empty);
1147             details = &empty;
1148         }
1149         return class->set_qos(netdev, type, details);
1150     } else {
1151         return *type ? EOPNOTSUPP : 0;
1152     }
1153 }
1154
1155 /* Queries 'netdev' for information about the queue numbered 'queue_id'.  If
1156  * successful, adds that information as string key-value pairs to 'details'.
1157  * Returns 0 if successful, otherwise a positive errno value.
1158  *
1159  * 'queue_id' must be less than the number of queues supported by 'netdev' for
1160  * the current form of QoS (e.g. as returned by netdev_get_n_queues(netdev)).
1161  *
1162  * The returned contents of 'details' should be documented as valid for the
1163  * given 'type' in the "other_config" column in the "Queue" table in
1164  * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
1165  *
1166  * The caller must initialize 'details' (e.g. with smap_init()) before calling
1167  * this function.  The caller must free 'details' when it is no longer needed
1168  * (e.g. with smap_destroy()). */
1169 int
1170 netdev_get_queue(const struct netdev *netdev,
1171                  unsigned int queue_id, struct smap *details)
1172 {
1173     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1174     int retval;
1175
1176     retval = (class->get_queue
1177               ? class->get_queue(netdev, queue_id, details)
1178               : EOPNOTSUPP);
1179     if (retval) {
1180         smap_clear(details);
1181     }
1182     return retval;
1183 }
1184
1185 /* Configures the queue numbered 'queue_id' on 'netdev' with the key-value
1186  * string pairs in 'details'.  The contents of 'details' should be documented
1187  * as valid for the given 'type' in the "other_config" column in the "Queue"
1188  * table in vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
1189  * Returns 0 if successful, otherwise a positive errno value.  On failure, the
1190  * given queue's configuration should be unmodified.
1191  *
1192  * 'queue_id' must be less than the number of queues supported by 'netdev' for
1193  * the current form of QoS (e.g. as returned by netdev_get_n_queues(netdev)).
1194  *
1195  * This function does not modify 'details', and the caller retains ownership of
1196  * it. */
1197 int
1198 netdev_set_queue(struct netdev *netdev,
1199                  unsigned int queue_id, const struct smap *details)
1200 {
1201     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1202     return (class->set_queue
1203             ? class->set_queue(netdev, queue_id, details)
1204             : EOPNOTSUPP);
1205 }
1206
1207 /* Attempts to delete the queue numbered 'queue_id' from 'netdev'.  Some kinds
1208  * of QoS may have a fixed set of queues, in which case attempts to delete them
1209  * will fail with EOPNOTSUPP.
1210  *
1211  * Returns 0 if successful, otherwise a positive errno value.  On failure, the
1212  * given queue will be unmodified.
1213  *
1214  * 'queue_id' must be less than the number of queues supported by 'netdev' for
1215  * the current form of QoS (e.g. as returned by
1216  * netdev_get_n_queues(netdev)). */
1217 int
1218 netdev_delete_queue(struct netdev *netdev, unsigned int queue_id)
1219 {
1220     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1221     return (class->delete_queue
1222             ? class->delete_queue(netdev, queue_id)
1223             : EOPNOTSUPP);
1224 }
1225
1226 /* Obtains statistics about 'queue_id' on 'netdev'.  On success, returns 0 and
1227  * fills 'stats' with the queue's statistics; individual members of 'stats' may
1228  * be set to all-1-bits if the statistic is unavailable.  On failure, returns a
1229  * positive errno value and fills 'stats' with all-1-bits. */
1230 int
1231 netdev_get_queue_stats(const struct netdev *netdev, unsigned int queue_id,
1232                        struct netdev_queue_stats *stats)
1233 {
1234     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1235     int retval;
1236
1237     retval = (class->get_queue_stats
1238               ? class->get_queue_stats(netdev, queue_id, stats)
1239               : EOPNOTSUPP);
1240     if (retval) {
1241         memset(stats, 0xff, sizeof *stats);
1242     }
1243     return retval;
1244 }
1245
1246 /* Iterates over all of 'netdev''s queues, calling 'cb' with the queue's ID,
1247  * its configuration, and the 'aux' specified by the caller.  The order of
1248  * iteration is unspecified, but (when successful) each queue is visited
1249  * exactly once.
1250  *
1251  * Calling this function may be more efficient than calling netdev_get_queue()
1252  * for every queue.
1253  *
1254  * 'cb' must not modify or free the 'details' argument passed in.  It may
1255  * delete or modify the queue passed in as its 'queue_id' argument.  It may
1256  * modify but must not delete any other queue within 'netdev'.  'cb' should not
1257  * add new queues because this may cause some queues to be visited twice or not
1258  * at all.
1259  *
1260  * Returns 0 if successful, otherwise a positive errno value.  On error, some
1261  * configured queues may not have been included in the iteration. */
1262 int
1263 netdev_dump_queues(const struct netdev *netdev,
1264                    netdev_dump_queues_cb *cb, void *aux)
1265 {
1266     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1267     return (class->dump_queues
1268             ? class->dump_queues(netdev, cb, aux)
1269             : EOPNOTSUPP);
1270 }
1271
1272 /* Iterates over all of 'netdev''s queues, calling 'cb' with the queue's ID,
1273  * its statistics, and the 'aux' specified by the caller.  The order of
1274  * iteration is unspecified, but (when successful) each queue is visited
1275  * exactly once.
1276  *
1277  * Calling this function may be more efficient than calling
1278  * netdev_get_queue_stats() for every queue.
1279  *
1280  * 'cb' must not modify or free the statistics passed in.
1281  *
1282  * Returns 0 if successful, otherwise a positive errno value.  On error, some
1283  * configured queues may not have been included in the iteration. */
1284 int
1285 netdev_dump_queue_stats(const struct netdev *netdev,
1286                         netdev_dump_queue_stats_cb *cb, void *aux)
1287 {
1288     const struct netdev_class *class = netdev_get_dev(netdev)->netdev_class;
1289     return (class->dump_queue_stats
1290             ? class->dump_queue_stats(netdev, cb, aux)
1291             : EOPNOTSUPP);
1292 }
1293
1294 /* Returns a sequence number which indicates changes in one of 'netdev''s
1295  * properties.  The returned sequence will be nonzero so that callers have a
1296  * value which they may use as a reset when tracking 'netdev'.
1297  *
1298  * The returned sequence number will change whenever 'netdev''s flags,
1299  * features, ethernet address, or carrier changes.  It may change for other
1300  * reasons as well, or no reason at all. */
1301 unsigned int
1302 netdev_change_seq(const struct netdev *netdev)
1303 {
1304     return netdev_get_dev(netdev)->netdev_class->change_seq(netdev);
1305 }
1306 \f
1307 /* Initializes 'netdev_dev' as a netdev device named 'name' of the specified
1308  * 'netdev_class'.  This function is ordinarily called from a netdev provider's
1309  * 'create' function.
1310  *
1311  * This function adds 'netdev_dev' to a netdev-owned shash, so it is
1312  * very important that 'netdev_dev' only be freed after calling
1313  * the refcount drops to zero.  */
1314 void
1315 netdev_dev_init(struct netdev_dev *netdev_dev, const char *name,
1316                 const struct netdev_class *netdev_class)
1317 {
1318     ovs_assert(!shash_find(&netdev_dev_shash, name));
1319
1320     memset(netdev_dev, 0, sizeof *netdev_dev);
1321     netdev_dev->netdev_class = netdev_class;
1322     netdev_dev->name = xstrdup(name);
1323     netdev_dev->node = shash_add(&netdev_dev_shash, name, netdev_dev);
1324 }
1325
1326 /* Undoes the results of initialization.
1327  *
1328  * Normally this function does not need to be called as netdev_close has
1329  * the same effect when the refcount drops to zero.
1330  * However, it may be called by providers due to an error on creation
1331  * that occurs after initialization.  It this case netdev_close() would
1332  * never be called. */
1333 void
1334 netdev_dev_uninit(struct netdev_dev *netdev_dev, bool destroy)
1335 {
1336     char *name = netdev_dev->name;
1337
1338     ovs_assert(!netdev_dev->ref_cnt);
1339
1340     shash_delete(&netdev_dev_shash, netdev_dev->node);
1341
1342     if (destroy) {
1343         netdev_dev->netdev_class->destroy(netdev_dev);
1344     }
1345     free(name);
1346 }
1347
1348 /* Returns the class type of 'netdev_dev'.
1349  *
1350  * The caller must not free the returned value. */
1351 const char *
1352 netdev_dev_get_type(const struct netdev_dev *netdev_dev)
1353 {
1354     return netdev_dev->netdev_class->type;
1355 }
1356
1357 /* Returns the class associated with 'netdev_dev'. */
1358 const struct netdev_class *
1359 netdev_dev_get_class(const struct netdev_dev *netdev_dev)
1360 {
1361     return netdev_dev->netdev_class;
1362 }
1363
1364 /* Returns the name of 'netdev_dev'.
1365  *
1366  * The caller must not free the returned value. */
1367 const char *
1368 netdev_dev_get_name(const struct netdev_dev *netdev_dev)
1369 {
1370     return netdev_dev->name;
1371 }
1372
1373 /* Returns the netdev_dev with 'name' or NULL if there is none.
1374  *
1375  * The caller must not free the returned value. */
1376 struct netdev_dev *
1377 netdev_dev_from_name(const char *name)
1378 {
1379     return shash_find_data(&netdev_dev_shash, name);
1380 }
1381
1382 /* Fills 'device_list' with devices that match 'netdev_class'.
1383  *
1384  * The caller is responsible for initializing and destroying 'device_list'
1385  * but the contained netdev_devs must not be freed. */
1386 void
1387 netdev_dev_get_devices(const struct netdev_class *netdev_class,
1388                        struct shash *device_list)
1389 {
1390     struct shash_node *node;
1391     SHASH_FOR_EACH (node, &netdev_dev_shash) {
1392         struct netdev_dev *dev = node->data;
1393
1394         if (dev->netdev_class == netdev_class) {
1395             shash_add(device_list, node->name, node->data);
1396         }
1397     }
1398 }
1399
1400 /* Initializes 'netdev' as a instance of the netdev_dev.
1401  *
1402  * This function adds 'netdev' to a netdev-owned linked list, so it is very
1403  * important that 'netdev' only be freed after calling netdev_close(). */
1404 void
1405 netdev_init(struct netdev *netdev, struct netdev_dev *netdev_dev)
1406 {
1407     memset(netdev, 0, sizeof *netdev);
1408     netdev->netdev_dev = netdev_dev;
1409     list_push_back(&netdev_list, &netdev->node);
1410 }
1411
1412 /* Undoes the results of initialization.
1413  *
1414  * Normally this function only needs to be called from netdev_close().
1415  * However, it may be called by providers due to an error on opening
1416  * that occurs after initialization.  It this case netdev_close() would
1417  * never be called. */
1418 void
1419 netdev_uninit(struct netdev *netdev, bool close)
1420 {
1421     /* Restore flags that we changed, if any. */
1422     int error = restore_flags(netdev);
1423     list_remove(&netdev->node);
1424     if (error) {
1425         VLOG_WARN("failed to restore network device flags on %s: %s",
1426                   netdev_get_name(netdev), strerror(error));
1427     }
1428
1429     if (close) {
1430         netdev_get_dev(netdev)->netdev_class->close(netdev);
1431     }
1432 }
1433
1434
1435 /* Returns the class type of 'netdev'.
1436  *
1437  * The caller must not free the returned value. */
1438 const char *
1439 netdev_get_type(const struct netdev *netdev)
1440 {
1441     return netdev_get_dev(netdev)->netdev_class->type;
1442 }
1443
1444
1445 const char *
1446 netdev_get_type_from_name(const char *name)
1447 {
1448     const struct netdev_dev *dev = netdev_dev_from_name(name);
1449     return dev ? netdev_dev_get_type(dev) : NULL;
1450 }
1451
1452 struct netdev_dev *
1453 netdev_get_dev(const struct netdev *netdev)
1454 {
1455     return netdev->netdev_dev;
1456 }
1457 \f
1458 /* Restore the network device flags on 'netdev' to those that were active
1459  * before we changed them.  Returns 0 if successful, otherwise a positive
1460  * errno value.
1461  *
1462  * To avoid reentry, the caller must ensure that fatal signals are blocked. */
1463 static int
1464 restore_flags(struct netdev *netdev)
1465 {
1466     if (netdev->changed_flags) {
1467         enum netdev_flags restore = netdev->save_flags & netdev->changed_flags;
1468         enum netdev_flags old_flags;
1469         return netdev_get_dev(netdev)->netdev_class->update_flags(netdev,
1470                                            netdev->changed_flags & ~restore,
1471                                            restore, &old_flags);
1472     }
1473     return 0;
1474 }
1475
1476 /* Close all netdevs on shutdown so they can do any needed cleanup such as
1477  * destroying devices, restoring flags, etc. */
1478 static void
1479 close_all_netdevs(void *aux OVS_UNUSED)
1480 {
1481     struct netdev *netdev, *next;
1482     LIST_FOR_EACH_SAFE(netdev, next, node, &netdev_list) {
1483         netdev_close(netdev);
1484     }
1485 }