9#define RELAY_MSG_PRIVATE
22#include "core/or/or_circuit_st.h"
44 memset(msg, 0,
sizeof(*msg));
48#define V0_CMD_OFFSET 0
49#define V0_STREAM_ID_OFFSET 3
50#define V0_LEN_OFFSET 9
51#define V0_PAYLOAD_OFFSET 11
54#define V1_CMD_OFFSET 16
55#define V1_LEN_OFFSET 17
56#define V1_STREAM_ID_OFFSET 19
57#define V1_PAYLOAD_OFFSET_NO_STREAM_ID 19
58#define V1_PAYLOAD_OFFSET_WITH_STREAM_ID 21
71 void *alloc = tor_malloc_zero(
sizeof(
relay_msg_t) + msg->length);
73 uint8_t *body = ((uint8_t*)alloc) +
sizeof(
relay_msg_t);
75 memcpy(new_msg, msg,
sizeof(*msg));
77 memcpy(body, msg->body, msg->length);
87relay_cell_pad(
cell_t *cell,
size_t end_of_message)
90 const size_t skip = 4;
98 &cell->
payload[end_of_message + skip],
114 uint8_t *out = cell_out->
payload;
116 out[V0_CMD_OFFSET] = (uint8_t) msg->command;
117 set_uint16(out+V0_STREAM_ID_OFFSET, htons(msg->stream_id));
118 set_uint16(out+V0_LEN_OFFSET, htons(msg->length));
138 uint8_t *out = cell_out->
payload;
139 out[V1_CMD_OFFSET] = msg->command;
140 set_uint16(out+V1_LEN_OFFSET, htons(msg->length));
141 size_t payload_offset;
142 if (expects_streamid) {
146 set_uint16(out+V1_STREAM_ID_OFFSET, htons(msg->stream_id));
147 payload_offset = V1_PAYLOAD_OFFSET_WITH_STREAM_ID;
153 payload_offset = V1_PAYLOAD_OFFSET_NO_STREAM_ID;
156 memcpy(out + payload_offset, msg->body, msg->length);
157 relay_cell_pad(cell_out, payload_offset + msg->length);
169 out->is_relay_early = (cell->
command == CELL_RELAY_EARLY);
171 const uint8_t *body = cell->
payload;
172 out->command =
get_uint8(body + V0_CMD_OFFSET);
173 out->stream_id = ntohs(
get_uint16(body + V0_STREAM_ID_OFFSET));
174 out->length = ntohs(
get_uint16(body + V0_LEN_OFFSET));
179 out->body = body + V0_PAYLOAD_OFFSET;
192 out->is_relay_early = (cell->
command == CELL_RELAY_EARLY);
194 const uint8_t *body = cell->
payload;
195 out->command =
get_uint8(body + V1_CMD_OFFSET);
199 out->length = ntohs(
get_uint16(body + V1_LEN_OFFSET));
200 size_t payload_offset;
202 out->stream_id = ntohs(
get_uint16(body + V1_STREAM_ID_OFFSET));
203 payload_offset = V1_PAYLOAD_OFFSET_WITH_STREAM_ID;
205 payload_offset = V1_PAYLOAD_OFFSET_NO_STREAM_ID;
210 out->body = body + payload_offset;
229 memset(cell_out, 0,
sizeof(
cell_t));
230 cell_out->
command = msg->is_relay_early ?
231 CELL_RELAY_EARLY : CELL_RELAY;
static void set_uint16(void *cp, uint16_t v)
static uint16_t get_uint16(const void *cp)
static uint8_t get_uint8(const void *cp)
Fixed-size cell structure.
Header file for circuitlist.c.
Header file for config.c.
Path structures for origin circuits.
Common functions for using (pseudo-)random number generators.
crypto_fast_rng_t * get_thread_fast_rng(void)
void crypto_fast_rng_getbytes(crypto_fast_rng_t *rng, uint8_t *out, size_t n)
#define CELL_PAYLOAD_SIZE
static bool is_known_relay_command(const uint8_t cmd)
#define RELAY_HEADER_SIZE_V0
#define RELAY_PAYLOAD_SIZE_MAX
static int encode_v0_cell(const relay_msg_t *msg, cell_t *cell_out)
int relay_msg_encode_cell(relay_cell_fmt_t format, const relay_msg_t *msg, cell_t *cell_out)
static int decode_v1_cell(const cell_t *cell, relay_msg_t *out)
void relay_msg_clear(relay_msg_t *msg)
relay_msg_t * relay_msg_copy(const relay_msg_t *msg)
static int encode_v1_cell(const relay_msg_t *msg, cell_t *cell_out)
static int decode_v0_cell(const cell_t *cell, relay_msg_t *out)
void relay_msg_free_(relay_msg_t *msg)
int relay_msg_decode_cell_in_place(relay_cell_fmt_t format, const cell_t *cell, relay_msg_t *msg_out)
relay_msg_t * relay_msg_decode_cell(relay_cell_fmt_t format, const cell_t *cell)
Header file for relay_msg.c.
static bool relay_cmd_expects_streamid_in_v1(uint8_t relay_command)
static size_t relay_cell_max_payload_size(relay_cell_fmt_t format, uint8_t relay_command)
A relay message which contains a relay command and parameters, if any, that is from a relay cell.
uint8_t payload[CELL_PAYLOAD_SIZE]
#define tor_fragile_assert()
#define IF_BUG_ONCE(cond)