comparison src/event/quic/ngx_event_quic_transport.c @ 8291:9ed95726b99b quic

QUIC: send PING frames on PTO expiration. Two PING frames are sent per level that generate two UDP datagrams.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 12 Feb 2021 14:51:53 +0300
parents 0697294f79a4
children e24e5650d7b4
comparison
equal deleted inserted replaced
8290:faa3201ff351 8291:9ed95726b99b
91 static size_t ngx_quic_create_short_header(ngx_quic_header_t *pkt, u_char *out, 91 static size_t ngx_quic_create_short_header(ngx_quic_header_t *pkt, u_char *out,
92 size_t pkt_len, u_char **pnp); 92 size_t pkt_len, u_char **pnp);
93 93
94 static ngx_int_t ngx_quic_frame_allowed(ngx_quic_header_t *pkt, 94 static ngx_int_t ngx_quic_frame_allowed(ngx_quic_header_t *pkt,
95 ngx_uint_t frame_type); 95 ngx_uint_t frame_type);
96 static size_t ngx_quic_create_ping(u_char *p);
96 static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack, 97 static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack,
97 ngx_chain_t *ranges); 98 ngx_chain_t *ranges);
98 static size_t ngx_quic_create_stop_sending(u_char *p, 99 static size_t ngx_quic_create_stop_sending(u_char *p,
99 ngx_quic_stop_sending_frame_t *ss); 100 ngx_quic_stop_sending_frame_t *ss);
100 static size_t ngx_quic_create_crypto(u_char *p, 101 static size_t ngx_quic_create_crypto(u_char *p,
1218 * CONNECTION_CLOSE are considered ack-eliciting. 1219 * CONNECTION_CLOSE are considered ack-eliciting.
1219 */ 1220 */
1220 f->need_ack = 1; 1221 f->need_ack = 1;
1221 1222
1222 switch (f->type) { 1223 switch (f->type) {
1224 case NGX_QUIC_FT_PING:
1225 return ngx_quic_create_ping(p);
1226
1223 case NGX_QUIC_FT_ACK: 1227 case NGX_QUIC_FT_ACK:
1224 f->need_ack = 0; 1228 f->need_ack = 0;
1225 return ngx_quic_create_ack(p, &f->u.ack, f->data); 1229 return ngx_quic_create_ack(p, &f->u.ack, f->data);
1226 1230
1227 case NGX_QUIC_FT_STOP_SENDING: 1231 case NGX_QUIC_FT_STOP_SENDING:
1271 1275
1272 default: 1276 default:
1273 /* BUG: unsupported frame type generated */ 1277 /* BUG: unsupported frame type generated */
1274 return NGX_ERROR; 1278 return NGX_ERROR;
1275 } 1279 }
1280 }
1281
1282
1283 static size_t
1284 ngx_quic_create_ping(u_char *p)
1285 {
1286 u_char *start;
1287
1288 if (p == NULL) {
1289 return ngx_quic_varint_len(NGX_QUIC_FT_PING);
1290 }
1291
1292 start = p;
1293
1294 ngx_quic_build_int(&p, NGX_QUIC_FT_PING);
1295
1296 return p - start;
1276 } 1297 }
1277 1298
1278 1299
1279 static size_t 1300 static size_t
1280 ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack, ngx_chain_t *ranges) 1301 ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack, ngx_chain_t *ranges)