lsquic_send_ctl.c revision 03e6b668
1/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ 2/* 3 * lsquic_send_ctl.c -- Logic for sending and sent packets 4 */ 5 6#include <assert.h> 7#include <errno.h> 8#include <inttypes.h> 9#include <stdlib.h> 10#include <string.h> 11#include <sys/queue.h> 12 13#include "lsquic_types.h" 14#include "lsquic_int_types.h" 15#include "lsquic.h" 16#include "lsquic_mm.h" 17#include "lsquic_engine_public.h" 18#include "lsquic_packet_common.h" 19#include "lsquic_alarmset.h" 20#include "lsquic_parse.h" 21#include "lsquic_packet_out.h" 22#include "lsquic_senhist.h" 23#include "lsquic_rtt.h" 24#include "lsquic_cubic.h" 25#include "lsquic_pacer.h" 26#include "lsquic_bw_sampler.h" 27#include "lsquic_minmax.h" 28#include "lsquic_bbr.h" 29#include "lsquic_send_ctl.h" 30#include "lsquic_util.h" 31#include "lsquic_sfcw.h" 32#include "lsquic_varint.h" 33#include "lsquic_hq.h" 34#include "lsquic_hash.h" 35#include "lsquic_stream.h" 36#include "lsquic_ver_neg.h" 37#include "lsquic_ev_log.h" 38#include "lsquic_conn.h" 39#include "lsquic_conn_flow.h" 40#include "lsquic_conn_public.h" 41#include "lsquic_cong_ctl.h" 42#include "lsquic_enc_sess.h" 43#include "lsquic_hash.h" 44#include "lsquic_malo.h" 45#include "lsquic_attq.h" 46 47#define LSQUIC_LOGGER_MODULE LSQLM_SENDCTL 48#define LSQUIC_LOG_CONN_ID lsquic_conn_log_cid(ctl->sc_conn_pub->lconn) 49#include "lsquic_logger.h" 50 51#define MAX_RESUBMITTED_ON_RTO 2 52#define MAX_RTO_BACKOFFS 10 53#define DEFAULT_RETX_DELAY 500000 /* Microseconds */ 54#define MAX_RTO_DELAY 60000000 /* Microseconds */ 55#define MIN_RTO_DELAY 1000000 /* Microseconds */ 56#define N_NACKS_BEFORE_RETX 3 57 58#define CGP(ctl) ((struct cong_ctl *) &(ctl)->sc_cong_u) 59 60#define packet_out_total_sz(p) \ 61 lsquic_packet_out_total_sz(ctl->sc_conn_pub->lconn, p) 62#define packet_out_sent_sz(p) \ 63 lsquic_packet_out_sent_sz(ctl->sc_conn_pub->lconn, p) 64 65enum retx_mode { 66 RETX_MODE_HANDSHAKE, 67 RETX_MODE_LOSS, 68 RETX_MODE_TLP, 69 RETX_MODE_RTO, 70}; 71 72 73static const char *const retx2str[] = { 74 [RETX_MODE_HANDSHAKE] = "RETX_MODE_HANDSHAKE", 75 [RETX_MODE_LOSS] = "RETX_MODE_LOSS", 76 [RETX_MODE_TLP] = "RETX_MODE_TLP", 77 [RETX_MODE_RTO] = "RETX_MODE_RTO", 78}; 79 80#ifdef NDEBUG 81#define MAX_BPQ_COUNT 10 82#else 83static unsigned MAX_BPQ_COUNT = 10; 84void 85lsquic_send_ctl_set_max_bpq_count (unsigned count) { MAX_BPQ_COUNT = count; } 86#endif 87 88 89static void 90update_for_resending (lsquic_send_ctl_t *ctl, lsquic_packet_out_t *packet_out); 91 92 93enum expire_filter { EXFI_ALL, EXFI_HSK, EXFI_LAST, }; 94 95 96static void 97send_ctl_expire (struct lsquic_send_ctl *, enum packnum_space, 98 enum expire_filter); 99 100static void 101set_retx_alarm (struct lsquic_send_ctl *, enum packnum_space, lsquic_time_t); 102 103static void 104send_ctl_detect_losses (struct lsquic_send_ctl *, enum packnum_space, 105 lsquic_time_t time); 106 107static unsigned 108send_ctl_retx_bytes_out (const struct lsquic_send_ctl *ctl); 109 110static unsigned 111send_ctl_all_bytes_out (const struct lsquic_send_ctl *ctl); 112 113 114#ifdef NDEBUG 115static 116#elif __GNUC__ 117__attribute__((weak)) 118#endif 119int 120lsquic_send_ctl_schedule_stream_packets_immediately (lsquic_send_ctl_t *ctl) 121{ 122 return !(ctl->sc_flags & SC_BUFFER_STREAM); 123} 124 125 126#ifdef NDEBUG 127static 128#elif __GNUC__ 129__attribute__((weak)) 130#endif 131enum packno_bits 132lsquic_send_ctl_guess_packno_bits (lsquic_send_ctl_t *ctl) 133{ 134 return PACKNO_BITS_1; /* This is 2 bytes in both GQUIC and IQUIC */ 135} 136 137 138int 139lsquic_send_ctl_have_unacked_stream_frames (const lsquic_send_ctl_t *ctl) 140{ 141 const lsquic_packet_out_t *packet_out; 142 143 TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[PNS_APP], po_next) 144 if (0 == (packet_out->po_flags & PO_LOSS_REC) 145 && (packet_out->po_frame_types & 146 ((1 << QUIC_FRAME_STREAM) | (1 << QUIC_FRAME_RST_STREAM)))) 147 return 1; 148 149 return 0; 150} 151 152 153static lsquic_packet_out_t * 154send_ctl_first_unacked_retx_packet (const struct lsquic_send_ctl *ctl, 155 enum packnum_space pns) 156{ 157 lsquic_packet_out_t *packet_out; 158 159 TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[pns], po_next) 160 if (0 == (packet_out->po_flags & PO_LOSS_REC) 161 && (packet_out->po_frame_types & ctl->sc_retx_frames)) 162 return packet_out; 163 164 return NULL; 165} 166 167 168static lsquic_packet_out_t * 169send_ctl_last_unacked_retx_packet (const struct lsquic_send_ctl *ctl, 170 enum packnum_space pns) 171{ 172 lsquic_packet_out_t *packet_out; 173 TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_unacked_packets[pns], 174 lsquic_packets_tailq, po_next) 175 if (0 == (packet_out->po_flags & PO_LOSS_REC) 176 && (packet_out->po_frame_types & ctl->sc_retx_frames)) 177 return packet_out; 178 return NULL; 179} 180 181 182static int 183have_unacked_handshake_packets (const lsquic_send_ctl_t *ctl) 184{ 185 const lsquic_packet_out_t *packet_out; 186 enum packnum_space pns; 187 188 for (pns = ctl->sc_flags & SC_IETF ? PNS_INIT : PNS_APP; pns < N_PNS; ++pns) 189 TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[pns], po_next) 190 if (packet_out->po_flags & PO_HELLO) 191 return 1; 192 return 0; 193} 194 195 196static enum retx_mode 197get_retx_mode (const lsquic_send_ctl_t *ctl) 198{ 199 if (!(ctl->sc_conn_pub->lconn->cn_flags & LSCONN_HANDSHAKE_DONE) 200 && have_unacked_handshake_packets(ctl)) 201 return RETX_MODE_HANDSHAKE; 202 if (ctl->sc_loss_to) 203 return RETX_MODE_LOSS; 204 if (ctl->sc_n_tlp < 2) 205 return RETX_MODE_TLP; 206 return RETX_MODE_RTO; 207} 208 209 210static lsquic_time_t 211get_retx_delay (const struct lsquic_rtt_stats *rtt_stats) 212{ 213 lsquic_time_t srtt, delay; 214 215 srtt = lsquic_rtt_stats_get_srtt(rtt_stats); 216 if (srtt) 217 { 218 delay = srtt + 4 * lsquic_rtt_stats_get_rttvar(rtt_stats); 219 if (delay < MIN_RTO_DELAY) 220 delay = MIN_RTO_DELAY; 221 } 222 else 223 delay = DEFAULT_RETX_DELAY; 224 225 return delay; 226} 227 228 229static void 230retx_alarm_rings (enum alarm_id al_id, void *ctx, lsquic_time_t expiry, lsquic_time_t now) 231{ 232 lsquic_send_ctl_t *ctl = ctx; 233 lsquic_packet_out_t *packet_out; 234 enum packnum_space pns; 235 enum retx_mode rm; 236 237 pns = al_id - AL_RETX_INIT; 238 239 /* This is a callback -- before it is called, the alarm is unset */ 240 assert(!lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_INIT + pns)); 241 242 rm = get_retx_mode(ctl); 243 LSQ_INFO("retx timeout, mode %s", retx2str[rm]); 244 245 switch (rm) 246 { 247 case RETX_MODE_HANDSHAKE: 248 send_ctl_expire(ctl, pns, EXFI_HSK); 249 /* Do not register cubic loss during handshake */ 250 break; 251 case RETX_MODE_LOSS: 252 send_ctl_detect_losses(ctl, pns, now); 253 break; 254 case RETX_MODE_TLP: 255 ++ctl->sc_n_tlp; 256 send_ctl_expire(ctl, pns, EXFI_LAST); 257 break; 258 case RETX_MODE_RTO: 259 ctl->sc_last_rto_time = now; 260 ++ctl->sc_n_consec_rtos; 261 ctl->sc_next_limit = 2; 262 LSQ_DEBUG("packet RTO is %"PRIu64" usec", expiry); 263 send_ctl_expire(ctl, pns, EXFI_ALL); 264 ctl->sc_ci->cci_timeout(CGP(ctl)); 265 break; 266 } 267 268 packet_out = send_ctl_first_unacked_retx_packet(ctl, pns); 269 if (packet_out) 270 set_retx_alarm(ctl, pns, now); 271 lsquic_send_ctl_sanity_check(ctl); 272} 273 274 275static lsquic_packno_t 276first_packno (const struct lsquic_send_ctl *ctl) 277{ 278 if (ctl->sc_flags & SC_IETF) 279 return 0; 280 else 281 return 1; 282} 283 284 285/* 286 * [draft-ietf-quic-transport-12], Section 4.4.1: 287 * 288 * " The first Initial packet that is sent by a client contains a packet 289 * " number of 0. All subsequent packets contain a packet number that is 290 * " incremented by at least one, see (Section 4.8). 291 */ 292static void 293send_ctl_pick_initial_packno (struct lsquic_send_ctl *ctl) 294{ 295 ctl->sc_cur_packno = first_packno(ctl) - 1; 296} 297 298 299void 300lsquic_send_ctl_init (lsquic_send_ctl_t *ctl, struct lsquic_alarmset *alset, 301 struct lsquic_engine_public *enpub, const struct ver_neg *ver_neg, 302 struct lsquic_conn_public *conn_pub, enum send_ctl_flags flags) 303{ 304 unsigned i, algo; 305 memset(ctl, 0, sizeof(*ctl)); 306 TAILQ_INIT(&ctl->sc_scheduled_packets); 307 TAILQ_INIT(&ctl->sc_unacked_packets[PNS_INIT]); 308 TAILQ_INIT(&ctl->sc_unacked_packets[PNS_HSK]); 309 TAILQ_INIT(&ctl->sc_unacked_packets[PNS_APP]); 310 TAILQ_INIT(&ctl->sc_lost_packets); 311 ctl->sc_enpub = enpub; 312 ctl->sc_alset = alset; 313 ctl->sc_ver_neg = ver_neg; 314 ctl->sc_conn_pub = conn_pub; 315 assert(!(flags & ~(SC_IETF|SC_NSTP|SC_ECN))); 316 ctl->sc_flags = flags; 317 send_ctl_pick_initial_packno(ctl); 318 if (enpub->enp_settings.es_pace_packets) 319 ctl->sc_flags |= SC_PACE; 320 if (flags & SC_ECN) 321 ctl->sc_ecn = ECN_ECT0; 322 else 323 ctl->sc_ecn = ECN_NOT_ECT; 324 if (flags & SC_IETF) 325 ctl->sc_retx_frames = IQUIC_FRAME_RETX_MASK; 326 else 327 ctl->sc_retx_frames = GQUIC_FRAME_RETRANSMITTABLE_MASK; 328 lsquic_alarmset_init_alarm(alset, AL_RETX_INIT, retx_alarm_rings, ctl); 329 lsquic_alarmset_init_alarm(alset, AL_RETX_HSK, retx_alarm_rings, ctl); 330 lsquic_alarmset_init_alarm(alset, AL_RETX_APP, retx_alarm_rings, ctl); 331 lsquic_senhist_init(&ctl->sc_senhist, ctl->sc_flags & SC_IETF); 332 if (0 == enpub->enp_settings.es_cc_algo) 333 algo = LSQUIC_DF_CC_ALGO; 334 else 335 algo = enpub->enp_settings.es_cc_algo; 336 if (algo == 2) 337 ctl->sc_ci = &lsquic_cong_bbr_if; 338 else 339 ctl->sc_ci = &lsquic_cong_cubic_if; 340 ctl->sc_ci->cci_init(CGP(ctl), conn_pub, ctl->sc_retx_frames); 341 if (ctl->sc_flags & SC_PACE) 342 pacer_init(&ctl->sc_pacer, conn_pub->lconn, 343 /* TODO: conn_pub has a pointer to enpub: drop third argument */ 344 enpub->enp_settings.es_clock_granularity); 345 for (i = 0; i < sizeof(ctl->sc_buffered_packets) / 346 sizeof(ctl->sc_buffered_packets[0]); ++i) 347 TAILQ_INIT(&ctl->sc_buffered_packets[i].bpq_packets); 348 ctl->sc_max_packno_bits = PACKNO_BITS_2; /* Safe value before verneg */ 349 ctl->sc_cached_bpt.stream_id = UINT64_MAX; 350} 351 352 353static int 354send_ctl_ecn_on (const struct lsquic_send_ctl *ctl) 355{ 356 return ctl->sc_ecn != ECN_NOT_ECT; 357} 358 359 360static lsquic_time_t 361calculate_packet_rto (lsquic_send_ctl_t *ctl) 362{ 363 lsquic_time_t delay; 364 365 delay = get_retx_delay(&ctl->sc_conn_pub->rtt_stats); 366 367 unsigned exp = ctl->sc_n_consec_rtos; 368 if (exp > MAX_RTO_BACKOFFS) 369 exp = MAX_RTO_BACKOFFS; 370 371 delay = delay * (1 << exp); 372 373 return delay; 374} 375 376 377static lsquic_time_t 378calculate_tlp_delay (lsquic_send_ctl_t *ctl) 379{ 380 lsquic_time_t srtt, delay; 381 382 srtt = lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats); 383 if (ctl->sc_n_in_flight_all > 1) 384 { 385 delay = 10000; /* 10 ms is the minimum tail loss probe delay */ 386 if (delay < 2 * srtt) 387 delay = 2 * srtt; 388 } 389 else 390 { 391 delay = srtt + srtt / 2 + MIN_RTO_DELAY; 392 if (delay < 2 * srtt) 393 delay = 2 * srtt; 394 } 395 396 return delay; 397} 398 399 400static void 401set_retx_alarm (struct lsquic_send_ctl *ctl, enum packnum_space pns, 402 lsquic_time_t now) 403{ 404 enum retx_mode rm; 405 lsquic_time_t delay; 406 407 assert(!TAILQ_EMPTY(&ctl->sc_unacked_packets[pns])); 408 409 rm = get_retx_mode(ctl); 410 switch (rm) 411 { 412 case RETX_MODE_HANDSHAKE: 413 /* [draft-iyengar-quic-loss-recovery-01]: 414 * 415 * if (handshake packets are outstanding): 416 * alarm_duration = max(1.5 * smoothed_rtt, 10ms) << handshake_count; 417 * handshake_count++; 418 */ 419 delay = lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats); 420 if (delay) 421 { 422 delay += delay / 2; 423 if (10000 > delay) 424 delay = 10000; 425 } 426 else 427 delay = 150000; 428 delay <<= ctl->sc_n_hsk; 429 ++ctl->sc_n_hsk; 430 break; 431 case RETX_MODE_LOSS: 432 delay = ctl->sc_loss_to; 433 break; 434 case RETX_MODE_TLP: 435 delay = calculate_tlp_delay(ctl); 436 break; 437 default: 438 assert(rm == RETX_MODE_RTO); 439 /* XXX the comment below as well as the name of the function 440 * that follows seem obsolete. 441 */ 442 /* Base RTO on the first unacked packet, following reference 443 * implementation. 444 */ 445 delay = calculate_packet_rto(ctl); 446 break; 447 } 448 449 if (delay > MAX_RTO_DELAY) 450 delay = MAX_RTO_DELAY; 451 452 LSQ_DEBUG("set retx alarm to %"PRIu64", which is %"PRIu64 453 " usec from now, mode %s", now + delay, delay, retx2str[rm]); 454 lsquic_alarmset_set(ctl->sc_alset, AL_RETX_INIT + pns, now + delay); 455} 456 457 458static int 459send_ctl_in_recovery (lsquic_send_ctl_t *ctl) 460{ 461 return ctl->sc_largest_acked_packno 462 && ctl->sc_largest_acked_packno <= ctl->sc_largest_sent_at_cutback; 463} 464 465 466#define SC_PACK_SIZE(ctl_) (+(ctl_)->sc_conn_pub->path->np_pack_size) 467 468static lsquic_time_t 469send_ctl_transfer_time (void *ctx) 470{ 471 lsquic_send_ctl_t *const ctl = ctx; 472 lsquic_time_t tx_time; 473 uint64_t pacing_rate; 474 int in_recovery; 475 476 in_recovery = send_ctl_in_recovery(ctl); 477 pacing_rate = ctl->sc_ci->cci_pacing_rate(CGP(ctl), in_recovery); 478 tx_time = (uint64_t) SC_PACK_SIZE(ctl) * 1000000 / pacing_rate; 479 return tx_time; 480} 481 482 483static void 484send_ctl_unacked_append (struct lsquic_send_ctl *ctl, 485 struct lsquic_packet_out *packet_out) 486{ 487 enum packnum_space pns; 488 489 pns = lsquic_packet_out_pns(packet_out); 490 assert(0 == (packet_out->po_flags & PO_LOSS_REC)); 491 TAILQ_INSERT_TAIL(&ctl->sc_unacked_packets[pns], packet_out, po_next); 492 packet_out->po_flags |= PO_UNACKED; 493 ctl->sc_bytes_unacked_all += packet_out_sent_sz(packet_out); 494 ctl->sc_n_in_flight_all += 1; 495 if (packet_out->po_frame_types & ctl->sc_retx_frames) 496 { 497 ctl->sc_bytes_unacked_retx += packet_out_total_sz(packet_out); 498 ++ctl->sc_n_in_flight_retx; 499 } 500} 501 502 503static void 504send_ctl_unacked_remove (struct lsquic_send_ctl *ctl, 505 struct lsquic_packet_out *packet_out, unsigned packet_sz) 506{ 507 enum packnum_space pns; 508 509 pns = lsquic_packet_out_pns(packet_out); 510 TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, po_next); 511 packet_out->po_flags &= ~PO_UNACKED; 512 assert(ctl->sc_bytes_unacked_all >= packet_sz); 513 ctl->sc_bytes_unacked_all -= packet_sz; 514 ctl->sc_n_in_flight_all -= 1; 515 if (packet_out->po_frame_types & ctl->sc_retx_frames) 516 { 517 ctl->sc_bytes_unacked_retx -= packet_sz; 518 --ctl->sc_n_in_flight_retx; 519 } 520} 521 522 523static void 524send_ctl_sched_Xpend_common (struct lsquic_send_ctl *ctl, 525 struct lsquic_packet_out *packet_out) 526{ 527 packet_out->po_flags |= PO_SCHED; 528 ++ctl->sc_n_scheduled; 529 ctl->sc_bytes_scheduled += packet_out_total_sz(packet_out); 530 lsquic_send_ctl_sanity_check(ctl); 531} 532 533 534static void 535send_ctl_sched_append (struct lsquic_send_ctl *ctl, 536 struct lsquic_packet_out *packet_out) 537{ 538 TAILQ_INSERT_TAIL(&ctl->sc_scheduled_packets, packet_out, po_next); 539 send_ctl_sched_Xpend_common(ctl, packet_out); 540} 541 542 543static void 544send_ctl_sched_prepend (struct lsquic_send_ctl *ctl, 545 struct lsquic_packet_out *packet_out) 546{ 547 TAILQ_INSERT_HEAD(&ctl->sc_scheduled_packets, packet_out, po_next); 548 send_ctl_sched_Xpend_common(ctl, packet_out); 549} 550 551 552static void 553send_ctl_sched_remove (struct lsquic_send_ctl *ctl, 554 struct lsquic_packet_out *packet_out) 555{ 556 TAILQ_REMOVE(&ctl->sc_scheduled_packets, packet_out, po_next); 557 packet_out->po_flags &= ~PO_SCHED; 558 assert(ctl->sc_n_scheduled); 559 --ctl->sc_n_scheduled; 560 ctl->sc_bytes_scheduled -= packet_out_total_sz(packet_out); 561 lsquic_send_ctl_sanity_check(ctl); 562} 563 564 565int 566lsquic_send_ctl_sent_packet (lsquic_send_ctl_t *ctl, 567 struct lsquic_packet_out *packet_out) 568{ 569 enum packnum_space pns; 570 char frames[lsquic_frame_types_str_sz]; 571 572 assert(!(packet_out->po_flags & PO_ENCRYPTED)); 573 ctl->sc_last_sent_time = packet_out->po_sent; 574 pns = lsquic_packet_out_pns(packet_out); 575 LSQ_DEBUG("packet %"PRIu64" has been sent (frame types: %s)", 576 packet_out->po_packno, lsquic_frame_types_to_str(frames, 577 sizeof(frames), packet_out->po_frame_types)); 578 lsquic_senhist_add(&ctl->sc_senhist, packet_out->po_packno); 579 send_ctl_unacked_append(ctl, packet_out); 580 if (packet_out->po_frame_types & ctl->sc_retx_frames) 581 { 582 if (!lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_INIT + pns)) 583 set_retx_alarm(ctl, pns, packet_out->po_sent); 584 if (ctl->sc_n_in_flight_retx == 1) 585 ctl->sc_flags |= SC_WAS_QUIET; 586 } 587 /* TODO: Do we really want to use those for RTT info? Revisit this. */ 588 /* Hold on to packets that are not retransmittable because we need them 589 * to sample RTT information. They are released when ACK is received. 590 */ 591#if LSQUIC_SEND_STATS 592 ++ctl->sc_stats.n_total_sent; 593#endif 594 if (ctl->sc_ci->cci_sent) 595 ctl->sc_ci->cci_sent(CGP(ctl), packet_out, ctl->sc_n_in_flight_all, 596 ctl->sc_flags & SC_APP_LIMITED); 597 lsquic_send_ctl_sanity_check(ctl); 598 return 0; 599} 600 601 602static void 603take_rtt_sample (lsquic_send_ctl_t *ctl, 604 lsquic_time_t now, lsquic_time_t lack_delta) 605{ 606 const lsquic_packno_t packno = ctl->sc_largest_acked_packno; 607 const lsquic_time_t sent = ctl->sc_largest_acked_sent_time; 608 const lsquic_time_t measured_rtt = now - sent; 609 if (packno > ctl->sc_max_rtt_packno && lack_delta < measured_rtt) 610 { 611 ctl->sc_max_rtt_packno = packno; 612 lsquic_rtt_stats_update(&ctl->sc_conn_pub->rtt_stats, measured_rtt, lack_delta); 613 LSQ_DEBUG("packno %"PRIu64"; rtt: %"PRIu64"; delta: %"PRIu64"; " 614 "new srtt: %"PRIu64, packno, measured_rtt, lack_delta, 615 lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats)); 616 } 617} 618 619 620static void 621send_ctl_return_enc_data (struct lsquic_send_ctl *ctl, 622 struct lsquic_packet_out *packet_out) 623{ 624 ctl->sc_enpub->enp_pmi->pmi_return(ctl->sc_enpub->enp_pmi_ctx, 625 packet_out->po_path->np_peer_ctx, 626 packet_out->po_enc_data, lsquic_packet_out_ipv6(packet_out)); 627 packet_out->po_flags &= ~PO_ENCRYPTED; 628 packet_out->po_enc_data = NULL; 629} 630 631 632static void 633send_ctl_destroy_packet (struct lsquic_send_ctl *ctl, 634 struct lsquic_packet_out *packet_out) 635{ 636 if (0 == (packet_out->po_flags & PO_LOSS_REC)) 637 lsquic_packet_out_destroy(packet_out, ctl->sc_enpub, 638 packet_out->po_path->np_peer_ctx); 639 else 640 lsquic_malo_put(packet_out); 641} 642 643 644static void 645send_ctl_maybe_renumber_sched_to_right (struct lsquic_send_ctl *ctl, 646 const struct lsquic_packet_out *cur) 647{ 648 struct lsquic_packet_out *packet_out; 649 650 /* If current packet has PO_REPACKNO set, it means that all those to the 651 * right of it have this flag set as well. 652 */ 653 if (0 == (cur->po_flags & PO_REPACKNO)) 654 { 655 ctl->sc_cur_packno = cur->po_packno - 1; 656 for (packet_out = TAILQ_NEXT(cur, po_next); 657 packet_out && 0 == (packet_out->po_flags & PO_REPACKNO); 658 packet_out = TAILQ_NEXT(packet_out, po_next)) 659 { 660 packet_out->po_flags |= PO_REPACKNO; 661 } 662 } 663} 664 665 666/* The third argument to advance `next' pointer when modifying the unacked 667 * queue. This is because the unacked queue may contain several elements 668 * of the same chain. This is not true of the lost and scheduled packet 669 * queue, as the loss records are only present on the unacked queue. 670 */ 671static void 672send_ctl_destroy_chain (struct lsquic_send_ctl *ctl, 673 struct lsquic_packet_out *const packet_out, 674 struct lsquic_packet_out **next) 675{ 676 struct lsquic_packet_out *chain_cur, *chain_next; 677 unsigned packet_sz, count; 678 enum packnum_space pns = lsquic_packet_out_pns(packet_out); 679 680 count = 0; 681 for (chain_cur = packet_out->po_loss_chain; chain_cur != packet_out; 682 chain_cur = chain_next) 683 { 684 chain_next = chain_cur->po_loss_chain; 685 switch (chain_cur->po_flags & (PO_SCHED|PO_UNACKED|PO_LOST)) 686 { 687 case PO_SCHED: 688 send_ctl_maybe_renumber_sched_to_right(ctl, chain_cur); 689 send_ctl_sched_remove(ctl, chain_cur); 690 break; 691 case PO_UNACKED: 692 if (chain_cur->po_flags & PO_LOSS_REC) 693 TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], chain_cur, po_next); 694 else 695 { 696 packet_sz = packet_out_sent_sz(chain_cur); 697 send_ctl_unacked_remove(ctl, chain_cur, packet_sz); 698 } 699 break; 700 case PO_LOST: 701 TAILQ_REMOVE(&ctl->sc_lost_packets, chain_cur, po_next); 702 break; 703 case 0: 704 /* This is also weird, but let it pass */ 705 break; 706 default: 707 assert(0); 708 break; 709 } 710 if (next && *next == chain_cur) 711 *next = TAILQ_NEXT(*next, po_next); 712 if (0 == (chain_cur->po_flags & PO_LOSS_REC)) 713 lsquic_packet_out_ack_streams(chain_cur); 714 send_ctl_destroy_packet(ctl, chain_cur); 715 ++count; 716 } 717 packet_out->po_loss_chain = packet_out; 718 719 if (count) 720 LSQ_DEBUG("destroyed %u packet%.*s in chain of packet %"PRIu64, 721 count, count != 1, "s", packet_out->po_packno); 722} 723 724 725static void 726send_ctl_record_loss (struct lsquic_send_ctl *ctl, 727 struct lsquic_packet_out *packet_out) 728{ 729 struct lsquic_packet_out *loss_record; 730 731 loss_record = lsquic_malo_get(ctl->sc_conn_pub->packet_out_malo); 732 if (loss_record) 733 { 734 memset(loss_record, 0, sizeof(*loss_record)); 735 loss_record->po_flags = PO_UNACKED|PO_LOSS_REC|PO_SENT_SZ; 736 loss_record->po_flags |= 737 ((packet_out->po_flags >> POPNS_SHIFT) & 3) << POPNS_SHIFT; 738 /* Copy values used in ACK processing: */ 739 loss_record->po_packno = packet_out->po_packno; 740 loss_record->po_sent = packet_out->po_sent; 741 loss_record->po_sent_sz = packet_out_sent_sz(packet_out); 742 loss_record->po_frame_types = packet_out->po_frame_types; 743 /* Insert the loss record into the chain: */ 744 loss_record->po_loss_chain = packet_out->po_loss_chain; 745 packet_out->po_loss_chain = loss_record; 746 /* Place the loss record next to the lost packet we are about to 747 * remove from the list: 748 */ 749 TAILQ_INSERT_BEFORE(packet_out, loss_record, po_next); 750 } 751 else 752 LSQ_INFO("cannot allocate memory for loss record"); 753} 754 755 756/* Returns true if packet was rescheduled, false otherwise. In the latter 757 * case, you should not dereference packet_out after the function returns. 758 */ 759static int 760send_ctl_handle_lost_packet (lsquic_send_ctl_t *ctl, 761 lsquic_packet_out_t *packet_out, struct lsquic_packet_out **next) 762{ 763 unsigned packet_sz; 764 765 assert(ctl->sc_n_in_flight_all); 766 packet_sz = packet_out_sent_sz(packet_out); 767 768 if (packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)) 769 { 770 ctl->sc_flags |= SC_LOST_ACK_INIT << lsquic_packet_out_pns(packet_out); 771 LSQ_DEBUG("lost ACK in packet %"PRIu64, packet_out->po_packno); 772 } 773 774 if (ctl->sc_ci->cci_lost) 775 ctl->sc_ci->cci_lost(CGP(ctl), packet_out, packet_sz); 776 777 /* This is a client-only check, server check happens in mini conn */ 778 if (send_ctl_ecn_on(ctl) 779 && 0 == ctl->sc_ecn_total_acked[PNS_INIT] 780 && HETY_INITIAL == packet_out->po_header_type 781 && 3 == packet_out->po_packno) 782 { 783 LSQ_DEBUG("possible ECN black hole during handshake, disable ECN"); 784 ctl->sc_ecn = ECN_NOT_ECT; 785 } 786 787 if (packet_out->po_frame_types & ctl->sc_retx_frames) 788 { 789 LSQ_DEBUG("lost retransmittable packet %"PRIu64, 790 packet_out->po_packno); 791 send_ctl_record_loss(ctl, packet_out); 792 send_ctl_unacked_remove(ctl, packet_out, packet_sz); 793 TAILQ_INSERT_TAIL(&ctl->sc_lost_packets, packet_out, po_next); 794 packet_out->po_flags |= PO_LOST; 795 return 1; 796 } 797 else 798 { 799 LSQ_DEBUG("lost unretransmittable packet %"PRIu64, 800 packet_out->po_packno); 801 send_ctl_unacked_remove(ctl, packet_out, packet_sz); 802 send_ctl_destroy_chain(ctl, packet_out, next); 803 send_ctl_destroy_packet(ctl, packet_out); 804 return 0; 805 } 806} 807 808 809static lsquic_packno_t 810largest_retx_packet_number (const struct lsquic_send_ctl *ctl, 811 enum packnum_space pns) 812{ 813 const lsquic_packet_out_t *packet_out; 814 TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_unacked_packets[pns], 815 lsquic_packets_tailq, po_next) 816 { 817 if (0 == (packet_out->po_flags & PO_LOSS_REC) 818 && (packet_out->po_frame_types & ctl->sc_retx_frames)) 819 return packet_out->po_packno; 820 } 821 return 0; 822} 823 824 825static void 826send_ctl_detect_losses (struct lsquic_send_ctl *ctl, enum packnum_space pns, 827 lsquic_time_t time) 828{ 829 lsquic_packet_out_t *packet_out, *next; 830 lsquic_packno_t largest_retx_packno, largest_lost_packno; 831 832 largest_retx_packno = largest_retx_packet_number(ctl, pns); 833 largest_lost_packno = 0; 834 ctl->sc_loss_to = 0; 835 836 for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); 837 packet_out && packet_out->po_packno <= ctl->sc_largest_acked_packno; 838 packet_out = next) 839 { 840 next = TAILQ_NEXT(packet_out, po_next); 841 842 if (packet_out->po_flags & PO_LOSS_REC) 843 continue; 844 845 if (packet_out->po_packno + N_NACKS_BEFORE_RETX < 846 ctl->sc_largest_acked_packno) 847 { 848 LSQ_DEBUG("loss by FACK detected, packet %"PRIu64, 849 packet_out->po_packno); 850 largest_lost_packno = packet_out->po_packno; 851 (void) send_ctl_handle_lost_packet(ctl, packet_out, &next); 852 continue; 853 } 854 855 if (largest_retx_packno 856 && (packet_out->po_frame_types & ctl->sc_retx_frames) 857 && largest_retx_packno <= ctl->sc_largest_acked_packno) 858 { 859 LSQ_DEBUG("loss by early retransmit detected, packet %"PRIu64, 860 packet_out->po_packno); 861 largest_lost_packno = packet_out->po_packno; 862 ctl->sc_loss_to = 863 lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats) / 4; 864 LSQ_DEBUG("set sc_loss_to to %"PRIu64", packet %"PRIu64, 865 ctl->sc_loss_to, packet_out->po_packno); 866 (void) send_ctl_handle_lost_packet(ctl, packet_out, &next); 867 continue; 868 } 869 870 if (ctl->sc_largest_acked_sent_time > packet_out->po_sent + 871 lsquic_rtt_stats_get_srtt(&ctl->sc_conn_pub->rtt_stats)) 872 { 873 LSQ_DEBUG("loss by sent time detected: packet %"PRIu64, 874 packet_out->po_packno); 875 if (packet_out->po_frame_types & ctl->sc_retx_frames) 876 largest_lost_packno = packet_out->po_packno; 877 else { /* don't count it as a loss */; } 878 (void) send_ctl_handle_lost_packet(ctl, packet_out, &next); 879 continue; 880 } 881 } 882 883 if (largest_lost_packno > ctl->sc_largest_sent_at_cutback) 884 { 885 LSQ_DEBUG("detected new loss: packet %"PRIu64"; new lsac: " 886 "%"PRIu64, largest_lost_packno, ctl->sc_largest_sent_at_cutback); 887 ctl->sc_ci->cci_loss(CGP(ctl)); 888 if (ctl->sc_flags & SC_PACE) 889 pacer_loss_event(&ctl->sc_pacer); 890 ctl->sc_largest_sent_at_cutback = 891 lsquic_senhist_largest(&ctl->sc_senhist); 892 } 893 else if (largest_lost_packno) 894 /* Lost packets whose numbers are smaller than the largest packet 895 * number sent at the time of the last loss event indicate the same 896 * loss event. This follows NewReno logic, see RFC 6582. 897 */ 898 LSQ_DEBUG("ignore loss of packet %"PRIu64" smaller than lsac " 899 "%"PRIu64, largest_lost_packno, ctl->sc_largest_sent_at_cutback); 900} 901 902 903int 904lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl, 905 const struct ack_info *acki, 906 lsquic_time_t ack_recv_time, lsquic_time_t now) 907{ 908 const struct lsquic_packno_range *range = 909 &acki->ranges[ acki->n_ranges - 1 ]; 910 lsquic_packet_out_t *packet_out, *next; 911 lsquic_packno_t smallest_unacked; 912 lsquic_packno_t ack2ed[2]; 913 unsigned packet_sz; 914 int app_limited; 915 signed char do_rtt, skip_checks; 916 enum packnum_space pns; 917 unsigned ecn_total_acked, ecn_ce_cnt, one_rtt_cnt; 918 919 pns = acki->pns; 920 packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); 921#if __GNUC__ 922 __builtin_prefetch(packet_out); 923#endif 924 925#if __GNUC__ 926# define UNLIKELY(cond) __builtin_expect(cond, 0) 927#else 928# define UNLIKELY(cond) cond 929#endif 930 931#if __GNUC__ 932 if (UNLIKELY(LSQ_LOG_ENABLED(LSQ_LOG_DEBUG))) 933#endif 934 LSQ_DEBUG("Got ACK frame, largest acked: %"PRIu64"; delta: %"PRIu64, 935 largest_acked(acki), acki->lack_delta); 936 937 /* Validate ACK first: */ 938 if (UNLIKELY(largest_acked(acki) 939 > lsquic_senhist_largest(&ctl->sc_senhist))) 940 { 941 LSQ_INFO("at least one packet in ACK range [%"PRIu64" - %"PRIu64"] " 942 "was never sent", acki->ranges[0].low, acki->ranges[0].high); 943 return -1; 944 } 945 946 if (ctl->sc_ci->cci_begin_ack) 947 ctl->sc_ci->cci_begin_ack(CGP(ctl), ack_recv_time, 948 ctl->sc_bytes_unacked_all); 949 950 ecn_total_acked = 0; 951 ecn_ce_cnt = 0; 952 one_rtt_cnt = 0; 953 954 if (UNLIKELY(ctl->sc_flags & SC_WAS_QUIET)) 955 { 956 ctl->sc_flags &= ~SC_WAS_QUIET; 957 LSQ_DEBUG("ACK comes after a period of quiescence"); 958 ctl->sc_ci->cci_was_quiet(CGP(ctl), now, ctl->sc_bytes_unacked_all); 959 } 960 961 if (UNLIKELY(!packet_out)) 962 goto no_unacked_packets; 963 964 smallest_unacked = packet_out->po_packno; 965 LSQ_DEBUG("Smallest unacked: %"PRIu64, smallest_unacked); 966 967 ack2ed[1] = 0; 968 969 if (packet_out->po_packno > largest_acked(acki)) 970 goto detect_losses; 971 972 if (largest_acked(acki) > ctl->sc_cur_rt_end) 973 { 974 ++ctl->sc_rt_count; 975 ctl->sc_cur_rt_end = lsquic_senhist_largest(&ctl->sc_senhist); 976 } 977 978 do_rtt = 0, skip_checks = 0; 979 app_limited = -1; 980 do 981 { 982 next = TAILQ_NEXT(packet_out, po_next); 983#if __GNUC__ 984 __builtin_prefetch(next); 985#endif 986 if (skip_checks) 987 goto after_checks; 988 /* This is faster than binary search in the normal case when the number 989 * of ranges is not much larger than the number of unacked packets. 990 */ 991 while (UNLIKELY(range->high < packet_out->po_packno)) 992 --range; 993 if (range->low <= packet_out->po_packno) 994 { 995 skip_checks = range == acki->ranges; 996 if (app_limited < 0) 997 app_limited = send_ctl_retx_bytes_out(ctl) + 3 * SC_PACK_SIZE(ctl) /* This 998 is the "maximum burst" parameter */ 999 < ctl->sc_ci->cci_get_cwnd(CGP(ctl)); 1000 after_checks: 1001 ctl->sc_largest_acked_packno = packet_out->po_packno; 1002 ctl->sc_largest_acked_sent_time = packet_out->po_sent; 1003 ecn_total_acked += lsquic_packet_out_ecn(packet_out) != ECN_NOT_ECT; 1004 ecn_ce_cnt += lsquic_packet_out_ecn(packet_out) == ECN_CE; 1005 one_rtt_cnt += lsquic_packet_out_enc_level(packet_out) == ENC_LEV_FORW; 1006 if (0 == (packet_out->po_flags & PO_LOSS_REC)) 1007 { 1008 packet_sz = packet_out_sent_sz(packet_out); 1009 send_ctl_unacked_remove(ctl, packet_out, packet_sz); 1010 lsquic_packet_out_ack_streams(packet_out); 1011 LSQ_DEBUG("acking via regular record %"PRIu64, 1012 packet_out->po_packno); 1013 } 1014 else 1015 { 1016 packet_sz = packet_out->po_sent_sz; 1017 TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, 1018 po_next); 1019 LSQ_DEBUG("acking via loss record %"PRIu64, 1020 packet_out->po_packno); 1021#if LSQUIC_CONN_STATS 1022 ++ctl->sc_conn_pub->conn_stats->out.acked_via_loss; 1023 LSQ_DEBUG("acking via loss record %"PRIu64, 1024 packet_out->po_packno); 1025#endif 1026 } 1027 ack2ed[!!(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK))] 1028 = packet_out->po_ack2ed; 1029 do_rtt |= packet_out->po_packno == largest_acked(acki); 1030 ctl->sc_ci->cci_ack(CGP(ctl), packet_out, packet_sz, now, 1031 app_limited); 1032 send_ctl_destroy_chain(ctl, packet_out, &next); 1033 send_ctl_destroy_packet(ctl, packet_out); 1034 } 1035 packet_out = next; 1036 } 1037 while (packet_out && packet_out->po_packno <= largest_acked(acki)); 1038 1039 if (do_rtt) 1040 { 1041 take_rtt_sample(ctl, ack_recv_time, acki->lack_delta); 1042 ctl->sc_n_consec_rtos = 0; 1043 ctl->sc_n_hsk = 0; 1044 ctl->sc_n_tlp = 0; 1045 } 1046 1047 detect_losses: 1048 send_ctl_detect_losses(ctl, pns, ack_recv_time); 1049 if (send_ctl_first_unacked_retx_packet(ctl, pns)) 1050 set_retx_alarm(ctl, pns, now); 1051 else 1052 { 1053 LSQ_DEBUG("No retransmittable packets: clear alarm"); 1054 lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns); 1055 } 1056 lsquic_send_ctl_sanity_check(ctl); 1057 1058 if ((ctl->sc_flags & SC_NSTP) && ack2ed[1] > ctl->sc_largest_ack2ed[pns]) 1059 ctl->sc_largest_ack2ed[pns] = ack2ed[1]; 1060 1061 if (ctl->sc_n_in_flight_retx == 0) 1062 ctl->sc_flags |= SC_WAS_QUIET; 1063 1064 if (one_rtt_cnt) 1065 ctl->sc_flags |= SC_1RTT_ACKED; 1066 1067 if (send_ctl_ecn_on(ctl)) 1068 { 1069 const uint64_t sum = acki->ecn_counts[ECN_ECT0] 1070 + acki->ecn_counts[ECN_ECT1] 1071 + acki->ecn_counts[ECN_CE]; 1072 ctl->sc_ecn_total_acked[pns] += ecn_total_acked; 1073 ctl->sc_ecn_ce_cnt[pns] += ecn_ce_cnt; 1074 if (sum >= ctl->sc_ecn_total_acked[pns]) 1075 { 1076 if (sum > ctl->sc_ecn_total_acked[pns]) 1077 ctl->sc_ecn_total_acked[pns] = sum; 1078 if (acki->ecn_counts[ECN_CE] > ctl->sc_ecn_ce_cnt[pns]) 1079 { 1080 ctl->sc_ecn_ce_cnt[pns] = acki->ecn_counts[ECN_CE]; 1081 LSQ_WARN("TODO: handle ECN CE event"); /* XXX TODO */ 1082 } 1083 } 1084 else 1085 { 1086 LSQ_INFO("ECN total ACKed (%"PRIu64") is greater than the sum " 1087 "of ECN counters (%"PRIu64"): disable ECN", 1088 ctl->sc_ecn_total_acked[pns], sum); 1089 ctl->sc_ecn = ECN_NOT_ECT; 1090 } 1091 } 1092 1093 update_n_stop_waiting: 1094 if (!(ctl->sc_flags & (SC_NSTP|SC_IETF))) 1095 { 1096 if (smallest_unacked > smallest_acked(acki)) 1097 /* Peer is acking packets that have been acked already. Schedule 1098 * ACK and STOP_WAITING frame to chop the range if we get two of 1099 * these in a row. 1100 */ 1101 ++ctl->sc_n_stop_waiting; 1102 else 1103 ctl->sc_n_stop_waiting = 0; 1104 } 1105 lsquic_send_ctl_sanity_check(ctl); 1106 if (ctl->sc_ci->cci_end_ack) 1107 ctl->sc_ci->cci_end_ack(CGP(ctl), ctl->sc_bytes_unacked_all); 1108 return 0; 1109 1110 no_unacked_packets: 1111 smallest_unacked = lsquic_senhist_largest(&ctl->sc_senhist) + 1; 1112 ctl->sc_flags |= SC_WAS_QUIET; 1113 goto update_n_stop_waiting; 1114} 1115 1116 1117lsquic_packno_t 1118lsquic_send_ctl_smallest_unacked (lsquic_send_ctl_t *ctl) 1119{ 1120 const lsquic_packet_out_t *packet_out; 1121 enum packnum_space pns; 1122 1123 /* Packets are always sent out in order (unless we are reordering them 1124 * on purpose). Thus, the first packet on the unacked packets list has 1125 * the smallest packet number of all packets on that list. 1126 */ 1127 for (pns = ctl->sc_flags & SC_IETF ? PNS_INIT : PNS_APP; pns < N_PNS; ++pns) 1128 if ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]))) 1129 /* We're OK with using a loss record */ 1130 return packet_out->po_packno; 1131 1132 return lsquic_senhist_largest(&ctl->sc_senhist) + first_packno(ctl); 1133} 1134 1135 1136static struct lsquic_packet_out * 1137send_ctl_next_lost (lsquic_send_ctl_t *ctl) 1138{ 1139 struct lsquic_packet_out *lost_packet; 1140 1141 get_next_lost: 1142 lost_packet = TAILQ_FIRST(&ctl->sc_lost_packets); 1143 if (lost_packet) 1144 { 1145 if (lost_packet->po_frame_types & (1 << QUIC_FRAME_STREAM)) 1146 { 1147 if (0 == (lost_packet->po_flags & PO_MINI)) 1148 { 1149 lsquic_packet_out_elide_reset_stream_frames(lost_packet, 0); 1150 if (lost_packet->po_regen_sz >= lost_packet->po_data_sz) 1151 { 1152 LSQ_DEBUG("Dropping packet %"PRIu64" from lost queue", 1153 lost_packet->po_packno); 1154 TAILQ_REMOVE(&ctl->sc_lost_packets, lost_packet, po_next); 1155 lost_packet->po_flags &= ~PO_LOST; 1156 send_ctl_destroy_chain(ctl, lost_packet, NULL); 1157 send_ctl_destroy_packet(ctl, lost_packet); 1158 goto get_next_lost; 1159 } 1160 } 1161 else 1162 { 1163 /* Mini connection only ever sends data on stream 1. There 1164 * is nothing to elide: always resend it. 1165 */ 1166 ; 1167 } 1168 } 1169 1170 if (!lsquic_send_ctl_can_send(ctl)) 1171 return NULL; 1172 1173 TAILQ_REMOVE(&ctl->sc_lost_packets, lost_packet, po_next); 1174 lost_packet->po_flags &= ~PO_LOST; 1175 lost_packet->po_flags |= PO_RETX; 1176 } 1177 1178 return lost_packet; 1179} 1180 1181 1182static lsquic_packno_t 1183send_ctl_next_packno (lsquic_send_ctl_t *ctl) 1184{ 1185 return ++ctl->sc_cur_packno; 1186} 1187 1188 1189void 1190lsquic_send_ctl_cleanup (lsquic_send_ctl_t *ctl) 1191{ 1192 lsquic_packet_out_t *packet_out, *next; 1193 enum packnum_space pns; 1194 unsigned n; 1195 1196 lsquic_senhist_cleanup(&ctl->sc_senhist); 1197 while ((packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets))) 1198 { 1199 send_ctl_sched_remove(ctl, packet_out); 1200 send_ctl_destroy_packet(ctl, packet_out); 1201 } 1202 assert(0 == ctl->sc_n_scheduled); 1203 assert(0 == ctl->sc_bytes_scheduled); 1204 for (pns = PNS_INIT; pns < N_PNS; ++pns) 1205 while ((packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]))) 1206 { 1207 TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, po_next); 1208 packet_out->po_flags &= ~PO_UNACKED; 1209#ifndef NDEBUG 1210 if (0 == (packet_out->po_flags & PO_LOSS_REC)) 1211 { 1212 ctl->sc_bytes_unacked_all -= packet_out_sent_sz(packet_out); 1213 --ctl->sc_n_in_flight_all; 1214 } 1215#endif 1216 send_ctl_destroy_packet(ctl, packet_out); 1217 } 1218 assert(0 == ctl->sc_n_in_flight_all); 1219 assert(0 == ctl->sc_bytes_unacked_all); 1220 while ((packet_out = TAILQ_FIRST(&ctl->sc_lost_packets))) 1221 { 1222 TAILQ_REMOVE(&ctl->sc_lost_packets, packet_out, po_next); 1223 packet_out->po_flags &= ~PO_LOST; 1224 send_ctl_destroy_packet(ctl, packet_out); 1225 } 1226 for (n = 0; n < sizeof(ctl->sc_buffered_packets) / 1227 sizeof(ctl->sc_buffered_packets[0]); ++n) 1228 { 1229 for (packet_out = TAILQ_FIRST(&ctl->sc_buffered_packets[n].bpq_packets); 1230 packet_out; packet_out = next) 1231 { 1232 next = TAILQ_NEXT(packet_out, po_next); 1233 send_ctl_destroy_packet(ctl, packet_out); 1234 } 1235 } 1236 if (ctl->sc_flags & SC_PACE) 1237 pacer_cleanup(&ctl->sc_pacer); 1238 ctl->sc_ci->cci_cleanup(CGP(ctl)); 1239#if LSQUIC_SEND_STATS 1240 LSQ_NOTICE("stats: n_total_sent: %u; n_resent: %u; n_delayed: %u", 1241 ctl->sc_stats.n_total_sent, ctl->sc_stats.n_resent, 1242 ctl->sc_stats.n_delayed); 1243#endif 1244 free(ctl->sc_token); 1245} 1246 1247 1248static unsigned 1249send_ctl_retx_bytes_out (const struct lsquic_send_ctl *ctl) 1250{ 1251 return ctl->sc_bytes_scheduled 1252 + ctl->sc_bytes_unacked_retx 1253 ; 1254} 1255 1256 1257static unsigned 1258send_ctl_all_bytes_out (const struct lsquic_send_ctl *ctl) 1259{ 1260 return ctl->sc_bytes_scheduled 1261 + ctl->sc_bytes_unacked_all 1262 ; 1263} 1264 1265 1266int 1267lsquic_send_ctl_pacer_blocked (struct lsquic_send_ctl *ctl) 1268{ 1269 return (ctl->sc_flags & SC_PACE) 1270 && !pacer_can_schedule(&ctl->sc_pacer, 1271 ctl->sc_n_scheduled + ctl->sc_n_in_flight_all); 1272} 1273 1274 1275#ifndef NDEBUG 1276#if __GNUC__ 1277__attribute__((weak)) 1278#endif 1279#endif 1280int 1281lsquic_send_ctl_can_send (lsquic_send_ctl_t *ctl) 1282{ 1283 const unsigned n_out = send_ctl_all_bytes_out(ctl); 1284 LSQ_DEBUG("%s: n_out: %u (unacked_all: %u); cwnd: %"PRIu64, __func__, 1285 n_out, ctl->sc_bytes_unacked_all, 1286 ctl->sc_ci->cci_get_cwnd(CGP(ctl))); 1287 if (ctl->sc_flags & SC_PACE) 1288 { 1289 if (n_out >= ctl->sc_ci->cci_get_cwnd(CGP(ctl))) 1290 return 0; 1291 if (pacer_can_schedule(&ctl->sc_pacer, 1292 ctl->sc_n_scheduled + ctl->sc_n_in_flight_all)) 1293 return 1; 1294 if (ctl->sc_flags & SC_SCHED_TICK) 1295 { 1296 ctl->sc_flags &= ~SC_SCHED_TICK; 1297 lsquic_engine_add_conn_to_attq(ctl->sc_enpub, 1298 ctl->sc_conn_pub->lconn, pacer_next_sched(&ctl->sc_pacer), 1299 AEW_PACER); 1300 } 1301 return 0; 1302 } 1303 else 1304 return n_out < ctl->sc_ci->cci_get_cwnd(CGP(ctl)); 1305} 1306 1307 1308/* Like lsquic_send_ctl_can_send(), but no mods */ 1309static int 1310send_ctl_could_send (const struct lsquic_send_ctl *ctl) 1311{ 1312 uint64_t cwnd; 1313 unsigned n_out; 1314 1315 if ((ctl->sc_flags & SC_PACE) && pacer_delayed(&ctl->sc_pacer)) 1316 return 0; 1317 1318 cwnd = ctl->sc_ci->cci_get_cwnd(CGP(ctl)); 1319 n_out = send_ctl_all_bytes_out(ctl); 1320 return n_out < cwnd; 1321} 1322 1323 1324void 1325lsquic_send_ctl_maybe_app_limited (struct lsquic_send_ctl *ctl, 1326 const struct network_path *path) 1327{ 1328 const struct lsquic_packet_out *packet_out; 1329 1330 packet_out = lsquic_send_ctl_last_scheduled(ctl, PNS_APP, path, 0); 1331 if ((packet_out && lsquic_packet_out_avail(packet_out) > 10) 1332 || send_ctl_could_send(ctl)) 1333 { 1334 LSQ_DEBUG("app-limited"); 1335 ctl->sc_flags |= SC_APP_LIMITED; 1336 } 1337} 1338 1339 1340static void 1341send_ctl_expire (struct lsquic_send_ctl *ctl, enum packnum_space pns, 1342 enum expire_filter filter) 1343{ 1344 lsquic_packet_out_t *packet_out, *next; 1345 int n_resubmitted; 1346 static const char *const filter_type2str[] = { 1347 [EXFI_ALL] = "all", 1348 [EXFI_HSK] = "handshake", 1349 [EXFI_LAST] = "last", 1350 }; 1351 1352 switch (filter) 1353 { 1354 case EXFI_ALL: 1355 n_resubmitted = 0; 1356 for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); 1357 packet_out; packet_out = next) 1358 { 1359 next = TAILQ_NEXT(packet_out, po_next); 1360 if (0 == (packet_out->po_flags & PO_LOSS_REC)) 1361 n_resubmitted += send_ctl_handle_lost_packet(ctl, packet_out, 1362 &next); 1363 } 1364 break; 1365 case EXFI_HSK: 1366 n_resubmitted = 0; 1367 for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); packet_out; 1368 packet_out = next) 1369 { 1370 next = TAILQ_NEXT(packet_out, po_next); 1371 if (packet_out->po_flags & PO_HELLO) 1372 n_resubmitted += send_ctl_handle_lost_packet(ctl, packet_out, 1373 &next); 1374 } 1375 break; 1376 case EXFI_LAST: 1377 packet_out = send_ctl_last_unacked_retx_packet(ctl, pns); 1378 if (packet_out) 1379 n_resubmitted = send_ctl_handle_lost_packet(ctl, packet_out, NULL); 1380 else 1381 n_resubmitted = 0; 1382 break; 1383#ifdef WIN32 1384 default: 1385 n_resubmitted = 0; 1386#endif 1387 } 1388 1389 LSQ_DEBUG("consider %s packets lost: %d resubmitted", 1390 filter_type2str[filter], n_resubmitted); 1391} 1392 1393 1394void 1395lsquic_send_ctl_expire_all (lsquic_send_ctl_t *ctl) 1396{ 1397 enum packnum_space pns; 1398 1399 for (pns = ctl->sc_flags & SC_IETF ? PNS_INIT : PNS_APP; pns < N_PNS; ++pns) 1400 { 1401 lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns); 1402 send_ctl_expire(ctl, pns, EXFI_ALL); 1403 } 1404 lsquic_send_ctl_sanity_check(ctl); 1405} 1406 1407 1408#if LSQUIC_EXTRA_CHECKS 1409void 1410lsquic_send_ctl_sanity_check (const lsquic_send_ctl_t *ctl) 1411{ 1412 const struct lsquic_packet_out *packet_out; 1413 lsquic_packno_t prev_packno; 1414 int prev_packno_set; 1415 unsigned count, bytes; 1416 enum packnum_space pns; 1417 1418 assert(!send_ctl_first_unacked_retx_packet(ctl, PNS_APP) || 1419 lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_APP)); 1420 if (lsquic_alarmset_is_set(ctl->sc_alset, AL_RETX_APP)) 1421 { 1422 assert(send_ctl_first_unacked_retx_packet(ctl, PNS_APP)); 1423 assert(lsquic_time_now() 1424 < ctl->sc_alset->as_expiry[AL_RETX_APP] + MAX_RTO_DELAY); 1425 } 1426 1427 count = 0, bytes = 0; 1428 for (pns = PNS_INIT; pns <= PNS_APP; ++pns) 1429 { 1430 prev_packno_set = 0; 1431 TAILQ_FOREACH(packet_out, &ctl->sc_unacked_packets[pns], po_next) 1432 { 1433 if (prev_packno_set) 1434 assert(packet_out->po_packno > prev_packno); 1435 else 1436 { 1437 prev_packno = packet_out->po_packno; 1438 prev_packno_set = 1; 1439 } 1440 if (0 == (packet_out->po_flags & PO_LOSS_REC)) 1441 { 1442 bytes += packet_out_sent_sz(packet_out); 1443 ++count; 1444 } 1445 } 1446 } 1447 assert(count == ctl->sc_n_in_flight_all); 1448 assert(bytes == ctl->sc_bytes_unacked_all); 1449 1450 count = 0, bytes = 0; 1451 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 1452 { 1453 assert(packet_out->po_flags & PO_SCHED); 1454 bytes += packet_out_total_sz(packet_out); 1455 ++count; 1456 } 1457 assert(count == ctl->sc_n_scheduled); 1458 assert(bytes == ctl->sc_bytes_scheduled); 1459} 1460#endif 1461 1462 1463void 1464lsquic_send_ctl_scheduled_one (lsquic_send_ctl_t *ctl, 1465 lsquic_packet_out_t *packet_out) 1466{ 1467#ifndef NDEBUG 1468 const lsquic_packet_out_t *last; 1469 last = TAILQ_LAST(&ctl->sc_scheduled_packets, lsquic_packets_tailq); 1470 if (last) 1471 assert((last->po_flags & PO_REPACKNO) || 1472 last->po_packno < packet_out->po_packno); 1473#endif 1474 if (ctl->sc_flags & SC_PACE) 1475 { 1476 unsigned n_out = ctl->sc_n_in_flight_retx + ctl->sc_n_scheduled; 1477 pacer_packet_scheduled(&ctl->sc_pacer, n_out, 1478 send_ctl_in_recovery(ctl), send_ctl_transfer_time, ctl); 1479 } 1480 send_ctl_sched_append(ctl, packet_out); 1481} 1482 1483 1484/* Wrapper is used to reset the counter when it's been too long */ 1485static unsigned 1486send_ctl_get_n_consec_rtos (struct lsquic_send_ctl *ctl) 1487{ 1488 lsquic_time_t timeout; 1489 1490 if (ctl->sc_n_consec_rtos) 1491 { 1492 timeout = calculate_packet_rto(ctl); 1493 if (ctl->sc_last_rto_time + timeout < ctl->sc_last_sent_time) 1494 { 1495 ctl->sc_n_consec_rtos = 0; 1496 LSQ_DEBUG("reset RTO counter after %"PRIu64" usec", 1497 ctl->sc_last_sent_time - ctl->sc_last_rto_time); 1498 } 1499 } 1500 1501 return ctl->sc_n_consec_rtos; 1502} 1503 1504 1505/* This mimics the logic in lsquic_send_ctl_next_packet_to_send(): we want 1506 * to check whether the first scheduled packet cannot be sent. 1507 */ 1508int 1509lsquic_send_ctl_sched_is_blocked (struct lsquic_send_ctl *ctl) 1510{ 1511 const lsquic_packet_out_t *packet_out 1512 = TAILQ_FIRST(&ctl->sc_scheduled_packets); 1513 return send_ctl_get_n_consec_rtos(ctl) 1514 && 0 == ctl->sc_next_limit 1515 && packet_out 1516 && !(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)); 1517} 1518 1519 1520static void 1521send_ctl_maybe_zero_pad (struct lsquic_send_ctl *ctl, 1522 struct lsquic_packet_out *initial_packet, size_t limit) 1523{ 1524 struct lsquic_packet_out *packet_out; 1525 size_t cum_size, size; 1526 1527 cum_size = packet_out_total_sz(initial_packet); 1528 if (cum_size >= limit) 1529 return; 1530 1531 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 1532 { 1533 size = packet_out_total_sz(packet_out); 1534 if (cum_size + size > SC_PACK_SIZE(ctl)) 1535 break; 1536 cum_size += size; 1537 if (cum_size >= limit) 1538 return; 1539 } 1540 1541 assert(cum_size < limit); 1542 size = limit - cum_size; 1543 if (size > lsquic_packet_out_avail(initial_packet)) 1544 size = lsquic_packet_out_avail(initial_packet); 1545 memset(initial_packet->po_data + initial_packet->po_data_sz, 0, size); 1546 initial_packet->po_data_sz += size; 1547 initial_packet->po_frame_types |= QUIC_FTBIT_PADDING; 1548 LSQ_DEBUG("Added %zu bytes of PADDING to packet %"PRIu64, size, 1549 initial_packet->po_packno); 1550} 1551 1552 1553lsquic_packet_out_t * 1554lsquic_send_ctl_next_packet_to_send (struct lsquic_send_ctl *ctl, size_t size) 1555{ 1556 lsquic_packet_out_t *packet_out; 1557 int dec_limit; 1558 1559 get_packet: 1560 packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); 1561 if (!packet_out) 1562 return NULL; 1563 1564 if (!(packet_out->po_frame_types & (1 << QUIC_FRAME_ACK)) 1565 && send_ctl_get_n_consec_rtos(ctl)) 1566 { 1567 if (ctl->sc_next_limit) 1568 dec_limit = 1; 1569 else 1570 return NULL; 1571 } 1572 else 1573 dec_limit = 0; 1574 1575 if (packet_out->po_flags & PO_REPACKNO) 1576 { 1577 if (packet_out->po_regen_sz < packet_out->po_data_sz) 1578 { 1579 update_for_resending(ctl, packet_out); 1580 packet_out->po_flags &= ~PO_REPACKNO; 1581 } 1582 else 1583 { 1584 LSQ_DEBUG("Dropping packet %"PRIu64" from scheduled queue", 1585 packet_out->po_packno); 1586 send_ctl_sched_remove(ctl, packet_out); 1587 send_ctl_destroy_chain(ctl, packet_out, NULL); 1588 send_ctl_destroy_packet(ctl, packet_out); 1589 goto get_packet; 1590 } 1591 } 1592 1593 if (UNLIKELY(size)) 1594 { 1595 if (packet_out_total_sz(packet_out) + size > SC_PACK_SIZE(ctl)) 1596 return NULL; 1597 LSQ_DEBUG("packet %"PRIu64" will be tacked on to previous packet " 1598 "(coalescing)", packet_out->po_packno); 1599 } 1600 send_ctl_sched_remove(ctl, packet_out); 1601 1602 if (dec_limit) 1603 { 1604 --ctl->sc_next_limit; 1605 packet_out->po_flags |= PO_LIMITED; 1606 } 1607 else 1608 packet_out->po_flags &= ~PO_LIMITED; 1609 1610 if (UNLIKELY(packet_out->po_header_type == HETY_INITIAL) 1611 && !(ctl->sc_conn_pub->lconn->cn_flags & LSCONN_SERVER)) 1612 { 1613 send_ctl_maybe_zero_pad(ctl, packet_out, size ? size : 1200); 1614 } 1615 1616 return packet_out; 1617} 1618 1619 1620void 1621lsquic_send_ctl_delayed_one (lsquic_send_ctl_t *ctl, 1622 lsquic_packet_out_t *packet_out) 1623{ 1624 send_ctl_sched_prepend(ctl, packet_out); 1625 if (packet_out->po_flags & PO_LIMITED) 1626 ++ctl->sc_next_limit; 1627 LSQ_DEBUG("packet %"PRIu64" has been delayed", packet_out->po_packno); 1628#if LSQUIC_SEND_STATS 1629 ++ctl->sc_stats.n_delayed; 1630#endif 1631} 1632 1633 1634int 1635lsquic_send_ctl_have_outgoing_stream_frames (const lsquic_send_ctl_t *ctl) 1636{ 1637 const lsquic_packet_out_t *packet_out; 1638 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 1639 if (packet_out->po_frame_types & 1640 ((1 << QUIC_FRAME_STREAM) | (1 << QUIC_FRAME_RST_STREAM))) 1641 return 1; 1642 return 0; 1643} 1644 1645 1646int 1647lsquic_send_ctl_have_outgoing_retx_frames (const lsquic_send_ctl_t *ctl) 1648{ 1649 const lsquic_packet_out_t *packet_out; 1650 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 1651 if (packet_out->po_frame_types & ctl->sc_retx_frames) 1652 return 1; 1653 return 0; 1654} 1655 1656 1657static int 1658send_ctl_set_packet_out_token (const struct lsquic_send_ctl *ctl, 1659 struct lsquic_packet_out *packet_out) 1660{ 1661 unsigned char *token; 1662 1663 token = malloc(ctl->sc_token_sz); 1664 if (!token) 1665 { 1666 LSQ_WARN("malloc failed: cannot set initial token"); 1667 return -1; 1668 } 1669 1670 memcpy(token, ctl->sc_token, ctl->sc_token_sz); 1671 packet_out->po_token = token; 1672 packet_out->po_token_len = ctl->sc_token_sz; 1673 packet_out->po_flags |= PO_NONCE; 1674 LSQ_DEBUG("set initial token on packet"); 1675 return 0; 1676} 1677 1678 1679static lsquic_packet_out_t * 1680send_ctl_allocate_packet (struct lsquic_send_ctl *ctl, enum packno_bits bits, 1681 unsigned need_at_least, enum packnum_space pns, 1682 const struct network_path *path) 1683{ 1684 lsquic_packet_out_t *packet_out; 1685 1686 packet_out = lsquic_packet_out_new(&ctl->sc_enpub->enp_mm, 1687 ctl->sc_conn_pub->packet_out_malo, 1688 !(ctl->sc_flags & SC_TCID0), ctl->sc_conn_pub->lconn, bits, 1689 ctl->sc_ver_neg->vn_tag, NULL, path); 1690 if (!packet_out) 1691 return NULL; 1692 1693 if (need_at_least && lsquic_packet_out_avail(packet_out) < need_at_least) 1694 { /* This should never happen, this is why this check is performed at 1695 * this level and not lower, before the packet is actually allocated. 1696 */ 1697 LSQ_ERROR("wanted to allocate packet with at least %u bytes of " 1698 "payload, but only got %u bytes (mtu: %u bytes)", need_at_least, 1699 lsquic_packet_out_avail(packet_out), SC_PACK_SIZE(ctl)); 1700 send_ctl_destroy_packet(ctl, packet_out); 1701 return NULL; 1702 } 1703 1704 if (UNLIKELY(pns != PNS_APP)) 1705 { 1706 if (pns == PNS_INIT) 1707 { 1708 packet_out->po_header_type = HETY_INITIAL; 1709 if (ctl->sc_token) 1710 (void) send_ctl_set_packet_out_token(ctl, packet_out); 1711 } 1712 else 1713 packet_out->po_header_type = HETY_HANDSHAKE; 1714 } 1715 1716 lsquic_packet_out_set_pns(packet_out, pns); 1717 packet_out->po_lflags |= ctl->sc_ecn << POECN_SHIFT; 1718 packet_out->po_loss_chain = packet_out; 1719 return packet_out; 1720} 1721 1722 1723lsquic_packet_out_t * 1724lsquic_send_ctl_new_packet_out (lsquic_send_ctl_t *ctl, unsigned need_at_least, 1725 enum packnum_space pns, const struct network_path *path) 1726{ 1727 lsquic_packet_out_t *packet_out; 1728 enum packno_bits bits; 1729 1730 bits = lsquic_send_ctl_packno_bits(ctl); 1731 packet_out = send_ctl_allocate_packet(ctl, bits, need_at_least, pns, path); 1732 if (!packet_out) 1733 return NULL; 1734 1735 packet_out->po_packno = send_ctl_next_packno(ctl); 1736 LSQ_DEBUG("created packet %"PRIu64, packet_out->po_packno); 1737 EV_LOG_PACKET_CREATED(LSQUIC_LOG_CONN_ID, packet_out); 1738 return packet_out; 1739} 1740 1741 1742struct lsquic_packet_out * 1743lsquic_send_ctl_last_scheduled (struct lsquic_send_ctl *ctl, 1744 enum packnum_space pns, const struct network_path *path, 1745 int regen_match) 1746{ 1747 struct lsquic_packet_out *packet_out; 1748 1749 if (0 == regen_match) 1750 { 1751 TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_scheduled_packets, 1752 lsquic_packets_tailq, po_next) 1753 if (pns == lsquic_packet_out_pns(packet_out) 1754 && path == packet_out->po_path) 1755 return packet_out; 1756 } 1757 else 1758 { 1759 TAILQ_FOREACH_REVERSE(packet_out, &ctl->sc_scheduled_packets, 1760 lsquic_packets_tailq, po_next) 1761 if (pns == lsquic_packet_out_pns(packet_out) 1762 && packet_out->po_regen_sz == packet_out->po_data_sz 1763 && path == packet_out->po_path) 1764 return packet_out; 1765 } 1766 1767 return NULL; 1768} 1769 1770 1771/* Do not use for STREAM frames 1772 */ 1773lsquic_packet_out_t * 1774lsquic_send_ctl_get_writeable_packet (lsquic_send_ctl_t *ctl, 1775 enum packnum_space pns, unsigned need_at_least, 1776 const struct network_path *path, int regen_match, int *is_err) 1777{ 1778 lsquic_packet_out_t *packet_out; 1779 1780 assert(need_at_least > 0); 1781 1782 packet_out = lsquic_send_ctl_last_scheduled(ctl, pns, path, regen_match); 1783 if (packet_out 1784 && !(packet_out->po_flags & (PO_MINI|PO_STREAM_END|PO_RETX)) 1785 && lsquic_packet_out_avail(packet_out) >= need_at_least) 1786 { 1787 return packet_out; 1788 } 1789 1790 if (!lsquic_send_ctl_can_send(ctl)) 1791 { 1792 if (is_err) 1793 *is_err = 0; 1794 return NULL; 1795 } 1796 1797 packet_out = lsquic_send_ctl_new_packet_out(ctl, need_at_least, pns, path); 1798 if (packet_out) 1799 { 1800 lsquic_packet_out_set_pns(packet_out, pns); 1801 lsquic_send_ctl_scheduled_one(ctl, packet_out); 1802 } 1803 else if (is_err) 1804 *is_err = 1; 1805 return packet_out; 1806} 1807 1808 1809struct lsquic_packet_out * 1810lsquic_send_ctl_get_packet_for_crypto (struct lsquic_send_ctl *ctl, 1811 unsigned need_at_least, enum packnum_space pns, 1812 const struct network_path *path) 1813{ 1814 struct lsquic_packet_out *packet_out; 1815 1816 assert(lsquic_send_ctl_schedule_stream_packets_immediately(ctl)); 1817 assert(need_at_least > 0); 1818 1819 packet_out = lsquic_send_ctl_last_scheduled(ctl, pns, path, 0); 1820 if (packet_out 1821 && !(packet_out->po_flags & (PO_STREAM_END|PO_RETX)) 1822 && lsquic_packet_out_avail(packet_out) >= need_at_least) 1823 { 1824 return packet_out; 1825 } 1826 1827 if (!lsquic_send_ctl_can_send(ctl)) 1828 return NULL; 1829 1830 packet_out = lsquic_send_ctl_new_packet_out(ctl, need_at_least, pns, path); 1831 if (!packet_out) 1832 return NULL; 1833 1834 lsquic_send_ctl_scheduled_one(ctl, packet_out); 1835 return packet_out; 1836} 1837 1838 1839static void 1840update_for_resending (lsquic_send_ctl_t *ctl, lsquic_packet_out_t *packet_out) 1841{ 1842 1843 lsquic_packno_t oldno, packno; 1844 1845 /* When the packet is resent, it uses the same number of bytes to encode 1846 * the packet number as the original packet. This follows the reference 1847 * implementation. 1848 */ 1849 oldno = packet_out->po_packno; 1850 packno = send_ctl_next_packno(ctl); 1851 1852 packet_out->po_flags &= ~PO_SENT_SZ; 1853 packet_out->po_frame_types &= ~GQUIC_FRAME_REGEN_MASK; 1854 assert(packet_out->po_frame_types); 1855 packet_out->po_packno = packno; 1856 lsquic_packet_out_set_ecn(packet_out, ctl->sc_ecn); 1857 1858 if (ctl->sc_ver_neg->vn_tag) 1859 { 1860 assert(packet_out->po_flags & PO_VERSION); /* It can only disappear */ 1861 packet_out->po_ver_tag = *ctl->sc_ver_neg->vn_tag; 1862 } 1863 1864 assert(packet_out->po_regen_sz < packet_out->po_data_sz); 1865 if (packet_out->po_regen_sz) 1866 { 1867 if (packet_out->po_flags & PO_SCHED) 1868 ctl->sc_bytes_scheduled -= packet_out->po_regen_sz; 1869 lsquic_packet_out_chop_regen(packet_out); 1870 } 1871 LSQ_DEBUG("Packet %"PRIu64" repackaged for resending as packet %"PRIu64, 1872 oldno, packno); 1873 EV_LOG_CONN_EVENT(LSQUIC_LOG_CONN_ID, "packet %"PRIu64" repackaged for " 1874 "resending as packet %"PRIu64, oldno, packno); 1875} 1876 1877 1878unsigned 1879lsquic_send_ctl_reschedule_packets (lsquic_send_ctl_t *ctl) 1880{ 1881 lsquic_packet_out_t *packet_out; 1882 unsigned n = 0; 1883 1884 while ((packet_out = send_ctl_next_lost(ctl))) 1885 { 1886 assert(packet_out->po_regen_sz < packet_out->po_data_sz); 1887 ++n; 1888#if LSQUIC_CONN_STATS 1889 ++ctl->sc_conn_pub->conn_stats->out.retx_packets; 1890#endif 1891 update_for_resending(ctl, packet_out); 1892 lsquic_send_ctl_scheduled_one(ctl, packet_out); 1893 } 1894 1895 if (n) 1896 LSQ_DEBUG("rescheduled %u packets", n); 1897 1898 return n; 1899} 1900 1901 1902void 1903lsquic_send_ctl_set_tcid0 (lsquic_send_ctl_t *ctl, int tcid0) 1904{ 1905 if (tcid0) 1906 { 1907 LSQ_INFO("set TCID flag"); 1908 ctl->sc_flags |= SC_TCID0; 1909 } 1910 else 1911 { 1912 LSQ_INFO("unset TCID flag"); 1913 ctl->sc_flags &= ~SC_TCID0; 1914 } 1915} 1916 1917 1918/* The controller elides this STREAM frames of stream `stream_id' from 1919 * scheduled and buffered packets. If a packet becomes empty as a result, 1920 * it is dropped. 1921 * 1922 * Packets on other queues do not need to be processed: unacked packets 1923 * have already been sent, and lost packets' reset stream frames will be 1924 * elided in due time. 1925 */ 1926void 1927lsquic_send_ctl_elide_stream_frames (lsquic_send_ctl_t *ctl, 1928 lsquic_stream_id_t stream_id) 1929{ 1930 struct lsquic_packet_out *packet_out, *next; 1931 unsigned n, adj; 1932 int dropped; 1933 1934 dropped = 0; 1935#ifdef WIN32 1936 next = NULL; 1937#endif 1938 for (packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); packet_out; 1939 packet_out = next) 1940 { 1941 next = TAILQ_NEXT(packet_out, po_next); 1942 1943 if ((packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)) 1944 && 0 == (packet_out->po_flags & PO_MINI)) 1945 { 1946 adj = lsquic_packet_out_elide_reset_stream_frames(packet_out, 1947 stream_id); 1948 ctl->sc_bytes_scheduled -= adj; 1949 if (0 == packet_out->po_frame_types) 1950 { 1951 LSQ_DEBUG("cancel packet %"PRIu64" after eliding frames for " 1952 "stream %"PRIu64, packet_out->po_packno, stream_id); 1953 send_ctl_sched_remove(ctl, packet_out); 1954 send_ctl_destroy_chain(ctl, packet_out, NULL); 1955 send_ctl_destroy_packet(ctl, packet_out); 1956 ++dropped; 1957 } 1958 } 1959 } 1960 1961 if (dropped) 1962 lsquic_send_ctl_reset_packnos(ctl); 1963 1964 for (n = 0; n < sizeof(ctl->sc_buffered_packets) / 1965 sizeof(ctl->sc_buffered_packets[0]); ++n) 1966 { 1967 for (packet_out = TAILQ_FIRST(&ctl->sc_buffered_packets[n].bpq_packets); 1968 packet_out; packet_out = next) 1969 { 1970 next = TAILQ_NEXT(packet_out, po_next); 1971 if (packet_out->po_frame_types & (1 << QUIC_FRAME_STREAM)) 1972 { 1973 lsquic_packet_out_elide_reset_stream_frames(packet_out, stream_id); 1974 if (0 == packet_out->po_frame_types) 1975 { 1976 LSQ_DEBUG("cancel buffered packet in queue #%u after eliding " 1977 "frames for stream %"PRIu64, n, stream_id); 1978 TAILQ_REMOVE(&ctl->sc_buffered_packets[n].bpq_packets, 1979 packet_out, po_next); 1980 --ctl->sc_buffered_packets[n].bpq_count; 1981 send_ctl_destroy_packet(ctl, packet_out); 1982 LSQ_DEBUG("Elide packet from buffered queue #%u; count: %u", 1983 n, ctl->sc_buffered_packets[n].bpq_count); 1984 } 1985 } 1986 } 1987 } 1988} 1989 1990 1991/* Count how many packets will remain after the squeezing performed by 1992 * lsquic_send_ctl_squeeze_sched(). This is the number of delayed data 1993 * packets. 1994 */ 1995#ifndef NDEBUG 1996#if __GNUC__ 1997__attribute__((weak)) 1998#endif 1999#endif 2000int 2001lsquic_send_ctl_have_delayed_packets (const lsquic_send_ctl_t *ctl) 2002{ 2003 const struct lsquic_packet_out *packet_out; 2004 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 2005 if (packet_out->po_regen_sz < packet_out->po_data_sz) 2006 return 1; 2007 return 0; 2008} 2009 2010 2011#ifndef NDEBUG 2012static void 2013send_ctl_log_packet_q (const lsquic_send_ctl_t *ctl, const char *prefix, 2014 const struct lsquic_packets_tailq *tailq) 2015{ 2016 const lsquic_packet_out_t *packet_out; 2017 unsigned n_packets; 2018 char *buf; 2019 size_t bufsz; 2020 int off; 2021 2022 n_packets = 0; 2023 TAILQ_FOREACH(packet_out, tailq, po_next) 2024 ++n_packets; 2025 2026 if (n_packets == 0) 2027 { 2028 LSQ_DEBUG("%s: [<empty set>]", prefix); 2029 return; 2030 } 2031 2032 bufsz = n_packets * sizeof("18446744073709551615" /* UINT64_MAX */); 2033 buf = malloc(bufsz); 2034 if (!buf) 2035 { 2036 LSQ_ERROR("%s: malloc: %s", __func__, strerror(errno)); 2037 return; 2038 } 2039 2040 off = 0; 2041 TAILQ_FOREACH(packet_out, tailq, po_next) 2042 { 2043 if (off) 2044 buf[off++] = ' '; 2045 off += sprintf(buf + off, "%"PRIu64, packet_out->po_packno); 2046 } 2047 2048 LSQ_DEBUG("%s: [%s]", prefix, buf); 2049 free(buf); 2050} 2051 2052#define LOG_PACKET_Q(prefix, queue) do { \ 2053 if (LSQ_LOG_ENABLED(LSQ_LOG_DEBUG)) \ 2054 send_ctl_log_packet_q(ctl, queue, prefix); \ 2055} while (0) 2056#else 2057#define LOG_PACKET_Q(p, q) 2058#endif 2059 2060 2061int 2062lsquic_send_ctl_squeeze_sched (lsquic_send_ctl_t *ctl) 2063{ 2064 struct lsquic_packet_out *packet_out, *next; 2065 int dropped; 2066#ifndef NDEBUG 2067 int pre_squeeze_logged = 0; 2068#endif 2069 2070 dropped = 0; 2071 for (packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); packet_out; 2072 packet_out = next) 2073 { 2074 next = TAILQ_NEXT(packet_out, po_next); 2075 if (packet_out->po_regen_sz < packet_out->po_data_sz) 2076 { 2077 if (packet_out->po_flags & PO_ENCRYPTED) 2078 send_ctl_return_enc_data(ctl, packet_out); 2079 } 2080 else 2081 { 2082#ifndef NDEBUG 2083 /* Log the whole list before we squeeze for the first time */ 2084 if (!pre_squeeze_logged++) 2085 LOG_PACKET_Q(&ctl->sc_scheduled_packets, 2086 "unacked packets before squeezing"); 2087#endif 2088 send_ctl_sched_remove(ctl, packet_out); 2089 LSQ_DEBUG("Dropping packet %"PRIu64" from scheduled queue", 2090 packet_out->po_packno); 2091 send_ctl_destroy_chain(ctl, packet_out, NULL); 2092 send_ctl_destroy_packet(ctl, packet_out); 2093 ++dropped; 2094 } 2095 } 2096 2097 if (dropped) 2098 lsquic_send_ctl_reset_packnos(ctl); 2099 2100#ifndef NDEBUG 2101 if (pre_squeeze_logged) 2102 LOG_PACKET_Q(&ctl->sc_scheduled_packets, 2103 "unacked packets after squeezing"); 2104 else if (ctl->sc_n_scheduled > 0) 2105 LOG_PACKET_Q(&ctl->sc_scheduled_packets, "delayed packets"); 2106#endif 2107 2108 return ctl->sc_n_scheduled > 0; 2109} 2110 2111 2112void 2113lsquic_send_ctl_reset_packnos (lsquic_send_ctl_t *ctl) 2114{ 2115 struct lsquic_packet_out *packet_out; 2116 2117 ctl->sc_cur_packno = lsquic_senhist_largest(&ctl->sc_senhist); 2118 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 2119 packet_out->po_flags |= PO_REPACKNO; 2120} 2121 2122 2123void 2124lsquic_send_ctl_ack_to_front (struct lsquic_send_ctl *ctl, unsigned n_acks) 2125{ 2126 struct lsquic_packet_out *ack_packet; 2127 2128 assert(n_acks > 0); 2129 assert(ctl->sc_n_scheduled > n_acks); /* Otherwise, why is this called? */ 2130 for ( ; n_acks > 0; --n_acks) 2131 { 2132 ack_packet = TAILQ_LAST(&ctl->sc_scheduled_packets, lsquic_packets_tailq); 2133 assert(ack_packet->po_frame_types & (1 << QUIC_FRAME_ACK)); 2134 TAILQ_REMOVE(&ctl->sc_scheduled_packets, ack_packet, po_next); 2135 TAILQ_INSERT_HEAD(&ctl->sc_scheduled_packets, ack_packet, po_next); 2136 } 2137} 2138 2139 2140void 2141lsquic_send_ctl_drop_scheduled (lsquic_send_ctl_t *ctl) 2142{ 2143 struct lsquic_packet_out *packet_out, *next; 2144 unsigned n; 2145 2146 n = 0; 2147 for (packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); packet_out; 2148 packet_out = next) 2149 { 2150 next = TAILQ_NEXT(packet_out, po_next); 2151 if (0 == (packet_out->po_flags & PO_HELLO)) 2152 { 2153 send_ctl_sched_remove(ctl, packet_out); 2154 send_ctl_destroy_chain(ctl, packet_out, NULL); 2155 send_ctl_destroy_packet(ctl, packet_out); 2156 ++n; 2157 } 2158 } 2159 2160 ctl->sc_senhist.sh_flags |= SH_GAP_OK; 2161 2162 LSQ_DEBUG("dropped %u scheduled packet%s (%u left)", n, n != 1 ? "s" : "", 2163 ctl->sc_n_scheduled); 2164} 2165 2166 2167#ifdef NDEBUG 2168static 2169#elif __GNUC__ 2170__attribute__((weak)) 2171#endif 2172enum buf_packet_type 2173lsquic_send_ctl_determine_bpt (lsquic_send_ctl_t *ctl, 2174 const lsquic_stream_t *stream) 2175{ 2176 const lsquic_stream_t *other_stream; 2177 struct lsquic_hash_elem *el; 2178 struct lsquic_hash *all_streams; 2179 2180 all_streams = ctl->sc_conn_pub->all_streams; 2181 for (el = lsquic_hash_first(all_streams); el; 2182 el = lsquic_hash_next(all_streams)) 2183 { 2184 other_stream = lsquic_hashelem_getdata(el); 2185 if (other_stream != stream 2186 && (!(other_stream->stream_flags & STREAM_U_WRITE_DONE)) 2187 && !lsquic_stream_is_critical(other_stream) 2188 && other_stream->sm_priority < stream->sm_priority) 2189 return BPT_OTHER_PRIO; 2190 } 2191 return BPT_HIGHEST_PRIO; 2192} 2193 2194 2195static enum buf_packet_type 2196send_ctl_lookup_bpt (lsquic_send_ctl_t *ctl, 2197 const struct lsquic_stream *stream) 2198{ 2199 if (ctl->sc_cached_bpt.stream_id != stream->id) 2200 { 2201 ctl->sc_cached_bpt.stream_id = stream->id; 2202 ctl->sc_cached_bpt.packet_type = 2203 lsquic_send_ctl_determine_bpt(ctl, stream); 2204 } 2205 return ctl->sc_cached_bpt.packet_type; 2206} 2207 2208 2209static unsigned 2210send_ctl_max_bpq_count (const lsquic_send_ctl_t *ctl, 2211 enum buf_packet_type packet_type) 2212{ 2213 unsigned long cwnd; 2214 unsigned count; 2215 2216 switch (packet_type) 2217 { 2218 case BPT_OTHER_PRIO: 2219 return MAX_BPQ_COUNT; 2220 case BPT_HIGHEST_PRIO: 2221 default: /* clang does not complain about absence of `default'... */ 2222 count = ctl->sc_n_scheduled + ctl->sc_n_in_flight_retx; 2223 cwnd = ctl->sc_ci->cci_get_cwnd(CGP(ctl)); 2224 if (count < cwnd / SC_PACK_SIZE(ctl)) 2225 { 2226 count -= cwnd / SC_PACK_SIZE(ctl); 2227 if (count > MAX_BPQ_COUNT) 2228 return count; 2229 } 2230 return MAX_BPQ_COUNT; 2231 } 2232} 2233 2234 2235static void 2236send_ctl_move_ack (struct lsquic_send_ctl *ctl, struct lsquic_packet_out *dst, 2237 struct lsquic_packet_out *src) 2238{ 2239 assert(dst->po_data_sz == 0); 2240 2241 if (lsquic_packet_out_avail(dst) >= src->po_regen_sz) 2242 { 2243 memcpy(dst->po_data, src->po_data, src->po_regen_sz); 2244 dst->po_data_sz = src->po_regen_sz; 2245 dst->po_regen_sz = src->po_regen_sz; 2246 dst->po_frame_types |= (GQUIC_FRAME_REGEN_MASK & src->po_frame_types); 2247 src->po_frame_types &= ~GQUIC_FRAME_REGEN_MASK; 2248 lsquic_packet_out_chop_regen(src); 2249 } 2250} 2251 2252 2253static lsquic_packet_out_t * 2254send_ctl_get_buffered_packet (lsquic_send_ctl_t *ctl, 2255 enum buf_packet_type packet_type, unsigned need_at_least, 2256 const struct network_path *path, const struct lsquic_stream *stream) 2257{ 2258 struct buf_packet_q *const packet_q = 2259 &ctl->sc_buffered_packets[packet_type]; 2260 struct lsquic_conn *const lconn = ctl->sc_conn_pub->lconn; 2261 lsquic_packet_out_t *packet_out; 2262 enum packno_bits bits; 2263 enum { AA_STEAL, AA_GENERATE, AA_NONE, } ack_action; 2264 2265 packet_out = TAILQ_LAST(&packet_q->bpq_packets, lsquic_packets_tailq); 2266 if (packet_out 2267 && !(packet_out->po_flags & PO_STREAM_END) 2268 && lsquic_packet_out_avail(packet_out) >= need_at_least) 2269 { 2270 return packet_out; 2271 } 2272 2273 if (packet_q->bpq_count >= send_ctl_max_bpq_count(ctl, packet_type)) 2274 return NULL; 2275 2276 if (packet_q->bpq_count == 0) 2277 { 2278 /* If ACK was written to the low-priority queue first, steal it */ 2279 if (packet_q == &ctl->sc_buffered_packets[BPT_HIGHEST_PRIO] 2280 && !TAILQ_EMPTY(&ctl->sc_buffered_packets[BPT_OTHER_PRIO].bpq_packets) 2281 && (TAILQ_FIRST(&ctl->sc_buffered_packets[BPT_OTHER_PRIO].bpq_packets) 2282 ->po_frame_types & QUIC_FTBIT_ACK)) 2283 { 2284 LSQ_DEBUG("steal ACK frame from low-priority buffered queue"); 2285 ack_action = AA_STEAL; 2286 bits = ctl->sc_max_packno_bits; 2287 } 2288 /* If ACK can be generated, write it to the first buffered packet. */ 2289 else if (lconn->cn_if->ci_can_write_ack(lconn)) 2290 { 2291 LSQ_DEBUG("generate ACK frame for first buffered packet in " 2292 "queue #%u", packet_type); 2293 ack_action = AA_GENERATE; 2294 /* Packet length is set to the largest possible size to guarantee 2295 * that buffered packet with the ACK will not need to be split. 2296 */ 2297 bits = ctl->sc_max_packno_bits; 2298 } 2299 else 2300 goto no_ack_action; 2301 } 2302 else 2303 { 2304 no_ack_action: 2305 ack_action = AA_NONE; 2306 bits = lsquic_send_ctl_guess_packno_bits(ctl); 2307 } 2308 2309 packet_out = send_ctl_allocate_packet(ctl, bits, need_at_least, PNS_APP, 2310 path); 2311 if (!packet_out) 2312 return NULL; 2313 2314 switch (ack_action) 2315 { 2316 case AA_STEAL: 2317 send_ctl_move_ack(ctl, packet_out, 2318 TAILQ_FIRST(&ctl->sc_buffered_packets[BPT_OTHER_PRIO].bpq_packets)); 2319 break; 2320 case AA_GENERATE: 2321 lconn->cn_if->ci_write_ack(lconn, packet_out); 2322 break; 2323 case AA_NONE: 2324 break; 2325 } 2326 2327 TAILQ_INSERT_TAIL(&packet_q->bpq_packets, packet_out, po_next); 2328 ++packet_q->bpq_count; 2329 LSQ_DEBUG("Add new packet to buffered queue #%u; count: %u", 2330 packet_type, packet_q->bpq_count); 2331 return packet_out; 2332} 2333 2334 2335lsquic_packet_out_t * 2336lsquic_send_ctl_get_packet_for_stream (lsquic_send_ctl_t *ctl, 2337 unsigned need_at_least, const struct network_path *path, 2338 const struct lsquic_stream *stream) 2339{ 2340 enum buf_packet_type packet_type; 2341 2342 if (lsquic_send_ctl_schedule_stream_packets_immediately(ctl)) 2343 return lsquic_send_ctl_get_writeable_packet(ctl, PNS_APP, 2344 need_at_least, path, 0, NULL); 2345 else 2346 { 2347 packet_type = send_ctl_lookup_bpt(ctl, stream); 2348 return send_ctl_get_buffered_packet(ctl, packet_type, need_at_least, 2349 path, stream); 2350 } 2351} 2352 2353 2354#ifdef NDEBUG 2355static 2356#elif __GNUC__ 2357__attribute__((weak)) 2358#endif 2359enum packno_bits 2360lsquic_send_ctl_calc_packno_bits (lsquic_send_ctl_t *ctl) 2361{ 2362 lsquic_packno_t smallest_unacked; 2363 enum packno_bits bits; 2364 unsigned n_in_flight; 2365 unsigned long cwnd; 2366 const struct parse_funcs *pf; 2367 2368 pf = ctl->sc_conn_pub->lconn->cn_pf; 2369 2370 smallest_unacked = lsquic_send_ctl_smallest_unacked(ctl); 2371 cwnd = ctl->sc_ci->cci_get_cwnd(CGP(ctl)); 2372 n_in_flight = cwnd / SC_PACK_SIZE(ctl); 2373 bits = pf->pf_calc_packno_bits(ctl->sc_cur_packno + 1, smallest_unacked, 2374 n_in_flight); 2375 if (bits <= ctl->sc_max_packno_bits) 2376 return bits; 2377 else 2378 return ctl->sc_max_packno_bits; 2379} 2380 2381 2382enum packno_bits 2383lsquic_send_ctl_packno_bits (lsquic_send_ctl_t *ctl) 2384{ 2385 2386 if (lsquic_send_ctl_schedule_stream_packets_immediately(ctl)) 2387 return lsquic_send_ctl_calc_packno_bits(ctl); 2388 else 2389 return lsquic_send_ctl_guess_packno_bits(ctl); 2390} 2391 2392 2393static int 2394split_buffered_packet (lsquic_send_ctl_t *ctl, 2395 enum buf_packet_type packet_type, lsquic_packet_out_t *packet_out, 2396 enum packno_bits bits, unsigned excess_bytes) 2397{ 2398 struct buf_packet_q *const packet_q = 2399 &ctl->sc_buffered_packets[packet_type]; 2400 lsquic_packet_out_t *new_packet_out; 2401 2402 assert(TAILQ_FIRST(&packet_q->bpq_packets) == packet_out); 2403 2404 new_packet_out = send_ctl_allocate_packet(ctl, bits, 0, 2405 lsquic_packet_out_pns(packet_out), packet_out->po_path); 2406 if (!new_packet_out) 2407 return -1; 2408 2409 if (0 == lsquic_packet_out_split_in_two(&ctl->sc_enpub->enp_mm, packet_out, 2410 new_packet_out, ctl->sc_conn_pub->lconn->cn_pf, excess_bytes)) 2411 { 2412 lsquic_packet_out_set_packno_bits(packet_out, bits); 2413 TAILQ_INSERT_AFTER(&packet_q->bpq_packets, packet_out, new_packet_out, 2414 po_next); 2415 ++packet_q->bpq_count; 2416 LSQ_DEBUG("Add split packet to buffered queue #%u; count: %u", 2417 packet_type, packet_q->bpq_count); 2418 return 0; 2419 } 2420 else 2421 { 2422 send_ctl_destroy_packet(ctl, new_packet_out); 2423 return -1; 2424 } 2425} 2426 2427 2428int 2429lsquic_send_ctl_schedule_buffered (lsquic_send_ctl_t *ctl, 2430 enum buf_packet_type packet_type) 2431{ 2432 struct buf_packet_q *const packet_q = 2433 &ctl->sc_buffered_packets[packet_type]; 2434 const struct parse_funcs *const pf = ctl->sc_conn_pub->lconn->cn_pf; 2435 lsquic_packet_out_t *packet_out; 2436 unsigned used, excess; 2437 2438 assert(lsquic_send_ctl_schedule_stream_packets_immediately(ctl)); 2439 const enum packno_bits bits = lsquic_send_ctl_calc_packno_bits(ctl); 2440 const unsigned need = pf->pf_packno_bits2len(bits); 2441 2442 while ((packet_out = TAILQ_FIRST(&packet_q->bpq_packets)) && 2443 lsquic_send_ctl_can_send(ctl)) 2444 { 2445 if ((packet_out->po_frame_types & QUIC_FTBIT_ACK) 2446 && packet_out->po_ack2ed < ctl->sc_largest_acked) 2447 { 2448 /* Chrome watches for a decrease in the value of the Largest 2449 * Observed field of the ACK frame and marks it as an error: 2450 * this is why we have to send out ACK in the order they were 2451 * generated. 2452 */ 2453 LSQ_DEBUG("Remove out-of-order ACK from buffered packet"); 2454 lsquic_packet_out_chop_regen(packet_out); 2455 if (packet_out->po_data_sz == 0) 2456 { 2457 LSQ_DEBUG("Dropping now-empty buffered packet"); 2458 TAILQ_REMOVE(&packet_q->bpq_packets, packet_out, po_next); 2459 --packet_q->bpq_count; 2460 send_ctl_destroy_packet(ctl, packet_out); 2461 continue; 2462 } 2463 } 2464 if (bits != lsquic_packet_out_packno_bits(packet_out)) 2465 { 2466 used = pf->pf_packno_bits2len( 2467 lsquic_packet_out_packno_bits(packet_out)); 2468 if (need > used 2469 && need - used > lsquic_packet_out_avail(packet_out)) 2470 { 2471 excess = need - used - lsquic_packet_out_avail(packet_out); 2472 if (0 != split_buffered_packet(ctl, packet_type, 2473 packet_out, bits, excess)) 2474 { 2475 return -1; 2476 } 2477 } 2478 } 2479 TAILQ_REMOVE(&packet_q->bpq_packets, packet_out, po_next); 2480 --packet_q->bpq_count; 2481 packet_out->po_packno = send_ctl_next_packno(ctl); 2482 LSQ_DEBUG("Remove packet from buffered queue #%u; count: %u. " 2483 "It becomes packet %"PRIu64, packet_type, packet_q->bpq_count, 2484 packet_out->po_packno); 2485 lsquic_send_ctl_scheduled_one(ctl, packet_out); 2486 } 2487 2488 return 0; 2489} 2490 2491 2492int 2493lsquic_send_ctl_turn_on_fin (struct lsquic_send_ctl *ctl, 2494 const struct lsquic_stream *stream) 2495{ 2496 enum buf_packet_type packet_type; 2497 struct buf_packet_q *packet_q; 2498 lsquic_packet_out_t *packet_out; 2499 const struct parse_funcs *pf; 2500 2501 pf = ctl->sc_conn_pub->lconn->cn_pf; 2502 packet_type = send_ctl_lookup_bpt(ctl, stream); 2503 packet_q = &ctl->sc_buffered_packets[packet_type]; 2504 2505 TAILQ_FOREACH_REVERSE(packet_out, &packet_q->bpq_packets, 2506 lsquic_packets_tailq, po_next) 2507 if (0 == lsquic_packet_out_turn_on_fin(packet_out, pf, stream)) 2508 return 0; 2509 2510 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 2511 if (0 == packet_out->po_sent 2512 && 0 == lsquic_packet_out_turn_on_fin(packet_out, pf, stream)) 2513 { 2514 return 0; 2515 } 2516 2517 return -1; 2518} 2519 2520 2521size_t 2522lsquic_send_ctl_mem_used (const struct lsquic_send_ctl *ctl) 2523{ 2524 const lsquic_packet_out_t *packet_out; 2525 unsigned n; 2526 size_t size; 2527 const struct lsquic_packets_tailq queues[] = { 2528 ctl->sc_scheduled_packets, 2529 ctl->sc_unacked_packets[PNS_INIT], 2530 ctl->sc_unacked_packets[PNS_HSK], 2531 ctl->sc_unacked_packets[PNS_APP], 2532 ctl->sc_lost_packets, 2533 ctl->sc_buffered_packets[0].bpq_packets, 2534 ctl->sc_buffered_packets[1].bpq_packets, 2535 }; 2536 2537 size = sizeof(*ctl); 2538 2539 for (n = 0; n < sizeof(queues) / sizeof(queues[0]); ++n) 2540 TAILQ_FOREACH(packet_out, &queues[n], po_next) 2541 size += lsquic_packet_out_mem_used(packet_out); 2542 2543 return size; 2544} 2545 2546 2547void 2548lsquic_send_ctl_verneg_done (struct lsquic_send_ctl *ctl) 2549{ 2550 ctl->sc_max_packno_bits = PACKNO_BITS_3; 2551 LSQ_DEBUG("version negotiation done (%s): max packno bits: %u", 2552 lsquic_ver2str[ ctl->sc_conn_pub->lconn->cn_version ], 2553 ctl->sc_max_packno_bits); 2554} 2555 2556 2557static void 2558strip_trailing_padding (struct lsquic_packet_out *packet_out) 2559{ 2560 struct packet_out_srec_iter posi; 2561 const struct stream_rec *srec; 2562 unsigned off; 2563 2564 off = 0; 2565 for (srec = posi_first(&posi, packet_out); srec; srec = posi_next(&posi)) 2566 off = srec->sr_off + srec->sr_len; 2567 2568 assert(off); 2569 2570 packet_out->po_data_sz = off; 2571 packet_out->po_frame_types &= ~QUIC_FTBIT_PADDING; 2572} 2573 2574 2575int 2576lsquic_send_ctl_retry (struct lsquic_send_ctl *ctl, 2577 const unsigned char *token, size_t token_sz) 2578{ 2579 struct lsquic_packet_out *packet_out, *next, *new_packet_out; 2580 struct lsquic_conn *const lconn = ctl->sc_conn_pub->lconn; 2581 size_t sz; 2582 2583 if (token_sz >= 1ull << (sizeof(packet_out->po_token_len) * 8)) 2584 { 2585 LSQ_WARN("token size %zu is too long", token_sz); 2586 return -1; 2587 } 2588 2589 ++ctl->sc_retry_count; 2590 if (ctl->sc_retry_count > 3) 2591 { 2592 LSQ_INFO("failing connection after %u retries", ctl->sc_retry_count); 2593 return -1; 2594 } 2595 2596 send_ctl_expire(ctl, PNS_INIT, EXFI_ALL); 2597 2598 if (0 != lsquic_send_ctl_set_token(ctl, token, token_sz)) 2599 return -1; 2600 2601 for (packet_out = TAILQ_FIRST(&ctl->sc_lost_packets); packet_out; packet_out = next) 2602 { 2603 next = TAILQ_NEXT(packet_out, po_next); 2604 if (HETY_INITIAL != packet_out->po_header_type) 2605 continue; 2606 2607 if (packet_out->po_nonce) 2608 free(packet_out->po_nonce); 2609 2610 if (0 != send_ctl_set_packet_out_token(ctl, packet_out)) 2611 { 2612 LSQ_INFO("cannot set out token on packet"); 2613 return -1; 2614 } 2615 2616 if (packet_out->po_frame_types & QUIC_FTBIT_PADDING) 2617 strip_trailing_padding(packet_out); 2618 2619 sz = lconn->cn_pf->pf_packout_size(lconn, packet_out); 2620 if (sz > 1200) 2621 { 2622 const enum packno_bits bits = lsquic_send_ctl_calc_packno_bits(ctl); 2623 new_packet_out = send_ctl_allocate_packet(ctl, bits, 0, PNS_INIT, 2624 packet_out->po_path); 2625 if (!new_packet_out) 2626 return -1; 2627 if (0 == lsquic_packet_out_split_in_two(&ctl->sc_enpub->enp_mm, 2628 packet_out, new_packet_out, 2629 ctl->sc_conn_pub->lconn->cn_pf, sz - 1200)) 2630 { 2631 LSQ_DEBUG("split lost packet %"PRIu64" into two", 2632 packet_out->po_packno); 2633 lsquic_packet_out_set_packno_bits(packet_out, bits); 2634 TAILQ_INSERT_AFTER(&ctl->sc_lost_packets, packet_out, 2635 new_packet_out, po_next); 2636 return 0; 2637 } 2638 else 2639 { 2640 LSQ_DEBUG("could not split lost packet into two"); 2641 send_ctl_destroy_packet(ctl, new_packet_out); 2642 return -1; 2643 } 2644 } 2645 } 2646 2647 return 0; 2648} 2649 2650 2651int 2652lsquic_send_ctl_set_token (struct lsquic_send_ctl *ctl, 2653 const unsigned char *token, size_t token_sz) 2654{ 2655 unsigned char *copy; 2656 2657 if (token_sz > 1 << 2658 (sizeof(((struct lsquic_packet_out *)0)->po_token_len) * 8)) 2659 { 2660 errno = EINVAL; 2661 return -1; 2662 } 2663 2664 copy = malloc(token_sz); 2665 if (!copy) 2666 return -1; 2667 memcpy(copy, token, token_sz); 2668 free(ctl->sc_token); 2669 ctl->sc_token = copy; 2670 ctl->sc_token_sz = token_sz; 2671 LSQ_DEBUG("set token"); 2672 return 0; 2673} 2674 2675 2676void 2677lsquic_send_ctl_empty_pns (struct lsquic_send_ctl *ctl, enum packnum_space pns) 2678{ 2679 lsquic_packet_out_t *packet_out, *next; 2680 unsigned count, packet_sz; 2681 struct lsquic_packets_tailq *const *q; 2682 struct lsquic_packets_tailq *const queues[] = { 2683 &ctl->sc_lost_packets, 2684 &ctl->sc_buffered_packets[0].bpq_packets, 2685 &ctl->sc_buffered_packets[1].bpq_packets, 2686 }; 2687 2688 /* Don't bother with chain destruction, as all chains members are always 2689 * within the same packet number space 2690 */ 2691 2692 count = 0; 2693 for (packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); packet_out; 2694 packet_out = next) 2695 { 2696 next = TAILQ_NEXT(packet_out, po_next); 2697 if (pns == lsquic_packet_out_pns(packet_out)) 2698 { 2699 send_ctl_maybe_renumber_sched_to_right(ctl, packet_out); 2700 send_ctl_sched_remove(ctl, packet_out); 2701 send_ctl_destroy_packet(ctl, packet_out); 2702 ++count; 2703 } 2704 } 2705 2706 for (packet_out = TAILQ_FIRST(&ctl->sc_unacked_packets[pns]); packet_out; 2707 packet_out = next) 2708 { 2709 next = TAILQ_NEXT(packet_out, po_next); 2710 if (packet_out->po_flags & PO_LOSS_REC) 2711 TAILQ_REMOVE(&ctl->sc_unacked_packets[pns], packet_out, po_next); 2712 else 2713 { 2714 packet_sz = packet_out_sent_sz(packet_out); 2715 send_ctl_unacked_remove(ctl, packet_out, packet_sz); 2716 lsquic_packet_out_ack_streams(packet_out); 2717 } 2718 send_ctl_destroy_packet(ctl, packet_out); 2719 ++count; 2720 } 2721 2722 for (q = queues; q < queues + sizeof(queues) / sizeof(queues[0]); ++q) 2723 for (packet_out = TAILQ_FIRST(*q); packet_out; packet_out = next) 2724 { 2725 next = TAILQ_NEXT(packet_out, po_next); 2726 if (pns == lsquic_packet_out_pns(packet_out)) 2727 { 2728 TAILQ_REMOVE(*q, packet_out, po_next); 2729 send_ctl_destroy_packet(ctl, packet_out); 2730 ++count; 2731 } 2732 } 2733 2734 lsquic_alarmset_unset(ctl->sc_alset, AL_RETX_INIT + pns); 2735 2736 LSQ_DEBUG("emptied %s, destroyed %u packet%.*s", lsquic_pns2str[pns], 2737 count, count != 1, "s"); 2738} 2739 2740 2741void 2742lsquic_send_ctl_repath (struct lsquic_send_ctl *ctl, struct network_path *old, 2743 struct network_path *new) 2744{ 2745 struct lsquic_packet_out *packet_out; 2746 unsigned count; 2747 struct lsquic_packets_tailq *const *q; 2748 struct lsquic_packets_tailq *const queues[] = { 2749 &ctl->sc_scheduled_packets, 2750 &ctl->sc_unacked_packets[PNS_INIT], 2751 &ctl->sc_unacked_packets[PNS_HSK], 2752 &ctl->sc_unacked_packets[PNS_APP], 2753 &ctl->sc_lost_packets, 2754 &ctl->sc_buffered_packets[0].bpq_packets, 2755 &ctl->sc_buffered_packets[1].bpq_packets, 2756 }; 2757 2758 assert(ctl->sc_flags & SC_IETF); 2759 2760 count = 0; 2761 for (q = queues; q < queues + sizeof(queues) / sizeof(queues[0]); ++q) 2762 TAILQ_FOREACH(packet_out, *q, po_next) 2763 if (packet_out->po_path == old) 2764 { 2765 ++count; 2766 packet_out->po_path = new; 2767 if (packet_out->po_flags & PO_ENCRYPTED) 2768 send_ctl_return_enc_data(ctl, packet_out); 2769 } 2770 2771 LSQ_DEBUG("repathed %u packet%.*s", count, count != 1, "s"); 2772} 2773 2774 2775void 2776lsquic_send_ctl_return_enc_data (struct lsquic_send_ctl *ctl) 2777{ 2778 struct lsquic_packet_out *packet_out; 2779 2780 assert(!(ctl->sc_flags & SC_IETF)); 2781 2782 TAILQ_FOREACH(packet_out, &ctl->sc_scheduled_packets, po_next) 2783 if (packet_out->po_flags & PO_ENCRYPTED) 2784 send_ctl_return_enc_data(ctl, packet_out); 2785} 2786