mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Add cmux support for inter-cmux comparisons
This commit is contained in:
parent
1275002a46
commit
9db596d2ef
@ -1951,3 +1951,51 @@ circuitmux_count_queued_destroy_cells(const channel_t *chan,
|
||||
return n_destroy_cells;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
int
|
||||
circuitmux_compare_muxes(circuitmux_t *cmux_1, circuitmux_t *cmux_2)
|
||||
{
|
||||
const circuitmux_policy_t *policy;
|
||||
|
||||
tor_assert(cmux_1);
|
||||
tor_assert(cmux_2);
|
||||
|
||||
if (cmux_1 == cmux_2) {
|
||||
/* Equivalent because they're the same cmux */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cmux_1->policy && cmux_2->policy) {
|
||||
if (cmux_1->policy == cmux_2->policy) {
|
||||
policy = cmux_1->policy;
|
||||
|
||||
if (policy->cmp_cmux) {
|
||||
/* Okay, we can compare! */
|
||||
return policy->cmp_cmux(cmux_1, cmux_1->policy_data,
|
||||
cmux_2, cmux_2->policy_data);
|
||||
} else {
|
||||
/*
|
||||
* Equivalent because the policy doesn't know how to compare between
|
||||
* muxes.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
/* Equivalent because they have different policies */
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
/* Equivalent because one or both are missing a policy */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,9 @@ struct circuitmux_policy_s {
|
||||
/* Choose a circuit */
|
||||
circuit_t * (*pick_active_circuit)(circuitmux_t *cmux,
|
||||
circuitmux_policy_data_t *pol_data);
|
||||
/* Optional: channel comparator for use by the scheduler */
|
||||
int (*cmp_cmux)(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1,
|
||||
circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2);
|
||||
};
|
||||
|
||||
/*
|
||||
@ -148,5 +151,8 @@ void circuitmux_append_destroy_cell(channel_t *chan,
|
||||
void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux,
|
||||
channel_t *chan);
|
||||
|
||||
/* Optional interchannel comparisons for scheduling */
|
||||
int circuitmux_compare_muxes(circuitmux_t *cmux_1, circuitmux_t *cmux_2);
|
||||
|
||||
#endif /* TOR_CIRCUITMUX_H */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user