18 public std::enable_shared_from_this<QUICSession>
47 std::vector<uint8_t> read_buffer;
54 to_host(writer_factory_.create_writer_to_outside()),
82 size_t read(uint8_t* data,
size_t size, sockaddr addr,
bool exact =
false)
100 if (read_buffer.size() > 0)
103 "Have existing read_buffer of size: {}", read_buffer.size());
104 offset = std::min(size, read_buffer.size());
105 ::memcpy(data, read_buffer.data(), offset);
107 if (offset < read_buffer.size())
108 read_buffer.erase(read_buffer.begin(), read_buffer.begin() + offset);
119 auto r = handle_recv(data + offset, size - offset, addr);
129 auto total = r + offset;
134 if (exact && (total < size))
137 "Asked for exactly {}, received {}, retrying", size, total);
138 read_buffer.insert(read_buffer.end(), data, data + total);
139 return read(data, size, addr, exact);
149 throw std::runtime_error(
"Called recv_buffered from incorrect thread");
151 LOG_TRACE_FMT(
"QUIC Session recv_buffered with {} bytes", size);
152 pending_reads.emplace_back(
const_cast<uint8_t*
>(data), size, addr);
159 std::shared_ptr<QUICSession>
self;
165 msg->data.self->send_raw_thread(msg->data.data, msg->data.addr);
168 void send_raw(
const uint8_t* data,
size_t size, sockaddr addr)
170 auto msg = std::make_unique<threading::Tmsg<SendRecvMsg>>(&
send_raw_cb);
171 msg->data.self = this->shared_from_this();
172 msg->data.data = std::vector<uint8_t>(data, data + size);
173 msg->data.addr = addr;
183 throw std::runtime_error(
184 "Called send_raw_thread from incorrect thread");
194 const_cast<uint8_t*
>(data.data()), data.size(), addr);
202 const_cast<uint8_t*
>(data.data()), data.size(), addr);
211 throw std::runtime_error(
"Called send_buffered from incorrect thread");
215 const_cast<uint8_t*
>(data.data()), data.size(), addr);
222 throw std::runtime_error(
"Called flush from incorrect thread");
236 int rc = handle_send(write.req, write.len, write.addr);
255 std::shared_ptr<QUICSession>
self;
260 msg->data.self->close_thread();
265 auto msg = std::make_unique<threading::Tmsg<EmptyMsg>>(&
close_cb);
266 msg->data.self = this->shared_from_this();
276 throw std::runtime_error(
"Called close_thread from incorrect thread");
331 int handle_send(
const uint8_t* buf,
size_t len, sockaddr addr)
333 auto [addr_family, addr_data] = udp::sockaddr_encode(addr);
350 int handle_recv(uint8_t* buf,
size_t len, sockaddr addr)
354 throw std::runtime_error(
"Called handle_recv from incorrect thread");
361 if (!memcmp((
void*)&addr, (
void*)&
read.addr,
sizeof(addr)))
364 size_t rd = std::min(len,
read.len);
365 ::memcpy(buf,
read.req, rd);
389 std::shared_ptr<ccf::RPCMap> rpc_map;
390 std::shared_ptr<ccf::RpcHandler> handler;
391 std::shared_ptr<ccf::SessionContext> session_ctx;
405 std::shared_ptr<ccf::RPCMap> rpc_map,
411 session_id(session_id),
412 interface_id(interface_id)
417 send_raw(data.data(), data.size(), addr);
423 ->
recv_(msg->data.data.data(), msg->data.data.size(), msg->data.addr);
428 auto [_, addr_family, addr_data, body] =
429 ringbuffer::read_message<udp::udp_inbound>(data);
431 auto msg = std::make_unique<threading::Tmsg<SendRecvMsg>>(&
recv_cb);
432 msg->data.self = this->shared_from_this();
433 msg->data.data.assign(body.data, body.data + body.size);
434 msg->data.addr = udp::sockaddr_decode(addr_family, addr_data);
440 void recv_(
const uint8_t* data_,
size_t size_, sockaddr addr_)
Definition quic_session.h:388
void send_data(std::span< const uint8_t > data) override
Definition quic_session.h:415
static void recv_cb(std::unique_ptr< threading::Tmsg< SendRecvMsg > > msg)
Definition quic_session.h:420
void recv_(const uint8_t *data_, size_t size_, sockaddr addr_)
Definition quic_session.h:440
void handle_incoming_data(std::span< const uint8_t > data) override
Definition quic_session.h:426
QUICEchoSession(std::shared_ptr< ccf::RPCMap > rpc_map, int64_t session_id, const ccf::ListenInterfaceID &interface_id, ringbuffer::AbstractWriterFactory &writer_factory)
Definition quic_session.h:404
Definition quic_session.h:19
PendingList pending_reads
Definition quic_session.h:43
~QUICSession()
Definition quic_session.h:62
ringbuffer::WriterPtr to_host
Definition quic_session.h:21
QUICSession(int64_t session_id_, ringbuffer::AbstractWriterFactory &writer_factory_)
Definition quic_session.h:52
PendingList pending_writes
Definition quic_session.h:42
void send_raw_thread(const std::vector< uint8_t > &data, sockaddr addr)
Definition quic_session.h:179
void flush()
Definition quic_session.h:218
void close_session() override
Definition quic_session.h:263
std::vector< PendingBuffer > PendingList
Definition quic_session.h:41
Status get_status() const
Definition quic_session.h:34
static void send_raw_cb(std::unique_ptr< threading::Tmsg< SendRecvMsg > > msg)
Definition quic_session.h:163
Status
Definition quic_session.h:26
@ ready
Definition quic_session.h:28
@ handshake
Definition quic_session.h:27
@ authfail
Definition quic_session.h:30
@ closed
Definition quic_session.h:29
@ error
Definition quic_session.h:31
std::vector< uint8_t > peer_cert()
Definition quic_session.h:72
size_t execution_thread
Definition quic_session.h:23
static void close_cb(std::unique_ptr< threading::Tmsg< EmptyMsg > > msg)
Definition quic_session.h:258
std::string hostname()
Definition quic_session.h:67
void close_thread()
Definition quic_session.h:272
void send_buffered(const std::vector< uint8_t > &data, sockaddr addr)
Definition quic_session.h:207
size_t read(uint8_t *data, size_t size, sockaddr addr, bool exact=false)
Definition quic_session.h:82
void send_raw(const uint8_t *data, size_t size, sockaddr addr)
Definition quic_session.h:168
ccf::tls::ConnID session_id
Definition quic_session.h:22
void recv_buffered(const uint8_t *data, size_t size, sockaddr addr)
Definition quic_session.h:145
Definition ring_buffer_types.h:153
static ThreadMessaging & instance()
Definition thread_messaging.h:283
void add_task(uint16_t tid, std::unique_ptr< Tmsg< Payload > > msg)
Definition thread_messaging.h:318
uint16_t get_execution_thread(uint32_t i)
Definition thread_messaging.h:371
#define LOG_TRACE_FMT
Definition logger.h:356
uint16_t get_current_thread_id()
Definition thread_local.cpp:15
int64_t ConnID
Definition custom_protocol_subsystem_interface.h:20
std::string ListenInterfaceID
Definition rpc_context.h:21
Definition quic_session.h:16
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:150
#define RINGBUFFER_TRY_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:258
Pending writes on both host and enclave, with data, length and destination address.
Definition pending_io.h:18
static void clear_empty(std::vector< PendingIO< T > > &list)
Clears a list of PendingIO<T> of all elements that were marked to remove (clear flag == true).
Definition pending_io.h:80
Definition quic_session.h:254
std::shared_ptr< QUICSession > self
Definition quic_session.h:255
Definition quic_session.h:157
sockaddr addr
Definition quic_session.h:160
std::shared_ptr< QUICSession > self
Definition quic_session.h:159
std::vector< uint8_t > data
Definition quic_session.h:158
Definition serializer.h:27
Definition thread_messaging.h:27