blob: 60c71037dcbc5bbbcbd38f62d896395e28b7ee29 [file] [log] [blame]
Harald Welteae026692017-12-09 01:03:01 +01001module BSSAP_Adapter {
Harald Welte28d943e2017-11-25 15:00:50 +01002
Harald Welteae026692017-12-09 01:03:01 +01003/* This module implements a 'dumb' BSSAP adapter. It creates the M3UA and SCCP components and stacks a BSSAP
4 * codec port on top. As a result, it provides the ability to transceive SCCP-User-SAP primitives with
5 * deoded BSSAP payload. Use this if you want to have full control about what you transmit or receive,
6 * without any automatisms in place. Allows you to refuse connections or other abnormal behavior. */
Harald Welte28d943e2017-11-25 15:00:50 +01007
Harald Welteae026692017-12-09 01:03:01 +01008import from General_Types all;
9import from Osmocom_Types all;
10
11import from M3UA_Types all;
12import from M3UA_Emulation all;
13import from MTP3asp_Types all;
14import from MTP3asp_PortType all;
Harald Welte28d943e2017-11-25 15:00:50 +010015
16import from SCCP_Types all;
17import from SCCPasp_Types all;
18import from SCCP_Emulation all;
19
Harald Welteae026692017-12-09 01:03:01 +010020import from SCTPasp_Types all;
21import from SCTPasp_PortType all;
Harald Welte28d943e2017-11-25 15:00:50 +010022
Harald Welteae026692017-12-09 01:03:01 +010023import from BSSAP_CodecPort all;
Harald Welte28d943e2017-11-25 15:00:50 +010024import from BSSMAP_Templates all;
Harald Welte28d943e2017-11-25 15:00:50 +010025
Harald Welteae026692017-12-09 01:03:01 +010026type component BSSAP_Adapter_CT {
Harald Welte28d943e2017-11-25 15:00:50 +010027 /* component references */
Harald Welteae026692017-12-09 01:03:01 +010028 var M3UA_CT vc_M3UA;
Harald Welte28d943e2017-11-25 15:00:50 +010029 var SCCP_CT vc_SCCP;
Harald Welte28d943e2017-11-25 15:00:50 +010030 /* test port to SCCP emulation */
Harald Welteae026692017-12-09 01:03:01 +010031 port BSSAP_CODEC_PT BSSAP;
32
33 var octetstring g_sio;
34 var MSC_SCCP_MTP3_parameters g_sccp_pars;
35 var SCCP_PAR_Address g_sccp_addr_own, g_sccp_addr_peer;
Harald Welte28d943e2017-11-25 15:00:50 +010036}
37
38modulepar {
Harald Welteae026692017-12-09 01:03:01 +010039 charstring mp_sccp_service_type := "mtp3_itu";
40
41 SCTP_Association_Address mp_sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" };
42 integer mp_own_pc := 185; /* 0.23.1 */
43 integer mp_own_ssn := 254;
44
45 integer mp_peer_pc := 187;
46 integer mp_peer_ssn := 254;
Harald Welte28d943e2017-11-25 15:00:50 +010047}
48
Harald Welteae026692017-12-09 01:03:01 +010049/* construct a SCCP_PAR_Address with just PC + SSN and no GT */
50template (value) SCCP_PAR_Address ts_SccpAddr_PC_SSN(integer pc, integer ssn) := {
51 addressIndicator := {
52 pointCodeIndic := '1'B,
53 ssnIndicator := '1'B,
54 globalTitleIndic := '0000'B,
55 routingIndicator := '1'B
56 },
57 signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, '83'O),
58 //signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, g_sio),
59 subsystemNumber := ssn,
60 globalTitle := omit
61}
62
63private function init_pars() runs on BSSAP_Adapter_CT {
64 g_sio := '83'O;
65 g_sccp_pars := {
66 sio := {
67 ni := substr(oct2bit(g_sio),0,2),
68 prio := substr(oct2bit(g_sio),2,2),
69 si := substr(oct2bit(g_sio),4,4)
70 },
71 opc := mp_own_pc,
72 dpc := mp_peer_pc,
73 sls := 0,
74 sccp_serviceType := mp_sccp_service_type,
75 ssn := mp_own_ssn
76 };
77 g_sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(mp_own_pc, mp_own_ssn));
78 g_sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(mp_peer_pc, mp_peer_ssn));
79}
80
81
82function f_bssap_init(charstring id) runs on BSSAP_Adapter_CT
Harald Welte28d943e2017-11-25 15:00:50 +010083{
Harald Welteae026692017-12-09 01:03:01 +010084 init_pars();
85
Harald Welte28d943e2017-11-25 15:00:50 +010086 /* create components */
Harald Welteae026692017-12-09 01:03:01 +010087 vc_M3UA := M3UA_CT.create(id & "-M3UA");
Harald Welte28d943e2017-11-25 15:00:50 +010088 vc_SCCP := SCCP_CT.create(id & "-SCCP");
Harald Welte28d943e2017-11-25 15:00:50 +010089
Harald Welteae026692017-12-09 01:03:01 +010090 map(vc_M3UA:SCTP_PORT, system:sctp);
Harald Welte28d943e2017-11-25 15:00:50 +010091
Harald Welteae026692017-12-09 01:03:01 +010092 /* connect MTP3 service provider (M3UA) to lower side of SCCP */
93 connect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
Harald Welte28d943e2017-11-25 15:00:50 +010094
95 /* connect BSSNAP dispatcher to upper side of SCCP */
Harald Welteae026692017-12-09 01:03:01 +010096 connect(self:BSSAP, vc_SCCP:SCCP_SP_PORT);
Harald Welte28d943e2017-11-25 15:00:50 +010097
Harald Welteae026692017-12-09 01:03:01 +010098 vc_M3UA.start(f_M3UA_Emulation(mp_sctp_addr));
99 vc_SCCP.start(SCCPStart(g_sccp_pars));
100}
Harald Welte28d943e2017-11-25 15:00:50 +0100101
Harald Welteae026692017-12-09 01:03:01 +0100102private altstep as_reset_ack() runs on BSSAP_Adapter_CT {
103 var BSSAP_N_UNITDATA_ind ud_ind;
104 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
105 log("Respoding to inbound RESET with RESET-ACK");
106 BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
107 ts_BSSMAP_ResetAck));
Harald Welte28d943e2017-11-25 15:00:50 +0100108 }
109}
110
Harald Welteae026692017-12-09 01:03:01 +0100111
112function f_bssap_wait_for_reset() runs on BSSAP_Adapter_CT {
113 var BSSAP_N_UNITDATA_ind ud_ind;
114 timer T := 20.0;
115
116 T.start;
117 alt {
118 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
119 BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
120 ts_BSSMAP_ResetAck));
121 }
122 [] as_reset_ack();
123 [] BSSAP.receive {
124 repeat;
125 }
126 [] T.timeout {
127 setverdict(fail);
128 }
129 }
130}
131
132function f_bssap_reset() runs on BSSAP_Adapter_CT {
133 timer T := 5.0;
134
135 BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, ts_BSSMAP_Reset(0)));
136 T.start;
137 alt {
138 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_sccp_addr_own, g_sccp_addr_peer, tr_BSSMAP_ResetAck)) {
139 log("Received RESET-ACK in response to RESET, we're ready to go!");
140 }
141 [] as_reset_ack();
142 [] BSSAP.receive { repeat };
143 [] T.timeout { setverdict(fail, "Waiting for RESET-ACK after sending RESET"); }
144 }
145}
146
147
Harald Welte28d943e2017-11-25 15:00:50 +0100148}