summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/include/sc_devmgr.h1
-rw-r--r--service/src/devmgr.c65
2 files changed, 65 insertions, 1 deletions
diff --git a/service/include/sc_devmgr.h b/service/include/sc_devmgr.h
index d6ad8ee..6624bd8 100644
--- a/service/include/sc_devmgr.h
+++ b/service/include/sc_devmgr.h
@@ -33,6 +33,7 @@ enum mr_dev_driver
MR_DEV_DRV_TYPE_DPDK_VIRTIO_USER,
MR_DEV_DRV_TYPE_DPDK_AF_PACKET,
MR_DEV_DRV_TYPE_SHMDEV,
+ MR_DEV_DRV_TYPE_DPDK_MEMIF,
};
enum mr_dev_role
diff --git a/service/src/devmgr.c b/service/src/devmgr.c
index 0c204ad..76c5149 100644
--- a/service/src/devmgr.c
+++ b/service/src/devmgr.c
@@ -2105,6 +2105,62 @@ int bond_dev_init(struct devmgr_main * devmgr_main)
return RT_SUCCESS;
}
+static int dpdk_dev_memif_attach(struct devmgr_main * devmgr_main)
+{
+ char ** memif_devsyms = NULL;
+ unsigned int nr_memif_devsyms = 0;
+
+ /* main handle */
+ struct sc_main * sc = devmgr_main->sc;
+ assert(sc != NULL);
+
+ /* query the virtio device symbols */
+ memif_devsyms = gcfg_device_syms_get_by_drv(sc, MR_DEV_DRV_TYPE_DPDK_MEMIF, &nr_memif_devsyms);
+ if (unlikely(nr_memif_devsyms < 0))
+ {
+ return RT_SUCCESS;
+ }
+
+ for (unsigned int i = 0; i < nr_memif_devsyms; i++)
+ {
+ uint16_t port_id;
+
+ char vdev_name[MR_STRING_MAX];
+
+ /* the vdev must have net_memif prefix */
+ snprintf(vdev_name, sizeof(vdev_name) - 1, "net_memif%d", i);
+
+ char vdev_args[MR_STRING_MAX];
+ snprintf(vdev_args, sizeof(vdev_args) - 1, "id=%d,role=server,socket-abstract=no,socket=/var/run/mrzcpd/memif.sock", i);
+
+ int ret = rte_eal_hotplug_add("vdev", vdev_name, vdev_args);
+ if (ret < 0)
+ {
+ MR_ERROR("Attaching memif device %s failed, errno = %d", memif_devsyms[i], ret);
+ return RT_ERR;
+ }
+
+ ret = rte_eth_dev_get_port_by_name(vdev_name, &port_id);
+ if (ret < 0)
+ {
+ rte_eal_hotplug_remove("vdev", vdev_name);
+ MR_ERROR("Cannot find added vdev %s failed, errno = %d", memif_devsyms[i], ret);
+ return RT_ERR;
+ }
+
+ dpdk_dev_candidate_vdev_register(devmgr_main, memif_devsyms[i], vdev_name);
+ MR_INFO("memif device: %s attach successful, port_id=%d", memif_devsyms[i], port_id);
+ }
+
+ for (unsigned int i = 0; i < nr_memif_devsyms; i++)
+ {
+ free(memif_devsyms[i]);
+ }
+
+ free(memif_devsyms);
+ return RT_SUCCESS;
+}
+
/* VIRTIO Devices */
static int dpdk_dev_virtio_user_attach(struct devmgr_main * devmgr_main)
{
@@ -2201,7 +2257,7 @@ int dpdk_dev_setup_from_candidate(struct devmgr_main * devmgr_main, struct dpdk_
/* attach dpdk_dev structure to dev_desc */
assert(dev_desc->drv_type == MR_DEV_DRV_TYPE_DPDK_PCI || dev_desc->drv_type == MR_DEV_DRV_TYPE_DPDK_VIRTIO_USER ||
- dev_desc->drv_type == MR_DEV_DRV_TYPE_DPDK_AF_PACKET);
+ dev_desc->drv_type == MR_DEV_DRV_TYPE_DPDK_AF_PACKET || dev_desc->drv_type == MR_DEV_DRV_TYPE_DPDK_MEMIF);
/* create dual-link between dev_desc and dev_dpdk */
dev_desc->port_id = port_id;
@@ -2743,6 +2799,13 @@ int devmgr_init(struct devmgr_main * devmgr_main)
return RT_ERR;
}
+ ret = dpdk_dev_memif_attach(devmgr_main);
+ if (unlikely(ret < 0))
+ {
+ MR_ERROR("Failed at attach memif devices.");
+ return RT_ERR;
+ }
+
ret = dpdk_dev_init(devmgr_main);
if (unlikely(ret < 0))
{