I'm developing a user space application where my end goal is to send data from a Linux machine A (an embedded device) and receive on another Linux machine B (an embedded device) over AF_XDP. I want to use AF_XDP to achieve low latency.
I understand for my user space application to receive data over AF_XDP I should use XDP_REDIRECT (please correct me if I'm wrong), what I can't understand is which XDP option (XDP_REDIRECT, XDP_TX etc) should I use to transmit data from my user space application over AF_XDP?
what I can't understand is which XDP option (
XDP_REDIRECT
,XDP_TX
etc) should I use to transmit data from my user space application overAF_XDP
?
That is not how AF_XDP
works. Once all of the setup work is done, by you or a library you use, there will be a shared memory region called UMEM and 4 ringbuffers which are used in a sort of dance to receive and transmit packets. The buffers are called: UMEM_Fill
, UMEM_Completion
, RX
, TX
On the ingress side, your XDP program is triggered so you can make a decision to send traffic to your AF_XDP
socket or not. Here you will use the bpf_redirect_map
to redirect the traffic into the socket/map which will return XDP_REDIRECT
if successful (may fail if the socket isn't setup correctly or buffers are full).
To read the redirected packet you dequeue the RX
queue/ring, the frame descriptor within will point to an address in UMEM which is where your packet data is located. As soon as you are done with this memory you send the frame descriptor back over the UMEM_Fill
queue/ring so the NIC/Driver can re-use it.
To write a packet you dequeue a frame descriptor from the UMEM_Completion
queue/ring fill the region of UMEM you have temporary control over with your packet and give the frame descriptor to the TX
queue/ring. The NIC/Driver will consume the TX
queue/ring and send out the packet. No XDP program is triggered on egress.
Would highly recommend you checkout https://www.kernel.org/doc/html/latest/networking/af_xdp.html which has more details regarding using AF_XDP.