Lines Matching +full:num +full:- +full:tx +full:- +full:queues
1 // SPDX-License-Identifier: GPL-2.0
9 * ncdevmem -s <server IP> [-c <client IP>] -f eth1 -l -p 5201
12 * echo -n "hello\nworld" | nc -s <server IP> 5201 -p 5201
17 * ncdevmem -s <server IP> [-c <client IP>] -f eth1 -l -p 5201 -v 7
20 * yes $(echo -e \\x01\\x02\\x03\\x04\\x05\\x06) | \
22 * head -c 5G | \
23 * nc <server IP> 5201 -p 5201
27 * be replaced with regular netcat to test the RX or TX path in isolation.
51 #include <linux/dma-buf.h>
61 #include "netdev-user.h"
62 #include "ethtool-user.h"
77 static int start_queue = -1;
78 static int num_queues = -1;
109 ctx->size = size; in udmabuf_alloc()
111 ctx->devfd = open("/dev/udmabuf", O_RDWR); in udmabuf_alloc()
112 if (ctx->devfd < 0) in udmabuf_alloc()
114 "%s: [skip,no-udmabuf: Unable to access DMA buffer device file]\n", in udmabuf_alloc()
117 ctx->memfd = memfd_create("udmabuf-test", MFD_ALLOW_SEALING); in udmabuf_alloc()
118 if (ctx->memfd < 0) in udmabuf_alloc()
119 error(1, errno, "%s: [skip,no-memfd]\n", TEST_PREFIX); in udmabuf_alloc()
121 ret = fcntl(ctx->memfd, F_ADD_SEALS, F_SEAL_SHRINK); in udmabuf_alloc()
123 error(1, errno, "%s: [skip,fcntl-add-seals]\n", TEST_PREFIX); in udmabuf_alloc()
125 ret = ftruncate(ctx->memfd, size); in udmabuf_alloc()
126 if (ret == -1) in udmabuf_alloc()
127 error(1, errno, "%s: [FAIL,memfd-truncate]\n", TEST_PREFIX); in udmabuf_alloc()
131 create.memfd = ctx->memfd; in udmabuf_alloc()
134 ctx->fd = ioctl(ctx->devfd, UDMABUF_CREATE, &create); in udmabuf_alloc()
135 if (ctx->fd < 0) in udmabuf_alloc()
138 ctx->buf_mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, in udmabuf_alloc()
139 ctx->fd, 0); in udmabuf_alloc()
140 if (ctx->buf_mem == MAP_FAILED) in udmabuf_alloc()
148 munmap(ctx->buf_mem, ctx->size); in udmabuf_free()
149 close(ctx->fd); in udmabuf_free()
150 close(ctx->memfd); in udmabuf_free()
151 close(ctx->devfd); in udmabuf_free()
161 ioctl(src->fd, DMA_BUF_IOCTL_SYNC, &sync); in udmabuf_memcpy_from_device()
163 memcpy(dst, src->buf_mem + off, n); in udmabuf_memcpy_from_device()
166 ioctl(src->fd, DMA_BUF_IOCTL_SYNC, &sync); in udmabuf_memcpy_from_device()
216 int num = -1; in rxq_num() local
221 return -1; in rxq_num()
228 num = rsp->rx_count + rsp->combined_count; in rxq_num()
234 return num; in rxq_num()
254 run_command("sudo ethtool -K %s ntuple off >&2", ifname); in reset_flow_steering()
255 run_command("sudo ethtool -K %s ntuple on >&2", ifname); in reset_flow_steering()
257 "sudo ethtool -n %s | grep 'Filter:' | awk '{print $2}' | xargs -n1 ethtool -N %s delete >&2", in reset_flow_steering()
288 return -1; in configure_headersplit()
293 /* 0 - off, 1 - auto, 2 - on */ in configure_headersplit()
297 fprintf(stderr, "YNL failed: %s\n", ys->err.msg); in configure_headersplit()
307 tcp_data_split_str(get_rsp->tcp_data_split)); in configure_headersplit()
318 return run_command("sudo ethtool -X %s equal %d >&2", ifname, start_queue); in configure_rss()
321 static int configure_channels(unsigned int rx, unsigned int tx) in configure_channels() argument
323 return run_command("sudo ethtool -L %s rx %u tx %u", ifname, rx, tx); in configure_channels()
332 inet_ntop(AF_INET6, &server_sin->sin6_addr, buf, sizeof(buf)); in configure_flow_steering()
335 if (IN6_IS_ADDR_V4MAPPED(&server_sin->sin6_addr)) { in configure_flow_steering()
340 …return run_command("sudo ethtool -N %s flow-type %s %s %s dst-ip %s %s %s dst-port %s queue %d >&2… in configure_flow_steering()
343 client_ip ? "src-ip" : "", in configure_flow_steering()
346 client_ip ? "src-port" : "", in configure_flow_steering()
352 struct netdev_queue_id *queues, in bind_rx_queue() argument
362 return -1; in bind_rx_queue()
368 __netdev_bind_rx_req_set_queues(req, queues, n_queue_index); in bind_rx_queue()
376 if (!rsp->_present.id) { in bind_rx_queue()
381 fprintf(stderr, "got dmabuf id=%d\n", rsp->id); in bind_rx_queue()
382 dmabuf_id = rsp->id; in bind_rx_queue()
390 fprintf(stderr, "YNL failed: %s\n", (*ys)->err.msg); in bind_rx_queue()
393 return -1; in bind_rx_queue()
414 sin6->sin6_family = AF_INET6; in parse_address()
415 sin6->sin6_port = htons(port); in parse_address()
417 ret = inet_pton(sin6->sin6_family, str, &sin6->sin6_addr); in parse_address()
420 ret = inet_pton(AF_INET, str, &sin6->sin6_addr.s6_addr32[3]); in parse_address()
422 return -1; in parse_address()
425 sin6->sin6_addr.s6_addr32[0] = 0; in parse_address()
426 sin6->sin6_addr.s6_addr32[1] = 0; in parse_address()
427 sin6->sin6_addr.s6_addr16[4] = 0; in parse_address()
428 sin6->sin6_addr.s6_addr16[5] = 0xffff; in parse_address()
436 struct netdev_queue_id *queues; in create_queues() local
439 queues = calloc(num_queues, sizeof(*queues)); in create_queues()
441 queues[i]._present.type = 1; in create_queues()
442 queues[i]._present.id = 1; in create_queues()
443 queues[i].type = NETDEV_QUEUE_TYPE_RX; in create_queues()
444 queues[i].id = start_queue + i; in create_queues()
447 return queues; in create_queues()
453 struct netdev_queue_id *queues; in do_server() local
479 /* Configure RSS to divert all traffic from our devmem queues */ in do_server()
489 if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys)) in do_server()
492 tmp_mem = malloc(mem->size); in do_server()
555 if (cm->cmsg_level != SOL_SOCKET || in do_server()
556 (cm->cmsg_type != SCM_DEVMEM_DMABUF && in do_server()
557 cm->cmsg_type != SCM_DEVMEM_LINEAR)) { in do_server()
558 fprintf(stderr, "skipping non-devmem cmsg\n"); in do_server()
565 if (cm->cmsg_type == SCM_DEVMEM_LINEAR) { in do_server()
570 "SCM_DEVMEM_LINEAR. dmabuf_cmsg->frag_size=%u\n", in do_server()
571 dmabuf_cmsg->frag_size); in do_server()
576 token.token_start = dmabuf_cmsg->frag_token; in do_server()
579 total_received += dmabuf_cmsg->frag_size; in do_server()
582 dmabuf_cmsg->frag_offset >> PAGE_SHIFT, in do_server()
583 dmabuf_cmsg->frag_offset % getpagesize(), in do_server()
584 dmabuf_cmsg->frag_offset, in do_server()
585 dmabuf_cmsg->frag_size, dmabuf_cmsg->frag_token, in do_server()
586 total_received, dmabuf_cmsg->dmabuf_id); in do_server()
588 if (dmabuf_cmsg->dmabuf_id != dmabuf_id) in do_server()
592 if (dmabuf_cmsg->frag_size % getpagesize()) in do_server()
597 provider->memcpy_from_device(tmp_mem, mem, in do_server()
598 dmabuf_cmsg->frag_offset, in do_server()
599 dmabuf_cmsg->frag_size); in do_server()
603 dmabuf_cmsg->frag_size); in do_server()
606 dmabuf_cmsg->frag_size); in do_server()
641 mem = provider->alloc(getpagesize() * NUM_PAGES); in run_devmem_tests()
643 /* Configure RSS to divert all traffic from our devmem queues */ in run_devmem_tests()
650 if (!bind_rx_queue(ifindex, mem->fd, in run_devmem_tests()
653 error(1, 0, "Binding empty queues array should have failed\n"); in run_devmem_tests()
658 if (!bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys)) in run_devmem_tests()
664 if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys)) in run_devmem_tests()
668 if (!configure_channels(num_queues, num_queues - 1)) in run_devmem_tests()
674 provider->free(mem); in run_devmem_tests()
683 while ((opt = getopt(argc, argv, "ls:c:p:v:q:t:f:")) != -1) { in main()
716 error(1, 0, "Missing -f argument\n"); in main()
724 error(1, 0, "couldn't detect number of queues\n"); in main()
727 "number of device queues is too low\n"); in main()
728 /* make sure can bind to multiple queues */ in main()
734 error(1, 0, "Both -t and -q are required\n"); in main()
743 error(1, 0, "number of device queues is too low\n"); in main()
746 start_queue = rxq_num(ifindex) - num_queues; in main()
749 error(1, 0, "couldn't detect number of queues\n"); in main()
751 fprintf(stderr, "using queues %d..%d\n", start_queue, start_queue + num_queues); in main()
758 error(1, 0, "Missing -t argument\n"); in main()
761 error(1, 0, "Missing -q argument\n"); in main()
764 error(1, 0, "Missing -s argument\n"); in main()
767 error(1, 0, "Missing -p argument\n"); in main()
769 mem = provider->alloc(getpagesize() * NUM_PAGES); in main()
771 provider->free(mem); in main()