Use channel_t in cpuworker.c

Note: this is a squashed commit; see branch bug6465_rebased_v2 of user/andrea/tor.git for full history of the following 2 commits:

Use channel_t in cpuworker.c
Fix bug in channel_t usage in cpuworker.c that was killing relaying on channel_t-ized Tor.  The tags passed to the worker now have a channel ID, not a connection ID.
This commit is contained in:
Andrea Shepard 2012-08-30 15:47:05 -07:00 committed by Andrea Shepard
parent 6cce6241dd
commit 77dac97354

View File

@ -14,6 +14,8 @@
#include "or.h" #include "or.h"
#include "buffers.h" #include "buffers.h"
#include "channel.h"
#include "channeltls.h"
#include "circuitbuild.h" #include "circuitbuild.h"
#include "circuitlist.h" #include "circuitlist.h"
#include "config.h" #include "config.h"
@ -68,19 +70,20 @@ connection_cpu_finished_flushing(connection_t *conn)
/** Pack global_id and circ_id; set *tag to the result. (See note on /** Pack global_id and circ_id; set *tag to the result. (See note on
* cpuworker_main for wire format.) */ * cpuworker_main for wire format.) */
static void static void
tag_pack(char *tag, uint64_t conn_id, circid_t circ_id) tag_pack(char *tag, uint64_t chan_id, circid_t circ_id)
{ {
/*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/ /*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/
set_uint64(tag, conn_id); /*XXXX DOUBLEPLUSTHIS!!!! AS AS AS AS*/
set_uint64(tag, chan_id);
set_uint16(tag+8, circ_id); set_uint16(tag+8, circ_id);
} }
/** Unpack <b>tag</b> into addr, port, and circ_id. /** Unpack <b>tag</b> into addr, port, and circ_id.
*/ */
static void static void
tag_unpack(const char *tag, uint64_t *conn_id, circid_t *circ_id) tag_unpack(const char *tag, uint64_t *chan_id, circid_t *circ_id)
{ {
*conn_id = get_uint64(tag); *chan_id = get_uint64(tag);
*circ_id = get_uint16(tag+8); *circ_id = get_uint16(tag+8);
} }
@ -131,10 +134,9 @@ connection_cpu_process_inbuf(connection_t *conn)
{ {
char success; char success;
char buf[LEN_ONION_RESPONSE]; char buf[LEN_ONION_RESPONSE];
uint64_t conn_id; uint64_t chan_id;
circid_t circ_id; circid_t circ_id;
connection_t *tmp_conn; channel_t *p_chan = NULL;
or_connection_t *p_conn = NULL;
circuit_t *circ; circuit_t *circ;
tor_assert(conn); tor_assert(conn);
@ -152,15 +154,15 @@ connection_cpu_process_inbuf(connection_t *conn)
connection_fetch_from_buf(buf,LEN_ONION_RESPONSE-1,conn); connection_fetch_from_buf(buf,LEN_ONION_RESPONSE-1,conn);
/* parse out the circ it was talking about */ /* parse out the circ it was talking about */
tag_unpack(buf, &conn_id, &circ_id); tag_unpack(buf, &chan_id, &circ_id);
circ = NULL; circ = NULL;
tmp_conn = connection_get_by_global_id(conn_id); log_debug(LD_OR,
if (tmp_conn && !tmp_conn->marked_for_close && "Unpacking cpuworker reply, chan_id is %lu, circ_id is %d",
tmp_conn->type == CONN_TYPE_OR) chan_id, circ_id);
p_conn = TO_OR_CONN(tmp_conn); p_chan = channel_find_by_global_id(chan_id);
if (p_conn) if (p_chan)
circ = circuit_get_by_circid_orconn(circ_id, p_conn); circ = circuit_get_by_circid_channel(circ_id, p_chan);
if (success == 0) { if (success == 0) {
log_debug(LD_OR, log_debug(LD_OR,
@ -475,12 +477,12 @@ assign_onionskin_to_cpuworker(connection_t *cpuworker,
tor_assert(cpuworker); tor_assert(cpuworker);
if (!circ->p_conn) { if (!circ->p_chan) {
log_info(LD_OR,"circ->p_conn gone. Failing circ."); log_info(LD_OR,"circ->p_chan gone. Failing circ.");
tor_free(onionskin); tor_free(onionskin);
return -1; return -1;
} }
tag_pack(tag, circ->p_conn->_base.global_identifier, tag_pack(tag, circ->p_chan->global_identifier,
circ->p_circ_id); circ->p_circ_id);
cpuworker->state = CPUWORKER_STATE_BUSY_ONION; cpuworker->state = CPUWORKER_STATE_BUSY_ONION;