#include "svec.h"
#include "vlog.h"
-VLOG_DEFINE_THIS_MODULE(netdev)
+VLOG_DEFINE_THIS_MODULE(netdev);
+
+COVERAGE_DEFINE(netdev_received);
+COVERAGE_DEFINE(netdev_sent);
+COVERAGE_DEFINE(netdev_add_router);
+COVERAGE_DEFINE(netdev_get_stats);
static struct shash netdev_classes = SHASH_INITIALIZER(&netdev_classes);
create_device(struct netdev_options *options, struct netdev_dev **netdev_devp)
{
struct netdev_class *netdev_class;
+ int error;
if (!options->type || strlen(options->type) == 0) {
/* Default to system. */
return EAFNOSUPPORT;
}
- return netdev_class->create(netdev_class, options->name, options->args,
- netdev_devp);
+ error = netdev_class->create(netdev_class, options->name, options->args,
+ netdev_devp);
+ assert(error || (*netdev_devp)->netdev_class == netdev_class);
+ return error;
}
/* Opens the network device named 'name' (e.g. "eth0") and returns zero if
return error;
}
-/* Sets 'carrier' to true if carrier is active (link light is on) on
- * 'netdev'. */
-int
-netdev_get_carrier(const struct netdev *netdev, bool *carrier)
+/* Returns true if carrier is active (link light is on) on 'netdev'. */
+bool
+netdev_get_carrier(const struct netdev *netdev)
{
- int error = (netdev_get_dev(netdev)->netdev_class->get_carrier
- ? netdev_get_dev(netdev)->netdev_class->get_carrier(netdev,
- carrier)
- : EOPNOTSUPP);
+ int error;
+ enum netdev_flags flags;
+ bool carrier;
+
+ netdev_get_flags(netdev, &flags);
+ if (!(flags & NETDEV_UP)) {
+ return false;
+ }
+
+ if (!netdev_get_dev(netdev)->netdev_class->get_carrier) {
+ return true;
+ }
+
+ error = netdev_get_dev(netdev)->netdev_class->get_carrier(netdev,
+ &carrier);
if (error) {
- *carrier = false;
+ VLOG_DBG("%s: failed to get network device carrier status, assuming "
+ "down: %s", netdev_get_name(netdev), strerror(error));
+ carrier = false;
}
- return error;
+
+ return carrier;
}
/* Retrieves current device stats for 'netdev'. */