diff options
Diffstat (limited to 'bsc-nat/MSC_ConnectionHandler.ttcn')
-rw-r--r-- | bsc-nat/MSC_ConnectionHandler.ttcn | 73 |
1 files changed, 56 insertions, 17 deletions
diff --git a/bsc-nat/MSC_ConnectionHandler.ttcn b/bsc-nat/MSC_ConnectionHandler.ttcn index c8cb0059..e4d38166 100644 --- a/bsc-nat/MSC_ConnectionHandler.ttcn +++ b/bsc-nat/MSC_ConnectionHandler.ttcn @@ -21,6 +21,8 @@ import from MGCP_Types all; import from MGCP_Templates all; import from SDP_Types all; +type function void_fn_msc(charstring id) runs on MSC_ConnHdlr; + /* this component represents a single subscriber connection at the MSC. * There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components. * We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */ @@ -32,24 +34,38 @@ type component MSC_ConnHdlr extends RAN_ConnHdlr { var MgcpEndpoint g_ep_name; var MgcpCallId g_call_id; var MgcpConnectionId g_mgcp_conn_id; + var MSC_TestHdlrParams g_pars; } -/* Callback function from general BSSMAP_Emulation whenever a new incoming - * SCCP connection arrivces. Must create + start a new component */ -private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id) -runs on RAN_Emulation_CT return RAN_ConnHdlr { - var MSC_ConnHdlr vc_conn; - /* Create a new RAN_ConnHdlr component */ - vc_conn := MSC_ConnHdlr.create(g_ran_id & "-Conn-" & int2str(conn_ind.connectionId)); - /* connect it to the port */ +type record MSC_TestHdlrParams { + integer connection_id, + integer e1_timeslot +}; + +/* helper function to create and connect a MSC_ConnHdlr component */ +private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on RAN_Emulation_CT { + /* connect client BSSAP port to BSSAP dispatcher */ connect(vc_conn:BSSAP, self:CLIENT); - /* start it */ - vc_conn.start(MSC_ConnectionHandler.main(conn_ind.connectionId, g_next_e1_ts)); - /* increment next E1 timeslot */ - g_next_e1_ts := g_next_e1_ts + 1; +} + +private function f_msc_start_handler(void_fn_msc fn, charstring id, template (omit) MSC_TestHdlrParams pars := omit) +runs on RAN_Emulation_CT return MSC_ConnHdlr { + var MSC_ConnHdlr vc_conn; + vc_conn := MSC_ConnHdlr.create(id); + f_connect_handler(vc_conn); + vc_conn.start(f_handler_init(fn, id, pars)); return vc_conn; } +/* first function inside ConnHdlr component; sets g_pars + starts function */ +private function f_handler_init(void_fn_msc fn, charstring id, template (omit) MSC_TestHdlrParams pars := omit) +runs on MSC_ConnHdlr { + if (isvalue(pars)) { + g_pars := valueof(pars); + } + fn.apply(id); +} + /* Callback function from general BSSMAP_Emulation whenever a connectionless * BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */ private function UnitdataCallback(PDU_BSSAP bssap) @@ -63,8 +79,25 @@ runs on RAN_Emulation_CT return template PDU_BSSAP { return resp; } +/* Callback function from general BSSMAP_Emulation whenever a new incoming + * SCCP connection arrivces. Must create + start a new component */ +private function CreateCallback_generic(void_fn_msc fn, BSSAP_N_CONNECT_ind conn_ind, charstring id) +runs on RAN_Emulation_CT return RAN_ConnHdlr { + var MSC_ConnHdlr vc_conn; + var MSC_TestHdlrParams pars; + pars.connection_id := conn_ind.connectionId; + pars.e1_timeslot := g_next_e1_ts; + + /* Create a new RAN_ConnHdlr component */ + vc_conn := f_msc_start_handler(fn, g_ran_id & "-Conn-" & int2str(conn_ind.connectionId), pars); + + /* increment next E1 timeslot */ + g_next_e1_ts := g_next_e1_ts + 1; + return vc_conn; +} + const RanOps MSC_RanOps := { - create_cb := refers(CreateCallback), + create_cb := omit, unitdata_cb := refers(UnitdataCallback), decode_dtap := false, role_ms := false, @@ -84,14 +117,20 @@ type enumerated MSC_State { MSC_STATE_WAIT_DLCX_ACK } +/* Callback function from general BSSMAP_Emulation whenever a new incoming + * SCCP connection arrivces. Must create + start a new component */ +function CreateCallback_establish_fully(BSSAP_N_CONNECT_ind conn_ind, charstring id) +runs on RAN_Emulation_CT return RAN_ConnHdlr { + return CreateCallback_generic(refers(f_msc_establish_fully), conn_ind, id); +} /* main function processing various incoming events */ -function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr { +function f_msc_establish_fully(charstring id) runs on MSC_ConnHdlr { var MgcpResponse mgcp_rsp; timer T := 5.0; - g_sccp_conn_id := connection_id; + g_sccp_conn_id := g_pars.connection_id; g_call_id := f_mgcp_alloc_call_id(); - g_ep_name := hex2str(int2hex(e1_timeslot, 1)) & "@mgw"; + g_ep_name := hex2str(int2hex(g_pars.e1_timeslot, 1)) & "@mgw"; /* we just accepted an incoming SCCP connection, start guard timer */ T.start; @@ -103,7 +142,7 @@ function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr { [g_state == MSC_STATE_NONE] BSSAP.receive(tr_BSSMAP_ComplL3) -> value bssap { /* respond with ASSIGNMENT CMD */ g_state := MSC_STATE_WAIT_ASS_COMPL; - BSSAP.send(ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, e1_timeslot))); + BSSAP.send(ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, g_pars.e1_timeslot))); } [g_state == MSC_STATE_WAIT_ASS_COMPL] BSSAP.receive(tr_BSSMAP_AssignmentComplete(?,*)) { /* FIXME: Send MGCP CRCX */ |