Skip to content

Commit

Permalink
Merge 9f53b72 into 69de6f1
Browse files Browse the repository at this point in the history
  • Loading branch information
qzhuyan committed Feb 16, 2024
2 parents 69de6f1 + 9f53b72 commit a35186c
Show file tree
Hide file tree
Showing 20 changed files with 1,741 additions and 235 deletions.
16 changes: 14 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,24 @@ xref:
eunit:
$(REBAR) eunit -v -c --cover_export_name eunit

.PHONY: proper
proper:
$(REBAR) proper -n 1000

.PHONY: proper-cover
proper-cover:
mkdir -p coverage
QUICER_TEST_COVER=1 $(REBAR) as test proper -n 1000
lcov -c --directory c_build/CMakeFiles/quicer_nif.dir/c_src/ \
--exclude "${PWD}/msquic/src/inc/*" \
--output-file ./coverage/proper-lcov.info

.PHONY: ct
ct:
QUICER_USE_SNK=1 $(REBAR) as test ct -v --readable=true

.PHONY: cover
cover: eunit
cover: eunit proper-cover
mkdir -p coverage
QUICER_TEST_COVER=1 QUICER_USE_SNK=1 $(REBAR) as test ct --cover --cover_export_name=ct -v
$(REBAR) as test cover -v
Expand All @@ -55,7 +67,7 @@ cover: eunit

.PHONY: cover-html
cover-html: cover
genhtml -o coverage/ coverage/lcov.info
genhtml -o coverage/ coverage/lcov.info coverage/proper-lcov.info

