Tor 0.4.9.0-alpha-dev
Macros | Functions | Variables
relay.h File Reference

Header file for relay.c. More...

Go to the source code of this file.

Macros

#define CONTROL_CELL_ID   0
 
#define relay_send_command_from_edge(stream_id, circ, relay_command, payload, payload_len, cpath_layer)
 
#define packed_cell_free(cell)    FREE_AND_NULL(packed_cell_t, packed_cell_free_, (cell))
 
#define update_circuit_on_cmux(circ, direction)    update_circuit_on_cmux_((circ), (direction), SHORT_FILE__, __LINE__)
 

Functions

const char * relay_command_to_string (uint8_t command)
 
void relay_consensus_has_changed (const networkstatus_t *ns)
 
uint32_t relay_get_param_max_circuit_cell_queue_size (const networkstatus_t *ns)
 
int circuit_receive_relay_cell (cell_t *cell, circuit_t *circ, cell_direction_t cell_direction)
 
size_t cell_queues_get_total_allocation (void)
 
void relay_header_pack (uint8_t *dest, const relay_header_t *src)
 
void relay_header_unpack (relay_header_t *dest, const uint8_t *src)
 
int relay_send_command_from_edge_ (streamid_t stream_id, circuit_t *circ, uint8_t relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer, const char *filename, int lineno)
 
int connection_edge_send_command (edge_connection_t *fromconn, uint8_t relay_command, const char *payload, size_t payload_len)
 
int connection_edge_package_raw_inbuf (edge_connection_t *conn, int package_partial, int *max_cells)
 
void connection_edge_consider_sending_sendme (edge_connection_t *conn)
 
void circuit_reset_sendme_randomness (circuit_t *circ)
 
void dump_cell_pool_usage (int severity)
 
size_t packed_cell_mem_cost (void)
 
int have_been_under_memory_pressure (void)
 
void packed_cell_free_ (packed_cell_t *cell)
 
void cell_queue_init (cell_queue_t *queue)
 
void cell_queue_clear (cell_queue_t *queue)
 
void cell_queue_append (cell_queue_t *queue, packed_cell_t *cell)
 
void cell_queue_append_packed_copy (circuit_t *circ, cell_queue_t *queue, int exitward, const cell_t *cell, int wide_circ_ids, int use_stats)
 
int append_cell_to_circuit_queue (circuit_t *circ, channel_t *chan, cell_t *cell, cell_direction_t direction, streamid_t fromstream)
 
void destroy_cell_queue_init (destroy_cell_queue_t *queue)
 
void destroy_cell_queue_clear (destroy_cell_queue_t *queue)
 
void destroy_cell_queue_append (destroy_cell_queue_t *queue, circid_t circid, uint8_t reason)
 
void channel_unlink_all_circuits (channel_t *chan, smartlist_t *detached_out)
 
int channel_flush_from_first_active_circuit (channel_t *chan, int max)
 
int circuit_package_relay_cell (cell_t *cell, circuit_t *circ, cell_direction_t cell_direction, crypt_path_t *layer_hint, streamid_t on_stream, const char *filename, int lineno)
 
void update_circuit_on_cmux_ (circuit_t *circ, cell_direction_t direction, const char *file, int lineno)
 
int append_address_to_payload (uint8_t *payload_out, const tor_addr_t *addr)
 
const uint8_t * decode_address_from_payload (tor_addr_t *addr_out, const uint8_t *payload, int payload_len)
 
void circuit_clear_cell_queue (circuit_t *circ, channel_t *chan)
 
circid_t packed_cell_get_circid (const packed_cell_t *cell, int wide_circ_ids)
 
uint8_t packed_cell_get_command (const packed_cell_t *cell, int wide_circ_ids)
 

Variables

uint64_t stats_n_relay_cells_relayed
 
uint64_t stats_n_relay_cells_delivered
 
uint64_t stats_n_circ_max_cell_reached
 
uint64_t stats_n_circ_max_cell_outq_reached
 
uint64_t stats_n_data_cells_packaged
 
uint64_t stats_n_data_bytes_packaged
 
uint64_t stats_n_data_cells_received
 
uint64_t stats_n_data_bytes_received
 
uint64_t oom_stats_n_bytes_removed_dns
 
uint64_t oom_stats_n_bytes_removed_cell
 
uint64_t oom_stats_n_bytes_removed_geoip
 
uint64_t oom_stats_n_bytes_removed_hsdir
 

Detailed Description

Header file for relay.c.

Definition in file relay.h.

Macro Definition Documentation

◆ CONTROL_CELL_ID

#define CONTROL_CELL_ID   0

Definition at line 37 of file relay.h.

