9#define CONFLUX_CELL_PRIVATE
20#include "trunnel/conflux.h"
23#include "core/or/or_circuit_st.h"
29 ssize_t cell_len = -1;
30 trn_cell_conflux_link_t *cell = NULL;
31 trn_cell_conflux_link_payload_v1_t *payload = NULL;
35 cell = trn_cell_conflux_link_new();
36 trn_cell_conflux_link_set_version(cell, 0x01);
38 payload = trn_cell_conflux_link_payload_v1_new();
41 size_t nonce_len = trn_cell_conflux_link_payload_v1_getlen_nonce(payload);
43 memcpy(trn_cell_conflux_link_payload_v1_getarray_nonce(payload),
44 link->nonce, nonce_len);
47 trn_cell_conflux_link_payload_v1_set_last_seqno_recv(payload,
48 link->last_seqno_recv);
49 trn_cell_conflux_link_payload_v1_set_last_seqno_sent(payload,
50 link->last_seqno_sent);
53 trn_cell_conflux_link_payload_v1_set_desired_ux(payload, link->desired_ux);
56 ssize_t pay_len = trn_cell_conflux_link_payload_v1_encoded_len(payload);
59 trn_cell_conflux_link_setlen_payload(cell, pay_len);
61 trn_cell_conflux_link_payload_v1_encode(
62 trn_cell_conflux_link_getarray_payload(cell),
63 trn_cell_conflux_link_getlen_payload(cell), payload);
66 cell_len = trn_cell_conflux_link_encode(cell_out,
69 trn_cell_conflux_link_payload_v1_free(payload);
70 trn_cell_conflux_link_free(cell);
79 return build_link_cell(link, cell_out);
83build_linked_ack_cell(uint8_t *cell_out)
85 ssize_t cell_len = -1;
86 trn_cell_conflux_linked_ack_t *cell = NULL;
90 cell = trn_cell_conflux_linked_ack_new();
91 cell_len = trn_cell_conflux_linked_ack_encode(cell_out,
95 trn_cell_conflux_linked_ack_free(cell);
108 log_info(
LD_CIRC,
"Sending CONFLUX_LINK cell onto origin circuit");
111 cell_len = build_link_cell(link, payload);
112 if (BUG(cell_len < 0)) {
113 log_info(
LD_CIRC,
"Unable to build CONFLUX_LINK cell.");
114 circuit_mark_for_close(
TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
119 if (relay_send_command_from_edge(CONTROL_CELL_ID,
TO_CIRCUIT(circ),
120 RELAY_COMMAND_CONFLUX_LINK,
121 (
char *) payload, cell_len,
123 log_info(
LD_CIRC,
"Unable to send CONFLUX_LINK cell.");
142 log_info(
LD_CIRC,
"Sending CONFLUX_LINKED cell onto OR circuit");
145 cell_len = build_linked_cell(link, payload);
146 if (BUG(cell_len < 0)) {
147 log_info(
LD_CIRC,
"Unable to build CONFLUX_LINKED cell.");
148 circuit_mark_for_close(
TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
153 if (relay_send_command_from_edge(CONTROL_CELL_ID,
TO_CIRCUIT(circ),
154 RELAY_COMMAND_CONFLUX_LINKED,
155 (
char *) payload, cell_len, NULL) < 0) {
156 log_info(
LD_CIRC,
"Unable to send CONFLUX_LINKED cell.");
174 log_info(
LD_CIRC,
"Sending CONFLUX_LINKED_ACK cell onto origin circuit");
177 cell_len = build_linked_ack_cell(payload);
178 if (BUG(cell_len < 0)) {
179 log_info(
LD_CIRC,
"Unable to build CONFLUX_LINKED_ACK cell.");
180 circuit_mark_for_close(
TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
185 if (relay_send_command_from_edge(CONTROL_CELL_ID,
TO_CIRCUIT(circ),
186 RELAY_COMMAND_CONFLUX_LINKED_ACK,
187 (
char *) payload, cell_len,
189 log_info(
LD_CIRC,
"Unable to send CONFLUX_LINKED_ACK cell.");
200conflux_cell_parse_link_v1(
const trn_cell_conflux_link_t *trn_link)
203 trn_cell_conflux_link_payload_v1_t *payload = NULL;
205 if (trn_cell_conflux_link_payload_v1_parse(&payload,
206 trn_cell_conflux_link_getconstarray_payload(trn_link),
207 trn_cell_conflux_link_getlen_payload(trn_link)) < 0) {
209 "Unable to parse CONFLUX_LINK v1 payload.");
213 link = tor_malloc_zero(
sizeof(*link));
214 link->version = trn_cell_conflux_link_get_version(trn_link);
216 trn_cell_conflux_link_payload_v1_get_desired_ux(payload);
217 link->last_seqno_recv =
218 trn_cell_conflux_link_payload_v1_get_last_seqno_recv(payload);
219 link->last_seqno_sent =
220 trn_cell_conflux_link_payload_v1_get_last_seqno_sent(payload);
222 trn_cell_conflux_link_payload_v1_getconstarray_nonce(payload),
223 trn_cell_conflux_link_payload_v1_getlen_nonce(payload));
226 trn_cell_conflux_link_payload_v1_free(payload);
234 trn_cell_conflux_link_t *trn_cell = NULL;
238 if (trn_cell_conflux_link_parse(&trn_cell, msg->body, msg->length) < 0) {
240 "Unable to parse CONFLUX_LINK cell.");
244 uint8_t version = trn_cell_conflux_link_get_version(trn_cell);
247 link = conflux_cell_parse_link_v1(trn_cell);
251 "Unsupported version %d in CONFLUX_LINK cell", version);
256 trn_cell_conflux_link_free(trn_cell);
264 return conflux_cell_parse_link(msg);
268conflux_cell_new_link(
const uint8_t *nonce, uint64_t last_seqno_sent,
269 uint64_t last_seqno_recv, uint8_t ux)
273 link->version = 0x01;
274 link->desired_ux = ux;
276 link->last_seqno_sent = last_seqno_sent;
277 link->last_seqno_recv = last_seqno_recv;
278 memcpy(link->nonce, nonce,
sizeof(link->nonce));
290 trn_cell_conflux_switch_t *switch_cell = NULL;
294 if (trn_cell_conflux_switch_parse(&switch_cell,
295 msg->body, msg->length) < 0) {
296 log_warn(
LD_BUG,
"Failed to parse switch cell");
302 seq = trn_cell_conflux_switch_get_seqnum(switch_cell);
304 trn_cell_conflux_switch_free(switch_cell);
313 trn_cell_conflux_switch_t *switch_cell = trn_cell_conflux_switch_new();
320 trn_cell_conflux_switch_set_seqnum(switch_cell, (uint32_t)relative_seq);
322 ssize_t len = trn_cell_conflux_switch_encode(
326 log_warn(
LD_BUG,
"Failed to encode conflux switch cell");
333 relay_send_command_from_edge(0, send_circ,
334 RELAY_COMMAND_CONFLUX_SWITCH,
335 (
const char*)payload, len,
338 relay_send_command_from_edge(0, send_circ,
339 RELAY_COMMAND_CONFLUX_SWITCH,
340 (
const char*)payload, len,
345 trn_cell_conflux_switch_free(switch_cell);
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *x)
Header file for circuitlist.c.
#define CIRCUIT_IS_ORIGIN(c)
Header file for config.c.
Public APIs for conflux multipath support.
uint32_t conflux_cell_parse_switch(const relay_msg_t *msg)
bool conflux_send_switch_command(circuit_t *send_circ, uint64_t relative_seq)
Header file for conflux_cell.c.
Path structures for origin circuits.
Common functions for using (pseudo-)random number generators.
#define log_fn(severity, domain, args,...)
#define RELAY_PAYLOAD_SIZE_MAX
Origin circuit structure.
struct crypt_path_t * prev