X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fvirtio%2Fvirtio_user%2Fvhost_kernel_tap.c;h=2fa4f0d66163ca9083d7d9c0a1f2b3585b7f372c;hb=397b4b3c509574a55c58ae161f5a01cc8a4da56a;hp=fbd9e979d7a2ba9860e23e36f238f21099d3c6a4;hpb=bad78b4b8b23412f6007efd034de04b35c663a6f;p=dpdk.git diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c index fbd9e979d7..2fa4f0d661 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c @@ -18,7 +18,7 @@ #include "../virtio_logs.h" #include "../virtio_pci.h" -static int +int vhost_kernel_tap_set_offload(int fd, uint64_t features) { unsigned int offload = 0; @@ -37,26 +37,34 @@ vhost_kernel_tap_set_offload(int fd, uint64_t features) offload |= TUN_F_UFO; } - if (offload != 0) { - /* Check if our kernel supports TUNSETOFFLOAD */ - if (ioctl(fd, TUNSETOFFLOAD, 0) != 0 && errno == EINVAL) { - PMD_DRV_LOG(ERR, "Kernel does't support TUNSETOFFLOAD\n"); - return -ENOTSUP; - } + /* Check if our kernel supports TUNSETOFFLOAD */ + if (ioctl(fd, TUNSETOFFLOAD, 0) != 0 && errno == EINVAL) { + PMD_DRV_LOG(ERR, "Kernel does't support TUNSETOFFLOAD\n"); + return -ENOTSUP; + } + if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) { + offload &= ~TUN_F_UFO; if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) { - offload &= ~TUN_F_UFO; - if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) { - PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s\n", - strerror(errno)); - return -1; - } + PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s\n", + strerror(errno)); + return -1; } } return 0; } +int +vhost_kernel_tap_set_queue(int fd, bool attach) +{ + struct ifreq ifr = { + .ifr_flags = attach ? IFF_ATTACH_QUEUE : IFF_DETACH_QUEUE, + }; + + return ioctl(fd, TUNSETQUEUE, &ifr); +} + int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, const char *mac, uint64_t features) @@ -66,6 +74,7 @@ vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, int sndbuf = INT_MAX; struct ifreq ifr; int tapfd; + int ret; /* TODO: * 1. verify we can get/set vnet_hdr_len, tap_probe_vnet_hdr_len @@ -131,11 +140,13 @@ vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, goto error; } - vhost_kernel_tap_set_offload(tapfd, features); + ret = vhost_kernel_tap_set_offload(tapfd, features); + if (ret < 0 && ret != -ENOTSUP) + goto error; memset(&ifr, 0, sizeof(ifr)); ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; - memcpy(ifr.ifr_hwaddr.sa_data, mac, ETHER_ADDR_LEN); + memcpy(ifr.ifr_hwaddr.sa_data, mac, RTE_ETHER_ADDR_LEN); if (ioctl(tapfd, SIOCSIFHWADDR, (void *)&ifr) == -1) { PMD_DRV_LOG(ERR, "SIOCSIFHWADDR failed: %s", strerror(errno)); goto error;