Skip to content

Commit 7ff50b3

Browse files
authored
[!] Fix problems caused by interface coupling (#229)
1 parent 0805699 commit 7ff50b3

Some content is hidden

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

43 files changed

+1043
-282
lines changed

CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ include_directories(
132132
# http3/qpack source
133133
set(
134134
HTTP3_SOURCES
135-
"src/http3/xqc_var_buf.c"
136135
"src/http3/xqc_h3_conn.c"
137136
"src/http3/xqc_h3_stream.c"
138137
"src/http3/xqc_h3_request.c"
@@ -212,11 +211,13 @@ set(
212211
"src/common/xqc_time.c"
213212
"src/common/utils/huffman/xqc_huffman_code.c"
214213
"src/common/utils/huffman/xqc_huffman.c"
215-
"src/common/utils/vint/xqc_discrete_vint_parser.c"
214+
"src/common/utils/vint/xqc_discrete_int_parser.c"
216215
"src/common/utils/vint/xqc_variable_len_int.c"
217216
"src/common/utils/ringarray/xqc_ring_array.c"
218217
"src/common/utils/ringmem/xqc_ring_mem.c"
219218
"src/common/utils/2d_hash/xqc_2d_hash_table.c"
219+
"src/common/utils/var_buf/xqc_var_buf.c"
220+
220221
)
221222

222223
# congestion control

cmake/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ include_directories(
133133
# http3/qpack source
134134
set(
135135
HTTP3_SOURCES
136-
"src/http3/xqc_var_buf.c"
137136
"src/http3/xqc_h3_conn.c"
138137
"src/http3/xqc_h3_stream.c"
139138
"src/http3/xqc_h3_request.c"
@@ -213,11 +212,13 @@ set(
213212
"src/common/xqc_time.c"
214213
"src/common/utils/huffman/xqc_huffman_code.c"
215214
"src/common/utils/huffman/xqc_huffman.c"
216-
"src/common/utils/vint/xqc_discrete_vint_parser.c"
215+
"src/common/utils/vint/xqc_discrete_int_parser.c"
217216
"src/common/utils/vint/xqc_variable_len_int.c"
218217
"src/common/utils/ringarray/xqc_ring_array.c"
219218
"src/common/utils/ringmem/xqc_ring_mem.c"
220219
"src/common/utils/2d_hash/xqc_2d_hash_table.c"
220+
"src/common/utils/var_buf/xqc_var_buf.c"
221+
221222
)
222223

223224
# congestion control

include/xquic/xqc_errno.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ typedef enum {
109109
XQC_EALPN_NOT_SUPPORTED = 639, /* alpn is not supported by server */
110110
XQC_EALPN_NOT_REGISTERED = 640, /* alpn is not registered */
111111
XQC_ESTATELESS_RESET = 641, /* connection is reset by peer */
112+
XQC_EPACKET_FILETER_CALLBACK = 642, /* error with packet filter callback function */
112113

113114
XQC_EMP_NOT_SUPPORT_MP = 650, /* Multipath - don't support multipath */
114115
XQC_EMP_NO_AVAIL_PATH_ID = 651, /* Multipath - no available path id */

include/xquic/xquic.h

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ typedef void (*xqc_server_refuse_pt)(xqc_engine_t *engine, xqc_connection_t *con
162162
* xqc_engine_packet_process
163163
*/
164164
typedef ssize_t (*xqc_stateless_reset_pt)(const unsigned char *buf, size_t size,
165-
const struct sockaddr *peer_addr, socklen_t peer_addrlen, void *user_data);
165+
const struct sockaddr *peer_addr, socklen_t peer_addrlen,
166+
const struct sockaddr *local_addr, socklen_t local_addrlen,
167+
void *user_data);
166168

167169
/**
168170
* @brief connection closing notify callback function. will be triggered when a
@@ -326,6 +328,22 @@ typedef ssize_t (*xqc_send_mmsg_pt)(const struct iovec *msg_iov, unsigned int vl
326328
const struct sockaddr *peer_addr, socklen_t peer_addrlen, void *conn_user_data);
327329

328330

331+
/**
332+
* @brief set data callback mode for a transport connection. this mode differs
333+
* from write_socket, which has a different user_data, once this callback
334+
* function is set, write_socket will be not functional until it is unset.
335+
*
336+
* @param buf packet buffer
337+
* @param size packet size
338+
* @param peer_addr peer address
339+
* @param peer_addrlen peer address length
340+
* @param cb_user_data user_data of xqc_conn_pkt_filter_callback_pt
341+
*/
342+
typedef ssize_t (*xqc_conn_pkt_filter_callback_pt)(const unsigned char *buf,
343+
size_t size, const struct sockaddr *peer_addr, socklen_t peer_addrlen,
344+
void *cb_user_data);
345+
346+
329347
/**
330348
* @brief multi-path ready callback function
331349
*
@@ -826,6 +844,7 @@ typedef struct xqc_conn_settings_s {
826844
int32_t spurious_loss_detect_on;
827845
uint32_t anti_amplification_limit; /* limit of anti-amplification, default 3 */
828846
uint64_t keyupdate_pkt_threshold; /* packet limit of a single 1-rtt key, 0 for unlimited */
847+
size_t max_pkt_out_size;
829848
} xqc_conn_settings_t;
830849

831850

@@ -976,6 +995,9 @@ void xqc_engine_finish_recv(xqc_engine_t *engine);
976995
XQC_EXPORT_PUBLIC_API
977996
void xqc_engine_recv_batch(xqc_engine_t *engine, xqc_connection_t *conn);
978997

998+
XQC_EXPORT_PUBLIC_API
999+
xqc_connection_t *xqc_engine_get_conn_by_scid(xqc_engine_t *engine,
1000+
const xqc_cid_t *cid);
9791001

9801002
/*************************************************************
9811003
* QUIC layer APIs
@@ -1013,6 +1035,12 @@ const xqc_cid_t *xqc_connect(xqc_engine_t *engine,
10131035
XQC_EXPORT_PUBLIC_API
10141036
xqc_int_t xqc_conn_close(xqc_engine_t *engine, const xqc_cid_t *cid);
10151037

1038+
/**
1039+
* @brief close connection with error code
1040+
*/
1041+
XQC_EXPORT_PUBLIC_API
1042+
xqc_int_t xqc_conn_close_with_error(xqc_connection_t *conn, uint64_t err_code);
1043+
10161044
/**
10171045
* Get errno when conn_close_notify, 0 For no-error
10181046
*/
@@ -1065,13 +1093,35 @@ xqc_int_t xqc_conn_send_ping(xqc_engine_t *engine, const xqc_cid_t *cid, void *p
10651093
XQC_EXPORT_PUBLIC_API
10661094
xqc_bool_t xqc_conn_is_ready_to_send_early_data(xqc_connection_t *conn);
10671095

1096+
/**
1097+
* @brief set the packet filter callback function, and replace write_socket.
1098+
* NOTICE: this function is not conflict with send_mmsg.
1099+
*/
1100+
XQC_EXPORT_PUBLIC_API
1101+
void xqc_conn_set_pkt_filter_callback(xqc_connection_t *conn,
1102+
xqc_conn_pkt_filter_callback_pt pf_cb, void *pf_cb_user_data);
1103+
1104+
/**
1105+
* @brief unset the packet filter callback function, and restore write_socket
1106+
*/
1107+
XQC_EXPORT_PUBLIC_API
1108+
void xqc_conn_unset_pkt_filter_callback(xqc_connection_t *conn);
1109+
1110+
10681111
/**
10691112
* Create new stream in quic connection.
10701113
* @param user_data user_data for this stream
10711114
*/
10721115
XQC_EXPORT_PUBLIC_API
10731116
xqc_stream_t *xqc_stream_create(xqc_engine_t *engine, const xqc_cid_t *cid, void *user_data);
10741117

1118+
XQC_EXPORT_PUBLIC_API
1119+
xqc_stream_t *xqc_stream_create_with_direction(xqc_connection_t *conn,
1120+
xqc_stream_direction_t dir, void *user_data);
1121+
1122+
XQC_EXPORT_PUBLIC_API
1123+
xqc_stream_direction_t xqc_stream_get_direction(xqc_stream_t *strm);
1124+
10751125
/**
10761126
* Server should set user_data when stream_create_notify callbacks
10771127
*/
@@ -1084,6 +1134,13 @@ void xqc_stream_set_user_data(xqc_stream_t *stream, void *user_data);
10841134
XQC_EXPORT_PUBLIC_API
10851135
void *xqc_get_conn_user_data_by_stream(xqc_stream_t *stream);
10861136

1137+
/**
1138+
* Get connection's app_proto_user_data by stream
1139+
*/
1140+
XQC_EXPORT_PUBLIC_API
1141+
void *xqc_get_conn_alp_user_data_by_stream(xqc_stream_t *stream);
1142+
1143+
10871144
/**
10881145
* Get stream ID
10891146
*/
@@ -1163,6 +1220,9 @@ xqc_int_t xqc_conn_continue_send(xqc_engine_t *engine, const xqc_cid_t *cid);
11631220
XQC_EXPORT_PUBLIC_API
11641221
xqc_conn_stats_t xqc_conn_get_stats(xqc_engine_t *engine, const xqc_cid_t *cid);
11651222

1223+
XQC_EXPORT_PUBLIC_API
1224+
xqc_conn_type_t xqc_conn_get_type(xqc_connection_t *conn);
1225+
11661226
/**
11671227
* @brief load balance cid encryption.
11681228
* According to Draft : https://datatracker.ietf.org/doc/html/draft-ietf-quic-load-balancers-13#section-4.3.2

include/xquic/xquic_typedef.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,16 @@ struct iovec {
160160

161161
#endif
162162

163+
typedef enum {
164+
XQC_CONN_TYPE_CLIENT,
165+
XQC_CONN_TYPE_SERVER,
166+
} xqc_conn_type_t;
167+
168+
169+
typedef enum {
170+
XQC_STREAM_BIDI,
171+
XQC_STREAM_UNI
172+
} xqc_stream_direction_t;
173+
163174

164175
#endif /*_XQUIC_TYPEDEF_H_INCLUDED_*/

scripts/case_test.sh

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ function case_print_result() {
3535
}
3636

3737

38-
3938
clear_log
4039
echo -e "stream read notify fail ...\c"
4140
./test_client -s 1024000 -l d -t 1 -E -x 12 >> clog
@@ -502,6 +501,7 @@ else
502501
fi
503502
rm -f test_session
504503

504+
505505
clear_log
506506
echo -e "no crypto without 0RTT ...\c"
507507
rm -f test_session
@@ -518,8 +518,8 @@ fi
518518

519519
clear_log
520520
echo -e "no crypto with 0RTT ...\c"
521-
./test_client -s 1024000 -l d -N -t 1 -E >> clog
522-
if grep "early_data_flag:1" clog >/dev/null && grep ">>>>>>>> pass:1" clog >/dev/null; then
521+
./test_client -s 1024000 -l d -N -t 1 -E > stdlog
522+
if grep "early_data_flag:1" stdlog >/dev/null && grep ">>>>>>>> pass:1" stdlog >/dev/null; then
523523
echo ">>>>>>>> pass:1"
524524
case_print_result "no_crypto_with_0RTT" "pass"
525525
else
@@ -531,8 +531,8 @@ grep_err_log
531531

532532
clear_log
533533
echo -e "no crypto with 0RTT twice ...\c"
534-
./test_client -s 1024000 -l d -N -t 1 -E >> clog
535-
if grep "early_data_flag:1" clog >/dev/null && grep ">>>>>>>> pass:1" clog >/dev/null; then
534+
./test_client -s 1024000 -l d -N -t 1 -E > stdlog
535+
if grep "early_data_flag:1" stdlog >/dev/null && grep ">>>>>>>> pass:1" stdlog >/dev/null; then
536536
echo ">>>>>>>> pass:1"
537537
case_print_result "no_crypto_with_0RTT_twice" "pass"
538538
else
@@ -1051,6 +1051,22 @@ else
10511051
case_print_result "load_balancer_cid_generate_with_encryption" "fail"
10521052
fi
10531053

1054+
clear_log
1055+
killall test_server 2> /dev/null
1056+
echo -e "load balancer cid generate ...\c"
1057+
./test_server -l d -e -S "server_id_0" > /dev/null &
1058+
sleep 1
1059+
./test_client -s 1024000 -l d -t 1 >> clog
1060+
result=`grep "|xqc_conn_confirm_cid|dcid change|" clog`
1061+
errlog=`grep_err_log`
1062+
if [ -z "$errlog" ] && [ "$result" != "" ]; then
1063+
echo ">>>>>>>> pass:1"
1064+
case_print_result "load_balancer_cid_generate" "pass"
1065+
else
1066+
echo ">>>>>>>> pass:0"
1067+
case_print_result "load_balancer_cid_generate" "fail"
1068+
fi
1069+
10541070
clear_log
10551071
echo -e "set cipher suites ...\c"
10561072
./test_client -s 1024 -l d -t 1 -x 27 >> clog
@@ -1200,9 +1216,19 @@ else
12001216
fi
12011217
grep_err_log
12021218

1203-
killall test_server
12041219

1220+
echo -e "max pkt out size...\c"
1221+
result=`./test_client -l d -x 42 -1 -E | grep ">>>>>>>> pass"`
1222+
if [ -n "$result" ]; then
1223+
echo ">>>>>>>> pass:1"
1224+
case_print_result "max_pkt_out_size" "pass"
1225+
else
1226+
echo ">>>>>>>> pass:0"
1227+
case_print_result "max_pkt_out_size" "fail"
1228+
fi
12051229

1230+
1231+
killall test_server
12061232
./test_server -l d -x 13 > /dev/null &
12071233
sleep 1
12081234
clear_log
@@ -1218,6 +1244,7 @@ else
12181244
case_print_result "stateless_reset" "fail"
12191245
fi
12201246

1247+
12211248
killall test_server
12221249

12231250

scripts/xquic.lds

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ XQUIC_VERS_1.0 {
6565
xqc_engine_unregister_alpn;
6666
xqc_conn_set_alp_user_data;
6767
xqc_h3_request_finish;
68+
xqc_conn_close_with_error;
6869
xqc_now;
6970
xqc_h3_engine_set_qpack_compat_duplicate;
7071
xqc_lb_cid_encryption;

0 commit comments

Comments
 (0)