Macros | Functions
sendme.c File Reference
#include "core/or/or.h"
#include "app/config/config.h"
#include "core/crypto/relay_crypto.h"
#include "core/mainloop/connection.h"
#include "core/or/cell_st.h"
#include "core/or/crypt_path.h"
#include "core/or/circuitlist.h"
#include "core/or/circuituse.h"
#include "core/or/or_circuit_st.h"
#include "core/or/relay.h"
#include "core/or/sendme.h"
#include "feature/nodelist/networkstatus.h"
#include "lib/ctime/di_ops.h"
#include "trunnel/sendme_cell.h"

Go to the source code of this file.


STATIC int get_emit_min_version (void)
STATIC int get_accept_min_version (void)
static uint8_t * pop_first_cell_digest (const circuit_t *circ)
static bool v1_digest_matches (const uint8_t *circ_digest, const uint8_t *cell_digest)
static bool cell_v1_is_valid (const sendme_cell_t *cell, const uint8_t *circ_digest)
STATIC bool cell_version_can_be_handled (uint8_t cell_version)
STATIC bool sendme_is_valid (const circuit_t *circ, const uint8_t *cell_payload, size_t cell_payload_len)
STATIC ssize_t build_cell_payload_v1 (const uint8_t *cell_digest, uint8_t *payload)
static int send_circuit_level_sendme (circuit_t *circ, crypt_path_t *layer_hint, const uint8_t *cell_digest)
static void record_cell_digest_on_circ (circuit_t *circ, const uint8_t *sendme_digest)
static bool circuit_sendme_cell_is_next (int window)
void sendme_connection_edge_consider_sending (edge_connection_t *conn)
void sendme_circuit_consider_sending (circuit_t *circ, crypt_path_t *layer_hint)
int sendme_process_circuit_level (crypt_path_t *layer_hint, circuit_t *circ, const uint8_t *cell_payload, uint16_t cell_payload_len)
int sendme_process_stream_level (edge_connection_t *conn, circuit_t *circ, uint16_t cell_body_len)
int sendme_circuit_data_received (circuit_t *circ, crypt_path_t *layer_hint)
int sendme_stream_data_received (edge_connection_t *conn)
int sendme_note_circuit_data_packaged (circuit_t *circ, crypt_path_t *layer_hint)
int sendme_note_stream_data_packaged (edge_connection_t *conn)
void sendme_record_cell_digest_on_circ (circuit_t *circ, crypt_path_t *cpath)
void sendme_record_received_cell_digest (circuit_t *circ, crypt_path_t *cpath)
void sendme_record_sending_cell_digest (circuit_t *circ, crypt_path_t *cpath)

Detailed Description

Code that is related to SENDME cells both in terms of creating/parsing cells and handling the content.

Definition in file sendme.c.

Function Documentation

◆ circuit_sendme_cell_is_next()

static bool circuit_sendme_cell_is_next ( int  window)

Return true iff the next cell for the given cell window is expected to be a SENDME.

We are able to know that because the package or deliver window value minus one cell (the possible SENDME cell) should be a multiple of the increment window value.

Definition at line 341 of file sendme.c.


◆ sendme_circuit_consider_sending()

void sendme_circuit_consider_sending ( circuit_t circ,
crypt_path_t layer_hint 

Check if the deliver_window for circuit circ (at hop layer_hint if it's defined) is low enough that we should send a circuit-level sendme back down the circuit. If so, send enough sendmes that the window would be overfull if we sent any more.

Definition at line 418 of file sendme.c.

References CIRCWINDOW_INCREMENT, CIRCWINDOW_START, crypt_path_t::deliver_window, and circuit_t::deliver_window.

◆ sendme_connection_edge_consider_sending()

void sendme_connection_edge_consider_sending ( edge_connection_t conn)

Called when we've just received a relay data cell, when we've just finished flushing all bytes to stream conn, or when we've flushed some bytes to the stream conn.

If conn->outbuf is not too full, and our deliver window is low, send back a suitable number of stream-level sendme cells.

Definition at line 375 of file sendme.c.

References CONN_TYPE_AP, LD_APP, TO_CONN, and tor_assert().

Referenced by connection_edge_finished_flushing(), and connection_edge_flushed_some().