[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sat, 4 Apr 2015 10:36:55 +0200
From: Mathias Kretschmer <mathias.kretschmer@...us.fraunhofer.de>
To: Daniel Borkmann <daniel@...earbox.net>
CC: <netdev@...r.kernel.org>, <willemb@...gle.com>
Subject: Re: af_packet / TX_RING not fully non-blocking (w/ MSG_DONTWAIT)
Hi Daniel,
you are right, EAGAIN seems more appropriate.
I thought packet_snd() would return this - it rather seems that I need
glasses :)
Anyway, new patch attached. (Hopefully without spaces this time).
Cheers,
Mathias
On 04/04/2015 12:22 AM, Daniel Borkmann wrote:
> Hi Mathias,
>
> On 04/02/2015 12:52 PM, Mathias Kretschmer wrote:
>> Dear all,
>>
>> we have encountered a problem where the send(MSG_DONTWAIT) call on a
>> TX_RING is not fully non-blocking in cases where the device's sndBuf
>> is full (i.e. we are trying to write faster than the device can handle).
>>
>> This is on a WLAN radio (so it's not that hard to achieve :).
>>
>> Comparing the TX_RING send() handler to the regular send() handler,
>> the difference seems to be in the sock_alloc_send_skb() call where,
>> the regular handler passes a (flags & MSG_DONTWAIT), while the
>> TX_RING handler always passes a 0 (block).
>>
>> The attached patch changes this behavior by
>>
>> a) also passing (flags & MSG_DONTWAIT)
>> b) adjusting the return code so that -ENOBUFS is returned if no frame
>> could be sent or to return the number of bytes sent, if frame(s)
>> could be sent within this call.
>>
>> The proposed modification works fine for us and has been tested
>> extensively with WLAN and Ethernet device.
>>
>> Feel free to apply this patch if you agree with this solution.
>> Of course, we're also open to other solutions / proposals / ideas.
>
> Please send a proper patch with SOB, and no white space corruption
> (there are spaces instead of tabs).
>
> + if (skb == NULL) {
> + /* we assume the socket was initially writeable
> ... */
> + if (likely(len_sum > 0))
> + err = len_sum;
> + else
> + err = -ENOBUFS;
> goto out_status;
>
> What I'm a bit worried about is, if existing applications would be
> able to handle -ENOBUFS? Any reason you don't let -EAGAIN from the
> sock_alloc_send_skb() not pass through?
>
> Well, man 2 sendmsg clearly describes the -EAGAIN possibility as
> "the socket is marked nonblocking and the requested operation would
> block". So far it was apparently not returned since here we'd just
> have blocked, but strictly speaking non-blocking applications would
> need to be aware and should handle -EAGAIN, that awareness might be
> more likely than -ENOBUFS, imho. What do you think?
>
> Cheers,
> Daniel
--
Dr. Mathias Kretschmer, Head of Competence Center
Fraunhofer FOKUS Network Research
A Schloss Birlinghoven, 53754 Sankt Augustin, Germany
T +49-2241-14-3466, F +49-2241-14-1050
E mathias.kretschmer@...us.fraunhofer.de
View attachment "005-af_packet_no_block_tx.patch" of type "text/x-patch" (793 bytes)
Powered by blists - more mailing lists