Browse Source

Send control port events for timeouts.

We now differentiate between timeouts and cutoffs by the REASON string and
the PURPOSE string.
Mike Perry 14 years ago
parent
commit
c5b5643965
5 changed files with 16 additions and 3 deletions
  1. 2 1
      doc/spec/control-spec.txt
  2. 1 1
      src/or/circuitlist.c
  3. 7 1
      src/or/circuituse.c
  4. 4 0
      src/or/or.h
  5. 2 0
      src/or/reasons.c

+ 2 - 1
doc/spec/control-spec.txt

@@ -1005,7 +1005,8 @@
       Reason = "NONE" / "TORPROTOCOL" / "INTERNAL" / "REQUESTED" /
       Reason = "NONE" / "TORPROTOCOL" / "INTERNAL" / "REQUESTED" /
                "HIBERNATING" / "RESOURCELIMIT" / "CONNECTFAILED" /
                "HIBERNATING" / "RESOURCELIMIT" / "CONNECTFAILED" /
                "OR_IDENTITY" / "OR_CONN_CLOSED" / "TIMEOUT" /
                "OR_IDENTITY" / "OR_CONN_CLOSED" / "TIMEOUT" /
-               "FINISHED" / "DESTROYED" / "NOPATH" / "NOSUCHSERVICE"
+               "FINISHED" / "DESTROYED" / "NOPATH" / "NOSUCHSERVICE" /
+               "MEASUREMENT_EXPIRED"
 
 
    The path is provided only when the circuit has been extended at least one
    The path is provided only when the circuit has been extended at least one
    hop.
    hop.

+ 1 - 1
src/or/circuitlist.c

@@ -368,7 +368,7 @@ circuit_purpose_to_controller_string(uint8_t purpose)
     case CIRCUIT_PURPOSE_TESTING:
     case CIRCUIT_PURPOSE_TESTING:
       return "TESTING";
       return "TESTING";
     case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT:
     case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT:
-      return "EXPIRED";
+      return "MEASURE_TIMEOUT";
     case CIRCUIT_PURPOSE_CONTROLLER:
     case CIRCUIT_PURPOSE_CONTROLLER:
       return "CONTROLLER";
       return "CONTROLLER";
 
 

+ 7 - 1
src/or/circuituse.c

@@ -389,6 +389,9 @@ circuit_expire_building(time_t now)
         /* Circuits are allowed to last longer for measurement.
         /* Circuits are allowed to last longer for measurement.
          * Switch their purpose and wait. */
          * Switch their purpose and wait. */
         if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
         if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+          control_event_circuit_status(TO_ORIGIN_CIRCUIT(victim),
+                                       CIRC_EVENT_FAILED,
+                                       END_CIRC_REASON_TIMEOUT);
           victim->purpose = CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT;
           victim->purpose = CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT;
           /* Record this failure to check for too many timeouts
           /* Record this failure to check for too many timeouts
            * in a row. This function does not record a time value yet
            * in a row. This function does not record a time value yet
@@ -430,7 +433,10 @@ circuit_expire_building(time_t now)
                circuit_state_to_string(victim->state), victim->purpose);
                circuit_state_to_string(victim->state), victim->purpose);
 
 
     circuit_log_path(LOG_INFO,LD_CIRC,TO_ORIGIN_CIRCUIT(victim));
     circuit_log_path(LOG_INFO,LD_CIRC,TO_ORIGIN_CIRCUIT(victim));
-    circuit_mark_for_close(victim, END_CIRC_REASON_TIMEOUT);
+    if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT)
+      circuit_mark_for_close(victim, END_CIRC_REASON_MEASUREMENT_EXPIRED);
+    else
+      circuit_mark_for_close(victim, END_CIRC_REASON_TIMEOUT);
   }
   }
 }
 }
 
 

+ 4 - 0
src/or/or.h

@@ -614,6 +614,10 @@ typedef enum {
 
 
 /* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE
 /* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE
  * call; they only go to the controller for tracking  */
  * call; they only go to the controller for tracking  */
+/** Our post-timeout circuit time measurement period expired.
+ * We must give up now */
+#define END_CIRC_REASON_MEASUREMENT_EXPIRED -3
+
 /** We couldn't build a path for this circuit. */
 /** We couldn't build a path for this circuit. */
 #define END_CIRC_REASON_NOPATH          -2
 #define END_CIRC_REASON_NOPATH          -2
 /** Catch-all "other" reason for closing origin circuits. */
 /** Catch-all "other" reason for closing origin circuits. */

+ 2 - 0
src/or/reasons.c

@@ -334,6 +334,8 @@ circuit_end_reason_to_control_string(int reason)
       return "NOPATH";
       return "NOPATH";
     case END_CIRC_REASON_NOSUCHSERVICE:
     case END_CIRC_REASON_NOSUCHSERVICE:
       return "NOSUCHSERVICE";
       return "NOSUCHSERVICE";
+    case END_CIRC_REASON_MEASUREMENT_EXPIRED:
+      return "MEASUREMENT_EXPIRED";
     default:
     default:
       log_warn(LD_BUG, "Unrecognized reason code %d", (int)reason);
       log_warn(LD_BUG, "Unrecognized reason code %d", (int)reason);
       return NULL;
       return NULL;