aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2016-11-26 09:22:04 -0500
committerNick Mathewson <nickm@torproject.org>2016-12-16 11:06:16 -0500
commit039bd01767d42961cb16ff4914481332b52cf8db (patch)
tree52048c96bd405e8dbe544ae97889185cd048a3bb
parent2ea5aa71823f385e36f20e643a20996dcb164464 (diff)
downloadtor-039bd01767d42961cb16ff4914481332b52cf8db.tar.gz
tor-039bd01767d42961cb16ff4914481332b52cf8db.zip
Add a wrapper for a common networkstatus param pattern
We frequently want to check a networkstatus parameter only when it isn't overridden from the torrc file.
-rw-r--r--src/or/networkstatus.c19
-rw-r--r--src/or/networkstatus.h5
-rw-r--r--src/test/test_dir.c9
3 files changed, 33 insertions, 0 deletions
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index ec8f77fa42..ce23d67979 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -2304,6 +2304,25 @@ networkstatus_get_param(const networkstatus_t *ns, const char *param_name,
}
/**
+ * As networkstatus_get_param(), but check torrc_value before checking the
+ * consensus. If torrc_value is in-range, then return it instead of the
+ * value from the consensus.
+ */
+int32_t
+networkstatus_get_overridable_param(const networkstatus_t *ns,
+ int32_t torrc_value,
+ const char *param_name,
+ int32_t default_val,
+ int32_t min_val, int32_t max_val)
+{
+ if (torrc_value >= min_val && torrc_value <= max_val)
+ return torrc_value;
+ else
+ return networkstatus_get_param(
+ ns, param_name, default_val, min_val, max_val);
+}
+
+/**
* Retrieve the consensus parameter that governs the
* fixed-point precision of our network balancing 'bandwidth-weights'
* (which are themselves integer consensus values). We divide them
diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h
index 71f36b69ed..4b3854db0c 100644
--- a/src/or/networkstatus.h
+++ b/src/or/networkstatus.h
@@ -111,6 +111,11 @@ int32_t networkstatus_get_param(const networkstatus_t *ns,
const char *param_name,
int32_t default_val, int32_t min_val,
int32_t max_val);
+int32_t networkstatus_get_overridable_param(const networkstatus_t *ns,
+ int32_t torrc_value,
+ const char *param_name,
+ int32_t default_val,
+ int32_t min_val, int32_t max_val);
int getinfo_helper_networkstatus(control_connection_t *conn,
const char *question, char **answer,
const char **errmsg);
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index 4501d6b547..4ef421f8e3 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -1494,6 +1494,15 @@ test_dir_param_voting(void *arg)
tt_int_op(-8,OP_EQ, networkstatus_get_param(&vote4, "ab", -12, -100, -8));
tt_int_op(0,OP_EQ, networkstatus_get_param(&vote4, "foobar", 0, -100, 8));
+ tt_int_op(100,OP_EQ, networkstatus_get_overridable_param(
+ &vote4, -1, "x-yz", 50, 0, 300));
+ tt_int_op(30,OP_EQ, networkstatus_get_overridable_param(
+ &vote4, 30, "x-yz", 50, 0, 300));
+ tt_int_op(0,OP_EQ, networkstatus_get_overridable_param(
+ &vote4, -101, "foobar", 0, -100, 8));
+ tt_int_op(-99,OP_EQ, networkstatus_get_overridable_param(
+ &vote4, -99, "foobar", 0, -100, 8));
+
smartlist_add(votes, &vote1);
/* Do the first tests without adding all the other votes, for