summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-06-15 15:32:29 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-06-16 04:29:40 +0200
commit3201988f7bcfeef4c3acbcadfbda0174e4635b98 (patch)
tree619410015bf795a7dd1d742b3c7a07e55830759f
parentc1fbdedcd343bba16a75dc64953c080cae936534 (diff)
dyn PDCH: track pending PDCH de-/activation
Set and clear pending flags on the TS according to PDCH de-/activation. This will allow changing the time we set the channel state to after PDCH DEACT and before PDCH ACT, in a subsequent commit. Also add a sanity check on whether we're sending conflicting or superfluous PDCH de-/activations on the same TS. Change-Id: Ieae73271df749ded3d90585116aae01f3ad4ee74
-rw-r--r--openbsc/src/libbsc/abis_rsl.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index 338c00a11..349b3de39 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -1204,6 +1204,7 @@ static int rsl_rx_hando_det(struct msgb *msg)
static int rsl_rx_pdch_act_ack(struct msgb *msg)
{
msg->lchan->ts->flags |= TS_F_PDCH_ACTIVE;
+ msg->lchan->ts->flags &= ~TS_F_PDCH_ACT_PENDING;
/* We have activated PDCH, so now the channel is available again. */
do_lchan_free(msg->lchan);
@@ -1214,6 +1215,7 @@ static int rsl_rx_pdch_act_ack(struct msgb *msg)
static int rsl_rx_pdch_deact_ack(struct msgb *msg)
{
msg->lchan->ts->flags &= ~TS_F_PDCH_ACTIVE;
+ msg->lchan->ts->flags &= ~TS_F_PDCH_DEACT_PENDING;
rsl_chan_activate_lchan(msg->lchan, msg->lchan->dyn_pdch.act_type,
msg->lchan->dyn_pdch.ho_ref);
@@ -1975,10 +1977,24 @@ int rsl_ipacc_pdch_activate(struct gsm_bts_trx_ts *ts, int act)
struct abis_rsl_dchan_hdr *dh;
uint8_t msg_type;
- if (act)
+ if (ts->flags & TS_F_PDCH_PENDING_MASK) {
+ LOGP(DRSL, LOGL_ERROR,
+ "%s PDCH %s requested, but a PDCH%s%s is still pending\n",
+ gsm_ts_name(ts),
+ act ? "ACT" : "DEACT",
+ ts->flags & TS_F_PDCH_ACT_PENDING? " ACT" : "",
+ ts->flags & TS_F_PDCH_DEACT_PENDING? " DEACT" : "");
+ return -EINVAL;
+ }
+
+ if (act){
msg_type = RSL_MT_IPAC_PDCH_ACT;
- else
+ ts->flags |= TS_F_PDCH_ACT_PENDING;
+ } else {
msg_type = RSL_MT_IPAC_PDCH_DEACT;
+ ts->flags |= TS_F_PDCH_DEACT_PENDING;
+ }
+ /* TODO add timeout to cancel PDCH DE/ACT */
dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));
init_dchan_hdr(dh, msg_type);