[or-cvs] Add first cut of assert_*_ok functions

Nick Mathewson nickm at seul.org
Tue Sep 16 19:36:21 UTC 2003


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

Modified Files:
	circuit.c connection.c or.h 
Log Message:
Add first cut of assert_*_ok functions

Index: circuit.c
===================================================================
RCS file: /home/or/cvsroot/src/or/circuit.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -d -r1.62 -r1.63
--- circuit.c	16 Sep 2003 17:17:39 -0000	1.62
+++ circuit.c	16 Sep 2003 19:36:19 -0000	1.63
@@ -939,6 +939,78 @@
   return 0;
 }
 
+
+void assert_cpath_layer_ok(crypt_path_t *cp)
+{
+  assert(cp->f_crypto);
+  assert(cp->b_crypto);
+  assert(cp->addr);
+  assert(cp->port);
+  switch(cp->state) 
+    {
+    case CPATH_STATE_CLOSED:
+    case CPATH_STATE_OPEN:
+      assert(!cp->handshake_state);
+    case CPATH_STATE_AWAITING_KEYS:
+      assert(cp->handshake_state);
+    default:
+      assert(0);
+    }
+  assert(cp->package_window >= 0);
+  assert(cp->deliver_window >= 0);
+}
+
+void assert_cpath_ok(crypt_path_t *cp)
+{
+  while(cp->prev)
+    cp = cp->prev;
+
+  while(cp->next) {
+    assert_cpath_layer_ok(cp);
+    /* layers must be in sequence of: "open* awaiting? closed*" */
+    if (cp->prev) {
+      if (cp->prev->state == CPATH_STATE_OPEN) {
+        assert(cp->state == CPATH_STATE_CLOSED ||
+               cp->state == CPATH_STATE_AWAITING_KEYS);
+      } else {
+        assert(cp->state == CPATH_STATE_CLOSED);
+      }
+    }
+    cp = cp->next;
+  }
+}
+
+void assert_circuit_ok(circuit_t *c) 
+{
+  connection_t *conn;
+
+  assert(c->n_addr);
+  assert(c->n_port);
+  assert(c->n_conn);
+  assert(c->n_conn->type == CONN_TYPE_OR);
+  if (c->p_conn)
+    assert(c->p_conn->type == CONN_TYPE_OR);
+  for (conn = c->p_streams; conn; conn = conn->next_stream)
+    assert(c->p_conn->type == CONN_TYPE_EXIT);
+  for (conn = c->n_streams; conn; conn = conn->next_stream)
+    assert(conn->type == CONN_TYPE_EXIT);
+
+  assert(c->deliver_window >= 0);
+  assert(c->package_window >= 0);
+  if (c->state == CIRCUIT_STATE_OPEN) {
+    if (c->cpath) {
+      assert(!c->n_crypto);
+      assert(!c->p_crypto);
+    } else {
+      assert(c->n_crypto);
+      assert(c->p_crypto);
+    }
+  }
+  if (c->cpath) {
+    assert_cpath_ok(c->cpath);
+  }
+}
+
 /*
   Local Variables:
   mode:c

Index: connection.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- connection.c	16 Sep 2003 05:41:49 -0000	1.93
+++ connection.c	16 Sep 2003 19:36:19 -0000	1.94
@@ -765,6 +765,107 @@
   }
 }
 
+void assert_connection_ok(connection_t *conn, time_t now)
+{
+  assert(conn);
+  assert(conn->type >= _CONN_TYPE_MIN);
+  assert(conn->type <= _CONN_TYPE_MAX);
+
+  /* XXX check: wants_to_read, wants_to_write, s, poll_index,
+   * marked_for_close. */
+  
+  /* buffers */
+  assert(conn->inbuf);
+  assert(conn->inbuflen <= conn->inbuf_datalen);
+  assert(conn->inbuflen >= 0);
+  assert(conn->inbuf_datalen > 0);
+  assert(conn->outbuf);
+  assert(conn->outbuflen <= conn->outbuf_datalen);
+  assert(conn->outbuflen >= 0);
+  assert(conn->outbuf_datalen > 0);
+
+  assert(!now || conn->timestamp_lastread <= now);
+  assert(!now || conn->timestamp_lastwritten <= now);
+  assert(conn->timestamp_created <= conn->timestamp_lastread);
+  assert(conn->timestamp_created <= conn->timestamp_lastwritten);
+  
+  if (conn->type != CONN_TYPE_OR) {
+    assert(conn->bandwidth == -1);
+    assert(conn->receiver_bucket == -1);
+    /* Addr, port, address XXX */
+    assert(!conn->pkey);
+    assert(!conn->tls);
+  } else {
+    assert(conn->bandwidth);
+    assert(conn->receiver_bucket >= 0);
+    assert(conn->receiver_bucket <= 10*conn->bandwidth);
+    assert(conn->addr && conn->port);
+    assert(conn->address);
+    assert(conn->pkey);
+#ifdef USE_TLS
+    if (conn->state != OR_CONN_STATE_CONNECTING)
+      assert(conn->tls);
+#endif
+  }
+  
+  if (conn->type != CONN_TYPE_EXIT) {
+    assert(!conn->stream_id[0]);
+    assert(!conn->next_stream);
+    assert(!conn->cpath_layer);
+    assert(!conn->package_window);
+    assert(!conn->deliver_window);
+    assert(!conn->done_sending);
+    assert(!conn->done_receiving);
+  } else {
+    assert(!conn->next_stream || 
+           conn->next_stream->type == CONN_TYPE_EXIT);
+    assert(conn->cpath_layer);
+    assert_cpath_layer_ok(conn->cpath_layer);
+    /* XXX unchecked, package window, deliver window. */
+  }
+
+  if (conn->type != CONN_TYPE_AP) {
+    assert(!conn->socks_version);
+    assert(!conn->read_username);
+    assert(!conn->dest_addr);
+    assert(!conn->dest_port);
+  }
+
+  switch(conn->type) 
+    {
+    case CONN_TYPE_OR_LISTENER:
+    case CONN_TYPE_AP_LISTENER:
+    case CONN_TYPE_DIR_LISTENER:
+      assert(conn->state == LISTENER_STATE_READY);
+      break;
+    case CONN_TYPE_OR:
+      assert(conn->state >= _OR_CONN_STATE_MIN &&
+             conn->state <= _OR_CONN_STATE_MAX);
+      break;
+    case CONN_TYPE_EXIT:
+      assert(conn->state >= _EXIT_CONN_STATE_MIN &&
+             conn->state <= _EXIT_CONN_STATE_MAX);
+      break;
+    case CONN_TYPE_AP:
+      assert(conn->state >= _AP_CONN_STATE_MIN &&
+             conn->state <= _AP_CONN_STATE_MAX);
+      break;
+    case CONN_TYPE_DIR:
+      assert(conn->state >= _DIR_CONN_STATE_MIN &&
+             conn->state <= _DIR_CONN_STATE_MAX);
+      break;
+    case CONN_TYPE_DNSWORKER:
+      assert(conn->state == DNSWORKER_STATE_IDLE ||
+             conn->state == DNSWORKER_STATE_BUSY);
+    case CONN_TYPE_CPUWORKER:
+      assert(conn->state >= _CPUWORKER_STATE_MIN &&
+             conn->state <= _CPUWORKER_STATE_MAX);
+      break;
+    default:
+      assert(0);
+  }
+}
+
 /*
   Local Variables:
   mode:c

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.127
retrieving revision 1.128
diff -u -d -r1.127 -r1.128
--- or.h	16 Sep 2003 17:17:39 -0000	1.127
+++ or.h	16 Sep 2003 19:36:19 -0000	1.128
@@ -112,6 +112,7 @@
 #define ACI_TYPE_HIGHER 1
 #define ACI_TYPE_BOTH 2
 
+#define _CONN_TYPE_MIN 3
 #define CONN_TYPE_OR_LISTENER 3
 #define CONN_TYPE_OR 4
 #define CONN_TYPE_EXIT 5
@@ -121,15 +122,18 @@
 #define CONN_TYPE_DIR 9
 #define CONN_TYPE_DNSWORKER 10
 #define CONN_TYPE_CPUWORKER 11
+#define _CONN_TYPE_MAX 3
 
 #define LISTENER_STATE_READY 0
 
 #define DNSWORKER_STATE_IDLE 0
 #define DNSWORKER_STATE_BUSY 1
 
+#define _CPUWORKER_STATE_MIN 0
 #define CPUWORKER_STATE_IDLE 0
 #define CPUWORKER_STATE_BUSY_ONION 1
 #define CPUWORKER_STATE_BUSY_HANDSHAKE 2
+#define _CPUWORKER_STATE_MAX 2
 
 #define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION
 #define CPUWORKER_TASK_HANDSHAKE CPUWORKER_STATE_BUSY_HANDSHAKE
@@ -140,6 +144,7 @@
  * "I am acting as a bar, currently in stage baz of talking with a foo."
  */
 //#define OR_CONN_STATE_OP_CONNECTING 0 /* an application proxy wants me to connect to this OR */
