diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn index 6afeca21f..55cdb8958 100644 --- a/bsc/MSC_ConnectionHandler.ttcn +++ b/bsc/MSC_ConnectionHandler.ttcn @@ -426,8 +426,9 @@ altstep as_assignment(inout AssignmentState st) runs on MSC_ConnHdlr { } [st.rr_ass_cmpl_seen] RSL.receive(tr_RSL_RF_CHAN_REL(st.old_chan_nr)) { RSL.send(ts_RSL_RF_CHAN_REL_ACK(st.old_chan_nr)); - /* FIXME: unregister for old channel number in RSL emulation */ - //f_rslem_unregister(0, st.old_chan_nr); + /* unregister for old channel number in RSL emulation */ + /* FIXME: Determine TRX NR by ARFCN, instead of hard-coded TRX0! */ + f_rslem_unregister(0, st.old_chan_nr); st.assignment_done := true; repeat; } diff --git a/library/RSL_Emulation.ttcn b/library/RSL_Emulation.ttcn index cbcff2c61..d20718f61 100644 --- a/library/RSL_Emulation.ttcn +++ b/library/RSL_Emulation.ttcn @@ -50,9 +50,10 @@ type port RSL_DCHAN_PT message { } with { extension "internal" }; signature RSLEM_register(uint8_t trx_nr, RslChannelNr chan_nr, RSL_DchanHdlr hdlr); +signature RSLEM_unregister(uint8_t trx_nr, RslChannelNr chan_nr, RSL_DchanHdlr hdlr); type port RSLEM_PROC_PT procedure { - inout RSLEM_register; + inout RSLEM_register, RSLEM_unregister; } with { extension "internal" }; /*********************************************************************** @@ -379,6 +380,13 @@ function main() runs on RSL_Emulation_CT { RSL_PROC.reply(RSLEM_register:{trx_nr, chan_nr, vc_conn}); } + [] RSL_PROC.getcall(RSLEM_unregister:{?,?,?}) -> param(trx_nr, chan_nr, vc_conn) { + cid := f_cid_by_chan_nr(trx_nr, chan_nr); + f_cid_clear(cid); + RSL_PROC.reply(RSLEM_unregister:{trx_nr, chan_nr, vc_conn}); + } + + } } } @@ -400,4 +408,12 @@ function f_rslem_register(uint8_t trx_nr, RslChannelNr chan_nr) runs on RSL_Dcha } } +/* client/conn_hdlr side function to use procedure port to unregister stream_id/chan_nr */ +function f_rslem_unregister(uint8_t trx_nr, RslChannelNr chan_nr) runs on RSL_DchanHdlr { + RSL_PROC.call(RSLEM_unregister:{trx_nr, chan_nr, self}) { + [] RSL_PROC.getreply(RSLEM_unregister:{?,?,?}) {}; + } +} + + }