tRequest one block at a time in pwptxrq() - libeech - bittorrent library
 (HTM) git clone git://z3bra.org/libeech.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 03ccf2b025a14a05633ab312cdad29745d5071db
 (DIR) parent 98d359fa4fc5e1b1f9ac22e8c92fbfe04abea44b
 (HTM) Author: z3bra <contactatz3bradotorg>
       Date:   Mon,  9 Jul 2018 09:01:04 +0200
       
       Request one block at a time in pwptxrq()
       
       Diffstat:
         M libeech.c                           |      63 ++++++++++++++++++-------------
         M libeech.h                           |       8 +++++---
       
       2 files changed, 41 insertions(+), 30 deletions(-)
       ---
 (DIR) diff --git a/libeech.c b/libeech.c
       t@@ -623,46 +623,55 @@ pwptxbf(struct torrent *t, struct peer *p)
        static ssize_t
        pwptxrq(struct torrent *t, struct peer *p)
        {
       -        int i;
                char m[MSGSIZ];
       -        ssize_t bl;
       +        ssize_t i, bl, bo;
        
                /* Find a missing piece we can get from the peer */
       -        for (i = 0; i < t->npiece && (bit(t->bf, i) || !bit(p->bf, i)); i++);
       +        if (p->piece.n < 0) {
       +                for (i = 0; i < t->npiece && (bit(t->bf, i) || !bit(p->bf, i)); i++);
       +                memset(p->piece.bl, 0, sizeof(p->piece.bl));
       +                memset(p->piece.rq, 0, sizeof(p->piece.rq));
        
       -        if (i == t->npiece)
       -                return -1;
       +                if (i == t->npiece)
       +                        return -1;
        
       -        p->piece.n = i;
       -        p->piece.sz = (i == t->npiece - 1) ? t->sz % t->psz : t->psz;
       +                p->piece.n = i;
       +                p->piece.sz = (i == t->npiece - 1) ? t->sz % t->psz : t->psz;
       +        }
        
       -        i = 0;
       -        while (i < p->piece.sz) {
       -                bl = BLKSIZ;
       -                if (i + BLKSIZ > p->piece.sz)
       -                        bl = p->piece.sz - i;
       +        /* Find a block that hasn't been requested yet */
       +        for (i = 0; i < BLKNUM && bit(p->piece.rq, i); i++);
        
       -                memset(m, 0, MSGSIZ);
       +        bo = i * BLKSIZ;
       +        bl = BLKSIZ;
       +        if (bo + BLKSIZ > p->piece.sz)
       +                bl = p->piece.sz - bo;
        
       -                /* Message length */
       -                U32(m) = htonl(13);
       +        /* All blocks requested */
       +        if (bo >= p->piece.sz)
       +                return -1;
        
       -                /* Message type */
       -                m[4] = REQUEST;
        
       -                /* Piece index */
       -                U32(m+5) = htonl(p->piece.n);
       +        memset(m, 0, MSGSIZ);
        
       -                /* Block offset */
       -                U32(m+9) = htonl(i);
       +        /* Message length */
       +        U32(m) = htonl(13);
        
       -                /* Block length */
       -                U32(m+13) = htonl(bl);
       +        /* Message type */
       +        m[4] = REQUEST;
        
       -                pwpsend(p, m, 17);
       +        /* Piece index */
       +        U32(m+5) = htonl(p->piece.n);
        
       -                i += bl;
       -        }
       +        /* Block offset */
       +        U32(m+9) = htonl(bo);
       +
       +        /* Block length */
       +        U32(m+13) = htonl(bl);
       +
       +        pwpsend(p, m, 17);
       +
       +        setbit(p->piece.rq, i);
        
                return 0;
        }
       t@@ -814,7 +823,7 @@ pwptx(struct torrent *t, struct peer *p)
                                p->state |= AMINTERESTED;
                        }
        
       -                if (!(p->state & AMCHOKING) && p->piece.n < 0)
       +                if (!(p->state & AMCHOKING))
                                pwptxrq(t, p);
                }
        
 (DIR) diff --git a/libeech.h b/libeech.h
       t@@ -3,11 +3,13 @@
        
        #include "be.h"
        
       -#define PCENUM 65535
        #define PCESIZ 1048576
        #define BLKSIZ 16384
        #define MSGSIZ ((BLKSIZ) + 13)
        
       +#define PCENUM 65535
       +#define BLKNUM ((PCESIZ)/(BLKSIZ)+!!((PCESIZ)%(BLKSIZ)))
       +
        enum {
                CONNECTED     = 1 << 0,
                HANDSHAKESENT = 1 << 1,
       t@@ -24,8 +26,8 @@ struct piece {
                int n;
                ssize_t sz;
                char blks[PCESIZ];
       -        char rq[PCESIZ / BLKSIZ + !!(PCESIZ % BLKSIZ)];
       -        char bl[PCESIZ / BLKSIZ + !!(PCESIZ % BLKSIZ)];
       +        char rq[BLKNUM / 8 + !!(BLKNUM % 8)];
       +        char bl[BLKNUM / 8 + !!(BLKNUM % 8)];
        };
        
        struct peer {