#ifndef OSSL_QUIC_TSERVER_H
#define OSSL_QUIC_TSERVER_H
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include "internal/quic_stream.h"
#include "internal/quic_channel.h"
#include "internal/statem.h"
#include "internal/time.h"
#ifndef OPENSSL_NO_QUIC
typedef struct quic_tserver_st QUIC_TSERVER;
typedef struct quic_tserver_args_st {
OSSL_LIB_CTX *libctx;
const char *propq;
SSL_CTX *ctx;
BIO *net_rbio, *net_wbio;
OSSL_TIME (*now_cb)(void *arg);
void *now_cb_arg;
const unsigned char *alpn;
size_t alpnlen;
} QUIC_TSERVER_ARGS;
QUIC_TSERVER *ossl_quic_tserver_new(const QUIC_TSERVER_ARGS *args,
const char *certfile, const char *keyfile);
void ossl_quic_tserver_free(QUIC_TSERVER *srv);
int ossl_quic_tserver_set_plain_packet_mutator(QUIC_TSERVER *srv,
ossl_mutate_packet_cb mutatecb,
ossl_finish_mutate_cb finishmutatecb,
void *mutatearg);
int ossl_quic_tserver_set_handshake_mutator(QUIC_TSERVER *srv,
ossl_statem_mutate_handshake_cb mutate_handshake_cb,
ossl_statem_finish_mutate_handshake_cb finish_mutate_handshake_cb,
void *mutatearg);
int ossl_quic_tserver_tick(QUIC_TSERVER *srv);
int ossl_quic_tserver_is_connected(QUIC_TSERVER *srv);
int ossl_quic_tserver_is_handshake_confirmed(const QUIC_TSERVER *srv);
int ossl_quic_tserver_is_term_any(const QUIC_TSERVER *srv);
const QUIC_TERMINATE_CAUSE *
ossl_quic_tserver_get_terminate_cause(const QUIC_TSERVER *srv);
int ossl_quic_tserver_is_terminated(const QUIC_TSERVER *srv);
size_t ossl_quic_tserver_get_short_header_conn_id_len(const QUIC_TSERVER *srv);
int ossl_quic_tserver_read(QUIC_TSERVER *srv,
uint64_t stream_id,
unsigned char *buf,
size_t buf_len,
size_t *bytes_read);
int ossl_quic_tserver_has_read_ended(QUIC_TSERVER *srv, uint64_t stream_id);
int ossl_quic_tserver_write(QUIC_TSERVER *srv,
uint64_t stream_id,
const unsigned char *buf,
size_t buf_len,
size_t *bytes_written);
int ossl_quic_tserver_conclude(QUIC_TSERVER *srv, uint64_t stream_id);
int ossl_quic_tserver_stream_new(QUIC_TSERVER *srv,
int is_uni,
uint64_t *stream_id);
BIO *ossl_quic_tserver_get0_rbio(QUIC_TSERVER *srv);
SSL_CTX *ossl_quic_tserver_get0_ssl_ctx(QUIC_TSERVER *srv);
int ossl_quic_tserver_stream_has_peer_stop_sending(QUIC_TSERVER *srv,
uint64_t stream_id,
uint64_t *app_error_code);
int ossl_quic_tserver_stream_has_peer_reset_stream(QUIC_TSERVER *srv,
uint64_t stream_id,
uint64_t *app_error_code);
int ossl_quic_tserver_set_new_local_cid(QUIC_TSERVER *srv,
const QUIC_CONN_ID *conn_id);
uint64_t ossl_quic_tserver_pop_incoming_stream(QUIC_TSERVER *srv);
int ossl_quic_tserver_is_stream_totally_acked(QUIC_TSERVER *srv,
uint64_t stream_id);
int ossl_quic_tserver_get_net_read_desired(QUIC_TSERVER *srv);
int ossl_quic_tserver_get_net_write_desired(QUIC_TSERVER *srv);
OSSL_TIME ossl_quic_tserver_get_deadline(QUIC_TSERVER *srv);
int ossl_quic_tserver_shutdown(QUIC_TSERVER *srv, uint64_t app_error_code);
int ossl_quic_tserver_ping(QUIC_TSERVER *srv);
void ossl_quic_tserver_set_msg_callback(QUIC_TSERVER *srv,
void (*f)(int write_p, int version,
int content_type,
const void *buf, size_t len,
SSL *ssl, void *arg),
void *arg);
QUIC_CHANNEL *ossl_quic_tserver_get_channel(QUIC_TSERVER *srv);
int ossl_quic_tserver_new_ticket(QUIC_TSERVER *srv);
int ossl_quic_tserver_set_max_early_data(QUIC_TSERVER *srv,
uint32_t max_early_data);
void ossl_quic_tserver_set_psk_find_session_cb(QUIC_TSERVER *srv,
SSL_psk_find_session_cb_func cb);
#endif
#endif