Skip to content

Commit

Permalink
QUIC: reschedule path validation on path insertion/removal.
Browse files Browse the repository at this point in the history
Two issues fixed:
- new path validation could be scheduled late
- a validated path could leave a spurious timer
  • Loading branch information
pluknet committed May 9, 2023
1 parent 8946798 commit 12fa86d
Showing 1 changed file with 45 additions and 3 deletions.
48 changes: 45 additions & 3 deletions src/event/quic/ngx_event_quic_migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ static ngx_int_t ngx_quic_validate_path(ngx_connection_t *c,
ngx_quic_path_t *path);
static ngx_int_t 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);
static ngx_quic_path_t *ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag);


Expand Down Expand Up @@ -169,6 +170,8 @@ ngx_quic_handle_path_response_frame(ngx_connection_t *c,
path->validating = 0;
path->limited = 0;

ngx_quic_set_path_timer(c);

return NGX_OK;
}

Expand Down Expand Up @@ -515,9 +518,7 @@ ngx_quic_validate_path(ngx_connection_t *c, ngx_quic_path_t *path)

path->expires = ngx_current_msec + pto;

if (!qc->path_validation.timer_set) {
ngx_add_timer(&qc->path_validation, pto);
}
ngx_quic_set_path_timer(c);

return NGX_OK;
}
Expand Down Expand Up @@ -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
ngx_quic_path_validation_handler(ngx_event_t *ev)
{
Expand Down

0 comments on commit 12fa86d

Please sign in to comment.