summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/event/quic/ngx_event_quic_connection.h2
-rw-r--r--src/event/quic/ngx_event_quic_migration.c38
-rw-r--r--src/event/quic/ngx_event_quic_migration.h2
-rw-r--r--src/event/quic/ngx_event_quic_socket.c1
4 files changed, 15 insertions, 28 deletions
diff --git a/src/event/quic/ngx_event_quic_connection.h b/src/event/quic/ngx_event_quic_connection.h
index ee80342fa..7b6afb123 100644
--- a/src/event/quic/ngx_event_quic_connection.h
+++ b/src/event/quic/ngx_event_quic_connection.h
@@ -86,6 +86,7 @@ struct ngx_quic_path_s {
socklen_t socklen;
ngx_uint_t state;
ngx_msec_t expires;
+ ngx_msec_t last_seen;
ngx_uint_t tries;
off_t sent;
off_t received;
@@ -93,7 +94,6 @@ struct ngx_quic_path_s {
u_char challenge2[8];
ngx_uint_t refcnt;
uint64_t seqnum;
- time_t validated_at;
ngx_str_t addr_text;
u_char text[NGX_SOCKADDR_STRLEN];
};
diff --git a/src/event/quic/ngx_event_quic_migration.c b/src/event/quic/ngx_event_quic_migration.c
index f2a9f5bfd..0bfee6058 100644
--- a/src/event/quic/ngx_event_quic_migration.c
+++ b/src/event/quic/ngx_event_quic_migration.c
@@ -158,7 +158,6 @@ valid:
"quic path #%uL successfully validated", path->seqnum);
path->state = NGX_QUIC_PATH_VALIDATED;
- path->validated_at = ngx_time();
return NGX_OK;
}
@@ -217,6 +216,7 @@ ngx_quic_add_path(ngx_connection_t *c, struct sockaddr *sockaddr,
}
path->seqnum = qc->path_seqnum++;
+ path->last_seen = ngx_current_msec;
path->socklen = socklen;
ngx_memcpy(path->sockaddr, sockaddr, socklen);
@@ -272,6 +272,7 @@ ngx_quic_update_paths(ngx_connection_t *c, ngx_quic_header_t *pkt)
ngx_quic_client_id_t *cid;
ngx_quic_connection_t *qc;
+ qc = ngx_quic_get_connection(c);
qsock = ngx_quic_get_socket(c);
if (c->udp->dgram == NULL) {
@@ -313,7 +314,6 @@ ngx_quic_update_paths(ngx_connection_t *c, ngx_quic_header_t *pkt)
cid = ngx_quic_used_client_id(c, path);
if (cid == NULL) {
- qc = ngx_quic_get_connection(c);
qc->error = NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR;
qc->error_reason = "no available client ids for new path";
@@ -328,6 +328,17 @@ ngx_quic_update_paths(ngx_connection_t *c, ngx_quic_header_t *pkt)
update:
+ if (path->state != NGX_QUIC_PATH_NEW) {
+ /* force limits/revalidation for paths that were not seen recently */
+ if (ngx_current_msec - path->last_seen > qc->tp.max_idle_timeout) {
+ path->state = NGX_QUIC_PATH_NEW;
+ path->sent = 0;
+ path->received = 0;
+ }
+ }
+
+ path->last_seen = ngx_current_msec;
+
len = pkt->raw->last - pkt->raw->start;
/* TODO: this may be too late in some cases;
@@ -396,31 +407,10 @@ ngx_quic_handle_migration(ngx_connection_t *c, ngx_quic_header_t *pkt)
qsock->sid.seqnum, qsock->cid->seqnum, next->seqnum,
ngx_quic_path_state_str(next));
- switch (next->state) {
- case NGX_QUIC_PATH_NEW:
+ if (next->state == NGX_QUIC_PATH_NEW) {
if (ngx_quic_validate_path(c, qsock) != NGX_OK) {
return NGX_ERROR;
}
- break;
-
- /* migration to previously known path */
-
- case NGX_QUIC_PATH_VALIDATING:
- /* alredy validating, nothing to do */
- break;
-
- case NGX_QUIC_PATH_VALIDATED:
- /* if path is old enough, revalidate */
- if (ngx_time() - next->validated_at > NGX_QUIC_PATH_VALID_TIME) {
-
- next->state = NGX_QUIC_PATH_NEW;
-
- if (ngx_quic_validate_path(c, qsock) != NGX_OK) {
- return NGX_ERROR;
- }
- }
-
- break;
}
ctx = ngx_quic_get_send_ctx(qc, pkt->level);
diff --git a/src/event/quic/ngx_event_quic_migration.h b/src/event/quic/ngx_event_quic_migration.h
index 4ad3213b6..4bb5a2a1a 100644
--- a/src/event/quic/ngx_event_quic_migration.h
+++ b/src/event/quic/ngx_event_quic_migration.h
@@ -17,8 +17,6 @@
#define NGX_QUIC_PATH_VALIDATING 1
#define NGX_QUIC_PATH_VALIDATED 2
-#define NGX_QUIC_PATH_VALID_TIME 600 /* seconds */
-
#define ngx_quic_path_state_str(p) \
((p)->state == NGX_QUIC_PATH_NEW) ? "new" : \
diff --git a/src/event/quic/ngx_event_quic_socket.c b/src/event/quic/ngx_event_quic_socket.c
index 4a9fb232d..2b9b0fed3 100644
--- a/src/event/quic/ngx_event_quic_socket.c
+++ b/src/event/quic/ngx_event_quic_socket.c
@@ -82,7 +82,6 @@ ngx_quic_open_sockets(ngx_connection_t *c, ngx_quic_connection_t *qc,
if (pkt->validated) {
path->state = NGX_QUIC_PATH_VALIDATED;
- path->validated_at = ngx_time();
}
/* now bind socket to client and path */