aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-05-04 22:47:45 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2018-05-05 01:50:49 +0200
commita82c0b1c42796368355e3596a3347b2cf356ba70 (patch)
treec74af59d305115e8b3b42883cb2a9e273dcfb9b0
parentbf7099262adf0f27e71a08387747c5cb0d459360 (diff)
dyn TS, assignment: set lchan state to LCHAN_S_ACT_REQ in the proper place
Set lchan->state to LCHAN_S_ACT_REQ in rsl_chan_activate_lchan(), not in handle_new_assignment(). This is the first part of a fix for dynamic timeslots handling in the gscon. Rationale: In rsl_chan_activate_lchan(), we may choose to set the lchan state to LCHAN_S_REL_REQ and wait for dyn TS switchover from PDCH. So the caller from bsc_api.c handle_new_assignment() must not bluntly set the state to LCHAN_S_ACT_REQ, which is not accurate in the case of dyn TS switchover. In case of dyn TS switchover, a later release ack received from the BTS will cause rsl_chan_activate_lchan() to be called again, at which point we may accurately set state LCHAN_S_ACT_REQ, and continue the Assignment. Related: OS#3211 Change-Id: Iedb4fb63bf1959d5f1d2c6edb6a7f5097ff16bd7
-rw-r--r--src/libbsc/abis_rsl.c5
-rw-r--r--src/libbsc/bsc_api.c2
2 files changed, 4 insertions, 3 deletions
diff --git a/src/libbsc/abis_rsl.c b/src/libbsc/abis_rsl.c
index 10bef6eb2..b36e49687 100644
--- a/src/libbsc/abis_rsl.c
+++ b/src/libbsc/abis_rsl.c
@@ -694,7 +694,10 @@ int rsl_chan_activate_lchan(struct gsm_lchan *lchan, uint8_t act_type,
rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_TOTAL]);
- return abis_rsl_sendmsg(msg);
+ rc = abis_rsl_sendmsg(msg);
+ if (!rc)
+ rsl_lchan_set_state(lchan, LCHAN_S_ACT_REQ);
+ return rc;
}
/* Chapter 8.4.9: Modify channel mode on BTS side */
diff --git a/src/libbsc/bsc_api.c b/src/libbsc/bsc_api.c
index 19859cf8a..13fe099ec 100644
--- a/src/libbsc/bsc_api.c
+++ b/src/libbsc/bsc_api.c
@@ -156,8 +156,6 @@ static int handle_new_assignment(struct gsm_subscriber_connection *conn, int cha
/* remember that we have the channel */
conn->secondary_lchan = new_lchan;
new_lchan->conn = conn;
-
- rsl_lchan_set_state(new_lchan, LCHAN_S_ACT_REQ);
return 0;
}