mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Include circuit purposes in circuit events. Now all circuit events are extended; this makes the code simpler.
svn:r17007
This commit is contained in:
@@ -64,6 +64,7 @@ Changes in version 0.2.1.6-alpha - 2008-09-29
|
||||
people find host:port too confusing.
|
||||
- Make TrackHostExit mappings expire a while after their last use, not
|
||||
after their creation. Patch from Robert Hogan.
|
||||
- Provide circuit purposes along with circuit events to the controller.
|
||||
|
||||
o Minor bugfixes:
|
||||
- Fix compile on OpenBSD 4.4-current. Bugfix on 0.2.1.5-alpha.
|
||||
|
||||
@@ -319,6 +319,50 @@ circuit_state_to_string(int state)
|
||||
}
|
||||
}
|
||||
|
||||
/** Map a circuit purpose to a string suitable to be displayed to a
|
||||
* controller. */
|
||||
const char *
|
||||
circuit_purpose_to_controller_string(uint8_t purpose)
|
||||
{
|
||||
static char buf[32];
|
||||
switch (purpose) {
|
||||
case CIRCUIT_PURPOSE_OR:
|
||||
case CIRCUIT_PURPOSE_INTRO_POINT:
|
||||
case CIRCUIT_PURPOSE_REND_POINT_WAITING:
|
||||
case CIRCUIT_PURPOSE_REND_ESTABLISHED:
|
||||
return "SERVER"; /* A controller should never see these, actually. */
|
||||
|
||||
case CIRCUIT_PURPOSE_C_GENERAL:
|
||||
return "GENERAL";
|
||||
case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT:
|
||||
case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED:
|
||||
return "HS_CLIENT_INTRO";
|
||||
|
||||
case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
|
||||
case CIRCUIT_PURPOSE_C_REND_READY:
|
||||
case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED:
|
||||
case CIRCUIT_PURPOSE_C_REND_JOINED:
|
||||
return "HS_CLIENT_REND";
|
||||
|
||||
case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
|
||||
case CIRCUIT_PURPOSE_S_INTRO:
|
||||
return "HS_SERVICE_INTRO";
|
||||
|
||||
case CIRCUIT_PURPOSE_S_CONNECT_REND:
|
||||
case CIRCUIT_PURPOSE_S_REND_JOINED:
|
||||
return "HS_SERVICE_REND";
|
||||
|
||||
case CIRCUIT_PURPOSE_TESTING:
|
||||
return "TESTING";
|
||||
case CIRCUIT_PURPOSE_CONTROLLER:
|
||||
return "CONTROLLER";
|
||||
|
||||
default:
|
||||
tor_snprintf(buf, sizeof(buf), "UNKNOWN_%d", (int)purpose);
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
/** Initialize the common elements in a circuit_t, and add it to the global
|
||||
* list. */
|
||||
static void
|
||||
|
||||
+17
-25
@@ -2964,7 +2964,7 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp,
|
||||
int reason_code)
|
||||
{
|
||||
const char *status;
|
||||
char reason_buf[64];
|
||||
char extended_buf[96];
|
||||
int providing_reason=0;
|
||||
char *path=NULL;
|
||||
if (!EVENT_IS_INTERESTING(EVENT_CIRCUIT_STATUS))
|
||||
@@ -2986,9 +2986,13 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
tor_snprintf(extended_buf, sizeof(extended_buf), "PURPOSE=%s",
|
||||
circuit_purpose_to_controller_string(circ->_base.purpose));
|
||||
|
||||
if (tp == CIRC_EVENT_FAILED || tp == CIRC_EVENT_CLOSED) {
|
||||
const char *reason_str = circuit_end_reason_to_control_string(reason_code);
|
||||
char *reason = NULL;
|
||||
size_t n=strlen(extended_buf);
|
||||
providing_reason=1;
|
||||
if (!reason_str) {
|
||||
reason = tor_malloc(16);
|
||||
@@ -2996,41 +3000,29 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp,
|
||||
reason_str = reason;
|
||||
}
|
||||
if (reason_code > 0 && reason_code & END_CIRC_REASON_FLAG_REMOTE) {
|
||||
tor_snprintf(reason_buf, sizeof(reason_buf),
|
||||
"REASON=DESTROYED REMOTE_REASON=%s", reason_str);
|
||||
tor_snprintf(extended_buf+n, sizeof(extended_buf)-n,
|
||||
" REASON=DESTROYED REMOTE_REASON=%s", reason_str);
|
||||
} else {
|
||||
tor_snprintf(reason_buf, sizeof(reason_buf),
|
||||
"REASON=%s", reason_str);
|
||||
tor_snprintf(extended_buf+n, sizeof(extended_buf)-n,
|
||||
" REASON=%s", reason_str);
|
||||
}
|
||||
tor_free(reason);
|
||||
}
|
||||
|
||||
if (EVENT_IS_INTERESTING1S(EVENT_CIRCUIT_STATUS)) {
|
||||
const char *sp = strlen(path) ? " " : "";
|
||||
if (providing_reason)
|
||||
send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES,
|
||||
"650 CIRC %lu %s%s%s@%s\r\n",
|
||||
(unsigned long)circ->global_identifier,
|
||||
status, sp, path, reason_buf);
|
||||
else
|
||||
send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES,
|
||||
"650 CIRC %lu %s%s%s\r\n",
|
||||
(unsigned long)circ->global_identifier,
|
||||
status, sp, path);
|
||||
send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES,
|
||||
"650 CIRC %lu %s%s%s@%s\r\n",
|
||||
(unsigned long)circ->global_identifier,
|
||||
status, sp, path, extended_buf);
|
||||
}
|
||||
if (EVENT_IS_INTERESTING1L(EVENT_CIRCUIT_STATUS)) {
|
||||
char *vpath = circuit_list_path_for_controller(circ);
|
||||
const char *sp = strlen(vpath) ? " " : "";
|
||||
if (providing_reason)
|
||||
send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES,
|
||||
"650 CIRC %lu %s%s%s@%s\r\n",
|
||||
(unsigned long)circ->global_identifier,
|
||||
status, sp, vpath, reason_buf);
|
||||
else
|
||||
send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES,
|
||||
"650 CIRC %lu %s%s%s\r\n",
|
||||
(unsigned long)circ->global_identifier,
|
||||
status, sp, vpath);
|
||||
send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES,
|
||||
"650 CIRC %lu %s%s%s@%s\r\n",
|
||||
(unsigned long)circ->global_identifier,
|
||||
status, sp, vpath, extended_buf);
|
||||
tor_free(vpath);
|
||||
}
|
||||
|
||||
|
||||
@@ -2703,6 +2703,7 @@ void entry_guards_free_all(void);
|
||||
|
||||
circuit_t * _circuit_get_global_list(void);
|
||||
const char *circuit_state_to_string(int state);
|
||||
const char *circuit_purpose_to_controller_string(uint8_t purpose);
|
||||
void circuit_dump_by_conn(connection_t *conn, int severity);
|
||||
void circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id,
|
||||
or_connection_t *conn);
|
||||
|
||||
Reference in New Issue
Block a user