Lines Matching refs:rcidm

36 static void rcidm_update(QUIC_RCIDM *rcidm);
37 static void rcidm_set_preferred_rcid(QUIC_RCIDM *rcidm,
245 static void rcidm_transition_rcid(QUIC_RCIDM *rcidm, RCID *rcid,
249 static void rcidm_check_rcid(QUIC_RCIDM *rcidm, RCID *rcid) in rcidm_check_rcid() argument
257 == (rcidm->cur_rcid == rcid)); in rcidm_check_rcid()
260 || ossl_list_retiring_head(&rcidm->retiring_list) == rcid) in rcidm_check_rcid()
266 assert(rcid->seq_num >= rcidm->retire_prior_to in rcidm_check_rcid()
268 assert(rcidm->num_changes == 0 || rcidm->handshake_complete); in rcidm_check_rcid()
269 assert(rcid->state != RCID_STATE_RETIRING || rcidm->num_retiring > 0); in rcidm_check_rcid()
283 QUIC_RCIDM *rcidm; in ossl_quic_rcidm_new() local
285 if ((rcidm = OPENSSL_zalloc(sizeof(*rcidm))) == NULL) in ossl_quic_rcidm_new()
288 if ((rcidm->rcids = ossl_pqueue_RCID_new(rcid_cmp)) == NULL) { in ossl_quic_rcidm_new()
289 OPENSSL_free(rcidm); in ossl_quic_rcidm_new()
294 rcidm->initial_odcid = *initial_odcid; in ossl_quic_rcidm_new()
295 rcidm->added_initial_odcid = 1; in ossl_quic_rcidm_new()
298 rcidm_update(rcidm); in ossl_quic_rcidm_new()
299 return rcidm; in ossl_quic_rcidm_new()
302 void ossl_quic_rcidm_free(QUIC_RCIDM *rcidm) in ossl_quic_rcidm_free() argument
306 if (rcidm == NULL) in ossl_quic_rcidm_free()
309 OPENSSL_free(rcidm->cur_rcid); in ossl_quic_rcidm_free()
310 while ((rcid = ossl_pqueue_RCID_pop(rcidm->rcids)) != NULL) in ossl_quic_rcidm_free()
313 OSSL_LIST_FOREACH_DELSAFE(rcid, rnext, retiring, &rcidm->retiring_list) in ossl_quic_rcidm_free()
316 ossl_pqueue_RCID_free(rcidm->rcids); in ossl_quic_rcidm_free()
317 OPENSSL_free(rcidm); in ossl_quic_rcidm_free()
320 static void rcidm_set_preferred_rcid(QUIC_RCIDM *rcidm, in rcidm_set_preferred_rcid() argument
324 rcidm->preferred_rcid_changed = 1; in rcidm_set_preferred_rcid()
325 rcidm->have_preferred_rcid = 0; in rcidm_set_preferred_rcid()
329 if (ossl_quic_conn_id_eq(&rcidm->preferred_rcid, rcid)) in rcidm_set_preferred_rcid()
332 rcidm->preferred_rcid = *rcid; in rcidm_set_preferred_rcid()
333 rcidm->preferred_rcid_changed = 1; in rcidm_set_preferred_rcid()
334 rcidm->have_preferred_rcid = 1; in rcidm_set_preferred_rcid()
341 static RCID *rcidm_create_rcid(QUIC_RCIDM *rcidm, uint64_t seq_num, in rcidm_create_rcid() argument
349 || ossl_pqueue_RCID_num(rcidm->rcids) + rcidm->num_retiring in rcidm_create_rcid()
360 if (rcid->seq_num >= rcidm->retire_prior_to) { in rcidm_create_rcid()
363 if (!ossl_pqueue_RCID_push(rcidm->rcids, rcid, &rcid->pq_idx)) { in rcidm_create_rcid()
371 ossl_list_retiring_insert_tail(&rcidm->retiring_list, rcid); in rcidm_create_rcid()
372 ++rcidm->num_retiring; in rcidm_create_rcid()
375 rcidm_check_rcid(rcidm, rcid); in rcidm_create_rcid()
379 static void rcidm_transition_rcid(QUIC_RCIDM *rcidm, RCID *rcid, in rcidm_transition_rcid() argument
385 rcidm_check_rcid(rcidm, rcid); in rcidm_transition_rcid()
389 if (rcidm->cur_rcid != NULL && state == RCID_STATE_CUR) { in rcidm_transition_rcid()
390 rcidm_transition_rcid(rcidm, rcidm->cur_rcid, RCID_STATE_RETIRING); in rcidm_transition_rcid()
391 assert(rcidm->cur_rcid == NULL); in rcidm_transition_rcid()
395 ossl_pqueue_RCID_remove(rcidm->rcids, rcid->pq_idx); in rcidm_transition_rcid()
402 rcidm->cur_rcid = rcid; in rcidm_transition_rcid()
405 rcidm->cur_rcid = NULL; in rcidm_transition_rcid()
407 ossl_list_retiring_insert_tail(&rcidm->retiring_list, rcid); in rcidm_transition_rcid()
408 ++rcidm->num_retiring; in rcidm_transition_rcid()
411 rcidm_check_rcid(rcidm, rcid); in rcidm_transition_rcid()
414 static void rcidm_free_rcid(QUIC_RCIDM *rcidm, RCID *rcid) in rcidm_free_rcid() argument
419 rcidm_check_rcid(rcidm, rcid); in rcidm_free_rcid()
423 ossl_pqueue_RCID_remove(rcidm->rcids, rcid->pq_idx); in rcidm_free_rcid()
426 rcidm->cur_rcid = NULL; in rcidm_free_rcid()
429 ossl_list_retiring_remove(&rcidm->retiring_list, rcid); in rcidm_free_rcid()
430 --rcidm->num_retiring; in rcidm_free_rcid()
440 static void rcidm_handle_retire_prior_to(QUIC_RCIDM *rcidm, in rcidm_handle_retire_prior_to() argument
445 if (retire_prior_to <= rcidm->retire_prior_to) in rcidm_handle_retire_prior_to()
451 if (rcidm->cur_rcid != NULL && rcidm->cur_rcid->seq_num < retire_prior_to) in rcidm_handle_retire_prior_to()
452 rcidm_transition_rcid(rcidm, rcidm->cur_rcid, RCID_STATE_RETIRING); in rcidm_handle_retire_prior_to()
459 while ((rcid = ossl_pqueue_RCID_peek(rcidm->rcids)) != NULL in rcidm_handle_retire_prior_to()
461 rcidm_transition_rcid(rcidm, rcid, RCID_STATE_RETIRING); in rcidm_handle_retire_prior_to()
463 rcidm->retire_prior_to = retire_prior_to; in rcidm_handle_retire_prior_to()
471 static void rcidm_roll(QUIC_RCIDM *rcidm) in rcidm_roll() argument
475 if ((rcid = ossl_pqueue_RCID_peek(rcidm->rcids)) == NULL) in rcidm_roll()
478 rcidm_transition_rcid(rcidm, rcid, RCID_STATE_CUR); in rcidm_roll()
480 ++rcidm->num_changes; in rcidm_roll()
481 rcidm->roll_requested = 0; in rcidm_roll()
483 if (rcidm->packets_sent >= PACKETS_PER_RCID) in rcidm_roll()
484 rcidm->packets_sent %= PACKETS_PER_RCID; in rcidm_roll()
486 rcidm->packets_sent = 0; in rcidm_roll()
489 static void rcidm_update(QUIC_RCIDM *rcidm) in rcidm_update() argument
496 if (rcidm->cur_rcid == NULL in rcidm_update()
497 && (rcid = ossl_pqueue_RCID_peek(rcidm->rcids)) != NULL) { in rcidm_update()
498 rcidm_transition_rcid(rcidm, rcid, RCID_STATE_CUR); in rcidm_update()
499 assert(rcidm->cur_rcid != NULL); in rcidm_update()
503 if (rcidm->cur_rcid != NULL) { in rcidm_update()
504 rcidm_check_rcid(rcidm, rcidm->cur_rcid); in rcidm_update()
505 rcidm_set_preferred_rcid(rcidm, &rcidm->cur_rcid->cid); in rcidm_update()
513 if (rcidm->added_retry_odcid && !rcidm->handshake_complete) { in rcidm_update()
514 rcidm_set_preferred_rcid(rcidm, &rcidm->retry_odcid); in rcidm_update()
518 if (rcidm->added_initial_odcid && !rcidm->handshake_complete) { in rcidm_update()
519 rcidm_set_preferred_rcid(rcidm, &rcidm->initial_odcid); in rcidm_update()
524 rcidm_set_preferred_rcid(rcidm, NULL); in rcidm_update()
527 static int rcidm_should_roll(QUIC_RCIDM *rcidm) in rcidm_should_roll() argument
534 return rcidm->handshake_complete in rcidm_should_roll()
535 && (rcidm->num_changes == 0 in rcidm_should_roll()
536 || rcidm->packets_sent >= PACKETS_PER_RCID in rcidm_should_roll()
537 || rcidm->roll_requested); in rcidm_should_roll()
540 static void rcidm_tick(QUIC_RCIDM *rcidm) in rcidm_tick() argument
542 if (rcidm_should_roll(rcidm)) in rcidm_tick()
543 rcidm_roll(rcidm); in rcidm_tick()
545 rcidm_update(rcidm); in rcidm_tick()
552 void ossl_quic_rcidm_on_handshake_complete(QUIC_RCIDM *rcidm) in ossl_quic_rcidm_on_handshake_complete() argument
554 if (rcidm->handshake_complete) in ossl_quic_rcidm_on_handshake_complete()
557 rcidm->handshake_complete = 1; in ossl_quic_rcidm_on_handshake_complete()
558 rcidm_tick(rcidm); in ossl_quic_rcidm_on_handshake_complete()
561 void ossl_quic_rcidm_on_packet_sent(QUIC_RCIDM *rcidm, uint64_t num_packets) in ossl_quic_rcidm_on_packet_sent() argument
566 rcidm->packets_sent += num_packets; in ossl_quic_rcidm_on_packet_sent()
567 rcidm_tick(rcidm); in ossl_quic_rcidm_on_packet_sent()
570 void ossl_quic_rcidm_request_roll(QUIC_RCIDM *rcidm) in ossl_quic_rcidm_request_roll() argument
572 rcidm->roll_requested = 1; in ossl_quic_rcidm_request_roll()
573 rcidm_tick(rcidm); in ossl_quic_rcidm_request_roll()
580 int ossl_quic_rcidm_add_from_initial(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_add_from_initial() argument
585 if (rcidm->added_initial_rcid || rcidm->handshake_complete) in ossl_quic_rcidm_add_from_initial()
588 rcid_obj = rcidm_create_rcid(rcidm, INITIAL_SEQ_NUM, in ossl_quic_rcidm_add_from_initial()
593 rcidm->added_initial_rcid = 1; in ossl_quic_rcidm_add_from_initial()
594 rcidm_tick(rcidm); in ossl_quic_rcidm_add_from_initial()
598 int ossl_quic_rcidm_add_from_server_retry(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_add_from_server_retry() argument
601 if (rcidm->added_retry_odcid || rcidm->handshake_complete) in ossl_quic_rcidm_add_from_server_retry()
604 rcidm->retry_odcid = *retry_odcid; in ossl_quic_rcidm_add_from_server_retry()
605 rcidm->added_retry_odcid = 1; in ossl_quic_rcidm_add_from_server_retry()
606 rcidm_tick(rcidm); in ossl_quic_rcidm_add_from_server_retry()
610 int ossl_quic_rcidm_add_from_ncid(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_add_from_ncid() argument
615 rcid = rcidm_create_rcid(rcidm, ncid->seq_num, &ncid->conn_id, RCID_TYPE_NCID); in ossl_quic_rcidm_add_from_ncid()
619 rcidm_handle_retire_prior_to(rcidm, ncid->retire_prior_to); in ossl_quic_rcidm_add_from_ncid()
620 rcidm_tick(rcidm); in ossl_quic_rcidm_add_from_ncid()
629 static int rcidm_get_retire(QUIC_RCIDM *rcidm, uint64_t *seq_num, int peek) in rcidm_get_retire() argument
631 RCID *rcid = ossl_list_retiring_head(&rcidm->retiring_list); in rcidm_get_retire()
640 rcidm_free_rcid(rcidm, rcid); in rcidm_get_retire()
645 int ossl_quic_rcidm_pop_retire_seq_num(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_pop_retire_seq_num() argument
648 return rcidm_get_retire(rcidm, seq_num, /*peek=*/0); in ossl_quic_rcidm_pop_retire_seq_num()
651 int ossl_quic_rcidm_peek_retire_seq_num(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_peek_retire_seq_num() argument
654 return rcidm_get_retire(rcidm, seq_num, /*peek=*/1); in ossl_quic_rcidm_peek_retire_seq_num()
657 int ossl_quic_rcidm_get_preferred_tx_dcid(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_get_preferred_tx_dcid() argument
660 if (!rcidm->have_preferred_rcid) in ossl_quic_rcidm_get_preferred_tx_dcid()
663 *tx_dcid = rcidm->preferred_rcid; in ossl_quic_rcidm_get_preferred_tx_dcid()
667 int ossl_quic_rcidm_get_preferred_tx_dcid_changed(QUIC_RCIDM *rcidm, in ossl_quic_rcidm_get_preferred_tx_dcid_changed() argument
670 int r = rcidm->preferred_rcid_changed; in ossl_quic_rcidm_get_preferred_tx_dcid_changed()
673 rcidm->preferred_rcid_changed = 0; in ossl_quic_rcidm_get_preferred_tx_dcid_changed()
678 size_t ossl_quic_rcidm_get_num_active(const QUIC_RCIDM *rcidm) in ossl_quic_rcidm_get_num_active() argument
680 return ossl_pqueue_RCID_num(rcidm->rcids) in ossl_quic_rcidm_get_num_active()
681 + (rcidm->cur_rcid != NULL ? 1 : 0) in ossl_quic_rcidm_get_num_active()
682 + ossl_quic_rcidm_get_num_retiring(rcidm); in ossl_quic_rcidm_get_num_active()
685 size_t ossl_quic_rcidm_get_num_retiring(const QUIC_RCIDM *rcidm) in ossl_quic_rcidm_get_num_retiring() argument
687 return rcidm->num_retiring; in ossl_quic_rcidm_get_num_retiring()