|
@@ -186,6 +186,8 @@ peer_cancel(struct peer *p, struct block_request *req, struct net_buf *nb) |
|
|
} |
|
|
} |
|
|
if (!removed) |
|
|
if (!removed) |
|
|
peer_send(p, nb); |
|
|
peer_send(p, nb); |
|
|
|
|
|
if (p->nreqs_out == 0) |
|
|
|
|
|
peer_on_no_reqs(p); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
@@ -220,12 +222,14 @@ peer_want(struct peer *p, uint32_t index) |
|
|
assert(p->nwant < p->npieces); |
|
|
assert(p->nwant < p->npieces); |
|
|
p->nwant++; |
|
|
p->nwant++; |
|
|
if (p->nwant == 1) { |
|
|
if (p->nwant == 1) { |
|
|
int unsent = 0; |
|
|
|
|
|
struct nb_link *nl = BTPDQ_LAST(&p->outq, nb_tq); |
|
|
|
|
|
if (nl != NULL && nl->nb->type == NB_UNINTEREST) |
|
|
|
|
|
unsent = peer_unsend(p, nl); |
|
|
|
|
|
if (!unsent) |
|
|
|
|
|
peer_send(p, btpd.interest_msg); |
|
|
|
|
|
|
|
|
if (p->nreqs_out == 0) { |
|
|
|
|
|
int unsent = 0; |
|
|
|
|
|
struct nb_link *nl = BTPDQ_LAST(&p->outq, nb_tq); |
|
|
|
|
|
if (nl != NULL && nl->nb->type == NB_UNINTEREST) |
|
|
|
|
|
unsent = peer_unsend(p, nl); |
|
|
|
|
|
if (!unsent) |
|
|
|
|
|
peer_send(p, btpd.interest_msg); |
|
|
|
|
|
} |
|
|
p->flags |= PF_I_WANT; |
|
|
p->flags |= PF_I_WANT; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@@ -237,7 +241,8 @@ peer_unwant(struct peer *p, uint32_t index) |
|
|
p->nwant--; |
|
|
p->nwant--; |
|
|
if (p->nwant == 0) { |
|
|
if (p->nwant == 0) { |
|
|
p->flags &= ~PF_I_WANT; |
|
|
p->flags &= ~PF_I_WANT; |
|
|
peer_send(p, btpd.uninterest_msg); |
|
|
|
|
|
|
|
|
if (p->nreqs_out == 0) |
|
|
|
|
|
peer_send(p, btpd.uninterest_msg); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -303,6 +308,13 @@ peer_create_out_compact(struct torrent *tp, const char *compact) |
|
|
peer_send(p, nb_create_shake(p->tp)); |
|
|
peer_send(p, nb_create_shake(p->tp)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
peer_on_no_reqs(struct peer *p) |
|
|
|
|
|
{ |
|
|
|
|
|
if (p->nwant == 0) |
|
|
|
|
|
peer_send(p, btpd.uninterest_msg); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
|
peer_on_shake(struct peer *p) |
|
|
peer_on_shake(struct peer *p) |
|
|
{ |
|
|
{ |
|
@@ -331,6 +343,8 @@ peer_on_choke(struct peer *p) |
|
|
if ((p->flags & PF_P_CHOKE) != 0) |
|
|
if ((p->flags & PF_P_CHOKE) != 0) |
|
|
return; |
|
|
return; |
|
|
else { |
|
|
else { |
|
|
|
|
|
if (p->nreqs_out > 0) |
|
|
|
|
|
peer_on_no_reqs(p); |
|
|
p->flags |= PF_P_CHOKE; |
|
|
p->flags |= PF_P_CHOKE; |
|
|
cm_on_choke(p); |
|
|
cm_on_choke(p); |
|
|
struct nb_link *nl = BTPDQ_FIRST(&p->outq); |
|
|
struct nb_link *nl = BTPDQ_FIRST(&p->outq); |
|
@@ -421,6 +435,8 @@ peer_on_piece(struct peer *p, uint32_t index, uint32_t begin, |
|
|
p->nreqs_out--; |
|
|
p->nreqs_out--; |
|
|
BTPDQ_REMOVE(&p->my_reqs, req, p_entry); |
|
|
BTPDQ_REMOVE(&p->my_reqs, req, p_entry); |
|
|
cm_on_block(p, req, index, begin, length, data); |
|
|
cm_on_block(p, req, index, begin, length, data); |
|
|
|
|
|
if (p->nreqs_out == 0) |
|
|
|
|
|
peer_on_no_reqs(p); |
|
|
} else |
|
|
} else |
|
|
btpd_log(BTPD_L_MSG, "discarded piece(%u,%u,%u) from %p\n", |
|
|
btpd_log(BTPD_L_MSG, "discarded piece(%u,%u,%u) from %p\n", |
|
|
index, begin, length, p); |
|
|
index, begin, length, p); |
|
|