1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_alarmset.h -- A set of alarms
450aadb33SDmitri Tikhonov */
550aadb33SDmitri Tikhonov
650aadb33SDmitri Tikhonov#ifndef LSQUIC_ALARM_H
750aadb33SDmitri Tikhonov#define LSQUIC_ALARM_H 1
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonov#include "lsquic_int_types.h"
1050aadb33SDmitri Tikhonov
115392f7a3SLiteSpeed Techenum alarm_id;
125392f7a3SLiteSpeed Techstruct lsquic_conn;
135392f7a3SLiteSpeed Tech
145392f7a3SLiteSpeed Techtypedef void (*lsquic_alarm_cb_f)(enum alarm_id, void *cb_ctx,
1550aadb33SDmitri Tikhonov                                  lsquic_time_t expiry, lsquic_time_t now);
1650aadb33SDmitri Tikhonov
1750aadb33SDmitri Tikhonovtypedef struct lsquic_alarm {
1850aadb33SDmitri Tikhonov    lsquic_alarm_cb_f           callback;
1950aadb33SDmitri Tikhonov    void                       *cb_ctx;
2050aadb33SDmitri Tikhonov} lsquic_alarm_t;
2150aadb33SDmitri Tikhonov
2250aadb33SDmitri Tikhonov
2350aadb33SDmitri Tikhonovenum alarm_id {
2450aadb33SDmitri Tikhonov    AL_HANDSHAKE,
255392f7a3SLiteSpeed Tech    AL_RETX_INIT,
265392f7a3SLiteSpeed Tech    AL_RETX_HSK = AL_RETX_INIT + PNS_HSK,
275392f7a3SLiteSpeed Tech    AL_RETX_APP = AL_RETX_INIT + PNS_APP,
2850aadb33SDmitri Tikhonov    AL_PING,
29b8fa6195SDmitri Tikhonov    AL_MTU_PROBE,
3050aadb33SDmitri Tikhonov    AL_IDLE,
31bc520ef7SDmitri Tikhonov    AL_ACK_APP,
325392f7a3SLiteSpeed Tech    AL_RET_CIDS,
335392f7a3SLiteSpeed Tech    AL_CID_THROT,
345392f7a3SLiteSpeed Tech    AL_PATH_CHAL,
355392f7a3SLiteSpeed Tech    AL_PATH_CHAL_0 = AL_PATH_CHAL,
365392f7a3SLiteSpeed Tech    AL_PATH_CHAL_1,
37fb73393fSDmitri Tikhonov    AL_PATH_CHAL_2,
38fb73393fSDmitri Tikhonov    AL_PATH_CHAL_3,
3965728dc5SDmitri Tikhonov    AL_SESS_TICKET,
409fc12041SDmitri Tikhonov    AL_BLOCKED_KA,      /* Blocked Keep-Alive */
41f38b395aSDmitri Tikhonov    AL_PACK_TOL,        /* Calculate packet tolerance */
4250aadb33SDmitri Tikhonov    MAX_LSQUIC_ALARMS
4350aadb33SDmitri Tikhonov};
4450aadb33SDmitri Tikhonov
4550aadb33SDmitri Tikhonov
4650aadb33SDmitri Tikhonovenum alarm_id_bit {
4750aadb33SDmitri Tikhonov    ALBIT_HANDSHAKE = 1 << AL_HANDSHAKE,
485392f7a3SLiteSpeed Tech    ALBIT_RETX_INIT = 1 << AL_RETX_INIT,
495392f7a3SLiteSpeed Tech    ALBIT_RETX_HSK  = 1 << AL_RETX_HSK,
505392f7a3SLiteSpeed Tech    ALBIT_RETX_APP  = 1 << AL_RETX_APP,
515392f7a3SLiteSpeed Tech    ALBIT_ACK_APP   = 1 << AL_ACK_APP,
5250aadb33SDmitri Tikhonov    ALBIT_PING      = 1 << AL_PING,
5350aadb33SDmitri Tikhonov    ALBIT_IDLE      = 1 << AL_IDLE,
545392f7a3SLiteSpeed Tech    ALBIT_RET_CIDS  = 1 << AL_RET_CIDS,
555392f7a3SLiteSpeed Tech    ALBIT_CID_THROT = 1 << AL_CID_THROT,
565392f7a3SLiteSpeed Tech    ALBIT_PATH_CHAL_0 = 1 << AL_PATH_CHAL_0,
575392f7a3SLiteSpeed Tech    ALBIT_PATH_CHAL_1 = 1 << AL_PATH_CHAL_1,
58fb73393fSDmitri Tikhonov    ALBIT_PATH_CHAL_2 = 1 << AL_PATH_CHAL_2,
59fb73393fSDmitri Tikhonov    ALBIT_PATH_CHAL_3 = 1 << AL_PATH_CHAL_3,
6065728dc5SDmitri Tikhonov    ALBIT_SESS_TICKET = 1 << AL_SESS_TICKET,
619fc12041SDmitri Tikhonov    ALBIT_BLOCKED_KA  = 1 << AL_BLOCKED_KA,
62b8fa6195SDmitri Tikhonov    ALBIT_MTU_PROBE = 1 << AL_MTU_PROBE,
63f38b395aSDmitri Tikhonov    ALBIT_PACK_TOL = 1 << AL_PACK_TOL,
6450aadb33SDmitri Tikhonov};
6550aadb33SDmitri Tikhonov
6650aadb33SDmitri Tikhonov
6750aadb33SDmitri Tikhonovtypedef struct lsquic_alarmset {
6850aadb33SDmitri Tikhonov    enum alarm_id_bit           as_armed_set;
6950aadb33SDmitri Tikhonov    lsquic_time_t               as_expiry[MAX_LSQUIC_ALARMS];
705392f7a3SLiteSpeed Tech    const struct lsquic_conn   *as_conn;    /* Used for logging */
7150aadb33SDmitri Tikhonov    struct lsquic_alarm         as_alarms[MAX_LSQUIC_ALARMS];
7250aadb33SDmitri Tikhonov} lsquic_alarmset_t;
7350aadb33SDmitri Tikhonov
7450aadb33SDmitri Tikhonov
7550aadb33SDmitri Tikhonovvoid
765392f7a3SLiteSpeed Techlsquic_alarmset_init (lsquic_alarmset_t *, const struct lsquic_conn *);
7750aadb33SDmitri Tikhonov
7850aadb33SDmitri Tikhonovvoid
7950aadb33SDmitri Tikhonovlsquic_alarmset_init_alarm (lsquic_alarmset_t *, enum alarm_id,
8050aadb33SDmitri Tikhonov                            lsquic_alarm_cb_f, void *cb_ctx);
8150aadb33SDmitri Tikhonov
8250aadb33SDmitri Tikhonov#define lsquic_alarmset_set(alarmset, al_id, exp) do {                  \
8350aadb33SDmitri Tikhonov    (alarmset)->as_armed_set |= 1 << (al_id);                           \
8450aadb33SDmitri Tikhonov    (alarmset)->as_expiry[al_id] = exp;                                 \
8550aadb33SDmitri Tikhonov} while (0)
8650aadb33SDmitri Tikhonov
8750aadb33SDmitri Tikhonov#define lsquic_alarmset_unset(alarmset, al_id) do {                     \
8850aadb33SDmitri Tikhonov    (alarmset)->as_armed_set &= ~(1 << (al_id));                        \
8950aadb33SDmitri Tikhonov} while (0)
9050aadb33SDmitri Tikhonov
9150aadb33SDmitri Tikhonov#define lsquic_alarmset_is_set(alarmset, al_id) \
9250aadb33SDmitri Tikhonov                            ((alarmset)->as_armed_set & (1 << (al_id)))
9350aadb33SDmitri Tikhonov
945392f7a3SLiteSpeed Tech#define lsquic_alarmset_are_set(alarmset, flags) \
955392f7a3SLiteSpeed Tech                            ((alarmset)->as_armed_set & (flags))
965392f7a3SLiteSpeed Tech
97f38b395aSDmitri Tikhonov#define lsquic_alarmset_is_inited(alarmset_, al_id_) (                  \
98f38b395aSDmitri Tikhonov    (alarmset_)->as_alarms[al_id_].callback)
99f38b395aSDmitri Tikhonov
10050aadb33SDmitri Tikhonov/* Timers "fire," alarms "ring." */
10150aadb33SDmitri Tikhonovvoid
10250aadb33SDmitri Tikhonovlsquic_alarmset_ring_expired (lsquic_alarmset_t *, lsquic_time_t now);
10350aadb33SDmitri Tikhonov
104e8bd737dSDmitri Tikhonovlsquic_time_t
1050adf085aSDmitri Tikhonovlsquic_alarmset_mintime (const lsquic_alarmset_t *, enum alarm_id *);
1060adf085aSDmitri Tikhonov
1070adf085aSDmitri Tikhonovextern const char *const lsquic_alid2str[];
108e8bd737dSDmitri Tikhonov
10950aadb33SDmitri Tikhonov#endif
110