From c37c7c87c90aa6a56743d4af8f89858fa54d5aa4 Mon Sep 17 00:00:00 2001 From: William Yang Date: Fri, 3 May 2024 09:53:02 +0200 Subject: [PATCH 1/3] feat: bump msquic to 2.3.5 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f59d8bdb..99337f50 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ default: build-nif .PHONY: build-nif build-nif: - ./build.sh 'v2.2.3' + ./build.sh 'v2.3.5' compile: $(REBAR) compile From bd9ba0cb8d9229b564d67bf90c31c0c9e00fea89 Mon Sep 17 00:00:00 2001 From: William Yang Date: Fri, 3 May 2024 13:23:21 +0200 Subject: [PATCH 2/3] chore: adapt to msquic 2.3.5 --- c_src/quicer_config.c | 52 ++++++++++++++++++++++++++++++++++ c_src/quicer_config.h | 2 ++ c_src/quicer_connection.c | 2 -- test/quicer_listener_SUITE.erl | 2 +- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/c_src/quicer_config.c b/c_src/quicer_config.c index c25487e2..95f31bc3 100644 --- a/c_src/quicer_config.c +++ b/c_src/quicer_config.c @@ -2567,3 +2567,55 @@ parse_registration(ErlNifEnv *env, return TRUE; } + +const char * +QuicStatusToString(_In_ QUIC_STATUS Status) +{ + switch (Status) + { + case QUIC_STATUS_SUCCESS: + return "SUCCESS"; + case QUIC_STATUS_PENDING: + return "PENDING"; + case QUIC_STATUS_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case QUIC_STATUS_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case QUIC_STATUS_INVALID_STATE: + return "INVALID_STATE"; + case QUIC_STATUS_NOT_SUPPORTED: + return "NOT_SUPPORTED"; + case QUIC_STATUS_NOT_FOUND: + return "NOT_FOUND"; + case QUIC_STATUS_BUFFER_TOO_SMALL: + return "BUFFER_TOO_SMALL"; + case QUIC_STATUS_HANDSHAKE_FAILURE: + return "HANDSHAKE_FAILURE"; + case QUIC_STATUS_ABORTED: + return "ABORTED"; + case QUIC_STATUS_ADDRESS_IN_USE: + return "ADDRESS_IN_USE"; + case QUIC_STATUS_CONNECTION_TIMEOUT: + return "CONNECTION_TIMEOUT"; + case QUIC_STATUS_CONNECTION_IDLE: + return "CONNECTION_IDLE"; + case QUIC_STATUS_UNREACHABLE: + return "UNREACHABLE"; + case QUIC_STATUS_INTERNAL_ERROR: + return "INTERNAL_ERROR"; + case QUIC_STATUS_CONNECTION_REFUSED: + return "CONNECTION_REFUSED"; + case QUIC_STATUS_PROTOCOL_ERROR: + return "PROTOCOL_ERROR"; + case QUIC_STATUS_VER_NEG_ERROR: + return "VER_NEG_ERROR"; + case QUIC_STATUS_USER_CANCELED: + return "USER_CANCELED"; + case QUIC_STATUS_ALPN_NEG_FAILURE: + return "ALPN_NEG_FAILURE"; + case QUIC_STATUS_STREAM_LIMIT_REACHED: + return "STREAM_LIMIT_REACHED"; + } + + return "UNKNOWN"; +} diff --git a/c_src/quicer_config.h b/c_src/quicer_config.h index 8972ce12..1c9b398c 100644 --- a/c_src/quicer_config.h +++ b/c_src/quicer_config.h @@ -122,4 +122,6 @@ ERL_NIF_TERM set_connection_opt(ErlNifEnv *env, ERL_NIF_TERM optval, ERL_NIF_TERM elevel); +const char *QuicStatusToString(_In_ QUIC_STATUS Status); + #endif // __QUICER_CONFIG_H_ diff --git a/c_src/quicer_connection.c b/c_src/quicer_connection.c index 2063e1fd..5e58be8c 100644 --- a/c_src/quicer_connection.c +++ b/c_src/quicer_connection.c @@ -31,8 +31,6 @@ extern inline void EncodeHexBuffer(uint8_t *Buffer, uint8_t BufferLen, char *HexString); #endif -extern inline const char *QuicStatusToString(QUIC_STATUS Status); - static QUIC_STATUS handle_connection_event_connected(QuicerConnCTX *c_ctx, QUIC_CONNECTION_EVENT *Event); diff --git a/test/quicer_listener_SUITE.erl b/test/quicer_listener_SUITE.erl index de7bcc81..8825d016 100644 --- a/test/quicer_listener_SUITE.erl +++ b/test/quicer_listener_SUITE.erl @@ -558,7 +558,7 @@ tc_listener_conf_reload(Config) -> quicer_test_lib:report_unhandled_messages(), ct:fail("nothing from conn 2") end, - gen_server:stop(ClientConnPid), + catch gen_server:stop(ClientConnPid), quicer_listener:stop_listener(QuicApp). tc_listener_conf_reload_listen_on(Config) -> From 6848ec8f7347bb8c441c32985d507820ef65a3b6 Mon Sep 17 00:00:00 2001 From: William Yang Date: Thu, 16 May 2024 18:28:05 +0200 Subject: [PATCH 3/3] test: send after stream shutdown try to trigger https://github.com/emqx/quic/issues/277 --- test/quicer_SUITE.erl | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/quicer_SUITE.erl b/test/quicer_SUITE.erl index e16f613f..556c1069 100644 --- a/test/quicer_SUITE.erl +++ b/test/quicer_SUITE.erl @@ -59,6 +59,7 @@ tc_stream_passive_receive_large_buffer_1/1, tc_stream_passive_receive_large_buffer_2/1, tc_stream_send_after_conn_close/1, + tc_stream_send_after_stream_shutdown/1, tc_stream_send_after_async_conn_close/1, tc_stream_sendrecv_large_data_passive/1, %% @deprecated @@ -737,6 +738,34 @@ tc_stream_send_after_conn_close(Config) -> ct:fail("timeout") end. +tc_stream_send_after_stream_shutdown(Config) -> + Port = select_port(), + Owner = self(), + {SPid, Ref} = spawn_monitor(fun() -> simple_stream_server(Owner, Config, Port) end), + receive + listener_ready -> ok + end, + + {ok, Conn} = quicer:connect("localhost", Port, default_conn_opts(), 5000), + {ok, Stm} = quicer:start_stream(Conn, []), + {ok, 4} = quicer:send(Stm, <<"ping">>), + {ok, {_, _}} = quicer:sockname(Conn), + + ok = quicer:async_shutdown_stream(Stm), + case quicer:send(Stm, <<"ping2">>) of + {error, closed} -> + ok; + {error, stm_send_error, aborted} -> + ok; + {error, stm_send_error, invalid_state} -> + ok; + {error, cancelled} -> + ok + end, + ok = quicer:close_connection(Conn), + SPid ! done, + ok = ensure_server_exit_normal(Ref). + tc_stream_send_after_async_conn_close(Config) -> Port = select_port(), Owner = self(),