[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r12948: Refactor circuit_launch* functions to take a bitfield of fla (in tor/trunk: . doc src/or)
Author: nickm
Date: 2007-12-23 14:15:22 -0500 (Sun, 23 Dec 2007)
New Revision: 12948
Modified:
tor/trunk/
tor/trunk/doc/TODO
tor/trunk/src/or/circuitbuild.c
tor/trunk/src/or/circuitlist.c
tor/trunk/src/or/circuituse.c
tor/trunk/src/or/control.c
tor/trunk/src/or/or.h
tor/trunk/src/or/rendservice.c
tor/trunk/src/or/router.c
Log:
r15653@tombo: nickm | 2007-12-23 14:15:12 -0500
Refactor circuit_launch* functions to take a bitfield of flags rather than 4 separate nonconsecutive flags arguments. Also, note a possible but in circuit_find_to_cannibalize, which seems to be ignoring its purpose argument.
Property changes on: tor/trunk
___________________________________________________________________
svk:merge ticket from /tor/trunk [r15653] on d9e39d38-0f13-419c-a857-e10a0ce2aa0c
Modified: tor/trunk/doc/TODO
===================================================================
--- tor/trunk/doc/TODO 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/doc/TODO 2007-12-23 19:15:22 UTC (rev 12948)
@@ -75,7 +75,7 @@
info and it's old enough, delete it. same with cached-routers*.
- document the "3/4 and 7/8" business in the clients fetching consensus
documents timeline. then document the bridge user download timeline.
- - refactor circuit_launch_by_foo so all those flags at the end are
+ o refactor circuit_launch_by_foo so all those flags at the end are
actually a flags argument.
- config option __ControllerLimit that hangs up if there are a limit
of controller connections already.
Modified: tor/trunk/src/or/circuitbuild.c
===================================================================
--- tor/trunk/src/or/circuitbuild.c 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/circuitbuild.c 2007-12-23 19:15:22 UTC (rev 12948)
@@ -283,19 +283,23 @@
}
/** Create and return a new origin circuit. Initialize its purpose and
- * build-state based on our arguments. */
+ * build-state based on our arguments. The <b>flags</b> argument is a
+ * bitfield of CIRCLAUNCH_* flags. */
origin_circuit_t *
-origin_circuit_init(uint8_t purpose, int onehop_tunnel,
- int need_uptime, int need_capacity, int internal)
+origin_circuit_init(uint8_t purpose, int flags)
{
/* sets circ->p_circ_id and circ->p_conn */
origin_circuit_t *circ = origin_circuit_new();
circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OR_WAIT);
circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
- circ->build_state->onehop_tunnel = onehop_tunnel;
- circ->build_state->need_uptime = need_uptime;
- circ->build_state->need_capacity = need_capacity;
- circ->build_state->is_internal = internal;
+ circ->build_state->onehop_tunnel =
+ ((flags & CIRCLAUNCH_ONEHOP_TUNNEL) ? 1 : 0);
+ circ->build_state->need_uptime =
+ ((flags & CIRCLAUNCH_NEED_UPTIME) ? 1 : 0);
+ circ->build_state->need_capacity =
+ ((flags & CIRCLAUNCH_NEED_CAPACITY) ? 1 : 0);
+ circ->build_state->is_internal =
+ ((flags & CIRCLAUNCH_IS_INTERNAL) ? 1 : 0);
circ->_base.purpose = purpose;
return circ;
}
@@ -308,15 +312,12 @@
* it's not open already.
*/
origin_circuit_t *
-circuit_establish_circuit(uint8_t purpose, int onehop_tunnel,
- extend_info_t *exit,
- int need_uptime, int need_capacity, int internal)
+circuit_establish_circuit(uint8_t purpose, extend_info_t *exit, int flags)
{
origin_circuit_t *circ;
int err_reason = 0;
- circ = origin_circuit_init(purpose, onehop_tunnel,
- need_uptime, need_capacity, internal);
+ circ = origin_circuit_init(purpose, flags);
if (onion_pick_cpath_exit(circ, exit) < 0 ||
onion_populate_cpath(circ) < 0) {
Modified: tor/trunk/src/or/circuitlist.c
===================================================================
--- tor/trunk/src/or/circuitlist.c 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/circuitlist.c 2007-12-23 19:15:22 UTC (rev 12948)
@@ -791,19 +791,24 @@
}
/** Return a circuit that is open, is CIRCUIT_PURPOSE_C_GENERAL,
- * has a timestamp_dirty value of 0, is uptime/capacity/internal
- * if required, and if info is defined, does not already use info
+ * has a timestamp_dirty value of 0, has flags matching the CIRCLAUNCH_*
+ * flags in <b>flags</b>, and if info is defined, does not already use info
* as any of its hops; or NULL if no circuit fits this description.
*
- * If ! need_uptime, prefer returning non-uptime circuits.
+ * If !CIRCLAUNCH_NEED_UPTIME, prefer returning non-uptime circuits.
*/
origin_circuit_t *
circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info,
- int need_uptime,
- int need_capacity, int internal)
+ int flags)
{
+ /*XXXX020 arma: The purpose argument is ignored. Can that possibly be
+ * right? */
+
circuit_t *_circ;
origin_circuit_t *best=NULL;
+ int need_uptime = flags & CIRCLAUNCH_NEED_UPTIME;
+ int need_capacity = flags & CIRCLAUNCH_NEED_CAPACITY;
+ int internal = flags & CIRCLAUNCH_IS_INTERNAL;
log_debug(LD_CIRC,
"Hunting for a circ to cannibalize: purpose %d, uptime %d, "
Modified: tor/trunk/src/or/circuituse.c
===================================================================
--- tor/trunk/src/or/circuituse.c 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/circuituse.c 2007-12-23 19:15:22 UTC (rev 12948)
@@ -371,6 +371,7 @@
int hidserv_needs_uptime=0, hidserv_needs_capacity=1;
int port_needs_uptime=0, port_needs_capacity=1;
time_t now = time(NULL);
+ int flags = 0;
/* First, count how many of each type of circuit we have already. */
for (circ=global_circuitlist;circ;circ = circ->next) {
@@ -402,22 +403,26 @@
* and no circuit is currently available that can handle it. */
if (!circuit_all_predicted_ports_handled(now, &port_needs_uptime,
&port_needs_capacity)) {
+ if (port_needs_uptime)
+ flags |= CIRCLAUNCH_NEED_UPTIME;
+ if (port_needs_capacity)
+ flags |= CIRCLAUNCH_NEED_CAPACITY;
log_info(LD_CIRC,
"Have %d clean circs (%d internal), need another exit circ.",
num, num_internal);
- circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, 0, NULL,
- port_needs_uptime, port_needs_capacity, 0);
+ circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags);
return;
}
/* Third, see if we need any more hidden service (server) circuits. */
if (num_rend_services() && num_uptime_internal < 3) {
+ flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME |
+ CIRCLAUNCH_IS_INTERNAL);
log_info(LD_CIRC,
"Have %d clean circs (%d internal), need another internal "
"circ for my hidden service.",
num, num_internal);
- circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, 0, NULL,
- 1, 1, 1);
+ circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags);
return;
}
@@ -426,12 +431,16 @@
&hidserv_needs_capacity) &&
((num_uptime_internal<2 && hidserv_needs_uptime) ||
num_internal<2)) {
+ if (hidserv_needs_uptime)
+ flags |= CIRCLAUNCH_NEED_UPTIME;
+ if (hidserv_needs_capacity)
+ flags |= CIRCLAUNCH_NEED_CAPACITY;
+ flags |= CIRCLAUNCH_IS_INTERNAL;
log_info(LD_CIRC,
"Have %d clean circs (%d uptime-internal, %d internal), need"
" another hidserv circ.",
num, num_uptime_internal, num_internal);
- circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, 0, NULL,
- hidserv_needs_uptime, hidserv_needs_capacity, 1);
+ circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags);
return;
}
}
@@ -469,7 +478,7 @@
circ &&
circ->timestamp_created + TESTING_CIRCUIT_INTERVAL < now) {
log_fn(LOG_INFO,"Creating a new testing circuit.");
- circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, 0, NULL, 0, 0, 0);
+ circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, 0);
}
#endif
}
@@ -798,34 +807,33 @@
/** Launch a new circuit; see circuit_launch_by_extend_info() for
* details on arguments. */
origin_circuit_t *
-circuit_launch_by_router(uint8_t purpose, int onehop_tunnel,
- routerinfo_t *exit, int need_uptime,
- int need_capacity, int internal)
+circuit_launch_by_router(uint8_t purpose,
+ routerinfo_t *exit, int flags)
{
origin_circuit_t *circ;
extend_info_t *info = NULL;
if (exit)
info = extend_info_from_router(exit);
- circ = circuit_launch_by_extend_info(
- purpose, onehop_tunnel, info, need_uptime, need_capacity, internal);
+ circ = circuit_launch_by_extend_info(purpose, info, flags);
if (info)
extend_info_free(info);
return circ;
}
/** Launch a new circuit with purpose <b>purpose</b> and exit node
- * <b>extend_info</b> (or NULL to select a random exit node).
- * If <b>need_uptime</b> is true,
- * choose among routers with high uptime. If <b>need_capacity</b> is true,
- * choose among routers with high bandwidth. If <b>internal</b> is true, the
- * last hop need not be an exit node. Return the newly allocated circuit on
- * success, or NULL on failure. */
+ * <b>extend_info</b> (or NULL to select a random exit node). If flags
+ * contains CIRCLAUNCH_NEED_UPTIME, choose among routers with high uptime. If
+ * CIRCLAUNCH_NEED_CAPACITY is set, choose among routers with high bandwidth.
+ * If CIRCLAUNCH_IS_INTERNAL is true, the last hop need not be an exit node.
+ * If CIRCLAUNCH_ONEHOP_TUNNEL is set, the circuit will have only one hop.
+ * Return the newly allocated circuit on success, or NULL on failure. */
origin_circuit_t *
-circuit_launch_by_extend_info(uint8_t purpose, int onehop_tunnel,
- extend_info_t *extend_info, int need_uptime,
- int need_capacity, int internal)
+circuit_launch_by_extend_info(uint8_t purpose,
+ extend_info_t *extend_info,
+ int flags)
{
origin_circuit_t *circ;
+ int onehop_tunnel = flags & CIRCLAUNCH_ONEHOP_TUNNEL;
if (!onehop_tunnel && !router_have_minimum_dir_info()) {
log_debug(LD_CIRC,"Haven't fetched enough directory info yet; canceling "
@@ -838,8 +846,7 @@
/* see if there are appropriate circs available to cannibalize. */
/* XXX020 if we're planning to add a hop, perhaps we want to look for
* internal circs rather than exit circs? -RD */
- circ = circuit_find_to_cannibalize(purpose, extend_info,
- need_uptime, need_capacity, internal);
+ circ = circuit_find_to_cannibalize(purpose, extend_info, flags);
if (circ) {
log_info(LD_CIRC,"Cannibalizing circ '%s' for purpose %d",
build_state_get_exit_nickname(circ->build_state), purpose);
@@ -881,16 +888,14 @@
/* try a circ. if it fails, circuit_mark_for_close will increment
* n_circuit_failures */
- return circuit_establish_circuit(purpose, onehop_tunnel, extend_info,
- need_uptime, need_capacity, internal);
+ return circuit_establish_circuit(purpose, extend_info, flags);
}
/** Launch a new circuit; see circuit_launch_by_extend_info() for
* details on arguments. */
origin_circuit_t *
-circuit_launch_by_nickname(uint8_t purpose, int onehop_tunnel,
- const char *exit_nickname,
- int need_uptime, int need_capacity, int internal)
+circuit_launch_by_nickname(uint8_t purpose,
+ const char *exit_nickname, int flags)
{
routerinfo_t *router = NULL;
@@ -902,8 +907,7 @@
return NULL;
}
}
- return circuit_launch_by_router(purpose, onehop_tunnel, router,
- need_uptime, need_capacity, internal);
+ return circuit_launch_by_router(purpose, router, flags);
}
/** Record another failure at opening a general circuit. When we have
@@ -1085,9 +1089,15 @@
else
new_circ_purpose = desired_circuit_purpose;
- circ = circuit_launch_by_extend_info(
- new_circ_purpose, want_onehop, extend_info,
- need_uptime, 1, need_internal);
+ {
+ int flags = CIRCLAUNCH_NEED_CAPACITY;
+ if (want_onehop) flags |= CIRCLAUNCH_ONEHOP_TUNNEL;
+ if (need_uptime) flags |= CIRCLAUNCH_NEED_UPTIME;
+ if (need_internal) flags |= CIRCLAUNCH_IS_INTERNAL;
+ circ = circuit_launch_by_extend_info(new_circ_purpose, extend_info,
+ flags);
+ }
+
if (extend_info)
extend_info_free(extend_info);
Modified: tor/trunk/src/or/control.c
===================================================================
--- tor/trunk/src/or/control.c 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/control.c 2007-12-23 19:15:22 UTC (rev 12948)
@@ -2019,7 +2019,7 @@
if (zero_circ) {
/* start a new circuit */
- circ = origin_circuit_init(intended_purpose, 0, 0, 0, 0);
+ circ = origin_circuit_init(intended_purpose, 0);
}
/* now circ refers to something that is ready to be extended */
Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/or.h 2007-12-23 19:15:22 UTC (rev 12948)
@@ -2473,13 +2473,10 @@
void circuit_log_path(int severity, unsigned int domain,
origin_circuit_t *circ);
void circuit_rep_hist_note_result(origin_circuit_t *circ);
-origin_circuit_t *origin_circuit_init(uint8_t purpose, int onehop_tunnel,
- int need_uptime,
- int need_capacity, int internal);
+origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags);
origin_circuit_t *circuit_establish_circuit(uint8_t purpose,
- int onehop_tunnel, extend_info_t *exit,
- int need_uptime, int need_capacity,
- int internal);
+ extend_info_t *exit,
+ int flags);
int circuit_handle_first_hop(origin_circuit_t *circ);
void circuit_n_conn_done(or_connection_t *or_conn, int status);
int inform_testing_reachability(void);
@@ -2556,9 +2553,7 @@
or_circuit_t *circuit_get_rendezvous(const char *cookie);
or_circuit_t *circuit_get_intro_point(const char *digest);
origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
- extend_info_t *info,
- int need_uptime,
- int need_capacity, int internal);
+ extend_info_t *info, int flags);
void circuit_mark_all_unused_circs(void);
void circuit_expire_all_dirty_circs(void);
void _circuit_mark_for_close(circuit_t *circ, int reason,
@@ -2590,21 +2585,24 @@
void circuit_has_opened(origin_circuit_t *circ);
void circuit_build_failed(origin_circuit_t *circ);
+
+/** Flag to set when a circuit should have only a single hop. */
+#define CIRCLAUNCH_ONEHOP_TUNNEL (1<<0)
+/** Flag to set when a circuit needs to be built of high-uptime nodes */
+#define CIRCLAUNCH_NEED_UPTIME (1<<1)
+/** Flag to set when a circuit needs to be build of high-capcity nodes */
+#define CIRCLAUNCH_NEED_CAPACITY (1<<2)
+/** Flag to set when the last hop of a circuit doesn't need to be an
+ * exit node. */
+#define CIRCLAUNCH_IS_INTERNAL (1<<3)
origin_circuit_t *circuit_launch_by_nickname(uint8_t purpose,
- int onehop_tunnel,
- const char *exit_nickname,
- int need_uptime, int need_capacity,
- int is_internal);
+ const char *exit_nickname,
+ int flags);
origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose,
- int onehop_tunnel,
- extend_info_t *info,
- int need_uptime, int need_capacity,
- int is_internal);
+ extend_info_t *info,
+ int flags);
origin_circuit_t *circuit_launch_by_router(uint8_t purpose,
- int onehop_tunnel,
- routerinfo_t *exit,
- int need_uptime, int need_capacity,
- int is_internal);
+ routerinfo_t *exit, int flags);
void circuit_reset_failure_count(int timeout);
int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn,
origin_circuit_t *circ,
Modified: tor/trunk/src/or/rendservice.c
===================================================================
--- tor/trunk/src/or/rendservice.c 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/rendservice.c 2007-12-23 19:15:22 UTC (rev 12948)
@@ -647,9 +647,10 @@
/* Launch a circuit to alice's chosen rendezvous point.
*/
for (i=0;i<MAX_REND_FAILURES;i++) {
+ int flags = CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_IS_INTERNAL;
+ if (circ_needs_uptime) flags |= CIRCLAUNCH_NEED_UPTIME;
launched = circuit_launch_by_extend_info(
- CIRCUIT_PURPOSE_S_CONNECT_REND, 0, extend_info,
- circ_needs_uptime, 1, 1);
+ CIRCUIT_PURPOSE_S_CONNECT_REND, extend_info, flags);
if (launched)
break;
@@ -728,8 +729,10 @@
log_info(LD_REND,"Reattempting rendezvous circuit to '%s'",
oldstate->chosen_exit->nickname);
- newcirc = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, 0,
- oldstate->chosen_exit, 0, 1, 1);
+ newcirc = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND,
+ oldstate->chosen_exit,
+ CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL);
+
if (!newcirc) {
log_warn(LD_REND,"Couldn't relaunch rendezvous circuit to '%s'.",
oldstate->chosen_exit->nickname);
@@ -769,7 +772,9 @@
++service->n_intro_circuits_launched;
launched = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO,
- 0, intro->extend_info, 1, 0, 1);
+ intro->extend_info,
+ CIRCLAUNCH_NEED_UPTIME|CIRCLAUNCH_IS_INTERNAL);
+
if (!launched) {
log_info(LD_REND,
"Can't launch circuit to establish introduction at %s.",
Modified: tor/trunk/src/or/router.c
===================================================================
--- tor/trunk/src/or/router.c 2007-12-23 18:29:41 UTC (rev 12947)
+++ tor/trunk/src/or/router.c 2007-12-23 19:15:22 UTC (rev 12948)
@@ -699,7 +699,8 @@
log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.",
!orport_reachable ? "reachability" : "bandwidth",
me->address, me->or_port);
- circuit_launch_by_router(CIRCUIT_PURPOSE_TESTING, 0, me, 0, 1, 1);
+ circuit_launch_by_router(CIRCUIT_PURPOSE_TESTING, me,
+ CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL);
control_event_server_status(LOG_NOTICE,
"CHECKING_REACHABILITY ORADDRESS=%s:%d",
me->address, me->or_port);