From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ning Li Subject: [PATCH] net/virtio-user: specify MAC address for tap port Date: Thu, 14 Dec 2017 19:38:14 +0800 Message-ID: <1513251494-9980-1-git-send-email-muziding001@163.com> Cc: dev@dpdk.org, Ning Li To: Yuanhan Liu , Maxime Coquelin Return-path: Received: from proxy90-5.mail.163.com (mail-proxy905.ym.163.com [43.230.90.5]) by dpdk.org (Postfix) with ESMTP id 6C9201B012 for ; Thu, 14 Dec 2017 12:38:44 +0100 (CET) List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When use virtio_user as exception path, we need to specify a MAC address for the tap port. Signed-off-by: Ning Li --- drivers/net/virtio/virtio_user/vhost_kernel.c | 3 ++- drivers/net/virtio/virtio_user/vhost_kernel_tap.c | 8 ++++++++ drivers/net/virtio/virtio_user/vhost_kernel_tap.h | 12 +++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 68d28b1..dd24b6b 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -380,7 +380,8 @@ struct vhost_memory_kernel { else hdr_size = sizeof(struct virtio_net_hdr); - tapfd = vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq); + tapfd = vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq, + (char *)dev->mac_addr); if (tapfd < 0) { PMD_DRV_LOG(ERR, "fail to open tap for vhost kernel"); return -1; diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c index 689a5cf..756fde2 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c @@ -123,6 +123,14 @@ PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s", strerror(errno)); + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; + memcpy(ifr.ifr_hwaddr.sa_data, mac, ETH_ALEN); + if (ioctl(tapfd, SIOCSIFHWADDR, (void *)&ifr) == -1) { + PMD_DRV_LOG(ERR, "SIOCSIFHWADDR failed: %s", strerror(errno)); + goto error; + } + if (!(*p_ifname)) *p_ifname = strdup(ifr.ifr_name); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h index eae340c..f59b1ac 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h @@ -64,4 +64,14 @@ /* Constants */ #define PATH_NET_TUN "/dev/net/tun" -int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq); +/* Socket configuration controls. */ +#define SIOCSIFHWADDR 0x8924 /* set hardware address */ + +/* ARP protocol HARDWARE identifiers. */ +#define ARPHRD_ETHER 1 /* Ethernet */ + +/* Length of Ethernet address. */ +#define ETH_ALEN 6 + +int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, + const char *mac); -- 1.8.3.1