Mercurial > hg > nginx
comparison src/event/ngx_event_quic.c @ 8470:0d1ad81dd65c quic
QUIC: delay field of an ACK frame is now calculated.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Fri, 10 Jul 2020 15:33:51 +0300 |
parents | 3b107aadc9f6 |
children | 9ed4c12ec948 |
comparison
equal
deleted
inserted
replaced
8469:3b107aadc9f6 | 8470:0d1ad81dd65c |
---|---|
186 static ngx_int_t ngx_quic_app_input(ngx_connection_t *c, | 186 static ngx_int_t ngx_quic_app_input(ngx_connection_t *c, |
187 ngx_quic_header_t *pkt); | 187 ngx_quic_header_t *pkt); |
188 static ngx_int_t ngx_quic_payload_handler(ngx_connection_t *c, | 188 static ngx_int_t ngx_quic_payload_handler(ngx_connection_t *c, |
189 ngx_quic_header_t *pkt); | 189 ngx_quic_header_t *pkt); |
190 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_header_t *pkt); | 190 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_header_t *pkt); |
191 static ngx_int_t ngx_quic_ack_delay(ngx_connection_t *c, | |
192 struct timeval *received, enum ssl_encryption_level_t level); | |
191 static ngx_int_t ngx_quic_send_cc(ngx_connection_t *c); | 193 static ngx_int_t ngx_quic_send_cc(ngx_connection_t *c); |
192 static ngx_int_t ngx_quic_send_new_token(ngx_connection_t *c); | 194 static ngx_int_t ngx_quic_send_new_token(ngx_connection_t *c); |
193 | 195 |
194 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c, | 196 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c, |
195 ngx_quic_header_t *pkt, ngx_quic_ack_frame_t *f); | 197 ngx_quic_header_t *pkt, ngx_quic_ack_frame_t *f); |
1875 if (rc != NGX_OK) { | 1877 if (rc != NGX_OK) { |
1876 qc->error = pkt->error; | 1878 qc->error = pkt->error; |
1877 return rc; | 1879 return rc; |
1878 } | 1880 } |
1879 | 1881 |
1882 ngx_gettimeofday(&pkt->received); | |
1883 | |
1880 /* switch keys on Key Phase change */ | 1884 /* switch keys on Key Phase change */ |
1881 | 1885 |
1882 if (pkt->key_update) { | 1886 if (pkt->key_update) { |
1883 c->quic->key_phase ^= 1; | 1887 c->quic->key_phase ^= 1; |
1884 | 1888 |
2130 ? ssl_encryption_application | 2134 ? ssl_encryption_application |
2131 : pkt->level; | 2135 : pkt->level; |
2132 | 2136 |
2133 frame->type = NGX_QUIC_FT_ACK; | 2137 frame->type = NGX_QUIC_FT_ACK; |
2134 frame->u.ack.largest = pkt->pn; | 2138 frame->u.ack.largest = pkt->pn; |
2139 frame->u.ack.delay = ngx_quic_ack_delay(c, &pkt->received, frame->level); | |
2135 | 2140 |
2136 ngx_sprintf(frame->info, "ACK for PN=%d from frame handler level=%d", | 2141 ngx_sprintf(frame->info, "ACK for PN=%d from frame handler level=%d", |
2137 pkt->pn, frame->level); | 2142 pkt->pn, frame->level); |
2138 ngx_quic_queue_frame(c->quic, frame); | 2143 ngx_quic_queue_frame(c->quic, frame); |
2139 | 2144 |
2140 return NGX_OK; | 2145 return NGX_OK; |
2146 } | |
2147 | |
2148 | |
2149 static ngx_int_t | |
2150 ngx_quic_ack_delay(ngx_connection_t *c, struct timeval *received, | |
2151 enum ssl_encryption_level_t level) | |
2152 { | |
2153 ngx_int_t ack_delay; | |
2154 struct timeval tv; | |
2155 | |
2156 ack_delay = 0; | |
2157 | |
2158 if (level == ssl_encryption_application) { | |
2159 ngx_gettimeofday(&tv); | |
2160 ack_delay = (tv.tv_sec - received->tv_sec) * 1000000 | |
2161 + tv.tv_usec - received->tv_usec; | |
2162 ack_delay >>= c->quic->ctp.ack_delay_exponent; | |
2163 } | |
2164 | |
2165 return ack_delay; | |
2141 } | 2166 } |
2142 | 2167 |
2143 | 2168 |
2144 static ngx_int_t | 2169 static ngx_int_t |
2145 ngx_quic_send_cc(ngx_connection_t *c) | 2170 ngx_quic_send_cc(ngx_connection_t *c) |