17 public std::enable_shared_from_this<QUICSession>
46 std::vector<uint8_t> read_buffer;
53 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.empty())
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())
109 read_buffer.erase(read_buffer.begin(), read_buffer.begin() + offset);
125 auto r = handle_recv(data + offset, size - offset, addr);
135 auto total = r + offset;
140 if (exact && (total < size))
143 "Asked for exactly {}, received {}, retrying", size, total);
144 read_buffer.insert(read_buffer.end(), data, data + total);
145 return read(data, size, addr, exact);
153 LOG_TRACE_FMT(
"QUIC Session recv_buffered with {} bytes", size);
154 pending_reads.emplace_back(
const_cast<uint8_t*
>(data), size, addr);
160 std::shared_ptr<QUICSession>
self;
165 std::shared_ptr<QUICSession> s,
166 std::span<const uint8_t> d,
171 data.assign(d.begin(), d.end());
184 [[nodiscard]]
const std::string&
get_name()
const override
186 static const std::string name =
"quic::SendDataTask";
200 [[nodiscard]]
const std::string&
get_name()
const override
202 static const std::string name =
"quic::RecvDataTask";
207 void send_raw(
const uint8_t* data,
size_t size, sockaddr addr)
210 shared_from_this(), std::span<const uint8_t>{data, size}, addr));
223 const_cast<uint8_t*
>(data.data()), data.size(), addr);
233 const_cast<uint8_t*
>(data.data()), data.size(), addr);
241 const_cast<uint8_t*
>(data.data()), data.size(), addr);
246 auto [_, addr_family, addr_data, body] =
247 ringbuffer::read_message<udp::udp_inbound>(data);
252 udp::sockaddr_decode(addr_family, addr_data)));
255 virtual void recv(
const uint8_t* data_,
size_t size_, sockaddr addr_) = 0;
271 int rc = handle_send(write.req, write.len, write.addr);
289 auto self = shared_from_this();
350 int handle_send(
const uint8_t* buf,
size_t len, sockaddr addr)
352 auto [addr_family, addr_data] = udp::sockaddr_encode(addr);
371 int handle_recv(uint8_t* buf,
size_t len, sockaddr addr)
377 if (memcmp((
void*)&addr, (
void*)&
read.addr,
sizeof(addr)) != 0)
382 size_t rd = std::min(len,
read.len);
383 ::memcpy(buf,
read.req, rd);
410 std::shared_ptr<ccf::RPCMap> rpc_map;
411 std::shared_ptr<ccf::RpcHandler> handler;
412 std::shared_ptr<ccf::SessionContext> session_ctx;
426 std::shared_ptr<ccf::RPCMap> rpc_map_,
431 rpc_map(
std::move(rpc_map_)),
432 session_id(session_id_),
433 interface_id(
std::move(interface_id_)),
439 send_raw(data.data(), data.size(), addr);
442 void recv(
const uint8_t* data_,
size_t size_, sockaddr addr_)
override
static std::shared_ptr< OrderedTasks > create(JobBoard &job_board_, const std::string &name_="[Ordered]")
Definition ordered_tasks.cpp:82
Definition quic_session.h:409
void recv(const uint8_t *data_, size_t size_, sockaddr addr_) override
Definition quic_session.h:442
QUICEchoSession(std::shared_ptr< ccf::RPCMap > rpc_map_, int64_t session_id_, ccf::ListenInterfaceID interface_id_, ringbuffer::AbstractWriterFactory &writer_factory)
Definition quic_session.h:425
void send_data(std::vector< uint8_t > &&data) override
Definition quic_session.h:437
Definition quic_session.h:18
PendingList pending_reads
Definition quic_session.h:42
ringbuffer::WriterPtr to_host
Definition quic_session.h:20
QUICSession(int64_t session_id_, ringbuffer::AbstractWriterFactory &writer_factory_)
Definition quic_session.h:51
PendingList pending_writes
Definition quic_session.h:41
std::shared_ptr< ccf::tasks::OrderedTasks > task_scheduler
Definition quic_session.h:23
void send_raw_thread(const std::vector< uint8_t > &data, sockaddr addr)
Definition quic_session.h:213
void flush()
Definition quic_session.h:257
void close_session() override
Definition quic_session.h:287
void handle_incoming_data(std::span< const uint8_t > data) override
Definition quic_session.h:244
std::vector< PendingBuffer > PendingList
Definition quic_session.h:40
Status get_status() const
Definition quic_session.h:34
virtual void recv(const uint8_t *data_, size_t size_, sockaddr addr_)=0
std::vector< uint8_t > peer_cert()
Definition quic_session.h:72
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
~QUICSession() override
Definition quic_session.h:61
std::string hostname()
Definition quic_session.h:67
void close_thread()
Definition quic_session.h:294
void send_buffered(const std::vector< uint8_t > &data, sockaddr addr)
Definition quic_session.h:238
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:207
ccf::tls::ConnID session_id
Definition quic_session.h:21
void recv_buffered(const uint8_t *data, size_t size, sockaddr addr)
Definition quic_session.h:151
Definition ring_buffer_types.h:157
#define LOG_TRACE_FMT
Definition internal_logger.h:13
TaskAction make_basic_action(Ts &&... ts)
Definition ordered_tasks.h:47
JobBoard & get_main_job_board()
Definition task_system.cpp:53
int64_t ConnID
Definition custom_protocol_subsystem_interface.h:20
std::string ListenInterfaceID
Definition rpc_context.h:21
Definition quic_session.h:15
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:154
#define RINGBUFFER_TRY_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:262
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:79
Definition ordered_tasks.h:13
Definition quic_session.h:192
const std::string & get_name() const override
Definition quic_session.h:200
void do_action() override
Definition quic_session.h:195
Definition quic_session.h:176
void do_action() override
Definition quic_session.h:179
const std::string & get_name() const override
Definition quic_session.h:184
Definition quic_session.h:159
SessionDataTask(std::shared_ptr< QUICSession > s, std::span< const uint8_t > d, sockaddr sa)
Definition quic_session.h:164
sockaddr addr
Definition quic_session.h:162
std::shared_ptr< QUICSession > self
Definition quic_session.h:160
std::vector< uint8_t > data
Definition quic_session.h:161
Definition serializer.h:27