mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 20:33:31 +01:00
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:
parent
6cce6241dd
commit
77dac97354
@ -14,6 +14,8 @@
|
||||
|
||||
#include "or.h"
|
||||
#include "buffers.h"
|
||||
#include "channel.h"
|
||||
#include "channeltls.h"
|
||||
#include "circuitbuild.h"
|
||||
#include "circuitlist.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
|
||||
* cpuworker_main for wire format.) */
|
||||
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*/
|
||||
set_uint64(tag, conn_id);
|
||||
/*XXXX DOUBLEPLUSTHIS!!!! AS AS AS AS*/
|
||||
set_uint64(tag, chan_id);
|
||||
set_uint16(tag+8, circ_id);
|
||||
}
|
||||
|
||||
/** Unpack <b>tag</b> into addr, port, and circ_id.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
@ -131,10 +134,9 @@ connection_cpu_process_inbuf(connection_t *conn)
|
||||
{
|
||||
char success;
|
||||
char buf[LEN_ONION_RESPONSE];
|
||||
uint64_t conn_id;
|
||||
uint64_t chan_id;
|
||||
circid_t circ_id;
|
||||
connection_t *tmp_conn;
|
||||
or_connection_t *p_conn = NULL;
|
||||
channel_t *p_chan = NULL;
|
||||
circuit_t *circ;
|
||||
|
||||
tor_assert(conn);
|
||||
@ -152,15 +154,15 @@ connection_cpu_process_inbuf(connection_t *conn)
|
||||
connection_fetch_from_buf(buf,LEN_ONION_RESPONSE-1,conn);
|
||||
|
||||
/* parse out the circ it was talking about */
|
||||
tag_unpack(buf, &conn_id, &circ_id);
|
||||
tag_unpack(buf, &chan_id, &circ_id);
|
||||
circ = NULL;
|
||||
tmp_conn = connection_get_by_global_id(conn_id);
|
||||
if (tmp_conn && !tmp_conn->marked_for_close &&
|
||||
tmp_conn->type == CONN_TYPE_OR)
|
||||
p_conn = TO_OR_CONN(tmp_conn);
|
||||
log_debug(LD_OR,
|
||||
"Unpacking cpuworker reply, chan_id is %lu, circ_id is %d",
|
||||
chan_id, circ_id);
|
||||
p_chan = channel_find_by_global_id(chan_id);
|
||||
|
||||
if (p_conn)
|
||||
circ = circuit_get_by_circid_orconn(circ_id, p_conn);
|
||||
if (p_chan)
|
||||
circ = circuit_get_by_circid_channel(circ_id, p_chan);
|
||||
|
||||
if (success == 0) {
|
||||
log_debug(LD_OR,
|
||||
@ -475,12 +477,12 @@ assign_onionskin_to_cpuworker(connection_t *cpuworker,
|
||||
|
||||
tor_assert(cpuworker);
|
||||
|
||||
if (!circ->p_conn) {
|
||||
log_info(LD_OR,"circ->p_conn gone. Failing circ.");
|
||||
if (!circ->p_chan) {
|
||||
log_info(LD_OR,"circ->p_chan gone. Failing circ.");
|
||||
tor_free(onionskin);
|
||||
return -1;
|
||||
}
|
||||
tag_pack(tag, circ->p_conn->_base.global_identifier,
|
||||
tag_pack(tag, circ->p_chan->global_identifier,
|
||||
circ->p_circ_id);
|
||||
|
||||
cpuworker->state = CPUWORKER_STATE_BUSY_ONION;
|
||||
|
Loading…
Reference in New Issue
Block a user