summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kadianakis <desnacked@riseup.net>2015-01-29 15:05:30 +0000
committerNick Mathewson <nickm@torproject.org>2015-02-18 09:09:33 -0500
commit14a3c17ce658c47ae9a0b8e689970efe37ca3b22 (patch)
treeb1038b5e2c91742fd7cd9b60f39e328cfe685d01
parentf4a63f8eabbdd842ebeb97aabba92ea47c37a607 (diff)
downloadtor-14a3c17ce658c47ae9a0b8e689970efe37ca3b22.tar.gz
tor-14a3c17ce658c47ae9a0b8e689970efe37ca3b22.zip
Calculate the guardfraction bandwidth of a guard.
-rw-r--r--src/or/entrynodes.c36
-rw-r--r--src/or/entrynodes.h14
2 files changed, 50 insertions, 0 deletions
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index a766f6cba3..93b23f6c3b 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -1715,6 +1715,42 @@ should_apply_guardfraction(const networkstatus_t *ns)
return options->UseGuardFraction;
}
+
+/* Given the original bandwidth of a guard and its guardfraction,
+ * calculate how much bandwidth the guard should have as a guard and
+ * as a non-guard.
+ *
+ * Quoting from proposal236:
+ *
+ * Let Wpf denote the weight from the 'bandwidth-weights' line a
+ * client would apply to N for position p if it had the guard
+ * flag, Wpn the weight if it did not have the guard flag, and B the
+ * measured bandwidth of N in the consensus. Then instead of choosing
+ * N for position p proportionally to Wpf*B or Wpn*B, clients should
+ * choose N proportionally to F*Wpf*B + (1-F)*Wpn*B.
+ *
+ * This function fills the <b>guardfraction_bw</b> structure. It sets
+ * <b>guard_bw</b> to F*B and <b>non_guard_bw</b> to (1-F)*B.
+ */
+void
+guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw,
+ int orig_bandwidth,
+ uint32_t guardfraction_percentage)
+{
+ double guardfraction_fraction;
+
+ /* Turn the percentage into a fraction. */
+ tor_assert(guardfraction_percentage <= 100);
+ guardfraction_fraction = guardfraction_percentage / 100.0;
+
+ long guard_bw = tor_lround(guardfraction_fraction * orig_bandwidth);
+ tor_assert(guard_bw <= INT_MAX);
+
+ guardfraction_bw->guard_bw = (int) guard_bw;
+
+ guardfraction_bw->non_guard_bw = orig_bandwidth - guard_bw;
+}
+
/** A list of configured bridges. Whenever we actually get a descriptor
* for one, we add it as an entry guard. Note that the order of bridges
* in this list does not necessarily correspond to the order of bridges
diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h
index 96d832ea2a..35bd748d0d 100644
--- a/src/or/entrynodes.h
+++ b/src/or/entrynodes.h
@@ -160,7 +160,21 @@ int validate_pluggable_transports_config(void);
double pathbias_get_close_success_count(entry_guard_t *guard);
double pathbias_get_use_success_count(entry_guard_t *guard);
+/** Contains the bandwidth of a relay as a guard and as a non-guard
+ * after the guardfraction has been considered. */
+typedef struct guardfraction_bandwidth_t {
+ /* Bandwidth as a guard after guardfraction has been considered. */
+ int guard_bw;
+ /* Bandwidth as a non-guard after guardfraction has been considered. */
+ int non_guard_bw;
+} guardfraction_bandwidth_t;
+
int should_apply_guardfraction(const networkstatus_t *ns);
+void
+guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw,
+ int orig_bandwidth,
+ uint32_t guardfraction_percentage);
+
#endif