#include "vlog.h"
static const struct netdev_class *base_netdev_classes[] = {
+#ifdef HAVE_NETLINK
&netdev_linux_class,
&netdev_tap_class,
- &netdev_gre_class,
&netdev_patch_class,
+ &netdev_gre_class,
+#endif
};
static struct shash netdev_classes = SHASH_INITIALIZER(&netdev_classes);
{
struct netdev_class *netdev_class;
- if (!options->may_create) {
- VLOG_WARN("attempted to create a device that may not be created: %s",
- options->name);
- return ENODEV;
- }
-
if (!options->type || strlen(options->type) == 0) {
/* Default to system. */
options->type = "system";
* 'ethertype' may be a 16-bit Ethernet protocol value in host byte order to
* capture frames of that type received on the device. It may also be one of
* the 'enum netdev_pseudo_ethertype' values to receive frames in one of those
- * categories.
- *
- * If the 'may_create' flag is set then this is allowed to be the first time
- * the device is opened (i.e. the refcount will be 1 after this call). It
- * may be set to false if the device should have already been created.
- *
- * If the 'may_open' flag is set then the call will succeed even if another
- * caller has already opened it. It may be to false if the device should not
- * currently be open. */
+ * categories. */
int
netdev_open(struct netdev_options *options, struct netdev **netdevp)
}
update_device_args(netdev_dev, options->args);
- } else if (options->may_open) {
- if (!shash_is_empty(options->args) &&
- !compare_device_args(netdev_dev, options->args)) {
+ } else if (!shash_is_empty(options->args) &&
+ !compare_device_args(netdev_dev, options->args)) {
- VLOG_WARN("%s: attempted to open already created netdev with "
- "different arguments", options->name);
- return EINVAL;
- }
- } else {
- VLOG_WARN("%s: attempted to create a netdev device with bound name",
- options->name);
- return EEXIST;
+ VLOG_WARN("%s: attempted to open already open netdev with "
+ "different arguments", options->name);
+ return EINVAL;
}
error = netdev_dev->netdev_class->open(netdev_dev, options->ethertype,
struct netdev_options options;
memset(&options, 0, sizeof options);
-
options.name = name;
options.ethertype = NETDEV_ETH_TYPE_NONE;
- options.may_create = true;
- options.may_open = true;
return netdev_open(&options, netdevp);
}
return error;
}
+/* Attempts to change the stats for 'netdev' to those provided in 'stats'.
+ * Returns 0 if successful, otherwise a positive errno value.
+ *
+ * This will probably fail for most network devices. Some devices might only
+ * allow setting their stats to 0. */
+int
+netdev_set_stats(struct netdev *netdev, const struct netdev_stats *stats)
+{
+ return (netdev_get_dev(netdev)->netdev_class->set_stats
+ ? netdev_get_dev(netdev)->netdev_class->set_stats(netdev, stats)
+ : EOPNOTSUPP);
+}
+
/* Attempts to set input rate limiting (policing) policy, such that up to
* 'kbits_rate' kbps of traffic is accepted, with a maximum accumulative burst
* size of 'kbits' kb. */