mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-01 08:03:31 +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;
|
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 */
|
/* Choose a circuit */
|
||||||
circuit_t * (*pick_active_circuit)(circuitmux_t *cmux,
|
circuit_t * (*pick_active_circuit)(circuitmux_t *cmux,
|
||||||
circuitmux_policy_data_t *pol_data);
|
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,
|
void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux,
|
||||||
channel_t *chan);
|
channel_t *chan);
|
||||||
|
|
||||||
|
/* Optional interchannel comparisons for scheduling */
|
||||||
|
int circuitmux_compare_muxes(circuitmux_t *cmux_1, circuitmux_t *cmux_2);
|
||||||
|
|
||||||
#endif /* TOR_CIRCUITMUX_H */
|
#endif /* TOR_CIRCUITMUX_H */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user