◆ packed_cell_free

#define packed_cell_free (   cell)     FREE_AND_NULL(packed_cell_t, packed_cell_free_, (cell))

Definition at line 69 of file relay.h.

◆ relay_send_command_from_edge

#define relay_send_command_from_edge (   stream_id,
  circ,
  relay_command,
  payload,
  payload_len,
  cpath_layer 
)
Value:
relay_send_command_from_edge_((stream_id), (circ), (relay_command), \
(payload), (payload_len), (cpath_layer), \
__FILE__, __LINE__)
int relay_send_command_from_edge_(streamid_t stream_id, circuit_t *circ, uint8_t relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer, const char *filename, int lineno)
Definition: relay.c:635

Definition at line 38 of file relay.h.

◆ update_circuit_on_cmux

#define update_circuit_on_cmux (   circ,
  direction 
)     update_circuit_on_cmux_((circ), (direction), SHORT_FILE__, __LINE__)

Definition at line 99 of file relay.h.

Function Documentation

◆ append_address_to_payload()

int append_address_to_payload ( uint8_t *  payload_out,
const tor_addr_t addr 
)

Append an encoded value of addr to payload_out, which must have at least 18 bytes of free space. The encoding is, as specified in tor-spec.txt: RESOLVED_TYPE_IPV4 or RESOLVED_TYPE_IPV6 [1 byte] LENGTH [1 byte] ADDRESS [length bytes] Return the number of bytes added, or -1 on error

Definition at line 3497 of file relay.c.

◆ append_cell_to_circuit_queue()

int append_cell_to_circuit_queue ( circuit_t circ,
channel_t chan,
cell_t cell,
cell_direction_t  direction,
streamid_t  fromstream 
)

Add cell to the queue of circ writing to chan transmitting in direction.

The given cell is copied onto the circuit queue so the caller must cleanup the memory.

This function is part of the fast path.

Return 1 if the cell was successfully sent. Return 0 if the cell can not be sent. The caller MUST NOT close the circuit. Return -1 indicating an error and that the caller should mark the circuit for close.

Definition at line 3406 of file relay.c.

◆ cell_queue_append()

void cell_queue_append ( cell_queue_t queue,
packed_cell_t cell 
)

Append cell to the end of queue.

Definition at line 2760 of file relay.c.

Referenced by cell_queue_append_packed_copy().

◆ cell_queue_append_packed_copy()

void cell_queue_append_packed_copy ( circuit_t circ,
cell_queue_t queue,
int  exitward,
const cell_t cell,
int  wide_circ_ids,
int  use_stats 
)

Append a newly allocated copy of cell to the end of the exitward (or app-ward) queue of circ. If use_stats is true, record statistics about the cell.

Definition at line 2771 of file relay.c.

◆ cell_queue_clear()

void cell_queue_clear ( cell_queue_t queue)

Remove and free every cell in queue.

Definition at line 2795 of file relay.c.

Referenced by circuit_clear_cell_queue().

◆ cell_queue_init()

void cell_queue_init ( cell_queue_t queue)

Initialize queue as an empty cell queue.

Definition at line 2787 of file relay.c.

Referenced by init_circuit_base().

◆ cell_queues_get_total_allocation()

size_t cell_queues_get_total_allocation ( void  )

Definition at line 2895 of file relay.c.

◆ channel_flush_from_first_active_circuit()

int channel_flush_from_first_active_circuit ( channel_t chan,
int  max 
)

Pull as many cells as possible (but no more than max) from the queue of the first active circuit on chan, and write them to chan->outbuf. Return the number of cells written. Advance the active circuit pointer to the next active circuit in the ring.

Definition at line 3146 of file relay.c.

◆ channel_unlink_all_circuits()

void channel_unlink_all_circuits ( channel_t chan,
smartlist_t circuits_out 
)

Remove all circuits from the cmux on chan.

If circuits_out is non-NULL, add all detached circuits to circuits_out.

Definition at line 3038 of file relay.c.

Referenced by circuit_unlink_all_from_channel().

◆ circuit_clear_cell_queue()

void circuit_clear_cell_queue ( circuit_t circ,
channel_t chan 
)

Remove all the cells queued on circ for chan.

Definition at line 3551 of file relay.c.

Referenced by circuit_about_to_free_atexit().

◆ circuit_package_relay_cell()

int circuit_package_relay_cell ( cell_t cell,
circuit_t circ,
cell_direction_t  cell_direction,
crypt_path_t layer_hint,
streamid_t  on_stream,
const char *  filename,
int  lineno 
)

Package a relay cell from an edge:

  • Encrypt it to the right layer
  • Append it to the appropriate cell_queue on circ.

