1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
25392f7a3SLiteSpeed Tech/*
35392f7a3SLiteSpeed Tech * lsquic_purga.h -- Purgatory for CIDs
45392f7a3SLiteSpeed Tech *
55392f7a3SLiteSpeed Tech * This module keeps a set of CIDs that should be ignored for a period
65392f7a3SLiteSpeed Tech * of time.  It is used when a connection is closed: this way, late
75392f7a3SLiteSpeed Tech * packets will not create a new connection.
85392f7a3SLiteSpeed Tech */
95392f7a3SLiteSpeed Tech
105392f7a3SLiteSpeed Tech#ifndef LSQUIC_PURGA_H
115392f7a3SLiteSpeed Tech#define LSQUIC_PURGA_H 1
125392f7a3SLiteSpeed Tech
135392f7a3SLiteSpeed Techstruct lsquic_purga;
145392f7a3SLiteSpeed Tech
155392f7a3SLiteSpeed Tech/* Purgatory type is used to tell what action to take when a packet whose
165392f7a3SLiteSpeed Tech * CID is in the purgatory is received.
175392f7a3SLiteSpeed Tech */
185392f7a3SLiteSpeed Techenum purga_type
195392f7a3SLiteSpeed Tech{
205392f7a3SLiteSpeed Tech    PUTY_CONN_DELETED,  /* Connection was deleted */
215392f7a3SLiteSpeed Tech    PUTY_CONN_DRAIN,    /* Connection is in the "Drain" state */
225392f7a3SLiteSpeed Tech    PUTY_CID_RETIRED,   /* CID was retired */
235392f7a3SLiteSpeed Tech};
245392f7a3SLiteSpeed Tech
255392f7a3SLiteSpeed Tech/* User can set these values freely */
265392f7a3SLiteSpeed Techstruct purga_el
275392f7a3SLiteSpeed Tech{
285392f7a3SLiteSpeed Tech    enum purga_type             puel_type;
294580fab7SDmitri Tikhonov    /* When puel_type is PUTY_CONN_DRAIN or PUTY_CID_RETIRED, puel_time
304580fab7SDmitri Tikhonov     * specifies the time until the end of the drain period.
315392f7a3SLiteSpeed Tech     *
325392f7a3SLiteSpeed Tech     * When puel_type is PUTY_CONN_DELETED, puel_time specifies the time
335392f7a3SLiteSpeed Tech     * until the next time stateless reset can be sent.  puel_count is the
345392f7a3SLiteSpeed Tech     * number of times puel_time was updated.
355392f7a3SLiteSpeed Tech     */
365392f7a3SLiteSpeed Tech    unsigned                    puel_count;
375392f7a3SLiteSpeed Tech    lsquic_time_t               puel_time;
385392f7a3SLiteSpeed Tech};
395392f7a3SLiteSpeed Tech
405392f7a3SLiteSpeed Techstruct lsquic_purga *
415392f7a3SLiteSpeed Techlsquic_purga_new (lsquic_time_t min_life, lsquic_cids_update_f remove_cids,
425392f7a3SLiteSpeed Tech                                                            void *remove_ctx);
435392f7a3SLiteSpeed Tech
445392f7a3SLiteSpeed Techstruct purga_el *
455392f7a3SLiteSpeed Techlsquic_purga_add (struct lsquic_purga *, const lsquic_cid_t *, void *peer_ctx,
465392f7a3SLiteSpeed Tech                                                enum purga_type, lsquic_time_t);
475392f7a3SLiteSpeed Tech
485392f7a3SLiteSpeed Techstruct purga_el *
495392f7a3SLiteSpeed Techlsquic_purga_contains (struct lsquic_purga *, const lsquic_cid_t *);
505392f7a3SLiteSpeed Tech
515392f7a3SLiteSpeed Techvoid
525392f7a3SLiteSpeed Techlsquic_purga_destroy (struct lsquic_purga *);
535392f7a3SLiteSpeed Tech
545392f7a3SLiteSpeed Techunsigned
555392f7a3SLiteSpeed Techlsquic_purga_cids_per_page (void);
565392f7a3SLiteSpeed Tech
575392f7a3SLiteSpeed Tech#ifndef NDEBUG
585392f7a3SLiteSpeed Techstruct purga_bloom_stats
595392f7a3SLiteSpeed Tech{
605392f7a3SLiteSpeed Tech    unsigned long   searches;
615392f7a3SLiteSpeed Tech    unsigned long   false_hits;
625392f7a3SLiteSpeed Tech};
635392f7a3SLiteSpeed Tech
645392f7a3SLiteSpeed Techstruct purga_bloom_stats *
655392f7a3SLiteSpeed Techlsquic_purga_get_bloom_stats (struct lsquic_purga *);
665392f7a3SLiteSpeed Tech#endif
675392f7a3SLiteSpeed Tech
685392f7a3SLiteSpeed Tech#endif
69