From: Yuanhan Liu Date: Tue, 10 May 2016 22:38:44 +0000 (+0800) Subject: vhost: export interface name X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=f6d1bd536567daf177d1d25b2d68464af5370ccd;p=dpdk.git vhost: export interface name Introduce a new API rte_vhost_get_ifname() to export the ifname to application. Signed-off-by: Yuanhan Liu Tested-by: Rich Lane Acked-by: Rich Lane --- diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index bbd76b1836..5c1690d00e 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -229,6 +229,7 @@ new_device(struct virtio_net *dev) struct pmd_internal *internal; struct vhost_queue *vq; unsigned i; + char ifname[PATH_MAX]; #ifdef RTE_LIBRTE_VHOST_NUMA int newnode; #endif @@ -238,9 +239,10 @@ new_device(struct virtio_net *dev) return -1; } - list = find_internal_resource(dev->ifname); + rte_vhost_get_ifname(dev->vid, ifname, sizeof(ifname)); + list = find_internal_resource(ifname); if (list == NULL) { - RTE_LOG(INFO, PMD, "Invalid device name\n"); + RTE_LOG(INFO, PMD, "Invalid device name: %s\n", ifname); return -1; } @@ -360,15 +362,17 @@ vring_state_changed(struct virtio_net *dev, uint16_t vring, int enable) struct rte_vhost_vring_state *state; struct rte_eth_dev *eth_dev; struct internal_list *list; + char ifname[PATH_MAX]; if (dev == NULL) { RTE_LOG(ERR, PMD, "Invalid argument\n"); return -1; } - list = find_internal_resource(dev->ifname); + rte_vhost_get_ifname(dev->vid, ifname, sizeof(ifname)); + list = find_internal_resource(ifname); if (list == NULL) { - RTE_LOG(ERR, PMD, "Invalid interface name: %s\n", dev->ifname); + RTE_LOG(ERR, PMD, "Invalid interface name: %s\n", ifname); return -1; } diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map index a65bef5455..d12ac97b7d 100644 --- a/lib/librte_vhost/rte_vhost_version.map +++ b/lib/librte_vhost/rte_vhost_version.map @@ -24,6 +24,7 @@ DPDK_2.1 { DPDK_16.07 { global: + rte_vhost_get_ifname; rte_vhost_get_numa_node; rte_vhost_get_queue_num; diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index de56b1bc7f..0898e8bbbd 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -267,6 +267,23 @@ int rte_vhost_get_numa_node(int vid); */ uint32_t rte_vhost_get_queue_num(int vid); +/** + * Get the virtio net device's ifname. For vhost-cuse, ifname is the + * path of the char device. For vhost-user, ifname is the vhost-user + * socket file path. + * + * @param vid + * virtio-net device ID + * @param buf + * The buffer to stored the queried ifname + * @param len + * The length of buf + * + * @return + * 0 on success, -1 on failure + */ +int rte_vhost_get_ifname(int vid, char *buf, size_t len); + /** * This function adds buffers to the virtio devices RX virtqueue. Buffers can * be received from the physical port or from another virtual device. A packet diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c index a03ff30572..375c9d43d1 100644 --- a/lib/librte_vhost/virtio-net.c +++ b/lib/librte_vhost/virtio-net.c @@ -767,6 +767,22 @@ rte_vhost_get_queue_num(int vid) return dev->virt_qp_nb; } +int +rte_vhost_get_ifname(int vid, char *buf, size_t len) +{ + struct virtio_net *dev = get_device(vid); + + if (dev == NULL) + return -1; + + len = RTE_MIN(len, sizeof(dev->ifname)); + + strncpy(buf, dev->ifname, len); + buf[len - 1] = '\0'; + + return 0; +} + int rte_vhost_enable_guest_notification(struct virtio_net *dev, uint16_t queue_id, int enable) {