]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix misreporting of stream bandwidths.
authorpotentiate <potentiate@netherworld.(none)>
Thu, 14 May 2009 12:20:27 +0000 (05:20 -0700)
committerNick Mathewson <nickm@torproject.org>
Thu, 14 May 2009 21:50:06 +0000 (17:50 -0400)
src/or/connection.c
src/or/connection_edge.c
src/or/control.c
src/or/or.h

index 7b14f7550a9e8e4e21dc89535b26283918c99c34..17cfdcba827835cfca8ad02e40d380cd7e33e17d 100644 (file)
@@ -611,6 +611,7 @@ connection_about_to_close_connection(connection_t *conn)
                  conn->marked_for_close_file, conn->marked_for_close);
         dnsserv_reject_request(edge_conn);
       }
+      control_event_stream_bandwidth(edge_conn);
       control_event_stream_status(edge_conn, STREAM_EVENT_CLOSED,
                                   edge_conn->end_reason);
       circ = circuit_get_by_edge_conn(edge_conn);
index f4585d89a9304ada951f484cf7f058589fc7bfcf..eff20bd139acfde4bff01fe05e04b6aa31d37036 100644 (file)
@@ -160,6 +160,7 @@ connection_edge_destroy(circid_t circ_id, edge_connection_t *conn)
              "CircID %d: At an edge. Marking connection for close.", circ_id);
     if (conn->_base.type == CONN_TYPE_AP) {
       connection_mark_unattached_ap(conn, END_STREAM_REASON_DESTROY);
+      control_event_stream_bandwidth(conn);
       control_event_stream_status(conn, STREAM_EVENT_CLOSED,
                                   END_STREAM_REASON_DESTROY);
       conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED;
index 53b9952481d9e402b8c93f77226e294c2e029b6e..c5fd688e3d0d1a654460619fcd7fef4c519a6c32 100644 (file)
@@ -3258,6 +3258,28 @@ control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp,
   return 0;
 }
 
+/**
+ * Print out STREAM_BW event for a single conn
+ */
+int
+control_event_stream_bandwidth(edge_connection_t *edge_conn)
+{
+  if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) {
+    if (!edge_conn->n_read && !edge_conn->n_written)
+      return 0;
+
+    send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES,
+                       "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n",
+                       U64_PRINTF_ARG(edge_conn->_base.global_identifier),
+                       (unsigned long)edge_conn->n_read,
+                       (unsigned long)edge_conn->n_written);
+
+    edge_conn->n_written = edge_conn->n_read = 0;
+  }
+
+  return 0;
+}
+
 /** A second or more has elapsed: tell any interested control
  * connections how much bandwidth streams have used. */
 int
index fd75229649a8c9c2046f4613881ad2d93c2f79de..7ac9e8000438b2be4fa5e897c174777c0dc6b4ab 100644 (file)
@@ -3220,6 +3220,7 @@ int control_event_stream_status(edge_connection_t *conn,
 int control_event_or_conn_status(or_connection_t *conn,
                                  or_conn_status_event_t e, int reason);
 int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written);
+int control_event_stream_bandwidth(edge_connection_t *edge_conn);
 int control_event_stream_bandwidth_used(void);
 void control_event_logmsg(int severity, unsigned int domain, const char *msg);
 int control_event_descriptors_changed(smartlist_t *routers);