diff options
-rw-r--r-- | src/common/l1sap.c | 11 | ||||
-rw-r--r-- | src/common/rsl.c | 17 |
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; |