12.08.2015 18:16, Josef Bacik пишет: > While adding tcp window scaling support I was finding that I'd get some packet > loss or reordering when transferring from large distances and grub would just > timeout. This is because we weren't ack'ing when we got our OOO packet, so > the > sender didn't know it needed to retransmit anything, so eventually it would > fill > the window and stop transmitting, and we'd time out. Fix this by ACK'ing when > we don't find our next sequence numbered packet. With this fix I no longer > time > out. Thanks, >
Applied. Sorry, it somehow slipped through. More ideas in the same direction. 1. GRUB timeout for receiving currently is ~33 seconds. It is too small comparing with anything else. I am pretty sure in situation from tcpdump you sent me we could recover if timeout was in order of several minutes :) 2. We may consider sending ACK in grub_net_tcp_retransmit() additionally, although it probably needs proper rate-limiting based on RTT. 3. Using timestamp option may improve RTT detection for partner and is pretty cheap to implement. > Signed-off-by: Josef Bacik <jba...@fb.com> > --- > grub-core/net/tcp.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/grub-core/net/tcp.c b/grub-core/net/tcp.c > index 25720b1..6b411dd 100644 > --- a/grub-core/net/tcp.c > +++ b/grub-core/net/tcp.c > @@ -902,7 +902,10 @@ grub_net_recv_tcp_packet (struct grub_net_buff *nb, > grub_priority_queue_pop (sock->pq); > } > if (grub_be_to_cpu32 (tcph->seqnr) != sock->their_cur_seq) > - return GRUB_ERR_NONE; > + { > + ack (sock); > + return GRUB_ERR_NONE; > + } > while (1) > { > nb_top_p = grub_priority_queue_top (sock->pq); > _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel