This source file includes following definitions.
- sngisdn_snd_setup
- sngisdn_snd_setup_ack
- sngisdn_snd_con_complete
- sngisdn_snd_proceed
- sngisdn_snd_progress
- sngisdn_snd_alert
- sngisdn_snd_connect
- sngisdn_snd_info_req
- sngisdn_snd_status_enq
- sngisdn_snd_disconnect
- sngisdn_snd_release
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 #include "ftmod_sangoma_isdn.h"
36
37 extern ftdm_status_t cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm);
38 extern ftdm_status_t cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm);
39 extern ftdm_status_t cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan);
40
41 void sngisdn_snd_setup(ftdm_channel_t *ftdmchan);
42 void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan);
43 void sngisdn_snd_progress(ftdm_channel_t *ftdmchan);
44 void sngisdn_snd_connect(ftdm_channel_t *ftdmchan);
45 void sngisdn_snd_disconnect(ftdm_channel_t *ftdmchan);
46 void sngisdn_snd_release(ftdm_channel_t *ftdmchan, uint8_t glare);
47
48
49 void sngisdn_snd_setup(ftdm_channel_t *ftdmchan)
50 {
51 ConEvnt conEvnt;
52 sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
53 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
54
55 ftdm_assert((!sngisdn_info->suInstId && !sngisdn_info->spInstId), "Trying to call out, but call data was not cleared\n");
56
57 sngisdn_info->suInstId = get_unique_suInstId(signal_data->cc_id);
58 sngisdn_info->spInstId = 0;
59
60 ftdm_mutex_lock(g_sngisdn_data.ccs[signal_data->cc_id].mutex);
61 g_sngisdn_data.ccs[signal_data->cc_id].active_suInstIds[sngisdn_info->suInstId] = sngisdn_info;
62 ftdm_mutex_unlock(g_sngisdn_data.ccs[signal_data->cc_id].mutex);
63
64 memset(&conEvnt, 0, sizeof(conEvnt));
65
66 conEvnt.bearCap[0].eh.pres = PRSNT_NODEF;
67 conEvnt.bearCap[0].infoTranCap.pres = PRSNT_NODEF;
68 conEvnt.bearCap[0].infoTranCap.val = sngisdn_get_infoTranCap_from_user(ftdmchan->caller_data.bearer_capability);
69
70 conEvnt.bearCap[0].codeStand0.pres = PRSNT_NODEF;
71 conEvnt.bearCap[0].codeStand0.val = IN_CSTD_CCITT;
72 conEvnt.bearCap[0].infoTranRate0.pres = PRSNT_NODEF;
73 conEvnt.bearCap[0].infoTranRate0.val = IN_ITR_64KBIT;
74 conEvnt.bearCap[0].tranMode.pres = PRSNT_NODEF;
75 conEvnt.bearCap[0].tranMode.val = IN_TM_CIRCUIT;
76
77 conEvnt.chanId.eh.pres = PRSNT_NODEF;
78 conEvnt.chanId.prefExc.pres = PRSNT_NODEF;
79 conEvnt.chanId.prefExc.val = IN_PE_EXCLSVE;
80 conEvnt.chanId.dChanInd.pres = PRSNT_NODEF;
81 conEvnt.chanId.dChanInd.val = IN_DSI_NOTDCHAN;
82 conEvnt.chanId.intIdentPres.pres = PRSNT_NODEF;
83 conEvnt.chanId.intIdentPres.val = IN_IIP_IMPLICIT;
84 conEvnt.chanId.intIdent.pres = NOTPRSNT;
85
86 if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI ||
87 ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
88
89
90
91
92 conEvnt.chanId.intType.pres = PRSNT_NODEF;
93 conEvnt.chanId.intType.val = IN_IT_BASIC;
94 conEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
95 conEvnt.chanId.infoChanSel.val = ftdmchan->physical_chan_id;
96 } else {
97
98 conEvnt.bearCap[0].usrInfoLyr1Prot.pres = PRSNT_NODEF;
99 conEvnt.bearCap[0].usrInfoLyr1Prot.val = sngisdn_get_usrInfoLyr1Prot_from_user(ftdmchan->caller_data.bearer_layer1);
100
101 if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN &&
102 conEvnt.bearCap[0].usrInfoLyr1Prot.val == IN_UIL1_G711ULAW) {
103
104
105 conEvnt.bearCap[0].usrInfoLyr1Prot.val = IN_UIL1_G711ALAW;
106
107 } else if (conEvnt.bearCap[0].usrInfoLyr1Prot.val == IN_UIL1_G711ALAW) {
108
109
110 conEvnt.bearCap[0].usrInfoLyr1Prot.val = IN_UIL1_G711ULAW;
111 }
112
113 conEvnt.bearCap[0].lyr1Ident.pres = PRSNT_NODEF;
114 conEvnt.bearCap[0].lyr1Ident.val = IN_L1_IDENT;
115
116 conEvnt.chanId.intType.pres = PRSNT_NODEF;
117 conEvnt.chanId.intType.val = IN_IT_OTHER;
118 conEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
119 conEvnt.chanId.infoChanSel.val = IN_ICS_B1CHAN;
120 conEvnt.chanId.chanMapType.pres = PRSNT_NODEF;
121 conEvnt.chanId.chanMapType.val = IN_CMT_BCHAN;
122 conEvnt.chanId.nmbMap.pres = PRSNT_NODEF;
123 conEvnt.chanId.nmbMap.val = IN_NM_CHNNMB;
124 conEvnt.chanId.codeStand1.pres = PRSNT_NODEF;
125 conEvnt.chanId.codeStand1.val = IN_CSTD_CCITT;
126 conEvnt.chanId.chanNmbSlotMap.pres = PRSNT_NODEF;
127 conEvnt.chanId.chanNmbSlotMap.len = 1;
128 conEvnt.chanId.chanNmbSlotMap.val[0] = ftdmchan->physical_chan_id;
129 }
130
131 conEvnt.progInd.eh.pres = PRSNT_NODEF;
132 conEvnt.progInd.location.pres = PRSNT_NODEF;
133 conEvnt.progInd.location.val = IN_LOC_USER;
134 conEvnt.progInd.codeStand0.pres = PRSNT_NODEF;
135 conEvnt.progInd.codeStand0.val = IN_CSTD_CCITT;
136 conEvnt.progInd.progDesc.pres = PRSNT_NODEF;
137 conEvnt.progInd.progDesc.val = IN_PD_NOTETEISDN;
138
139 if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN) {
140 conEvnt.sndCmplt.eh.pres = PRSNT_NODEF;
141 }
142 if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP &&
143 signal_data->signalling == SNGISDN_SIGNALING_NET) {
144 sngisdn_info->ces = CES_MNGMNT;
145 }
146
147 cpy_called_num_from_user(&conEvnt.cdPtyNmb, &ftdmchan->caller_data);
148 cpy_calling_num_from_user(&conEvnt.cgPtyNmb, &ftdmchan->caller_data);
149 cpy_calling_name_from_user(&conEvnt, ftdmchan);
150
151 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending SETUP (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
152
153 if (sng_isdn_con_request(signal_data->cc_id, sngisdn_info->suInstId, &conEvnt, signal_data->dchan_id, sngisdn_info->ces)) {
154 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused SETUP request\n");
155 }
156
157 return;
158 }
159
160
161 void sngisdn_snd_setup_ack(ftdm_channel_t *ftdmchan)
162 {
163 CnStEvnt cnStEvnt;
164
165 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
166 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
167
168 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
169 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending SETUP ACK , but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
170 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
171 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
172 return;
173 }
174
175 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
176
177 cnStEvnt.chanId.eh.pres = PRSNT_NODEF;
178 cnStEvnt.chanId.prefExc.pres = PRSNT_NODEF;
179 cnStEvnt.chanId.prefExc.val = IN_PE_EXCLSVE;
180 cnStEvnt.chanId.dChanInd.pres = PRSNT_NODEF;
181 cnStEvnt.chanId.dChanInd.val = IN_DSI_NOTDCHAN;
182 cnStEvnt.chanId.intIdentPres.pres = PRSNT_NODEF;
183 cnStEvnt.chanId.intIdentPres.val = IN_IIP_IMPLICIT;
184
185
186 if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI ||
187 ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
188
189
190 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
191 cnStEvnt.chanId.intType.val = IN_IT_BASIC;
192 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
193 cnStEvnt.chanId.infoChanSel.val = ftdmchan->physical_chan_id;
194 } else {
195 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
196 cnStEvnt.chanId.intType.val = IN_IT_OTHER;
197 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
198 cnStEvnt.chanId.infoChanSel.val = IN_ICS_B1CHAN;
199 cnStEvnt.chanId.chanMapType.pres = PRSNT_NODEF;
200 cnStEvnt.chanId.chanMapType.val = IN_CMT_BCHAN;
201 cnStEvnt.chanId.nmbMap.pres = PRSNT_NODEF;
202 cnStEvnt.chanId.nmbMap.val = IN_NM_CHNNMB;
203 cnStEvnt.chanId.codeStand1.pres = PRSNT_NODEF;
204 cnStEvnt.chanId.codeStand1.val = IN_CSTD_CCITT;
205 cnStEvnt.chanId.chanNmbSlotMap.pres = PRSNT_NODEF;
206 cnStEvnt.chanId.chanNmbSlotMap.len = 1;
207 cnStEvnt.chanId.chanNmbSlotMap.val[0] = ftdmchan->physical_chan_id;
208 }
209
210 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending SETUP ACK (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
211
212 if(sng_isdn_con_status(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &cnStEvnt, MI_SETUPACK, signal_data->dchan_id, sngisdn_info->ces)) {
213 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused SETUP ACK request\n");
214 }
215 return;
216 }
217
218
219
220
221 void sngisdn_snd_con_complete(ftdm_channel_t *ftdmchan)
222 {
223 CnStEvnt cnStEvnt;
224
225 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
226 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
227
228 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
229 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending CONNECT COMPL , but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
230 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
231 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
232 return;
233 }
234
235 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
236
237 cnStEvnt.chanId.eh.pres = PRSNT_NODEF;
238 cnStEvnt.chanId.prefExc.pres = PRSNT_NODEF;
239 cnStEvnt.chanId.prefExc.val = IN_PE_EXCLSVE;
240 cnStEvnt.chanId.dChanInd.pres = PRSNT_NODEF;
241 cnStEvnt.chanId.dChanInd.val = IN_DSI_NOTDCHAN;
242 cnStEvnt.chanId.intIdentPres.pres = PRSNT_NODEF;
243 cnStEvnt.chanId.intIdentPres.val = IN_IIP_IMPLICIT;
244
245 if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI ||
246 ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
247
248
249 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
250 cnStEvnt.chanId.intType.val = IN_IT_BASIC;
251 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
252 cnStEvnt.chanId.infoChanSel.val = ftdmchan->physical_chan_id;
253 } else {
254 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
255 cnStEvnt.chanId.intType.val = IN_IT_OTHER;
256 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
257 cnStEvnt.chanId.infoChanSel.val = IN_ICS_B1CHAN;
258 cnStEvnt.chanId.chanMapType.pres = PRSNT_NODEF;
259 cnStEvnt.chanId.chanMapType.val = IN_CMT_BCHAN;
260 cnStEvnt.chanId.nmbMap.pres = PRSNT_NODEF;
261 cnStEvnt.chanId.nmbMap.val = IN_NM_CHNNMB;
262 cnStEvnt.chanId.codeStand1.pres = PRSNT_NODEF;
263 cnStEvnt.chanId.codeStand1.val = IN_CSTD_CCITT;
264 cnStEvnt.chanId.chanNmbSlotMap.pres = PRSNT_NODEF;
265 cnStEvnt.chanId.chanNmbSlotMap.len = 1;
266 cnStEvnt.chanId.chanNmbSlotMap.val[0] = ftdmchan->physical_chan_id;
267 }
268
269
270 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending CONNECT COMPL (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
271
272 if(sng_isdn_con_comp(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &cnStEvnt, signal_data->dchan_id, sngisdn_info->ces)) {
273 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused CONNECT ACK request\n");
274 }
275 return;
276 }
277
278
279 void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan)
280 {
281 CnStEvnt cnStEvnt;
282
283 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
284 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
285
286 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
287 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending PROGRESS, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
288 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
289 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
290 return;
291 }
292
293 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
294
295 cnStEvnt.chanId.eh.pres = PRSNT_NODEF;
296 cnStEvnt.chanId.prefExc.pres = PRSNT_NODEF;
297 cnStEvnt.chanId.prefExc.val = IN_PE_EXCLSVE;
298 cnStEvnt.chanId.dChanInd.pres = PRSNT_NODEF;
299 cnStEvnt.chanId.dChanInd.val = IN_DSI_NOTDCHAN;
300 cnStEvnt.chanId.intIdentPres.pres = PRSNT_NODEF;
301 cnStEvnt.chanId.intIdentPres.val = IN_IIP_IMPLICIT;
302
303 if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI ||
304 ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
305
306
307 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
308 cnStEvnt.chanId.intType.val = IN_IT_BASIC;
309 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
310 cnStEvnt.chanId.infoChanSel.val = ftdmchan->physical_chan_id;
311 } else {
312 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
313 cnStEvnt.chanId.intType.val = IN_IT_OTHER;
314 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
315 cnStEvnt.chanId.infoChanSel.val = IN_ICS_B1CHAN;
316 cnStEvnt.chanId.chanMapType.pres = PRSNT_NODEF;
317 cnStEvnt.chanId.chanMapType.val = IN_CMT_BCHAN;
318 cnStEvnt.chanId.nmbMap.pres = PRSNT_NODEF;
319 cnStEvnt.chanId.nmbMap.val = IN_NM_CHNNMB;
320 cnStEvnt.chanId.codeStand1.pres = PRSNT_NODEF;
321 cnStEvnt.chanId.codeStand1.val = IN_CSTD_CCITT;
322 cnStEvnt.chanId.chanNmbSlotMap.pres = PRSNT_NODEF;
323 cnStEvnt.chanId.chanNmbSlotMap.len = 1;
324 cnStEvnt.chanId.chanNmbSlotMap.val[0] = ftdmchan->physical_chan_id;
325 }
326
327
328 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending PROCEED (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
329
330 if(sng_isdn_con_status(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &cnStEvnt, MI_CALLPROC, signal_data->dchan_id, sngisdn_info->ces)) {
331 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused PROCEED request\n");
332 }
333 return;
334 }
335
336 void sngisdn_snd_progress(ftdm_channel_t *ftdmchan)
337 {
338 CnStEvnt cnStEvnt;
339
340 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
341 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
342
343 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
344 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending PROGRESS, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
345 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
346 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
347 return;
348 }
349
350 if (signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
351
352
353 return;
354 }
355
356 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
357
358 cnStEvnt.progInd.eh.pres = PRSNT_NODEF;
359 cnStEvnt.progInd.location.pres = PRSNT_NODEF;
360 cnStEvnt.progInd.location.val = IN_LOC_USER;
361 cnStEvnt.progInd.codeStand0.pres = PRSNT_NODEF;
362 cnStEvnt.progInd.codeStand0.val = IN_CSTD_CCITT;
363 cnStEvnt.progInd.progDesc.pres = PRSNT_NODEF;
364 cnStEvnt.progInd.progDesc.val = IN_PD_IBAVAIL;
365
366 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending PROGRESS (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
367 if(sng_isdn_con_status(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId,&cnStEvnt, MI_PROGRESS, signal_data->dchan_id, sngisdn_info->ces)) {
368 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused PROGRESS request\n");
369 }
370 return;
371 }
372
373 void sngisdn_snd_alert(ftdm_channel_t *ftdmchan)
374 {
375 CnStEvnt cnStEvnt;
376
377 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
378 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
379
380 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
381 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending ALERT, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
382 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
383 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
384 return;
385 }
386
387 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
388
389 cnStEvnt.progInd.eh.pres = PRSNT_NODEF;
390 cnStEvnt.progInd.location.pres = PRSNT_NODEF;
391 cnStEvnt.progInd.location.val = IN_LOC_USER;
392 cnStEvnt.progInd.codeStand0.pres = PRSNT_NODEF;
393 cnStEvnt.progInd.codeStand0.val = IN_CSTD_CCITT;
394 cnStEvnt.progInd.progDesc.pres = PRSNT_NODEF;
395 cnStEvnt.progInd.progDesc.val = IN_PD_NOTETEISDN;
396
397 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending ALERT (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
398
399 if(sng_isdn_con_status(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId,&cnStEvnt, MI_ALERTING, signal_data->dchan_id, sngisdn_info->ces)) {
400 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused ALERT request\n");
401 }
402 return;
403 }
404
405 void sngisdn_snd_connect(ftdm_channel_t *ftdmchan)
406 {
407 CnStEvnt cnStEvnt;
408
409 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
410 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
411
412 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
413 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending CONNECT, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
414 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
415 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
416 return;
417 }
418
419 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
420
421
422 cnStEvnt.chanId.eh.pres = PRSNT_NODEF;
423 cnStEvnt.chanId.prefExc.pres = PRSNT_NODEF;
424 cnStEvnt.chanId.prefExc.val = IN_PE_EXCLSVE;
425 cnStEvnt.chanId.dChanInd.pres = PRSNT_NODEF;
426 cnStEvnt.chanId.dChanInd.val = IN_DSI_NOTDCHAN;
427 cnStEvnt.chanId.intIdentPres.pres = PRSNT_NODEF;
428 cnStEvnt.chanId.intIdentPres.val = IN_IIP_IMPLICIT;
429
430 if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI ||
431 ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
432
433
434 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
435 cnStEvnt.chanId.intType.val = IN_IT_BASIC;
436 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
437 cnStEvnt.chanId.infoChanSel.val = ftdmchan->physical_chan_id;
438 } else {
439 cnStEvnt.chanId.intType.pres = PRSNT_NODEF;
440 cnStEvnt.chanId.intType.val = IN_IT_OTHER;
441 cnStEvnt.chanId.infoChanSel.pres = PRSNT_NODEF;
442 cnStEvnt.chanId.infoChanSel.val = IN_ICS_B1CHAN;
443 cnStEvnt.chanId.chanMapType.pres = PRSNT_NODEF;
444 cnStEvnt.chanId.chanMapType.val = IN_CMT_BCHAN;
445 cnStEvnt.chanId.nmbMap.pres = PRSNT_NODEF;
446 cnStEvnt.chanId.nmbMap.val = IN_NM_CHNNMB;
447 cnStEvnt.chanId.codeStand1.pres = PRSNT_NODEF;
448 cnStEvnt.chanId.codeStand1.val = IN_CSTD_CCITT;
449 cnStEvnt.chanId.chanNmbSlotMap.pres = PRSNT_NODEF;
450 cnStEvnt.chanId.chanNmbSlotMap.len = 1;
451 cnStEvnt.chanId.chanNmbSlotMap.val[0] = ftdmchan->physical_chan_id;
452 }
453
454 cnStEvnt.progInd.eh.pres = PRSNT_NODEF;
455 cnStEvnt.progInd.location.pres = PRSNT_NODEF;
456 cnStEvnt.progInd.location.val = IN_LOC_USER;
457 cnStEvnt.progInd.codeStand0.pres = PRSNT_NODEF;
458 cnStEvnt.progInd.codeStand0.val = IN_CSTD_CCITT;
459 cnStEvnt.progInd.progDesc.pres = PRSNT_NODEF;
460 cnStEvnt.progInd.progDesc.val = IN_PD_NOTETEISDN;
461
462 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending CONNECT (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
463 if (sng_isdn_con_response(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &cnStEvnt, signal_data->dchan_id, sngisdn_info->ces)) {
464 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused CONNECT request\n");
465 }
466 return;
467 }
468
469
470 void sngisdn_snd_info_req(ftdm_channel_t *ftdmchan)
471 {
472 CnStEvnt cnStEvnt;
473
474 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
475 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
476
477 if (ftdmchan->span->trunk_type != FTDM_TRUNK_BRI &&
478 ftdmchan->span->trunk_type != FTDM_TRUNK_BRI_PTMP) {
479
480 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Ignoring INFO REQ on non-BRI channel\n");
481 return;
482 }
483
484 memset(&cnStEvnt, 0, sizeof(cnStEvnt));
485
486
487
488 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending INFO REQ (suId:%d dchan:%d ces:%d)\n", signal_data->cc_id, signal_data->dchan_id, sngisdn_info->ces);
489
490 if (sng_isdn_con_status(signal_data->cc_id, 0, 0, &cnStEvnt, MI_INFO, signal_data->dchan_id, sngisdn_info->ces)) {
491 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused INFO request\n");
492 }
493 return;
494 }
495
496
497 void sngisdn_snd_status_enq(ftdm_channel_t *ftdmchan)
498 {
499 StaEvnt staEvnt;
500
501 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
502 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
503
504
505
506 memset(&staEvnt, 0, sizeof(StaEvnt));
507
508 ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Sending Status ENQ on suId:%d suInstId:%u spInstId:%d dchan:%d ces:%d\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
509 if (sng_isdn_status_request(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &staEvnt, MI_STATENQ)) {
510 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused Status ENQ request\n");
511 }
512 return;
513 }
514
515
516 void sngisdn_snd_disconnect(ftdm_channel_t *ftdmchan)
517 {
518 DiscEvnt discEvnt;
519
520 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
521 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
522
523 if (!sngisdn_info->suInstId || !sngisdn_info->spInstId) {
524 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending DISCONNECT, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
525
526 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
527 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
528 return;
529 }
530
531 memset(&discEvnt, 0, sizeof(discEvnt));
532
533
534 discEvnt.causeDgn[0].eh.pres = PRSNT_NODEF;
535 discEvnt.causeDgn[0].location.pres = PRSNT_NODEF;
536 discEvnt.causeDgn[0].location.val = IN_LOC_PRIVNETLU;
537 discEvnt.causeDgn[0].codeStand3.pres = PRSNT_NODEF;
538 discEvnt.causeDgn[0].codeStand3.val = IN_CSTD_CCITT;
539 discEvnt.causeDgn[0].causeVal.pres = PRSNT_NODEF;
540 discEvnt.causeDgn[0].causeVal.val = ftdmchan->caller_data.hangup_cause;
541 discEvnt.causeDgn[0].recommend.pres = NOTPRSNT;
542 discEvnt.causeDgn[0].dgnVal.pres = NOTPRSNT;
543
544 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending DISCONNECT (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
545 if (sng_isdn_disc_request(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &discEvnt)) {
546 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused DISCONNECT request\n");
547 }
548 return;
549 }
550 void sngisdn_snd_release(ftdm_channel_t *ftdmchan, uint8_t glare)
551 {
552 RelEvnt relEvnt;
553 uint32_t suInstId, spInstId;
554
555 sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data;
556 sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
557
558 if (!sngisdn_info->suInstId) {
559 ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Sending RELEASE, but no call data, aborting (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId);
560
561 sngisdn_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
562 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
563 return;
564 }
565
566 memset(&relEvnt, 0, sizeof(relEvnt));
567
568
569 relEvnt.causeDgn[0].eh.pres = PRSNT_NODEF;
570 relEvnt.causeDgn[0].location.pres = PRSNT_NODEF;
571 relEvnt.causeDgn[0].location.val = IN_LOC_PRIVNETLU;
572 relEvnt.causeDgn[0].codeStand3.pres = PRSNT_NODEF;
573 relEvnt.causeDgn[0].codeStand3.val = IN_CSTD_CCITT;
574
575 relEvnt.causeDgn[0].causeVal.pres = PRSNT_NODEF;
576 relEvnt.causeDgn[0].causeVal.val = ftdmchan->caller_data.hangup_cause;
577 relEvnt.causeDgn[0].recommend.pres = NOTPRSNT;
578 relEvnt.causeDgn[0].dgnVal.pres = NOTPRSNT;
579
580 if (glare) {
581 suInstId = sngisdn_info->glare.suInstId;
582 spInstId = sngisdn_info->glare.spInstId;
583 } else {
584 suInstId = sngisdn_info->suInstId;
585 spInstId = sngisdn_info->spInstId;
586 }
587
588 ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending RELEASE/RELEASE COMPLETE (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, suInstId, spInstId);
589
590 if (glare) {
591 if (sng_isdn_release_request(signal_data->cc_id, suInstId, spInstId, &relEvnt)) {
592 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused RELEASE/RELEASE COMPLETE request\n");
593 }
594 } else {
595 if (sng_isdn_release_request(signal_data->cc_id, suInstId, spInstId, &relEvnt)) {
596 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "stack refused RELEASE/RELEASE COMPLETE request\n");
597 }
598 }
599 return;
600 }
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615