Lines Matching +full:two +full:- +full:user

1 .. SPDX-License-Identifier: GPL-2.0
20 XDP programs to redirect frames to a memory buffer in a user-space
24 syscall. Associated with each XSK are two rings: the RX ring and the
38 is simply an offset within the entire UMEM region. The user space
42 UMEM also has two rings: the FILL ring and the COMPLETION ring. The
47 kernel has transmitted completely and can now be used again by user
59 corresponding two rings, sets the XDP_SHARED_UMEM flag in the bind
64 single-consumer / single-producer (for performance reasons), the new
72 user-space application can place an XSK at an arbitrary place in this
79 traffic to user space through the XSK.
81 AF_XDP can operate in two different modes: XDP_SKB and XDP_DRV. If the
84 together with the generic XDP support and copies out the data to user
88 data into user space.
99 http://vger.kernel.org/lpc_net2018_talks/lpc18_paper_af_xdp_perf-v2.pdf. Do
106 ----
109 equal-sized frames. An UMEM is associated to a netdev and a specific
121 The UMEM has two single-producer/single-consumer rings that are used
123 user-space application.
126 -----
129 TX. All rings are single-producer/single-consumer, so the user-space
133 The UMEM uses two rings: FILL and COMPLETION. Each socket associated
145 calls and mmapped to user-space using the appropriate offset to mmap()
149 The size of the rings need to be of size power of two.
155 user-space to kernel-space. The UMEM addrs are passed in the ring. As
161 The user application produces UMEM addrs to this ring. Note that, if
165 to the same chunk. If the user application is run in the unaligned
173 kernel-space to user-space. Just like the FILL ring, UMEM indices are
176 Frames passed from the kernel to user-space are frames that has been
177 sent (TX ring) and can be used by user-space again.
179 The user application consumes UMEM addrs from this ring.
192 The user application consumes struct xdp_desc descriptors from this
204 The user application produces struct xdp_desc descriptors to this
213 contains two types of functions: those that can be used to make the
221 user. It will make your program a lot simpler.
230 The user application inserts the socket into the map, via the bpf()
247 -------------------------------------
249 When you bind to a socket, the kernel will first try to use zero-copy
250 copy. If zero-copy is not supported, it will fall back on using copy
251 mode, i.e. copying all packets out to user space. But if you would
256 socket into zero-copy mode or fail.
259 -------------------------
283 round-robin example of distributing packets is shown below:
285 .. code-block:: c
303 rr = (rr + 1) & (MAX_SOCKS - 1);
323 netdev,queue_id pair. Let us say you want to create two sockets bound
324 to two different queue ids on the same netdev. Create the first socket
330 socket. These two sockets will now share one and the same UMEM.
351 -----------------------------
354 present in the FILL ring and the TX ring, the rings for which user
366 need_wakeup flag is set so that user space can put buffers on the
379 .. code-block:: c
393 ------------------------------------------------------
405 be used. Note, that the rings are single-producer single-consumer, so
409 In libbpf, you can create Rx-only and Tx-only sockets by supplying
413 If you create a Tx-only socket, we recommend that you do not put any
419 -----------------------
437 -------------------------
442 .. code-block:: c
451 ----------------------
454 XDP_OPTIONS_ZEROCOPY which tells you if zero-copy is on or not.
459 In order to use AF_XDP sockets two parts are needed. The
460 user-space application and the XDP program. For a complete setup and
461 usage example, please refer to the sample application. The user-space
466 .. code-block:: c
470 int index = ctx->rx_queue_index;
483 .. code-block:: c
505 __u32 entries = *ring->producer - *ring->consumer;
508 return -1;
510 // read-barrier!
512 *item = ring->desc[*ring->consumer & (RING_SIZE - 1)];
513 (*ring->consumer)++;
519 u32 free_entries = RING_SIZE - (*ring->producer - *ring->consumer);
522 return -1;
524 ring->desc[*ring->producer & (RING_SIZE - 1)] = *item;
526 // write-barrier!
528 (*ring->producer)++;
543 ethtool -N p3p2 rx-flow-hash udp4 fn
544 ethtool -N p3p2 flow-type udp4 src-port 4242 dst-port 4242 \
550 samples/bpf/xdpsock -i p3p2 -q 16 -r -N
552 For XDP_SKB mode, use the switch "-S" instead of "-N" and all options
553 can be displayed with "-h", as usual.
581 sudo ethtool -L <interface> combined 1
588 sudo ethtool -N <interface> rx-flow-hash udp4 fn
589 sudo ethtool -N <interface> flow-type udp4 src-port 4242 dst-port \
603 to the same queue id Y. In zero-copy mode, you should use the
621 - Björn Töpel (AF_XDP core)
622 - Magnus Karlsson (AF_XDP core)
623 - Alexander Duyck
624 - Alexei Starovoitov
625 - Daniel Borkmann
626 - Jesper Dangaard Brouer
627 - John Fastabend
628 - Jonathan Corbet (LWN coverage)
629 - Michael S. Tsirkin
630 - Qi Z Zhang
631 - Willem de Bruijn