diff options
Diffstat (limited to 'library/GSUP_Emulation.ttcn')
-rw-r--r-- | library/GSUP_Emulation.ttcn | 75 |
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:{?,?}) {}; } } |