aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-07-06 17:08:24 -0400
committerNick Mathewson <nickm@torproject.org>2011-07-19 01:58:45 -0400
commit773bfaf91ebe1ef80f37d473714a11f962e753fb (patch)
tree0c115b831f478d641b051d7be0cae8e5c5216c8b /src/common
parent1d3c8c1f74e9f80317a70c3b7d9372dee87dd373 (diff)
downloadtor-773bfaf91ebe1ef80f37d473714a11f962e753fb.tar
tor-773bfaf91ebe1ef80f37d473714a11f962e753fb.tar.gz
Implement stream isolation
This is the meat of proposal 171: we change circuit_is_acceptable() to require that the connection is compatible with every connection that has been linked to the circuit; we update circuit_is_better to prefer attaching streams to circuits in the way that decreases the circuits' usefulness the least; and we update link_apconn_to_circ() to do the appropriate bookkeeping.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/util.c26
-rw-r--r--src/common/util.h1
2 files changed, 27 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
index b95ee3a61..bf0bbe060 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -412,6 +412,32 @@ round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor)
return number;
}
+/** Return the number of bits set in <b>v</b>. */
+int
+n_bits_set_u8(uint8_t v)
+{
+ static const int nybble_table[] = {
+ 0, /* 0000 */
+ 1, /* 0001 */
+ 1, /* 0010 */
+ 2, /* 0011 */
+ 1, /* 0100 */
+ 2, /* 0101 */
+ 2, /* 0110 */
+ 3, /* 0111 */
+ 1, /* 1000 */
+ 2, /* 1001 */
+ 2, /* 1010 */
+ 3, /* 1011 */
+ 2, /* 1100 */
+ 3, /* 1101 */
+ 3, /* 1110 */
+ 4, /* 1111 */
+ };
+
+ return nybble_table[v & 15] + nybble_table[v>>4];
+}
+
/* =====
* String manipulation
* ===== */
diff --git a/src/common/util.h b/src/common/util.h
index 6496c42db..de06c3c5f 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -160,6 +160,7 @@ uint64_t round_to_power_of_2(uint64_t u64);
unsigned round_to_next_multiple_of(unsigned number, unsigned divisor);
uint32_t round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor);
uint64_t round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor);
+int n_bits_set_u8(uint8_t v);
/* Compute the CEIL of <b>a</b> divided by <b>b</b>, for nonnegative <b>a</b>
* and positive <b>b</b>. Works on integer types only. Not defined if a+b can