Re: AF_XDP socket (sock2) unable to read, after writing with another AF_XDP socket (sock1)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2018-11-01 19:49, Björn Töpel wrote:
> Den tors 1 nov. 2018 kl 18:14 skrev Konrad Djimeli <kdjimeli@xxxxxxxxxx>:
>>
>> Hello,
>>
>> I am working on developing a Snabb Switch app which uses Af_XDP sockets
>> and so far I have not found any AF_XDP sample example online, except for
>> the sample in the Linux Kernel source. I have tried modifying the
>> example, to create two sockets (sock1 and sock2) sharing a UMEM with
>> custom write_sock and read_sock functions. But when I do a write with
>> "sock1" I am unable to read the data with "sock2". Here is the code
>> https://github.com/djkonro/afxdp/blob/master/xdpsock/xdpsock_user.c ,
>> and I am new to working with AF_XDP sockets and I wish I could get some
>> pointers to what may be wrong with the program.
>>
> 
> Hi Konrad,
> 
> Let's recap what your application does:
> 
> 1. Create two AF_XDP sockets bound to ifindex and a shared UMEM.
> 2. The pass NUM_DESCS descriptors to the UMEM fill ring
> 3. In write_sock BATCH_SIZE packets are put on the Tx ring.
> 4. In read_sock up to BATCH_SIZE packets are picked from the Rx ring.
> 5. The application exits.
> 
> In terms of correctness:
> 
> In 3. you pass the same UMEM indicies to the Tx ring (ids={0,
> FRAME_SIZE, 2*FRAME_SIZE, ...}), as you have passed to the fill
> ring. This is not correct. Userspace to track what ids are owned by
> the user and by the kernel. Now, both the fill ring and Tx ring
> contain the same id.

Hello Björn,

Thanks for taking time to go through the program in detail and providing
feedback.

> 
> I'm not sure what the expected output of your program should be? Have
> you verified that packets are being sent? Is the inferface/queue 0
> receiving packets?

Since I am calling the hex_dump(...) function within the write_sock and
read_sock function, I expect to see a printout of the packet that is
written and read when I call the functions.

I think the packet is actually sent because when I call the read with
the same socket that I used for the write "write_sock(sock1, data,
len);read_sock(sock1);", I get the example output below.
"
Writing = 1485946880
length = 42
addr=0 | 01 01 01 01 01 01 04 01 03 02 12 5D 08 06 00 01 08 00 06 04 00
01 36 15 FD 2A EE A3 C0 A8 08 64  | ...........]..........6.�*����.d
addr=0 | 00 00 00 00 00 00 D8 3A D4 64 __ __ __ __ __ __ __ __ __ __ __
__ __ __ __ __ __ __ __ __ __ __  | ......�:�d

Reading = 1485946880
length = 42
addr=0 | 01 01 01 01 01 01 04 01 03 02 12 5D 08 06 00 01 08 00 06 04 00
01 36 15 FD 2A EE A3 C0 A8 08 64  | ...........]..........6.�*����.d
addr=0 | 00 00 00 00 00 00 D8 3A D4 64 __ __ __ __ __ __ __ __ __ __ __
__ __ __ __ __ __ __ __ __ __ __  | ......�:�d
"

But when I use one socket for the write and the other socket for the
read "write_sock(sock1, data, len);read_sock(sock2);", I don't get any
output for the read call as seen in the example output below.
"
Writing = 1417486336
length = 42
addr=0 | 01 01 01 01 01 01 04 01 03 02 12 5D 08 06 00 01 08 00 06 04 00
01 36 15 FD 2A EE A3 C0 A8 08 64  | ...........]..........6.�*����.d
addr=0 | 00 00 00 00 00 00 D8 3A D4 64 __ __ __ __ __ __ __ __ __ __ __
__ __ __ __ __ __ __ __ __ __ __  | ......�:�d
"

> 
> I think it would help if you explained what you are trying to do
> first!

I am just trying to test and understand how to send packets using an
AF_XDP socket and to receive the packets using an another AF_XDP socket.

> 
> What XDP program are you running?
> 

The XDP program can be found
https://github.com/djkonro/afxdp/blob/master/xdpsock/xdpsock_kern.c


Thanks
Konrad


> 
> Cheers,
> Björn
>  
 



[Index of Archives]     [Linux Networking Development]     [Fedora Linux Users]     [Linux SCTP]     [DCCP]     [Gimp]     [Yosemite Campsites]

  Powered by Linux