dev->cache_valid = 0;
netdev_bsd_changed(dev);
}
+ netdev_close(base_dev);
}
} else {
/*
shash_init(&device_shash);
netdev_get_devices(&netdev_bsd_class, &device_shash);
SHASH_FOR_EACH (node, &device_shash) {
- dev = node->data;
+ struct netdev *netdev = node->data;
+ dev = netdev_bsd_cast(netdev);
dev->cache_valid = 0;
netdev_bsd_changed(dev);
+ netdev_close(netdev);
}
shash_destroy(&device_shash);
}
}
#if defined(__NetBSD__)
-static struct netdev *
-find_netdev_by_kernel_name(const char *kernel_name)
+static char *
+netdev_bsd_kernel_name_to_ovs_name(const char *kernel_name)
{
+ char *ovs_name = NULL;
struct shash device_shash;
struct shash_node *node;
shash_init(&device_shash);
netdev_get_devices(&netdev_tap_class, &device_shash);
SHASH_FOR_EACH(node, &device_shash) {
- struct netdev_bsd * const dev = node->data;
+ struct netdev *netdev = node->data;
+ struct netdev_bsd * const dev = netdev_bsd_cast(netdev);
if (!strcmp(dev->kernel_name, kernel_name)) {
- shash_destroy(&device_shash);
- return &dev->up;
+ free(ovs_name);
+ ovs_name = xstrdup(netdev_get_name(&dev->up));
}
+ netdev_close(netdev);
}
shash_destroy(&device_shash);
- return NULL;
-}
-
-static const char *
-netdev_bsd_convert_kernel_name_to_ovs_name(const char *kernel_name)
-{
- const struct netdev * const netdev =
- find_netdev_by_kernel_name(kernel_name);
- if (netdev == NULL) {
- return NULL;
- }
- return netdev_get_name(netdev);
+ return ovs_name ? ovs_name : xstrdup(kernel_name);
}
#endif
if ((i == RTA_IFP) && sa->sa_family == AF_LINK) {
const struct sockaddr_dl * const sdl =
(const struct sockaddr_dl *)sa;
- const size_t nlen = sdl->sdl_nlen;
- char * const kernel_name = xmalloc(nlen + 1);
- const char *name;
-
- memcpy(kernel_name, sdl->sdl_data, nlen);
- kernel_name[nlen] = 0;
- name = netdev_bsd_convert_kernel_name_to_ovs_name(kernel_name);
- if (name == NULL) {
- ifname = xstrdup(kernel_name);
- } else {
- ifname = xstrdup(name);
- }
+ char *kernel_name;
+
+ kernel_name = xmemdup0(sdl->sdl_data, sdl->sdl_nlen);
+ ifname = netdev_bsd_kernel_name_to_ovs_name(kernel_name);
free(kernel_name);
}
RT_ADVANCE(cp, sa);