The failure scenario is a bit more complicated...

Give me some time and I will provide a correct and reproducible example,
with a clear explanation.

On Mon, May 29, 2023, 13:27 Fotis Panagiotopoulos <f.j.pa...@gmail.com>
wrote:

> > sendfile should return an error in this case, but senfile should only be
> > used with TCP, not UDP, since sendfile doesn't have any logic to ack or
> > retry..
>
> Sorry if this wasn't clear. This last test was with plain old `send()`...
>
> I opened a UDP socket, and used `send()` to transmit a buffer larger than
> the MTU.
> Instead of getting an error, the application hangs indefinitely.
> `devif_send()` is called periodically, but of course it always fails.
>
>
>
> On Mon, May 29, 2023 at 1:13 PM Xiang Xiao <xiaoxiang781...@gmail.com>
> wrote:
>
>> On Mon, May 29, 2023 at 5:02 PM Fotis Panagiotopoulos <
>> f.j.pa...@gmail.com>
>> wrote:
>>
>> > > You need to enable IP fragmentation in this case, which is also added
>> > > recently and disabled by default:
>> > > https://github.com/apache/nuttx/pull/8059
>> > <https://github.com/apache/nuttx/pull/8059>
>> > > Otherwise, any packet bigger than MTU will be dropped silently.
>> >
>> > Yes, this is the expected behavior.
>> > But, instead of dropping the packet, the system hangs because the
>> semaphore
>> > is never posted.
>> > It just tries endlessly to call devif_send() which always fails.
>> >
>> >
>> sendfile should return an error in this case, but senfile should only be
>> used with TCP, not UDP, since sendfile doesn't have any logic to ack or
>> retry..
>>
>>
>> >
>> >
>> > On Mon, May 29, 2023 at 11:42 AM Xiang Xiao <xiaoxiang781...@gmail.com>
>> > wrote:
>> >
>> > > On Sun, May 28, 2023 at 11:55 PM Fotis Panagiotopoulos <
>> > > f.j.pa...@gmail.com>
>> > > wrote:
>> > >
>> > > > While experimenting with MTU, and checking the stability of my
>> system,
>> > I
>> > > > noticed the following.
>> > > >
>> > > > I try to send a UDP datagram that is larger than the configured MTU.
>> > > > In this case, the offending thread seems to hang indefinitely (or at
>> > > least
>> > > > waiting for a very long timeout?)
>> > > >
>> > >
>> > > You need to enable IP fragmentation in this case, which is also added
>> > > recently and disabled by default:
>> > > https://github.com/apache/nuttx/pull/8059
>> > > Otherwise, any packet bigger than MTU will be dropped silently.
>> > >
>> > >
>> > > > The problem seems to be this line:
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/apache/nuttx/blob/master/net/udp/udp_sendto_unbuffered.c#L197
>> > > > `devif_send()` fails because the datagram is too large, but
>> > > > `pstate->st_sem` is never posted (the code returns immediately).
>> > > >
>> > > > This leaves the sending task to be blocked here:
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/apache/nuttx/blob/master/net/udp/udp_sendto_unbuffered.c#L469
>> > > >
>> > > > Shouldn't this failure also post the semaphore?
>> > > > And let the code proceed returning an error in `send()`?
>> > > >
>> > > >
>> > > > On Sun, May 28, 2023 at 5:26 PM Fotis Panagiotopoulos <
>> > > f.j.pa...@gmail.com
>> > > > >
>> > > > wrote:
>> > > >
>> > > > >
>> > > > > On Sat, May 27, 2023 at 5:35 PM Xiang Xiao <
>> > xiaoxiang781...@gmail.com>
>> > > > > wrote:
>> > > > >
>> > > > >> On Sat, May 27, 2023 at 8:19 PM Fotis Panagiotopoulos <
>> > > > >> f.j.pa...@gmail.com>
>> > > > >> wrote:
>> > > > >>
>> > > > >> > Hello,
>> > > > >> >
>> > > > >> > I encounter some problems using sendfile().
>> > > > >> >
>> > > > >> > I am using sendfile to... send a file to a remote server, with
>> my
>> > > own
>> > > > >> > implementation of an FTP client.
>> > > > >> > sendfile() indeed starts to transmit chunks of the file, but
>> as I
>> > > see
>> > > > in
>> > > > >> > Wireshark, I get an ICMP response "Destination unreachable
>> > > > >> (Fragmentation
>> > > > >> > needed)".
>> > > > >> > I have verified that the Ethrenet MTU is correctly set to 1500.
>> > > > >> >
>> > > > >> > I tried lowering the MTU a lot (1000 bytes), and the problem is
>> > > > solved.
>> > > > >> > Communication succeeds.
>> > > > >> >
>> > > > >> > This raises some questions, and indicates some potential bugs:
>> > > > >> >
>> > > > >> > 1. Why is there a problem with MTU in the first place?
>> Shouldn't
>> > MTU
>> > > > be
>> > > > >> > negotiated? (Is this functionality available in NuttX?)
>> > > > >> >
>> > > > >>
>> > > > >> MTU isn't negotiated but a physical attribute of your
>> > > transport(netdev).
>> > > > >> On
>> > > > >> the other hand, PMTU could be discovered from ICMP.
>> > > > >>
>> > > > >
>> > > > > I am not very familiar with MTU negotiation, so it seems that it
>> > > doesn't
>> > > > > happen in the network layer that I thought...
>> > > > >
>> > > > >
>> > > > >>
>> > > > >>
>> > > > >> > 2. Why is the ICMP response not handled? It seems that
>> sendfile()
>> > > just
>> > > > >> > ignores it and continues to send chunks, nevertheless.
>> > > > >> >
>> > > > >>
>> > > > >> It is handled by the recent addition here:
>> > > > >> https://github.com/apachey/nuttx/pull/9254
>> > > > >> <https://github.com/apache/nuttx/pull/9254>
>> > > > >> but this feature is disabled by default, you have to enable it
>> > > > manually..
>> > > > >>
>> > > > >
>> > > > > I will definitely take a look at this. Thank you.
>> > > > >
>> > > > >
>> > > > >>
>> > > > >>
>> > > > >
>> > > > >> > 3. Why sendfile() sends TCP segments without receiving any ACKs
>> > > back?
>> > > > >> > AFAIK, depending on the configuration, TCP allows at most two
>> > > pending
>> > > > >> > segments on the wire. But I see dozens of them, till sendfile
>> > > finally
>> > > > >> > fails.
>> > > > >> >
>> > > > >> >
>> > > > >> Why only two segments? TCP can send packages until the slide
>> window
>> > is
>> > > > >> full.
>> > > > >>
>> > > > >> Disregard this. I was confused with delayed ACKs. Which is a
>> > > receiver's
>> > > > > functionality, not a sender's...
>> > > > >
>> > > > >
>> > > > >>
>> > > > >> > This last point is also verified in my MQTT client.
>> > > > >> > I have seen NuttX TCP allowing sending lots of TCP segments
>> > without
>> > > > >> ACKing
>> > > > >> > the previous data.
>> > > > >> >
>> > > > >> > So, is there any insight on the above?
>> > > > >> > Is my configuration wrong, or is there anything wrong with TCP?
>> > > > >> >
>> > > > >> > Thank you.
>> > > > >> >
>> > > > >>
>> > > > >
>> > > >
>> > >
>> >
>>
>

Reply via email to