aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2002-07-19 18:48:28 +0000
committerRoger Dingledine <arma@torproject.org>2002-07-19 18:48:28 +0000
commit5c0edf6d547fea93296bedd7a62f2b45e375d80a (patch)
treed9289b464c86b0ab19ef11b01163a7aa27bda789
parentfc0e2a34ec79750df0a6dbef6599e26e956321a9 (diff)
downloadtor-5c0edf6d547fea93296bedd7a62f2b45e375d80a.tar
tor-5c0edf6d547fea93296bedd7a62f2b45e375d80a.tar.gz
Folded cell.? into src/or
svn:r64
-rw-r--r--src/or/cell.c101
-rw-r--r--src/or/command.c3
-rw-r--r--src/or/connection.c4
-rw-r--r--src/or/or.h24
4 files changed, 111 insertions, 21 deletions
diff --git a/src/or/cell.c b/src/or/cell.c
index bf552cd32..1eb0c63a7 100644
--- a/src/or/cell.c
+++ b/src/or/cell.c
@@ -4,24 +4,97 @@
#include "or.h"
-int check_sane_cell(cell_t *cell) {
+static cell_t *new_create_cell(uint16_t aci, unsigned char length, unsigned char *buf)
+{
+ cell_t *c = NULL;
+ int retval;
- assert(cell);
+ if ((aci) && (buf) && (length <= CELL_PAYLOAD_SIZE)) /* valid parameters */
+ {
+ c = (cell_t *)malloc(sizeof(cell_t));
+ if (!c) /* malloc() error */
+ return NULL;
+
+ c->command = CELL_CREATE;
+ c->aci = aci;
+ c->length = length;
+ c->seq = 0;
+
+ memcpy((void *)c->payload, (void *)buf, length);
+ retval = RAND_pseudo_bytes((unsigned char *)(c->payload+length),CELL_PAYLOAD_SIZE-length);
+ if (retval == -1) /* RAND_pseudo_bytes() error */
+ {
+ free((void *)c);
+ return NULL;
+ } /* RAND_pseudo_bytes() error */
+
+ return c;
+ } /* valid parameters */
+ else /* invalid parameters */
+ return NULL;
+}
-#if 0 /* actually, the aci is 0 for padding cells */
- if(cell->aci == 0) {
- log(LOG_DEBUG,"check_sane_cell(): Cell has aci=0. Dropping.");
- return -1;
- }
-#endif
+int pack_create(uint16_t aci, unsigned char *onion, uint32_t onionlen, unsigned char **cellbuf, unsigned int *cellbuflen)
+{
+ cell_t *c;
+ unsigned char *buf;
+ unsigned int buflen;
+ unsigned int cells;
+ unsigned int dataleft;
+ unsigned int i;
+
+ assert(aci && onion && onionlen && cellbuf && cellbuflen);
-#if 0 /* actually, the length is sometimes encrypted. so it's ok. */
- if(cell->length > 120) {
- log(LOG_DEBUG,"check_sane_cell(): Cell claims to have payload length %d. Dropping.",cell->length);
+ /* copy the onion into a buffer, prepend with onion length */
+ buflen = onionlen+4;
+ buf = (unsigned char *)malloc(buflen);
+ if (!buf) /* malloc() error */
return -1;
+
+ log(LOG_DEBUG,"pack_create() : Setting onion length to %u.",onionlen);
+ *(uint32_t*)buf = htonl(onionlen);
+ memcpy((void *)(buf+4),(void *)onion,onionlen);
+
+ /* calculate number of cells required */
+ if (buflen%CELL_PAYLOAD_SIZE == 0)
+ cells = buflen/CELL_PAYLOAD_SIZE;
+ else
+ cells = buflen/CELL_PAYLOAD_SIZE+1;
+
+ /* allocate memory for the cells */
+ *cellbuflen = cells * sizeof(cell_t);
+ *cellbuf = malloc(*cellbuflen);
+ if (!*cellbuf) /* malloc() error */
+ return -1;
+
+ log(LOG_DEBUG,"pack_create() : Allocated memory for %u cells.",cells);
+
+ /* create cells one by one */
+ dataleft = buflen;
+ for(i=0; i<cells; i++)
+ {
+ log(LOG_DEBUG,"pack_create() : Packing %u bytes of data.",dataleft);
+ if (dataleft >= CELL_PAYLOAD_SIZE)
+ {
+ c = new_create_cell(aci,CELL_PAYLOAD_SIZE,buf+i*CELL_PAYLOAD_SIZE);
+ dataleft -= CELL_PAYLOAD_SIZE;
+ }
+ else
+ c = new_create_cell(aci,dataleft,buf+i*CELL_PAYLOAD_SIZE);
+
+ if (!c) /* cell creation failed */
+ {
+ free((void *)*cellbuf);
+ return -1;
+ } /* cell creation failed */
+
+ log(LOG_DEBUG,"pack_create() : new_create_cell succeeded; copying the cell into output buffer");
+ /* cell has been created, now copy into buffer */
+ memcpy((void *)(*cellbuf+i*sizeof(cell_t)),(void *)c,sizeof(cell_t));
+ free((void *)c);
}
-#endif
-
- return 0; /* looks good */
+
+ free(buf);
+ return 0;
}
diff --git a/src/or/command.c b/src/or/command.c
index 31459ee24..94c3ccc62 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -6,9 +6,6 @@
void command_process_cell(cell_t *cell, connection_t *conn) {
- if(check_sane_cell(cell) < 0)
- return;
-
switch(cell->command) {
case CELL_PADDING:
/* do nothing */
diff --git a/src/or/connection.c b/src/or/connection.c
index e13ec348a..aca385ffb 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -621,14 +621,14 @@ int connection_consider_sending_sendme(connection_t *conn) {
if(circ->n_conn == conn) { /* we're at an exit */
if(circ->p_receive_window < RECEIVE_WINDOW_START-RECEIVE_WINDOW_INCREMENT) {
- log(LOG_DEBUG,"connection_consider_sending_sendme(): Queueing sendme back.");
+ log(LOG_DEBUG,"connection_consider_sending_sendme(): Outbuf %d, Queueing sendme back.", conn->outbuf_flushlen);
circ->p_receive_window += RECEIVE_WINDOW_INCREMENT;
sendme.aci = circ->p_aci;
return connection_write_cell_to_buf(&sendme, circ->p_conn); /* (clobbers sendme) */
}
} else { /* we're at an AP */
if(circ->n_receive_window < RECEIVE_WINDOW_START-RECEIVE_WINDOW_INCREMENT) {
- log(LOG_DEBUG,"connection_consider_sending_sendme(): Queueing sendme forward.");
+ log(LOG_DEBUG,"connection_consider_sending_sendme(): Outbuf %d, Queueing sendme forward.", conn->outbuf_flushlen);
circ->n_receive_window += RECEIVE_WINDOW_INCREMENT;
sendme.aci = circ->n_aci;
return connection_write_cell_to_buf(&sendme, circ->n_conn); /* (clobbers sendme) */
diff --git a/src/or/or.h b/src/or/or.h
index c4fddbf35..0184247ee 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -29,7 +29,6 @@
#include <openssl/evp.h>
#include <openssl/rand.h>
-#include "../common/cell.h"
#include "../common/config.h"
#include "../common/key.h"
#include "../common/log.h"
@@ -115,8 +114,29 @@
#define RECEIVE_WINDOW_START 100
#define RECEIVE_WINDOW_INCREMENT 10
+/* cell commands */
+#define CELL_PADDING 0
+#define CELL_CREATE 1
+#define CELL_DATA 2
+#define CELL_DESTROY 3
+#define CELL_ACK 4
+#define CELL_NACK 5
+#define CELL_SENDME 6
+
+#define CELL_PAYLOAD_SIZE 120
+
typedef uint16_t aci_t;
+/* cell definition */
+typedef struct
+{
+ aci_t aci; /* Anonymous Connection Identifier */
+ unsigned char command;
+ unsigned char length; /* of payload if data cell, else value of sendme */
+ uint32_t seq; /* sequence number */
+ unsigned char payload[120];
+} cell_t;
+
typedef struct
{
@@ -342,7 +362,7 @@ int fetch_from_buf(char *string, size_t string_len,
/********************************* cell.c ***************************/
-int check_sane_cell(cell_t *cell);
+int pack_create(uint16_t aci, unsigned char *onion, uint32_t onionlen, unsigned char **cellbuf, unsigned int *cellbuflen);
/********************************* circuit.c ***************************/