This source file includes following definitions.
- sng_isdn_stack_start
- sng_isdn_stack_stop
- sng_isdn_activate_phy
- sng_isdn_deactivate_phy
- sng_isdn_activate_cc
- sng_isdn_activate_trace
- sng_isdn_cntrl_q931
- sng_isdn_cntrl_q921
- stack_resp_hdr_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include "ftmod_sangoma_isdn.h"
37
38 void stack_resp_hdr_init(Header *hdr);
39
40 ftdm_status_t sng_isdn_activate_phy(ftdm_span_t *span);
41 ftdm_status_t sng_isdn_deactivate_phy(ftdm_span_t *span);
42
43 ftdm_status_t sng_isdn_activate_cc(ftdm_span_t *span);
44 ftdm_status_t sng_isdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
45
46 ftdm_status_t sng_isdn_cntrl_q931(ftdm_span_t *span, uint8_t action, uint8_t subaction);
47 ftdm_status_t sng_isdn_cntrl_q921(ftdm_span_t *span, uint8_t action, uint8_t subaction);
48
49
50 extern ftdm_sngisdn_data_t g_sngisdn_data;
51
52 ftdm_status_t sng_isdn_stack_stop(ftdm_span_t *span);
53
54
55 ftdm_status_t sng_isdn_stack_start(ftdm_span_t *span)
56 {
57 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
58
59
60 if (sng_isdn_cntrl_q921(span, ABND_ENA, NOTUSED) != FTDM_SUCCESS) {
61 ftdm_log(FTDM_LOG_CRIT, "%s:Failed to activate stack q921\n", span->name);
62 return FTDM_FAIL;
63 }
64
65
66
67
68
69
70 ftdm_sleep(500);
71
72 ftdm_log(FTDM_LOG_DEBUG, "%s:Stack q921 activated\n", span->name);
73 if (!g_sngisdn_data.ccs[signal_data->cc_id].activation_done) {
74 g_sngisdn_data.ccs[signal_data->cc_id].activation_done = 1;
75 if (sng_isdn_activate_cc(span) != FTDM_SUCCESS) {
76 ftdm_log(FTDM_LOG_CRIT, "%s:Failed to activate stack CC\n", span->name);
77 return FTDM_FAIL;
78 }
79 ftdm_log(FTDM_LOG_DEBUG, "%s:Stack CC activated\n", span->name);
80 }
81
82
83 if (sng_isdn_cntrl_q931(span, ABND_ENA, SAELMNT) != FTDM_SUCCESS) {
84 ftdm_log(FTDM_LOG_CRIT, "%s:Failed to activate stack q931\n", span->name);
85 return FTDM_FAIL;
86 }
87 ftdm_log(FTDM_LOG_DEBUG, "%s:Stack q931 activated\n", span->name);
88
89 ftdm_log(FTDM_LOG_INFO, "%s:Stack activated\n",span->name);
90 return FTDM_SUCCESS;
91 }
92
93 ftdm_status_t sng_isdn_stack_stop(ftdm_span_t *span)
94 {
95
96 if (sng_isdn_deactivate_phy(span) != FTDM_SUCCESS) {
97 ftdm_log(FTDM_LOG_CRIT, "%s:Failed to deactivate stack phy\n", span->name);
98 return FTDM_FAIL;
99 }
100
101 if (sng_isdn_cntrl_q931(span, AUBND_DIS, SAELMNT) != FTDM_SUCCESS) {
102 ftdm_log(FTDM_LOG_CRIT, "%s:Failed to deactivate stack q931\n", span->name);
103 return FTDM_FAIL;
104 }
105
106 if (sng_isdn_cntrl_q921(span, AUBND_DIS, SAELMNT) != FTDM_SUCCESS) {
107 ftdm_log(FTDM_LOG_CRIT, "%s:Failed to deactivate stack q921\n", span->name);
108 return FTDM_FAIL;
109 }
110
111 ftdm_log(FTDM_LOG_INFO, "%s:Signalling stopped\n", span->name);
112 return FTDM_SUCCESS;
113 }
114
115
116 ftdm_status_t sng_isdn_activate_phy(ftdm_span_t *span)
117 {
118
119
120
121 return FTDM_SUCCESS;
122 }
123
124 ftdm_status_t sng_isdn_deactivate_phy(ftdm_span_t *span)
125 {
126 L1Mngmt cntrl;
127 Pst pst;
128
129 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
130
131
132 stack_pst_init(&pst);
133
134
135 pst.dstEnt = ENTL1;
136
137
138 memset(&cntrl, 0, sizeof(cntrl));
139
140
141 stack_hdr_init(&cntrl.hdr);
142
143 cntrl.hdr.msgType = TCNTRL;
144 cntrl.hdr.entId.ent = ENTL1;
145 cntrl.hdr.entId.inst = S_INST;
146 cntrl.hdr.elmId.elmnt = STTSAP;
147
148 cntrl.t.cntrl.action = AUBND_DIS;
149 cntrl.t.cntrl.subAction = SAELMNT;
150 cntrl.t.cntrl.sapId = signal_data->link_id;
151
152 if (sng_isdn_phy_cntrl(&pst, &cntrl)) {
153 return FTDM_FAIL;
154 }
155 return FTDM_SUCCESS;
156 }
157
158
159 ftdm_status_t sng_isdn_activate_cc(ftdm_span_t *span)
160 {
161 CcMngmt cntrl;;
162 Pst pst;
163
164 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
165
166
167 stack_pst_init(&pst);
168
169
170 pst.dstEnt = ENTCC;
171
172
173 memset(&cntrl, 0, sizeof(cntrl));
174
175
176 stack_hdr_init(&cntrl.hdr);
177
178 cntrl.hdr.msgType = TCNTRL;
179 cntrl.hdr.entId.ent = ENTCC;
180 cntrl.hdr.entId.inst = S_INST;
181 cntrl.hdr.elmId.elmnt = STTSAP;
182
183 cntrl.t.cntrl.action = ABND_ENA;
184 cntrl.t.cntrl.subAction = SAELMNT;
185
186 cntrl.t.cntrl.sapId = signal_data->cc_id;
187 if (sng_isdn_cc_cntrl(&pst, &cntrl)) {
188 return FTDM_FAIL;
189 }
190 return FTDM_SUCCESS;
191 }
192
193 ftdm_status_t sng_isdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt)
194 {
195 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
196 switch (trace_opt) {
197 case SNGISDN_TRACE_DISABLE:
198 if (sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q921)) {
199 ftdm_log(FTDM_LOG_INFO, "s%d Disabling q921 trace\n", signal_data->link_id);
200 sngisdn_clear_trace_flag(signal_data, SNGISDN_TRACE_Q921);
201
202 if (sng_isdn_cntrl_q921(span, ADISIMM, SATRC) != FTDM_SUCCESS) {
203 ftdm_log(FTDM_LOG_ERROR, "s%d Failed to disable q921 trace\n");
204 }
205 }
206 if (sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q931)) {
207 ftdm_log(FTDM_LOG_INFO, "s%d Disabling q931 trace\n", signal_data->link_id);
208 sngisdn_clear_trace_flag(signal_data, SNGISDN_TRACE_Q931);
209
210 if (sng_isdn_cntrl_q931(span, ADISIMM, SATRC) != FTDM_SUCCESS) {
211 ftdm_log(FTDM_LOG_ERROR, "s%d Failed to disable q931 trace\n");
212 }
213 }
214 break;
215 case SNGISDN_TRACE_Q921:
216 if (!sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q921)) {
217 ftdm_log(FTDM_LOG_INFO, "s%d Enabling q921 trace\n", signal_data->link_id);
218 sngisdn_set_trace_flag(signal_data, SNGISDN_TRACE_Q921);
219
220 if (sng_isdn_cntrl_q921(span, AENA, SATRC) != FTDM_SUCCESS) {
221 ftdm_log(FTDM_LOG_ERROR, "s%d Failed to enable q921 trace\n");
222 }
223 }
224 break;
225 case SNGISDN_TRACE_Q931:
226 if (!sngisdn_test_trace_flag(signal_data, SNGISDN_TRACE_Q931)) {
227 ftdm_log(FTDM_LOG_INFO, "s%d Enabling q931 trace\n", signal_data->link_id);
228 sngisdn_set_trace_flag(signal_data, SNGISDN_TRACE_Q931);
229
230 if (sng_isdn_cntrl_q931(span, AENA, SATRC) != FTDM_SUCCESS) {
231 ftdm_log(FTDM_LOG_ERROR, "s%d Failed to enable q931 trace\n");
232 }
233 }
234 break;
235 }
236 return FTDM_SUCCESS;
237 }
238
239
240 ftdm_status_t sng_isdn_cntrl_q931(ftdm_span_t *span, uint8_t action, uint8_t subaction)
241 {
242 InMngmt cntrl;;
243 Pst pst;
244 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
245
246
247 stack_pst_init(&pst);
248
249
250 pst.dstEnt = ENTIN;
251
252
253 memset(&cntrl, 0, sizeof(cntrl));
254
255
256 stack_hdr_init(&cntrl.hdr);
257
258 cntrl.hdr.msgType = TCNTRL;
259 cntrl.hdr.entId.ent = ENTIN;
260 cntrl.hdr.entId.inst = S_INST;
261 cntrl.hdr.elmId.elmnt = STDLSAP;
262
263 cntrl.t.cntrl.action = action;
264 cntrl.t.cntrl.subAction = subaction;
265
266 if (action == AENA && subaction == SATRC) {
267 cntrl.t.cntrl.trcLen = -1;
268 }
269 cntrl.t.cntrl.sapId = signal_data->link_id;
270 cntrl.t.cntrl.ces = 0;
271
272 if(sng_isdn_q931_cntrl(&pst, &cntrl)) {
273 return FTDM_FAIL;
274 }
275 return FTDM_SUCCESS;
276
277 }
278
279 ftdm_status_t sng_isdn_cntrl_q921(ftdm_span_t *span, uint8_t action, uint8_t subaction)
280 {
281 BdMngmt cntrl;
282 Pst pst;
283 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
284
285
286 stack_pst_init(&pst);
287
288
289 pst.dstEnt = ENTLD;
290
291
292 memset(&cntrl, 0, sizeof(cntrl));
293
294
295 stack_hdr_init(&cntrl.hdr);
296
297 cntrl.hdr.msgType = TCNTRL;
298 cntrl.hdr.entId.ent = ENTLD;
299 cntrl.hdr.entId.inst = S_INST;
300
301 #if (SMBD_LMINT3 || BD_LMINT3)
302 stack_resp_hdr_init(&cntrl.hdr);
303 #endif
304
305 cntrl.hdr.elmId.elmnt = STMSAP;
306 cntrl.t.cntrl.action = action;
307 cntrl.t.cntrl.subAction = subaction;
308
309 #if (SMBD_LMINT3 || BD_LMINT3)
310 cntrl.t.cntrl.lnkNmb = signal_data->link_id;
311 cntrl.t.cntrl.sapi = NOTUSED;
312 cntrl.t.cntrl.tei = NOTUSED;
313 #else
314 cntrl.hdr.elmId.elmntInst1 = signal_data->link_id;
315 cntrl.hdr.elmId.elmntInst2 = NOTUSED;
316 cntrl.hdr.elmId.elmntInst3 = NOTUSED;
317 #endif
318
319 cntrl.t.cntrl.logInt = NOTUSED;
320 cntrl.t.cntrl.trcLen = NOTUSED;
321 if (action == AENA && subaction == SATRC) {
322 cntrl.t.cntrl.trcLen = -1;
323 }
324
325 SGetDateTime(&(cntrl.t.cntrl.dt));
326 if(sng_isdn_q921_cntrl(&pst, &cntrl)) {
327 return FTDM_FAIL;
328 }
329
330 return FTDM_SUCCESS;
331 }
332
333
334 void stack_resp_hdr_init(Header *hdr)
335 {
336 hdr->response.selector = 0;
337 hdr->response.mem.region = RTESPEC;
338 hdr->response.mem.pool = S_POOL;
339 hdr->response.prior = PRIOR0;
340 hdr->response.route = RTESPEC;
341
342 return;
343 }
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358