[or-cvs] Refactor, rename, and clarify

Nick Mathewson nickm at seul.org
Thu Oct 9 18:45:22 UTC 2003


Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/tmp/cvs-serv21184/src/or

Modified Files:
	circuit.c connection.c connection_edge.c connection_or.c 
	main.c onion.c or.h 
Log Message:
Refactor, rename, and clarify

Index: circuit.c
===================================================================
RCS file: /home/or/cvsroot/src/or/circuit.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -d -r1.76 -r1.77
--- circuit.c	8 Oct 2003 02:04:07 -0000	1.76
+++ circuit.c	9 Oct 2003 18:45:13 -0000	1.77
@@ -264,7 +264,7 @@
   }
 
   log_fn(LOG_DEBUG,"Passing on unrecognized cell.");
-  connection_write_cell_to_buf(cell, conn);
+  connection_or_write_cell_to_buf(cell, conn);
   return 0;
 }
 
@@ -409,11 +409,11 @@
     if((edge_type == EDGE_EXIT && conn->package_window > 0) ||
        (edge_type == EDGE_AP   && conn->package_window > 0 && conn->cpath_layer == layer_hint)) {
       connection_start_reading(conn);
-      connection_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
+      connection_edge_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
 
       /* If the circuit won't accept any more data, return without looking
        * at any more of the streams. Any connections that should be stopped
-       * have already been stopped by connection_package_raw_inbuf. */
+       * have already been stopped by connection_edge_package_raw_inbuf. */
       if(circuit_consider_stop_edge_reading(circ, edge_type, layer_hint))
         return;
     }
@@ -733,7 +733,7 @@
       return -1;
     }
 
-    connection_write_cell_to_buf(&cell, circ->n_conn);
+    connection_or_write_cell_to_buf(&cell, circ->n_conn);
 
     circ->cpath->state = CPATH_STATE_AWAITING_KEYS;
     circ->state = CIRCUIT_STATE_BUILDING;
@@ -837,7 +837,7 @@
 
   memcpy(newcell.payload, cell->payload+RELAY_HEADER_SIZE+6, DH_ONIONSKIN_LEN);
 
-  connection_write_cell_to_buf(&newcell, circ->n_conn);
+  connection_or_write_cell_to_buf(&newcell, circ->n_conn);
   return 0;
 }
 

Index: connection.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection.c,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -d -r1.117 -r1.118
--- connection.c	8 Oct 2003 02:04:07 -0000	1.117
+++ connection.c	9 Oct 2003 18:45:13 -0000	1.118
@@ -68,6 +68,7 @@
 /********* END VARIABLES ************/
 
 static int connection_init_accepted_conn(connection_t *conn);
+static int connection_handle_listener_read(connection_t *conn, int new_type);
 
 /**************************************************************/
 
@@ -162,7 +163,7 @@
   return 0;
 }
 
-int connection_handle_listener_read(connection_t *conn, int new_type) {
+static int connection_handle_listener_read(connection_t *conn, int new_type) {
   int news; /* the new socket */
   connection_t *newconn;
   struct sockaddr_in remote; /* information about the remote peer when connecting to other routers */
@@ -645,7 +646,7 @@
   cell.aci = aci;
   cell.command = CELL_DESTROY;
   log_fn(LOG_INFO,"Sending destroy (aci %d).",aci);
-  connection_write_cell_to_buf(&cell, conn);
+  connection_or_write_cell_to_buf(&cell, conn);
   return 0;
 }
 

Index: connection_edge.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection_edge.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- connection_edge.c	8 Oct 2003 04:10:56 -0000	1.36
+++ connection_edge.c	9 Oct 2003 18:45:13 -0000	1.37
@@ -13,6 +13,8 @@
                                                int replylen, char success);
 
 static int connection_exit_begin_conn(cell_t *cell, circuit_t *circ);
