- struct shash_node *node;
- int i;
-
- if (dev->n_args) {
- for (i = 0; i < dev->n_args; i++) {
- free(dev->args[i].key);
- free(dev->args[i].value);
- }
-
- free(dev->args);
- dev->n_args = 0;
- }
-
- if (!args || shash_is_empty(args)) {
- return;
- }
-
- dev->n_args = shash_count(args);
- dev->args = xmalloc(dev->n_args * sizeof *dev->args);
-
- i = 0;
- SHASH_FOR_EACH(node, args) {
- dev->args[i].key = xstrdup(node->name);
- dev->args[i].value = xstrdup(node->data);
- i++;
- }
-
- qsort(dev->args, dev->n_args, sizeof *dev->args, compare_args);
-}
-
-static int
-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. */
- options->type = "system";
- }
-
- netdev_class = shash_find_data(&netdev_classes, options->type);
- if (!netdev_class) {
- return EAFNOSUPPORT;
- }
-
- error = netdev_class->create(netdev_class, options->name, options->args,
- netdev_devp);
- assert(error || (*netdev_devp)->netdev_class == netdev_class);
- return error;