mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 13:43:47 +01:00
137 lines
5.0 KiB
C
137 lines
5.0 KiB
C
/* * Copyright (c) 2012-2013, The Tor Project, Inc. */
|
|
/* See LICENSE for licensing information */
|
|
|
|
/**
|
|
* \file circuitmux.h
|
|
* \brief Header file for circuitmux.c
|
|
**/
|
|
|
|
#ifndef TOR_CIRCUITMUX_H
|
|
#define TOR_CIRCUITMUX_H
|
|
|
|
#include "or.h"
|
|
|
|
typedef struct circuitmux_policy_s circuitmux_policy_t;
|
|
typedef struct circuitmux_policy_data_s circuitmux_policy_data_t;
|
|
typedef struct circuitmux_policy_circ_data_s circuitmux_policy_circ_data_t;
|
|
|
|
struct circuitmux_policy_s {
|
|
/* Allocate cmux-wide policy-specific data */
|
|
circuitmux_policy_data_t * (*alloc_cmux_data)(circuitmux_t *cmux);
|
|
/* Free cmux-wide policy-specific data */
|
|
void (*free_cmux_data)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data);
|
|
/* Allocate circuit policy-specific data for a newly attached circuit */
|
|
circuitmux_policy_circ_data_t *
|
|
(*alloc_circ_data)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data,
|
|
circuit_t *circ,
|
|
cell_direction_t direction,
|
|
unsigned int cell_count);
|
|
/* Free circuit policy-specific data */
|
|
void (*free_circ_data)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data,
|
|
circuit_t *circ,
|
|
circuitmux_policy_circ_data_t *pol_circ_data);
|
|
/* Notify that a circuit has become active/inactive */
|
|
void (*notify_circ_active)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data,
|
|
circuit_t *circ,
|
|
circuitmux_policy_circ_data_t *pol_circ_data);
|
|
void (*notify_circ_inactive)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data,
|
|
circuit_t *circ,
|
|
circuitmux_policy_circ_data_t *pol_circ_data);
|
|
/* Notify of arriving/transmitted cells on a circuit */
|
|
void (*notify_set_n_cells)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data,
|
|
circuit_t *circ,
|
|
circuitmux_policy_circ_data_t *pol_circ_data,
|
|
unsigned int n_cells);
|
|
void (*notify_xmit_cells)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data,
|
|
circuit_t *circ,
|
|
circuitmux_policy_circ_data_t *pol_circ_data,
|
|
unsigned int n_cells);
|
|
/* Choose a circuit */
|
|
circuit_t * (*pick_active_circuit)(circuitmux_t *cmux,
|
|
circuitmux_policy_data_t *pol_data);
|
|
};
|
|
|
|
/*
|
|
* Circuitmux policy implementations can subclass this to store circuitmux-
|
|
* wide data; it just has the magic number in the base struct.
|
|
*/
|
|
|
|
struct circuitmux_policy_data_s {
|
|
uint32_t magic;
|
|
};
|
|
|
|
/*
|
|
* Circuitmux policy implementations can subclass this to store circuit-
|
|
* specific data; it just has the magic number in the base struct.
|
|
*/
|
|
|
|
struct circuitmux_policy_circ_data_s {
|
|
uint32_t magic;
|
|
};
|
|
|
|
/*
|
|
* Upcast #defines for the above types
|
|
*/
|
|
|
|
/**
|
|
* Convert a circuitmux_policy_data_t subtype to a circuitmux_policy_data_t.
|
|
*/
|
|
|
|
#define TO_CMUX_POL_DATA(x) (&((x)->base_))
|
|
|
|
/**
|
|
* Convert a circuitmux_policy_circ_data_t subtype to a
|
|
* circuitmux_policy_circ_data_t.
|
|
*/
|
|
|
|
#define TO_CMUX_POL_CIRC_DATA(x) (&((x)->base_))
|
|
|
|
/* Consistency check */
|
|
void circuitmux_assert_okay(circuitmux_t *cmux);
|
|
|
|
/* Create/destroy */
|
|
circuitmux_t * circuitmux_alloc(void);
|
|
void circuitmux_detach_all_circuits(circuitmux_t *cmux);
|
|
void circuitmux_free(circuitmux_t *cmux);
|
|
|
|
/* Policy control */
|
|
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);
|
|
|
|
/* Status inquiries */
|
|
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_circuits(circuitmux_t *cmux);
|
|
unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux);
|
|
|
|
/* Channel interface */
|
|
circuit_t * circuitmux_get_first_active_circuit(circuitmux_t *cmux);
|
|
void circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ,
|
|
unsigned int n_cells);
|
|
|
|
/* Circuit interface */
|
|
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);
|
|
|
|
#endif /* TOR_CIRCUITMUX_H */
|
|
|