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;
}