Orbit Framework
An ultra-modern, asynchronous, cross-platform C++ Web Framework.
Loading...
Searching...
No Matches
QuicConnection.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <ngtcp2/ngtcp2.h>
4#include <ngtcp2/ngtcp2_crypto.h>
5#if defined(USE_NGTCP2_CRYPTO_OSSL)
6#include <ngtcp2/ngtcp2_crypto_ossl.h>
7#define NGTCP2_CRYPTO_CONFIGURE_SERVER_CONTEXT(ssl_ctx) (0)
8#elif defined(USE_NGTCP2_CRYPTO_QUICTLS)
9#include <ngtcp2/ngtcp2_crypto_quictls.h>
10#define NGTCP2_CRYPTO_CONFIGURE_SERVER_CONTEXT(ssl_ctx) ngtcp2_crypto_quictls_configure_server_context(ssl_ctx)
11#else
12#error "No supported ngtcp2 crypto backend found"
13#endif
14
15#include <openssl/ssl.h>
16#include <vector>
17#include <memory>
18#include <chrono>
20
21namespace server {
22
23class QuicConnectionManager;
24class QuicHttp3Session;
25
30public:
40 QuicConnection(QuicConnectionManager& manager, const ngtcp2_cid& client_dcid, const ngtcp2_cid& client_scid, const ngtcp2_cid& server_scid, const sockaddr_in& remote_addr, SSL_CTX* ssl_ctx);
42
49 void process_packet(const uint8_t* data, size_t datalen, const sockaddr_in& remote_addr);
50
54 void handle_expiry();
55
59 void send_pending_data();
60
61private:
62 QuicConnectionManager& manager_;
63 sockaddr_in local_addr_;
64 sockaddr_in remote_addr_;
65 ngtcp2_conn* conn_{nullptr};
66 SSL* ssl_ = nullptr;
67#if defined(USE_NGTCP2_CRYPTO_OSSL)
68 ngtcp2_crypto_ossl_ctx* tls_ctx_ = nullptr;
69#endif
70 ngtcp2_crypto_conn_ref conn_ref_{};
71
72 std::unique_ptr<QuicHttp3Session> h3_session_;
73
74 ngtcp2_tstamp get_timestamp() const;
75 bool init_ssl(SSL_CTX* ssl_ctx);
76
77 static int on_handshake_completed(ngtcp2_conn *conn, void *user_data);
78 static void rand_cb(uint8_t *dest, size_t destlen, const ngtcp2_rand_ctx *rand_ctx);
79 static int get_new_connection_id_cb(ngtcp2_conn *conn, ngtcp2_cid *cid, uint8_t *token, size_t cidlen, void *user_data);
80 static int get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, void *user_data);
81 static int on_recv_stream_data(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, uint64_t offset, const uint8_t *data, size_t datalen, void *user_data, void *stream_user_data);
82 static int on_get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, uint8_t *token, size_t cidlen, void *user_data);
83};
84
85} // namespace server
Manages QUIC connections.
Definition QuicConnectionManager.hpp:36
Represents a single QUIC connection.
Definition QuicConnection.hpp:29
void process_packet(const uint8_t *data, size_t datalen, const sockaddr_in &remote_addr)
Processes an incoming QUIC packet.
Definition QuicConnection.cpp:120
void send_pending_data()
Sends any pending data for the connection.
Definition QuicConnection.cpp:147
~QuicConnection()
Definition QuicConnection.cpp:82
void handle_expiry()
Handles connection expiry.
Definition QuicConnection.cpp:137
Definition Http2Session.hpp:17