#include "feature/relay/routermode.h"
#include "feature/relay/selftest.h"
-/** Take the 'extend' <b>cell</b>, pull out addr/port plus the onion
- * skin and identity digest for the next hop. If we're already connected,
- * pass the onion skin to the next hop using a create cell; otherwise
- * launch a new OR connection, and <b>circ</b> will notice when the
- * connection succeeds or fails.
+/* Before replying to an extend cell, check the state of the circuit
+ * <b>circ</b>, and the configured tor mode.
*
* Return -1 if we want to warn and tear down the circuit, else return 0.
*/
const char *msg = NULL;
int should_launch = 0;
+ if (!server_mode(get_options())) {
+ circuitbuild_warn_client_extend();
+ return -1;
+ }
+
if (circ->n_chan) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"n_chan already set. Bug/attack. Closing.");
return -1;
}
- if (!server_mode(get_options())) {
- log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
- "Got an extend cell, but running as a client. Closing.");
- return -1;
- }
-
relay_header_unpack(&rh, cell->payload);
if (extend_cell_parse(&ec, rh.command,
#define TOR_FEATURE_RELAY_CIRCUITBUILD_RELAY_H
#include "lib/cc/torint.h"
+#include "lib/log/log.h"
+
+#include "app/config/config.h"
struct cell_t;
struct created_cell_t;
struct circuit_t;
struct or_circuit_t;
+/* Log a protocol warning about getting an extend cell on a client. */
+static inline void
+circuitbuild_warn_client_extend(void)
+{
+ log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
+ "Got an extend cell, but running as a client. Closing.");
+}
+
#ifdef HAVE_MODULE_RELAY
int circuit_extend(struct cell_t *cell, struct circuit_t *circ);
{
(void)cell;
(void)circ;
- tor_assert_nonfatal_unreached();
+ circuitbuild_warn_client_extend();
return -1;
}