-static struct kib_dev *
-kiblnd_create_dev(char *ifname)
-{
- struct net_device *netdev;
- struct kib_dev *dev = NULL;
- int flags;
- int rc;
-
- rtnl_lock();
- for_each_netdev(&init_net, netdev) {
- struct in_device *in_dev;
-
- if (strcmp(netdev->name, "lo") == 0) /* skip the loopback IF */
- continue;
-
- flags = dev_get_flags(netdev);
- if (!(flags & IFF_UP)) {
- CWARN("Can't query IPoIB interface %s: it's down\n",
- netdev->name);
- continue;
- }
-
- in_dev = __in_dev_get_rtnl(netdev);
- if (!in_dev) {
- CWARN("Interface %s has no IPv4 status.\n",
- netdev->name);
- continue;
- }
-
- for_ifa(in_dev)
- if (strcmp(ifname, ifa->ifa_label) == 0) {
- LIBCFS_ALLOC(dev, sizeof(*dev));
- if (!dev)
- goto unlock;
-
- dev->ibd_can_failover = !!(flags & IFF_MASTER);
- dev->ibd_ifip = ntohl(ifa->ifa_local);
-
- INIT_LIST_HEAD(&dev->ibd_nets);
- INIT_LIST_HEAD(&dev->ibd_list); /* not yet in kib_devs */
- INIT_LIST_HEAD(&dev->ibd_fail_list);
- break;
- }
- endfor_ifa(in_dev);
- }
- rtnl_unlock();
-
- if (!dev) {
- CERROR("Can't find any usable interfaces\n");
- return NULL;
- }
-
- if (dev->ibd_ifip == 0) {
- CERROR("Can't initialize device: no IP address\n");
- goto free_dev;
- }
- strcpy(&dev->ibd_ifname[0], ifname);
-
- /* initialize the device */
- rc = kiblnd_dev_failover(dev);
- if (rc != 0) {
- CERROR("Can't initialize device: %d\n", rc);
- goto free_dev;
- }
-
- list_add_tail(&dev->ibd_list, &kiblnd_data.kib_devs);
- return dev;
-unlock:
- rtnl_unlock();
-free_dev:
- LIBCFS_FREE(dev, sizeof(*dev));
- return NULL;
-}
-