On Thu, Jan 5, 2023 at 4:16 AM <seanedm...@linux.microsoft.com> wrote:
>
> From: Sean Edmond <seanedm...@linux.microsoft.com>
>
> In rfc7440, if an ACK is not received by the server or if the
> last data block in a window is dropped, the server will timeout and
> retransmit the window. In this case, the block count received will be
> less than the internal block count. In this case, the client
> should not ACK. ACK should only be sent if the received block
> count is greater than the expected block count.
>
> Signed-off-by: Sean Edmond <seanedm...@linux.microsoft.com>
> ---
> net/tftp.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/net/tftp.c b/net/tftp.c
> index c780c33f37..51e062bddf 100644
> --- a/net/tftp.c
> +++ b/net/tftp.c
> @@ -592,6 +592,14 @@ static void tftp_handler(uchar *pkt, unsigned dest,
> struct in_addr sip,
> debug("Received unexpected block: %d, expected: %d\n",
> ntohs(*(__be16 *)pkt),
> (ushort)(tftp_cur_block + 1));
> + /*
> + * Only ACK if the block count received is greater
> than
> + * the expected block count, otherwise skip ACK.
> + * (required to properly handle the server
> retransmitting
> + * the window)
> + */
> + if ((ushort)(tftp_cur_block + 1) -
> (short)(ntohs(*(__be16 *)pkt)) > 0)
> + break;
> /*
> * If one packet is dropped most likely
> * all other buffers in the window
> --
> 2.39.0
>
Reviewed-by: Ramon Fried <rfried....@gmail.com>