+static void connection_edge_consider_sending_sendme(connection_t *conn, 
+                                                    int edge_type);
 
 int connection_edge_process_inbuf(connection_t *conn) {
 
@@ -43,7 +45,7 @@
 /*ENDCLOSE*/  return connection_ap_handshake_process_socks(conn);
     case AP_CONN_STATE_OPEN:
     case EXIT_CONN_STATE_OPEN:
-      if(connection_package_raw_inbuf(conn) < 0)
+      if(connection_edge_package_raw_inbuf(conn) < 0)
 /*ENDCLOSE*/  return -1;
       return 0;
     case EXIT_CONN_STATE_CONNECTING:
@@ -167,7 +169,7 @@
       stats_n_data_bytes_received += (cell->length - RELAY_HEADER_SIZE);
       connection_write_to_buf(cell->payload + RELAY_HEADER_SIZE,
                              cell->length - RELAY_HEADER_SIZE, conn);
-      connection_consider_sending_sendme(conn, edge_type);
+      connection_edge_consider_sending_sendme(conn, edge_type);
       return 0;
     case RELAY_COMMAND_END:
       if(!conn) {
@@ -252,7 +254,7 @@
       conn->package_window += STREAMWINDOW_INCREMENT;
       log_fn(LOG_DEBUG,"stream-level sendme, packagewindow now %d.", conn->package_window);
       connection_start_reading(conn);
-      connection_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
+      connection_edge_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
       break;
     default:
       log_fn(LOG_WARNING,"unknown relay command %d.",relay_command);
@@ -295,7 +297,7 @@
     case AP_CONN_STATE_OPEN:
     case EXIT_CONN_STATE_OPEN:
       connection_stop_writing(conn);
-      connection_consider_sending_sendme(conn, conn->type);
+      connection_edge_consider_sending_sendme(conn, conn->type);
       return 0;
     case AP_CONN_STATE_SOCKS_WAIT:
       connection_stop_writing(conn);
@@ -312,7 +314,7 @@
 uint64_t stats_n_data_cells_received = 0;
 uint64_t stats_n_data_bytes_received = 0;
 
-int connection_package_raw_inbuf(connection_t *conn) {
+int connection_edge_package_raw_inbuf(connection_t *conn) {
   int amount_to_process, length;
   char payload[CELL_PAYLOAD_SIZE];
   circuit_t *circ;
@@ -320,7 +322,7 @@
   assert(conn);
   assert(!connection_speaks_cells(conn));
  
-repeat_connection_package_raw_inbuf:
+repeat_connection_edge_package_raw_inbuf:
  
   circ = circuit_get_by_conn(conn);
   if(!circ) {
@@ -376,10 +378,10 @@
   log_fn(LOG_DEBUG,"conn->package_window is now %d",conn->package_window);
  
   /* handle more if there's more, or return 0 if there isn't */
-  goto repeat_connection_package_raw_inbuf;
+  goto repeat_connection_edge_package_raw_inbuf;
 }
 
-void connection_consider_sending_sendme(connection_t *conn, int edge_type) {
+static void connection_edge_consider_sending_sendme(connection_t *conn, int edge_type) {
   circuit_t *circ;
   cell_t cell;
  

Index: connection_or.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection_or.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- connection_or.c	8 Oct 2003 04:10:57 -0000	1.66
+++ connection_or.c	9 Oct 2003 18:45:13 -0000	1.67
@@ -7,6 +7,7 @@
 extern or_options_t options; /* command-line and config-file options */
 
 static int connection_tls_finish_handshake(connection_t *conn);
+static int connection_or_process_cell_from_inbuf(connection_t *conn);
 
 /**************************************************************/
 
@@ -39,7 +40,7 @@
 
   if(conn->state != OR_CONN_STATE_OPEN)
     return 0; /* don't do anything */
-  return connection_process_cell_from_inbuf(conn);
+  return connection_or_process_cell_from_inbuf(conn);
 }
 
 int connection_or_finished_flushing(connection_t *conn) {
@@ -252,17 +253,19 @@
 
 /* ********************************** */
 
-void connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn) {
+void connection_or_write_cell_to_buf(const cell_t *cellp, connection_t *conn) {
   char networkcell[CELL_NETWORK_SIZE];
   char *n = networkcell;
 
+  assert(connection_speaks_cells(conn));
+
   cell_pack(n, cellp);
  
   connection_write_to_buf(n, CELL_NETWORK_SIZE, conn);
 }
 
 /* if there's a whole cell there, pull it off and process it. */
-int connection_process_cell_from_inbuf(connection_t *conn) {
+static int connection_or_process_cell_from_inbuf(connection_t *conn) {
   char buf[CELL_NETWORK_SIZE];
   cell_t cell;
 
@@ -277,7 +280,9 @@
   cell_unpack(&cell, buf);
  
   command_process_cell(&cell, conn);
- 
+
+  /* CLEAR Shouldn't this be connection_or_process_inbuf at least? Or maybe
+     just use a loop?  If not, doc why not. */
   return connection_process_inbuf(conn); /* process the remainder of the buffer */
 }
 

Index: main.c
===================================================================
RCS file: /home/or/cvsroot/src/or/main.c,v
retrieving revision 1.128
retrieving revision 1.129
diff -u -d -r1.128 -r1.129
--- main.c	8 Oct 2003 08:54:52 -0000	1.128
+++ main.c	9 Oct 2003 18:45:13 -0000	1.129
@@ -103,6 +103,10 @@
   poll_array[conn->poll_index].fd = conn->s;
 }
 
+/* Remove the current function from the global list, and remove the
+ * corresponding poll entry.  Calling this function will shift the last
+ * connection (if any) into the position occupied by conn.
+ */
 int connection_remove(connection_t *conn) {
   int current_index;
 
@@ -185,10 +189,8 @@
   /* see http://www.greenend.org.uk/rjk/2001/06/poll.html for
    * discussion of POLLIN vs POLLHUP */
   if(!(poll_array[i].revents & (POLLIN|POLLHUP|POLLERR)))
-    if(!connection_speaks_cells(conn) ||
-       conn->state != OR_CONN_STATE_OPEN ||
-       !connection_is_reading(conn) ||
-       !tor_tls_get_pending_bytes(conn->tls)) 
+    if(!connection_is_reading(conn) ||
+       !connection_has_pending_tls_data(conn))
       return; /* this conn should not read */
 
   log_fn(LOG_DEBUG,"socket %d wants to read.",conn->s);
@@ -233,7 +235,7 @@
   } else assert_connection_ok(conn, time(NULL));
 }
 
-static void check_conn_marked(int i) {
+static void conn_close_if_marked(int i) {
   connection_t *conn;
 
   conn = connection_array[i];
@@ -255,115 +257,139 @@
     connection_free(conn);
     if(i<nfds) { /* we just replaced the one at i with a new one.
                     process it too. */
-      check_conn_marked(i);
+      conn_close_if_marked(i);
     }
   }
 }
 
-static int prepare_for_poll(void) {
-  int i;
-  connection_t *conn;
-  struct timeval now;
-  static long current_second = 0; /* from previous calls to gettimeofday */
-  static long time_to_fetch_directory = 0;
-  static long time_to_new_circuit = 0;
+/* Perform regulare maintenance tasks for a single connection.  This
+ * function gets run once per second per connection by run_housekeeping.
+ */
+static void run_connection_housekeeping(int i, time_t now) {
   cell_t cell;
-  circuit_t *circ;
+  connection_t *conn = connection_array[i];
+  if(connection_receiver_bucket_should_increase(conn)) {
+    conn->receiver_bucket += conn->bandwidth;
+    //        log_fn(LOG_DEBUG,"Receiver bucket %d now %d.", i, conn->receiver_bucket);
+  }
 
-  tor_gettimeofday(&now);
+  if(conn->wants_to_read == 1 /* it's marked to turn reading back on now */
+     && global_read_bucket > 0 /* and we're allowed to read */
+     && (!connection_speaks_cells(conn) || conn->receiver_bucket > 0)) {
+    /* and either a non-cell conn or a cell conn with non-empty bucket */
+    conn->wants_to_read = 0;
+    connection_start_reading(conn);
+    if(conn->wants_to_write == 1) {
+      conn->wants_to_write = 0;
+      connection_start_writing(conn);
+    }
+  }
+  
+  /* check connections to see whether we should send a keepalive, expire, or wait */
+  if(!connection_speaks_cells(conn))
+    return;
 
-  if(now.tv_sec > current_second) { /* the second has rolled over. check more stuff. */
+  if(now >= conn->timestamp_lastwritten + options.KeepalivePeriod) {
+    if((!options.OnionRouter && !circuit_get_by_conn(conn)) ||
+       (!connection_state_is_open(conn))) {
+      /* we're an onion proxy, with no circuits; or our handshake has expired. kill it. */
+      log_fn(LOG_INFO,"Expiring connection to %d (%s:%d).",
+             i,conn->address, conn->port);
+      conn->marked_for_close = 1;
+    } else {
+      /* either a full router, or we've got a circuit. send a padding cell. */
+      log_fn(LOG_DEBUG,"Sending keepalive to (%s:%d)",
+             conn->address, conn->port);
+      memset(&cell,0,sizeof(cell_t));
+      cell.command = CELL_PADDING;
+      connection_or_write_cell_to_buf(&cell, conn);
+    }
+  }
+}
 
-    ++stats_n_seconds_reading;
+/* Perform regular maintenance tasks.  This function gets run once per
+ * second by prepare_for_poll.
+ */
+static void run_scheduled_events(time_t now) {
+  static long time_to_fetch_directory = 0;
+  static long time_to_new_circuit = 0;
+  circuit_t *circ;
+  int i;
 
-    if(time_to_fetch_directory < now.tv_sec) {
-      /* it's time to fetch a new directory and/or post our descriptor */
-      if(options.OnionRouter) {
-        router_rebuild_descriptor();
-        router_upload_desc_to_dirservers();
-      }
-      if(!options.DirPort) {
-        /* NOTE directory servers do not currently fetch directories.
-         * Hope this doesn't bite us later. */
-        directory_initiate_command(router_pick_directory_server(),
-                                   DIR_CONN_STATE_CONNECTING_FETCH);
-      }
-      time_to_fetch_directory = now.tv_sec + options.DirFetchPostPeriod;
+  /* 1. Every DirFetchPostPeriod seconds, we get a new directory and upload
+   *    our descriptor (if any). */
+  if(time_to_fetch_directory < now) {
+    /* it's time to fetch a new directory and/or post our descriptor */
+    if(options.OnionRouter) {
+      router_rebuild_descriptor();
+      router_upload_desc_to_dirservers();
     }
-
-    if(options.APPort && time_to_new_circuit < now.tv_sec) {
-      circuit_expire_unused_circuits();
-      circuit_launch_new(-1); /* tell it to forget about previous failures */
-      circ = circuit_get_newest_open();
-      if(!circ || circ->dirty) {
-        log_fn(LOG_INFO,"Youngest circuit %s; launching replacement.", circ ? "dirty" : "missing");
-        circuit_launch_new(0); /* make an onion and lay the circuit */
-      }
-      time_to_new_circuit = now.tv_sec + options.NewCircuitPeriod;
+    if(!options.DirPort) {
+      /* NOTE directory servers do not currently fetch directories.
+       * Hope this doesn't bite us later. */
+      directory_initiate_command(router_pick_directory_server(),
+                                 DIR_CONN_STATE_CONNECTING_FETCH);
     }
+    time_to_fetch_directory = now + options.DirFetchPostPeriod;
+  }
 
-    stats_n_bytes_read += stats_prev_global_read_bucket-global_read_bucket;
-    if(global_read_bucket < 9*options.TotalBandwidth) {
-      global_read_bucket += options.TotalBandwidth;
-      log_fn(LOG_DEBUG,"global_read_bucket now %d.", global_read_bucket);
+  /* 2. Every NewCircuitPeriod seconds, we expire old ciruits and make a 
+   *    new one as needed.
+   */
+  if(options.APPort && time_to_new_circuit < now) {
+    circuit_expire_unused_circuits();
+    circuit_launch_new(-1); /* tell it to forget about previous failures */
+    circ = circuit_get_newest_open();
+    if(!circ || circ->dirty) {
+      log_fn(LOG_INFO,"Youngest circuit %s; launching replacement.", circ ? "dirty" : "missing");
+      circuit_launch_new(0); /* make an onion and lay the circuit */
     }
-    stats_prev_global_read_bucket = global_read_bucket;
+    time_to_new_circuit = now + options.NewCircuitPeriod;
+  }
+  
+  /* 3. Every second, we check how much bandwidth we've consumed and 
+   *    increment global_read_bucket.
+   */
+  stats_n_bytes_read += stats_prev_global_read_bucket-global_read_bucket;
+  if(global_read_bucket < 9*options.TotalBandwidth) {
+    global_read_bucket += options.TotalBandwidth;
+    log_fn(LOG_DEBUG,"global_read_bucket now %d.", global_read_bucket);
+  }
+  stats_prev_global_read_bucket = global_read_bucket;
+  
 
-    /* do housekeeping for each connection */
-    for(i=0;i<nfds;i++) {
-      conn = connection_array[i];
-      if(connection_receiver_bucket_should_increase(conn)) {
-        conn->receiver_bucket += conn->bandwidth;
-//        log_fn(LOG_DEBUG,"Receiver bucket %d now %d.", i, conn->receiver_bucket);
-      }
+  /* 4. We do houskeeping for each connection... */
+  for(i=0;i<nfds;i++) {
+    run_connection_housekeeping(i, now);
+  }
 
-      if(conn->wants_to_read == 1 /* it's marked to turn reading back on now */
-         && global_read_bucket > 0 /* and we're allowed to read */
-         && (!connection_speaks_cells(conn) || conn->receiver_bucket > 0)) {
-         /* and either a non-cell conn or a cell conn with non-empty bucket */
-        conn->wants_to_read = 0;
-        connection_start_reading(conn);
-	if(conn->wants_to_write == 1) {
-          conn->wants_to_write = 0;
-          connection_start_writing(conn);
-        }
-      }
+  /* 5. and blow away any connections that need to die. can't do this later
+   * because we might open up a circuit and not realize we're about to cull
+   * the connection it's running over.
+   */
+  for(i=0;i<nfds;i++)
+    conn_close_if_marked(i);
+}
 
-      /* check connections to see whether we should send a keepalive, expire, or wait */
-      if(!connection_speaks_cells(conn))
-        continue; /* this conn type doesn't send cells */
-      if(now.tv_sec >= conn->timestamp_lastwritten + options.KeepalivePeriod) {
-        if((!options.OnionRouter && !circuit_get_by_conn(conn)) ||
-           (!connection_state_is_open(conn))) {
-          /* we're an onion proxy, with no circuits; or our handshake has expired. kill it. */
-          log_fn(LOG_INFO,"Expiring connection to %d (%s:%d).",
-              i,conn->address, conn->port);
-          conn->marked_for_close = 1;
-        } else {
-          /* either a full router, or we've got a circuit. send a padding cell. */
-          log_fn(LOG_DEBUG,"Sending keepalive to (%s:%d)",
-              conn->address, conn->port);
-          memset(&cell,0,sizeof(cell_t));
-          cell.command = CELL_PADDING;
-          connection_write_cell_to_buf(&cell, conn);
-        }
-      }
-    }
-    /* blow away any connections that need to die. can't do this later
-     * because we might open up a circuit and not realize we're about to cull
-     * the connection it's running over.
-     */
-    for(i=0;i<nfds;i++)
-      check_conn_marked(i); 
+static int prepare_for_poll(void) {
+  static long current_second = 0; /* from previous calls to gettimeofday */
+  connection_t *conn;
+  struct timeval now;
+  int i;
+
+  tor_gettimeofday(&now);
+
+  if(now.tv_sec > current_second) { /* the second has rolled over. check more stuff. */
+
+    ++stats_n_seconds_reading;
+    run_scheduled_events(now.tv_sec);
 
     current_second = now.tv_sec; /* remember which second it is, for next time */
   }
 
   for(i=0;i<nfds;i++) {
     conn = connection_array[i];
-    if(connection_speaks_cells(conn) &&
-       connection_state_is_open(conn) &&
-       tor_tls_get_pending_bytes(conn->tls)) {
+    if(connection_has_pending_tls_data(conn)) {
       log_fn(LOG_DEBUG,"sock %d has pending bytes.",conn->s);
       return 0; /* has pending bytes to read; don't let poll wait. */
     }
@@ -621,7 +647,7 @@
 
     /* any of the conns need to be closed now? */
     for(i=0;i<nfds;i++)
-      check_conn_marked(i); 
+      conn_close_if_marked(i); 
 
     /* refilling buckets and sending cells happens at the beginning of the
      * next iteration of the loop, inside prepare_for_poll()

Index: onion.c
===================================================================
RCS file: /home/or/cvsroot/src/or/onion.c,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- onion.c	8 Oct 2003 02:04:08 -0000	1.72
+++ onion.c	9 Oct 2003 18:45:13 -0000	1.73
@@ -151,7 +151,7 @@
     return -1;
   }
 
-  connection_write_cell_to_buf(&cell, circ->p_conn);
+  connection_or_write_cell_to_buf(&cell, circ->p_conn);
   log_fn(LOG_DEBUG,"Finished sending 'created' cell.");
 
   return 0;

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.162
retrieving revision 1.163
diff -u -d -r1.162 -r1.163
--- or.h	8 Oct 2003 08:54:52 -0000	1.162
+++ or.h	9 Oct 2003 18:45:14 -0000	1.163
@@ -537,7 +537,6 @@
 void connection_free(connection_t *conn);
 
 int connection_create_listener(struct sockaddr_in *bindaddr, int type);
-int connection_handle_listener_read(connection_t *conn, int new_type);
 
 int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
 int retry_all_connections(uint16_t or_listenport, uint16_t ap_listenport, uint16_t dir_listenport);
@@ -564,6 +563,10 @@
 int connection_receiver_bucket_should_increase(connection_t *conn);
 
 #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
+#define connection_has_pending_tls_data(conn) \
+  ((conn)->type == CONN_TYPE_OR && \
+   (conn)->state == OR_CONN_STATE_OPEN && \
+   tor_tls_get_pending_bytes(conn->tls))
 int connection_is_listener(connection_t *conn);
 int connection_state_is_open(connection_t *conn);
 
@@ -584,8 +587,7 @@
                                        int edge_type, crypt_path_t *layer_hint);
 int connection_edge_finished_flushing(connection_t *conn);
 
-int connection_package_raw_inbuf(connection_t *conn);
-void connection_consider_sending_sendme(connection_t *conn, int edge_type);
+int connection_edge_package_raw_inbuf(connection_t *conn);
 
 int connection_exit_connect(connection_t *conn);
 
@@ -605,8 +607,7 @@
 int connection_tls_start_handshake(connection_t *conn, int receiving);
 int connection_tls_continue_handshake(connection_t *conn);
 
-void connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn);
-int connection_process_cell_from_inbuf(connection_t *conn);
+void connection_or_write_cell_to_buf(const cell_t *cellp, connection_t *conn);
 
 /********************************* cpuworker.c *****************************/
 



More information about the tor-commits mailing list