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