aboutsummaryrefslogtreecommitdiff
path: root/src/or/circuitlist.c
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@fscked.org>2012-11-17 16:30:50 -0800
committerMike Perry <mikeperry-git@fscked.org>2012-12-07 15:28:38 -0800
commit412ae099cb656ab47fc8cbb408aa5f4cee956961 (patch)
tree61414cce9a93269793c435b2c716bb25f12313ad /src/or/circuitlist.c
parentda5c398d79c890966339558749662fa8ffabf480 (diff)
downloadtor-412ae099cb656ab47fc8cbb408aa5f4cee956961.tar
tor-412ae099cb656ab47fc8cbb408aa5f4cee956961.tar.gz
Prop 209: Add path bias counts for timeouts and other mechanisms.
Turns out there's more than one way to block a tagged circuit. This seems to successfully handle all of the normal exit circuits. Hidden services need additional tweaks, still.
Diffstat (limited to 'src/or/circuitlist.c')
-rw-r--r--src/or/circuitlist.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 8f06c0679..66cdbe10c 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -1347,7 +1347,44 @@ circuit_mark_for_close_(circuit_t *circ, int reason, int line,
}
reason = END_CIRC_REASON_NONE;
}
+
if (CIRCUIT_IS_ORIGIN(circ)) {
+ origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
+
+ if (ocirc->path_state == PATH_STATE_SUCCEEDED) {
+ int pathbias_is_normal_close = 1;
+
+ /* FIXME: Is timestamp_dirty the right thing for these two checks?
+ * Should we use isolation_any_streams_attached instead? */
+ if (!circ->timestamp_dirty) {
+ if (reason & END_CIRC_REASON_FLAG_REMOTE) {
+ /* Unused remote circ close reasons all could be bias */
+ pathbias_is_normal_close = 0;
+ pathbias_count_collapse(ocirc);
+ } else if ((reason & ~END_CIRC_REASON_FLAG_REMOTE)
+ == END_CIRC_REASON_CHANNEL_CLOSED &&
+ circ->n_chan->reason_for_closing
+ != CHANNEL_CLOSE_REQUESTED) {
+ /* If we didn't close the channel ourselves, it could be bias */
+ /* FIXME: Only count bias if the network is live?
+ * What about clock jumps/suspends? */
+ pathbias_is_normal_close = 0;
+ pathbias_count_collapse(ocirc);
+ }
+ } else if (circ->timestamp_dirty && !ocirc->any_streams_succeeded) {
+ /* Any circuit where there were attempted streams but no successful
+ * streams could be bias */
+ /* FIXME: This may be better handled by limiting the number of retries
+ * per stream? */
+ pathbias_is_normal_close = 0;
+ pathbias_count_unusable(ocirc);
+ }
+
+ if (pathbias_is_normal_close) {
+ pathbias_count_successful_close(ocirc);
+ }
+ }
+
/* We don't send reasons when closing circuits at the origin. */
reason = END_CIRC_REASON_NONE;
}