uint8_t **resp_msg_out,
size_t *resp_msg_len_out)
{
- int ret;
+ int ret = -1;
+ trn_extension_t *ext = NULL;
+
+ ssize_t len =
+ trn_extension_parse(&ext, param_request_msg, param_request_len);
+ if (len < 0) {
+ goto err;
+ }
/* Parse request. */
- ret = congestion_control_parse_ext_request(param_request_msg,
- param_request_len);
+ ret = congestion_control_parse_ext_request(ext);
if (ret < 0) {
goto err;
}
ret = 0;
err:
+ trn_extension_free(ext);
return ret;
}
size_t param_response_len,
circuit_params_t *params_out)
{
- int ret = congestion_control_parse_ext_response(param_response_msg,
- param_response_len,
- params_out);
+ int ret = -1;
+ trn_extension_t *ext = NULL;
+
+ ssize_t len =
+ trn_extension_parse(&ext, param_response_msg, param_response_len);
+ if (len < 0) {
+ goto err;
+ }
+
+ ret = congestion_control_parse_ext_response(ext,
+ params_out);
if (ret < 0) {
- return -1;
+ goto err;
}
/* If congestion control came back enabled, but we didn't ask for it
* new one.
*/
if (ret && !congestion_control_enabled()) {
- return -1;
+ goto err;
}
params_out->cc_enabled = ret;
- return 0;
+ err:
+ trn_extension_free(ext);
+ return ret;
}
/** Perform the final (client-side) step of a circuit-creation handshake of
* WARNING: Called from CPU worker! Must not access any global state.
*/
int
-congestion_control_parse_ext_request(const uint8_t *msg, const size_t msg_len)
+congestion_control_parse_ext_request(const trn_extension_t *ext)
{
ssize_t ret = 0;
- trn_extension_t *ext = NULL;
-
- /* Parse extension from payload. */
- ret = trn_extension_parse(&ext, msg, msg_len);
- if (ret < 0) {
- goto end;
- }
if (trn_extension_find(ext, TRUNNEL_EXT_TYPE_CC_FIELD_REQUEST) == NULL) {
/* No extension implies no support for congestion control. In this case, we
ret = 1;
}
- end:
- trn_extension_free(ext);
return (int)ret;
}
/** Return 1 if CC is enabled which also will set the SENDME increment into our
* params_out. Return 0 if CC is disabled. Else, return -1 on error. */
int
-congestion_control_parse_ext_response(const uint8_t *msg,
- const size_t msg_len,
+congestion_control_parse_ext_response(const trn_extension_t *ext,
circuit_params_t *params_out)
{
ssize_t ret = 0;
- trn_extension_t *ext = NULL;
const trn_extension_field_t *field = NULL;
trn_extension_field_cc_t *cc_field = NULL;
* violate this range should just not be used. */
#define MAX_SENDME_INC_NEGOTIATE_FACTOR 2
- /* Parse extension from payload. */
- ret = trn_extension_parse(&ext, msg, msg_len);
- if (ret < 0) {
- goto end;
- }
-
field = trn_extension_find(ext, TRUNNEL_EXT_TYPE_CC_FIELD_RESPONSE);
if (field == 0) {
}
end:
- trn_extension_free(ext);
trn_extension_field_cc_free(cc_field);
return (int)ret;
int congestion_control_build_ext_request(uint8_t **msg_out,
size_t *msg_len_out);
-int congestion_control_parse_ext_request(const uint8_t *msg,
- const size_t msg_len);
+struct trn_extension_st;
+int congestion_control_parse_ext_request(const struct trn_extension_st *ext);
int congestion_control_build_ext_response(const circuit_params_t *our_params,
const circuit_params_t *circ_params,
uint8_t **msg_out,
size_t *msg_len_out);
-int congestion_control_parse_ext_response(const uint8_t *msg,
- const size_t msg_len,
+int congestion_control_parse_ext_response(const struct trn_extension_st *ext,
circuit_params_t *params_out);
bool congestion_control_validate_sendme_increment(uint8_t sendme_inc);
char *congestion_control_get_control_port_fields(const origin_circuit_t *);