Commit 4a74812c authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

r11812@catbus: nickm | 2007-02-14 11:22:08 -0500

 Apply stream_bw patch from Robert Hogan.


svn:r9585
parent 9e7e9e1b
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -40,11 +40,15 @@ Changes in version 0.1.2.8-alpha - 2007-??-??
      order: the EntryNodes that were guards before; the rest of the
      EntryNodes; the nodes that were guards before.

  o Minor features:
  o Minor features (controller):
    - Warn the user when an application uses the obsolete binary v0
      control protocol.  We're planning to remove support for it during
      the next development series, so it's good to give people some
      advance warning.
    - Add STREAM_BW events to reprot per-entry-stream bandwidth use. (Patch
      from Robert Hogan.)

  o Minor features:
    - Remove some never-implemented options.  Mark PathlenCoinWeight as
      obsolete.
    - Implement proposal 106: Stop requiring clients to have well-formed
+12 −1
Original line number Diff line number Diff line
@@ -194,7 +194,7 @@ $Id$
     EventCode = "CIRC" / "STREAM" / "ORCONN" / "BW" / "DEBUG" /
         "INFO" / "NOTICE" / "WARN" / "ERR" / "NEWDESC" / "ADDRMAP" /
         "AUTHDIR_NEWDESCS" / "DESCCHANGED" / "STATUS_GENERAL" /
         "STATUS_CLIENT" / "STATUS_SERVER" / "GUARDS" / "NS"
         "STATUS_CLIENT" / "STATUS_SERVER" / "GUARDS" / "NS" / "STREAM_BW"

  Any events *not* listed in the SETEVENTS line are turned off; thus, sending
  SETEVENTS with an empty body turns off all event reporting.
@@ -1271,6 +1271,17 @@ $Id$

  [First added in 0.1.2.3-alpha]

4.1.13. Bandwidth used on a stream

  The syntax is:
     "650" SP "STREAM_BW" SP StreamID SP BytesRead SP BytesWritten
     BytesRead = 1*DIGIT
     BytesWritten = 1*DIGIT

  The number of bytes read and written since the last read or write event
  on a stream.


5. Implementation notes

5.1. Authentication
+14 −0
Original line number Diff line number Diff line
@@ -1571,6 +1571,13 @@ connection_read_to_buf(connection_t *conn, int *max_to_read)
    *max_to_read = at_most - n_read;
  }

  if (CONN_IS_EDGE(conn)) {
    if (conn->type == CONN_TYPE_AP) {
        edge_connection_t *edge_conn = TO_EDGE_CONN(conn);
        edge_conn->n_read += n_read;
    }
  }

  if (connection_is_rate_limited(conn)) {
    /* For non-local IPs, remember if we flushed any bytes over the wire. */
    time_t now = time(NULL);
@@ -1767,6 +1774,13 @@ connection_handle_write(connection_t *conn, int force)
    n_written = (size_t) result;
  }

  if (CONN_IS_EDGE(conn)) {
    if (conn->type == CONN_TYPE_AP) {
      edge_connection_t *edge_conn = TO_EDGE_CONN(conn);
      edge_conn->n_written += n_written;
    }
  }

  if (connection_is_rate_limited(conn)) {
    /* For non-local IPs, remember if we flushed any bytes over the wire. */
    time_t now = time(NULL);
+42 −1
Original line number Diff line number Diff line
@@ -89,7 +89,8 @@ const char control_c_id[] =
#define EVENT_STATUS_SERVER    0x0011
#define EVENT_STATUS_GENERAL   0x0012
#define EVENT_GUARD            0x0013
#define _EVENT_MAX             0x0013
#define EVENT_STREAM_BANDWIDTH_USED   0x0014
#define _EVENT_MAX             0x0014
/* If _EVENT_MAX ever hits 0x0020, we need to make the mask wider. */

/** Array mapping from message type codes to human-readable message
@@ -1104,6 +1105,8 @@ handle_control_setevents(control_connection_t *conn, uint32_t len,
          event_code = EVENT_STATUS_SERVER;
        else if (!strcasecmp(ev, "GUARD"))
          event_code = EVENT_GUARD;
        else if (!strcasecmp(ev, "STREAM_BW"))
          event_code = EVENT_STREAM_BANDWIDTH_USED;
        else {
          connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n",
                                   ev);
@@ -3410,6 +3413,44 @@ control_event_or_conn_status(or_connection_t *conn,or_conn_status_event_t tp,
  return 0;
}

/** A second or more has elapsed: tell any interested control
 * connections how much bandwidth streams have used. */
int
control_event_stream_bandwidth_used()
{
  connection_t **carray;
  edge_connection_t *conn;
  int n, i;
  uint32_t justread, justwritten;

  if (EVENT_IS_INTERESTING1(EVENT_STREAM_BANDWIDTH_USED)) {

    get_connection_array(&carray, &n);

    for (i = 0; i < n; ++i) {
        if (carray[i]->type != CONN_TYPE_AP)
          continue;
        conn = TO_EDGE_CONN(carray[i]);
        if (conn->p_read == conn->n_read && conn->p_written == conn->n_written)
          continue;

        justread = conn->n_read - conn->p_read;
        conn->p_read = conn->n_read;
        justwritten = conn->n_written - conn->p_written;
        conn->p_written = conn->n_written;

        send_control1_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES,
                            "650 STREAM_BW %lu %lu %lu\r\n",
                            (unsigned long)conn->global_identifier,
                            (unsigned long)justread,
                            (unsigned long)justwritten);

    }
  }

  return 0;
}

/** A second or more has elapsed: tell any interested control
 * connections how much bandwidth we used. */
int
+1 −0
Original line number Diff line number Diff line
@@ -998,6 +998,7 @@ second_elapsed_callback(int fd, short event, void *args)
  if (accounting_is_enabled(options) && seconds_elapsed >= 0)
    accounting_add_bytes(bytes_read, bytes_written, seconds_elapsed);
  control_event_bandwidth_used((uint32_t)bytes_read,(uint32_t)bytes_written);
  control_event_stream_bandwidth_used();

  if (seconds_elapsed > 0)
    connection_bucket_refill(seconds_elapsed);
Loading