Mihail Dakov
2014-07-21 13:18:30 UTC
Hello guys,
I am having a trouble using the RX/TX ring buffer for AF_PACKET sockets.
I create two sockets (one for rx, one for tx). I bind those sockets to
the same interface. According the docs you can create a socket per
direction or single socket for both directions (allocating double the
memory needed for a ring buffer, and then mapping first rx and then tx
buffer). In this case I opted for creating two sockets, one per
direction. The problem is that when I use the tx_ring to send over the
pf_socket I see those message "mirrored" in the rx_ring buffer which is
not an expected behavior for my application. In other to reproduce the
issue I simplified my application into a smaller one. Then I send a
manually created ping message with adjusted mac and ip address so that a
remote machine in my local network answers it. I successfully see the
ping request double (once in the tx_ring and once in the rx_ring). Which
I think is not expected behavior. This application was tested on kernel
3.14.12-1 and was compiled with gcc (Debian 4.8.3-5) and on kernel
3.2.0-52-lowlatency with compiler gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3.
So some questions have arised:
1. Is this normal behavior? If it is, why? I mean, if I use a socket per
direction I expect to see only packets for that direction on the
correspondent socket, right?
2. Could you provide some more insights about why this "problem" is
happening? Am I doing it wrong? Did I get it wrong (the whole ring
buffer in af_packets)? Am I using wrong settings?
I have attached the simple program which should reproduce the issue.
I am having a trouble using the RX/TX ring buffer for AF_PACKET sockets.
I create two sockets (one for rx, one for tx). I bind those sockets to
the same interface. According the docs you can create a socket per
direction or single socket for both directions (allocating double the
memory needed for a ring buffer, and then mapping first rx and then tx
buffer). In this case I opted for creating two sockets, one per
direction. The problem is that when I use the tx_ring to send over the
pf_socket I see those message "mirrored" in the rx_ring buffer which is
not an expected behavior for my application. In other to reproduce the
issue I simplified my application into a smaller one. Then I send a
manually created ping message with adjusted mac and ip address so that a
remote machine in my local network answers it. I successfully see the
ping request double (once in the tx_ring and once in the rx_ring). Which
I think is not expected behavior. This application was tested on kernel
3.14.12-1 and was compiled with gcc (Debian 4.8.3-5) and on kernel
3.2.0-52-lowlatency with compiler gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3.
So some questions have arised:
1. Is this normal behavior? If it is, why? I mean, if I use a socket per
direction I expect to see only packets for that direction on the
correspondent socket, right?
2. Could you provide some more insights about why this "problem" is
happening? Am I doing it wrong? Did I get it wrong (the whole ring
buffer in af_packets)? Am I using wrong settings?
I have attached the simple program which should reproduce the issue.
--
Mihail Dakov
***@ng4t.com
Mihail Dakov
***@ng4t.com