* [dpdk-test-report] |WARNING| pw99870 [PATCH v2] net/virtio: fix virtio-user init when using existing tap
[not found] <20210928085114.30737-1-david.marchand@redhat.com>
@ 2021-09-28 8:52 ` checkpatch
0 siblings, 0 replies; 2+ messages in thread
From: checkpatch @ 2021-09-28 8:52 UTC (permalink / raw)
To: test-report; +Cc: David Marchand
Test-Label: checkpatch
Test-Status: WARNING
http://dpdk.org/patch/99870
_coding style issues_
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#172: FILE: drivers/net/virtio/virtio_user/vhost_kernel.c:143:
+ if (tap_flags & IFF_VNET_HDR) {
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#181: FILE: drivers/net/virtio/virtio_user/vhost_kernel.c:151:
+ if (tap_flags & IFF_MULTI_QUEUE)
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#201: FILE: drivers/net/virtio/virtio_user/vhost_kernel.c:393:
+ if ((tap_features & IFF_VNET_HDR) == 0) {
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#202: FILE: drivers/net/virtio/virtio_user/vhost_kernel.c:394:
+ PMD_INIT_LOG(ERR, "TAP does not support IFF_VNET_HDR");
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#217: FILE: drivers/net/virtio/virtio_user/vhost_kernel.c:432:
+ data->tapfds[0] = tap_open(ifname, (tap_features & IFF_MULTI_QUEUE) != 0);
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#228: FILE: drivers/net/virtio/virtio_user/vhost_kernel.c:443:
+ if ((tap_flags & IFF_MULTI_QUEUE) == 0 && dev->max_queue_pairs > 1) {
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#351: FILE: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:64:
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#351: FILE: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:64:
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#351: FILE: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:64:
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#353: FILE: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:66:
+ ifr.ifr_flags |= IFF_MULTI_QUEUE;
WARNING:TYPO_SPELLING: 'IFF' may be misspelled - perhaps 'IF'?
#357: FILE: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:70:
+ "TUNSETIFF failed (will retry without IFF_MULTI_QUEUE): %s",
total: 0 errors, 11 warnings, 0 checks, 412 lines checked
^ permalink raw reply [flat|nested] 2+ messages in thread
* [dpdk-test-report] |WARNING| pw99870 [PATCH] [v2] net/virtio: fix virtio-user init when using existing tap
@ 2021-10-05 22:59 dpdklab
0 siblings, 0 replies; 2+ messages in thread
From: dpdklab @ 2021-10-05 22:59 UTC (permalink / raw)
To: test-report; +Cc: dpdk-test-reports
[-- Attachment #1: Type: text/plain, Size: 21098 bytes --]
Test-Label: iol-testing
Test-Status: WARNING
http://dpdk.org/patch/99870
_apply patch failure_
Submitter: David Marchand <david.marchand@redhat.com>
Date: Tuesday, September 28 2021 08:51:14
Applied on: CommitID:2700326085033fd13339a8de31f58a95d1ee9c3f
Apply patch set 99870 failed:
Checking patch drivers/net/virtio/virtio_user/vhost_kernel.c...
error: while searching for:
static int
vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features)
{
int ret;
unsigned int tap_features;
struct vhost_kernel_data *data = dev->backend_data;
ret = vhost_kernel_ioctl(data->vhostfds[0], VHOST_GET_FEATURES, features);
if (ret < 0) {
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:120
error: while searching for:
return -1;
}
ret = tap_support_features(&tap_features);
if (ret < 0) {
PMD_DRV_LOG(ERR, "Failed to get TAP features");
return -1;
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:130
error: while searching for:
* but not claimed by vhost-net, so we add them back when
* reporting to upper layer.
*/
if (tap_features & IFF_VNET_HDR) {
*features |= VHOST_KERNEL_GUEST_OFFLOADS_MASK;
*features |= VHOST_KERNEL_HOST_OFFLOADS_MASK;
}
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:140
error: while searching for:
/* vhost_kernel will not declare this feature, but it does
* support multi-queue.
*/
if (tap_features & IFF_MULTI_QUEUE)
*features |= (1ull << VIRTIO_NET_F_MQ);
return 0;
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:148
error: while searching for:
static int
vhost_kernel_setup(struct virtio_user_dev *dev)
{
int vhostfd;
uint32_t q, i;
struct vhost_kernel_data *data;
data = malloc(sizeof(*data));
if (!data) {
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:380
error: while searching for:
PMD_DRV_LOG(ERR, "fail to open %s, %s", dev->path, strerror(errno));
goto err_tapfds;
}
data->vhostfds[i] = vhostfd;
}
dev->backend_data = data;
return 0;
err_tapfds:
for (i = 0; i < dev->max_queue_pairs; i++)
if (data->vhostfds[i] >= 0)
close(data->vhostfds[i]);
free(data->tapfds);
err_vhostfds:
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:414
error: while searching for:
uint16_t pair_idx,
int enable)
{
int hdr_size;
int vhostfd;
int tapfd;
int req_mq = (dev->max_queue_pairs > 1);
struct vhost_kernel_data *data = dev->backend_data;
vhostfd = data->vhostfds[pair_idx];
if (dev->qp_enabled[pair_idx] == enable)
return 0;
if (!enable) {
tapfd = data->tapfds[pair_idx];
if (vhost_kernel_set_backend(vhostfd, -1) < 0) {
PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel");
return -1;
}
if (req_mq && vhost_kernel_tap_set_queue(tapfd, false) < 0) {
PMD_DRV_LOG(ERR, "fail to disable tap for vhost kernel");
return -1;
}
dev->qp_enabled[pair_idx] = false;
return 0;
}
if (data->tapfds[pair_idx] >= 0) {
tapfd = data->tapfds[pair_idx];
if (vhost_kernel_tap_set_offload(tapfd, dev->features) == -1)
return -1;
if (req_mq && vhost_kernel_tap_set_queue(tapfd, true) < 0) {
PMD_DRV_LOG(ERR, "fail to enable tap for vhost kernel");
return -1;
}
goto set_backend;
}
if ((dev->features & (1ULL << VIRTIO_NET_F_MRG_RXBUF)) ||
(dev->features & (1ULL << VIRTIO_F_VERSION_1)))
hdr_size = sizeof(struct virtio_net_hdr_mrg_rxbuf);
else
hdr_size = sizeof(struct virtio_net_hdr);
tapfd = vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq,
(char *)dev->mac_addr, dev->features);
if (tapfd < 0) {
PMD_DRV_LOG(ERR, "fail to open tap for vhost kernel");
return -1;
}
data->tapfds[pair_idx] = tapfd;
set_backend:
if (vhost_kernel_set_backend(vhostfd, tapfd) < 0) {
PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel");
return -1;
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel.c:488
Checking patch drivers/net/virtio/virtio_user/vhost_kernel_tap.c...
error: while searching for:
}
int
vhost_kernel_tap_set_offload(int fd, uint64_t features)
{
unsigned int offload = 0;
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:42
error: while searching for:
}
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)
{
unsigned int tap_features;
char *tap_name = NULL;
int sndbuf = INT_MAX;
struct ifreq ifr;
int tapfd;
int ret;
/* TODO:
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:79
error: while searching for:
* 2. get number of memory regions from vhost module parameter
* max_mem_regions, supported in newer version linux kernel
*/
tapfd = open(PATH_NET_TUN, O_RDWR);
if (tapfd < 0) {
PMD_DRV_LOG(ERR, "fail to open %s: %s",
PATH_NET_TUN, strerror(errno));
return -1;
}
/* Construct ifr */
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
if (ioctl(tapfd, TUNGETFEATURES, &tap_features) == -1) {
PMD_DRV_LOG(ERR, "TUNGETFEATURES failed: %s", strerror(errno));
goto error;
}
if (tap_features & IFF_ONE_QUEUE)
ifr.ifr_flags |= IFF_ONE_QUEUE;
/* Let tap instead of vhost-net handle vnet header, as the latter does
* not support offloading. And in this case, we should not set feature
* bit VHOST_NET_F_VIRTIO_NET_HDR.
*/
if (tap_features & IFF_VNET_HDR) {
ifr.ifr_flags |= IFF_VNET_HDR;
} else {
PMD_DRV_LOG(ERR, "TAP does not support IFF_VNET_HDR");
goto error;
}
if (req_mq)
ifr.ifr_flags |= IFF_MULTI_QUEUE;
if (*p_ifname)
strncpy(ifr.ifr_name, *p_ifname, IFNAMSIZ - 1);
else
strncpy(ifr.ifr_name, "tap%d", IFNAMSIZ - 1);
if (ioctl(tapfd, TUNSETIFF, (void *)&ifr) == -1) {
PMD_DRV_LOG(ERR, "TUNSETIFF failed: %s", strerror(errno));
goto error;
}
tap_name = strdup(ifr.ifr_name);
if (!tap_name) {
PMD_DRV_LOG(ERR, "strdup ifname failed: %s", strerror(errno));
goto error;
}
if (fcntl(tapfd, F_SETFL, O_NONBLOCK) < 0) {
PMD_DRV_LOG(ERR, "fcntl tapfd failed: %s", strerror(errno));
goto error;
}
if (ioctl(tapfd, TUNSETVNETHDRSZ, &hdr_size) < 0) {
PMD_DRV_LOG(ERR, "TUNSETVNETHDRSZ failed: %s", strerror(errno));
goto error;
}
if (ioctl(tapfd, TUNSETSNDBUF, &sndbuf) < 0) {
PMD_DRV_LOG(ERR, "TUNSETSNDBUF failed: %s", strerror(errno));
goto error;
}
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, RTE_ETHER_ADDR_LEN);
if (ioctl(tapfd, SIOCSIFHWADDR, (void *)&ifr) == -1) {
PMD_DRV_LOG(ERR, "SIOCSIFHWADDR failed: %s", strerror(errno));
goto error;
}
free(*p_ifname);
*p_ifname = tap_name;
return tapfd;
error:
free(tap_name);
close(tapfd);
return -1;
}
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel_tap.c:104
Checking patch drivers/net/virtio/virtio_user/vhost_kernel_tap.h...
error: while searching for:
#define TUNSETSNDBUF _IOW('T', 212, int)
#define TUNGETVNETHDRSZ _IOR('T', 215, int)
#define TUNSETVNETHDRSZ _IOW('T', 216, int)
#define TUNSETQUEUE _IOW('T', 217, int)
#define TUNSETVNETLE _IOW('T', 220, int)
#define TUNSETVNETBE _IOW('T', 222, int)
/* TUNSETIFF ifr flags */
#define IFF_TAP 0x0002
#define IFF_NO_PI 0x1000
#define IFF_ONE_QUEUE 0x2000
#define IFF_VNET_HDR 0x4000
#define IFF_MULTI_QUEUE 0x0100
#define IFF_ATTACH_QUEUE 0x0200
#define IFF_DETACH_QUEUE 0x0400
/* Features for GSO (TUNSETOFFLOAD). */
#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel_tap.h:16
error: while searching for:
/* Constants */
#define PATH_NET_TUN "/dev/net/tun"
int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
const char *mac, uint64_t features);
int vhost_kernel_tap_set_offload(int fd, uint64_t features);
int vhost_kernel_tap_set_queue(int fd, bool attach);
int tap_support_features(unsigned int *tap_features);
#endif
error: patch failed: drivers/net/virtio/virtio_user/vhost_kernel_tap.h:39
Applying patch drivers/net/virtio/virtio_user/vhost_kernel.c with 7 rejects...
Rejected hunk #1.
Rejected hunk #2.
Rejected hunk #3.
Rejected hunk #4.
Rejected hunk #5.
Rejected hunk #6.
Rejected hunk #7.
Applying patch drivers/net/virtio/virtio_user/vhost_kernel_tap.c with 3 rejects...
Rejected hunk #1.
Rejected hunk #2.
Rejected hunk #3.
Applying patch drivers/net/virtio/virtio_user/vhost_kernel_tap.h with 2 rejects...
Rejected hunk #1.
Rejected hunk #2.
diff a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c (rejected hunks)
@@ -120,9 +120,9 @@ vhost_kernel_set_owner(struct virtio_user_dev *dev)
static int
vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features)
{
- int ret;
- unsigned int tap_features;
struct vhost_kernel_data *data = dev->backend_data;
+ unsigned int tap_flags;
+ int ret;
ret = vhost_kernel_ioctl(data->vhostfds[0], VHOST_GET_FEATURES, features);
if (ret < 0) {
@@ -130,7 +130,7 @@ vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features)
return -1;
}
- ret = tap_support_features(&tap_features);
+ ret = tap_get_flags(data->tapfds[0], &tap_flags);
if (ret < 0) {
PMD_DRV_LOG(ERR, "Failed to get TAP features");
return -1;
@@ -140,7 +140,7 @@ vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features)
* but not claimed by vhost-net, so we add them back when
* reporting to upper layer.
*/
- if (tap_features & IFF_VNET_HDR) {
+ if (tap_flags & IFF_VNET_HDR) {
*features |= VHOST_KERNEL_GUEST_OFFLOADS_MASK;
*features |= VHOST_KERNEL_HOST_OFFLOADS_MASK;
}
@@ -148,7 +148,7 @@ vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features)
/* vhost_kernel will not declare this feature, but it does
* support multi-queue.
*/
- if (tap_features & IFF_MULTI_QUEUE)
+ if (tap_flags & IFF_MULTI_QUEUE)
*features |= (1ull << VIRTIO_NET_F_MQ);
return 0;
@@ -380,9 +380,20 @@ vhost_kernel_set_status(struct virtio_user_dev *dev __rte_unused, uint8_t status
static int
vhost_kernel_setup(struct virtio_user_dev *dev)
{
- int vhostfd;
- uint32_t q, i;
struct vhost_kernel_data *data;
+ unsigned int tap_features;
+ unsigned int tap_flags;
+ const char *ifname;
+ uint32_t q, i;
+ int vhostfd;
+
+ if (tap_support_features(&tap_features) < 0)
+ return -1;
+
+ if ((tap_features & IFF_VNET_HDR) == 0) {
+ PMD_INIT_LOG(ERR, "TAP does not support IFF_VNET_HDR");
+ return -1;
+ }
data = malloc(sizeof(*data));
if (!data) {
@@ -414,18 +425,43 @@ vhost_kernel_setup(struct virtio_user_dev *dev)
PMD_DRV_LOG(ERR, "fail to open %s, %s", dev->path, strerror(errno));
goto err_tapfds;
}
-
data->vhostfds[i] = vhostfd;
}
+ ifname = dev->ifname != NULL ? dev->ifname : "tap%d";
+ data->tapfds[0] = tap_open(ifname, (tap_features & IFF_MULTI_QUEUE) != 0);
+ if (data->tapfds[0] < 0)
+ goto err_tapfds;
+ if (dev->ifname == NULL && tap_get_name(data->tapfds[0], &dev->ifname) < 0) {
+ PMD_DRV_LOG(ERR, "fail to get tap name (%d)", data->tapfds[0]);
+ goto err_tapfds;
+ }
+ if (tap_get_flags(data->tapfds[0], &tap_flags) < 0) {
+ PMD_DRV_LOG(ERR, "fail to get tap flags for tap %s", dev->ifname);
+ goto err_tapfds;
+ }
+ if ((tap_flags & IFF_MULTI_QUEUE) == 0 && dev->max_queue_pairs > 1) {
+ PMD_DRV_LOG(ERR, "tap %s does not support multi queue", dev->ifname);
+ goto err_tapfds;
+ }
+
+ for (i = 1; i < dev->max_queue_pairs; i++) {
+ data->tapfds[i] = tap_open(dev->ifname, true);
+ if (data->tapfds[i] < 0)
+ goto err_tapfds;
+ }
+
dev->backend_data = data;
return 0;
err_tapfds:
- for (i = 0; i < dev->max_queue_pairs; i++)
+ for (i = 0; i < dev->max_queue_pairs; i++) {
if (data->vhostfds[i] >= 0)
close(data->vhostfds[i]);
+ if (data->tapfds[i] >= 0)
+ close(data->tapfds[i]);
+ }
free(data->tapfds);
err_vhostfds:
@@ -488,58 +524,42 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev,
uint16_t pair_idx,
int enable)
{
+ struct vhost_kernel_data *data = dev->backend_data;
int hdr_size;
int vhostfd;
int tapfd;
- int req_mq = (dev->max_queue_pairs > 1);
- struct vhost_kernel_data *data = dev->backend_data;
-
- vhostfd = data->vhostfds[pair_idx];
if (dev->qp_enabled[pair_idx] == enable)
return 0;
+ vhostfd = data->vhostfds[pair_idx];
+ tapfd = data->tapfds[pair_idx];
+
if (!enable) {
- tapfd = data->tapfds[pair_idx];
if (vhost_kernel_set_backend(vhostfd, -1) < 0) {
PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel");
return -1;
}
- if (req_mq && vhost_kernel_tap_set_queue(tapfd, false) < 0) {
- PMD_DRV_LOG(ERR, "fail to disable tap for vhost kernel");
- return -1;
- }
dev->qp_enabled[pair_idx] = false;
return 0;
}
- if (data->tapfds[pair_idx] >= 0) {
- tapfd = data->tapfds[pair_idx];
- if (vhost_kernel_tap_set_offload(tapfd, dev->features) == -1)
- return -1;
- if (req_mq && vhost_kernel_tap_set_queue(tapfd, true) < 0) {
- PMD_DRV_LOG(ERR, "fail to enable tap for vhost kernel");
- return -1;
- }
- goto set_backend;
- }
-
if ((dev->features & (1ULL << VIRTIO_NET_F_MRG_RXBUF)) ||
(dev->features & (1ULL << VIRTIO_F_VERSION_1)))
hdr_size = sizeof(struct virtio_net_hdr_mrg_rxbuf);
else
hdr_size = sizeof(struct virtio_net_hdr);
- tapfd = vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq,
- (char *)dev->mac_addr, dev->features);
- if (tapfd < 0) {
- PMD_DRV_LOG(ERR, "fail to open tap for vhost kernel");
+ /* Set mac on tap only once when starting */
+ if (!dev->started && pair_idx == 0 &&
+ tap_set_mac(data->tapfds[pair_idx], dev->mac_addr) < 0)
return -1;
- }
- data->tapfds[pair_idx] = tapfd;
+ if (vhost_kernel_tap_setup(tapfd, hdr_size, dev->features) < 0) {
+ PMD_DRV_LOG(ERR, "fail to setup tap for vhost kernel");
+ return -1;
+ }
-set_backend:
if (vhost_kernel_set_backend(vhostfd, tapfd) < 0) {
PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel");
return -1;
diff a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c (rejected hunks)
@@ -42,6 +42,91 @@ tap_support_features(unsigned int *tap_features)
}
int
+tap_open(const char *ifname, bool multi_queue)
+{
+ struct ifreq ifr;
+ int tapfd;
+
+ tapfd = open(PATH_NET_TUN, O_RDWR);
+ if (tapfd < 0) {
+ PMD_DRV_LOG(ERR, "fail to open %s: %s", PATH_NET_TUN, strerror(errno));
+ return -1;
+ }
+ if (fcntl(tapfd, F_SETFL, O_NONBLOCK) < 0) {
+ PMD_DRV_LOG(ERR, "fcntl tapfd failed: %s", strerror(errno));
+ close(tapfd);
+ return -1;
+ }
+
+retry_mono_q:
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
+ if (multi_queue)
+ ifr.ifr_flags |= IFF_MULTI_QUEUE;
+ if (ioctl(tapfd, TUNSETIFF, (void *)&ifr) == -1) {
+ if (multi_queue) {
+ PMD_DRV_LOG(DEBUG,
+ "TUNSETIFF failed (will retry without IFF_MULTI_QUEUE): %s",
+ strerror(errno));
+ multi_queue = false;
+ goto retry_mono_q;
+ }
+
+ PMD_DRV_LOG(ERR, "TUNSETIFF failed: %s", strerror(errno));
+ close(tapfd);
+ tapfd = -1;
+ }
+ return tapfd;
+}
+
+int
+tap_get_name(int tapfd, char **name)
+{
+ struct ifreq ifr;
+ int ret;
+
+ memset(&ifr, 0, sizeof(ifr));
+ if (ioctl(tapfd, TUNGETIFF, (void *)&ifr) == -1) {
+ PMD_DRV_LOG(ERR, "TUNGETIFF failed: %s", strerror(errno));
+ return -1;
+ }
+ ret = asprintf(name, "%s", ifr.ifr_name);
+ if (ret != -1)
+ ret = 0;
+ return ret;
+}
+
+int
+tap_get_flags(int tapfd, unsigned int *tap_flags)
+{
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ if (ioctl(tapfd, TUNGETIFF, (void *)&ifr) == -1) {
+ PMD_DRV_LOG(ERR, "TUNGETIFF failed: %s", strerror(errno));
+ return -1;
+ }
+ *tap_flags = ifr.ifr_flags;
+ return 0;
+}
+
+int
+tap_set_mac(int tapfd, uint8_t *mac)
+{
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
+ 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));
+ return -1;
+ }
+ return 0;
+}
+
+static int
vhost_kernel_tap_set_offload(int fd, uint64_t features)
{
unsigned int offload = 0;
@@ -79,24 +164,9 @@ vhost_kernel_tap_set_offload(int fd, uint64_t features)
}
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)
+vhost_kernel_tap_setup(int tapfd, int hdr_size, uint64_t features)
{
- unsigned int tap_features;
- char *tap_name = NULL;
int sndbuf = INT_MAX;
- struct ifreq ifr;
- int tapfd;
int ret;
/* TODO:
@@ -104,86 +174,18 @@ vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
* 2. get number of memory regions from vhost module parameter
* max_mem_regions, supported in newer version linux kernel
*/
- tapfd = open(PATH_NET_TUN, O_RDWR);
- if (tapfd < 0) {
- PMD_DRV_LOG(ERR, "fail to open %s: %s",
- PATH_NET_TUN, strerror(errno));
- return -1;
- }
-
- /* Construct ifr */
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
-
- if (ioctl(tapfd, TUNGETFEATURES, &tap_features) == -1) {
- PMD_DRV_LOG(ERR, "TUNGETFEATURES failed: %s", strerror(errno));
- goto error;
- }
- if (tap_features & IFF_ONE_QUEUE)
- ifr.ifr_flags |= IFF_ONE_QUEUE;
-
- /* Let tap instead of vhost-net handle vnet header, as the latter does
- * not support offloading. And in this case, we should not set feature
- * bit VHOST_NET_F_VIRTIO_NET_HDR.
- */
- if (tap_features & IFF_VNET_HDR) {
- ifr.ifr_flags |= IFF_VNET_HDR;
- } else {
- PMD_DRV_LOG(ERR, "TAP does not support IFF_VNET_HDR");
- goto error;
- }
-
- if (req_mq)
- ifr.ifr_flags |= IFF_MULTI_QUEUE;
-
- if (*p_ifname)
- strncpy(ifr.ifr_name, *p_ifname, IFNAMSIZ - 1);
- else
- strncpy(ifr.ifr_name, "tap%d", IFNAMSIZ - 1);
- if (ioctl(tapfd, TUNSETIFF, (void *)&ifr) == -1) {
- PMD_DRV_LOG(ERR, "TUNSETIFF failed: %s", strerror(errno));
- goto error;
- }
-
- tap_name = strdup(ifr.ifr_name);
- if (!tap_name) {
- PMD_DRV_LOG(ERR, "strdup ifname failed: %s", strerror(errno));
- goto error;
- }
-
- if (fcntl(tapfd, F_SETFL, O_NONBLOCK) < 0) {
- PMD_DRV_LOG(ERR, "fcntl tapfd failed: %s", strerror(errno));
- goto error;
- }
-
if (ioctl(tapfd, TUNSETVNETHDRSZ, &hdr_size) < 0) {
PMD_DRV_LOG(ERR, "TUNSETVNETHDRSZ failed: %s", strerror(errno));
- goto error;
+ return -1;
}
if (ioctl(tapfd, TUNSETSNDBUF, &sndbuf) < 0) {
PMD_DRV_LOG(ERR, "TUNSETSNDBUF failed: %s", strerror(errno));
- goto error;
+ return -1;
}
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, RTE_ETHER_ADDR_LEN);
- if (ioctl(tapfd, SIOCSIFHWADDR, (void *)&ifr) == -1) {
- PMD_DRV_LOG(ERR, "SIOCSIFHWADDR failed: %s", strerror(errno));
- goto error;
- }
-
- free(*p_ifname);
- *p_ifname = tap_name;
-
- return tapfd;
-error:
- free(tap_name);
- close(tapfd);
- return -1;
+ if (ret == -ENOTSUP)
+ ret = 0;
+ return ret;
}
diff a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h (rejected hunks)
@@ -16,18 +16,12 @@
#define TUNSETSNDBUF _IOW('T', 212, int)
#define TUNGETVNETHDRSZ _IOR('T', 215, int)
#define TUNSETVNETHDRSZ _IOW('T', 216, int)
-#define TUNSETQUEUE _IOW('T', 217, int)
-#define TUNSETVNETLE _IOW('T', 220, int)
-#define TUNSETVNETBE _IOW('T', 222, int)
/* TUNSETIFF ifr flags */
#define IFF_TAP 0x0002
#define IFF_NO_PI 0x1000
-#define IFF_ONE_QUEUE 0x2000
#define IFF_VNET_HDR 0x4000
#define IFF_MULTI_QUEUE 0x0100
-#define IFF_ATTACH_QUEUE 0x0200
-#define IFF_DETACH_QUEUE 0x0400
/* Features for GSO (TUNSETOFFLOAD). */
#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */
@@ -39,10 +33,12 @@
/* Constants */
#define PATH_NET_TUN "/dev/net/tun"
-int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
- const char *mac, uint64_t features);
-int vhost_kernel_tap_set_offload(int fd, uint64_t features);
-int vhost_kernel_tap_set_queue(int fd, bool attach);
+int vhost_kernel_tap_setup(int tapfd, int hdr_size, uint64_t features);
+
int tap_support_features(unsigned int *tap_features);
+int tap_open(const char *ifname, bool multi_queue);
+int tap_get_name(int tapfd, char **ifname);
+int tap_get_flags(int tapfd, unsigned int *tap_flags);
+int tap_set_mac(int tapfd, uint8_t *mac);
#endif
https://lab.dpdk.org/results/dashboard/patchsets/19011/
UNH-IOL DPDK Community Lab
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-10-05 22:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20210928085114.30737-1-david.marchand@redhat.com>
2021-09-28 8:52 ` [dpdk-test-report] |WARNING| pw99870 [PATCH v2] net/virtio: fix virtio-user init when using existing tap checkpatch
2021-10-05 22:59 [dpdk-test-report] |WARNING| pw99870 [PATCH] [v2] " dpdklab
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).