From 16b4179fbeaf3289e7aa41e4f9a0ac5d9d6206f6 Mon Sep 17 00:00:00 2001 From: Minh-Quang Nguyen Date: Wed, 18 Jan 2017 17:52:27 +0100 Subject: 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 --- src/common/l1sap.c | 11 +++++++++++ src/common/rsl.c | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) (limited to 'src') 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; -- cgit v1.2.3