From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wenfeng Liu Subject: [PATCH v2] net/virtio-user: support changing tap interface name Date: Tue, 28 Mar 2017 12:09:09 +0000 Message-ID: <1490702949-5944-1-git-send-email-liuwf@arraynetworks.com.cn> Mime-Version: 1.0 Content-Type: text/plain Cc: To: , , Return-path: Received: from mail01.arraynetworks.com.cn (mail.arraynetworks.com.cn [124.42.99.121]) by dpdk.org (Postfix) with ESMTP id 60A7229C7 for ; Tue, 28 Mar 2017 06:10:58 +0200 (CEST) List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch adds a new option 'iface' to change the interface name of tap device with vhost-kernel as backend. Signed-off-by: Wenfeng Liu Reviewed-by: Jianfeng Tan --- drivers/net/virtio/virtio_user/virtio_user_dev.c | 12 ++++++++---- drivers/net/virtio/virtio_user/virtio_user_dev.h | 2 +- drivers/net/virtio/virtio_user_ethdev.c | 22 ++++++++++++++++++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 21ed00d..e7fd65f 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -193,9 +193,6 @@ int virtio_user_stop_device(struct virtio_user_dev *dev) for (i = 0; i < dev->max_queue_pairs; ++i) dev->ops->enable_qp(dev, i, 0); - free(dev->ifname); - dev->ifname = NULL; - return 0; } @@ -268,7 +265,7 @@ int virtio_user_stop_device(struct virtio_user_dev *dev) int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, - int cq, int queue_size, const char *mac) + int cq, int queue_size, const char *mac, char **ifname) { snprintf(dev->path, PATH_MAX, "%s", path); dev->max_queue_pairs = queues; @@ -277,6 +274,11 @@ int virtio_user_stop_device(struct virtio_user_dev *dev) dev->mac_specified = 0; parse_mac(dev, mac); + if (*ifname) { + dev->ifname = *ifname; + *ifname = NULL; + } + if (virtio_user_dev_setup(dev) < 0) { PMD_INIT_LOG(ERR, "backend set up fails"); return -1; @@ -327,6 +329,8 @@ int virtio_user_stop_device(struct virtio_user_dev *dev) free(dev->vhostfds); free(dev->tapfds); } + + free(dev->ifname); } static uint8_t diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 0d39f40..6ecb91e 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -69,7 +69,7 @@ struct virtio_user_dev { int virtio_user_start_device(struct virtio_user_dev *dev); int virtio_user_stop_device(struct virtio_user_dev *dev); int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, - int cq, int queue_size, const char *mac); + int cq, int queue_size, const char *mac, char **ifname); void virtio_user_dev_uninit(struct virtio_user_dev *dev); void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx); #endif diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 0b226ac..4b72e87 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -243,6 +243,8 @@ VIRTIO_USER_ARG_PATH, #define VIRTIO_USER_ARG_QUEUE_SIZE "queue_size" VIRTIO_USER_ARG_QUEUE_SIZE, +#define VIRTIO_USER_ARG_INTERFACE_NAME "iface" + VIRTIO_USER_ARG_INTERFACE_NAME, NULL }; @@ -259,6 +261,9 @@ *(char **)extra_args = strdup(value); + if (!*(char **)extra_args) + return -ENOMEM; + return 0; } @@ -347,6 +352,7 @@ uint64_t cq = VIRTIO_USER_DEF_CQ_EN; uint64_t queue_size = VIRTIO_USER_DEF_Q_SZ; char *path = NULL; + char *ifname = NULL; char *mac_addr = NULL; int ret = -1; @@ -375,6 +381,15 @@ goto end; } + if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_INTERFACE_NAME) == 1) { + if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_INTERFACE_NAME, + &get_string_arg, &ifname) < 0) { + PMD_INIT_LOG(ERR, "error to parse %s", + VIRTIO_USER_ARG_INTERFACE_NAME); + goto end; + } + } + if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_MAC) == 1) { if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_MAC, &get_string_arg, &mac_addr) < 0) { @@ -426,7 +441,7 @@ hw = eth_dev->data->dev_private; if (virtio_user_dev_init(hw->virtio_user_dev, path, queues, cq, - queue_size, mac_addr) < 0) { + queue_size, mac_addr, &ifname) < 0) { PMD_INIT_LOG(ERR, "virtio_user_dev_init fails"); virtio_user_eth_dev_free(eth_dev); goto end; @@ -447,6 +462,8 @@ free(path); if (mac_addr) free(mac_addr); + if (ifname) + free(ifname); return ret; } @@ -492,4 +509,5 @@ "mac= " "cq= " "queue_size= " - "queues="); + "queues= " + "iface="); -- 1.8.3.1