+#define _OR_CONN_STATE_MIN 1
 #define OR_CONN_STATE_OP_SENDING_KEYS 1
 #define OR_CONN_STATE_CLIENT_CONNECTING 2 /* connecting to this OR */
 #define OR_CONN_STATE_CLIENT_SENDING_AUTH 3 /* sending address and info */
@@ -149,29 +154,38 @@
 #define OR_CONN_STATE_SERVER_SENDING_AUTH 7 /* writing auth and nonce */
 #define OR_CONN_STATE_SERVER_NONCE_WAIT 8 /* waiting for confirmation of nonce */
 #define OR_CONN_STATE_OPEN 9 /* ready to send/receive cells. */
+#define _OR_CONN_STATE_MAX 9
 #else
+#define _OR_CONN_STATE_MIN 0
 #define OR_CONN_STATE_CONNECTING 0 /* waiting for connect() to finish */
 #define OR_CONN_STATE_HANDSHAKING 1 /* SSL is handshaking, not done yet */
 #define OR_CONN_STATE_OPEN 2 /* ready to send/receive cells. */
+#define _OR_CONN_STATE_MAX 2
 #endif
 
+#define _EXIT_CONN_STATE_MIN 0
 #define EXIT_CONN_STATE_RESOLVING 0 /* waiting for response from dns farm */
 #define EXIT_CONN_STATE_CONNECTING 1 /* waiting for connect() to finish */
 #define EXIT_CONN_STATE_OPEN 2
