Mercurial > hg > nginx-quic
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) |