mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-09-21 13:34:59 +02:00
comment the functions in connection_or.c
svn:r1818
This commit is contained in:
parent
f1fc4ce22b
commit
fa3db976df
@ -11,12 +11,19 @@ static int connection_or_process_cells_from_inbuf(connection_t *conn);
|
|||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
||||||
|
/* Pack the cell_t host-order structure 'src' into network-order
|
||||||
|
* in the buffer 'dest'. See tor-spec.txt for details about the
|
||||||
|
* wire format.
|
||||||
|
*/
|
||||||
static void cell_pack(char *dest, const cell_t *src) {
|
static void cell_pack(char *dest, const cell_t *src) {
|
||||||
*(uint16_t*)dest = htons(src->circ_id);
|
*(uint16_t*)dest = htons(src->circ_id);
|
||||||
*(uint8_t*)(dest+2) = src->command;
|
*(uint8_t*)(dest+2) = src->command;
|
||||||
memcpy(dest+3, src->payload, CELL_PAYLOAD_SIZE);
|
memcpy(dest+3, src->payload, CELL_PAYLOAD_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Unpack the network-order buffer 'src' into a host-order
|
||||||
|
* cell_t structure 'dest'.
|
||||||
|
*/
|
||||||
static void cell_unpack(cell_t *dest, const char *src) {
|
static void cell_unpack(cell_t *dest, const char *src) {
|
||||||
dest->circ_id = ntohs(*(uint16_t*)(src));
|
dest->circ_id = ntohs(*(uint16_t*)(src));
|
||||||
dest->command = *(uint8_t*)(src+2);
|
dest->command = *(uint8_t*)(src+2);
|
||||||
@ -25,6 +32,11 @@ static void cell_unpack(cell_t *dest, const char *src) {
|
|||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
||||||
|
/* Handle any new bytes that have come in on connection 'conn'.
|
||||||
|
* If conn is in 'open' state, hand it to
|
||||||
|
* connection_or_process_cells_from_inbuf()
|
||||||
|
* (else do nothing).
|
||||||
|
*/
|
||||||
int connection_or_process_inbuf(connection_t *conn) {
|
int connection_or_process_inbuf(connection_t *conn) {
|
||||||
|
|
||||||
tor_assert(conn && conn->type == CONN_TYPE_OR);
|
tor_assert(conn && conn->type == CONN_TYPE_OR);
|
||||||
@ -40,6 +52,14 @@ int connection_or_process_inbuf(connection_t *conn) {
|
|||||||
return connection_or_process_cells_from_inbuf(conn);
|
return connection_or_process_cells_from_inbuf(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Connection 'conn' has finished writing and has no bytes left on
|
||||||
|
* its outbuf.
|
||||||
|
*
|
||||||
|
* If it's in state 'connecting', then take a look at the socket, and
|
||||||
|
* begin the tls handshake if the connect succeeded.
|
||||||
|
*
|
||||||
|
* Otherwise it's in state 'open': stop writing and return.
|
||||||
|
*/
|
||||||
int connection_or_finished_flushing(connection_t *conn) {
|
int connection_or_finished_flushing(connection_t *conn) {
|
||||||
int e, len=sizeof(e);
|
int e, len=sizeof(e);
|
||||||
|
|
||||||
@ -79,7 +99,13 @@ int connection_or_finished_flushing(connection_t *conn) {
|
|||||||
|
|
||||||
/*********************/
|
/*********************/
|
||||||
|
|
||||||
void connection_or_init_conn_from_router(connection_t *conn, routerinfo_t *router) {
|
/* Initialize conn to include all the relevant data from router.
|
||||||
|
* This function is called either from connection_or_connect(), if
|
||||||
|
* we initiated the connect, or from connection_tls_finish_handshake()
|
||||||
|
* if the other side initiated it.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
connection_or_init_conn_from_router(connection_t *conn, routerinfo_t *router) {
|
||||||
conn->addr = router->addr;
|
conn->addr = router->addr;
|
||||||
conn->port = router->or_port;
|
conn->port = router->or_port;
|
||||||
conn->receiver_bucket = conn->bandwidth = router->bandwidthburst;
|
conn->receiver_bucket = conn->bandwidth = router->bandwidthburst;
|
||||||
@ -89,6 +115,19 @@ void connection_or_init_conn_from_router(connection_t *conn, routerinfo_t *route
|
|||||||
conn->address = tor_strdup(router->address);
|
conn->address = tor_strdup(router->address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Launch a new OR connection to 'router'.
|
||||||
|
*
|
||||||
|
* If router is me, do nothing. If we're already connected to router,
|
||||||
|
* return that connection. If the connect is in progress, set conn's
|
||||||
|
* state to 'connecting' and return. If connect to router succeeds, call
|
||||||
|
* connection_tls_start_handshake() on it.
|
||||||
|
*
|
||||||
|
* This function is called from router_retry_connections() , for
|
||||||
|
* ORs connecting to ORs, and circuit_establish_circuit(), for
|
||||||
|
* OPs connecting to ORs.
|
||||||
|
*
|
||||||
|
* Return the launched conn, or NULL if it failed.
|
||||||
|
*/
|
||||||
connection_t *connection_or_connect(routerinfo_t *router) {
|
connection_t *connection_or_connect(routerinfo_t *router) {
|
||||||
connection_t *conn;
|
connection_t *conn;
|
||||||
|
|
||||||
@ -131,8 +170,14 @@ connection_t *connection_or_connect(routerinfo_t *router) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ********************************** */
|
/* Begin the tls handshake with conn. 'receiving' is 0 if we initiated
|
||||||
|
* the connection, else it's 1.
|
||||||
|
*
|
||||||
|
* Assign a new tls object to conn->tls, begin reading on conn, and pass
|
||||||
|
* conn to connection_tls_continue_handshake().
|
||||||
|
*
|
||||||
|
* Return -1 if conn is broken, else return 0.
|
||||||
|
*/
|
||||||
int connection_tls_start_handshake(connection_t *conn, int receiving) {
|
int connection_tls_start_handshake(connection_t *conn, int receiving) {
|
||||||
conn->state = OR_CONN_STATE_HANDSHAKING;
|
conn->state = OR_CONN_STATE_HANDSHAKING;
|
||||||
conn->tls = tor_tls_new(conn->s, receiving);
|
conn->tls = tor_tls_new(conn->s, receiving);
|
||||||
@ -148,6 +193,11 @@ int connection_tls_start_handshake(connection_t *conn, int receiving) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Move forward with ths tls handshake. If it finishes, hand
|
||||||
|
* conn to connection_tls_finish_handshake().
|
||||||
|
*
|
||||||
|
* Return -1 if conn is broken, else return 0.
|
||||||
|
*/
|
||||||
int connection_tls_continue_handshake(connection_t *conn) {
|
int connection_tls_continue_handshake(connection_t *conn) {
|
||||||
switch(tor_tls_handshake(conn->tls)) {
|
switch(tor_tls_handshake(conn->tls)) {
|
||||||
case TOR_TLS_ERROR:
|
case TOR_TLS_ERROR:
|
||||||
@ -167,13 +217,32 @@ int connection_tls_continue_handshake(connection_t *conn) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int connection_tls_finish_handshake(connection_t *conn) {
|
/* The tls handshake is finished.
|
||||||
|
*
|
||||||
|
* Make sure we are happy with the person we just handshaked with:
|
||||||
|
* If it's an OP (that is, it has no certificate), make sure I'm an OR.
|
||||||
|
* If it's an OR (is has a certificate), make sure it has a recognized
|
||||||
|
* nickname, its cert is signed by the identity key of that nickname;
|
||||||
|
* if I initiated the connection, make sure it's the right guy, and if
|
||||||
|
* he initiated the connection, make sure he's not already connected.
|
||||||
|
*
|
||||||
|
* If he initiated the conn, also initialize conn from the information
|
||||||
|
* in router.
|
||||||
|
*
|
||||||
|
* If either of us is an OP, set bandwidth to the default OP bandwidth.
|
||||||
|
*
|
||||||
|
* If all is successful and he's an OR, then call circuit_n_conn_open()
|
||||||
|
* to handle events that have been pending on the tls handshake
|
||||||
|
* completion, and set the directory to be dirty (only matters if I'm
|
||||||
|
* a dirserver).
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
connection_tls_finish_handshake(connection_t *conn) {
|
||||||
routerinfo_t *router;
|
routerinfo_t *router;
|
||||||
char nickname[MAX_NICKNAME_LEN+1];
|
char nickname[MAX_NICKNAME_LEN+1];
|
||||||
connection_t *c;
|
connection_t *c;
|
||||||
|
|
||||||
conn->state = OR_CONN_STATE_OPEN;
|
conn->state = OR_CONN_STATE_OPEN;
|
||||||
directory_set_dirty();
|
|
||||||
connection_watch_events(conn, POLLIN);
|
connection_watch_events(conn, POLLIN);
|
||||||
log_fn(LOG_DEBUG,"tls handshake done. verifying.");
|
log_fn(LOG_DEBUG,"tls handshake done. verifying.");
|
||||||
if (! tor_tls_peer_has_cert(conn->tls)) { /* It's an OP. */
|
if (! tor_tls_peer_has_cert(conn->tls)) { /* It's an OP. */
|
||||||
@ -225,14 +294,14 @@ static int connection_tls_finish_handshake(connection_t *conn) {
|
|||||||
if (!options.ORPort) { /* If I'm an OP... */
|
if (!options.ORPort) { /* If I'm an OP... */
|
||||||
conn->receiver_bucket = conn->bandwidth = DEFAULT_BANDWIDTH_OP;
|
conn->receiver_bucket = conn->bandwidth = DEFAULT_BANDWIDTH_OP;
|
||||||
}
|
}
|
||||||
|
directory_set_dirty();
|
||||||
circuit_n_conn_open(conn); /* send the pending creates, if any. */
|
circuit_n_conn_open(conn); /* send the pending creates, if any. */
|
||||||
/* Note the success */
|
/* Note the success */
|
||||||
rep_hist_note_connect_succeeded(nickname, time(NULL));
|
rep_hist_note_connect_succeeded(nickname, time(NULL));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ********************************** */
|
/* Pack 'cell' into wire-format, and write it onto conn's outbuf. */
|
||||||
|
|
||||||
void connection_or_write_cell_to_buf(const cell_t *cell, connection_t *conn) {
|
void connection_or_write_cell_to_buf(const cell_t *cell, connection_t *conn) {
|
||||||
char networkcell[CELL_NETWORK_SIZE];
|
char networkcell[CELL_NETWORK_SIZE];
|
||||||
char *n = networkcell;
|
char *n = networkcell;
|
||||||
@ -245,7 +314,10 @@ void connection_or_write_cell_to_buf(const cell_t *cell, connection_t *conn) {
|
|||||||
connection_write_to_buf(n, CELL_NETWORK_SIZE, conn);
|
connection_write_to_buf(n, CELL_NETWORK_SIZE, conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if there's a whole cell there, pull it off and process it. */
|
/* Process cells from conn's inbuf. Loop: while inbuf contains a cell, pull
|
||||||
|
* it off the inbuf, unpack it, and hand it to command_process_cell().
|
||||||
|
* Always return 0.
|
||||||
|
*/
|
||||||
static int connection_or_process_cells_from_inbuf(connection_t *conn) {
|
static int connection_or_process_cells_from_inbuf(connection_t *conn) {
|
||||||
char buf[CELL_NETWORK_SIZE];
|
char buf[CELL_NETWORK_SIZE];
|
||||||
cell_t cell;
|
cell_t cell;
|
||||||
|
Loading…
Reference in New Issue
Block a user