17static int pump_refill(DetRelayEnd *src, DetRelayEnd *dst, uint8_t *buf, uint16_t *len, uint16_t *off,
bool *src_eof,
29 int s = dst->send(dst->ctx, buf, *len);
33 *counter += (uint32_t)s;
41static int pump(DetRelayEnd *src, DetRelayEnd *dst, uint8_t *buf, uint16_t *len, uint16_t *off,
bool *src_eof,
42 bool *dir_done,
bool *dst_shut_sent, uint32_t *counter)
50 int s = dst->send(dst->ctx, buf + *off, (
size_t)(*len - *off));
53 *off = (uint16_t)(*off + s);
54 *counter += (uint32_t)s;
63 if (!*src_eof && pump_refill(src, dst, buf, len, off, src_eof, counter) < 0)
68 if (*src_eof && *off >= *len)
71 if (dst->shutdown && !*dst_shut_sent)
73 dst->shutdown(dst->ctx);
74 *dst_shut_sent =
true;
80void det_relay_init(DetRelay *r,
const DetRelayEnd *client,
const DetRelayEnd *origin)
82 if (!r || !client || !origin)
84 memset(r, 0,
sizeof(*r));
89DetRelayStatus det_relay_step(DetRelay *r)
92 return DetRelayStatus::DET_RELAY_ERROR;
94 if (pump(&r->a, &r->b, r->buf_a2b, &r->a2b_len, &r->a2b_off, &r->a_eof, &r->a2b_done, &r->b_shut_sent,
96 return DetRelayStatus::DET_RELAY_ERROR;
98 if (pump(&r->b, &r->a, r->buf_b2a, &r->b2a_len, &r->b2a_off, &r->b_eof, &r->b2a_done, &r->a_shut_sent,
100 return DetRelayStatus::DET_RELAY_ERROR;
102 return (r->a2b_done && r->b2a_done) ? DetRelayStatus::DET_RELAY_DONE : DetRelayStatus::DET_RELAY_RUNNING;
105void det_relay_note_eof(DetRelay *r,
bool origin)
#define DETWS_RELAY_BUF
Per-direction relay buffer size (bytes) for services/relay (DETWS_ENABLE_RELAY).
TCP relay / DNAT port forwarding (DETWS_ENABLE_RELAY) - a bidirectional byte pump.