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>

Reply via email to