+#define _EXIT_CONN_STATE_MAX 2
 #if 0
 #define EXIT_CONN_STATE_CLOSE 3 /* flushing the buffer, then will close */
 #define EXIT_CONN_STATE_CLOSE_WAIT 4 /* have sent a destroy, awaiting a confirmation */
 #endif
 
+#define _AP_CONN_STATE_MIN 3
 #define AP_CONN_STATE_SOCKS_WAIT 3
 #define AP_CONN_STATE_OR_WAIT 4
 #define AP_CONN_STATE_OPEN 5
+#define _AP_CONN_STATE_MAX 5
 
+#define _DIR_CONN_STATE_MIN 0
 #define DIR_CONN_STATE_CONNECTING 0
 #define DIR_CONN_STATE_SENDING_COMMAND 1
 #define DIR_CONN_STATE_READING 2
 #define DIR_CONN_STATE_COMMAND_WAIT 3
 #define DIR_CONN_STATE_WRITING 4
+#define _DIR_CONN_STATE_MAX 4
 
 #define CIRCUIT_STATE_BUILDING 0 /* I'm the OP, still haven't done all my handshakes */
 #define CIRCUIT_STATE_ONIONSKIN_PENDING 1 /* waiting to process the onion */
@@ -518,6 +532,10 @@
 int circuit_finish_handshake(circuit_t *circ, char *reply);
 int circuit_truncated(circuit_t *circ, crypt_path_t *layer);
 
+void assert_cpath_ok(crypt_path_t *c);
+void assert_cpath_layer_ok(crypt_path_t *c);
+void assert_circuit_ok(circuit_t *c);
+
 /********************************* command.c ***************************/
 
 void command_process_cell(cell_t *cell, connection_t *conn);
@@ -563,6 +581,8 @@
 
 int connection_process_inbuf(connection_t *conn);
 int connection_finished_flushing(connection_t *conn);
+
+void assert_connection_ok(connection_t *conn, time_t now);
 
 /********************************* connection_edge.c ***************************/
 



More information about the tor-commits mailing list