.PHONY: dialyzer
dialyzer:
Expand Down
46 changes: 33 additions & 13 deletions c_src/quicer_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,7 @@ encode_parm_to_eterm(ErlNifEnv *env,
}
else if ((QUICER_PARAM_HANDLE_TYPE_STREAM == Type
&& (QUIC_PARAM_STREAM_ID == Param
|| QUIC_PARAM_STREAM_PRIORITY == Param
|| QUIC_PARAM_STREAM_0RTT_LENGTH == Param
|| QUIC_PARAM_STREAM_IDEAL_SEND_BUFFER_SIZE == Param))
|| (QUICER_PARAM_HANDLE_TYPE_CONN == Type
Expand Down Expand Up @@ -759,6 +760,10 @@ encode_parm_to_eterm(ErlNifEnv *env,
&& QUICER_PARAM_HANDLE_TYPE_CONN == Type))
{
ERL_NIF_TERM ebin;
if (QUIC_PARAM_CONN_CLOSE_REASON_PHRASE == Param)
{
BufferLength -= 1; // remove \0
}
unsigned char *bin_data = enif_make_new_binary(env, BufferLength, &ebin);
if (!bin_data)
{
Expand Down Expand Up @@ -795,7 +800,7 @@ getopt3(ErlNifEnv *env,
ERL_NIF_TERM elevel = argv[2];

void *q_ctx;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);

if (!enif_is_atom(env, eopt))
{
Expand Down Expand Up @@ -905,7 +910,7 @@ setopt4(ErlNifEnv *env, __unused_parm__ int argc, const ERL_NIF_TERM argv[])
ERL_NIF_TERM evalue = argv[2];
ERL_NIF_TERM elevel = argv[3];

ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
void *q_ctx = NULL;

if (!enif_is_atom(env, eopt))
Expand Down Expand Up @@ -1254,9 +1259,10 @@ get_stream_opt(ErlNifEnv *env,
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);

uint64_t BuffUint64 = 0;
uint64_t BuffUint16 = 0;

if (!IS_SAME_TERM(ATOM_FALSE, elevel))
{
Expand All @@ -1273,6 +1279,12 @@ get_stream_opt(ErlNifEnv *env,
BufferLength = sizeof(uint64_t);
Buffer = &BuffUint64;
}
else if (ATOM_QUIC_PARAM_STREAM_PRIORITY == optname)
{
Param = QUIC_PARAM_STREAM_PRIORITY;
BufferLength = sizeof(uint16_t);
Buffer = &BuffUint16;
}
else if (ATOM_QUIC_STREAM_OPTS_ACTIVE == optname)
{
switch (s_ctx->owner->active)
Expand Down Expand Up @@ -1337,7 +1349,7 @@ set_stream_opt(ErlNifEnv *env,
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);

uint16_t BuffUint16 = 0;

Expand Down Expand Up @@ -1439,10 +1451,14 @@ get_connection_opt(ErlNifEnv *env,
uint32_t BufferLength = 0;
uint32_t Param = 0;
uint32_t Value = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);

if (!IS_SAME_TERM(ATOM_FALSE, elevel))
{
if (!c_ctx->config_resource)
{
goto Exit;
}
res = get_level_param(env,
c_ctx->Connection,
c_ctx->config_resource->Configuration,
Expand Down Expand Up @@ -1620,13 +1636,17 @@ set_connection_opt(ErlNifEnv *env,
uint32_t BufferLength = 0;
uint32_t Param = 0;
uint32_t Value = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
QUIC_ADDR addr;
uint8_t phrase[512] = { 0 };
ErlNifBinary ticket;

if (!IS_SAME_TERM(ATOM_FALSE, elevel))
{
if (!c_ctx->config_resource)
{
goto Exit;
}
res = set_level_param(env,
c_ctx->Connection,
c_ctx->config_resource->Configuration,
Expand Down Expand Up @@ -1950,7 +1970,7 @@ get_listener_opt(ErlNifEnv *env,
uint32_t Param = 0;
QUIC_ADDR q_addr = { 0 };
QUIC_LISTENER_STATISTICS stats = { 65535, 65535, 65535 };
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);

if (!l_ctx)
{
Expand Down Expand Up @@ -2037,7 +2057,7 @@ set_listener_opt(ErlNifEnv *env,
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
ErlNifBinary bin;
if (!l_ctx)
{
Expand Down Expand Up @@ -2105,7 +2125,7 @@ get_tls_opt(ErlNifEnv *env, HQUIC Handle, ERL_NIF_TERM optname)
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
uint8_t alpn[255] = { 0 };

if (IS_SAME_TERM(optname, ATOM_QUIC_PARAM_TLS_HANDSHAKE_INFO))
Expand Down Expand Up @@ -2196,7 +2216,7 @@ get_global_opt(ErlNifEnv *env, HQUIC Handle, ERL_NIF_TERM optname)
uint32_t BufferLength = 0;
uint32_t Param = 0;
uint32_t percent = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
QUIC_SETTINGS Settings = { 0 };
uint8_t githash[41] = { 0 }; // git hash 40 chars + \0

Expand Down Expand Up @@ -2314,7 +2334,7 @@ set_global_opt(ErlNifEnv *env,
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
uint32_t percent = 0;
uint32_t lbmode = 0;
QUIC_SETTINGS Settings = { 0 };
Expand Down Expand Up @@ -2395,7 +2415,7 @@ get_config_opt(ErlNifEnv *env, HQUIC Handle, ERL_NIF_TERM optname)
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);

if (IS_SAME_TERM(optname, ATOM_QUIC_PARAM_CONFIGURATION_SETTINGS))
{
Expand Down Expand Up @@ -2435,7 +2455,7 @@ set_config_opt(ErlNifEnv *env,
void *Buffer = NULL;
uint32_t BufferLength = 0;
uint32_t Param = 0;
ERL_NIF_TERM res = ATOM_ERROR_NOT_FOUND;
ERL_NIF_TERM res = ERROR_TUPLE_2(ATOM_ERROR_NOT_FOUND);
QUIC_SETTINGS Settings = { 0 };

if (IS_SAME_TERM(optname, ATOM_QUIC_PARAM_CONFIGURATION_SETTINGS))
Expand Down
84 changes: 38 additions & 46 deletions c_src/quicer_nif.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,64 +524,56 @@ ERL_NIF_TERM ATOM_QUIC_DATAGRAM_SEND_CANCELED;
\
/* Parameters for QUIC_PARAM_LEVEL_GLOBAL. */ \
ATOM(ATOM_QUIC_GLOBAL, quic_global); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_RETRY_MEMORY_PERCENT, \
param_global_retry_memory_percent); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_SUPPORTED_VERSIONS, \
param_global_supported_versions); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_LOAD_BALACING_MODE, \
param_global_load_balacing_mode); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_PERF_COUNTERS, param_global_perf_counters); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_SETTINGS, param_global_settings); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_VERSION, param_global_version); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_LIBRARY_GIT_HASH, \
param_global_library_git_hash); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_RETRY_MEMORY_PERCENT, retry_memory_percent); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_SUPPORTED_VERSIONS, supported_versions); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_LOAD_BALACING_MODE, load_balacing_mode); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_PERF_COUNTERS, perf_counters); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_SETTINGS, settings); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_VERSION, version); \
ATOM(ATOM_QUIC_PARAM_GLOBAL_LIBRARY_GIT_HASH, library_git_hash); \
\
/*Parameters for QUIC_PARAM_LEVEL_REGISTRATION.*/ \
ATOM(ATOM_QUIC_REGISTRATION, quic_registration); \
ATOM(ATOM_QUIC_PARAM_REGISTRATION_CID_PREFIX, \
param_registration_cid_prefix); \
ATOM(ATOM_QUIC_PARAM_REGISTRATION_CID_PREFIX, cid_prefix); \
\
/* Parameters for QUIC_PARAM_LEVEL_CONFIGURATION. */ \
ATOM(ATOM_QUIC_CONFIGURATION, quic_configuration); \
ATOM(ATOM_QUIC_PARAM_CONFIGURATION_SETTINGS, param_configuration_settings); \
ATOM(ATOM_QUIC_PARAM_CONFIGURATION_SETTINGS, settings); \
\
/* Parameters for QUIC_PARAM_LEVEL_LISTENER. */ \
\
ATOM(ATOM_QUIC_PARAM_LISTENER_LOCAL_ADDRESS, param_listener_local_address); \
ATOM(ATOM_QUIC_PARAM_LISTENER_STATS, param_listener_stats); \
ATOM(ATOM_QUIC_PARAM_LISTENER_CIBIR_ID, param_listener_cibir_id); \
ATOM(ATOM_QUIC_PARAM_LISTENER_LOCAL_ADDRESS, local_address); \
ATOM(ATOM_QUIC_PARAM_LISTENER_STATS, stats); \
ATOM(ATOM_QUIC_PARAM_LISTENER_CIBIR_ID, cibir_id); \
\
/* Parameters for QUIC_PARAM_LEVEL_CONNECTION. */ \
\
ATOM(ATOM_QUIC_PARAM_CONN_QUIC_VERSION, param_conn_quic_version); \
ATOM(ATOM_QUIC_PARAM_CONN_LOCAL_ADDRESS, param_conn_local_address); \
ATOM(ATOM_QUIC_PARAM_CONN_REMOTE_ADDRESS, param_conn_remote_address); \
ATOM(ATOM_QUIC_PARAM_CONN_IDEAL_PROCESSOR, param_conn_ideal_processor); \
ATOM(ATOM_QUIC_PARAM_CONN_SETTINGS, param_conn_settings); \
ATOM(ATOM_QUIC_PARAM_CONN_STATISTICS, param_conn_statistics); \
ATOM(ATOM_QUIC_PARAM_CONN_STATISTICS_PLAT, param_conn_statistics_plat); \
ATOM(ATOM_QUIC_PARAM_CONN_SHARE_UDP_BINDING, param_conn_share_udp_binding); \
ATOM(ATOM_QUIC_PARAM_CONN_QUIC_VERSION, quic_version); \
ATOM(ATOM_QUIC_PARAM_CONN_LOCAL_ADDRESS, local_address); \
ATOM(ATOM_QUIC_PARAM_CONN_REMOTE_ADDRESS, remote_address); \
ATOM(ATOM_QUIC_PARAM_CONN_IDEAL_PROCESSOR, ideal_processor); \
ATOM(ATOM_QUIC_PARAM_CONN_SETTINGS, settings); \
ATOM(ATOM_QUIC_PARAM_CONN_STATISTICS, statistics); \
ATOM(ATOM_QUIC_PARAM_CONN_STATISTICS_PLAT, statistics_plat); \
ATOM(ATOM_QUIC_PARAM_CONN_SHARE_UDP_BINDING, share_udp_binding); \
ATOM(ATOM_QUIC_PARAM_CONN_LOCAL_BIDI_STREAM_COUNT, \
param_conn_local_bidi_stream_count); \
local_bidi_stream_count); \
ATOM(ATOM_QUIC_PARAM_CONN_LOCAL_UNIDI_STREAM_COUNT, \
param_conn_local_unidi_stream_count); \
ATOM(ATOM_QUIC_PARAM_CONN_MAX_STREAM_IDS, param_conn_max_stream_ids); \
ATOM(ATOM_QUIC_PARAM_CONN_CLOSE_REASON_PHRASE, \
param_conn_close_reason_phrase); \
local_unidi_stream_count); \
ATOM(ATOM_QUIC_PARAM_CONN_MAX_STREAM_IDS, max_stream_ids); \
ATOM(ATOM_QUIC_PARAM_CONN_CLOSE_REASON_PHRASE, close_reason_phrase); \
ATOM(ATOM_QUIC_PARAM_CONN_STREAM_SCHEDULING_SCHEME, \
param_conn_stream_scheduling_scheme); \
stream_scheduling_scheme); \
ATOM(ATOM_QUIC_PARAM_CONN_DATAGRAM_RECEIVE_ENABLED, \
param_conn_datagram_receive_enabled); \
ATOM(ATOM_QUIC_PARAM_CONN_DATAGRAM_SEND_ENABLED, \
param_conn_datagram_send_enabled); \
datagram_receive_enabled); \
ATOM(ATOM_QUIC_PARAM_CONN_DATAGRAM_SEND_ENABLED, datagram_send_enabled); \
\
ATOM(ATOM_QUIC_PARAM_CONN_DISABLE_1RTT_ENCRYPTION, \
param_conn_disable_1rtt_encryption); \
disable_1rtt_encryption); \
\
ATOM(ATOM_QUIC_PARAM_CONN_RESUMPTION_TICKET, param_conn_resumption_ticket); \
ATOM(ATOM_QUIC_PARAM_CONN_PEER_CERTIFICATE_VALID, \
param_conn_peer_certificate_valid); \
ATOM(ATOM_QUIC_PARAM_CONN_LOCAL_INTERFACE, param_conn_local_interface); \
ATOM(ATOM_QUIC_PARAM_CONN_RESUMPTION_TICKET, resumption_ticket); \
ATOM(ATOM_QUIC_PARAM_CONN_PEER_CERTIFICATE_VALID, peer_certificate_valid); \
ATOM(ATOM_QUIC_PARAM_CONN_LOCAL_INTERFACE, local_interface); \
/* Parameters for QUIC_PARAM_LEVEL_TLS. */ \
ATOM(ATOM_QUIC_TLS, quic_tls); \
ATOM(ATOM_TLS_PROTOCOL_VERSION, tls_protocol_version); \
Expand All @@ -605,19 +597,19 @@ ERL_NIF_TERM ATOM_QUIC_DATAGRAM_SEND_CANCELED;
ATOM(ATOM_AES_256_GCM_SHA384, aes_256_gcm_sha384); \
ATOM(ATOM_CHACHA20_POLY1305_SHA256, chacha20_poly1305_sha256); \
ATOM(ATOM_QUIC_PARAM_TLS_SCHANNEL_CONTEXT_ATTRIBUTE_W, \
param_tls_schannel_context_attribute_w); \
schannel_context_attribute_w); \
\
ATOM(ATOM_QUIC_PARAM_TLS_HANDSHAKE_INFO, param_tls_handshake_info); \
ATOM(ATOM_QUIC_PARAM_TLS_HANDSHAKE_INFO, handshake_info); \
\
ATOM(ATOM_QUIC_PARAM_TLS_NEGOTIATED_ALPN, param_tls_negotiated_alpn); \
ATOM(ATOM_QUIC_PARAM_TLS_NEGOTIATED_ALPN, negotiated_alpn); \
\
/* Parameters for QUIC_PARAM_LEVEL_STREAM. */ \
\
ATOM(ATOM_QUIC_PARAM_STREAM_ID, param_stream_id); \
ATOM(ATOM_QUIC_PARAM_STREAM_0RTT_LENGTH, param_stream_0rtt_length); \
ATOM(ATOM_QUIC_PARAM_STREAM_ID, stream_id); \
ATOM(ATOM_QUIC_PARAM_STREAM_0RTT_LENGTH, 0rtt_length); \
ATOM(ATOM_QUIC_PARAM_STREAM_IDEAL_SEND_BUFFER_SIZE, \
param_stream_ideal_send_buffer_size); \
ATOM(ATOM_QUIC_PARAM_STREAM_PRIORITY, param_stream_priority); \
ideal_send_buffer_size); \
ATOM(ATOM_QUIC_PARAM_STREAM_PRIORITY, priority); \
\
/*-----------------------*/ \
/* msquic params ends */ \
Expand Down
7 changes: 4 additions & 3 deletions c_src/quicer_reg.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ deregistration(__unused_parm__ ErlNifEnv *env,
ERL_NIF_TERM
new_registration2(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{

CXPLAT_FRE_ASSERT(argc >= 1);
ERL_NIF_TERM ename = argv[0];
ERL_NIF_TERM eprofile = argv[1];
QUIC_REGISTRATION_CONFIG RegConfig
Expand All @@ -134,8 +134,9 @@ new_registration2(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
}

if (argc == 2
&& 0 >= enif_get_string(
env, ename, r_ctx->name, UINT8_MAX + 1, ERL_NIF_LATIN1))
&& (0 >= enif_get_string(
env, ename, r_ctx->name, UINT8_MAX + 1, ERL_NIF_LATIN1)
|| strlen(r_ctx->name) == 0))
{
res = ERROR_TUPLE_2(ATOM_BADARG);
goto exit;
Expand Down
2 changes: 1 addition & 1 deletion c_src/quicer_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ csend4(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
if (!enif_get_uint(env, eopen_flag, &open_flag))
{
// if set must be valid.
// if set, must be valid.
return ERROR_TUPLE_2(ATOM_BADARG);
}
}
Expand Down
Loading

0 comments on commit a35186c

Please sign in to comment.