Tor
0.4.7.0-alpha-dev
|
Circuit mux/cell selection abstraction. More...
#include "core/or/or.h"
#include "core/or/channel.h"
#include "core/or/circuitlist.h"
#include "core/or/circuitmux.h"
#include "core/or/relay.h"
#include "core/or/or_circuit_st.h"
#include "lib/crypt_ops/crypto_util.h"
Go to the source code of this file.
Data Structures | |
struct | circuit_muxinfo_t |
struct | chanid_circid_muxinfo_t |
Functions | |
static int | chanid_circid_entries_eq (chanid_circid_muxinfo_t *a, chanid_circid_muxinfo_t *b) |
static unsigned int | chanid_circid_entry_hash (chanid_circid_muxinfo_t *a) |
static chanid_circid_muxinfo_t * | circuitmux_find_map_entry (circuitmux_t *cmux, circuit_t *circ) |
static void | circuitmux_make_circuit_active (circuitmux_t *cmux, circuit_t *circ) |
static void | circuitmux_make_circuit_inactive (circuitmux_t *cmux, circuit_t *circ) |
HT_PROTOTYPE (chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, chanid_circid_entry_hash, chanid_circid_entries_eq) | |
HT_GENERATE2 (chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, chanid_circid_entry_hash, chanid_circid_entries_eq, 0.6, tor_reallocarray_, tor_free_) | |
circuitmux_t * | circuitmux_alloc (void) |
void | circuitmux_detach_all_circuits (circuitmux_t *cmux, smartlist_t *detached_out) |
void | circuitmux_mark_destroyed_circids_usable (circuitmux_t *cmux, channel_t *chan) |
void | circuitmux_free_ (circuitmux_t *cmux) |
void | circuitmux_clear_policy (circuitmux_t *cmux) |
const circuitmux_policy_t * | circuitmux_get_policy (circuitmux_t *cmux) |
void | circuitmux_set_policy (circuitmux_t *cmux, const circuitmux_policy_t *pol) |
cell_direction_t | circuitmux_attached_circuit_direction (circuitmux_t *cmux, circuit_t *circ) |
int | circuitmux_is_circuit_attached (circuitmux_t *cmux, circuit_t *circ) |
int | circuitmux_is_circuit_active (circuitmux_t *cmux, circuit_t *circ) |
unsigned int | circuitmux_num_cells_for_circuit (circuitmux_t *cmux, circuit_t *circ) |
unsigned int | circuitmux_num_cells (circuitmux_t *cmux) |
unsigned int | circuitmux_num_active_circuits (circuitmux_t *cmux) |
unsigned int | circuitmux_num_circuits (circuitmux_t *cmux) |
void | circuitmux_attach_circuit (circuitmux_t *cmux, circuit_t *circ, cell_direction_t direction) |
void | circuitmux_detach_circuit (circuitmux_t *cmux, circuit_t *circ) |
void | circuitmux_clear_num_cells (circuitmux_t *cmux, circuit_t *circ) |
void | circuitmux_set_num_cells (circuitmux_t *cmux, circuit_t *circ, unsigned int n_cells) |
circuit_t * | circuitmux_get_first_active_circuit (circuitmux_t *cmux, destroy_cell_queue_t **destroy_queue_out) |
void | circuitmux_notify_xmit_cells (circuitmux_t *cmux, circuit_t *circ, unsigned int n_cells) |
void | circuitmux_notify_xmit_destroy (circuitmux_t *cmux) |
void | circuitmux_append_destroy_cell (channel_t *chan, circuitmux_t *cmux, circid_t circ_id, uint8_t reason) |
int64_t | circuitmux_count_queued_destroy_cells (const channel_t *chan, const circuitmux_t *cmux) |
int | circuitmux_compare_muxes (circuitmux_t *cmux_1, circuitmux_t *cmux_2) |
Variables | |
static int64_t | global_destroy_ctr = 0 |
Circuit mux/cell selection abstraction.
A circuitmux is responsible for MUltipleXing all of the circuits that are writing on a single channel. It keeps track of which of these circuits has something to write (aka, "active" circuits), and which one should write next. A circuitmux corresponds 1:1 with a channel.
There can be different implementations of the circuitmux's rules (which decide which circuit is next to write).
A circuitmux exposes three distinct interfaces to other components:
To channels, which each have a circuitmux_t, the supported operations (invoked from relay.c) are:
circuitmux_get_first_active_circuit():
Pick one of the circuitmux's active circuits to send cells from.
circuitmux_notify_xmit_cells():
Notify the circuitmux that cells have been sent on a circuit.
To circuits, the exposed operations are:
Attach a circuit to the circuitmux; this will allocate any policy- specific data wanted for this circuit and add it to the active circuits list if it has queued cells.
Detach a circuit from the circuitmux, freeing associated structures.
Clear the circuitmux's cell counter for this circuit.
Set the circuitmux's cell counter for this circuit. One of circuitmuc_clear_num_cells() or circuitmux_set_num_cells() MUST be called when the number of cells queued on a circuit changes.
See circuitmux.h for the circuitmux_policy_t data structure, which contains a table of function pointers implementing a circuit selection policy, and circuitmux_ewma.c for an example of a circuitmux policy. Circuitmux policies can be manipulated with:
Return the current policy for a circuitmux_t, if any.
Remove a policy installed on a circuitmux_t, freeing all associated data. The circuitmux will revert to the built-in round-robin behavior.
Install a policy on a circuitmux_t; the appropriate callbacks will be made to attach all existing circuits to the new policy.
Definition in file circuitmux.c.
|
inlinestatic |
Helper for chanid_circid_cell_count_map_t hash table: compare the channel ID and circuit ID for a and b, and return less than, equal to, or greater than zero appropriately.
Definition at line 159 of file circuitmux.c.
|
inlinestatic |
Helper: return a hash based on circuit ID and channel ID in a.
Definition at line 170 of file circuitmux.c.
circuitmux_t* circuitmux_alloc | ( | void | ) |
Allocate a new circuitmux_t
Definition at line 193 of file circuitmux.c.
void circuitmux_attach_circuit | ( | circuitmux_t * | cmux, |
circuit_t * | circ, | ||
cell_direction_t | direction | ||
) |
Attach a circuit to a circuitmux, for the specified direction.
Definition at line 730 of file circuitmux.c.
cell_direction_t circuitmux_attached_circuit_direction | ( | circuitmux_t * | cmux, |
circuit_t * | circ | ||
) |
Query the direction of an attached circuit
Definition at line 548 of file circuitmux.c.
void circuitmux_clear_num_cells | ( | circuitmux_t * | cmux, |
circuit_t * | circ | ||
) |
Clear the cell counter for a circuit on a circuitmux
Definition at line 987 of file circuitmux.c.
void circuitmux_clear_policy | ( | circuitmux_t * | cmux | ) |
Remove any policy installed on cmux; all policy data will be freed and cmux behavior will revert to the built-in round-robin active_circuits mechanism.
Definition at line 401 of file circuitmux.c.
int circuitmux_compare_muxes | ( | circuitmux_t * | cmux_1, |
circuitmux_t * | cmux_2 | ||
) |
Compare cmuxes to see which is more preferred; return < 0 if cmux_1 has higher priority (i.e., cmux_1 < cmux_2 in the scheduler's sort order), > 0 if cmux_2 has higher priority, or 0 if they are equally preferred.
If the cmuxes have different cmux policies or the policy does not support the cmp_cmux method, return 0.
Definition at line 1254 of file circuitmux.c.
Referenced by scheduler_compare_channels().
void circuitmux_detach_all_circuits | ( | circuitmux_t * | cmux, |
smartlist_t * | detached_out | ||
) |
Detach all circuits from a circuitmux (use before circuitmux_free())
If detached_out is non-NULL, add every detached circuit_t to detached_out.
Definition at line 213 of file circuitmux.c.
Referenced by channel_unlink_all_circuits().
void circuitmux_detach_circuit | ( | circuitmux_t * | cmux, |
circuit_t * | circ | ||
) |
Detach a circuit from a circuitmux and update all counters as needed; no-op if not attached.
Definition at line 851 of file circuitmux.c.
Referenced by circuit_about_to_free_atexit().
|
static |
Find an entry in the cmux's map for this circuit or return NULL if there is none.
Definition at line 571 of file circuitmux.c.
Referenced by circuitmux_attached_circuit_direction(), circuitmux_is_circuit_active(), circuitmux_is_circuit_attached(), circuitmux_make_circuit_active(), circuitmux_make_circuit_inactive(), circuitmux_notify_xmit_cells(), circuitmux_num_cells_for_circuit(), and circuitmux_set_num_cells().
void circuitmux_free_ | ( | circuitmux_t * | cmux | ) |
Free a circuitmux_t; the circuits must be detached first with circuitmux_detach_all_circuits().
Definition at line 337 of file circuitmux.c.
circuit_t* circuitmux_get_first_active_circuit | ( | circuitmux_t * | cmux, |
destroy_cell_queue_t ** | destroy_queue_out | ||
) |
Pick a circuit to send from, using the active circuits list or a circuitmux policy if one is available. This is called from channel.c.
If we would rather send a destroy cell, return NULL and set *destroy_queue_out to the destroy queue.
If we have nothing to send, set *destroy_queue_out to NULL and return NULL.
Definition at line 1060 of file circuitmux.c.
Referenced by channel_flush_from_first_active_circuit().
const circuitmux_policy_t* circuitmux_get_policy | ( | circuitmux_t * | cmux | ) |
Return the policy currently installed on a circuitmux_t
Definition at line 414 of file circuitmux.c.
Referenced by scheduler_compare_channels().
int circuitmux_is_circuit_active | ( | circuitmux_t * | cmux, |
circuit_t * | circ | ||
) |
Query whether a circuit is active on a circuitmux
Definition at line 641 of file circuitmux.c.
int circuitmux_is_circuit_attached | ( | circuitmux_t * | cmux, |
circuit_t * | circ | ||
) |
Query whether a circuit is attached to a circuitmux
Definition at line 626 of file circuitmux.c.
Referenced by circuit_clear_cell_queue(), and update_circuit_on_cmux_().
|
static |
Make a circuit active; update active list and policy-specific info, but we don't mess with the counters or hash table here.
Definition at line 940 of file circuitmux.c.
Referenced by circuitmux_set_num_cells().
|
static |
Make a circuit inactive; update active list and policy-specific info, but we don't mess with the counters or hash table here.
Definition at line 964 of file circuitmux.c.
Referenced by circuitmux_detach_circuit(), circuitmux_notify_xmit_cells(), and circuitmux_set_num_cells().
void circuitmux_mark_destroyed_circids_usable | ( | circuitmux_t * | cmux, |
channel_t * | chan | ||
) |
Reclaim all circuit IDs currently marked as unusable on chan because of pending destroy cells in cmux.
This function must be called AFTER circuits are unlinked from the (channel, circuid-id) map with circuit_unlink_all_from_channel(), but before calling circuitmux_free().
Definition at line 323 of file circuitmux.c.
void circuitmux_notify_xmit_cells | ( | circuitmux_t * | cmux, |
circuit_t * | circ, | ||
unsigned int | n_cells | ||
) |
Notify the circuitmux that cells have been sent on a circuit; this is called from channel.c.
Definition at line 1103 of file circuitmux.c.
void circuitmux_notify_xmit_destroy | ( | circuitmux_t * | cmux | ) |
Notify the circuitmux that a destroy was sent, so we can update the counter.
Definition at line 1163 of file circuitmux.c.
Referenced by channel_flush_from_first_active_circuit().
unsigned int circuitmux_num_active_circuits | ( | circuitmux_t * | cmux | ) |
Query total number of circuits active on a circuitmux
Definition at line 701 of file circuitmux.c.
unsigned int circuitmux_num_cells | ( | circuitmux_t * | cmux | ) |
Query total number of available cells on a circuitmux
Definition at line 689 of file circuitmux.c.
Referenced by channel_more_to_flush().
unsigned int circuitmux_num_cells_for_circuit | ( | circuitmux_t * | cmux, |
circuit_t * | circ | ||
) |
Query number of available cells for a circuit on a circuitmux
Definition at line 665 of file circuitmux.c.
unsigned int circuitmux_num_circuits | ( | circuitmux_t * | cmux | ) |
Query total number of circuits attached to a circuitmux
Definition at line 713 of file circuitmux.c.
void circuitmux_set_num_cells | ( | circuitmux_t * | cmux, |
circuit_t * | circ, | ||
unsigned int | n_cells | ||
) |
Set the cell counter for a circuit on a circuitmux
Definition at line 998 of file circuitmux.c.
Referenced by circuitmux_clear_num_cells().
void circuitmux_set_policy | ( | circuitmux_t * | cmux, |
const circuitmux_policy_t * | pol | ||
) |
Set policy; allocate for new policy, detach all circuits from old policy if any, attach them to new policy, and free old policy data.
Definition at line 427 of file circuitmux.c.
Referenced by circuitmux_clear_policy().
|
static |
Count the destroy balance to debug destroy queue logic
Definition at line 148 of file circuitmux.c.
Referenced by circuitmux_free_(), and circuitmux_notify_xmit_destroy().