Neels Hofmeyr | 596c402 | 2018-06-16 19:29:50 +0200 | [diff] [blame^] | 1 | /* API to define Tnnn timers globally, configure in VTY and use for FSM state changes. */ |
| 2 | #pragma once |
| 3 | |
| 4 | #include <stdint.h> |
| 5 | #include <osmocom/core/utils.h> |
| 6 | |
| 7 | struct osmo_fsm_inst; |
| 8 | struct vty; |
| 9 | |
| 10 | enum T_unit { |
| 11 | T_S = 0, /*< most T are in seconds, keep 0 as default. */ |
| 12 | T_MS, /*< milliseconds */ |
| 13 | T_M, /*< minutes */ |
| 14 | T_CUSTOM, |
| 15 | }; |
| 16 | |
| 17 | extern const struct value_string T_unit_names[]; |
| 18 | static inline const char *T_unit_name(enum T_unit val) |
| 19 | { return get_value_string(T_unit_names, val); } |
| 20 | |
| 21 | /* Define a GSM timer of the form Tnnn, with unit, default value and doc string. */ |
| 22 | struct T_def { |
| 23 | const int T; /*< T1234 number */ |
| 24 | const int default_val; /*< timeout duration (according to unit), default value. */ |
| 25 | const enum T_unit unit; |
| 26 | const char *desc; |
| 27 | int val; /*< currently active value, e.g. set by user config. */ |
| 28 | }; |
| 29 | |
| 30 | /* Iterate an array of struct T_def, the last item should be fully zero, i.e. "{}" */ |
| 31 | #define for_each_T_def(d, T_defs) \ |
| 32 | for (d = T_defs; d && (d->T || d->default_val || d->desc); d++) |
| 33 | |
| 34 | int T_def_get(struct T_def *T_defs, int T, enum T_unit as_unit, int val_if_not_present); |
| 35 | void T_defs_reset(struct T_def *T_defs); |
| 36 | struct T_def *T_def_get_entry(struct T_def *T_defs, int T); |
| 37 | |
| 38 | void T_defs_vty_init(struct T_def *T_defs, int cfg_parent_node); |
| 39 | void T_defs_vty_write(struct vty *vty, const char *indent); |
| 40 | |
| 41 | |
| 42 | struct state_timeout { |
| 43 | int T; |
| 44 | bool keep_timer; |
| 45 | }; |
| 46 | |
| 47 | struct state_timeout *get_state_timeout(uint32_t state, struct state_timeout *timeouts_array); |
| 48 | |
| 49 | #define fsm_inst_state_chg_T(fi, state, timeouts_array, T_defs, default_timeout) \ |
| 50 | _fsm_inst_state_chg_T(fi, state, timeouts_array, T_defs, default_timeout, \ |
| 51 | __FILE__, __LINE__) |
| 52 | int _fsm_inst_state_chg_T(struct osmo_fsm_inst *fi, uint32_t state, |
| 53 | struct state_timeout *timeouts_array, |
| 54 | struct T_def *T_defs, int default_timeout, |
| 55 | const char *file, int line); |