diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-02-23 20:13:02 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-02-23 20:13:02 +0000 |
commit | 55cbbdf9bfea465ecbfd5ef67dc7d37650a07018 (patch) | |
tree | ba4152a0d8c0ff21ad863d24cd42a35f52d4f50f /src/or/relay.c | |
parent | f1d207b29a8b4e7b55ea5f95212428581e34306a (diff) | |
download | tor-55cbbdf9bfea465ecbfd5ef67dc7d37650a07018.tar.gz tor-55cbbdf9bfea465ecbfd5ef67dc7d37650a07018.zip |
r11895@catbus: nickm | 2007-02-23 15:12:58 -0500
Make remap stream events have a souce; make them generated every time we get a successful connected or resolved cell. Also change reported stream target address to IP consistently when we get the IP from an exit node.
svn:r9624
Diffstat (limited to 'src/or/relay.c')
-rw-r--r-- | src/or/relay.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/or/relay.c b/src/or/relay.c index dffe22adce..e89937f4f5 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -829,6 +829,21 @@ connection_edge_process_end_not_open( return 0; } +/** Helper: change the socks_request->address field on conn to the dotted-quad + * representation of <b>new_addr</b> (given in host order), and send an + * appropriate REMAP event. */ +static void +remap_event_helper(edge_connection_t *conn, uint32_t new_addr) +{ + struct in_addr in; + + in.s_addr = htonl(new_addr); + tor_inet_ntoa(&in, conn->socks_request->address, + sizeof(conn->socks_request->address)); + control_event_stream_status(conn, STREAM_EVENT_REMAP, + REMAP_STREAM_SOURCE_EXIT); +} + /** An incoming relay cell has arrived from circuit <b>circ</b> to * stream <b>conn</b>. * @@ -858,7 +873,7 @@ connection_edge_process_relay_cell_not_open( "Got 'connected' while not in state connect_wait. Dropping."); return 0; } -// log_fn(LOG_INFO,"Connected! Notifying application."); + // log_fn(LOG_INFO,"Connected! Notifying application."); conn->_base.state = AP_CONN_STATE_OPEN; log_info(LD_APP,"'connected' received after %d seconds.", (int)(time(NULL) - conn->_base.timestamp_lastread)); @@ -879,6 +894,8 @@ connection_edge_process_relay_cell_not_open( ttl = -1; client_dns_set_addressmap(conn->socks_request->address, addr, conn->chosen_exit_name, ttl); + + remap_event_helper(conn, addr); } circuit_log_path(LOG_INFO,LD_APP,TO_ORIGIN_CIRCUIT(circ)); /* don't send a socks reply to transparent conns */ @@ -896,6 +913,7 @@ connection_edge_process_relay_cell_not_open( rh->command == RELAY_COMMAND_RESOLVED) { int ttl; int answer_len; + uint8_t answer_type; if (conn->_base.state != AP_CONN_STATE_RESOLVE_WAIT) { log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a 'resolved' cell while " "not in state resolve_wait. Dropping."); @@ -914,11 +932,17 @@ connection_edge_process_relay_cell_not_open( 2+answer_len)); else ttl = -1; + + answer_type = cell->payload[RELAY_HEADER_SIZE]; connection_ap_handshake_socks_resolved(conn, - cell->payload[RELAY_HEADER_SIZE], /*answer_type*/ + answer_type, cell->payload[RELAY_HEADER_SIZE+1], /*answer_len*/ cell->payload+RELAY_HEADER_SIZE+2, /*answer*/ ttl); + if (answer_type == RESOLVED_TYPE_IPV4) { + uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2)); + remap_event_helper(conn, addr); + } connection_mark_unattached_ap(conn, END_STREAM_REASON_DONE | END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); |