|
@@ -274,13 +274,31 @@ rend_client_introduction_acked(origin_circuit_t *circ,
|
|
|
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
|
|
|
return -1;
|
|
|
}
|
|
|
- log_info(LD_REND,
|
|
|
- "Got nack for %s from %s. Re-extending circ %d, "
|
|
|
- "this time to %s.",
|
|
|
- escaped_safe_str(circ->rend_data->onion_address),
|
|
|
- circ->build_state->chosen_exit->nickname, circ->_base.n_circ_id,
|
|
|
- extend_info->nickname);
|
|
|
- result = circuit_extend_to_new_exit(circ, extend_info);
|
|
|
+ if (circ->remaining_relay_early_cells) {
|
|
|
+ log_info(LD_REND,
|
|
|
+ "Got nack for %s from %s. Re-extending circ %d, "
|
|
|
+ "this time to %s.",
|
|
|
+ escaped_safe_str(circ->rend_data->onion_address),
|
|
|
+ circ->build_state->chosen_exit->nickname,
|
|
|
+ circ->_base.n_circ_id, extend_info->nickname);
|
|
|
+ result = circuit_extend_to_new_exit(circ, extend_info);
|
|
|
+ } else {
|
|
|
+ log_info(LD_REND,
|
|
|
+ "Got nack for %s from %s. Building a new introduction "
|
|
|
+ "circuit, this time to %s.",
|
|
|
+ escaped_safe_str(circ->rend_data->onion_address),
|
|
|
+ circ->build_state->chosen_exit->nickname,
|
|
|
+ extend_info->nickname);
|
|
|
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
|
|
|
+ if (!circuit_launch_by_extend_info(CIRCUIT_PURPOSE_C_INTRODUCING,
|
|
|
+ extend_info,
|
|
|
+ CIRCLAUNCH_IS_INTERNAL)) {
|
|
|
+ log_warn(LD_REND, "Building introduction circuit failed.");
|
|
|
+ result = -1;
|
|
|
+ } else {
|
|
|
+ result = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
extend_info_free(extend_info);
|
|
|
return result;
|
|
|
}
|