aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2022-05-16 21:29:19 +0200
committerHarald Welte <laforge@osmocom.org>2022-05-17 19:48:15 +0200
commitee4d70c02533bb6dcd57aea2214f547d57c9d348 (patch)
treed7b0a2ad7e70d285bd0054f415aa4bf4fd92ad85
parent130110c8952106b963d7ccc45be6df9b4ec818d4 (diff)
RAN_Emulation: f_ran_unregister_imsi complement for f_ran_register_imsi
We have a function to register an IMSI but we're missing a function to unregister it from RAN_Emulation. This will cause resource leaks and eventually an overflow of the ImsiTable. We don't notice this yet as we don't have long enough running tests in the test suite yet. Change-Id: I1f5d86c999d4495d661166f98183dfbc48f05f47
-rw-r--r--library/RAN_Emulation.ttcnpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/library/RAN_Emulation.ttcnpp b/library/RAN_Emulation.ttcnpp
index e6d36e66..3198ee13 100644
--- a/library/RAN_Emulation.ttcnpp
+++ b/library/RAN_Emulation.ttcnpp
@@ -1254,7 +1254,10 @@ function main(RanOps ops, charstring id) runs on RAN_Emulation_CT {
f_create_imsi(imsi, tmsi, vc_hdlr);
PROC.reply(RAN_register_imsi:{imsi, tmsi, vc_hdlr}) to vc_hdlr;
}
-
+ [] PROC.getcall(RAN_unregister_imsi:{?,?}) -> param(imsi, vc_hdlr) {
+ f_destroy_imsi(imsi, vc_hdlr);
+ PROC.reply(RAN_unregister_imsi:{imsi, vc_hdlr}) to vc_hdlr;
+ }
}
}
@@ -1287,6 +1290,7 @@ signature RAN_register_handoverRequest(in integer targetPointCode, in RAN_ConnHd
/* procedure based port to register for incoming IMSI/TMSI */
signature RAN_register_imsi(in hexstring imsi, in OCT4 tmsi, in RAN_ConnHdlr hdlr);
+signature RAN_unregister_imsi(in hexstring imsi, in RAN_ConnHdlr hdlr);
/* If DTAP happens across other channels (e.g. GSUP), provide manual advancing of the n_sd sequence number */
signature RAN_last_n_sd(in RAN_ConnHdlr hdlr, out N_Sd_Array last_n_sd);
@@ -1295,7 +1299,7 @@ signature RAN_last_n_sd(in RAN_ConnHdlr hdlr, out N_Sd_Array last_n_sd);
signature RAN_continue_after_n_sd(N_Sd_Array last_n_sd, in RAN_ConnHdlr hdlr);
type port RAN_PROC_PT procedure {
- inout RAN_register, RAN_register_imsi, RAN_register_handoverRequest, RAN_last_n_sd, RAN_continue_after_n_sd;
+ inout RAN_register, RAN_register_imsi, RAN_unregister_imsi, RAN_register_handoverRequest, RAN_last_n_sd, RAN_continue_after_n_sd;
} with { extension "internal" };
#ifdef RAN_EMULATION_BSSAP
@@ -1425,6 +1429,19 @@ runs on RAN_Emulation_CT {
testcase.stop("No space left in ImsiTable");
}
+private function f_destroy_imsi(hexstring imsi, RAN_ConnHdlr hdlr)
+runs on RAN_Emulation_CT {
+ for (var integer i := 0; i < sizeof(ImsiTable); i := i+1) {
+ if (ImsiTable[i].imsi == imsi and ImsiTable[i].comp_ref == hdlr) {
+ ImsiTable[i].comp_ref := null;
+ ImsiTable[i].imsi := omit;
+ ImsiTable[i].tmsi := 'FFFFFFFF'O;
+ log("Removed IMSI[", i, "] for ", imsi, " to be handled at ", hdlr);
+ return;
+ }
+ }
+ testcase.stop("Unable to find to-be-destroyed IMSI in ImsiTable");
+}
private function f_expect_table_init()
runs on RAN_Emulation_CT {
@@ -1451,6 +1468,15 @@ runs on RAN_ConnHdlr {
}
}
+/* helper function for clients to register their IMSI/TMSI */
+function f_ran_unregister_imsi(hexstring imsi)
+runs on RAN_ConnHdlr {
+
+ BSSAP_PROC.call(RAN_unregister_imsi:{imsi, self}) {
+ [] BSSAP_PROC.getreply(RAN_unregister_imsi:{?,?}) {};
+ }
+}
+
/* register an expect with the BSSMAP core */
function f_ran_register_exp(octetstring l3_enc) runs on RAN_ConnHdlr {
BSSAP_PROC.call(RAN_register:{l3_enc, self}) {