Commit 74787aa2 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

cell.c is now obsolete


svn:r133
parent bf53852a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ bin_PROGRAMS = or

or_LDADD = -L../common -lor

or_SOURCES = buffers.c cell.c circuit.c command.c connection.c \
or_SOURCES = buffers.c circuit.c command.c connection.c \
             connection_exit.c connection_ap.c connection_op.c connection_or.c config.c \
             main.c onion.c routers.c directory.c

src/or/cell.c

deleted100644 → 0
+0 −100
Original line number Diff line number Diff line
/* Copyright 2001,2002 Roger Dingledine, Matej Pfajfar. */
/* See LICENSE for licensing information */
/* $Id$ */

#include "or.h"

static cell_t *new_create_cell(uint16_t aci, unsigned char length, unsigned char *buf)
{
  cell_t *c = NULL;
  int retval;

  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 = crypto_pseudo_rand(CELL_PAYLOAD_SIZE-length, (unsigned char *)(c->payload+length));
    if (retval) /* RAND_pseudo_bytes() error */
    {
      free((void *)c);
      return NULL;
    } /* RAND_pseudo_bytes() error */
    
    return c;
  } /* valid parameters */
  else /* invalid parameters */
    return NULL;
}

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);

  /* 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);
  }
  
  free(buf);
  return 0;
}
+45 −24
Original line number Diff line number Diff line
@@ -31,13 +31,50 @@ void command_process_cell(cell_t *cell, connection_t *conn) {
  }
}

/* helper function for command_process_create_cell */
static int deliver_onion_to_conn(aci_t aci, unsigned char *onion, uint32_t onionlen, connection_t *conn) {
  char *buf;
  int buflen, dataleft;
  cell_t cell;
 
  assert(aci && onion && onionlen);
 
  buflen = onionlen+4;
  buf = malloc(buflen);
  if(!buf)
    return -1;
 
  log(LOG_DEBUG,"deliver_onion_to_conn(): Setting onion length to %u.",onionlen);
  *(uint32_t*)buf = htonl(onionlen);
  memcpy((void *)(buf+4),(void *)onion,onionlen);
 
  dataleft = buflen;
  while(dataleft > 0) {
    memset(&cell,0,sizeof(cell_t));
    cell.command = CELL_CREATE;
    cell.aci = aci;
    if(dataleft >= CELL_PAYLOAD_SIZE)
      cell.length = CELL_PAYLOAD_SIZE;
    else
      cell.length = dataleft;
    memcpy(cell.payload, buf+buflen-dataleft, cell.length);
    dataleft -= cell.length;
 
    log(LOG_DEBUG,"deliver_onion_to_conn(): Delivering create cell, payload %d bytes.",cell.length);
    if(connection_write_cell_to_buf(&cell, conn) < 0) {
      log(LOG_DEBUG,"deliver_onion_to_conn(): Could not buffer new create cells. Closing.");
      free(buf);
      return -1;
    }
  }
  free(buf);
  return 0;
}

void command_process_create_cell(cell_t *cell, connection_t *conn) {
  circuit_t *circ;
  connection_t *n_conn;
  unsigned char *cellbuf; /* array of cells */
  int cellbuflen; /* size of cellbuf in bytes */
  cell_t *tmpcell; /* pointer to an arbitrary cell */
  int retval, i;
  int retval;

  circ = circuit_get_by_aci_conn(cell->aci, conn);

@@ -122,30 +159,14 @@ void command_process_create_cell(cell_t *cell, connection_t *conn) {
    pad_onion(circ->onion,circ->onionlen, sizeof(onion_layer_t));
    log(LOG_DEBUG,"command_process_create_cell(): Padded the onion with random data.");

    retval = pack_create(circ->n_aci, circ->onion, circ->onionlen, &cellbuf, &cellbuflen);
    retval = deliver_onion_to_conn(circ->n_aci, circ->onion, circ->onionlen, n_conn); 
//    retval = pack_create(circ->n_aci, circ->onion, circ->onionlen, &cellbuf, &cellbuflen);
    free((void *)circ->onion);
    circ->onion = NULL;
    if (retval == -1) /* pack_create() error */
    {
      log(LOG_DEBUG,"command_process_create_cell(): Could not pack the onion into CREATE cells. Closing the connection.");
    if (retval == -1) {
      log(LOG_DEBUG,"command_process_create_cell(): Could not deliver the onion to next conn. Closing.");
      circuit_close(circ);
      return;
    }
    log(LOG_DEBUG,"command_process_create_cell(): Onion packed into CREATE cells. Buffering the cells.");
    /* queue the create cells for transmission to the next hop */
    tmpcell = (cell_t *)cellbuf;
    for (i=0;i<cellbuflen/sizeof(cell_t);i++)
    {
      retval = connection_write_cell_to_buf(tmpcell, n_conn);
      if (retval == -1) /* buffering failed, drop the connection */
      {
        log(LOG_DEBUG,"command_process_create_cell(): Could not buffer new create cells. Closing.");
        circuit_close(circ);
        return;
      }
      tmpcell++;
    }
    free((void *)cellbuf);
    return;

  } else { /* this is destined for an exit */
+4 −1
Original line number Diff line number Diff line
@@ -10,7 +10,10 @@
 */

#include "or.h"
#include <string.h>

#ifndef POPT_TABLEEND /* handle popt 1.6 before 1.6.2 */
#define POPT_TABLEEND { NULL, '\0', 0, 0, 0, NULL, NULL }
#endif

const char * 
basename(const char *filename)