blob: 699c461add6d669393e54e28eabd974ab9488623 [file] [log] [blame]
Neels Hofmeyr596c4022018-06-16 19:29:50 +02001/* 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
7struct osmo_fsm_inst;
8struct vty;
9
10enum 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
17extern const struct value_string T_unit_names[];
18static 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. */
22struct 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
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020034int T_def_get(const struct T_def *T_defs, int T, enum T_unit as_unit, int val_if_not_present);
Neels Hofmeyr596c4022018-06-16 19:29:50 +020035void T_defs_reset(struct T_def *T_defs);
36struct T_def *T_def_get_entry(struct T_def *T_defs, int T);
37
38void T_defs_vty_init(struct T_def *T_defs, int cfg_parent_node);
39void T_defs_vty_write(struct vty *vty, const char *indent);
Pau Espin Pedrol1b963342018-11-07 14:19:32 +010040struct T_def *parse_T_arg(struct vty *vty, const char *T_str);
Neels Hofmeyr596c4022018-06-16 19:29:50 +020041
42struct state_timeout {
43 int T;
44 bool keep_timer;
45};
46
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020047const struct state_timeout *get_state_timeout(uint32_t state,
48 const struct state_timeout *timeouts_array);
Neels Hofmeyr596c4022018-06-16 19:29:50 +020049
50#define fsm_inst_state_chg_T(fi, state, timeouts_array, T_defs, default_timeout) \
51 _fsm_inst_state_chg_T(fi, state, timeouts_array, T_defs, default_timeout, \
52 __FILE__, __LINE__)
53int _fsm_inst_state_chg_T(struct osmo_fsm_inst *fi, uint32_t state,
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020054 const struct state_timeout *timeouts_array,
55 const struct T_def *T_defs, int default_timeout,
Neels Hofmeyr596c4022018-06-16 19:29:50 +020056 const char *file, int line);