lsquic_alarmset.h revision 9fc12041
1/* Copyright (c) 2017 - 2020 LiteSpeed Technologies Inc.  See LICENSE. */
2/*
3 * lsquic_alarmset.h -- A set of alarms
4 */
5
6#ifndef LSQUIC_ALARM_H
7#define LSQUIC_ALARM_H 1
8
9#include "lsquic_int_types.h"
10
11enum alarm_id;
12struct lsquic_conn;
13
14typedef void (*lsquic_alarm_cb_f)(enum alarm_id, void *cb_ctx,
15                                  lsquic_time_t expiry, lsquic_time_t now);
16
17typedef struct lsquic_alarm {
18    lsquic_alarm_cb_f           callback;
19    void                       *cb_ctx;
20} lsquic_alarm_t;
21
22
23enum alarm_id {
24    AL_HANDSHAKE,
25    AL_RETX_INIT,
26    AL_RETX_HSK = AL_RETX_INIT + PNS_HSK,
27    AL_RETX_APP = AL_RETX_INIT + PNS_APP,
28    AL_PING,
29    AL_IDLE,
30    AL_ACK_INIT,
31    AL_ACK_HSK = AL_ACK_INIT + PNS_HSK,
32    AL_ACK_APP = AL_ACK_INIT + PNS_APP,
33    AL_RET_CIDS,
34    AL_CID_THROT,
35    AL_PATH_CHAL,
36    AL_PATH_CHAL_0 = AL_PATH_CHAL,
37    AL_PATH_CHAL_1,
38    AL_SESS_TICKET,
39    AL_BLOCKED_KA,      /* Blocked Keep-Alive */
40    MAX_LSQUIC_ALARMS
41};
42
43
44enum alarm_id_bit {
45    ALBIT_HANDSHAKE = 1 << AL_HANDSHAKE,
46    ALBIT_RETX_INIT = 1 << AL_RETX_INIT,
47    ALBIT_RETX_HSK  = 1 << AL_RETX_HSK,
48    ALBIT_RETX_APP  = 1 << AL_RETX_APP,
49    ALBIT_ACK_APP   = 1 << AL_ACK_APP,
50    ALBIT_ACK_INIT  = 1 << AL_ACK_INIT,
51    ALBIT_ACK_HSK   = 1 << AL_ACK_HSK,
52    ALBIT_PING      = 1 << AL_PING,
53    ALBIT_IDLE      = 1 << AL_IDLE,
54    ALBIT_RET_CIDS  = 1 << AL_RET_CIDS,
55    ALBIT_CID_THROT = 1 << AL_CID_THROT,
56    ALBIT_PATH_CHAL_0 = 1 << AL_PATH_CHAL_0,
57    ALBIT_PATH_CHAL_1 = 1 << AL_PATH_CHAL_1,
58    ALBIT_SESS_TICKET = 1 << AL_SESS_TICKET,
59    ALBIT_BLOCKED_KA  = 1 << AL_BLOCKED_KA,
60};
61
62
63typedef struct lsquic_alarmset {
64    enum alarm_id_bit           as_armed_set;
65    lsquic_time_t               as_expiry[MAX_LSQUIC_ALARMS];
66    const struct lsquic_conn   *as_conn;    /* Used for logging */
67    struct lsquic_alarm         as_alarms[MAX_LSQUIC_ALARMS];
68} lsquic_alarmset_t;
69
70
71void
72lsquic_alarmset_init (lsquic_alarmset_t *, const struct lsquic_conn *);
73
74void
75lsquic_alarmset_init_alarm (lsquic_alarmset_t *, enum alarm_id,
76                            lsquic_alarm_cb_f, void *cb_ctx);
77
78#define lsquic_alarmset_set(alarmset, al_id, exp) do {                  \
79    (alarmset)->as_armed_set |= 1 << (al_id);                           \
80    (alarmset)->as_expiry[al_id] = exp;                                 \
81} while (0)
82
83#define lsquic_alarmset_unset(alarmset, al_id) do {                     \
84    (alarmset)->as_armed_set &= ~(1 << (al_id));                        \
85} while (0)
86
87#define lsquic_alarmset_is_set(alarmset, al_id) \
88                            ((alarmset)->as_armed_set & (1 << (al_id)))
89
90#define lsquic_alarmset_are_set(alarmset, flags) \
91                            ((alarmset)->as_armed_set & (flags))
92
93/* Timers "fire," alarms "ring." */
94void
95lsquic_alarmset_ring_expired (lsquic_alarmset_t *, lsquic_time_t now);
96
97lsquic_time_t
98lsquic_alarmset_mintime (const lsquic_alarmset_t *, enum alarm_id *);
99
100extern const char *const lsquic_alid2str[];
101
102#endif
103