Skip to content

Commit 78cf6d1

Browse files
authored
[+] QUIC datagram (RFC9221), sending datagrams and bytestreams on http3 connections (non-standard extensions), and bugfix (#307)
*[!] fix vulnerabilities on parsing STREAM and CRYPTO frame; [!] fix 32-bit system overflow problems; [+] support http3 over datagram; [+] support http3 byte stream; [+] add copa congestion control algorithm; * [+] update contributor * [!] fix test case errors on ubuntu latest
1 parent daaf4ab commit 78cf6d1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+8115
-296
lines changed

CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ set(
148148
"src/http3/qpack/xqc_ins.c"
149149
"src/http3/qpack/stable/xqc_stable.c"
150150
"src/http3/qpack/dtable/xqc_dtable.c"
151+
"src/http3/xqc_h3_ext_dgram.c"
152+
"src/http3/xqc_h3_ext_bytestream.c"
151153
)
152154

153155
# Transport source
@@ -160,6 +162,7 @@ set(
160162
"src/transport/xqc_packet_parser.c"
161163
"src/transport/xqc_frame_parser.c"
162164
"src/transport/xqc_stream.c"
165+
"src/transport/xqc_datagram.c"
163166
"src/transport/xqc_packet_out.c"
164167
"src/transport/xqc_packet_in.c"
165168
"src/transport/xqc_send_ctl.c"
@@ -233,6 +236,8 @@ set(
233236
CONGESTION_CONTROL_SOURCES
234237
"src/congestion_control/xqc_cubic.c"
235238
"src/congestion_control/xqc_bbr.c"
239+
"src/congestion_control/xqc_unlimited_cc.c"
240+
"src/congestion_control/xqc_copa.c"
236241
"src/congestion_control/xqc_window_filter.c"
237242
"src/congestion_control/xqc_sample.c"
238243
)
@@ -259,7 +264,7 @@ endif()
259264

260265
# xquic source
261266
set (
262-
XQC_SOURCE
267+
XQC_SOURCE
263268
${HTTP3_SOURCES}
264269
${TRANSPORT_SOURCES}
265270
${TLS_SOURCE}

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ In no particular order, thanks to these excellent individuals who contributed co
203203
* 曾柯(毅丝)
204204
* 徐盟欣(象谦)
205205
* Bai Shi(白石)
206+
* 周瑞琪(凼凼)
206207
* @chinsyo
207208
* @L1MeN9Yu
208209
* @flx413

cmake/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ set(
149149
"src/http3/qpack/xqc_ins.c"
150150
"src/http3/qpack/stable/xqc_stable.c"
151151
"src/http3/qpack/dtable/xqc_dtable.c"
152+
"src/http3/xqc_h3_ext_dgram.c"
153+
"src/http3/xqc_h3_ext_bytestream.c"
152154
)
153155

154156
# Transport source
@@ -161,6 +163,7 @@ set(
161163
"src/transport/xqc_packet_parser.c"
162164
"src/transport/xqc_frame_parser.c"
163165
"src/transport/xqc_stream.c"
166+
"src/transport/xqc_datagram.c"
164167
"src/transport/xqc_packet_out.c"
165168
"src/transport/xqc_packet_in.c"
166169
"src/transport/xqc_send_ctl.c"
@@ -234,6 +237,8 @@ set(
234237
CONGESTION_CONTROL_SOURCES
235238
"src/congestion_control/xqc_cubic.c"
236239
"src/congestion_control/xqc_bbr.c"
240+
"src/congestion_control/xqc_unlimited_cc.c"
241+
"src/congestion_control/xqc_copa.c"
237242
"src/congestion_control/xqc_window_filter.c"
238243
"src/congestion_control/xqc_sample.c"
239244
)

demo/demo_client.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ xqc_demo_cli_close_keylog_file(xqc_demo_cli_ctx_t *ctx)
469469
}
470470

471471
void
472-
xqc_demo_cli_keylog_cb(const char *line, void *engine_user_data)
472+
xqc_demo_cli_keylog_cb(const xqc_cid_t *scid, const char *line, void *engine_user_data)
473473
{
474474
xqc_demo_cli_ctx_t *ctx = (xqc_demo_cli_ctx_t*)engine_user_data;
475475
if (ctx->keylog_fd <= 0) {
@@ -585,6 +585,13 @@ xqc_demo_cli_write_socket(const unsigned char *buf, size_t size, const struct so
585585
return res;
586586
}
587587

588+
ssize_t
589+
xqc_demo_cli_write_socket_ex(uint64_t path_id, const unsigned char *buf, size_t size,
590+
const struct sockaddr *peer_addr, socklen_t peer_addrlen, void *conn_user_data)
591+
{
592+
return xqc_demo_cli_write_socket(buf, size, peer_addr, peer_addrlen, conn_user_data);
593+
}
594+
588595

589596
#if defined(XQC_SUPPORT_SENDMMSG)
590597
ssize_t
@@ -1638,6 +1645,7 @@ xqc_demo_cli_init_callback(xqc_engine_callback_t *cb, xqc_transport_callbacks_t
16381645

16391646
static xqc_transport_callbacks_t tcb = {
16401647
.write_socket = xqc_demo_cli_write_socket,
1648+
.write_socket_ex = xqc_demo_cli_write_socket_ex,
16411649
.save_token = xqc_demo_cli_save_token, /* save token */
16421650
.save_session_cb = xqc_demo_cli_save_session_cb,
16431651
.save_tp_cb = xqc_demo_cli_save_tp_cb,

demo/demo_server.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ int
276276
xqc_demo_svr_open_keylog_file(xqc_demo_svr_ctx_t *ctx)
277277
{
278278
ctx->keylog_fd = open(ctx->args->env_cfg.key_out_path, (O_WRONLY | O_APPEND | O_CREAT), 0644);
279+
printf("%s %d\n", ctx->args->env_cfg.key_out_path, ctx->keylog_fd);
279280
if (ctx->keylog_fd <= 0) {
280281
return -1;
281282
}
@@ -295,7 +296,7 @@ xqc_demo_svr_close_keylog_file(xqc_demo_svr_ctx_t *ctx)
295296
}
296297

297298
void
298-
xqc_demo_svr_keylog_cb(const char *line, void *eng_user_data)
299+
xqc_demo_svr_keylog_cb(const xqc_cid_t *scid, const char *line, void *eng_user_data)
299300
{
300301
xqc_demo_svr_ctx_t *ctx = (xqc_demo_svr_ctx_t*)eng_user_data;
301302
if (ctx->keylog_fd <= 0) {
@@ -928,6 +929,12 @@ xqc_demo_svr_write_socket(const unsigned char *buf, size_t size, const struct so
928929
return res;
929930
}
930931

932+
ssize_t
933+
xqc_demo_svr_write_socket_ex(uint64_t path_id, const unsigned char *buf, size_t size,
934+
const struct sockaddr *peer_addr,socklen_t peer_addrlen, void *conn_user_data)
935+
{
936+
return xqc_demo_svr_write_socket(buf, size, peer_addr, peer_addrlen, conn_user_data);
937+
}
931938

932939
void
933940
xqc_demo_svr_socket_write_handler(xqc_demo_svr_ctx_t *ctx, int fd)
@@ -1136,6 +1143,7 @@ xqc_demo_svr_init_args(xqc_demo_svr_args_t *args)
11361143
args->env_cfg.log_level = XQC_LOG_DEBUG;
11371144
strncpy(args->env_cfg.log_path, LOG_PATH, TLS_GROUPS_LEN - 1);
11381145
strncpy(args->env_cfg.source_file_dir, SOURCE_DIR, RESOURCE_LEN - 1);
1146+
strncpy(args->env_cfg.key_out_path, KEY_PATH, PATH_LEN - 1);
11391147
strncpy(args->env_cfg.priv_key_path, PRIV_KEY_PATH, PATH_LEN - 1);
11401148
strncpy(args->env_cfg.cert_pem_path, CERT_PEM_PATH, PATH_LEN - 1);
11411149
}
@@ -1239,6 +1247,7 @@ xqc_demo_svr_init_callback(xqc_engine_callback_t *cb, xqc_transport_callbacks_t
12391247
static xqc_transport_callbacks_t tcb = {
12401248
.server_accept = xqc_demo_svr_accept,
12411249
.write_socket = xqc_demo_svr_write_socket,
1250+
.write_socket_ex = xqc_demo_svr_write_socket_ex,
12421251
.conn_update_cid_notify = xqc_demo_svr_conn_update_cid_notify,
12431252
};
12441253

include/xquic/xqc_errno.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ typedef enum {
2323
TRA_INVALID_TOKEN = 0xB,
2424
TRA_APPLICATION_ERROR = 0xC,
2525
TRA_CRYPTO_BUFFER_EXCEEDED = 0xD,
26+
TRA_0RTT_TRANS_PARAMS_ERROR = 0xE, /* MUST delete the current saved 0RTT transport parameters */
2627
TRA_HS_CERTIFICATE_VERIFY_FAIL = 0x1FE, /* for handshake certificate verify error */
2728
TRA_CRYPTO_ERROR = 0x1FF, /* 0x1XX */
2829
} xqc_trans_err_code_t;
@@ -121,7 +122,10 @@ typedef enum {
121122

122123
XQC_EENCRYPT_LB_CID = 670, /* load balance connection ID encryption error */
123124
XQC_EENCRYPT_AES_128_ECB = 671, /* aes_128_ecb algorithm error */
124-
125+
126+
XQC_EDGRAM_NOT_SUPPORTED = 680, /* Datagram - not supported */
127+
XQC_EDGRAM_TOO_LARGE = 681, /* Datagram - payload size too large */
128+
125129
XQC_E_MAX,
126130
} xqc_transport_error_t;
127131

@@ -216,6 +220,11 @@ typedef enum {
216220
XQC_H3_BLOCKED_STREAM_EXCEED = 825, /* blocked_stream exceed limit */
217221
XQC_H3_STREAM_RECV_ERROR = 826, /* call xqc_stream_recv error */
218222
XQC_H3_INVALID_PRIORITY = 827, /* invalid http priority params or values */
223+
XQC_H3_INVALID_BIDI_STREAM_TYPE = 828, /* invalid bidi stream type */
224+
XQC_H3_ECREATE_BYTESTREAM = 829, /* fail to create a bytestream */
225+
XQC_H3_EPROC_BYTESTREAM = 830, /* fail to process bytestream */
226+
XQC_H3_BYTESTREAM_FIN_SENT = 831, /* try to send data on a bytestream that already sent FIN */
227+
XQC_H3_BYTESTREAM_MSG_BUF_EXIST = 832, /* try to create a msg buf while it already exists */
219228

220229
XQC_H3_ERR_MAX,
221230
} xqc_h3_error_t;

0 commit comments

Comments
 (0)