URI:
       tOnly send HAVE messages when seeding - libeech - bittorrent library
  HTML git clone git://z3bra.org/libeech.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 34fe31c3c7b310cd8916e5f9c018293e4b0ffab9
   DIR parent be01a156aeef06d1f908824f63aa8339dd91992b
  HTML Author: z3bra <contactatz3bradotorg>
       Date:   Fri,  6 Jul 2018 19:34:31 +0200
       
       Only send HAVE messages when seeding
       
       By moving HAVE messages directly in the pwptx() function, they become
       independent from other messages, which means that we can send them
       anytime, and ONLY if the peer is consuming the message on the other
       side of the socket.
       
       One can also stop sending HAVE messages by clearing the SEEDING bit.
       
       Diffstat:
         M libeech.c                           |      29 +++++++++++++++++++++++++++--
       
       1 file changed, 27 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/libeech.c b/libeech.c
       t@@ -87,6 +87,9 @@ static int pwprxbf(struct peer *, size_t, char *);
        static int pwprxrq(struct torrent *, struct peer *, size_t, char *);
        static int pwprxpc(struct torrent *, struct peer *, size_t, char *);
        
       +/* various wrappers around PWP messages */
       +static int catchup(struct torrent *, struct peer *);
       +
        /* handle all received PWP messages */
        static int pwprxcb(struct torrent *, struct peer *, int, size_t, char *);
        
       t@@ -598,6 +601,7 @@ pwptxbf(struct torrent *t, struct peer *p)
        
                /* Bitfield */
                memcpy(m+5, t->bf, l);
       +        memcpy(p->view, t->bf, l);
        
                return pwpsend(p, m, l + 5);
        }
       t@@ -735,8 +739,6 @@ pwprxpc(struct torrent *t, struct peer *p, size_t sz, char *pl)
        
                if (!chkpiece(t, &p->piece, idx) && !writepiece(t, &(p->piece))) {
                        setbit(t->bf, p->piece.n);
       -                for (b = t->peers; b; b = b->next)
       -                        pwptxhv(b, p->piece.n);
                        p->piece.n = -1;
                }
        
       t@@ -747,6 +749,23 @@ pwprxpc(struct torrent *t, struct peer *p, size_t sz, char *pl)
        }
        
        /*
       + * Get a peer to catch up new pieces we had received
       + */
       +static int
       +catchup(struct torrent *t, struct peer *p)
       +{
       +        long i;
       +
       +        for (i = 0; i < t->npiece; i++) {
       +                if (bit(t->bf, i) && !bit(p->view, i)) {
       +                        pwptxhv(p, i);
       +                        setbit(p->view, i);
       +                }
       +        }
       +        return 0;
       +}
       +
       +/*
         * PWP message received callback
         * This function will run the appropriate function based on the message type
         */
       t@@ -799,6 +818,12 @@ pwptx(struct torrent *t, struct peer *p)
                                pwptxrq(t, p);
                }
        
       +        if (p->state & SEEDING) {
       +                /* send missing pieces as HAVE messages */
       +                if (memcmp(t->bf, p->view, PCENUM / 8 + !!(PCENUM % 8)))
       +                        catchup(t, p);
       +        }
       +
                return 0;
        }