diff options
-rw-r--r-- | src/or/circuit.c | 4 | ||||
-rw-r--r-- | src/or/or.h | 18 | ||||
-rw-r--r-- | src/or/rendclient.c | 27 |
3 files changed, 36 insertions, 13 deletions
diff --git a/src/or/circuit.c b/src/or/circuit.c index b466e3e4a0..ca9c503aa1 100644 --- a/src/or/circuit.c +++ b/src/or/circuit.c @@ -276,6 +276,10 @@ static int circuit_is_acceptable(circuit_t *circ, circ->purpose != CIRCUIT_PURPOSE_C_REND_READY && circ->purpose != CIRCUIT_PURPOSE_C_REND_JOINED) return 0; + } else if (purpose == CIRCUIT_PURPOSE_C_INTRODUCING) { + if (circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCING && + circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) + return 0; } else { if(purpose != circ->purpose) return 0; diff --git a/src/or/or.h b/src/or/or.h index 3257c22e6f..d5390022fb 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -216,16 +216,18 @@ */ #define CIRCUIT_PURPOSE_C_GENERAL 5 /* normal circuit, with cpath */ #define CIRCUIT_PURPOSE_C_INTRODUCING 6 /* at Alice, connecting to intro point */ -#define CIRCUIT_PURPOSE_C_ESTABLISH_REND 7 /* at Alice, waiting for ack */ -#define CIRCUIT_PURPOSE_C_REND_READY 8 /* at Alice, waiting for Bob */ -#define CIRCUIT_PURPOSE_C_REND_JOINED 9 /* at Alice, rendezvous established */ +#define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT 7 /* at alice, sent INTRODUCE1 to intro point, waiting for ACK/NAK */ -#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 10 /* at Bob, waiting for introductions */ -#define CIRCUIT_PURPOSE_S_INTRO 11 /* at Bob, successfully established intro */ -#define CIRCUIT_PURPOSE_S_CONNECT_REND 12 /* at Bob, connecting to rend point */ +#define CIRCUIT_PURPOSE_C_ESTABLISH_REND 8 /* at Alice, waiting for ack */ +#define CIRCUIT_PURPOSE_C_REND_READY 9 /* at Alice, waiting for Bob */ +#define CIRCUIT_PURPOSE_C_REND_JOINED 10 /* at Alice, rendezvous established */ -#define CIRCUIT_PURPOSE_S_REND_JOINED 13 /* at Bob, rendezvous established.*/ -#define _CIRCUIT_PURPOSE_MAX 13 +#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 11 /* at Bob, waiting for introductions */ +#define CIRCUIT_PURPOSE_S_INTRO 12 /* at Bob, successfully established intro */ +#define CIRCUIT_PURPOSE_S_CONNECT_REND 13 /* at Bob, connecting to rend point */ + +#define CIRCUIT_PURPOSE_S_REND_JOINED 14 /* at Bob, rendezvous established.*/ +#define _CIRCUIT_PURPOSE_MAX 14 #define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>_CIRCUIT_PURPOSE_OR_MAX) #define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose)) diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 18edb0e18d..5fba33006f 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -110,8 +110,8 @@ rend_client_send_introduction(circuit_t *introcirc, circuit_t *rendcirc) { return -1; } - /* we don't need it anymore, plus it's been used. send the destroy. */ - circuit_mark_for_close(introcirc); + /* Now, we wait for an ACK or NAK on this circuit. */ + introcirc->purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT; return 0; err: @@ -140,15 +140,32 @@ rend_client_rendcirc_is_open(circuit_t *circ) /* Called when get an ACK or a NAK for a REND_INTRODUCE1 cell. */ int -rend_client_introduction_acked(circuit_t *introcirc, +rend_client_introduction_acked(circuit_t *circ, const char *request, int request_len) { + if (circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { + log_fn(LOG_WARN, "Recieved REND_INTRODUCE_ACK on unexpected circuit %d", + circ->n_circ_id); + circuit_mark_for_close(circ); + return -1; + } + if (request_len == 0) { /* It's an ACK; the introduction point relayed our introduction request. */ - /* XXXX writeme */ + /* So close the circuit; we won't need it any more. */ + circuit_mark_for_close(circ); } else { /* It's a NAK; the introduction point didn't relay our request. */ - /* XXXX writeme */ + circ->purpose = CIRCUIT_PURPOSE_C_INTRODUCING; + /* XXXX + * Now become non-open, extend to another one of Bob's + * introduction points, and try again. Maybe mark the service as + * non-functional at the first intro point somehow? + * + * Or re-fetch the service descriptor? Hm.... + * + * XXXX writeme + */ } return 0; } |