aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMinh-Quang Nguyen <minh-quang.nguyen@nutaq.com>2017-01-18 17:52:27 +0100
committerHarald Welte <laforge@gnumonks.org>2017-02-01 16:35:42 +0000
commit16b4179fbeaf3289e7aa41e4f9a0ac5d9d6206f6 (patch)
tree5a8fbf9eb9037974f153390c0d5721543e5e44c6 /src
parent42ffb325f8e00a5bce0eefbce579ff7d86f73282 (diff)
rsl: Fix dropping of LAPDm UA message.
In some cases, when successive mobile originated calls are made, the LAPDm UA message gets lost because the channel is relased to early. Too overcome the problem we do not send relase indications immediately. Instead a flag will be set and the message stored and sent on the next TCH-RTS-IND. This commit adds the functionality to store the release indication msg, to rsl.c. It also addes the mechanism to forward the release indication to l1sap.c See also coresponding change in openbsc.git: Change-Id I15fc1ef8e9e83f009bde96de9a8e95702cffbce6 This patch is is a slightly improved/reformatted version of: https://gitlab.com/nrw_noa/osmo-bts/commit/95d1f15ad108c1c1869c1965144acd64c1395d8c Change-Id: Ie4f70c75f0137b4bd72d579b3a32575bac2fca38
Diffstat (limited to 'src')
-rw-r--r--src/common/l1sap.c11
-rw-r--r--src/common/rsl.c17
2 files changed, 28 insertions, 0 deletions
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index b2f18d1e..19b38afd 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -714,6 +714,7 @@ static int l1sap_tch_rts_ind(struct gsm_bts_trx *trx,
uint8_t chan_nr, marker = 0;
uint16_t seq;
uint32_t fn, timestamp;
+ int rc;
chan_nr = rts_ind->chan_nr;
fn = rts_ind->fn;
@@ -757,6 +758,16 @@ static int l1sap_tch_rts_ind(struct gsm_bts_trx *trx,
resp_l1sap = msgb_l1sap_prim(resp_msg);
}
+ /* check for pending REL_IND */
+ if (lchan->pending_rel_ind_msg) {
+ LOGP(DRSL, LOGL_INFO, "%s Forward REL_IND to L3\n", gsm_lchan_name(lchan));
+ /* Forward it to L3 */
+ rc = abis_bts_rsl_sendmsg(lchan->pending_rel_ind_msg);
+ lchan->pending_rel_ind_msg = NULL;
+ if (rc < 0)
+ return rc;
+ }
+
memset(resp_l1sap, 0, sizeof(*resp_l1sap));
osmo_prim_init(&resp_l1sap->oph, SAP_GSM_PH, PRIM_TCH, PRIM_OP_REQUEST,
resp_msg);
diff --git a/src/common/rsl.c b/src/common/rsl.c
index b3e9afb7..74d835f0 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -2273,6 +2273,7 @@ int lapdm_rll_tx_cb(struct msgb *msg, struct lapdm_entity *le, void *ctx)
}
msg->trx = lchan->ts->trx;
+ msg->lchan = lchan;
/* check if this is a measurement report from SACCH which needs special
* processing before forwarding */
@@ -2281,6 +2282,22 @@ int lapdm_rll_tx_cb(struct msgb *msg, struct lapdm_entity *le, void *ctx)
LOGP(DRSL, LOGL_INFO, "%s Handing RLL msg %s from LAPDm to MEAS REP\n",
gsm_lchan_name(lchan), rsl_msg_name(rh->msg_type));
+
+ /* REL_IND handling */
+ if (rh->msg_type == RSL_MT_REL_IND) {
+ LOGP(DRSL, LOGL_INFO, "%s Scheduling %s to L3 in next associated TCH-RTS.ind\n",
+ gsm_lchan_name(lchan),
+ rsl_msg_name(rh->msg_type));
+
+ if(lchan->pending_rel_ind_msg) {
+ LOGP(DRSL, LOGL_INFO, "Dropping pending release indication message\n");
+ msgb_free(lchan->pending_rel_ind_msg);
+ }
+
+ lchan->pending_rel_ind_msg = msg;
+ return 0;
+ }
+
rc = rsl_tx_meas_res(lchan, msgb_l3(msg), msgb_l3len(msg));
msgb_free(msg);
return rc;