This source file includes following definitions.
- copy_cgPtyNum_from_sngss7
- copy_cgPtyNum_to_sngss7
- copy_cdPtyNum_from_sngss7
- copy_cdPtyNum_to_sngss7
- copy_tknStr_from_sngss7
- check_for_state_change
- check_cics_in_range
- extract_chan_data
- check_for_reset
- get_unique_id
- check_if_rx_grs_started
- check_if_rx_grs_processed
- check_if_rx_gra_started
- check_for_res_sus_flag
- clear_rx_grs_flags
- clear_tx_grs_flags
- clear_rx_rsc_flags
- clear_tx_rsc_flags
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_ss7_main.h"
36
37
38
39
40
41
42 uint32_t sngss7_id;
43
44
45
46 uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
47 uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
48 uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
49 uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
50 uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
51
52 int check_for_state_change(ftdm_channel_t *ftdmchan);
53 int check_cics_in_range(sngss7_chan_data_t *sngss7_info);
54 int check_for_reset(sngss7_chan_data_t *sngss7_info);
55
56 unsigned long get_unique_id(void);
57
58 ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan);
59
60 ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan);
61 ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan);
62 ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan);
63 ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan);
64
65 ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info);
66 ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info);
67 ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info);
68 ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info);
69
70
71
72 uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
73 {
74
75 return 0;
76 }
77
78
79 uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
80 {
81 int k;
82 int j;
83 int flag;
84 int odd;
85 char tmp[2];
86 uint8_t lower;
87 uint8_t upper;
88
89
90 cgPtyNum->eh.pres = PRSNT_NODEF;
91
92 cgPtyNum->natAddrInd.pres = PRSNT_NODEF;
93 cgPtyNum->natAddrInd.val = 0x03;
94
95 cgPtyNum->scrnInd.pres = PRSNT_NODEF;
96 cgPtyNum->scrnInd.val = ftdm->screen;
97
98 cgPtyNum->presRest.pres = PRSNT_NODEF;
99 cgPtyNum->presRest.val = ftdm->pres;
100
101 cgPtyNum->numPlan.pres = PRSNT_NODEF;
102 cgPtyNum->numPlan.val = 0x01;
103
104 cgPtyNum->niInd.pres = PRSNT_NODEF;
105 cgPtyNum->niInd.val = 0x00;
106
107 cgPtyNum->addrSig.pres = PRSNT_NODEF;
108
109
110
111
112
113 tmp[1] = '\0';
114 k = 0;
115 j = 0;
116 flag = 0;
117 odd = 0;
118 upper = 0x0;
119 lower = 0x0;
120
121 while (1) {
122
123 tmp[0] = ftdm->cid_num.digits[k];
124
125
126 while (!(isdigit(tmp[0])) && (tmp[0] != '\0')) {
127
128 k++;
129 tmp[0] = ftdm->cid_num.digits[k];
130 }
131
132
133 if (tmp[0] != '\0') {
134
135 lower = atoi(&tmp[0]);
136
137 k++;
138
139 tmp[0] = ftdm->cid_num.digits[k];
140
141
142 while (!(isdigit(tmp[0])) && (tmp[0] != '\0')) {
143 k++;
144 tmp[0] = ftdm->cid_num.digits[k];
145 }
146
147
148 if (tmp[0] != '\0') {
149
150 upper = (atoi(&tmp[0])) << 4;
151 } else {
152
153 upper = 0x0;
154
155 odd = 1;
156
157 flag = 1;
158 }
159 } else {
160
161 odd = 0;
162
163 flag = 1;
164 }
165
166
167 cgPtyNum->addrSig.val[j] = upper | lower;
168
169
170 j++;
171
172
173 if (flag) break;
174
175
176 k++;
177 }
178
179 cgPtyNum->addrSig.len = j;
180
181
182 cgPtyNum->oddEven.pres = PRSNT_NODEF;
183 cgPtyNum->oddEven.val = odd;
184
185 return 0;
186 }
187
188
189 uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
190 {
191
192 return 0;
193 }
194
195
196 uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
197 {
198 int k;
199 int j;
200 int flag;
201 int odd;
202 char tmp[2];
203 uint8_t lower;
204 uint8_t upper;
205
206
207 cdPtyNum->eh.pres = PRSNT_NODEF;
208
209 cdPtyNum->natAddrInd.pres = PRSNT_NODEF;
210 cdPtyNum->natAddrInd.val = 0x03;
211
212 cdPtyNum->numPlan.pres = PRSNT_NODEF;
213 cdPtyNum->numPlan.val = 0x01;
214
215 cdPtyNum->innInd.pres = PRSNT_NODEF;
216 cdPtyNum->innInd.val = 0x01;
217
218 cdPtyNum->addrSig.pres = PRSNT_NODEF;
219
220
221
222
223
224 tmp[1] = '\0';
225 k = 0;
226 j = 0;
227 flag = 0;
228 odd = 0;
229 upper = 0x0;
230 lower = 0x0;
231
232 while (1) {
233
234 tmp[0] = ftdm->dnis.digits[k];
235
236
237 while (!(isdigit(tmp[0])) && (tmp[0] != '\0')) {
238
239 k++;
240 tmp[0] = ftdm->dnis.digits[k];
241 }
242
243
244 if (tmp[0] != '\0') {
245
246 lower = atoi(&tmp[0]);
247
248 k++;
249
250 tmp[0] = ftdm->dnis.digits[k];
251
252
253 while (!(isdigit(tmp[0])) && (tmp[0] != '\0')) {
254 k++;
255 tmp[0] = ftdm->dnis.digits[k];
256 }
257
258
259 if (tmp[0] != '\0') {
260
261 upper = (atoi(&tmp[0])) << 4;
262 } else {
263
264 upper = 0xF;
265
266 odd = 1;
267
268 flag = 1;
269 }
270 } else {
271
272 odd = 1;
273
274 lower = 0xF;
275 upper = 0x0;
276
277 flag = 1;
278 }
279
280
281 cdPtyNum->addrSig.val[j] = upper | lower;
282
283
284 j++;
285
286
287 if (flag) break;
288
289
290 k++;
291 }
292
293 cdPtyNum->addrSig.len = j;
294
295
296 cdPtyNum->oddEven.pres = PRSNT_NODEF;
297
298 cdPtyNum->oddEven.val = odd;
299
300
301 return 0;
302 }
303
304
305 uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
306 {
307 uint8_t i;
308 uint8_t j;
309
310
311
312 if (str.pres == 1) {
313 j = 0;
314
315 for (i = 0; i < str.len; i++) {
316 sprintf(&ftdm[j], "%X", (str.val[i] & 0x0F));
317 j++;
318 sprintf(&ftdm[j], "%X", ((str.val[i] & 0xF0) >> 4));
319 j++;
320 }
321
322
323 if ((oddEven.pres == 1) && (oddEven.val == 1)) {
324 ftdm[j-1] = '\0';
325 } else {
326 ftdm[j] = '\0';
327 }
328
329
330 } else {
331 SS7_ERROR("Asked to copy tknStr that is not present!\n");
332 return 1;
333 }
334
335 return 0;
336 }
337
338
339 int check_for_state_change(ftdm_channel_t *ftdmchan)
340 {
341
342
343 ftdm_wait_for_flag_cleared(ftdmchan, FTDM_CHANNEL_STATE_CHANGE, 500);
344
345
346
347 if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
348
349 SS7_DEBUG_CHAN(ftdmchan, "FTDM_CHANNEL_STATE_CHANGE flag set for over 500ms, channel state = %s\n",
350 ftdm_channel_state2str (ftdmchan->state));
351
352 return 1;
353 }
354
355 return 0;
356 }
357
358
359 int check_cics_in_range(sngss7_chan_data_t *sngss7_info)
360 {
361
362
363 #if 0
364 ftdm_channel_t *tmp_ftdmchan;
365 sngss7_chan_data_t *tmp_sngss7_info;
366 int i = 0;
367
368
369 for ( i = sngss7_info->grs.circuit; i < ( sngss7_info->grs.range + 1 ); i++ ) {
370 if ( g_ftdm_sngss7_data.cfg.isupCircuit[i].siglink == 0 ) {
371
372
373 if (extract_chan_data(g_ftdm_sngss7_data.cfg.isupCircuit[i].id, &tmp_sngss7_info, &tmp_ftdmchan)) {
374 SS7_ERROR("Failed to extract channel data for circuit = %d!\n", g_ftdm_sngss7_data.cfg.isupCircuit[i].id);
375 return 0;
376 }
377
378
379 if (!sngss7_test_flag(tmp_sngss7_info, FLAG_GRP_RESET_RX_DN)) {
380 SS7_DEBUG_CHAN(tmp_ftdmchan, "[CIC:%d] Still processing reset...\n", tmp_sngss7_info->circuit->cic);
381 return 0;
382 }
383 }
384 }
385
386 SS7_DEBUG("All circuits out of reset: circuit=%d, range=%d\n",
387 sngss7_info->grs.circuit,
388 sngss7_info->grs.range);
389 return 1;
390
391 #endif
392
393 return 0;
394
395 }
396
397
398 ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan)
399 {
400
401
402 if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj == NULL) {
403 SS7_ERROR("sngss7_info is Null for circuit #%d\n", circuit);
404 return FTDM_FAIL;
405 }
406
407 ftdm_assert_return(g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj, FTDM_FAIL, "received message on signalling link or non-configured cic\n");
408
409 *sngss7_info = g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj;
410
411 ftdm_assert_return((*sngss7_info)->ftdmchan, FTDM_FAIL, "received message on signalling link or non-configured cic\n");
412 *ftdmchan = (*sngss7_info)->ftdmchan;
413
414
415 return FTDM_SUCCESS;
416 }
417
418
419 int check_for_reset(sngss7_chan_data_t *sngss7_info)
420 {
421
422 if (sngss7_test_flag(sngss7_info,FLAG_RESET_RX)) {
423 return 1;
424 }
425
426 if (sngss7_test_flag(sngss7_info,FLAG_RESET_TX)) {
427 return 1;
428 }
429
430 if (sngss7_test_flag(sngss7_info,FLAG_GRP_RESET_RX)) {
431 return 1;
432 }
433
434 if (sngss7_test_flag(sngss7_info,FLAG_GRP_RESET_TX)) {
435 return 1;
436 }
437
438 return 0;
439
440 }
441
442
443 unsigned long get_unique_id(void)
444 {
445
446 if (sngss7_id < 420000000) {
447 sngss7_id++;
448 } else {
449 sngss7_id = 1;
450 }
451
452 return(sngss7_id);
453 }
454
455
456 ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan)
457 {
458 ftdm_channel_t *ftdmchan = NULL;
459 sngss7_chan_data_t *sngss7_info = NULL;
460 sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
461 int i;
462
463 for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
464
465
466 if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
467 SS7_ERROR("Failed to extract channel data for circuit = %d!\n", i);
468 continue;
469 }
470
471
472 if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX)) {
473
474 continue;
475 }
476
477
478 ftdm_mutex_lock(ftdmchan->mutex);
479
480
481 while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
482 ftdm_sangoma_ss7_process_state_change (ftdmchan);
483 }
484
485 SS7_INFO_CHAN(ftdmchan, "Rx GRS (%d:%d)\n",
486 g_ftdm_sngss7_data.cfg.isupCkt[sngss7_span->rx_grs.circuit].cic,
487 (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_span->rx_grs.circuit].cic + sngss7_span->rx_grs.range));
488
489
490 sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_RX);
491
492 switch (ftdmchan->state) {
493
494 case FTDM_CHANNEL_STATE_RESTART:
495
496
497 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_IDLE);
498
499 break;
500
501 default:
502
503
504 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
505 break;
506
507 }
508
509
510 ftdm_mutex_unlock(ftdmchan->mutex);
511
512 }
513
514 return FTDM_SUCCESS;
515 }
516
517
518 ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan)
519 {
520 ftdm_channel_t *ftdmchan = NULL;
521 sngss7_chan_data_t *sngss7_info = NULL;
522 sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
523 int i;
524 int byte = 0;
525 int bit = 0;
526
527
528 ftdm_log(FTDM_LOG_DEBUG, "Found Rx GRS on span %d...checking circuits\n", ftdmspan->span_id);
529
530
531 for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
532
533
534 if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
535 SS7_ERROR("Failed to extract channel data for circuit = %d!\n", i);
536 continue;
537 }
538
539
540 ftdm_mutex_lock(ftdmchan->mutex);
541
542
543 if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
544
545 if (!sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) {
546
547 goto GRS_UNLOCK_ALL;
548 }
549 } else {
550
551 goto GRS_UNLOCK_ALL;
552 }
553 }
554
555 SS7_DEBUG("All circuits out of reset for GRS: circuit=%d, range=%d\n",
556 sngss7_span->rx_grs.circuit,
557 sngss7_span->rx_grs.range);
558
559
560 for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
561
562
563 if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
564 SS7_ERROR("Failed to extract channel data for circuit = %d!\n",i);
565
566 SS7_ASSERT;
567
568 continue;
569 }
570
571
572 sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT);
573
574
575 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
576
577
578 if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
579 (sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
580 (sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) ||
581 (sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
582
583 sngss7_span->rx_grs.status[byte] = (sngss7_span->rx_grs.status[byte] | (1 << bit));
584 }
585
586
587 bit ++;
588 if (bit == 8) {
589 byte++;
590 bit = 0;
591 }
592 }
593
594 GRS_UNLOCK_ALL:
595 for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
596
597 if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
598 SS7_ERROR("Failed to extract channel data for circuit = %d!\n", i);
599 continue;
600 }
601
602
603 ftdm_mutex_unlock(ftdmchan->mutex);
604 }
605
606 return FTDM_SUCCESS;
607 }
608
609
610 ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan)
611 {
612 ftdm_channel_t *ftdmchan = NULL;
613 sngss7_chan_data_t *sngss7_info = NULL;
614 sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
615 int i;
616
617 for ( i = sngss7_span->rx_gra.circuit; i < (sngss7_span->rx_gra.circuit + sngss7_span->rx_gra.range + 1); i++) {
618
619
620 if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
621 SS7_ERROR("Failed to extract channel data for circuit = %d!\n", i);
622 continue;
623 }
624
625
626 if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) {
627
628 continue;
629 }
630
631
632 ftdm_mutex_lock(ftdmchan->mutex);
633
634
635 while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
636 ftdm_sangoma_ss7_process_state_change (ftdmchan);
637 }
638
639 SS7_INFO_CHAN(ftdmchan, "Rx GRA (%d:%d)\n",
640 g_ftdm_sngss7_data.cfg.isupCkt[sngss7_span->rx_gra.circuit].cic,
641 (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_span->rx_gra.circuit].cic + sngss7_span->rx_gra.range));
642
643 switch (ftdmchan->state) {
644
645 case FTDM_CHANNEL_STATE_RESTART:
646
647
648 sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
649
650
651 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
652
653 break;
654
655 case FTDM_CHANNEL_STATE_DOWN:
656
657
658 SS7_DEBUG("Receveived GRA in down state, dropping\n");
659
660 break;
661
662 case FTDM_CHANNEL_STATE_TERMINATING:
663 case FTDM_CHANNEL_STATE_HANGUP:
664 case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
665
666
667 sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
668
669 break;
670
671 default:
672
673 if (sngss7_span->rx_gra.cause != 0) {
674 ftdmchan->caller_data.hangup_cause = sngss7_span->rx_gra.cause;
675 } else {
676 ftdmchan->caller_data.hangup_cause = 98;
677 }
678
679
680 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
681 break;
682
683 }
684
685
686 ftdm_mutex_unlock(ftdmchan->mutex);
687
688 }
689
690
691 return FTDM_SUCCESS;
692 }
693
694
695 ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan)
696 {
697 ftdm_channel_t *ftdmchan = NULL;
698 sngss7_chan_data_t *sngss7_info = NULL;
699 ftdm_sigmsg_t sigev;
700 int x;
701
702 for (x = 1; x < (ftdmspan->chan_count + 1); x++) {
703
704
705 ftdmchan = ftdmspan->channels[x];
706
707
708 if (ftdmchan->call_data == NULL) continue;
709
710 sngss7_info = ftdmchan->call_data;
711
712
713 ftdm_mutex_lock(ftdmchan->mutex);
714
715 memset (&sigev, 0, sizeof (sigev));
716
717 sigev.chan_id = ftdmchan->chan_id;
718 sigev.span_id = ftdmchan->span_id;
719 sigev.channel = ftdmchan;
720
721
722 if ((sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) &&
723 (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP))) {
724
725
726 while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
727 ftdm_sangoma_ss7_process_state_change (ftdmchan);
728 }
729
730
731
732 ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
733 }
734
735
736
737 if (sngss7_test_flag(sngss7_info, FLAG_INFID_RESUME)) {
738
739
740 while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
741 ftdm_sangoma_ss7_process_state_change (ftdmchan);
742 }
743
744
745 ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
746 }
747
748
749 ftdm_mutex_unlock(ftdmchan->mutex);
750
751 }
752
753
754 ftdm_span_trigger_signals(ftdmspan);
755
756 return FTDM_SUCCESS;
757 }
758
759
760 ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info)
761 {
762
763 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_RX);
764 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_RX_DN);
765 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT);
766
767 return FTDM_SUCCESS;
768 }
769
770
771 ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info)
772 {
773
774 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_BASE);
775 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_TX);
776 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_SENT);
777 sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
778
779 return FTDM_SUCCESS;
780 }
781
782
783 ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info)
784 {
785
786 sngss7_clear_flag(sngss7_info, FLAG_RESET_RX);
787
788 return FTDM_SUCCESS;
789 }
790
791
792 ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info)
793 {
794
795 sngss7_clear_flag(sngss7_info, FLAG_RESET_TX);
796 sngss7_clear_flag(sngss7_info, FLAG_RESET_SENT);
797 sngss7_clear_flag(sngss7_info, FLAG_RESET_TX_RSP);
798
799 return FTDM_SUCCESS;
800 }
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815