aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-08-24 14:45:44 +0200
committerHarald Welte <laforge@gnumonks.org>2016-08-27 02:23:47 +0000
commitcd150a8f7473347b17728d0797bc6464441dde9a (patch)
treeb3d435ccb552f2593a402744a5843045a48f580e
parent2ae305de46547c2c8424ab14d01f03bb4780ff39 (diff)
dyn TS: fix error recovery: switch to PDCH after lchan error state
Tested by hacking a CHAN ACT ACK delay of a couple of seconds into osmo-bts' rsl.c for the first TCH_H lchan: [[[ diff --git a/src/common/rsl.c b/src/common/rsl.c index 3c97af9..4bfd27a 100644 --- a/src/common/rsl.c +++ b/src/common/rsl.c @@ -559,6 +559,22 @@ static int rsl_tx_chan_act_ack(struct gsm_lchan *lchan) return abis_bts_rsl_sendmsg(msg); } +struct osmo_timer_list xxx_timer; + +static void xxx_timer_cb(void *data) +{ + rsl_tx_chan_act_ack(data); +} + +static int rsl_tx_chan_act_ack_later(struct gsm_lchan *lchan) +{ + xxx_timer.cb = xxx_timer_cb; + xxx_timer.data = lchan; + osmo_timer_schedule(&xxx_timer, 10, 0); + return 0; +} + + /* 8.4.7 sending HANDOver DETection */ int rsl_tx_hando_det(struct gsm_lchan *lchan, uint8_t *ho_delay) { @@ -614,6 +630,18 @@ int rsl_tx_chan_act_acknack(struct gsm_lchan *lchan, uint8_t cause) if (cause) return rsl_tx_chan_act_nack(lchan, cause); + + static int xxx = 0; + + DEBUGP(DRSL, "%s XXXXXXXXXXXXXXXXXXXXX %d %s\n", + gsm_lchan_name(lchan), xxx, gsm_lchant_name(lchan->type)); + + if (lchan->type == GSM_LCHAN_TCH_H) { + if (!xxx) { + xxx ++; + return rsl_tx_chan_act_ack_later(lchan); + } + } return rsl_tx_chan_act_ack(lchan); } ]]] Change-Id: Ie82dec9c9fefc476fdf5b5afdad2246b9d6fe304
-rw-r--r--openbsc/src/libbsc/abis_rsl.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index 2752c0da1..d04b70739 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -772,6 +772,9 @@ static void error_timeout_cb(void *data)
if (lchan->ts->pchan == GSM_PCHAN_TCH_F_PDCH
&& lchan->ts->trx->bts->gprs.mode != BTS_GPRS_NONE)
rsl_ipacc_pdch_activate(lchan->ts, 1);
+
+ if (dyn_ts_should_switch_to_pdch(lchan->ts))
+ dyn_ts_switchover_start(lchan, GSM_PCHAN_PDCH);
}
static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan);