mini/mini_server.h (85 lines of code) (raw):

#ifndef XQC_MINI_SERVER_H #define XQC_MINI_SERVER_H #include <ctype.h> #include <stdio.h> #include <errno.h> #include <memory.h> #include <stdlib.h> #include <xquic/xquic.h> #include <event2/event.h> #include <xquic/xqc_http3.h> #include <xquic/xquic_typedef.h> #include "common.h" #include "../demo/xqc_hq.h" #include "../tests/platform.h" #include "mini_server_cb.h" #define DEFAULT_IP "127.0.0.1" #define DEFAULT_PORT 8443 #define XQC_PACKET_BUF_LEN 1500 /** * net config definition * net config is those arguments about socket information * all configuration on net should be put under this section */ typedef struct xqc_mini_svr_net_config_s { /* server addr info */ char ip[64]; short port; /* idle persist timeout */ int conn_timeout; } xqc_mini_svr_net_config_t; /** * quic config definition * quic config is those arguments required by quic features, including connection settings, ssl configs, etc. * all configuration on quic should be put under this section */ #define SESSION_TICKET_KEY_FILE "session_ticket.key" #define SESSION_TICKET_KEY_BUF_LEN 2048 typedef struct xqc_mini_svr_quic_config_s { /* cipher config */ char ciphers[CIPHER_SUIT_LEN]; char groups[TLS_GROUPS_LEN]; /* multipath */ int multipath; // mp option, 0: disable, 1: enable char mp_sched[32]; // mp scheduler, minrtt/backup /* congestion control */ CC_TYPE cc; // cc algrithm, bbr/cubic /* server should load session ticket key to enable 0-RTT */ char session_ticket_key_data[SESSION_TICKET_KEY_BUF_LEN]; size_t session_ticket_key_len; } xqc_mini_svr_quic_config_t; /** * the environment config definition * environment config is those arguments about IO inputs and outputs * all configuration on environment should be put under this section */ #define LOG_PATH "slog.log" #define KEY_PATH "skeys.log" #define SOURCE_DIR "." #define PRIV_KEY_PATH "server.key" #define CERT_PEM_PATH "server.crt" typedef struct xqc_mini_svr_env_config_s { /* log config */ char log_path[PATH_LEN]; /* tls certificates */ char private_key_file[PATH_LEN]; char cert_file[PATH_LEN]; /* key export */ char key_out_path[PATH_LEN]; } xqc_mini_svr_env_config_t; typedef struct xqc_mini_svr_args_s { /* network args */ xqc_mini_svr_net_config_t net_cfg; /* xquic args */ xqc_mini_svr_quic_config_t quic_cfg; /* environment args */ xqc_mini_svr_env_config_t env_cfg; } xqc_mini_svr_args_t; typedef struct xqc_mini_svr_ctx_s { struct event_base *eb; /* used to remember fd type to send stateless reset */ int current_fd; xqc_engine_t *engine; // xquic engine for current context struct event *ev_engine; xqc_mini_svr_args_t *args; // server arguments for current context int log_fd; int keylog_fd; } xqc_mini_svr_ctx_t; typedef struct xqc_mini_svr_user_conn_s { struct event *ev_timeout; xqc_cid_t cid; xqc_mini_svr_ctx_t *ctx; /* ipv4 server */ int fd; struct sockaddr_in *local_addr; socklen_t local_addrlen; struct event *ev_socket; struct sockaddr_in *peer_addr; socklen_t peer_addrlen; } xqc_mini_svr_user_conn_t; void xqc_mini_svr_init_ssl_config(xqc_engine_ssl_config_t *ssl_cfg, xqc_mini_svr_args_t *args); void xqc_mini_svr_init_args(xqc_mini_svr_args_t *args); int xqc_mini_svr_init_ctx(xqc_mini_svr_ctx_t *ctx, xqc_mini_svr_args_t *args); /** * @brief init engine & transport callbacks */ void xqc_mini_svr_init_callback(xqc_engine_callback_t *cb, xqc_transport_callbacks_t *tcb, xqc_mini_svr_args_t *args); /** * @brief init xquic server engine */ int xqc_mini_svr_init_xquic_engine(xqc_mini_svr_ctx_t *ctx, xqc_mini_svr_args_t *args); int xqc_mini_svr_init_env(xqc_mini_svr_ctx_t *ctx, xqc_mini_svr_args_t *args); int xqc_mini_svr_init_engine_ctx(xqc_mini_svr_ctx_t *ctx, xqc_mini_svr_args_t *args); void xqc_mini_svr_init_conn_settings(xqc_engine_t *engine, xqc_mini_svr_args_t *args); static int xqc_mini_svr_init_socket(int family, uint16_t port, struct sockaddr *local_addr, socklen_t local_addrlen); static void xqc_mini_svr_socket_event_callback(int fd, short what, void *arg); #endif