Lines Matching defs:rcidm
36 static void rcidm_update(QUIC_RCIDM *rcidm);
37 static void rcidm_set_preferred_rcid(QUIC_RCIDM *rcidm,
79 * the RCID is not the current RCID, rcidm->cur_rcid != rcid;
87 * the RCID is the current RCID, rcidm->cur_rcid == rcid;
95 * the RCID is not the current RCID, rcidm->cur_rcid != rcid;
108 * user of the RCIDM and happens after the above state machine is terminated.
143 * The following "business logic" invariants also apply to the RCIDM
150 * added throughout the lifetime of an RCIDM.
152 * added throughout the lifetime of an RCIDM.
154 * throughout the lifetime of an RCIDM.
156 * throughout the lifetime of an RCIDM.
246 static void rcidm_transition_rcid(QUIC_RCIDM *rcidm, RCID *rcid,
250 static void rcidm_check_rcid(QUIC_RCIDM *rcidm, RCID *rcid)
258 == (rcidm->cur_rcid == rcid));
261 || ossl_list_retiring_head(&rcidm->retiring_list) == rcid)
267 assert(rcid->seq_num >= rcidm->retire_prior_to
269 assert(rcidm->num_changes == 0 || rcidm->handshake_complete);
270 assert(rcid->state != RCID_STATE_RETIRING || rcidm->num_retiring > 0);
284 QUIC_RCIDM *rcidm;
286 if ((rcidm = OPENSSL_zalloc(sizeof(*rcidm))) == NULL)
289 if ((rcidm->rcids = ossl_pqueue_RCID_new(rcid_cmp)) == NULL) {
290 OPENSSL_free(rcidm);
295 rcidm->initial_odcid = *initial_odcid;
296 rcidm->added_initial_odcid = 1;
299 rcidm_update(rcidm);
300 return rcidm;
303 void ossl_quic_rcidm_free(QUIC_RCIDM *rcidm)
307 if (rcidm == NULL)
310 OPENSSL_free(rcidm->cur_rcid);
311 while ((rcid = ossl_pqueue_RCID_pop(rcidm->rcids)) != NULL)
314 OSSL_LIST_FOREACH_DELSAFE(rcid, rnext, retiring, &rcidm->retiring_list)
317 ossl_pqueue_RCID_free(rcidm->rcids);
318 OPENSSL_free(rcidm);
321 static void rcidm_set_preferred_rcid(QUIC_RCIDM *rcidm,
325 rcidm->preferred_rcid_changed = 1;
326 rcidm->have_preferred_rcid = 0;
330 if (ossl_quic_conn_id_eq(&rcidm->preferred_rcid, rcid))
333 rcidm->preferred_rcid = *rcid;
334 rcidm->preferred_rcid_changed = 1;
335 rcidm->have_preferred_rcid = 1;
342 static RCID *rcidm_create_rcid(QUIC_RCIDM *rcidm, uint64_t seq_num,
350 || ossl_pqueue_RCID_num(rcidm->rcids) + rcidm->num_retiring
361 if (rcid->seq_num >= rcidm->retire_prior_to) {
364 if (!ossl_pqueue_RCID_push(rcidm->rcids, rcid, &rcid->pq_idx)) {
372 ossl_list_retiring_insert_tail(&rcidm->retiring_list, rcid);
373 ++rcidm->num_retiring;
376 rcidm_check_rcid(rcidm, rcid);
380 static void rcidm_transition_rcid(QUIC_RCIDM *rcidm, RCID *rcid,
386 rcidm_check_rcid(rcidm, rcid);
390 if (rcidm->cur_rcid != NULL && state == RCID_STATE_CUR) {
391 rcidm_transition_rcid(rcidm, rcidm->cur_rcid, RCID_STATE_RETIRING);
392 assert(rcidm->cur_rcid == NULL);
396 ossl_pqueue_RCID_remove(rcidm->rcids, rcid->pq_idx);
403 rcidm->cur_rcid = rcid;
406 rcidm->cur_rcid = NULL;
408 ossl_list_retiring_insert_tail(&rcidm->retiring_list, rcid);
409 ++rcidm->num_retiring;
412 rcidm_check_rcid(rcidm, rcid);
415 static void rcidm_free_rcid(QUIC_RCIDM *rcidm, RCID *rcid)
420 rcidm_check_rcid(rcidm, rcid);
424 ossl_pqueue_RCID_remove(rcidm->rcids, rcid->pq_idx);
427 rcidm->cur_rcid = NULL;
430 ossl_list_retiring_remove(&rcidm->retiring_list, rcid);
431 --rcidm->num_retiring;
441 static void rcidm_handle_retire_prior_to(QUIC_RCIDM *rcidm,
446 if (retire_prior_to <= rcidm->retire_prior_to)
452 if (rcidm->cur_rcid != NULL && rcidm->cur_rcid->seq_num < retire_prior_to)
453 rcidm_transition_rcid(rcidm, rcidm->cur_rcid, RCID_STATE_RETIRING);
460 while ((rcid = ossl_pqueue_RCID_peek(rcidm->rcids)) != NULL
462 rcidm_transition_rcid(rcidm, rcid, RCID_STATE_RETIRING);
464 rcidm->retire_prior_to = retire_prior_to;
472 static void rcidm_roll(QUIC_RCIDM *rcidm)
476 if ((rcid = ossl_pqueue_RCID_peek(rcidm->rcids)) == NULL)
479 rcidm_transition_rcid(rcidm, rcid, RCID_STATE_CUR);
481 ++rcidm->num_changes;
482 rcidm->roll_requested = 0;
484 if (rcidm->packets_sent >= PACKETS_PER_RCID)
485 rcidm->packets_sent %= PACKETS_PER_RCID;
487 rcidm->packets_sent = 0;
490 static void rcidm_update(QUIC_RCIDM *rcidm)
497 if (rcidm->cur_rcid == NULL
498 && (rcid = ossl_pqueue_RCID_peek(rcidm->rcids)) != NULL) {
499 rcidm_transition_rcid(rcidm, rcid, RCID_STATE_CUR);
500 assert(rcidm->cur_rcid != NULL);
504 if (rcidm->cur_rcid != NULL) {
505 rcidm_check_rcid(rcidm, rcidm->cur_rcid);
506 rcidm_set_preferred_rcid(rcidm, &rcidm->cur_rcid->cid);
514 if (rcidm->added_retry_odcid && !rcidm->handshake_complete) {
515 rcidm_set_preferred_rcid(rcidm, &rcidm->retry_odcid);
519 if (rcidm->added_initial_odcid && !rcidm->handshake_complete) {
520 rcidm_set_preferred_rcid(rcidm, &rcidm->initial_odcid);
525 rcidm_set_preferred_rcid(rcidm, NULL);
528 static int rcidm_should_roll(QUIC_RCIDM *rcidm)
535 return rcidm->handshake_complete
536 && (rcidm->num_changes == 0
537 || rcidm->packets_sent >= PACKETS_PER_RCID
538 || rcidm->roll_requested);
541 static void rcidm_tick(QUIC_RCIDM *rcidm)
543 if (rcidm_should_roll(rcidm))
544 rcidm_roll(rcidm);
546 rcidm_update(rcidm);
553 void ossl_quic_rcidm_on_handshake_complete(QUIC_RCIDM *rcidm)
555 if (rcidm->handshake_complete)
558 rcidm->handshake_complete = 1;
559 rcidm_tick(rcidm);
562 void ossl_quic_rcidm_on_packet_sent(QUIC_RCIDM *rcidm, uint64_t num_packets)
567 rcidm->packets_sent += num_packets;
568 rcidm_tick(rcidm);
571 void ossl_quic_rcidm_request_roll(QUIC_RCIDM *rcidm)
573 rcidm->roll_requested = 1;
574 rcidm_tick(rcidm);
581 int ossl_quic_rcidm_add_from_initial(QUIC_RCIDM *rcidm,
586 if (rcidm->added_initial_rcid || rcidm->handshake_complete)
589 rcid_obj = rcidm_create_rcid(rcidm, INITIAL_SEQ_NUM,
594 rcidm->added_initial_rcid = 1;
595 rcidm_tick(rcidm);
599 int ossl_quic_rcidm_add_from_server_retry(QUIC_RCIDM *rcidm,
602 if (rcidm->added_retry_odcid || rcidm->handshake_complete)
605 rcidm->retry_odcid = *retry_odcid;
606 rcidm->added_retry_odcid = 1;
607 rcidm_tick(rcidm);
611 int ossl_quic_rcidm_add_from_ncid(QUIC_RCIDM *rcidm,
616 rcid = rcidm_create_rcid(rcidm, ncid->seq_num, &ncid->conn_id, RCID_TYPE_NCID);
620 rcidm_handle_retire_prior_to(rcidm, ncid->retire_prior_to);
621 rcidm_tick(rcidm);
630 static int rcidm_get_retire(QUIC_RCIDM *rcidm, uint64_t *seq_num, int peek)
632 RCID *rcid = ossl_list_retiring_head(&rcidm->retiring_list);
641 rcidm_free_rcid(rcidm, rcid);
646 int ossl_quic_rcidm_pop_retire_seq_num(QUIC_RCIDM *rcidm,
649 return rcidm_get_retire(rcidm, seq_num, /*peek=*/0);
652 int ossl_quic_rcidm_peek_retire_seq_num(QUIC_RCIDM *rcidm,
655 return rcidm_get_retire(rcidm, seq_num, /*peek=*/1);
658 int ossl_quic_rcidm_get_preferred_tx_dcid(QUIC_RCIDM *rcidm,
661 if (!rcidm->have_preferred_rcid)
664 *tx_dcid = rcidm->preferred_rcid;
668 int ossl_quic_rcidm_get_preferred_tx_dcid_changed(QUIC_RCIDM *rcidm,
671 int r = rcidm->preferred_rcid_changed;
674 rcidm->preferred_rcid_changed = 0;
679 size_t ossl_quic_rcidm_get_num_active(const QUIC_RCIDM *rcidm)
681 return ossl_pqueue_RCID_num(rcidm->rcids)
682 + (rcidm->cur_rcid != NULL ? 1 : 0)
683 + ossl_quic_rcidm_get_num_retiring(rcidm);
686 size_t ossl_quic_rcidm_get_num_retiring(const QUIC_RCIDM *rcidm)
688 return rcidm->num_retiring;