libeech

BitTorrent library
git clone git://z3bra.org/libeech.git
Log | Files | Refs | README | LICENSE

commit 34fe31c3c7b310cd8916e5f9c018293e4b0ffab9
parent be01a156aeef06d1f908824f63aa8339dd91992b
Author: z3bra <contactatz3bradotorg>
Date:   Fri Jul  6 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:
libeech.c | 29+++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/libeech.c b/libeech.c @@ -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 *); @@ -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); } @@ -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; } @@ -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 */ @@ -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; }