diff options
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r-- | src/or/connection_edge.c | 56 |
1 files changed, 9 insertions, 47 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index f8b90557e..77da7b211 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -18,56 +18,21 @@ static uint32_t client_dns_lookup_entry(const char *address); static void client_dns_set_entry(const char *address, uint32_t val); void relay_header_pack(char *dest, const relay_header_t *src) { - uint16_t tmp; - - /* we have to do slow memcpy's here, because we screwed up - * and made our cell payload not word-aligned. we should fix - * this someday. - */ - *(uint8_t*)(dest) = src->command; - tmp = htons(src->recognized); - memcpy(dest+1, &tmp, 2); - - tmp = htons(src->stream_id); - memcpy(dest+3, &tmp, 2); - - memcpy(dest+5, src->integrity, 4); - - tmp = htons(src->length); - memcpy(dest+9, &tmp, 2); - -#if 0 - *(uint8_t*)(dest) = src->command; - *(uint16_t*)(dest+1) = htons(src->recognized); - *(uint16_t*)(dest+3) = htons(src->stream_id); + set_uint16(dest+1, htons(src->recognized)); + set_uint16(dest+3, htons(src->stream_id)); memcpy(dest+5, src->integrity, 4); - *(uint16_t*)(dest+9) = htons(src->length); -#endif + set_uint16(dest+9, htons(src->length)); } void relay_header_unpack(relay_header_t *dest, const char *src) { dest->command = *(uint8_t*)(src); - memcpy(&dest->recognized, src+1, 2); - dest->recognized = ntohs(dest->recognized); - - memcpy(&dest->stream_id, src+3, 2); - dest->stream_id = ntohs(dest->stream_id); - + dest->recognized = ntohs(get_uint16(src+1)); + dest->stream_id = ntohs(get_uint16(src+3)); memcpy(dest->integrity, src+5, 4); - - memcpy(&dest->length, src+9, 2); - dest->length = ntohs(dest->length); - -#if 0 - dest->command = *(uint8_t*)(src); - dest->recognized = ntohs(*(uint16_t*)(src+1)); - dest->stream_id = ntohs(*(uint16_t*)(src+3)); - memcpy(dest->integrity, src+5, 4); - dest->length = ntohs(*(uint16_t*)(src+9)); -#endif + dest->length = ntohs(get_uint16(src+9)); } /* mark and return -1 if there was an unexpected error with the conn, @@ -178,8 +143,7 @@ int connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_lay payload[0] = reason; if(reason == END_STREAM_REASON_EXITPOLICY) { - uint32_t tmp = htonl(conn->addr); - memcpy(payload+1, &tmp, 4); + set_uint32(payload+1, htonl(conn->addr)); // *(uint32_t *)(payload+1) = htonl(conn->addr); payload_len += 4; } @@ -288,8 +252,7 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, // log_fn(LOG_INFO,"Connected! Notifying application."); conn->state = AP_CONN_STATE_OPEN; if (rh.length >= 4) { - memcpy(&addr, cell->payload + RELAY_HEADER_SIZE, 4); - addr = ntohl(addr); + addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE)); client_dns_set_entry(conn->socks_request->address, addr); } log_fn(LOG_INFO,"'connected' received after %d seconds.", @@ -370,8 +333,7 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, * we try a new exit node. * cell->payload+RELAY_HEADER_SIZE+1 holds the destination addr. */ - memcpy(&addr, cell->payload+RELAY_HEADER_SIZE+1, 4); - addr = ntohl(addr); + addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+1)); client_dns_set_entry(conn->socks_request->address, addr); /* conn->purpose is still set to general */ conn->state = AP_CONN_STATE_CIRCUIT_WAIT; |