X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=lib%2Fnetdev.c;h=a15315a79019ca5062a07b7796d0ff3476fad97f;hb=f4b6076acab233cfe02e7eaefdeafbb69dfae556;hp=4741e24b3aff78b03b5a0e5a91f15cfde5cb3743;hpb=4c0f178060b740faac9a5aec915a24dc3b61770c;p=openvswitch diff --git a/lib/netdev.c b/lib/netdev.c index 4741e24b..a15315a7 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -42,10 +42,12 @@ #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); @@ -263,12 +265,6 @@ create_device(struct netdev_options *options, struct netdev_dev **netdev_devp) { 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"; @@ -295,15 +291,7 @@ create_device(struct netdev_options *options, struct netdev_dev **netdev_devp) * '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) @@ -328,18 +316,12 @@ 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, @@ -362,11 +344,8 @@ netdev_open_default(const char *name, struct netdev **netdevp) 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); } @@ -958,6 +937,19 @@ netdev_get_stats(const struct netdev *netdev, struct netdev_stats *stats) 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. */