aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipaccess/Makefile.am2
-rw-r--r--src/osmo-bsc/Makefile.am2
-rw-r--r--src/osmo-bsc/abis_om2000.c7
-rw-r--r--src/osmo-bsc/abis_rsl.c4
-rw-r--r--src/osmo-bsc/assignment_fsm.c12
-rw-r--r--src/osmo-bsc/bsc_subscr_conn_fsm.c12
-rw-r--r--src/osmo-bsc/bsc_vty.c51
-rw-r--r--src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c3
-rw-r--r--src/osmo-bsc/bts_siemens_bs11.c5
-rw-r--r--src/osmo-bsc/gsm_data.c3
-rw-r--r--src/osmo-bsc/gsm_timers.c207
-rw-r--r--src/osmo-bsc/gsm_timers_vty.c118
-rw-r--r--src/osmo-bsc/handover_fsm.c10
-rw-r--r--src/osmo-bsc/lchan_fsm.c10
-rw-r--r--src/osmo-bsc/lchan_rtp_fsm.c11
-rw-r--r--src/osmo-bsc/mgw_endpoint_fsm.c9
-rw-r--r--src/osmo-bsc/net_init.c11
-rw-r--r--src/osmo-bsc/paging.c6
-rw-r--r--src/utils/Makefile.am2
19 files changed, 87 insertions, 398 deletions
diff --git a/src/ipaccess/Makefile.am b/src/ipaccess/Makefile.am
index 3578a40ff..145ea3989 100644
--- a/src/ipaccess/Makefile.am
+++ b/src/ipaccess/Makefile.am
@@ -50,7 +50,6 @@ ipaccess_config_LDADD = \
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
$(top_builddir)/src/osmo-bsc/gsm_data.o \
- $(top_builddir)/src/osmo-bsc/gsm_timers.o \
$(top_builddir)/src/osmo-bsc/net_init.o \
$(OSMO_LIBS) \
$(NULL)
@@ -62,6 +61,5 @@ ipaccess_proxy_SOURCES = \
$(NULL)
ipaccess_proxy_LDADD = \
- $(top_builddir)/src/osmo-bsc/gsm_timers.o \
$(OSMO_LIBS) \
$(NULL)
diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am
index 364228d8c..11803da4b 100644
--- a/src/osmo-bsc/Makefile.am
+++ b/src/osmo-bsc/Makefile.am
@@ -57,8 +57,6 @@ osmo_bsc_SOURCES = \
gsm_04_08_rr.c \
gsm_04_80_utils.c \
gsm_data.c \
- gsm_timers.c \
- gsm_timers_vty.c \
handover_cfg.c \
handover_decision.c \
handover_decision_2.c \
diff --git a/src/osmo-bsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c
index 9715dfc17..fda273de9 100644
--- a/src/osmo-bsc/abis_om2000.c
+++ b/src/osmo-bsc/abis_om2000.c
@@ -42,7 +42,6 @@
#include <osmocom/bsc/abis_rsl.h>
#include <osmocom/bsc/abis_om2000.h>
#include <osmocom/bsc/signal.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/timeslot_fsm.h>
#include <osmocom/abis/e1_input.h>
@@ -1381,7 +1380,7 @@ int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts)
break;
case GSM_PCHAN_CCCH_SDCCH4:
msgb_tv_put(msg, OM2K_DEI_T3105,
- T_def_get(ts->trx->bts->network->T_defs, 3105, T_MS, -1) / 10);
+ osmo_tdef_get(ts->trx->bts->network->T_defs, 3105, OSMO_TDEF_MS, -1) / 10);
msgb_tv_put(msg, OM2K_DEI_NY1, 35);
msgb_tv_put(msg, OM2K_DEI_BA_PA_MFRMS, 0x06);
msgb_tv_put(msg, OM2K_DEI_CBCH_INDICATOR, 0);
@@ -1396,7 +1395,7 @@ int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts)
break;
case GSM_PCHAN_SDCCH8_SACCH8C:
msgb_tv_put(msg, OM2K_DEI_T3105,
- T_def_get(ts->trx->bts->network->T_defs, 3105, T_MS, -1) / 10);
+ osmo_tdef_get(ts->trx->bts->network->T_defs, 3105, OSMO_TDEF_MS, -1) / 10);
msgb_tv_put(msg, OM2K_DEI_NY1, 35);
msgb_tv_put(msg, OM2K_DEI_CBCH_INDICATOR, 0);
msgb_tv_put(msg, OM2K_DEI_TSC, gsm_ts_tsc(ts));
@@ -1407,7 +1406,7 @@ int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts)
break;
default:
msgb_tv_put(msg, OM2K_DEI_T3105,
- T_def_get(ts->trx->bts->network->T_defs, 3105, T_MS, -1) / 10);
+ osmo_tdef_get(ts->trx->bts->network->T_defs, 3105, OSMO_TDEF_MS, -1) / 10);
msgb_tv_put(msg, OM2K_DEI_NY1, 35);
msgb_tv_put(msg, OM2K_DEI_TSC, gsm_ts_tsc(ts));
/* Disable RF RESOURCE INDICATION on idle channels */
diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c
index fd6dbdb78..0117435b6 100644
--- a/src/osmo-bsc/abis_rsl.c
+++ b/src/osmo-bsc/abis_rsl.c
@@ -45,7 +45,7 @@
#include <osmocom/bsc/pcu_if.h>
#include <osmocom/bsc/gsm_08_08.h>
#include <osmocom/netif/rtp.h>
-#include <osmocom/bsc/gsm_timers.h>
+#include <osmocom/core/tdef.h>
#include <osmocom/bsc/bsc_subscr_conn_fsm.h>
#include <osmocom/bsc/timeslot_fsm.h>
#include <osmocom/bsc/lchan_select.h>
@@ -1291,7 +1291,7 @@ int rsl_tx_imm_ass_rej(struct gsm_bts *bts, struct gsm48_req_ref *rqd_ref)
uint8_t wait_ind;
wait_ind = bts->T3122;
if (!wait_ind)
- wait_ind = T_def_get(bts->network->T_defs, 3122, T_S, -1);
+ wait_ind = osmo_tdef_get(bts->network->T_defs, 3122, OSMO_TDEF_S, -1);
if (!wait_ind)
wait_ind = GSM_T3122_DEFAULT;
/* The BTS will gather multiple CHAN RQD and reject up to 4 MS at the same time. */
diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c
index 9c0c40028..520498fe3 100644
--- a/src/osmo-bsc/assignment_fsm.c
+++ b/src/osmo-bsc/assignment_fsm.c
@@ -20,13 +20,13 @@
*
*/
+#include <osmocom/core/tdef.h>
#include <osmocom/gsm/gsm0808.h>
#include <osmocom/mgcp_client/mgcp_client_fsm.h>
#include <osmocom/bsc/debug.h>
#include <osmocom/bsc/gsm_data.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/lchan_fsm.h>
#include <osmocom/bsc/mgw_endpoint_fsm.h>
#include <osmocom/bsc/bsc_subscr_conn_fsm.h>
@@ -48,7 +48,7 @@ struct gsm_subscriber_connection *assignment_fi_conn(struct osmo_fsm_inst *fi)
return fi->priv;
}
-static const struct state_timeout assignment_fsm_timeouts[32] = {
+static const struct osmo_tdef_state_timeout assignment_fsm_timeouts[32] = {
[ASSIGNMENT_ST_WAIT_LCHAN_ACTIVE] = { .T=10 },
[ASSIGNMENT_ST_WAIT_RR_ASS_COMPLETE] = { .keep_timer=true },
[ASSIGNMENT_ST_WAIT_LCHAN_ESTABLISHED] = { .keep_timer=true },
@@ -59,10 +59,10 @@ static const struct state_timeout assignment_fsm_timeouts[32] = {
* The actual timeout value is in turn obtained from network->T_defs.
* Assumes local variable fi exists. */
#define assignment_fsm_state_chg(state) \
- fsm_inst_state_chg_T(fi, state, \
- assignment_fsm_timeouts, \
- ((struct gsm_subscriber_connection*)(fi->priv))->network->T_defs, \
- 5)
+ osmo_tdef_fsm_inst_state_chg(fi, state, \
+ assignment_fsm_timeouts, \
+ ((struct gsm_subscriber_connection*)(fi->priv))->network->T_defs, \
+ 5)
/* Log failure and transition to ASSIGNMENT_ST_FAILURE, which triggers the appropriate actions. */
#define assignment_fail(cause, fmt, args...) do { \
diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c
index 1cc0c78b4..4466404f3 100644
--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c
+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c
@@ -37,7 +37,7 @@
#include <osmocom/bsc/penalty_timers.h>
#include <osmocom/bsc/bsc_rll.h>
#include <osmocom/bsc/abis_rsl.h>
-#include <osmocom/bsc/gsm_timers.h>
+#include <osmocom/core/tdef.h>
#include <osmocom/bsc/gsm_04_08_rr.h>
#include <osmocom/bsc/mgw_endpoint_fsm.h>
#include <osmocom/bsc/assignment_fsm.h>
@@ -85,7 +85,7 @@ static const struct value_string gscon_fsm_event_names[] = {
{}
};
-struct state_timeout conn_fsm_timeouts[32] = {
+struct osmo_tdef_state_timeout conn_fsm_timeouts[32] = {
[ST_WAIT_CC] = { .T = 993210 },
[ST_CLEARING] = { .T = 999 },
};
@@ -94,10 +94,10 @@ struct state_timeout conn_fsm_timeouts[32] = {
* The actual timeout value is in turn obtained from network->T_defs.
* Assumes local variable 'conn' exists. */
#define conn_fsm_state_chg(state) \
- fsm_inst_state_chg_T(conn->fi, state, \
- conn_fsm_timeouts, \
- conn->network->T_defs, \
- -1)
+ osmo_tdef_fsm_inst_state_chg(conn->fi, state, \
+ conn_fsm_timeouts, \
+ conn->network->T_defs, \
+ -1)
/* forward MT DTAP from BSSAP side to RSL side */
static inline void submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg)
diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c
index 767d56596..3a6ddd42b 100644
--- a/src/osmo-bsc/bsc_vty.c
+++ b/src/osmo-bsc/bsc_vty.c
@@ -29,6 +29,7 @@
#include <osmocom/vty/stats.h>
#include <osmocom/vty/telnet_interface.h>
#include <osmocom/vty/misc.h>
+#include <osmocom/vty/tdef_vty.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/gsm/gsm0502.h>
#include <osmocom/ctrl/control_if.h>
@@ -66,11 +67,9 @@
#include <osmocom/bsc/meas_feed.h>
#include <osmocom/bsc/neighbor_ident.h>
#include <osmocom/bsc/handover.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/timeslot_fsm.h>
#include <osmocom/bsc/lchan_fsm.h>
#include <osmocom/bsc/lchan_select.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/mgw_endpoint_fsm.h>
#include <inttypes.h>
@@ -1046,7 +1045,7 @@ static int config_write_net(struct vty *vty)
ho_vty_write_net(vty, gsmnet);
- T_defs_vty_write(vty, " ");
+ osmo_tdef_vty_write(vty, gsmnet->T_defs, " ");
if (!gsmnet->dyn_ts_allow_tch_f)
vty_out(vty, " dyn_ts_allow_tch_f 0%s", VTY_NEWLINE);
@@ -1060,7 +1059,7 @@ static int config_write_net(struct vty *vty)
gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
}
- /* writing T3212 from the common T_defs_vty_write() instead. */
+ osmo_tdef_vty_write(vty, gsmnet->T_defs, " timer ");
{
uint16_t meas_port;
@@ -4005,10 +4004,11 @@ DEFUN(cfg_bts_t3113_dynamic, cfg_bts_t3113_dynamic_cmd,
"Calculate T3113 dynamically based on channel config and load\n"
TNUM_STR)
{
- struct T_def *d;
+ struct osmo_tdef *d;
struct gsm_bts *bts = vty->index;
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
- d = parse_T_arg(vty, argv[0]);
+ d = osmo_tdef_vty_parse_T_arg(vty, gsmnet->T_defs, argv[0]);
if (!d)
return CMD_WARNING;
@@ -4030,10 +4030,11 @@ DEFUN(cfg_bts_no_t3113_dynamic, cfg_bts_no_t3113_dynamic_cmd,
"Set given timer to non-dynamic and use the default or user provided fixed value\n"
TNUM_STR)
{
- struct T_def *d;
+ struct osmo_tdef *d;
struct gsm_bts *bts = vty->index;
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
- d = parse_T_arg(vty, argv[0]);
+ d = osmo_tdef_vty_parse_T_arg(vty, gsmnet->T_defs, argv[0]);
if (!d)
return CMD_WARNING;
@@ -5042,11 +5043,11 @@ DEFUN(cfg_net_per_loc_upd, cfg_net_per_loc_upd_cmd,
"Periodic Location Updating Interval in Minutes\n")
{
struct gsm_network *net = vty->index;
- struct T_def *d = T_def_get_entry(net->T_defs, 3212);
+ struct osmo_tdef *d = osmo_tdef_get_entry(net->T_defs, 3212);
OSMO_ASSERT(d);
d->val = atoi(argv[0]) / 6;
- vty_out(vty, "T%d = %u %s (%s)%s", d->T, d->val, "* 6min", d->desc, VTY_NEWLINE);
+ vty_out(vty, "T%d = %lu %s (%s)%s", d->T, d->val, "* 6min", d->desc, VTY_NEWLINE);
return CMD_SUCCESS;
}
@@ -5058,11 +5059,11 @@ DEFUN(cfg_net_no_per_loc_upd, cfg_net_no_per_loc_upd_cmd,
"Periodic Location Updating Interval\n")
{
struct gsm_network *net = vty->index;
- struct T_def *d = T_def_get_entry(net->T_defs, 3212);
+ struct osmo_tdef *d = osmo_tdef_get_entry(net->T_defs, 3212);
OSMO_ASSERT(d);
d->val = 0;
- vty_out(vty, "T%d = %u %s (%s)%s", d->T, d->val, "* 6min", d->desc, VTY_NEWLINE);
+ vty_out(vty, "T%d = %lu %s (%s)%s", d->T, d->val, "* 6min", d->desc, VTY_NEWLINE);
return CMD_SUCCESS;
}
@@ -5092,6 +5093,28 @@ DEFUN(cfg_net_meas_feed_scenario, cfg_net_meas_feed_scenario_cmd,
return CMD_SUCCESS;
}
+DEFUN(show_timer, show_timer_cmd,
+ "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
+ SHOW_STR "Show timers\n"
+ OSMO_TDEF_VTY_DOC_T)
+{
+ struct gsm_network *net = gsmnet_from_vty(vty);
+ const char *T_arg = argc > 0 ? argv[0] : NULL;
+ return osmo_tdef_vty_show_cmd(vty, net->T_defs, T_arg, NULL);
+}
+
+DEFUN(cfg_net_timer, cfg_net_timer_cmd,
+ "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
+ "Configure or show timers\n"
+ OSMO_TDEF_VTY_DOC_SET)
+{
+ struct gsm_network *net = gsmnet_from_vty(vty);
+ /* If any arguments are missing, redirect to 'show' */
+ if (argc < 2)
+ return show_timer(self, vty, argc, argv);
+ return osmo_tdef_vty_set_cmd(vty, net->T_defs, argv);
+}
+
extern int bsc_vty_init_extra(void);
int bsc_vty_init(struct gsm_network *network)
@@ -5136,6 +5159,7 @@ int bsc_vty_init(struct gsm_network *network)
install_element(GSMNET_NODE, &cfg_net_dyn_ts_allow_tch_f_cmd);
install_element(GSMNET_NODE, &cfg_net_meas_feed_dest_cmd);
install_element(GSMNET_NODE, &cfg_net_meas_feed_scenario_cmd);
+ install_element(GSMNET_NODE, &cfg_net_timer_cmd);
install_element_ve(&bsc_show_net_cmd);
install_element_ve(&show_bts_cmd);
@@ -5146,6 +5170,7 @@ int bsc_vty_init(struct gsm_network *network)
install_element_ve(&show_lchan_cmd);
install_element_ve(&show_lchan_summary_cmd);
install_element_ve(&show_lchan_summary_all_cmd);
+ install_element_ve(&show_timer_cmd);
install_element_ve(&show_subscr_conn_cmd);
@@ -5159,8 +5184,6 @@ int bsc_vty_init(struct gsm_network *network)
logging_vty_add_cmds(NULL);
osmo_talloc_vty_add_cmds();
- T_defs_vty_init(network->T_defs, GSMNET_NODE);
-
install_element(GSMNET_NODE, &cfg_net_neci_cmd);
install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
diff --git a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
index be4041067..8a370dafc 100644
--- a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
+++ b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
@@ -23,7 +23,6 @@
#include <osmocom/core/msgb.h>
#include <osmocom/bsc/gsm_data.h>
#include <osmocom/bsc/abis_nm.h>
-#include <osmocom/bsc/gsm_timers.h>
struct msgb *nanobts_attr_bts_get(struct gsm_bts *bts)
@@ -82,7 +81,7 @@ struct msgb *nanobts_attr_bts_get(struct gsm_bts *bts)
msgb_tv_fixed_put(msgb, NM_ATT_LDAVG_SLOTS, 2, buf);
/* 10 milliseconds */
- msgb_tv_put(msgb, NM_ATT_BTS_AIR_TIMER, T_def_get(bts->network->T_defs, 3105, T_MS, -1));
+ msgb_tv_put(msgb, NM_ATT_BTS_AIR_TIMER, osmo_tdef_get(bts->network->T_defs, 3105, OSMO_TDEF_MS, -1));
/* 10 retransmissions of physical config */
msgb_tv_put(msgb, NM_ATT_NY1, 10);
diff --git a/src/osmo-bsc/bts_siemens_bs11.c b/src/osmo-bsc/bts_siemens_bs11.c
index 2cb676c93..b1688f3d5 100644
--- a/src/osmo-bsc/bts_siemens_bs11.c
+++ b/src/osmo-bsc/bts_siemens_bs11.c
@@ -20,6 +20,8 @@
*/
+#include <osmocom/core/tdef.h>
+
#include <osmocom/gsm/tlv.h>
#include <osmocom/bsc/debug.h>
@@ -27,7 +29,6 @@
#include <osmocom/bsc/abis_nm.h>
#include <osmocom/abis/e1_input.h>
#include <osmocom/bsc/signal.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/timeslot_fsm.h>
static int bts_model_bs11_start(struct gsm_network *net);
@@ -360,7 +361,7 @@ static void patch_nm_tables(struct gsm_bts *bts)
uint8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
/* T3105 attribute in units of 10ms */
- bs11_attr_bts[2] = T_def_get(bts->network->T_defs, 3105, T_MS, -1) / 10;
+ bs11_attr_bts[2] = osmo_tdef_get(bts->network->T_defs, 3105, OSMO_TDEF_MS, -1) / 10;
/* patch ARFCN into BTS Attributes */
bs11_attr_bts[69] &= 0xf0;
diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c
index 45c433ced..88690a749 100644
--- a/src/osmo-bsc/gsm_data.c
+++ b/src/osmo-bsc/gsm_data.c
@@ -40,7 +40,6 @@
#include <osmocom/bsc/osmo_bsc_lcls.h>
#include <osmocom/bsc/abis_nm.h>
#include <osmocom/bsc/handover_cfg.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/timeslot_fsm.h>
#include <osmocom/bsc/lchan_fsm.h>
@@ -872,7 +871,7 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num)
bts->si_common.chan_desc.att = 1; /* attachment required */
bts->si_common.chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5; /* paging frames */
bts->si_common.chan_desc.bs_ag_blks_res = 1; /* reserved AGCH blocks */
- bts->si_common.chan_desc.t3212 = T_def_get(net->T_defs, 3212, T_CUSTOM, -1);
+ bts->si_common.chan_desc.t3212 = osmo_tdef_get(net->T_defs, 3212, OSMO_TDEF_CUSTOM, -1);
gsm_bts_set_radio_link_timeout(bts, 32); /* Use RADIO LINK TIMEOUT of 32 */
INIT_LLIST_HEAD(&bts->abis_queue);
diff --git a/src/osmo-bsc/gsm_timers.c b/src/osmo-bsc/gsm_timers.c
deleted file mode 100644
index fc3ec246e..000000000
--- a/src/osmo-bsc/gsm_timers.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Implementation to define Tnnn timers globally and use for FSM state changes. */
-/* (C) 2018 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
- *
- * Author: Neels Hofmeyr <neels@hofmeyr.de>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <osmocom/core/fsm.h>
-
-#include <osmocom/bsc/gsm_timers.h>
-
-/* a = return_val * b. Return 0 if factor is below 1. */
-static int T_factor(enum T_unit a, enum T_unit b)
-{
- if (b == a
- || b == T_CUSTOM || a == T_CUSTOM)
- return 1;
-
- switch (b) {
- case T_MS:
- switch (a) {
- case T_S:
- return 1000;
- case T_M:
- return 60*1000;
- default:
- return 0;
- }
- case T_S:
- switch (a) {
- case T_M:
- return 60;
- default:
- return 0;
- }
- default:
- return 0;
- }
-}
-
-static int T_round(int val, enum T_unit from_unit, enum T_unit to_unit)
-{
- int f;
- if (!val)
- return 0;
-
- f = T_factor(from_unit, to_unit);
- if (f < 1) {
- f = T_factor(to_unit, from_unit);
- return (val / f) + (val % f? 1 : 0);
- }
- return val * f;
-}
-
-/* Return the value of a T timer from a list of T_defs.
- * Any value is rounded up to match as_unit: 1100 ms as T_S becomes 2 seconds, as T_M becomes one minute.
- * If no such timer is defined, return the default value passed, or abort the program if default < 0.
- *
- * Usage examples:
- *
- * - Initialization:
- *
- * struct T_def global_T_defs[] = {
- * { .T=7, .default_val=50, .desc="Water Boiling Timeout" }, // default is .unit=T_S == 0
- * { .T=8, .default_val=300, .desc="Tea brewing" },
- * { .T=9, .default_val=5, .unit=T_M, .desc="Let tea cool down before drinking" },
- * { .T=10, .default_val=20, .unit=T_M, .desc="Forgot to drink tea while it's warm" },
- * {} // <-- important! last entry shall be zero
- * };
- * T_defs_reset(global_T_defs); // make all values the default
- * T_defs_vty_init(global_T_defs, CONFIG_NODE);
- *
- * val = T_def_get(global_T_defs, 7, T_S, -1); // -> 50
- * sleep(val);
- *
- * val = T_def_get(global_T_defs, 7, T_M, -1); // 50 seconds becomes 1 minute -> 1
- * sleep_minutes(val);
- *
- * val = T_def_get(global_T_defs, 99, T_S, -1); // not defined, program aborts!
- *
- * val = T_def_get(global_T_defs, 99, T_S, 3); // not defined, returns 3
- */
-int T_def_get(const struct T_def *T_defs, int T, enum T_unit as_unit, int val_if_not_present)
-{
- const struct T_def *d = T_def_get_entry((struct T_def*)T_defs, T);
- if (!d) {
- OSMO_ASSERT(val_if_not_present >= 0);
- return val_if_not_present;
- }
- return T_round(d->val, d->unit, as_unit);
-}
-
-/* Set all T_def values to the default_val. */
-void T_defs_reset(struct T_def *T_defs)
-{
- struct T_def *d;
- for_each_T_def(d, T_defs)
- d->val = d->default_val;
-}
-
-/* Return a pointer to a T_def from an array, or NULL. */
-struct T_def *T_def_get_entry(struct T_def *T_defs, int T)
-{
- struct T_def *d;
- for_each_T_def(d, T_defs) {
- if (d->T == T)
- return d;
- }
- return NULL;
-}
-
-/* Return a state_timeout entry from an array, or return NULL if the entry is zero.
- *
- * The timeouts_array shall contain exactly 32 elements, which corresponds to the number of states
- * allowed by osmo_fsm_*. Lookup is by array index.
- *
- * For example:
- * struct state_timeout my_fsm_timeouts[32] = {
- * [MY_FSM_STATE_3] = { .T = 423 },
- * [MY_FSM_STATE_7] = { .T = 235 },
- * [MY_FSM_STATE_8] = { .keep_timer = true },
- * // any state that is omitted will remain zero == no timeout
- * };
- * get_state_timeout(MY_FSM_STATE_0, &my_fsm_timeouts) -> NULL,
- * get_state_timeout(MY_FSM_STATE_7, &my_fsm_timeouts) -> { .T = 235 }
- *
- * The intention is then to obtain the timer like T_def_get(global_T_defs, T=235); see also
- * fsm_inst_state_chg_T() below.
- */
-const struct state_timeout *get_state_timeout(uint32_t state,
- const struct state_timeout *timeouts_array)
-{
- const struct state_timeout *t;
- OSMO_ASSERT(state < 32);
- t = &timeouts_array[state];
- if (!t->keep_timer && !t->T)
- return NULL;
- return t;
-}
-
-/* Call osmo_fsm_inst_state_chg() or osmo_fsm_inst_state_chg_keep_timer(), depending on the T value
- * defined for this state in the timeouts_array, and obtaining the actual timeout value from T_defs.
- * A T timer configured in sub-second precision is rounded up to the next full second.
- *
- * See get_state_timeout() and T_def_get().
- *
- * Should a T number be defined in timeouts_array that is not defined in T_defs, use default_timeout.
- * This is best used by wrapping this function call in a macro suitable for a specific FSM
- * implementation, which can become as short as: my_fsm_state_chg(fi, NEXT_STATE):
- *
- * #define my_fsm_state_chg(fi, NEXT_STATE) \
- * fsm_inst_state_chg_T(fi, NEXT_STATE, my_fsm_timeouts, global_T_defs, 5)
- *
- * my_fsm_state_chg(fi, MY_FSM_STATE_1);
- * // -> No timeout configured, will enter state without timeout.
- *
- * my_fsm_state_chg(fi, MY_FSM_STATE_3);
- * // T423 configured for this state, will look up T423 in T_defs, or use 5 seconds if unset.
- *
- * my_fsm_state_chg(fi, MY_FSM_STATE_8);
- * // keep_timer configured for this state, will invoke osmo_fsm_inst_state_chg_keep_timer().
- *
- */
-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)
-{
- const struct state_timeout *t = get_state_timeout(state, timeouts_array);
- int val;
-
- /* No timeout defined for this state? */
- if (!t)
- return _osmo_fsm_inst_state_chg(fi, state, 0, 0, file, line);
-
- if (t->keep_timer) {
- int rc = _osmo_fsm_inst_state_chg_keep_timer(fi, state, file, line);
- if (t->T && !rc)
- fi->T = t->T;
- return rc;
- }
-
- val = T_def_get(T_defs, t->T, T_S, default_timeout);
- return _osmo_fsm_inst_state_chg(fi, state, val, t->T, file, line);
-}
-
-const struct value_string T_unit_names[] = {
- { T_S, "s" },
- { T_MS, "ms" },
- { T_CUSTOM, "(custom)" },
- { 0, NULL }
-};
diff --git a/src/osmo-bsc/gsm_timers_vty.c b/src/osmo-bsc/gsm_timers_vty.c
deleted file mode 100644
index e744dfac5..000000000
--- a/src/osmo-bsc/gsm_timers_vty.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Implementation to configure Tnnn timers in VTY */
-/* (C) 2018 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
- *
- * Author: Neels Hofmeyr <neels@hofmeyr.de>
- *
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <string.h>
-
-#include <osmocom/vty/vty.h>
-#include <osmocom/vty/command.h>
-
-#include <osmocom/bsc/gsm_timers.h>
-
-/* Global singleton list used for the VTY configuration. See T_defs_vty_init(). */
-static struct T_def *g_vty_T_defs = NULL;
-
-/* Parse an argument like "T1234", "t1234" or "1234" and return the corresponding T_def entry from
- * g_vty_T_defs, if any. */
-struct T_def *parse_T_arg(struct vty *vty, const char *T_str)
-{
- int T;
- struct T_def *d;
-
- if (T_str[0] == 't' || T_str[0] == 'T')
- T_str++;
- T = atoi(T_str);
-
- d = T_def_get_entry(g_vty_T_defs, T);
- if (!d)
- vty_out(vty, "No such timer: T%d%s", T, VTY_NEWLINE);
- return d;
-}
-
-/* Installed in the VTY on T_defs_vty_init(). */
-DEFUN(cfg_timer, cfg_timer_cmd,
- "timer TNNNN (default|<1-65535>)",
- "Configure GSM Timers\n"
- "T-number, optionally preceded by 't' or 'T'."
- "See also 'show timer' for a list of available timers.\n"
- "Set to default timer value\n" "Timer value\n")
-{
- const char *val_str = argv[1];
- struct T_def *d;
-
- d = parse_T_arg(vty, argv[0]);
- if (!d)
- return CMD_WARNING;
-
- if (!strcmp(val_str, "default"))
- d->val = d->default_val;
- else
- d->val = atoi(val_str);
- vty_out(vty, "T%d = %u %s (%s)%s", d->T, d->val, T_unit_name(d->unit), d->desc, VTY_NEWLINE);
- return CMD_SUCCESS;
-}
-
-/* Print a T_def to the VTY. */
-static void show_one_timer(struct vty *vty, struct T_def *d)
-{
- vty_out(vty, "T%d = %u %s (default = %u %s) \t%s%s",
- d->T, d->val, T_unit_name(d->unit),
- d->default_val, T_unit_name(d->unit), d->desc, VTY_NEWLINE);
-}
-
-/* Installed in the VTY on T_defs_vty_init(). */
-DEFUN(show_timer, show_timer_cmd,
- "show timer [TNNNN]",
- SHOW_STR "GSM Timers\n"
- "Specific timer to show, or all timers if omitted.\n")
-{
- struct T_def *d;
-
- if (argc) {
- d = parse_T_arg(vty, argv[0]);
- if (!d)
- return CMD_WARNING;
- show_one_timer(vty, d);
- return CMD_SUCCESS;
- }
-
- for_each_T_def(d, g_vty_T_defs)
- show_one_timer(vty, d);
- return CMD_SUCCESS;
-}
-
-/* Install GSM timer configuration commands in the VTY. */
-void T_defs_vty_init(struct T_def *T_defs, int cfg_parent_node)
-{
- g_vty_T_defs = T_defs;
- install_element_ve(&show_timer_cmd);
- install_element(cfg_parent_node, &cfg_timer_cmd);
-}
-
-/* Write GSM timer configuration to the vty. */
-void T_defs_vty_write(struct vty *vty, const char *indent)
-{
- struct T_def *d;
- for_each_T_def(d, g_vty_T_defs) {
- if (d->val != d->default_val)
- vty_out(vty, "%stimer t%d %u%s", indent, d->T, d->val, VTY_NEWLINE);
- }
-}
diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c
index 421c32efb..fe3b8b2db 100644
--- a/src/osmo-bsc/handover_fsm.c
+++ b/src/osmo-bsc/handover_fsm.c
@@ -159,7 +159,7 @@ struct gsm_subscriber_connection *ho_fi_conn(struct osmo_fsm_inst *fi)
return fi->priv;
}
-static const struct state_timeout ho_fsm_timeouts[32] = {
+static const struct osmo_tdef_state_timeout ho_fsm_timeouts[32] = {
[HO_ST_WAIT_LCHAN_ACTIVE] = { .T = 23042 },
[HO_ST_WAIT_RR_HO_DETECT] = { .T = 23042 },
[HO_ST_WAIT_RR_HO_COMPLETE] = { .T = 23042 },
@@ -173,10 +173,10 @@ static const struct state_timeout ho_fsm_timeouts[32] = {
* The actual timeout value is in turn obtained from network->T_defs.
* Assumes local variable fi exists. */
#define ho_fsm_state_chg(state) \
- fsm_inst_state_chg_T(fi, state, \
- ho_fsm_timeouts, \
- ((struct gsm_subscriber_connection*)(fi->priv))->network->T_defs, \
- 5)
+ osmo_tdef_fsm_inst_state_chg(fi, state, \
+ ho_fsm_timeouts, \
+ ((struct gsm_subscriber_connection*)(fi->priv))->network->T_defs, \
+ 5)
/* Log failure and transition to HO_ST_FAILURE, which triggers the appropriate actions. */
#define ho_fail(result, fmt, args...) do { \
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c
index 7af2ea01c..33abb1fe5 100644
--- a/src/osmo-bsc/lchan_fsm.c
+++ b/src/osmo-bsc/lchan_fsm.c
@@ -207,7 +207,7 @@ static void lchan_on_fully_established(struct gsm_lchan *lchan)
}
}
-struct state_timeout lchan_fsm_timeouts[32] = {
+struct osmo_tdef_state_timeout lchan_fsm_timeouts[32] = {
[LCHAN_ST_WAIT_TS_READY] = { .T=23001 },
[LCHAN_ST_WAIT_ACTIV_ACK] = { .T=23002 },
[LCHAN_ST_WAIT_RLL_RTP_ESTABLISH] = { .T=3101 },
@@ -221,10 +221,10 @@ struct state_timeout lchan_fsm_timeouts[32] = {
* The actual timeout value is in turn obtained from network->T_defs.
* Assumes local variable fi exists. */
#define lchan_fsm_state_chg(state) \
- fsm_inst_state_chg_T(fi, state, \
- lchan_fsm_timeouts, \
- ((struct gsm_lchan*)(fi->priv))->ts->trx->bts->network->T_defs, \
- 5)
+ osmo_tdef_fsm_inst_state_chg(fi, state, \
+ lchan_fsm_timeouts, \
+ ((struct gsm_lchan*)(fi->priv))->ts->trx->bts->network->T_defs, \
+ 5)
/* Set a failure message, trigger the common actions to take on failure, transition to a state to
* continue with (using state timeouts from lchan_fsm_timeouts[]). Assumes local variable fi exists. */
diff --git a/src/osmo-bsc/lchan_rtp_fsm.c b/src/osmo-bsc/lchan_rtp_fsm.c
index 2d15bf29b..5e2d75891 100644
--- a/src/osmo-bsc/lchan_rtp_fsm.c
+++ b/src/osmo-bsc/lchan_rtp_fsm.c
@@ -23,7 +23,6 @@
#include <osmocom/core/fsm.h>
#include <osmocom/bsc/gsm_data.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/lchan_fsm.h>
#include <osmocom/bsc/lchan_rtp_fsm.h>
#include <osmocom/bsc/mgw_endpoint_fsm.h>
@@ -41,7 +40,7 @@ struct gsm_lchan *lchan_rtp_fi_lchan(struct osmo_fsm_inst *fi)
return fi->priv;
}
-struct state_timeout lchan_rtp_fsm_timeouts[32] = {
+struct osmo_tdef_state_timeout lchan_rtp_fsm_timeouts[32] = {
[LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_AVAILABLE] = { .T=23004 },
[LCHAN_RTP_ST_WAIT_IPACC_CRCX_ACK] = { .T=23005 },
[LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK] = { .T=23006 },
@@ -52,10 +51,10 @@ struct state_timeout lchan_rtp_fsm_timeouts[32] = {
* The actual timeout value is in turn obtained from network->T_defs.
* Assumes local variable fi exists. */
#define lchan_rtp_fsm_state_chg(state) \
- fsm_inst_state_chg_T(fi, state, \
- lchan_rtp_fsm_timeouts, \
- ((struct gsm_lchan*)(fi->priv))->ts->trx->bts->network->T_defs, \
- 5)
+ osmo_tdef_fsm_inst_state_chg(fi, state, \
+ lchan_rtp_fsm_timeouts, \
+ ((struct gsm_lchan*)(fi->priv))->ts->trx->bts->network->T_defs, \
+ 5)
/* Set a failure message, trigger the common actions to take on failure, transition to a state to
* continue with (using state timeouts from lchan_rtp_fsm_timeouts[]). Assumes local variable fi exists. */
diff --git a/src/osmo-bsc/mgw_endpoint_fsm.c b/src/osmo-bsc/mgw_endpoint_fsm.c
index 5462914fb..fa65166b7 100644
--- a/src/osmo-bsc/mgw_endpoint_fsm.c
+++ b/src/osmo-bsc/mgw_endpoint_fsm.c
@@ -29,7 +29,6 @@
#include <osmocom/netif/rtp.h>
#include <osmocom/bsc/debug.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/mgw_endpoint_fsm.h>
#include <osmocom/bsc/lchan_fsm.h>
@@ -196,9 +195,9 @@ static void fill_event_names()
}
}
-static struct T_def *g_T_defs = NULL;
+static struct osmo_tdef *g_T_defs = NULL;
-void mgw_endpoint_fsm_init(struct T_def *T_defs)
+void mgw_endpoint_fsm_init(struct osmo_tdef *T_defs)
{
g_T_defs = T_defs;
OSMO_ASSERT(osmo_fsm_register(&mgwep_fsm) == 0);
@@ -380,7 +379,7 @@ bool mgwep_ci_get_crcx_info_to_sockaddr(const struct mgwep_ci *ci, struct sockad
}
-static const struct state_timeout mgwep_fsm_timeouts[32] = {
+static const struct osmo_tdef_state_timeout mgwep_fsm_timeouts[32] = {
[MGWEP_ST_WAIT_MGW_RESPONSE] = { .T=23042 },
};
@@ -388,7 +387,7 @@ static const struct state_timeout mgwep_fsm_timeouts[32] = {
* The actual timeout value is in turn obtained from g_T_defs.
* Assumes local variable fi exists. */
#define mgwep_fsm_state_chg(state) \
- fsm_inst_state_chg_T(fi, state, mgwep_fsm_timeouts, g_T_defs, 5)
+ osmo_tdef_fsm_inst_state_chg(fi, state, mgwep_fsm_timeouts, g_T_defs, 5)
void mgw_endpoint_ci_request(struct mgwep_ci *ci,
enum mgcp_verb verb, const struct mgcp_conn_peer *verb_info,
diff --git a/src/osmo-bsc/net_init.c b/src/osmo-bsc/net_init.c
index b4ff48936..c2a38bcf1 100644
--- a/src/osmo-bsc/net_init.c
+++ b/src/osmo-bsc/net_init.c
@@ -17,21 +17,22 @@
*
*/
+#include <osmocom/core/tdef.h>
+
#include <osmocom/bsc/osmo_bsc.h>
#include <osmocom/bsc/gsm_04_08_rr.h>
#include <osmocom/bsc/handover_cfg.h>
#include <osmocom/bsc/chan_alloc.h>
#include <osmocom/bsc/neighbor_ident.h>
-#include <osmocom/bsc/gsm_timers.h>
-static struct T_def gsm_network_T_defs[] = {
+static struct osmo_tdef gsm_network_T_defs[] = {
{ .T=7, .default_val=10, .desc="inter-BSC Handover MO, HO Required to HO Command" },
{ .T=8, .default_val=10, .desc="inter-BSC Handover MO, HO Command to final Clear" },
{ .T=10, .default_val=6, .desc="RR Assignment" },
{ .T=101, .default_val=10, .desc="inter-BSC Handover MT, HO Request to HO Accept" },
{ .T=3101, .default_val=3, .desc="RR Immediate Assignment" },
{ .T=3103, .default_val=5, .desc="Handover" },
- { .T=3105, .default_val=100, .unit=T_MS, .desc="Physical Information" },
+ { .T=3105, .default_val=100, .unit=OSMO_TDEF_MS, .desc="Physical Information" },
{ .T=3107, .default_val=5, .desc="(unused)" },
{ .T=3109, .default_val=5, .desc="RSL SACCH deactivation" },
{ .T=3111, .default_val=2, .desc="Wait time before RSL RF Channel Release" },
@@ -42,7 +43,7 @@ static struct T_def gsm_network_T_defs[] = {
{ .T=3119, .default_val=10, .desc="(unused)" },
{ .T=3122, .default_val=GSM_T3122_DEFAULT, .desc="Wait time after RR Immediate Assignment Reject" },
{ .T=3141, .default_val=10, .desc="(unused)" },
- { .T=3212, .default_val=5, .unit=T_CUSTOM,
+ { .T=3212, .default_val=5, .unit=OSMO_TDEF_CUSTOM,
.desc="Periodic Location Update timer, sent to MS (1 = 6 minutes)" },
{ .T=993210, .default_val=20, .desc="After L3 Complete, wait for MSC to confirm" },
{ .T=999, .default_val=60, .desc="After Clear Request, wait for MSC to Clear Command (sanity)" },
@@ -78,7 +79,7 @@ struct gsm_network *gsm_network_init(void *ctx)
net->num_bts = 0;
net->T_defs = gsm_network_T_defs;
- T_defs_reset(net->T_defs);
+ osmo_tdefs_reset(net->T_defs);
return net;
}
diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c
index 066db1c62..f1fd2ad61 100644
--- a/src/osmo-bsc/paging.c
+++ b/src/osmo-bsc/paging.c
@@ -39,6 +39,7 @@
#include <assert.h>
#include <osmocom/core/talloc.h>
+#include <osmocom/core/tdef.h>
#include <osmocom/gsm/gsm48.h>
#include <osmocom/gsm/gsm0502.h>
@@ -51,7 +52,6 @@
#include <osmocom/bsc/chan_alloc.h>
#include <osmocom/bsc/gsm_08_08.h>
#include <osmocom/bsc/gsm_04_08_rr.h>
-#include <osmocom/bsc/gsm_timers.h>
#include <osmocom/bsc/bsc_subscr_conn_fsm.h>
void *tall_paging_ctx = NULL;
@@ -294,11 +294,11 @@ static void paging_T3113_expired(void *data)
static unsigned int calculate_timer_3113(struct gsm_bts *bts)
{
unsigned int to_us, to;
- struct T_def *d = T_def_get_entry(bts->network->T_defs, 3113);
+ struct osmo_tdef *d = osmo_tdef_get_entry(bts->network->T_defs, 3113);
/* Note: d should always contain a valid pointer since all timers,
* including 3113 are statically pre-defined in
- * struct T_def gsm_network_T_defs. */
+ * struct osmo_tdef gsm_network_T_defs. */
OSMO_ASSERT(d);
if (!bts->T3113_dynamic)
diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am
index 24cd23085..e585e0df8 100644
--- a/src/utils/Makefile.am
+++ b/src/utils/Makefile.am
@@ -51,7 +51,6 @@ bs11_config_LDADD = \
$(top_builddir)/src/osmo-bsc/bts_siemens_bs11.o \
$(top_builddir)/src/osmo-bsc/e1_config.o \
$(top_builddir)/src/osmo-bsc/gsm_data.o \
- $(top_builddir)/src/osmo-bsc/gsm_timers.o \
$(top_builddir)/src/osmo-bsc/net_init.o \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOGSM_LIBS) \
@@ -119,7 +118,6 @@ meas_json_SOURCES = \
meas_json_LDADD = \
$(top_builddir)/src/osmo-bsc/gsm_data.o \
- $(top_builddir)/src/osmo-bsc/gsm_timers.o \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOGSM_LIBS) \
$(LIBOSMOABIS_LIBS) \