Return 1 if the cell was successfully sent as in queued on the circuit. Return 0 if the cell needs to be dropped as in ignored. Return -1 on error for which the circuit should be marked for close.

Definition at line 385 of file relay.c.

◆ circuit_receive_relay_cell()

int circuit_receive_relay_cell ( cell_t cell,
circuit_t circ,
cell_direction_t  cell_direction 
)

Receive a relay cell:

  • Crypt it (encrypt if headed toward the origin or if we are the origin; decrypt if we're headed toward the exit).
  • Check if recognized (if exitward).
  • If recognized and the digest checks out, then find if there's a stream that the cell is intended for, and deliver it to the right connection_edge.
  • If not recognized, then we need to relay it: append it to the appropriate cell_queue on circ.

Return -reason on failure.

Definition at line 233 of file relay.c.

◆ circuit_reset_sendme_randomness()

void circuit_reset_sendme_randomness ( circuit_t circ)

Called when initializing a circuit, or when we have reached the end of the window in which we need to send some randomness so that incoming sendme cells will be unpredictable. Resets the flags and picks a new window.

Definition at line 2252 of file relay.c.

Referenced by init_circuit_base().

◆ connection_edge_package_raw_inbuf()

int connection_edge_package_raw_inbuf ( edge_connection_t conn,
int  package_partial,
int *  max_cells 
)

If conn has an entire relay payload of bytes on its inbuf (or package_partial is true), and the appropriate package windows aren't empty, grab a cell and send it down the circuit.

If *max_cells is given, package no more than max_cells. Decrement *max_cells by the number of cells packaged.

Return -1 (and send a RELAY_COMMAND_END cell if necessary) if conn should be marked for close, else return 0.

Definition at line 2336 of file relay.c.

◆ connection_edge_send_command()

int connection_edge_send_command ( edge_connection_t fromconn,
uint8_t  relay_command,
const char *  payload,
size_t  payload_len 
)

Make a relay cell out of relay_command and payload, and send it onto the open circuit circ. fromconn is the stream that's sending the relay cell, or NULL if it's a control cell. cpath_layer is NULL for OR->OP cells, or the destination hop for OP->OR cells.

If you can't send the cell, mark the circuit for close and return -1. Else return 0.

Definition at line 801 of file relay.c.

◆ decode_address_from_payload()

const uint8_t * decode_address_from_payload ( tor_addr_t addr_out,
const uint8_t *  payload,
int  payload_len 
)

Given payload_len bytes at payload, starting with an address encoded as by append_address_to_payload(), try to decode the address into *addr_out. Return the next byte in the payload after the address on success, or NULL on failure.

Definition at line 3523 of file relay.c.

◆ destroy_cell_queue_append()

void destroy_cell_queue_append ( destroy_cell_queue_t queue,
circid_t  circid,
uint8_t  reason 
)

Append a destroy cell for circid to queue.

Definition at line 2855 of file relay.c.

◆ destroy_cell_queue_clear()

void destroy_cell_queue_clear ( destroy_cell_queue_t queue)

Remove and free every cell in queue.

Definition at line 2829 of file relay.c.

◆ destroy_cell_queue_init()

void destroy_cell_queue_init ( destroy_cell_queue_t queue)

Initialize queue as an empty cell queue.

Definition at line 2821 of file relay.c.

◆ dump_cell_pool_usage()

void dump_cell_pool_usage ( int  severity)

Log current statistics for cell pool allocation at log level severity.

Definition at line 2733 of file relay.c.

Referenced by dumpmemusage().

◆ have_been_under_memory_pressure()

int have_been_under_memory_pressure ( void  )

Return true if we've been under memory pressure in the last MEMORY_PRESSURE_INTERVAL seconds.

Definition at line 2982 of file relay.c.

◆ packed_cell_free_()

void packed_cell_free_ ( packed_cell_t cell)

Return a packed cell used outside by channel_t lower layer

Definition at line 2723 of file relay.c.

◆ packed_cell_get_circid()

circid_t packed_cell_get_circid ( const packed_cell_t cell,
int  wide_circ_ids 
)

Extract the circuit ID from a packed cell.

Definition at line 3132 of file relay.c.

◆ packed_cell_get_command()

uint8_t packed_cell_get_command ( const packed_cell_t cell,
int  wide_circ_ids 
)

Extract the command from a packed cell.

Definition at line 3121 of file relay.c.

Referenced by write_packed_cell().

◆ packed_cell_mem_cost()

size_t packed_cell_mem_cost ( void  )

Return the total number of bytes used for each packed_cell in a queue. Approximate.

Definition at line 2888 of file relay.c.

◆ relay_command_to_string()

const char * relay_command_to_string ( uint8_t  command)

Convert the relay command into a human-readable string.

Definition at line 522 of file relay.c.

Referenced by fill_single_stream_value().

◆ relay_consensus_has_changed()

void relay_consensus_has_changed ( const networkstatus_t ns)

Definition at line 3382 of file relay.c.

◆ relay_header_pack()

void relay_header_pack ( uint8_t *  dest,
const relay_header_t src 
)

Pack the relay_header_t host-order structure src into network-order in the buffer dest. See tor-spec.txt for details about the wire format.

Definition at line 498 of file relay.c.

Referenced by relay_set_digest().

◆ relay_header_unpack()

void relay_header_unpack ( relay_header_t dest,
const uint8_t *  src 
)

Unpack the network-order buffer src into a host-order relay_header_t structure dest.

Definition at line 511 of file relay.c.

Referenced by connection_exit_begin_conn(), connection_exit_begin_resolve(), pathbias_check_probe_response(), pathbias_count_valid_cells(), relay_lookup_conn(), and relay_set_digest().

◆ relay_send_command_from_edge_()

int relay_send_command_from_edge_ ( streamid_t  stream_id,
circuit_t orig_circ,
uint8_t  relay_command,
const char *  payload,
size_t  payload_len,
crypt_path_t cpath_layer,
const char *  filename,
int  lineno 
)

Make a relay cell out of relay_command and payload, and send it onto the open circuit circ. stream_id is the ID on circ for the stream that's sending the relay cell, or 0 if it's a control cell. cpath_layer is NULL for OR->OP cells, or the destination hop for OP->OR cells.

If you can't send the cell, mark the circuit for close and return -1. Else return 0.

Definition at line 635 of file relay.c.

◆ update_circuit_on_cmux_()

void update_circuit_on_cmux_ ( circuit_t circ,
cell_direction_t  direction,
const char *  file,
int  lineno 
)

Update the number of cells available on the circuit's n_chan or p_chan's circuit mux.

Definition at line 2993 of file relay.c.

Variable Documentation

◆ oom_stats_n_bytes_removed_cell

uint64_t oom_stats_n_bytes_removed_cell
extern

Definition at line 2908 of file relay.c.

◆ oom_stats_n_bytes_removed_dns

uint64_t oom_stats_n_bytes_removed_dns
extern

Statistics on how many bytes were removed by the OOM per type.

Definition at line 2907 of file relay.c.

◆ oom_stats_n_bytes_removed_geoip

uint64_t oom_stats_n_bytes_removed_geoip
extern

Definition at line 2909 of file relay.c.

◆ oom_stats_n_bytes_removed_hsdir

uint64_t oom_stats_n_bytes_removed_hsdir
extern

Definition at line 2910 of file relay.c.

◆ stats_n_circ_max_cell_outq_reached

uint64_t stats_n_circ_max_cell_outq_reached
extern

Definition at line 142 of file relay.c.

◆ stats_n_circ_max_cell_reached

uint64_t stats_n_circ_max_cell_reached
extern

Stats: how many circuits have we closed due to the cell queue limit being reached (see append_cell_to_circuit_queue())

Definition at line 141 of file relay.c.

Referenced by fill_dos_values().

◆ stats_n_data_bytes_packaged

uint64_t stats_n_data_bytes_packaged
extern

How many bytes of data have we put in relay_data cells have we built, ever? This would be RELAY_PAYLOAD_SIZE*stats_n_data_cells_packaged if every relay cell we ever sent were completely full of data.

Definition at line 2238 of file relay.c.

◆ stats_n_data_bytes_received

uint64_t stats_n_data_bytes_received
extern

How many bytes of data have we received relay_data cells, ever? This would be RELAY_PAYLOAD_SIZE*stats_n_data_cells_packaged if every relay cell we ever received were completely full of data.

Definition at line 2244 of file relay.c.

◆ stats_n_data_cells_packaged

uint64_t stats_n_data_cells_packaged
extern

How many relay_data cells have we built, ever?

Definition at line 2234 of file relay.c.

◆ stats_n_data_cells_received

uint64_t stats_n_data_cells_received
extern

How many relay_data cells have we received, ever?

Definition at line 2240 of file relay.c.

◆ stats_n_relay_cells_delivered

uint64_t stats_n_relay_cells_delivered
extern

Stats: how many relay cells have been delivered to streams at this hop?

Definition at line 138 of file relay.c.

◆ stats_n_relay_cells_relayed

uint64_t stats_n_relay_cells_relayed
extern

Stats: how many relay cells have originated at this hop, or have been relayed onward (not recognized at this hop)?

Definition at line 134 of file relay.c.