/** Pathname of VMBUS devices directory. */
#define SYSFS_VMBUS_DEVICES "/sys/bus/vmbus/devices"
+/*
+ * GUID associated with network devices
+ * {f8615163-df3e-46c5-913f-f2d2f965ed0e}
+ */
+static const rte_uuid_t vmbus_nic_uuid = {
+ 0xf8, 0x61, 0x51, 0x63,
+ 0xdf, 0x3e,
+ 0x46, 0xc5,
+ 0x91, 0x3f,
+ 0xf2, 0xd2, 0xf9, 0x65, 0xed, 0xe
+};
+
extern struct rte_vmbus_bus rte_vmbus_bus;
/* Read sysfs file to get UUID */
char filename[PATH_MAX];
char dirname[PATH_MAX];
unsigned long tmp;
+ char *dev_name;
dev = calloc(1, sizeof(*dev));
if (dev == NULL)
return -1;
- dev->device.name = strdup(name);
+ dev->device.bus = &rte_vmbus_bus.bus;
+ dev->device.name = dev_name = strdup(name);
if (!dev->device.name)
goto error;
snprintf(dirname, sizeof(dirname), "%s/%s",
SYSFS_VMBUS_DEVICES, name);
- /* get device id */
- snprintf(filename, sizeof(filename), "%s/device_id", dirname);
- if (parse_sysfs_uuid(filename, dev->device_id) < 0)
- goto error;
-
/* get device class */
snprintf(filename, sizeof(filename), "%s/class_id", dirname);
if (parse_sysfs_uuid(filename, dev->class_id) < 0)
goto error;
+ /* skip non-network devices */
+ if (rte_uuid_compare(dev->class_id, vmbus_nic_uuid) != 0) {
+ free(dev_name);
+ free(dev);
+ return 0;
+ }
+
+ /* get device id */
+ snprintf(filename, sizeof(filename), "%s/device_id", dirname);
+ if (parse_sysfs_uuid(filename, dev->device_id) < 0)
+ goto error;
+
/* get relid */
snprintf(filename, sizeof(filename), "%s/id", dirname);
if (eal_parse_sysfs_value(filename, &tmp) < 0)
dev->device.numa_node = SOCKET_ID_ANY;
}
+ dev->device.devargs = vmbus_devargs_lookup(dev);
+
+ /* Allocate interrupt handle instance */
+ dev->intr_handle =
+ rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+ if (dev->intr_handle == NULL)
+ goto error;
+
/* device is valid, add in list (sorted) */
VMBUS_LOG(DEBUG, "Adding vmbus device %s", name);
} else { /* already registered */
VMBUS_LOG(NOTICE,
"%s already registered", name);
+ free(dev_name);
free(dev);
}
return 0;
error:
VMBUS_LOG(DEBUG, "failed");
+ free(dev_name);
free(dev);
return -1;
}