All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rongqing Li <rongqing.li@windriver.com>
To: <openembedded-devel@lists.openembedded.org>
Cc: joe.macdonald@windriver.com
Subject: Re: [PATCH meta-networking] atftp: port a patch from OpenSUSE to fix "Sorcerer's Apprentice Syndrome"(SAS)
Date: Fri, 6 Sep 2013 08:16:36 +0800	[thread overview]
Message-ID: <52291EE4.9060306@windriver.com> (raw)
In-Reply-To: <1376981857-9687-1-git-send-email-rongqing.li@windriver.com>

ping...

Thanks

-Roy


On 08/20/2013 02:57 PM, rongqing.li@windriver.com wrote:
> From: "Roy.Li" <rongqing.li@windriver.com>
>
> Signed-off-by: Roy.Li <rongqing.li@windriver.com>
> ---
>   meta-networking/recipes-daemons/atftp/atftp_git.bb |    1 +
>   .../files/atftp-0.7-sorcerers_apprentice.patch     |   94 ++++++++++++++++++++
>   2 files changed, 95 insertions(+)
>   create mode 100644 meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch
>
> diff --git a/meta-networking/recipes-daemons/atftp/atftp_git.bb b/meta-networking/recipes-daemons/atftp/atftp_git.bb
> index 4b9ff05..8f9b4e3 100644
> --- a/meta-networking/recipes-daemons/atftp/atftp_git.bb
> +++ b/meta-networking/recipes-daemons/atftp/atftp_git.bb
> @@ -13,6 +13,7 @@ SRC_URI = "git://atftp.git.sourceforge.net/gitroot/atftp/atftp;protocol=git \
>              file://atftpd-0.7_unprotected_assignments_crash.patch \
>              file://atftpd.init \
>              file://atftpd.service \
> +           file://atftp-0.7-sorcerers_apprentice.patch \
>   "
>   S = "${WORKDIR}/git"
>
> diff --git a/meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch b/meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch
> new file mode 100644
> index 0000000..fc64291
> --- /dev/null
> +++ b/meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch
> @@ -0,0 +1,94 @@
> +atftp exhibits the well known "Sorcerer's Apprentice Syndrome"(SAS) problem.
> +According to RFC 1350, the fix to SAS is quite simple: further copies of the
> +acknowledgment for a particular data block would be ignored.
> +
> +Patch originally from OpenSUSE:
> +https://build.opensuse.org/package/view_file?file=atftp-0.7-sorcerers_apprentice.patch&package=atftp.539&project=openSUSE%3A12.1%3AUpdate&rev=84569792975e00573d7df597d2a6e895
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Roy.Li <rongqing.li@windriver.com>
> +Index: atftp-0.7/tftp_file.c
> +===================================================================
> +--- atftp-0.7.orig/tftp_file.c	2011-11-22 15:12:53.792744083 +0100
> ++++ atftp-0.7/tftp_file.c	2011-11-22 15:13:51.706421893 +0100
> +@@ -605,6 +605,7 @@
> +      int timeout_state = state; /* what state should we go on when timeout */
> +      int result;
> +      long block_number = 0;
> ++     long last_requested_block = -1;
> +      long last_block = -1;
> +      int data_size;             /* size of data received */
> +      int sockfd = data->sockfd; /* just to simplify calls */
> +@@ -765,6 +766,17 @@
> +                          connected = 1;
> +                     }
> +                     block_number = ntohs(tftphdr->th_block);
> ++
> ++                    if (last_requested_block >= block_number)
> ++                    {
> ++                        if (data->trace)
> ++                            fprintf(stderr, "received duplicated ACK <block: %ld >= %ld>\n",
> ++                                    last_requested_block, block_number);
> ++                        break;
> ++                    }
> ++                    else
> ++                        last_requested_block = block_number;
> ++
> +                     if (data->trace)
> +                          fprintf(stderr, "received ACK <block: %ld>\n",
> +                                  block_number);
> +Index: atftp-0.7/tftpd_file.c
> +===================================================================
> +--- atftp-0.7.orig/tftpd_file.c	2011-11-22 15:12:53.793744112 +0100
> ++++ atftp-0.7/tftpd_file.c	2011-11-22 15:15:04.617534260 +0100
> +@@ -403,6 +403,7 @@
> +      int timeout_state = state;
> +      int result;
> +      long block_number = 0;
> ++     long last_requested_block = -1;
> +      long last_block = -1;
> +      int block_loops = 0;
> +      int data_size;
> +@@ -859,6 +860,32 @@
> +                     {
> +                          logger(LOG_DEBUG, "received ACK <block: %d>", block_number);
> +                     }
> ++
> ++		    /* check whether the block request isn't already fulfilled */
> ++
> ++                    /* multicast, block numbers could contain gaps */
> ++                    if (multicast) {
> ++                        if (last_requested_block >= block_number)
> ++                        {
> ++                            if (data->trace)
> ++                                logger(LOG_DEBUG, "received duplicated ACK <block: %d >= %d>", last_requested_block, block_number);
> ++                            break;
> ++                        }
> ++                        else
> ++                            last_requested_block = block_number;
> ++                    /* unicast, blocks should be requested one after another */
> ++		    } else {
> ++                        if (last_requested_block + 1 != block_number && last_requested_block != -1)
> ++                        {
> ++                            if (data->trace)
> ++                                logger(LOG_DEBUG, "received out of order ACK <block: %d != %d>", last_requested_block + 1, block_number);
> ++                            break;
> ++                        }
> ++                        else
> ++                            last_requested_block = block_number;
> ++                    }
> ++
> ++
> +                     if (ntohs(tftphdr->th_block) == 65535)
> +                     {
> +                          block_loops++;
> +@@ -958,6 +985,8 @@
> +                          /* nedd to send an oack to that client */
> +                          state = S_SEND_OACK;
> +                          fseek(fp, 0, SEEK_SET);
> ++			 /* reset the last block received counter */
> ++			 last_requested_block = -1;
> +                     }
> +                     else
> +                     {
>

-- 
Best Reagrds,
Roy | RongQing Li


  reply	other threads:[~2013-09-06  0:16 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-20  6:57 [PATCH meta-networking] atftp: port a patch from OpenSUSE to fix "Sorcerer's Apprentice Syndrome"(SAS) rongqing.li
2013-09-06  0:16 ` Rongqing Li [this message]
2013-09-06  1:22   ` Joe MacDonald

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52291EE4.9060306@windriver.com \
    --to=rongqing.li@windriver.com \
    --cc=joe.macdonald@windriver.com \
    --cc=openembedded-devel@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.