comparison src/event/ngx_event_quic.c @ 7988: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
7987:3b107aadc9f6 7988: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)