Loading src/or/circuitmux.c +48 −0 Original line number Diff line number Diff line Loading @@ -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; } } src/or/circuitmux.h +6 −0 Original line number Diff line number Diff line Loading @@ -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); }; /* Loading Loading @@ -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
src/or/circuitmux.c +48 −0 Original line number Diff line number Diff line Loading @@ -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; } }
src/or/circuitmux.h +6 −0 Original line number Diff line number Diff line Loading @@ -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); }; /* Loading Loading @@ -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 */