about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--btpd/peer.c36
-rw-r--r--btpd/policy.c28
-rw-r--r--btpd/policy.h5
3 files changed, 52 insertions, 17 deletions
diff --git a/btpd/peer.c b/btpd/peer.c
index b8646d7..ec5de83 100644
--- a/btpd/peer.c
+++ b/btpd/peer.c
@@ -205,41 +205,45 @@ peer_create_out_compact(struct torrent *tp, const char *compact)
 void
 peer_on_choke(struct peer *p)
 {
-    if ((p->flags & (PF_P_CHOKE|PF_I_WANT)) == PF_I_WANT) {
-	p->flags |= PF_P_CHOKE;
-	cm_on_undownload(p);
-    } else
+    if ((p->flags & PF_P_CHOKE) != 0)
+	return;
+    else {
 	p->flags |= PF_P_CHOKE;
+	cm_on_choke(p);
+    }
 }
 
 void
 peer_on_unchoke(struct peer *p)
 {
-    if ((p->flags & (PF_P_CHOKE|PF_I_WANT)) == (PF_P_CHOKE|PF_I_WANT)) {
-	p->flags &= ~PF_P_CHOKE;
-	cm_on_download(p);
-    } else
+    if ((p->flags & PF_P_CHOKE) == 0)
+	return;
+    else {
 	p->flags &= ~PF_P_CHOKE;
+	cm_on_unchoke(p);
+    }
 }
 
 void
 peer_on_interest(struct peer *p)
 {
-    if ((p->flags & (PF_P_WANT|PF_I_CHOKE)) == 0) {
-	p->flags |= PF_P_WANT;
-	cm_on_upload(p);
-    } else 
+    if ((p->flags & PF_P_WANT) != 0)
+	return;
+    else {
 	p->flags |= PF_P_WANT;
+	cm_on_interest(p);
+    }
 }
 
 void
 peer_on_uninterest(struct peer *p)
 {
-    if ((p->flags & (PF_P_WANT|PF_I_CHOKE)) == PF_P_WANT) {
-	p->flags &= ~PF_P_WANT;
-	cm_on_unupload(p);
-    } else
+    if ((p->flags & PF_P_WANT) == 0)
+	return;
+    else {
 	p->flags &= ~PF_P_WANT;
+	cm_on_uninterest(p);
+    }
 }
 
 void
diff --git a/btpd/policy.c b/btpd/policy.c
index 6050351..5b8ea67 100644
--- a/btpd/policy.c
+++ b/btpd/policy.c
@@ -216,6 +216,20 @@ cm_on_unupload(struct peer *peer)
 }
 
 void
+cm_on_interest(struct peer *peer)
+{
+    if ((peer->flags & PF_I_CHOKE) == 0)
+	cm_on_upload(peer);
+}
+
+void
+cm_on_uninterest(struct peer *peer)
+{
+    if ((peer->flags & PF_I_CHOKE) == 0)
+	cm_on_unupload(peer);
+}
+
+void
 cm_by_second(struct torrent *tp)
 {
     if (btpd.seconds == tp->tracker_time)
@@ -247,6 +261,20 @@ cm_on_undownload(struct peer *peer)
 }
 
 void
+cm_on_unchoke(struct peer *peer)
+{
+    if ((peer->flags & PF_I_WANT) != 0)
+	cm_on_download(peer);
+}
+
+void
+cm_on_choke(struct peer *peer)
+{
+    if ((peer->flags & PF_I_WANT) != 0)
+	cm_on_undownload(peer);
+}
+
+void
 cm_on_piece_ann(struct peer *peer, uint32_t piece)
 {
     struct piece *p;
diff --git a/btpd/policy.h b/btpd/policy.h
index 6ef850a..a57bbac 100644
--- a/btpd/policy.h
+++ b/btpd/policy.h
@@ -6,9 +6,12 @@ void cm_by_second(struct torrent *tp);
 void cm_on_new_peer(struct peer *peer);
 void cm_on_lost_peer(struct peer *peer);
 
+void cm_on_choke(struct peer *peer);
+void cm_on_unchoke(struct peer *peer);
 void cm_on_upload(struct peer *peer);
 void cm_on_unupload(struct peer *peer);
-
+void cm_on_interest(struct peer *peer);
+void cm_on_uninterest(struct peer *peer);
 void cm_on_download(struct peer *peer);
 void cm_on_undownload(struct peer *peer);
 void cm_on_piece_ann(struct peer *peer, uint32_t piece);