110 lines
3.2 KiB
C
110 lines
3.2 KiB
C
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
|
|
/*
|
|
* lsquic_alarmset.h -- A set of alarms
|
|
*/
|
|
|
|
#ifndef LSQUIC_ALARM_H
|
|
#define LSQUIC_ALARM_H 1
|
|
|
|
#include "lsquic_int_types.h"
|
|
|
|
enum alarm_id;
|
|
struct lsquic_conn;
|
|
|
|
typedef void (*lsquic_alarm_cb_f)(enum alarm_id, void *cb_ctx,
|
|
lsquic_time_t expiry, lsquic_time_t now);
|
|
|
|
typedef struct lsquic_alarm {
|
|
lsquic_alarm_cb_f callback;
|
|
void *cb_ctx;
|
|
} lsquic_alarm_t;
|
|
|
|
|
|
enum alarm_id {
|
|
AL_HANDSHAKE,
|
|
AL_RETX_INIT,
|
|
AL_RETX_HSK = AL_RETX_INIT + PNS_HSK,
|
|
AL_RETX_APP = AL_RETX_INIT + PNS_APP,
|
|
AL_PING,
|
|
AL_MTU_PROBE,
|
|
AL_IDLE,
|
|
AL_ACK_APP,
|
|
AL_RET_CIDS,
|
|
AL_CID_THROT,
|
|
AL_PATH_CHAL,
|
|
AL_PATH_CHAL_0 = AL_PATH_CHAL,
|
|
AL_PATH_CHAL_1,
|
|
AL_PATH_CHAL_2,
|
|
AL_PATH_CHAL_3,
|
|
AL_SESS_TICKET,
|
|
AL_BLOCKED_KA, /* Blocked Keep-Alive */
|
|
AL_PACK_TOL, /* Calculate packet tolerance */
|
|
MAX_LSQUIC_ALARMS
|
|
};
|
|
|
|
|
|
enum alarm_id_bit {
|
|
ALBIT_HANDSHAKE = 1 << AL_HANDSHAKE,
|
|
ALBIT_RETX_INIT = 1 << AL_RETX_INIT,
|
|
ALBIT_RETX_HSK = 1 << AL_RETX_HSK,
|
|
ALBIT_RETX_APP = 1 << AL_RETX_APP,
|
|
ALBIT_ACK_APP = 1 << AL_ACK_APP,
|
|
ALBIT_PING = 1 << AL_PING,
|
|
ALBIT_IDLE = 1 << AL_IDLE,
|
|
ALBIT_RET_CIDS = 1 << AL_RET_CIDS,
|
|
ALBIT_CID_THROT = 1 << AL_CID_THROT,
|
|
ALBIT_PATH_CHAL_0 = 1 << AL_PATH_CHAL_0,
|
|
ALBIT_PATH_CHAL_1 = 1 << AL_PATH_CHAL_1,
|
|
ALBIT_PATH_CHAL_2 = 1 << AL_PATH_CHAL_2,
|
|
ALBIT_PATH_CHAL_3 = 1 << AL_PATH_CHAL_3,
|
|
ALBIT_SESS_TICKET = 1 << AL_SESS_TICKET,
|
|
ALBIT_BLOCKED_KA = 1 << AL_BLOCKED_KA,
|
|
ALBIT_MTU_PROBE = 1 << AL_MTU_PROBE,
|
|
ALBIT_PACK_TOL = 1 << AL_PACK_TOL,
|
|
};
|
|
|
|
|
|
typedef struct lsquic_alarmset {
|
|
enum alarm_id_bit as_armed_set;
|
|
lsquic_time_t as_expiry[MAX_LSQUIC_ALARMS];
|
|
const struct lsquic_conn *as_conn; /* Used for logging */
|
|
struct lsquic_alarm as_alarms[MAX_LSQUIC_ALARMS];
|
|
} lsquic_alarmset_t;
|
|
|
|
|
|
void
|
|
lsquic_alarmset_init (lsquic_alarmset_t *, const struct lsquic_conn *);
|
|
|
|
void
|
|
lsquic_alarmset_init_alarm (lsquic_alarmset_t *, enum alarm_id,
|
|
lsquic_alarm_cb_f, void *cb_ctx);
|
|
|
|
#define lsquic_alarmset_set(alarmset, al_id, exp) do { \
|
|
(alarmset)->as_armed_set |= 1 << (al_id); \
|
|
(alarmset)->as_expiry[al_id] = exp; \
|
|
} while (0)
|
|
|
|
#define lsquic_alarmset_unset(alarmset, al_id) do { \
|
|
(alarmset)->as_armed_set &= ~(1 << (al_id)); \
|
|
} while (0)
|
|
|
|
#define lsquic_alarmset_is_set(alarmset, al_id) \
|
|
((alarmset)->as_armed_set & (1 << (al_id)))
|
|
|
|
#define lsquic_alarmset_are_set(alarmset, flags) \
|
|
((alarmset)->as_armed_set & (flags))
|
|
|
|
#define lsquic_alarmset_is_inited(alarmset_, al_id_) ( \
|
|
(alarmset_)->as_alarms[al_id_].callback)
|
|
|
|
/* Timers "fire," alarms "ring." */
|
|
void
|
|
lsquic_alarmset_ring_expired (lsquic_alarmset_t *, lsquic_time_t now);
|
|
|
|
lsquic_time_t
|
|
lsquic_alarmset_mintime (const lsquic_alarmset_t *, enum alarm_id *);
|
|
|
|
extern const char *const lsquic_alid2str[];
|
|
|
|
#endif
|