aboutsummaryrefslogtreecommitdiff
path: root/src/or/connection_edge.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r--src/or/connection_edge.c56
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;