diff options
| -rw-r--r-- | service/include/sc_devmgr.h | 1 | ||||
| -rw-r--r-- | service/src/devmgr.c | 65 |
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)) { |
