Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev/william/prop test quicer nif #260

Merged
merged 15 commits into from
Feb 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 -c -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)
{
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;
uint16_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
96 changes: 49 additions & 47 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 Expand Up @@ -1391,16 +1383,26 @@ controlling_process(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])

if (enif_get_resource(env, argv[0], ctx_stream_t, (void **)&s_ctx))
{
if (!get_stream_handle(s_ctx))
{
return ERROR_TUPLE_2(ATOM_CLOSED);
}

enif_mutex_lock(s_ctx->lock);
res = stream_controlling_process(env, s_ctx, &caller, &new_owner);
enif_mutex_unlock(s_ctx->lock);
put_stream_handle(s_ctx);
}
else if (enif_get_resource(env, argv[0], ctx_connection_t, (void **)&c_ctx))
{

if (!get_conn_handle(c_ctx))
{
return ERROR_TUPLE_2(ATOM_CLOSED);
}
enif_mutex_lock(c_ctx->lock);
res = connection_controlling_process(env, c_ctx, &caller, &new_owner);
enif_mutex_unlock(c_ctx->lock);
put_conn_handle(c_ctx);
}
else
{
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))
qzhuyan marked this conversation as resolved.
Show resolved Hide resolved
{
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
Loading