mirror of
https://github.com/nginx/nginx.git
synced 2025-07-25 06:37:58 +08:00
QUIC: reschedule path validation on path insertion/removal.
Two issues fixed: - new path validation could be scheduled late - a validated path could leave a spurious timer
This commit is contained in:
parent
894679804b
commit
12fa86dd92
@ -16,6 +16,7 @@ static ngx_int_t ngx_quic_validate_path(ngx_connection_t *c,
|
|||||||
ngx_quic_path_t *path);
|
ngx_quic_path_t *path);
|
||||||
static ngx_int_t ngx_quic_send_path_challenge(ngx_connection_t *c,
|
static ngx_int_t ngx_quic_send_path_challenge(ngx_connection_t *c,
|
||||||
ngx_quic_path_t *path);
|
ngx_quic_path_t *path);
|
||||||
|
static void ngx_quic_set_path_timer(ngx_connection_t *c);
|
||||||
static ngx_quic_path_t *ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag);
|
static ngx_quic_path_t *ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag);
|
||||||
|
|
||||||
|
|
||||||
@ -169,6 +170,8 @@ valid:
|
|||||||
path->validating = 0;
|
path->validating = 0;
|
||||||
path->limited = 0;
|
path->limited = 0;
|
||||||
|
|
||||||
|
ngx_quic_set_path_timer(c);
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,9 +518,7 @@ ngx_quic_validate_path(ngx_connection_t *c, ngx_quic_path_t *path)
|
|||||||
|
|
||||||
path->expires = ngx_current_msec + pto;
|
path->expires = ngx_current_msec + pto;
|
||||||
|
|
||||||
if (!qc->path_validation.timer_set) {
|
ngx_quic_set_path_timer(c);
|
||||||
ngx_add_timer(&qc->path_validation, pto);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
@ -563,6 +564,47 @@ ngx_quic_send_path_challenge(ngx_connection_t *c, ngx_quic_path_t *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
ngx_quic_set_path_timer(ngx_connection_t *c)
|
||||||
|
{
|
||||||
|
ngx_msec_t now;
|
||||||
|
ngx_queue_t *q;
|
||||||
|
ngx_msec_int_t left, next;
|
||||||
|
ngx_quic_path_t *path;
|
||||||
|
ngx_quic_connection_t *qc;
|
||||||
|
|
||||||
|
qc = ngx_quic_get_connection(c);
|
||||||
|
|
||||||
|
now = ngx_current_msec;
|
||||||
|
next = -1;
|
||||||
|
|
||||||
|
for (q = ngx_queue_head(&qc->paths);
|
||||||
|
q != ngx_queue_sentinel(&qc->paths);
|
||||||
|
q = ngx_queue_next(q))
|
||||||
|
{
|
||||||
|
path = ngx_queue_data(q, ngx_quic_path_t, queue);
|
||||||
|
|
||||||
|
if (!path->validating) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
left = path->expires - now;
|
||||||
|
left = ngx_max(left, 1);
|
||||||
|
|
||||||
|
if (next == -1 || left < next) {
|
||||||
|
next = left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next != -1) {
|
||||||
|
ngx_add_timer(&qc->path_validation, next);
|
||||||
|
|
||||||
|
} else if (qc->path_validation.timer_set) {
|
||||||
|
ngx_del_timer(&qc->path_validation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ngx_quic_path_validation_handler(ngx_event_t *ev)
|
ngx_quic_path_validation_handler(ngx_event_t *ev)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user