aboutsummaryrefslogtreecommitdiffstats
path: root/library/GSUP_Emulation.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'library/GSUP_Emulation.ttcn')
-rw-r--r--library/GSUP_Emulation.ttcn75
1 files changed, 64 insertions, 11 deletions
diff --git a/library/GSUP_Emulation.ttcn b/library/GSUP_Emulation.ttcn
index 51c158a5..4f7e5d65 100644
--- a/library/GSUP_Emulation.ttcn
+++ b/library/GSUP_Emulation.ttcn
@@ -60,11 +60,10 @@ type component GSUP_Emulation_CT {
/* GSUP port to the per-connection clients */
port GSUP_Conn_PT GSUP_CLIENT;
- /* use 16 as this is also the number of SCCP connections that SCCP_Emulation can handle */
- var ConnectionData GsupImsiTable[16];
+ var ConnectionData GsupImsiTable[256];
/* pending expected incoming connections */
- var ExpectData GsupExpectTable[16];
+ var ExpectData GsupExpectTable[256];
/* procedure based port to register for incoming connections */
port GSUPEM_PROC_PT GSUP_PROC;
};
@@ -217,9 +216,24 @@ function main(GsupOps ops, charstring id) runs on GSUP_Emulation_CT {
/* Client -> us: procedure call to register expect */
- [] GSUP_PROC.getcall(GSUPEM_register:{?,?}) -> param(imsi, vc_hdlr) {
+ [] GSUP_PROC.getcall(GSUPEM_register_expect:{?,?}) -> param(imsi, vc_hdlr) {
f_create_expect(imsi, vc_hdlr);
- GSUP_PROC.reply(GSUPEM_register:{imsi, vc_hdlr}) to vc_hdlr;
+ GSUP_PROC.reply(GSUPEM_register_expect:{imsi, vc_hdlr}) to vc_hdlr;
+ }
+ /* Client -> us: procedure call to unregister expect */
+ [] GSUP_PROC.getcall(GSUPEM_unregister_expect:{?,?}) -> param(imsi, vc_hdlr) {
+ f_destroy_expect(imsi, vc_hdlr);
+ GSUP_PROC.reply(GSUPEM_unregister_expect:{imsi, vc_hdlr}) to vc_hdlr;
+ }
+
+ [] GSUP_PROC.getcall(GSUPEM_unregister_connhdlr:{?}) -> param(imsi) sender vc_hdlr {
+ f_imsi_table_del(imsi);
+ GSUP_PROC.reply(GSUPEM_unregister_connhdlr:{imsi}) to vc_hdlr;
+ }
+ [] GSUP_PROC.getcall(GSUPEM_change_connhdlr:{?,?}) -> param(imsi, vc_hdlr) {
+ f_imsi_table_del(imsi);
+ f_imsi_table_add(vc_hdlr, imsi);
+ GSUP_PROC.reply(GSUPEM_change_connhdlr:{imsi, vc_hdlr}) to vc_hdlr;
}
}
@@ -239,10 +253,14 @@ type record ExpectData {
}
/* procedure based port to register for incoming calls */
-signature GSUPEM_register(in charstring imsi, in GSUP_ConnHdlr hdlr);
+signature GSUPEM_register_expect(in charstring imsi, in GSUP_ConnHdlr hdlr);
+signature GSUPEM_unregister_expect(in charstring imsi, in GSUP_ConnHdlr hdlr);
+signature GSUPEM_unregister_connhdlr(in charstring imsi);
+signature GSUPEM_change_connhdlr(in charstring imsi, in GSUP_ConnHdlr hdlr);
type port GSUPEM_PROC_PT procedure {
- inout GSUPEM_register;
+ inout GSUPEM_register_expect, GSUPEM_unregister_expect,
+ GSUPEM_unregister_connhdlr, GSUPEM_change_connhdlr;
} with { extension "internal" };
/* CreateCallback that can be used as create_cb and will use the expectation table */
@@ -288,17 +306,52 @@ runs on GSUP_Emulation_CT {
testcase.stop("No space left in GsupExpectTable");
}
+/* server/emulation side function to destroy expect */
+private function f_destroy_expect(charstring imsi, GSUP_ConnHdlr hdlr)
+runs on GSUP_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(GsupExpectTable); i := i+1) {
+ if (GsupExpectTable[i].imsi == imsi and GsupExpectTable[i].vc_conn == hdlr) {
+ GsupExpectTable[i].imsi := omit;
+ GsupExpectTable[i].vc_conn := null;
+ log("Destroyed GsupExpect[", i, "] for ", imsi, " to be handled at ", hdlr);
+ return;
+ }
+ }
+ testcase.stop("No matching expect found to be destoyed");
+}
+
/* client/conn_hdlr side function to use procedure port to create expect in emulation */
function f_create_gsup_expect(charstring imsi) runs on GSUP_ConnHdlr {
- GSUP_PROC.call(GSUPEM_register:{imsi, self}) {
- [] GSUP_PROC.getreply(GSUPEM_register:{?,?}) {};
+ GSUP_PROC.call(GSUPEM_register_expect:{imsi, self}) {
+ [] GSUP_PROC.getreply(GSUPEM_register_expect:{?,?}) {};
+ }
+}
+
+function f_destroy_gsup_expect(charstring imsi) runs on GSUP_ConnHdlr {
+ GSUP_PROC.call(GSUPEM_unregister_expect:{imsi, self}) {
+ [] GSUP_PROC.getreply(GSUPEM_unregister_expect:{?,?}) {};
+ }
+}
+
+function f_unregister_gsup_imsi(charstring imsi) runs on GSUP_ConnHdlr {
+ GSUP_PROC.call(GSUPEM_unregister_connhdlr:{imsi}) {
+ [] GSUP_PROC.getreply(GSUPEM_unregister_connhdlr:{?}) {};
}
}
+
+
/* Same as f_create_gsup_expect, but with explicit addressing. Needed when connecting multiple ports to GSUP_PROC. */
function f_create_gsup_expect_explicit(charstring imsi, GSUP_Emulation_CT ct) runs on GSUP_ConnHdlr {
- GSUP_PROC.call(GSUPEM_register:{imsi, self}) to ct {
- [] GSUP_PROC.getreply(GSUPEM_register:{?,?}) {};
+ GSUP_PROC.call(GSUPEM_register_expect:{imsi, self}) to ct {
+ [] GSUP_PROC.getreply(GSUPEM_register_expect:{?,?}) {};
+ }
+}
+
+function f_gsup_change_connhdlr(charstring imsi) runs on GSUP_ConnHdlr {
+ GSUP_PROC.call(GSUPEM_change_connhdlr:{imsi, self}) {
+ [] GSUP_PROC.getreply(GSUPEM_change_connhdlr:{?,?}) {};
}
}