| /* API to define Tnnn timers globally, configure in VTY and use for FSM state changes. */ |
| #pragma once |
| |
| #include <stdint.h> |
| #include <osmocom/core/utils.h> |
| |
| struct osmo_fsm_inst; |
| struct vty; |
| |
| enum T_unit { |
| T_S = 0, /*< most T are in seconds, keep 0 as default. */ |
| T_MS, /*< milliseconds */ |
| T_M, /*< minutes */ |
| T_CUSTOM, |
| }; |
| |
| extern const struct value_string T_unit_names[]; |
| static inline const char *T_unit_name(enum T_unit val) |
| { return get_value_string(T_unit_names, val); } |
| |
| /* Define a GSM timer of the form Tnnn, with unit, default value and doc string. */ |
| struct T_def { |
| const int T; /*< T1234 number */ |
| const int default_val; /*< timeout duration (according to unit), default value. */ |
| const enum T_unit unit; |
| const char *desc; |
| int val; /*< currently active value, e.g. set by user config. */ |
| }; |
| |
| /* Iterate an array of struct T_def, the last item should be fully zero, i.e. "{}" */ |
| #define for_each_T_def(d, T_defs) \ |
| for (d = T_defs; d && (d->T || d->default_val || d->desc); d++) |
| |
| int T_def_get(const struct T_def *T_defs, int T, enum T_unit as_unit, int val_if_not_present); |
| void T_defs_reset(struct T_def *T_defs); |
| struct T_def *T_def_get_entry(struct T_def *T_defs, int T); |
| |
| void T_defs_vty_init(struct T_def *T_defs, int cfg_parent_node); |
| void T_defs_vty_write(struct vty *vty, const char *indent); |
| |
| |
| struct state_timeout { |
| int T; |
| bool keep_timer; |
| }; |
| |
| const struct state_timeout *get_state_timeout(uint32_t state, |
| const struct state_timeout *timeouts_array); |
| |
| #define fsm_inst_state_chg_T(fi, state, timeouts_array, T_defs, default_timeout) \ |
| _fsm_inst_state_chg_T(fi, state, timeouts_array, T_defs, default_timeout, \ |
| __FILE__, __LINE__) |
| int _fsm_inst_state_chg_T(struct osmo_fsm_inst *fi, uint32_t state, |
| const struct state_timeout *timeouts_array, |
| const struct T_def *T_defs, int default_timeout, |
| const char *file, int line); |