From 18e90180d235836703c7b4b9a7e59f9cb27ec175 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 11:43:50 +0100 Subject: [PATCH 01/15] [+] add path status cases --- demo/demo_client.c | 35 ++++++++++++++++++++++++----------- include/xquic/xquic.h | 9 +++++++++ scripts/xquic.lds | 1 + src/transport/xqc_conn.c | 26 ++++++++++++++++++++++++++ src/transport/xqc_conn.h | 1 + 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 8c8e02bfc..25681f9db 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -171,7 +171,7 @@ typedef struct xqc_demo_cli_quic_config_s { uint8_t mp_version; - uint8_t test_path_status; + uint8_t send_path_standby; } xqc_demo_cli_quic_config_t; @@ -397,7 +397,8 @@ typedef struct xqc_demo_cli_user_conn_s { xqc_demo_cli_ctx_t *ctx; xqc_demo_cli_task_t *task; - int send_path_available; + int send_path_standby; + int path_status; /* 0:available 1:standby */ } xqc_demo_cli_user_conn_t; static void @@ -1084,6 +1085,23 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no xqc_demo_cli_task_ctx_t *ctx = &user_stream->user_conn->ctx->task_ctx; xqc_demo_cli_user_conn_t *user_conn = user_stream->user_conn; uint32_t task_idx = user_conn->task->task_idx; + + if (user_conn->send_path_standby) { + /* set initial path standby here */ + if (user_conn->path_status == 0 + && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) + { + xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); + user_conn->path_status = 1; /* 1:standby */ + printf("mark initial path standby\n"); + + } else if (user_conn->path_status == 1) { + xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); + user_conn->path_status = 0; /* 0:available */ + printf("mark initial path available\n"); + } + } + // printf("xqc_demo_cli_h3_request_read_notify, h3_request: %p, user_stream: %p\n", h3_request, user_stream); if (flag & XQC_REQ_NOTIFY_READ_HEADER) { xqc_http_headers_t *headers; @@ -1937,7 +1955,7 @@ xqc_demo_cli_parse_args(int argc, char *argv[], xqc_demo_cli_client_args_t *args case 'B': printf("option multipath set path status: %s\n", optarg); - args->quic_cfg.test_path_status = 1; + args->quic_cfg.send_path_standby = 1; break; case 'I': @@ -2199,12 +2217,6 @@ xqc_demo_cli_h3_conn_handshake_finished(xqc_h3_conn_t *h3_conn, void *user_data) xqc_conn_stats_t stats = xqc_conn_get_stats(user_conn->ctx->engine, &user_conn->cid); printf("0rtt_flag:%d\n", stats.early_data_flag); - if (user_conn->send_path_available) { - /* set initial path available here */ - xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); - xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); - } - } void @@ -2391,9 +2403,10 @@ xqc_demo_cli_init_xquic_connection(xqc_demo_cli_user_conn_t *user_conn, if (conn_settings.enable_multipath && conn_settings.multipath_version >= XQC_MULTIPATH_06 - && args->quic_cfg.test_path_status == 1) + && args->quic_cfg.send_path_standby == 1) { - user_conn->send_path_available = 1; + user_conn->send_path_standby = 1; + user_conn->path_status = 0; } return 0; diff --git a/include/xquic/xquic.h b/include/xquic/xquic.h index 970d88c24..cbbf08a2b 100644 --- a/include/xquic/xquic.h +++ b/include/xquic/xquic.h @@ -1867,6 +1867,15 @@ XQC_EXPORT_PUBLIC_API xqc_int_t xqc_conn_mark_path_frozen(xqc_engine_t *engine, const xqc_cid_t *cid, uint64_t path_id); +/** + * Calculate how many available paths on the current connection, i.e., paths which finished validation and is marked "available" status. + * @param engine xquic engine ctx + * @param cid scid for connection + * @return number of available paths when success, <0 for error + */ +XQC_EXPORT_PUBLIC_API xqc_int_t xqc_conn_available_paths(xqc_engine_t *engine, const xqc_cid_t *cid); + + XQC_EXPORT_PUBLIC_API xqc_conn_type_t xqc_conn_get_type(xqc_connection_t *conn); diff --git a/scripts/xquic.lds b/scripts/xquic.lds index 17cdd7b22..a971851c2 100644 --- a/scripts/xquic.lds +++ b/scripts/xquic.lds @@ -75,6 +75,7 @@ XQUIC_VERS_1.0 { xqc_conn_mark_path_standby; xqc_conn_mark_path_available; xqc_conn_mark_path_frozen; + xqc_conn_available_paths; xqc_dcid_str_by_scid; xqc_h3_ctx_init; xqc_h3_ctx_destroy; diff --git a/src/transport/xqc_conn.c b/src/transport/xqc_conn.c index 488d35d99..058d85bed 100644 --- a/src/transport/xqc_conn.c +++ b/src/transport/xqc_conn.c @@ -5595,6 +5595,32 @@ xqc_conn_handle_stateless_reset(xqc_connection_t *conn, } +xqc_int_t +xqc_conn_available_paths(xqc_engine_t *engine, xqc_cid_t *cid) +{ + xqc_int_t available_paths = 0; + xqc_connection_t *conn = xqc_engine_conns_hash_find(engine, cid, 's'); + if (conn == NULL) { + /* no connection found */ + return available_paths; + } + + xqc_path_ctx_t *path; + xqc_list_head_t *path_pos, *path_next; + + xqc_list_for_each_safe(path_pos, path_next, &conn->conn_paths_list) { + path = xqc_list_entry(path_pos, xqc_path_ctx_t, path_list); + if (path->path_state < XQC_PATH_STATE_VALIDATING) { + continue; + } + if (path->path_state == XQC_PATH_STATE_ACTIVE) { + available_paths++; + } + } + return available_paths; +} + + #ifdef XQC_COMPAT_GENERATE_SR_PKT xqc_int_t diff --git a/src/transport/xqc_conn.h b/src/transport/xqc_conn.h index 2700a8d6d..7fe56dce3 100644 --- a/src/transport/xqc_conn.h +++ b/src/transport/xqc_conn.h @@ -666,4 +666,5 @@ void xqc_conn_destroy_ping_notification_list(xqc_connection_t *conn); xqc_int_t xqc_conn_send_ping_internal(xqc_connection_t *conn, void *ping_user_data, xqc_bool_t notify); + #endif /* _XQC_CONN_H_INCLUDED_ */ From 922d9ff80f7b98d98eb6d0ba0343caa81edea959 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 11:45:34 +0100 Subject: [PATCH 02/15] [~] fix function declaration --- src/transport/xqc_conn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transport/xqc_conn.c b/src/transport/xqc_conn.c index 058d85bed..61cadab3f 100644 --- a/src/transport/xqc_conn.c +++ b/src/transport/xqc_conn.c @@ -5596,7 +5596,7 @@ xqc_conn_handle_stateless_reset(xqc_connection_t *conn, xqc_int_t -xqc_conn_available_paths(xqc_engine_t *engine, xqc_cid_t *cid) +xqc_conn_available_paths(xqc_engine_t *engine, const xqc_cid_t *cid) { xqc_int_t available_paths = 0; xqc_connection_t *conn = xqc_engine_conns_hash_find(engine, cid, 's'); From 5b58fad712cb72357b2ddccf4adb84a140b69002 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 11:56:56 +0100 Subject: [PATCH 03/15] [+] add logs --- src/transport/xqc_conn.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/transport/xqc_conn.c b/src/transport/xqc_conn.c index 61cadab3f..4d6679613 100644 --- a/src/transport/xqc_conn.c +++ b/src/transport/xqc_conn.c @@ -5617,6 +5617,8 @@ xqc_conn_available_paths(xqc_engine_t *engine, const xqc_cid_t *cid) available_paths++; } } + + xqc_log(conn->log, XQC_LOG_DEBUG, "|xqc_conn_available_paths|%" PRId32 "|", available_paths); return available_paths; } From 67ff42295bb324d9daf085021d761f82268889d9 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 12:18:13 +0100 Subject: [PATCH 04/15] [+] update the client option --- demo/demo_client.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 25681f9db..5142dbf0e 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -172,6 +172,7 @@ typedef struct xqc_demo_cli_quic_config_s { uint8_t mp_version; uint8_t send_path_standby; + xqc_msec_t path_status_timer_threshold; } xqc_demo_cli_quic_config_t; @@ -399,6 +400,8 @@ typedef struct xqc_demo_cli_user_conn_s { int send_path_standby; int path_status; /* 0:available 1:standby */ + xqc_msec_t path_status_time; + xqc_msec_t path_status_timer_threshold; } xqc_demo_cli_user_conn_t; static void @@ -1093,12 +1096,16 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ + user_conn->path_status_time = xqc_demo_now(); printf("mark initial path standby\n"); } else if (user_conn->path_status == 1) { - xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); - user_conn->path_status = 0; /* 0:available */ - printf("mark initial path available\n"); + xqc_msec_t ts_now = xqc_demo_now(); + if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { + xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); + user_conn->path_status = 0; /* 0:available */ + printf("mark initial path available\n"); + } } } @@ -1739,7 +1746,7 @@ xqc_demo_cli_usage(int argc, char *argv[]) " -T Throttle recving rate (Bps)\n" " -R Reinjection (1,2,4) \n" " -V Multipath Version (4,5,6)\n" - " -B Set path B standby after 600ms\n" + " -B Set initial path standby after recvd first application data, and set initial path available after X ms\n" " -I Idle interval between requests (ms)\n" " -n Throttling the {1,2,...}xn-th requests\n" " -e NAT rebinding on path 0\n" @@ -1956,6 +1963,7 @@ xqc_demo_cli_parse_args(int argc, char *argv[], xqc_demo_cli_client_args_t *args case 'B': printf("option multipath set path status: %s\n", optarg); args->quic_cfg.send_path_standby = 1; + args->quic_cfg.path_status_timer_threshold = atoi(optarg); break; case 'I': @@ -2407,6 +2415,7 @@ xqc_demo_cli_init_xquic_connection(xqc_demo_cli_user_conn_t *user_conn, { user_conn->send_path_standby = 1; user_conn->path_status = 0; + user_conn->path_status_timer_threshold = args->quic_cfg.path_status_timer_threshold; } return 0; From 15b82fd87f47b4d7f88d67e94c2dd8308704aa0a Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 12:24:52 +0100 Subject: [PATCH 05/15] [+] add threshold option for path standby and available --- demo/demo_client.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 5142dbf0e..5ef023681 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1088,23 +1088,31 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no xqc_demo_cli_task_ctx_t *ctx = &user_stream->user_conn->ctx->task_ctx; xqc_demo_cli_user_conn_t *user_conn = user_stream->user_conn; uint32_t task_idx = user_conn->task->task_idx; + xqc_msec_t ts_now = 0; if (user_conn->send_path_standby) { /* set initial path standby here */ if (user_conn->path_status == 0 && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) { - xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); - user_conn->path_status = 1; /* 1:standby */ - user_conn->path_status_time = xqc_demo_now(); - printf("mark initial path standby\n"); + ts_now = xqc_demo_now(); + if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { + xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); + user_conn->path_status = 1; /* 1:standby */ + printf("mark initial path standby: now=" PRId64 "\n", user_conn->path_status_time); + + user_conn->path_status_time = ts_now; + } } else if (user_conn->path_status == 1) { - xqc_msec_t ts_now = xqc_demo_now(); + ts_now = xqc_demo_now(); if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 0; /* 0:available */ - printf("mark initial path available\n"); + printf("mark initial path available: now=" PRId64 ", threshold=" PRId64 "\n", + user_conn->path_status_time, user_conn->path_status_timer_threshold); + + user_conn->path_status_time = ts_now; } } } @@ -2416,6 +2424,7 @@ xqc_demo_cli_init_xquic_connection(xqc_demo_cli_user_conn_t *user_conn, user_conn->send_path_standby = 1; user_conn->path_status = 0; user_conn->path_status_timer_threshold = args->quic_cfg.path_status_timer_threshold; + user_conn->path_status_time = 0; } return 0; From 18bfcc1316bab9c6689f8d3a51728690a6573393 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 12:27:18 +0100 Subject: [PATCH 06/15] [~] fix log format --- demo/demo_client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 5ef023681..94912857b 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1099,7 +1099,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ - printf("mark initial path standby: now=" PRId64 "\n", user_conn->path_status_time); + printf("mark initial path standby: now=" PRIu64 "\n", user_conn->path_status_time); user_conn->path_status_time = ts_now; } @@ -1109,7 +1109,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 0; /* 0:available */ - printf("mark initial path available: now=" PRId64 ", threshold=" PRId64 "\n", + printf("mark initial path available: now=" PRIu64 ", threshold=" PRIu64 "\n", user_conn->path_status_time, user_conn->path_status_timer_threshold); user_conn->path_status_time = ts_now; From f74b35d14471ae4d869f1642b6424c6372465ce9 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 12:30:03 +0100 Subject: [PATCH 07/15] [=] format fix --- demo/demo_client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 94912857b..cd66651c0 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1099,7 +1099,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ - printf("mark initial path standby: now=" PRIu64 "\n", user_conn->path_status_time); + printf("mark initial path standby: now="PRIu64"\n", user_conn->path_status_time); user_conn->path_status_time = ts_now; } @@ -1109,7 +1109,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 0; /* 0:available */ - printf("mark initial path available: now=" PRIu64 ", threshold=" PRIu64 "\n", + printf("mark initial path available: now="PRIu64", threshold="PRIu64"\n", user_conn->path_status_time, user_conn->path_status_timer_threshold); user_conn->path_status_time = ts_now; From dd61474e564035ba804f120378e6d1d4e8a63696 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 12:32:41 +0100 Subject: [PATCH 08/15] [=] log format --- demo/demo_client.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index cd66651c0..2877224f8 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1088,7 +1088,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no xqc_demo_cli_task_ctx_t *ctx = &user_stream->user_conn->ctx->task_ctx; xqc_demo_cli_user_conn_t *user_conn = user_stream->user_conn; uint32_t task_idx = user_conn->task->task_idx; - xqc_msec_t ts_now = 0; + xqc_msec_t ts_now = 0, path_status_time = 0; if (user_conn->send_path_standby) { /* set initial path standby here */ @@ -1099,7 +1099,6 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ - printf("mark initial path standby: now="PRIu64"\n", user_conn->path_status_time); user_conn->path_status_time = ts_now; } @@ -1109,8 +1108,6 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 0; /* 0:available */ - printf("mark initial path available: now="PRIu64", threshold="PRIu64"\n", - user_conn->path_status_time, user_conn->path_status_timer_threshold); user_conn->path_status_time = ts_now; } From 85caeb7c8fc10d5c07de098251eda0092a7a18a9 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 12:41:15 +0100 Subject: [PATCH 09/15] [+] add logs --- demo/demo_client.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 2877224f8..584168695 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1088,28 +1088,33 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no xqc_demo_cli_task_ctx_t *ctx = &user_stream->user_conn->ctx->task_ctx; xqc_demo_cli_user_conn_t *user_conn = user_stream->user_conn; uint32_t task_idx = user_conn->task->task_idx; - xqc_msec_t ts_now = 0, path_status_time = 0; + xqc_msec_t ts_now = xqc_demo_now(), path_status_time = 0; if (user_conn->send_path_standby) { /* set initial path standby here */ if (user_conn->path_status == 0 && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) { - ts_now = xqc_demo_now(); + printf("try mark_path_standby: now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", + ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ user_conn->path_status_time = ts_now; + printf("mark_path_standby: path_id=0"); } } else if (user_conn->path_status == 1) { - ts_now = xqc_demo_now(); + printf("try mark_path_available: now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", + ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); + if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 0; /* 0:available */ user_conn->path_status_time = ts_now; + printf("mark_path_available: path_id=0"); } } } From c8f5b8f4cc08ad01c50edc12dc09594dbe722b98 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 13:03:38 +0100 Subject: [PATCH 10/15] [+] add more logs --- demo/demo_client.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 584168695..3b21c9c1d 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1091,12 +1091,17 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no xqc_msec_t ts_now = xqc_demo_now(), path_status_time = 0; if (user_conn->send_path_standby) { + + printf("try set path status: path_status=%d now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", + user_conn->path_status, ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); + /* set initial path standby here */ if (user_conn->path_status == 0 && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) { printf("try mark_path_standby: now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", - ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); + ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); + if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ From 2313d996a02f700f13eda975c57b9bdcd841f3d2 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 13:09:22 +0100 Subject: [PATCH 11/15] [=] delete unused logs --- demo/demo_client.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 3b21c9c1d..e09828830 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1099,9 +1099,6 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no if (user_conn->path_status == 0 && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) { - printf("try mark_path_standby: now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", - ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); - if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); user_conn->path_status = 1; /* 1:standby */ @@ -1111,8 +1108,6 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no } } else if (user_conn->path_status == 1) { - printf("try mark_path_available: now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", - ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); From 53ed4488daf89542fda6645796b40536e4a0c41f Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 13:11:09 +0100 Subject: [PATCH 12/15] [=] log format --- demo/demo_client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index e09828830..f7f7fbcdf 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1104,7 +1104,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no user_conn->path_status = 1; /* 1:standby */ user_conn->path_status_time = ts_now; - printf("mark_path_standby: path_id=0"); + printf("mark_path_standby: path_id=0\n"); } } else if (user_conn->path_status == 1) { @@ -1114,7 +1114,7 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no user_conn->path_status = 0; /* 0:available */ user_conn->path_status_time = ts_now; - printf("mark_path_available: path_id=0"); + printf("mark_path_available: path_id=0\n"); } } } From 5fac8bd01a368d4b7d177e330eee028758317d05 Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 13:13:19 +0100 Subject: [PATCH 13/15] [+] fix million seconds --- demo/demo_client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index f7f7fbcdf..4a363dbf2 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -1971,9 +1971,9 @@ xqc_demo_cli_parse_args(int argc, char *argv[], xqc_demo_cli_client_args_t *args break; case 'B': - printf("option multipath set path status: %s\n", optarg); + printf("option multipath set path status: %s ms\n", optarg); args->quic_cfg.send_path_standby = 1; - args->quic_cfg.path_status_timer_threshold = atoi(optarg); + args->quic_cfg.path_status_timer_threshold = atoi(optarg) * 1000; break; case 'I': From 6fce3e767e40f01ad5ae09ff5231d4db48fbd1ff Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 14:33:44 +0100 Subject: [PATCH 14/15] [+] add trigger for both hq and h3 --- demo/demo_client.c | 68 ++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index 4a363dbf2..b0707480a 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -962,6 +962,41 @@ xqc_demo_cli_hq_req_write_notify(xqc_hq_request_t *hqr, void *req_user_data) return 0; } +void +xqc_demo_path_status_trigger(xqc_demo_cli_user_conn_t *user_conn) +{ + xqc_msec_t ts_now = xqc_demo_now(), path_status_time = 0; + + if (user_conn->send_path_standby) { + + printf("try set path status: path_status=%d now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", + user_conn->path_status, ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); + + /* set initial path standby here */ + if (user_conn->path_status == 0 + && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) + { + if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { + xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); + user_conn->path_status = 1; /* 1:standby */ + + user_conn->path_status_time = ts_now; + printf("mark_path_standby: path_id=0\n"); + } + + } else if (user_conn->path_status == 1) { + + if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { + xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); + user_conn->path_status = 0; /* 0:available */ + + user_conn->path_status_time = ts_now; + printf("mark_path_available: path_id=0\n"); + } + } + } +} + int xqc_demo_cli_hq_req_read_notify(xqc_hq_request_t *hqr, void *req_user_data) { @@ -971,6 +1006,8 @@ xqc_demo_cli_hq_req_read_notify(xqc_hq_request_t *hqr, void *req_user_data) char buff[4096] = {0}; size_t buff_size = 4096; + xqc_demo_path_status_trigger(user_stream->user_conn); + ssize_t read = 0; ssize_t read_sum = 0; do { @@ -1078,6 +1115,7 @@ xqc_demo_cli_h3_request_write_notify(xqc_h3_request_t *h3_request, void *user_da return 0; } + int xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_notify_flag_t flag, void *user_data) @@ -1088,36 +1126,8 @@ xqc_demo_cli_h3_request_read_notify(xqc_h3_request_t *h3_request, xqc_request_no xqc_demo_cli_task_ctx_t *ctx = &user_stream->user_conn->ctx->task_ctx; xqc_demo_cli_user_conn_t *user_conn = user_stream->user_conn; uint32_t task_idx = user_conn->task->task_idx; - xqc_msec_t ts_now = xqc_demo_now(), path_status_time = 0; - - if (user_conn->send_path_standby) { - - printf("try set path status: path_status=%d now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", - user_conn->path_status, ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); - - /* set initial path standby here */ - if (user_conn->path_status == 0 - && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) - { - if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { - xqc_conn_mark_path_standby(user_conn->ctx->engine, &user_conn->cid, 0); - user_conn->path_status = 1; /* 1:standby */ - - user_conn->path_status_time = ts_now; - printf("mark_path_standby: path_id=0\n"); - } - - } else if (user_conn->path_status == 1) { - - if (ts_now > user_conn->path_status_time + user_conn->path_status_timer_threshold) { - xqc_conn_mark_path_available(user_conn->ctx->engine, &user_conn->cid, 0); - user_conn->path_status = 0; /* 0:available */ - user_conn->path_status_time = ts_now; - printf("mark_path_available: path_id=0\n"); - } - } - } + xqc_demo_path_status_trigger(user_conn); // printf("xqc_demo_cli_h3_request_read_notify, h3_request: %p, user_stream: %p\n", h3_request, user_stream); if (flag & XQC_REQ_NOTIFY_READ_HEADER) { From f18b5a169ae323e082a94c3699168ef08c393e2a Mon Sep 17 00:00:00 2001 From: Yanmei-Liu Date: Sun, 5 Nov 2023 14:38:22 +0100 Subject: [PATCH 15/15] [=] delete unused logs --- demo/demo_client.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/demo/demo_client.c b/demo/demo_client.c index b0707480a..b9536a1bb 100644 --- a/demo/demo_client.c +++ b/demo/demo_client.c @@ -969,9 +969,6 @@ xqc_demo_path_status_trigger(xqc_demo_cli_user_conn_t *user_conn) if (user_conn->send_path_standby) { - printf("try set path status: path_status=%d now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", - user_conn->path_status, ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); - /* set initial path standby here */ if (user_conn->path_status == 0 && xqc_conn_available_paths(user_conn->ctx->engine, &user_conn->cid) >= 2) @@ -981,7 +978,8 @@ xqc_demo_path_status_trigger(xqc_demo_cli_user_conn_t *user_conn) user_conn->path_status = 1; /* 1:standby */ user_conn->path_status_time = ts_now; - printf("mark_path_standby: path_id=0\n"); + printf("mark_path_standby: path_id=0 path_status=%d now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", + user_conn->path_status, ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); } } else if (user_conn->path_status == 1) { @@ -991,7 +989,8 @@ xqc_demo_path_status_trigger(xqc_demo_cli_user_conn_t *user_conn) user_conn->path_status = 0; /* 0:available */ user_conn->path_status_time = ts_now; - printf("mark_path_available: path_id=0\n"); + printf("mark_path_available: path_id=0 path_status=%d now=%"PRIu64" pre=%"PRIu64" threshold=%"PRIu64"\n", + user_conn->path_status, ts_now, user_conn->path_status_time, user_conn->path_status_timer_threshold); } } }