comparison src/event/ngx_event_quic_transport.c @ 8596:38c7dd720774 quic

QUIC: added ACK frame range support. The history of acknowledged packet is kept in send context as ranges. Up to NGX_QUIC_MAX_RANGES ranges is stored. As a result, instead of separate ack frames, single frame with ranges is sent.
author Vladimir Homutov <vl@nginx.com>
date Tue, 20 Oct 2020 18:53:00 +0300
parents ee06a813756c
children b3d9e57d0f62
comparison
equal deleted inserted replaced
8595:96798101c3aa 8596:38c7dd720774
1267 1267
1268 1268
1269 static size_t 1269 static size_t
1270 ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack) 1270 ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack)
1271 { 1271 {
1272 size_t len; 1272 size_t len;
1273 u_char *start; 1273 u_char *start;
1274 1274 ngx_uint_t i;
1275 /* minimal ACK packet */ 1275 ngx_quic_ack_range_t *ranges;
1276
1277 ranges = (ngx_quic_ack_range_t *) ack->ranges_start;
1276 1278
1277 if (p == NULL) { 1279 if (p == NULL) {
1278 len = ngx_quic_varint_len(NGX_QUIC_FT_ACK); 1280 len = ngx_quic_varint_len(NGX_QUIC_FT_ACK);
1279 len += ngx_quic_varint_len(ack->largest); 1281 len += ngx_quic_varint_len(ack->largest);
1280 len += ngx_quic_varint_len(ack->delay); 1282 len += ngx_quic_varint_len(ack->delay);
1281 len += ngx_quic_varint_len(0); 1283 len += ngx_quic_varint_len(ack->range_count);
1282 len += ngx_quic_varint_len(ack->first_range); 1284 len += ngx_quic_varint_len(ack->first_range);
1285
1286 for (i = 0; i < ack->range_count; i++) {
1287 len += ngx_quic_varint_len(ranges[i].gap);
1288 len += ngx_quic_varint_len(ranges[i].range);
1289 }
1283 1290
1284 return len; 1291 return len;
1285 } 1292 }
1286 1293
1287 start = p; 1294 start = p;
1288 1295
1289 ngx_quic_build_int(&p, NGX_QUIC_FT_ACK); 1296 ngx_quic_build_int(&p, NGX_QUIC_FT_ACK);
1290 ngx_quic_build_int(&p, ack->largest); 1297 ngx_quic_build_int(&p, ack->largest);
1291 ngx_quic_build_int(&p, ack->delay); 1298 ngx_quic_build_int(&p, ack->delay);
1292 ngx_quic_build_int(&p, 0); 1299 ngx_quic_build_int(&p, ack->range_count);
1293 ngx_quic_build_int(&p, ack->first_range); 1300 ngx_quic_build_int(&p, ack->first_range);
1301
1302 for (i = 0; i < ack->range_count; i++) {
1303 ngx_quic_build_int(&p, ranges[i].gap);
1304 ngx_quic_build_int(&p, ranges[i].range);
1305 }
1294 1306
1295 return p - start; 1307 return p - start;
1296 } 1308 }
1297 1309
1298 1310