Reduce the amount of database access for HAVE_PRI_SERVICE_MESSAGES.
[asterisk/asterisk.git] / channels / sig_pri.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2009, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  *
21  * \brief PRI signaling module
22  *
23  * \author Matthew Fredrickson <creslin@digium.com>
24  */
25
26
27 #include "asterisk.h"
28
29 #ifdef HAVE_PRI
30
31 #include <errno.h>
32 #include <ctype.h>
33 #include <signal.h>
34
35 #include "asterisk/utils.h"
36 #include "asterisk/options.h"
37 #include "asterisk/pbx.h"
38 #include "asterisk/app.h"
39 #include "asterisk/file.h"
40 #include "asterisk/callerid.h"
41 #include "asterisk/say.h"
42 #include "asterisk/manager.h"
43 #include "asterisk/astdb.h"
44 #include "asterisk/causes.h"
45 #include "asterisk/musiconhold.h"
46 #include "asterisk/cli.h"
47 #include "asterisk/transcap.h"
48 #include "asterisk/features.h"
49
50 #include "sig_pri.h"
51 #ifndef PRI_EVENT_FACILITY
52 #error please update libpri
53 #endif
54
55 /* define this to send PRI user-user information elements */
56 #undef SUPPORT_USERUSER
57
58 #if 0
59 #define DEFAULT_PRI_DEBUG (PRI_DEBUG_Q931_DUMP | PRI_DEBUG_Q921_DUMP | PRI_DEBUG_Q921_RAW | PRI_DEBUG_Q921_STATE)
60 #else
61 #define DEFAULT_PRI_DEBUG 0
62 #endif
63
64 static int pri_matchdigittimeout = 3000;
65
66 static int pri_gendigittimeout = 8000;
67
68 #define DCHAN_NOTINALARM  (1 << 0)
69 #define DCHAN_UP          (1 << 1)
70
71 /* Defines to help decode the encoded event channel id. */
72 #define PRI_CHANNEL(p)  ((p) & 0xff)
73 #define PRI_SPAN(p)             (((p) >> 8) & 0xff)
74 #define PRI_EXPLICIT    (1 << 16)
75 #define PRI_CIS_CALL    (1 << 17)       /* Call is using the D channel only. */
76 #define PRI_HELD_CALL   (1 << 18)
77
78
79 #define DCHAN_AVAILABLE (DCHAN_NOTINALARM | DCHAN_UP)
80
81 #define PRI_DEADLOCK_AVOIDANCE(p) \
82         do { \
83                 sig_pri_unlock_private(p); \
84                 usleep(1); \
85                 sig_pri_lock_private(p); \
86         } while (0)
87
88 static int pri_active_dchan_index(struct sig_pri_pri *pri);
89
90 static inline void pri_rel(struct sig_pri_pri *pri)
91 {
92         ast_mutex_unlock(&pri->lock);
93 }
94
95 static unsigned int PVT_TO_CHANNEL(struct sig_pri_chan *p)
96 {
97         int res = (((p)->prioffset) | ((p)->logicalspan << 8) | (p->mastertrunkgroup ? PRI_EXPLICIT : 0));
98         ast_debug(5, "prioffset: %d mastertrunkgroup: %d logicalspan: %d result: %d\n",
99                 p->prioffset, p->mastertrunkgroup, p->logicalspan, res);
100
101         return res;
102 }
103
104 static void sig_pri_handle_dchan_exception(struct sig_pri_pri *pri, int index)
105 {
106         if (pri->calls->handle_dchan_exception)
107                 pri->calls->handle_dchan_exception(pri, index);
108 }
109
110 static void sig_pri_set_dialing(struct sig_pri_chan *p, int flag)
111 {
112         if (p->calls->set_dialing)
113                 p->calls->set_dialing(p->chan_pvt, flag);
114 }
115
116 static void sig_pri_set_digital(struct sig_pri_chan *p, int flag)
117 {
118         p->digital = flag;
119         if (p->calls->set_digital)
120                 p->calls->set_digital(p->chan_pvt, flag);
121 }
122
123 /*!
124  * \internal
125  * \brief Set the caller id information in the parent module.
126  * \since 1.8
127  *
128  * \param p sig_pri channel structure.
129  *
130  * \return Nothing
131  */
132 static void sig_pri_set_caller_id(struct sig_pri_chan *p)
133 {
134         struct ast_party_caller caller;
135
136         if (p->calls->set_callerid) {
137                 ast_party_caller_init(&caller);
138                 caller.id.number = p->cid_num;
139                 caller.id.name = p->cid_name;
140                 if (!ast_strlen_zero(p->cid_subaddr)) {
141                         caller.id.subaddress.valid = 1;
142                         //caller.id.subaddress.type = 0;/* nsap */
143                         //caller.id.subaddress.odd_even_indicator = 0;
144                         caller.id.subaddress.str = p->cid_subaddr;
145                 }
146                 caller.id.number_type = p->cid_ton;
147                 caller.id.number_presentation = p->callingpres;
148                 caller.ani = p->cid_ani;
149                 caller.ani2 = p->cid_ani2;
150                 p->calls->set_callerid(p->chan_pvt, &caller);
151         }
152 }
153
154 /*!
155  * \internal
156  * \brief Set the Dialed Number Identifier.
157  * \since 1.8
158  *
159  * \param p sig_pri channel structure.
160  * \param dnid Dialed Number Identifier string.
161  *
162  * \return Nothing
163  */
164 static void sig_pri_set_dnid(struct sig_pri_chan *p, const char *dnid)
165 {
166         if (p->calls->set_dnid) {
167                 p->calls->set_dnid(p->chan_pvt, dnid);
168         }
169 }
170
171 /*!
172  * \internal
173  * \brief Set the Redirecting Directory Number Information Service (RDNIS).
174  * \since 1.8
175  *
176  * \param p sig_pri channel structure.
177  * \param rdnis Redirecting Directory Number Information Service (RDNIS) string.
178  *
179  * \return Nothing
180  */
181 static void sig_pri_set_rdnis(struct sig_pri_chan *p, const char *rdnis)
182 {
183         if (p->calls->set_rdnis) {
184                 p->calls->set_rdnis(p->chan_pvt, rdnis);
185         }
186 }
187
188 static void sig_pri_unlock_private(struct sig_pri_chan *p)
189 {
190         if (p->calls->unlock_private)
191                 p->calls->unlock_private(p->chan_pvt);
192 }
193
194 static void sig_pri_lock_private(struct sig_pri_chan *p)
195 {
196         if (p->calls->lock_private)
197                 p->calls->lock_private(p->chan_pvt);
198 }
199
200 static inline int pri_grab(struct sig_pri_chan *p, struct sig_pri_pri *pri)
201 {
202         int res;
203         /* Grab the lock first */
204         do {
205                 res = ast_mutex_trylock(&pri->lock);
206                 if (res) {
207                         PRI_DEADLOCK_AVOIDANCE(p);
208                 }
209         } while (res);
210         /* Then break the poll */
211         pthread_kill(pri->master, SIGURG);
212         return 0;
213 }
214
215 /*!
216  * \internal
217  * \brief Convert PRI redirecting reason to asterisk version.
218  * \since 1.8
219  *
220  * \param pri_reason PRI redirecting reason.
221  *
222  * \return Equivalent asterisk redirecting reason value.
223  */
224 static enum AST_REDIRECTING_REASON pri_to_ast_reason(int pri_reason)
225 {
226         enum AST_REDIRECTING_REASON ast_reason;
227
228         switch (pri_reason) {
229         case PRI_REDIR_FORWARD_ON_BUSY:
230                 ast_reason = AST_REDIRECTING_REASON_USER_BUSY;
231                 break;
232         case PRI_REDIR_FORWARD_ON_NO_REPLY:
233                 ast_reason = AST_REDIRECTING_REASON_NO_ANSWER;
234                 break;
235         case PRI_REDIR_DEFLECTION:
236                 ast_reason = AST_REDIRECTING_REASON_DEFLECTION;
237                 break;
238         case PRI_REDIR_UNCONDITIONAL:
239                 ast_reason = AST_REDIRECTING_REASON_UNCONDITIONAL;
240                 break;
241         case PRI_REDIR_UNKNOWN:
242         default:
243                 ast_reason = AST_REDIRECTING_REASON_UNKNOWN;
244                 break;
245         }
246
247         return ast_reason;
248 }
249
250 /*!
251  * \internal
252  * \brief Convert asterisk redirecting reason to PRI version.
253  * \since 1.8
254  *
255  * \param ast_reason Asterisk redirecting reason.
256  *
257  * \return Equivalent PRI redirecting reason value.
258  */
259 static int ast_to_pri_reason(enum AST_REDIRECTING_REASON ast_reason)
260 {
261         int pri_reason;
262
263         switch (ast_reason) {
264         case AST_REDIRECTING_REASON_USER_BUSY:
265                 pri_reason = PRI_REDIR_FORWARD_ON_BUSY;
266                 break;
267         case AST_REDIRECTING_REASON_NO_ANSWER:
268                 pri_reason = PRI_REDIR_FORWARD_ON_NO_REPLY;
269                 break;
270         case AST_REDIRECTING_REASON_UNCONDITIONAL:
271                 pri_reason = PRI_REDIR_UNCONDITIONAL;
272                 break;
273         case AST_REDIRECTING_REASON_DEFLECTION:
274                 pri_reason = PRI_REDIR_DEFLECTION;
275                 break;
276         case AST_REDIRECTING_REASON_UNKNOWN:
277         default:
278                 pri_reason = PRI_REDIR_UNKNOWN;
279                 break;
280         }
281
282         return pri_reason;
283 }
284
285 /*!
286  * \internal
287  * \brief Convert PRI number presentation to asterisk version.
288  * \since 1.8
289  *
290  * \param pri_presentation PRI number presentation.
291  *
292  * \return Equivalent asterisk number presentation value.
293  */
294 static int pri_to_ast_presentation(int pri_presentation)
295 {
296         int ast_presentation;
297
298         switch (pri_presentation) {
299         case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
300                 ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
301                 break;
302         case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
303                 ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
304                 break;
305         case PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
306                 ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN;
307                 break;
308         case PRES_ALLOWED_NETWORK_NUMBER:
309                 ast_presentation = AST_PRES_ALLOWED_NETWORK_NUMBER;
310                 break;
311         case PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
312                 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
313                 break;
314         case PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
315                 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN;
316                 break;
317         case PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
318                 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN;
319                 break;
320         case PRES_PROHIB_NETWORK_NUMBER:
321                 ast_presentation = AST_PRES_PROHIB_NETWORK_NUMBER;
322                 break;
323         case PRES_NUMBER_NOT_AVAILABLE:
324                 ast_presentation = AST_PRES_NUMBER_NOT_AVAILABLE;
325                 break;
326         default:
327                 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
328                 break;
329         }
330
331         return ast_presentation;
332 }
333
334 /*!
335  * \internal
336  * \brief Convert asterisk number presentation to PRI version.
337  * \since 1.8
338  *
339  * \param ast_presentation Asterisk number presentation.
340  *
341  * \return Equivalent PRI number presentation value.
342  */
343 static int ast_to_pri_presentation(int ast_presentation)
344 {
345         int pri_presentation;
346
347         switch (ast_presentation) {
348         case AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
349                 pri_presentation = PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
350                 break;
351         case AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
352                 pri_presentation = PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
353                 break;
354         case AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
355                 pri_presentation = PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN;
356                 break;
357         case AST_PRES_ALLOWED_NETWORK_NUMBER:
358                 pri_presentation = PRES_ALLOWED_NETWORK_NUMBER;
359                 break;
360         case AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
361                 pri_presentation = PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
362                 break;
363         case AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
364                 pri_presentation = PRES_PROHIB_USER_NUMBER_PASSED_SCREEN;
365                 break;
366         case AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
367                 pri_presentation = PRES_PROHIB_USER_NUMBER_FAILED_SCREEN;
368                 break;
369         case AST_PRES_PROHIB_NETWORK_NUMBER:
370                 pri_presentation = PRES_PROHIB_NETWORK_NUMBER;
371                 break;
372         case AST_PRES_NUMBER_NOT_AVAILABLE:
373                 pri_presentation = PRES_NUMBER_NOT_AVAILABLE;
374                 break;
375         default:
376                 pri_presentation = PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
377                 break;
378         }
379
380         return pri_presentation;
381 }
382
383 /*!
384  * \internal
385  * \brief Determine the overall presentation value for the given party.
386  * \since 1.8
387  *
388  * \param id Party to determine the overall presentation value.
389  *
390  * \return Overall presentation value for the given party converted to ast values.
391  */
392 static int overall_ast_presentation(const struct pri_party_id *id)
393 {
394         int number_priority;
395         int number_value;
396         int number_screening;
397         int name_priority;
398         int name_value;
399
400         /* Determine name presentation priority. */
401         if (!id->name.valid) {
402                 name_value = PRI_PRES_UNAVAILABLE;
403                 name_priority = 3;
404         } else {
405                 name_value = id->name.presentation & PRI_PRES_RESTRICTION;
406                 switch (name_value) {
407                 case PRI_PRES_RESTRICTED:
408                         name_priority = 0;
409                         break;
410                 case PRI_PRES_ALLOWED:
411                         name_priority = 1;
412                         break;
413                 case PRI_PRES_UNAVAILABLE:
414                         name_priority = 2;
415                         break;
416                 default:
417                         name_value = PRI_PRES_UNAVAILABLE;
418                         name_priority = 3;
419                         break;
420                 }
421         }
422
423         /* Determine number presentation priority. */
424         if (!id->number.valid) {
425                 number_screening = PRI_PRES_USER_NUMBER_UNSCREENED;
426                 number_value = PRI_PRES_UNAVAILABLE;
427                 number_priority = 3;
428         } else {
429                 number_screening = id->number.presentation & PRI_PRES_NUMBER_TYPE;
430                 number_value = id->number.presentation & PRI_PRES_RESTRICTION;
431                 switch (number_value) {
432                 case PRI_PRES_RESTRICTED:
433                         number_priority = 0;
434                         break;
435                 case PRI_PRES_ALLOWED:
436                         number_priority = 1;
437                         break;
438                 case PRI_PRES_UNAVAILABLE:
439                         number_priority = 2;
440                         break;
441                 default:
442                         number_screening = PRI_PRES_USER_NUMBER_UNSCREENED;
443                         number_value = PRI_PRES_UNAVAILABLE;
444                         number_priority = 3;
445                         break;
446                 }
447         }
448
449         /* Select the wining presentation value. */
450         if (name_priority < number_priority) {
451                 number_value = name_value;
452         }
453
454         return pri_to_ast_presentation(number_value | number_screening);
455 }
456
457 #if defined(HAVE_PRI_SUBADDR)
458 /*!
459  * \internal
460  * \brief Fill in the asterisk party subaddress from the given PRI party subaddress.
461  * \since 1.8
462  *
463  * \param ast_subaddress Asterisk party subaddress structure.
464  * \param pri_subaddress PRI party subaddress structure.
465  *
466  * \return Nothing
467  *
468  */
469 static void sig_pri_set_subaddress(struct ast_party_subaddress *ast_subaddress, const struct pri_party_subaddress *pri_subaddress)
470 {
471         char *cnum, *ptr;
472         int x, len;
473
474         if (ast_subaddress->str) {
475                 ast_free(ast_subaddress->str);
476         }
477         if (pri_subaddress->length <= 0) {
478                 ast_party_subaddress_init(ast_subaddress);
479                 return;
480         }
481
482         if (!pri_subaddress->type) {
483                 /* NSAP */
484                 ast_subaddress->str = ast_strdup((char *) pri_subaddress->data);
485         } else {
486                 /* User Specified */
487                 if (!(cnum = ast_malloc(2 * pri_subaddress->length + 1))) {
488                         ast_party_subaddress_init(ast_subaddress);
489                         return;
490                 }
491
492                 ptr = cnum;
493                 len = pri_subaddress->length - 1; /* -1 account for zero based indexing */
494                 for (x = 0; x < len; ++x) {
495                         ptr += sprintf(ptr, "%02x", pri_subaddress->data[x]);
496                 }
497
498                 if (pri_subaddress->odd_even_indicator) {
499                         /* ODD */
500                         sprintf(ptr, "%01x", (pri_subaddress->data[len]) >> 4);
501                 } else {
502                         /* EVEN */
503                         sprintf(ptr, "%02x", pri_subaddress->data[len]);
504                 }
505                 ast_subaddress->str = cnum;
506         }
507         ast_subaddress->type = pri_subaddress->type;
508         ast_subaddress->odd_even_indicator = pri_subaddress->odd_even_indicator;
509         ast_subaddress->valid = 1;
510 }
511 #endif  /* defined(HAVE_PRI_SUBADDR) */
512
513 #if defined(HAVE_PRI_SUBADDR)
514 static unsigned char ast_pri_pack_hex_char(char c)
515 {
516         unsigned char res;
517
518         if (c < '0') {
519                 res = 0;
520         } else if (c < ('9' + 1)) {
521                 res = c - '0';
522         } else if (c < 'A') {
523                 res = 0;
524         } else if (c < ('F' + 1)) {
525                 res = c - 'A' + 10;
526         } else if (c < 'a') {
527                 res = 0;
528         } else if (c < ('f' + 1)) {
529                 res = c - 'a' + 10;
530         } else {
531                 res = 0;
532         }
533         return res;
534 }
535 #endif  /* defined(HAVE_PRI_SUBADDR) */
536
537 #if defined(HAVE_PRI_SUBADDR)
538 /*!
539  * \internal
540  * \brief Convert a null terminated hexadecimal string to a packed hex byte array.
541  * \details left justified, with 0 padding if odd length.
542  * \since 1.8
543  *
544  * \param dst pointer to packed byte array.
545  * \param src pointer to null terminated hexadecimal string.
546  * \param maxlen destination array size.
547  *
548  * \return Length of byte array
549  *
550  * \note The dst is not an ASCIIz string.
551  * \note The src is an ASCIIz hex string.
552  */
553 static int ast_pri_pack_hex_string(unsigned char *dst, char *src, int maxlen)
554 {
555         int res = 0;
556         int len = strlen(src);
557
558         if (len > (2 * maxlen)) {
559                 len = 2 * maxlen;
560         }
561
562         res = len / 2 + len % 2;
563
564         while (len > 1) {
565                 *dst = ast_pri_pack_hex_char(*src) << 4;
566                 src++;
567                 *dst |= ast_pri_pack_hex_char(*src);
568                 dst++, src++;
569                 len -= 2;
570         }
571         if (len) { /* 1 left */
572                 *dst = ast_pri_pack_hex_char(*src) << 4;
573         }
574         return res;
575 }
576 #endif  /* defined(HAVE_PRI_SUBADDR) */
577
578 #if defined(HAVE_PRI_SUBADDR)
579 /*!
580  * \internal
581  * \brief Fill in the PRI party subaddress from the given asterisk party subaddress.
582  * \since 1.8
583  *
584  * \param pri_subaddress PRI party subaddress structure.
585  * \param ast_subaddress Asterisk party subaddress structure.
586  *
587  * \return Nothing
588  *
589  * \note Assumes that pri_subaddress has been previously memset to zero.
590  */
591 static void sig_pri_party_subaddress_from_ast(struct pri_party_subaddress *pri_subaddress, const struct ast_party_subaddress *ast_subaddress)
592 {
593         if (ast_subaddress->valid && !ast_strlen_zero(ast_subaddress->str)) {
594                 pri_subaddress->type = ast_subaddress->type;
595                 if (!ast_subaddress->type) {
596                         /* 0 = NSAP */
597                         ast_copy_string((char *) pri_subaddress->data, ast_subaddress->str,
598                                 sizeof(pri_subaddress->data));
599                         pri_subaddress->length = strlen((char *) pri_subaddress->data);
600                         pri_subaddress->odd_even_indicator = 0;
601                         pri_subaddress->valid = 1;
602                 } else {
603                         /* 2 = User Specified */
604                         /*
605                          * Copy HexString to packed HexData,
606                          * if odd length then right pad trailing byte with 0
607                          */
608                         int length = ast_pri_pack_hex_string(pri_subaddress->data,
609                                 ast_subaddress->str, sizeof(pri_subaddress->data));
610
611                         pri_subaddress->length = length;
612                         pri_subaddress->odd_even_indicator = (length & 1);
613                         pri_subaddress->valid = 1;
614                 }
615         }
616 }
617 #endif  /* defined(HAVE_PRI_SUBADDR) */
618
619 /*!
620  * \internal
621  * \brief Fill in the PRI party id from the given asterisk party id.
622  * \since 1.8
623  *
624  * \param pri_id PRI party id structure.
625  * \param ast_id Asterisk party id structure.
626  *
627  * \return Nothing
628  *
629  * \note Assumes that pri_id has been previously memset to zero.
630  */
631 static void sig_pri_party_id_from_ast(struct pri_party_id *pri_id, const struct ast_party_id *ast_id)
632 {
633         int presentation;
634
635         presentation = ast_to_pri_presentation(ast_id->number_presentation);
636         if (!ast_strlen_zero(ast_id->name)) {
637                 pri_id->name.valid = 1;
638                 pri_id->name.presentation = presentation;
639                 pri_id->name.char_set = PRI_CHAR_SET_ISO8859_1;
640                 ast_copy_string(pri_id->name.str, ast_id->name, sizeof(pri_id->name.str));
641         }
642         if (!ast_strlen_zero(ast_id->number)) {
643                 pri_id->number.valid = 1;
644                 pri_id->number.presentation = presentation;
645                 pri_id->number.plan = ast_id->number_type;
646                 ast_copy_string(pri_id->number.str, ast_id->number, sizeof(pri_id->number.str));
647         }
648 #if defined(HAVE_PRI_SUBADDR)
649         sig_pri_party_subaddress_from_ast(&pri_id->subaddress, &ast_id->subaddress);
650 #endif  /* defined(HAVE_PRI_SUBADDR) */
651 }
652
653 /*!
654  * \internal
655  * \brief Update the PRI redirecting information for the current call.
656  * \since 1.8
657  *
658  * \param pvt sig_pri private channel structure.
659  * \param ast Asterisk channel
660  *
661  * \return Nothing
662  *
663  * \note Assumes that the PRI lock is already obtained.
664  */
665 static void sig_pri_redirecting_update(struct sig_pri_chan *pvt, struct ast_channel *ast)
666 {
667         struct pri_party_redirecting pri_redirecting;
668         struct ast_party_redirecting ast_redirecting;
669
670         /* Gather asterisk redirecting data */
671         ast_redirecting = ast->redirecting;
672         ast_redirecting.from.number = ast->cid.cid_rdnis;
673
674 /*! \todo XXX Original called data can be put in a channel data store that is inherited. */
675
676         memset(&pri_redirecting, 0, sizeof(pri_redirecting));
677         sig_pri_party_id_from_ast(&pri_redirecting.from, &ast_redirecting.from);
678         sig_pri_party_id_from_ast(&pri_redirecting.to, &ast_redirecting.to);
679         pri_redirecting.count = ast_redirecting.count;
680         pri_redirecting.reason = ast_to_pri_reason(ast_redirecting.reason);
681
682         pri_redirecting_update(pvt->pri->pri, pvt->call, &pri_redirecting);
683 }
684
685 /*!
686  * \internal
687  * \brief Reset DTMF detector.
688  * \since 1.8
689  *
690  * \param p sig_pri channel structure.
691  *
692  * \return Nothing
693  */
694 static void sig_pri_dsp_reset_and_flush_digits(struct sig_pri_chan *p)
695 {
696         if (p->calls->dsp_reset_and_flush_digits) {
697                 p->calls->dsp_reset_and_flush_digits(p->chan_pvt);
698         }
699 }
700
701 static int sig_pri_set_echocanceller(struct sig_pri_chan *p, int enable)
702 {
703         if (p->calls->set_echocanceller)
704                 return p->calls->set_echocanceller(p->chan_pvt, enable);
705         else
706                 return -1;
707 }
708
709 static void sig_pri_fixup_chans(struct sig_pri_chan *old_chan, struct sig_pri_chan *new_chan)
710 {
711         if (old_chan->calls->fixup_chans)
712                 old_chan->calls->fixup_chans(old_chan->chan_pvt, new_chan->chan_pvt);
713 }
714
715 static int sig_pri_play_tone(struct sig_pri_chan *p, enum sig_pri_tone tone)
716 {
717         if (p->calls->play_tone)
718                 return p->calls->play_tone(p->chan_pvt, tone);
719         else
720                 return -1;
721 }
722
723 static struct ast_channel *sig_pri_new_ast_channel(struct sig_pri_chan *p, int state, int startpbx, int ulaw, int transfercapability, char *exten, const struct ast_channel *requestor)
724 {
725         struct ast_channel *c;
726
727         if (p->calls->new_ast_channel)
728                 c = p->calls->new_ast_channel(p->chan_pvt, state, startpbx, ulaw, transfercapability, exten, requestor);
729         else
730                 return NULL;
731
732         if (!p->owner)
733                 p->owner = c;
734         p->isidlecall = 0;
735         p->alreadyhungup = 0;
736         if (transfercapability & AST_TRANS_CAP_DIGITAL) {
737                 c->transfercapability = transfercapability;
738                 pbx_builtin_setvar_helper(c, "TRANSFERCAPABILITY", ast_transfercapability2str(transfercapability));
739                 sig_pri_set_digital(p, 1);
740         }
741
742         return c;
743 }
744
745 struct ast_channel *sig_pri_request(struct sig_pri_chan *p, enum sig_pri_law law, const struct ast_channel *requestor, int transfercapability)
746 {
747         struct ast_channel *ast;
748
749         ast_log(LOG_DEBUG, "%s %d\n", __FUNCTION__, p->channel);
750
751         p->outgoing = 1;
752         ast = sig_pri_new_ast_channel(p, AST_STATE_RESERVED, 0, law, transfercapability, p->exten, requestor);
753         if (!ast) {
754                 p->outgoing = 0;
755         }
756         return ast;
757 }
758
759 int pri_is_up(struct sig_pri_pri *pri)
760 {
761         int x;
762         for (x = 0; x < NUM_DCHANS; x++) {
763                 if (pri->dchanavail[x] == DCHAN_AVAILABLE)
764                         return 1;
765         }
766         return 0;
767 }
768
769 static char *pri_order(int level)
770 {
771         switch (level) {
772         case 0:
773                 return "Primary";
774         case 1:
775                 return "Secondary";
776         case 2:
777                 return "Tertiary";
778         case 3:
779                 return "Quaternary";
780         default:
781                 return "<Unknown>";
782         }
783 }
784
785 /* Returns index of the active dchan */
786 static int pri_active_dchan_index(struct sig_pri_pri *pri)
787 {
788         int x;
789
790         for (x = 0; x < NUM_DCHANS; x++) {
791                 if ((pri->dchans[x] == pri->pri))
792                         return x;
793         }
794
795         ast_log(LOG_WARNING, "No active dchan found!\n");
796         return -1;
797 }
798
799 static int pri_find_dchan(struct sig_pri_pri *pri)
800 {
801         int oldslot = -1;
802         struct pri *old;
803         int newslot = -1;
804         int x;
805         old = pri->pri;
806         for (x = 0; x < NUM_DCHANS; x++) {
807                 if ((pri->dchanavail[x] == DCHAN_AVAILABLE) && (newslot < 0))
808                         newslot = x;
809                 if (pri->dchans[x] == old) {
810                         oldslot = x;
811                 }
812         }
813         if (newslot < 0) {
814                 newslot = 0;
815                 /* This is annoying to see on non persistent layer 2 connections.  Let's not complain in that case */
816                 if (pri->sig != SIG_BRI_PTMP) {
817                         ast_log(LOG_WARNING, "No D-channels available!  Using Primary channel as D-channel anyway!\n");
818                 }
819         }
820         if (old && (oldslot != newslot))
821                 ast_log(LOG_NOTICE, "Switching from d-channel fd %d to fd %d!\n",
822                         pri->fds[oldslot], pri->fds[newslot]);
823         pri->pri = pri->dchans[newslot];
824         return 0;
825 }
826
827 static void pri_queue_frame(struct sig_pri_chan *p, struct ast_frame *f, struct sig_pri_pri *pri)
828 {
829         /* We must unlock the PRI to avoid the possibility of a deadlock */
830         if (pri)
831                 ast_mutex_unlock(&pri->lock);
832         for (;;) {
833                 if (p->owner) {
834                         if (ast_channel_trylock(p->owner)) {
835                                 PRI_DEADLOCK_AVOIDANCE(p);
836                         } else {
837                                 ast_queue_frame(p->owner, f);
838                                 ast_channel_unlock(p->owner);
839                                 break;
840                         }
841                 } else
842                         break;
843         }
844         if (pri)
845                 ast_mutex_lock(&pri->lock);
846 }
847
848 static void pri_queue_control(struct sig_pri_chan *p, int subclass, struct sig_pri_pri *pri)
849 {
850         struct ast_frame f = {AST_FRAME_CONTROL, };
851
852         if (p->calls->queue_control) {
853                 p->calls->queue_control(p->chan_pvt, subclass);
854         }
855
856         f.subclass.integer = subclass;
857         pri_queue_frame(p, &f, pri);
858 }
859
860 static int pri_find_principle(struct sig_pri_pri *pri, int channel, q931_call *call)
861 {
862         int x;
863         int span;
864         int principle;
865
866         if (channel < 0) {
867                 /* Channel is not picked yet. */
868                 return -1;
869         }
870
871         if (channel & PRI_HELD_CALL) {
872                 if (!call) {
873                         /* Cannot find a held call without a call. */
874                         return -1;
875                 }
876                 principle = -1;
877                 for (x = 0; x < pri->numchans; ++x) {
878                         if (pri->pvts[x]
879                                 && pri->pvts[x]->call == call) {
880                                 principle = x;
881                                 break;
882                         }
883                 }
884                 return principle;
885         }
886
887         span = PRI_SPAN(channel);
888         if (!(channel & PRI_EXPLICIT)) {
889                 int index;
890
891                 index = pri_active_dchan_index(pri);
892                 if (index == -1) {
893                         return -1;
894                 }
895                 span = pri->dchan_logical_span[index];
896         }
897
898         channel = PRI_CHANNEL(channel);
899         principle = -1;
900         for (x = 0; x < pri->numchans; x++) {
901                 if (pri->pvts[x]
902                         && pri->pvts[x]->prioffset == channel
903                         && pri->pvts[x]->logicalspan == span
904                         && !pri->pvts[x]->no_b_channel) {
905                         principle = x;
906                         break;
907                 }
908         }
909
910         return principle;
911 }
912
913 static int pri_fixup_principle(struct sig_pri_pri *pri, int principle, q931_call *call)
914 {
915         int x;
916
917         if (principle < 0 || pri->numchans <= principle) {
918                 /* Out of rannge */
919                 return -1;
920         }
921         if (!call) {
922                 /* No call */
923                 return principle;
924         }
925         if (pri->pvts[principle] && pri->pvts[principle]->call == call) {
926                 /* Call is already on the specified principle. */
927                 return principle;
928         }
929
930         /* Find the old principle location. */
931         for (x = 0; x < pri->numchans; x++) {
932                 struct sig_pri_chan *new_chan;
933                 struct sig_pri_chan *old_chan;
934
935                 if (!pri->pvts[x] || pri->pvts[x]->call != call) {
936                         continue;
937                 }
938
939                 /* Found our call */
940                 new_chan = pri->pvts[principle];
941                 old_chan = pri->pvts[x];
942
943                 ast_verb(3, "Moving call from channel %d to channel %d\n",
944                         old_chan->channel, new_chan->channel);
945                 if (new_chan->owner) {
946                         ast_log(LOG_WARNING,
947                                 "Can't fix up channel from %d to %d because %d is already in use\n",
948                                 old_chan->channel, new_chan->channel, new_chan->channel);
949                         return -1;
950                 }
951
952                 sig_pri_fixup_chans(old_chan, new_chan);
953
954                 /* Fix it all up now */
955                 new_chan->owner = old_chan->owner;
956                 old_chan->owner = NULL;
957
958                 new_chan->call = old_chan->call;
959                 old_chan->call = NULL;
960
961                 /* Transfer flags from the old channel. */
962                 new_chan->alerting = old_chan->alerting;
963                 new_chan->alreadyhungup = old_chan->alreadyhungup;
964                 new_chan->isidlecall = old_chan->isidlecall;
965                 new_chan->proceeding = old_chan->proceeding;
966                 new_chan->progress = old_chan->progress;
967                 new_chan->setup_ack = old_chan->setup_ack;
968                 new_chan->outgoing = old_chan->outgoing;
969                 new_chan->digital = old_chan->digital;
970                 old_chan->alerting = 0;
971                 old_chan->alreadyhungup = 0;
972                 old_chan->isidlecall = 0;
973                 old_chan->proceeding = 0;
974                 old_chan->progress = 0;
975                 old_chan->setup_ack = 0;
976                 old_chan->outgoing = 0;
977                 old_chan->digital = 0;
978
979                 /* More stuff to transfer to the new channel. */
980 #if defined(HAVE_PRI_REVERSE_CHARGE)
981                 new_chan->reverse_charging_indication = old_chan->reverse_charging_indication;
982 #endif  /* defined(HAVE_PRI_REVERSE_CHARGE) */
983 #if defined(HAVE_PRI_SETUP_KEYPAD)
984                 strcpy(new_chan->keypad_digits, old_chan->keypad_digits);
985 #endif  /* defined(HAVE_PRI_SETUP_KEYPAD) */
986
987                 if (new_chan->no_b_channel) {
988                         /* Copy the real channel configuration to the no B channel interface. */
989                         new_chan->hidecallerid = old_chan->hidecallerid;
990                         new_chan->hidecalleridname = old_chan->hidecalleridname;
991                         new_chan->immediate = old_chan->immediate;
992                         new_chan->priexclusive = old_chan->priexclusive;
993                         new_chan->priindication_oob = old_chan->priindication_oob;
994                         new_chan->use_callerid = old_chan->use_callerid;
995                         new_chan->use_callingpres = old_chan->use_callingpres;
996                         new_chan->stripmsd = old_chan->stripmsd;
997                         strcpy(new_chan->context, old_chan->context);
998                         strcpy(new_chan->mohinterpret, old_chan->mohinterpret);
999
1000                         /* Become a member of the old channel span/trunk-group. */
1001                         new_chan->logicalspan = old_chan->logicalspan;
1002                         new_chan->mastertrunkgroup = old_chan->mastertrunkgroup;
1003                 }
1004
1005                 return principle;
1006         }
1007         ast_log(LOG_WARNING, "Call specified, but not found?\n");
1008         return -1;
1009 }
1010
1011 static char * redirectingreason2str(int redirectingreason)
1012 {
1013         switch (redirectingreason) {
1014         case 0:
1015                 return "UNKNOWN";
1016         case 1:
1017                 return "BUSY";
1018         case 2:
1019                 return "NO_REPLY";
1020         case 0xF:
1021                 return "UNCONDITIONAL";
1022         default:
1023                 return "NOREDIRECT";
1024         }
1025 }
1026
1027 static char *dialplan2str(int dialplan)
1028 {
1029         if (dialplan == -1) {
1030                 return("Dynamically set dialplan in ISDN");
1031         }
1032         return (pri_plan2str(dialplan));
1033 }
1034
1035 static void apply_plan_to_number(char *buf, size_t size, const struct sig_pri_pri *pri, const char *number, const int plan)
1036 {
1037         switch (plan) {
1038         case PRI_INTERNATIONAL_ISDN:            /* Q.931 dialplan == 0x11 international dialplan => prepend international prefix digits */
1039                 snprintf(buf, size, "%s%s", pri->internationalprefix, number);
1040                 break;
1041         case PRI_NATIONAL_ISDN:                 /* Q.931 dialplan == 0x21 national dialplan => prepend national prefix digits */
1042                 snprintf(buf, size, "%s%s", pri->nationalprefix, number);
1043                 break;
1044         case PRI_LOCAL_ISDN:                    /* Q.931 dialplan == 0x41 local dialplan => prepend local prefix digits */
1045                 snprintf(buf, size, "%s%s", pri->localprefix, number);
1046                 break;
1047         case PRI_PRIVATE:                       /* Q.931 dialplan == 0x49 private dialplan => prepend private prefix digits */
1048                 snprintf(buf, size, "%s%s", pri->privateprefix, number);
1049                 break;
1050         case PRI_UNKNOWN:                       /* Q.931 dialplan == 0x00 unknown dialplan => prepend unknown prefix digits */
1051                 snprintf(buf, size, "%s%s", pri->unknownprefix, number);
1052                 break;
1053         default:                                /* other Q.931 dialplan => don't twiddle with callingnum */
1054                 snprintf(buf, size, "%s", number);
1055                 break;
1056         }
1057 }
1058
1059 /*! \note Assumes the pri->lock is already obtained. */
1060 static int pri_check_restart(struct sig_pri_pri *pri)
1061 {
1062 #if defined(HAVE_PRI_SERVICE_MESSAGES)
1063 tryanotherpos:
1064 #endif  /* defined(HAVE_PRI_SERVICE_MESSAGES) */
1065         do {
1066                 pri->resetpos++;
1067         } while (pri->resetpos < pri->numchans
1068                 && (!pri->pvts[pri->resetpos]
1069                         || pri->pvts[pri->resetpos]->no_b_channel
1070                         || pri->pvts[pri->resetpos]->call
1071                         || pri->pvts[pri->resetpos]->resetting));
1072         if (pri->resetpos < pri->numchans) {
1073 #if defined(HAVE_PRI_SERVICE_MESSAGES)
1074                 unsigned why;
1075
1076                 why = pri->pvts[pri->resetpos]->service_status;
1077                 if (why) {
1078                         ast_log(LOG_NOTICE, "span '%d' channel '%d' out-of-service (reason: %s), not sending RESTART\n", pri->span,
1079                                 pri->pvts[pri->resetpos]->channel, (why & SRVST_FAREND) ? (why & SRVST_NEAREND) ? "both ends" : "far end" : "near end");
1080                         goto tryanotherpos;
1081                 }
1082 #endif  /* defined(HAVE_PRI_SERVICE_MESSAGES) */
1083
1084                 /* Mark the channel as resetting and restart it */
1085                 pri->pvts[pri->resetpos]->resetting = 1;
1086                 pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[pri->resetpos]));
1087         } else {
1088                 pri->resetting = 0;
1089                 time(&pri->lastreset);
1090         }
1091         return 0;
1092 }
1093
1094 static int pri_find_empty_chan(struct sig_pri_pri *pri, int backwards)
1095 {
1096         int x;
1097         if (backwards)
1098                 x = pri->numchans;
1099         else
1100                 x = 0;
1101         for (;;) {
1102                 if (backwards && (x < 0))
1103                         break;
1104                 if (!backwards && (x >= pri->numchans))
1105                         break;
1106                 if (pri->pvts[x]
1107                         && !pri->pvts[x]->no_b_channel
1108                         && !pri->pvts[x]->inalarm
1109                         && !pri->pvts[x]->owner) {
1110                         ast_debug(1, "Found empty available channel %d/%d\n",
1111                                 pri->pvts[x]->logicalspan, pri->pvts[x]->prioffset);
1112                         return x;
1113                 }
1114                 if (backwards)
1115                         x--;
1116                 else
1117                         x++;
1118         }
1119         return -1;
1120 }
1121
1122 #if defined(HAVE_PRI_CALL_HOLD)
1123 /*!
1124  * \internal
1125  * \brief Find or create an empty no-B-channel interface to use.
1126  * \since 1.8
1127  *
1128  * \param pri sig_pri span controller to find interface.
1129  *
1130  * \note Assumes the pri->lock is already obtained.
1131  *
1132  * \retval array-index into private pointer array on success.
1133  * \retval -1 on error.
1134  */
1135 static int pri_find_empty_nobch(struct sig_pri_pri *pri)
1136 {
1137         int idx;
1138
1139         for (idx = 0; idx < pri->numchans; ++idx) {
1140                 if (pri->pvts[idx]
1141                         && pri->pvts[idx]->no_b_channel
1142                         && !pri->pvts[idx]->inalarm
1143                         && !pri->pvts[idx]->owner) {
1144                         ast_debug(1, "Found empty available no B channel interface\n");
1145                         return idx;
1146                 }
1147         }
1148
1149         /* Need to create a new interface. */
1150         if (pri->calls->new_nobch_intf) {
1151                 idx = pri->calls->new_nobch_intf(pri);
1152         } else {
1153                 idx = -1;
1154         }
1155         return idx;
1156 }
1157 #endif  /* defined(HAVE_PRI_CALL_HOLD) */
1158
1159 #if defined(HAVE_PRI_CALL_HOLD)
1160 /*!
1161  * \internal
1162  * \brief Find the channel associated with the libpri call.
1163  * \since 1.8
1164  *
1165  * \param pri sig_pri span controller to find interface.
1166  * \param call LibPRI opaque call pointer to find.
1167  *
1168  * \note Assumes the pri->lock is already obtained.
1169  *
1170  * \retval array-index into private pointer array on success.
1171  * \retval -1 on error.
1172  */
1173 static int pri_find_pri_call(struct sig_pri_pri *pri, q931_call *call)
1174 {
1175         int idx;
1176
1177         for (idx = 0; idx < pri->numchans; ++idx) {
1178                 if (pri->pvts[idx] && pri->pvts[idx]->call == call) {
1179                         /* Found the channel */
1180                         return idx;
1181                 }
1182         }
1183         return -1;
1184 }
1185 #endif  /* defined(HAVE_PRI_CALL_HOLD) */
1186
1187 static void *do_idle_thread(void *v_pvt)
1188 {
1189         struct sig_pri_chan *pvt = v_pvt;
1190         struct ast_channel *chan = pvt->owner;
1191         struct ast_frame *f;
1192         char ex[80];
1193         /* Wait up to 30 seconds for an answer */
1194         int newms, ms = 30000;
1195
1196         ast_verb(3, "Initiating idle call on channel %s\n", chan->name);
1197         snprintf(ex, sizeof(ex), "%d/%s", pvt->channel, pvt->pri->idledial);
1198         if (ast_call(chan, ex, 0)) {
1199                 ast_log(LOG_WARNING, "Idle dial failed on '%s' to '%s'\n", chan->name, ex);
1200                 ast_hangup(chan);
1201                 return NULL;
1202         }
1203         while ((newms = ast_waitfor(chan, ms)) > 0) {
1204                 f = ast_read(chan);
1205                 if (!f) {
1206                         /* Got hangup */
1207                         break;
1208                 }
1209                 if (f->frametype == AST_FRAME_CONTROL) {
1210                         switch (f->subclass.integer) {
1211                         case AST_CONTROL_ANSWER:
1212                                 /* Launch the PBX */
1213                                 ast_copy_string(chan->exten, pvt->pri->idleext, sizeof(chan->exten));
1214                                 ast_copy_string(chan->context, pvt->pri->idlecontext, sizeof(chan->context));
1215                                 chan->priority = 1;
1216                                 ast_verb(4, "Idle channel '%s' answered, sending to %s@%s\n", chan->name, chan->exten, chan->context);
1217                                 ast_pbx_run(chan);
1218                                 /* It's already hungup, return immediately */
1219                                 return NULL;
1220                         case AST_CONTROL_BUSY:
1221                                 ast_verb(4, "Idle channel '%s' busy, waiting...\n", chan->name);
1222                                 break;
1223                         case AST_CONTROL_CONGESTION:
1224                                 ast_verb(4, "Idle channel '%s' congested, waiting...\n", chan->name);
1225                                 break;
1226                         };
1227                 }
1228                 ast_frfree(f);
1229                 ms = newms;
1230         }
1231         /* Hangup the channel since nothing happend */
1232         ast_hangup(chan);
1233         return NULL;
1234 }
1235
1236 static void *pri_ss_thread(void *data)
1237 {
1238         struct sig_pri_chan *p = data;
1239         struct ast_channel *chan = p->owner;
1240         char exten[AST_MAX_EXTENSION];
1241         int res;
1242         int len;
1243         int timeout;
1244
1245         if (!chan) {
1246                 /* We lost the owner before we could get started. */
1247                 return NULL;
1248         }
1249
1250         /*
1251          * In the bizarre case where the channel has become a zombie before we
1252          * even get started here, abort safely.
1253          */
1254         if (!chan->tech_pvt) {
1255                 ast_log(LOG_WARNING, "Channel became a zombie before simple switch could be started (%s)\n", chan->name);
1256                 ast_hangup(chan);
1257                 return NULL;
1258         }
1259
1260         ast_verb(3, "Starting simple switch on '%s'\n", chan->name);
1261
1262         sig_pri_dsp_reset_and_flush_digits(p);
1263
1264         /* Now loop looking for an extension */
1265         ast_copy_string(exten, p->exten, sizeof(exten));
1266         len = strlen(exten);
1267         res = 0;
1268         while ((len < AST_MAX_EXTENSION-1) && ast_matchmore_extension(chan, chan->context, exten, 1, p->cid_num)) {
1269                 if (len && !ast_ignore_pattern(chan->context, exten))
1270                         sig_pri_play_tone(p, -1);
1271                 else
1272                         sig_pri_play_tone(p, SIG_PRI_TONE_DIALTONE);
1273                 if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num))
1274                         timeout = pri_matchdigittimeout;
1275                 else
1276                         timeout = pri_gendigittimeout;
1277                 res = ast_waitfordigit(chan, timeout);
1278                 if (res < 0) {
1279                         ast_log(LOG_DEBUG, "waitfordigit returned < 0...\n");
1280                         ast_hangup(chan);
1281                         return NULL;
1282                 } else if (res) {
1283                         exten[len++] = res;
1284                         exten[len] = '\0';
1285                 } else
1286                         goto exit;
1287         }
1288         /* if no extension was received ('unspecified') on overlap call, use the 's' extension */
1289         if (ast_strlen_zero(exten)) {
1290                 ast_verb(3, "Going to extension s|1 because of empty extension received on overlap call\n");
1291                 exten[0] = 's';
1292                 exten[1] = '\0';
1293         } else {
1294                 if (chan->cid.cid_dnid) {
1295                         ast_free(chan->cid.cid_dnid);
1296                 }
1297                 chan->cid.cid_dnid = ast_strdup(exten);
1298         }
1299         sig_pri_play_tone(p, -1);
1300         if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num)) {
1301                 /* Start the real PBX */
1302                 ast_copy_string(chan->exten, exten, sizeof(chan->exten));
1303                 sig_pri_dsp_reset_and_flush_digits(p);
1304                 if (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) {
1305                         if (p->pri->pri) {              
1306                                 if (!pri_grab(p, p->pri)) {
1307                                         pri_proceeding(p->pri->pri, p->call, PVT_TO_CHANNEL(p), 0);
1308                                         p->proceeding = 1;
1309                                         pri_rel(p->pri);
1310                                 } else {
1311                                         ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->pri->span);
1312                                 }
1313                         }
1314                 }
1315
1316                 sig_pri_set_echocanceller(p, 1);
1317                 ast_setstate(chan, AST_STATE_RING);
1318                 res = ast_pbx_run(chan);
1319                 if (res) {
1320                         ast_log(LOG_WARNING, "PBX exited non-zero!\n");
1321                 }
1322         } else {
1323                 ast_log(LOG_DEBUG, "No such possible extension '%s' in context '%s'\n", exten, chan->context);
1324                 chan->hangupcause = AST_CAUSE_UNALLOCATED;
1325                 ast_hangup(chan);
1326                 p->exten[0] = '\0';
1327                 /* Since we send release complete here, we won't get one */
1328                 p->call = NULL;
1329         }
1330         return NULL;
1331
1332 exit:
1333         res = sig_pri_play_tone(p, SIG_PRI_TONE_CONGESTION);
1334         if (res < 0)
1335                 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", p->channel);
1336         ast_hangup(chan);
1337         return NULL;
1338 }
1339
1340 void pri_event_alarm(struct sig_pri_pri *pri, int index, int before_start_pri)
1341 {
1342         pri->dchanavail[index] &= ~(DCHAN_NOTINALARM | DCHAN_UP);
1343         if (!before_start_pri)
1344                 pri_find_dchan(pri);
1345 }
1346
1347 void pri_event_noalarm(struct sig_pri_pri *pri, int index, int before_start_pri)
1348 {
1349         pri->dchanavail[index] |= DCHAN_NOTINALARM;
1350         if (!before_start_pri)
1351                 pri_restart(pri->dchans[index]);
1352 }
1353
1354 /*!
1355  * \internal
1356  * \brief Convert libpri party id into asterisk party id.
1357  * \since 1.8
1358  *
1359  * \param ast_id Asterisk party id structure to fill.  Must already be set initialized.
1360  * \param pri_id libpri party id structure containing source information.
1361  * \param pri Span controlling structure.
1362  *
1363  * \note The filled in ast_id structure needs to be destroyed by
1364  * ast_party_id_free() when it is no longer needed.
1365  *
1366  * \return Nothing
1367  */
1368 static void sig_pri_party_id_convert(struct ast_party_id *ast_id,
1369         const struct pri_party_id *pri_id, struct sig_pri_pri *pri)
1370 {
1371         char number[AST_MAX_EXTENSION];
1372
1373         if (pri_id->name.valid) {
1374                 ast_id->name = ast_strdup(pri_id->name.str);
1375         }
1376         if (pri_id->number.valid) {
1377                 apply_plan_to_number(number, sizeof(number), pri, pri_id->number.str,
1378                         pri_id->number.plan);
1379                 ast_id->number = ast_strdup(number);
1380                 ast_id->number_type = pri_id->number.plan;
1381         }
1382         if (pri_id->name.valid || pri_id->number.valid) {
1383                 ast_id->number_presentation = overall_ast_presentation(pri_id);
1384         }
1385 #if defined(HAVE_PRI_SUBADDR)
1386         if (pri_id->subaddress.valid) {
1387                 sig_pri_set_subaddress(&ast_id->subaddress, &pri_id->subaddress);
1388         }
1389 #endif  /* defined(HAVE_PRI_SUBADDR) */
1390 }
1391
1392 /*!
1393  * \internal
1394  * \brief Convert libpri redirecting information into asterisk redirecting information.
1395  * \since 1.8
1396  *
1397  * \param ast_redirecting Asterisk redirecting structure to fill.
1398  * \param pri_redirecting libpri redirecting structure containing source information.
1399  * \param ast_guide Asterisk redirecting structure to use as an initialization guide.
1400  * \param pri Span controlling structure.
1401  *
1402  * \note The filled in ast_redirecting structure needs to be destroyed by
1403  * ast_party_redirecting_free() when it is no longer needed.
1404  *
1405  * \return Nothing
1406  */
1407 static void sig_pri_redirecting_convert(struct ast_party_redirecting *ast_redirecting,
1408         const struct pri_party_redirecting *pri_redirecting,
1409         const struct ast_party_redirecting *ast_guide,
1410         struct sig_pri_pri *pri)
1411 {
1412         ast_party_redirecting_set_init(ast_redirecting, ast_guide);
1413
1414         sig_pri_party_id_convert(&ast_redirecting->from, &pri_redirecting->from, pri);
1415         sig_pri_party_id_convert(&ast_redirecting->to, &pri_redirecting->to, pri);
1416         ast_redirecting->count = pri_redirecting->count;
1417         ast_redirecting->reason = pri_to_ast_reason(pri_redirecting->reason);
1418 }
1419
1420 /*!
1421  * \internal
1422  * \brief Determine if the given extension matches one of the MSNs in the pattern list.
1423  * \since 1.8
1424  *
1425  * \param msn_patterns Comma separated list of MSN patterns to match.
1426  * \param exten Extension to match in the MSN list.
1427  *
1428  * \retval 1 if matches.
1429  * \retval 0 if no match.
1430  */
1431 static int sig_pri_msn_match(const char *msn_patterns, const char *exten)
1432 {
1433         char *pattern;
1434         char *msn_list;
1435         char *list_tail;
1436
1437         msn_list = strdupa(msn_patterns);
1438
1439         list_tail = NULL;
1440         pattern = strtok_r(msn_list, ",", &list_tail);
1441         while (pattern) {
1442                 pattern = ast_strip(pattern);
1443                 if (!ast_strlen_zero(pattern) && ast_extension_match(pattern, exten)) {
1444                         /* Extension matched the pattern. */
1445                         return 1;
1446                 }
1447                 pattern = strtok_r(NULL, ",", &list_tail);
1448         }
1449         /* Did not match any pattern in the list. */
1450         return 0;
1451 }
1452
1453 /*!
1454  * \internal
1455  * \brief Obtain the sig_pri owner channel lock if the owner exists.
1456  * \since 1.8
1457  *
1458  * \param pri sig_pri PRI control structure.
1459  * \param chanpos Channel position in the span.
1460  *
1461  * \note Assumes the pri->lock is already obtained.
1462  * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
1463  *
1464  * \return Nothing
1465  */
1466 static void sig_pri_lock_owner(struct sig_pri_pri *pri, int chanpos)
1467 {
1468         for (;;) {
1469                 if (!pri->pvts[chanpos]->owner) {
1470                         /* There is no owner lock to get. */
1471                         break;
1472                 }
1473                 if (!ast_channel_trylock(pri->pvts[chanpos]->owner)) {
1474                         /* We got the lock */
1475                         break;
1476                 }
1477                 /* We must unlock the PRI to avoid the possibility of a deadlock */
1478                 ast_mutex_unlock(&pri->lock);
1479                 PRI_DEADLOCK_AVOIDANCE(pri->pvts[chanpos]);
1480                 ast_mutex_lock(&pri->lock);
1481         }
1482 }
1483
1484 /*!
1485  * \internal
1486  * \brief Handle the call associated PRI subcommand events.
1487  * \since 1.8
1488  *
1489  * \param pri sig_pri PRI control structure.
1490  * \param chanpos Channel position in the span.
1491  * \param event_id PRI event id
1492  * \param channel PRI encoded span/channel
1493  * \param subcmds Subcommands to process if any. (Could be NULL).
1494  * \param call_rsp libpri opaque call structure to send any responses toward.
1495  * Could be NULL either because it is not available or the call is for the
1496  * dummy call reference.  However, this should not be NULL in the cases that
1497  * need to use the pointer to send a response message back.
1498  *
1499  * \note Assumes the pri->lock is already obtained.
1500  * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
1501  *
1502  * \return Nothing
1503  */
1504 static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int event_id,
1505         int channel, const struct pri_subcommands *subcmds, q931_call *call_rsp)
1506 {
1507         int index;
1508         struct ast_channel *owner;
1509         struct ast_party_redirecting ast_redirecting;
1510
1511         if (!subcmds) {
1512                 return;
1513         }
1514         for (index = 0; index < subcmds->counter_subcmd; ++index) {
1515                 const struct pri_subcommand *subcmd = &subcmds->subcmd[index];
1516
1517                 switch (subcmd->cmd) {
1518                 case PRI_SUBCMD_CONNECTED_LINE:
1519                         sig_pri_lock_owner(pri, chanpos);
1520                         owner = pri->pvts[chanpos]->owner;
1521                         if (owner) {
1522                                 struct ast_party_connected_line ast_connected;
1523                                 int caller_id_update;
1524
1525                                 /* Extract the connected line information */
1526                                 ast_party_connected_line_init(&ast_connected);
1527                                 sig_pri_party_id_convert(&ast_connected.id, &subcmd->u.connected_line.id,
1528                                         pri);
1529
1530                                 caller_id_update = 0;
1531                                 if (ast_connected.id.name) {
1532                                         /* Save name for Caller-ID update */
1533                                         ast_copy_string(pri->pvts[chanpos]->cid_name,
1534                                                 ast_connected.id.name, sizeof(pri->pvts[chanpos]->cid_name));
1535                                         caller_id_update = 1;
1536                                 }
1537                                 if (ast_connected.id.number) {
1538                                         /* Save number for Caller-ID update */
1539                                         ast_copy_string(pri->pvts[chanpos]->cid_num, ast_connected.id.number,
1540                                                 sizeof(pri->pvts[chanpos]->cid_num));
1541                                         pri->pvts[chanpos]->cid_ton = ast_connected.id.number_type;
1542                                         caller_id_update = 1;
1543                                 } else {
1544                                         ast_connected.id.number = ast_strdup("");
1545                                 }
1546                                 ast_connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
1547
1548                                 pri->pvts[chanpos]->cid_subaddr[0] = '\0';
1549 #if defined(HAVE_PRI_SUBADDR)
1550                                 if (ast_connected.id.subaddress.valid) {
1551                                         ast_party_subaddress_set(&owner->cid.subaddress,
1552                                                 &ast_connected.id.subaddress);
1553                                         if (ast_connected.id.subaddress.str) {
1554                                                 ast_copy_string(pri->pvts[chanpos]->cid_subaddr,
1555                                                         ast_connected.id.subaddress.str,
1556                                                         sizeof(pri->pvts[chanpos]->cid_subaddr));
1557                                         }
1558                                 }
1559 #endif  /* defined(HAVE_PRI_SUBADDR) */
1560                                 if (caller_id_update) {
1561                                         pri->pvts[chanpos]->callingpres =
1562                                                 ast_connected.id.number_presentation;
1563                                         sig_pri_set_caller_id(pri->pvts[chanpos]);
1564                                         ast_set_callerid(owner, S_OR(ast_connected.id.number, NULL),
1565                                                 S_OR(ast_connected.id.name, NULL),
1566                                                 S_OR(ast_connected.id.number, NULL));
1567                                 }
1568
1569                                 /* Update the connected line information on the other channel */
1570                                 if (event_id != PRI_EVENT_RING) {
1571                                         /* This connected_line update was not from a SETUP message. */
1572                                         ast_channel_queue_connected_line_update(owner, &ast_connected);
1573                                 }
1574
1575                                 ast_party_connected_line_free(&ast_connected);
1576                                 ast_channel_unlock(owner);
1577                         }
1578                         break;
1579                 case PRI_SUBCMD_REDIRECTING:
1580                         sig_pri_lock_owner(pri, chanpos);
1581                         owner = pri->pvts[chanpos]->owner;
1582                         if (owner) {
1583                                 sig_pri_redirecting_convert(&ast_redirecting, &subcmd->u.redirecting,
1584                                         &owner->redirecting, pri);
1585
1586 /*! \todo XXX Original called data can be put in a channel data store that is inherited. */
1587
1588                                 ast_channel_set_redirecting(owner, &ast_redirecting);
1589                                 if (event_id != PRI_EVENT_RING) {
1590                                         /* This redirection was not from a SETUP message. */
1591                                         ast_channel_queue_redirecting_update(owner, &ast_redirecting);
1592                                 }
1593                                 ast_party_redirecting_free(&ast_redirecting);
1594
1595                                 ast_channel_unlock(owner);
1596                         }
1597                         break;
1598 #if defined(HAVE_PRI_CALL_REROUTING)
1599                 case PRI_SUBCMD_REROUTING:
1600                         sig_pri_lock_owner(pri, chanpos);
1601                         owner = pri->pvts[chanpos]->owner;
1602                         if (owner) {
1603                                 struct pri_party_redirecting pri_deflection;
1604
1605                                 if (!call_rsp) {
1606                                         ast_channel_unlock(owner);
1607                                         ast_log(LOG_WARNING,
1608                                                 "CallRerouting/CallDeflection to '%s' without call!\n",
1609                                                 subcmd->u.rerouting.deflection.to.number.str);
1610                                         break;
1611                                 }
1612
1613                                 pri_deflection = subcmd->u.rerouting.deflection;
1614
1615                                 ast_string_field_set(owner, call_forward, pri_deflection.to.number.str);
1616
1617                                 /* Adjust the deflecting to number based upon the subscription option. */
1618                                 switch (subcmd->u.rerouting.subscription_option) {
1619                                 case 0: /* noNotification */
1620                                 case 1: /* notificationWithoutDivertedToNr */
1621                                         /* Delete the number because the far end is not supposed to see it. */
1622                                         pri_deflection.to.number.presentation =
1623                                                 PRI_PRES_RESTRICTED | PRI_PRES_USER_NUMBER_UNSCREENED;
1624                                         pri_deflection.to.number.plan =
1625                                                 (PRI_TON_UNKNOWN << 4) | PRI_NPI_E163_E164;
1626                                         pri_deflection.to.number.str[0] = '\0';
1627                                         break;
1628                                 case 2: /* notificationWithDivertedToNr */
1629                                         break;
1630                                 case 3: /* notApplicable */
1631                                 default:
1632                                         break;
1633                                 }
1634                                 sig_pri_redirecting_convert(&ast_redirecting, &pri_deflection,
1635                                         &owner->redirecting, pri);
1636                                 ast_channel_set_redirecting(owner, &ast_redirecting);
1637                                 ast_party_redirecting_free(&ast_redirecting);
1638
1639                                 /*
1640                                  * Send back positive ACK to CallRerouting/CallDeflection.
1641                                  *
1642                                  * Note:  This call will be hungup by the dial application when
1643                                  * it processes the call_forward string set above.
1644                                  */
1645                                 pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
1646                                         PRI_REROUTING_RSP_OK_CLEAR);
1647
1648                                 /* This line is BUSY to further attempts by this dialing attempt. */
1649                                 ast_queue_control(owner, AST_CONTROL_BUSY);
1650
1651                                 ast_channel_unlock(owner);
1652                         }
1653                         break;
1654 #endif  /* defined(HAVE_PRI_CALL_REROUTING) */
1655                 default:
1656                         ast_debug(2,
1657                                 "Unknown call subcommand(%d) in %s event on channel %d/%d on span %d.\n",
1658                                 subcmd->cmd, pri_event2str(event_id), PRI_SPAN(channel),
1659                                 PRI_CHANNEL(channel), pri->span);
1660                         break;
1661                 }
1662         }
1663 }
1664
1665 #if defined(HAVE_PRI_CALL_HOLD)
1666 /*!
1667  * \internal
1668  * \brief Attempt to transfer the active call to the held call.
1669  * \since 1.8
1670  *
1671  * \param pri sig_pri PRI control structure.
1672  * \param active_call Active call to transfer.
1673  * \param held_call Held call to transfer.
1674  *
1675  * \note Assumes the pri->lock is already obtained.
1676  *
1677  * \retval 0 on success.
1678  * \retval -1 on error.
1679  */
1680 static int sig_pri_attempt_transfer(struct sig_pri_pri *pri, q931_call *active_call, q931_call *held_call)
1681 {
1682         int retval;
1683         int active_chanpos;
1684         int held_chanpos;
1685         struct ast_channel *active_ast;
1686         struct ast_channel *held_ast;
1687         struct ast_channel *bridged;
1688
1689         active_chanpos = pri_find_pri_call(pri, active_call);
1690         held_chanpos = pri_find_pri_call(pri, held_call);
1691         if (active_chanpos < 0 || held_chanpos < 0) {
1692                 return -1;
1693         }
1694
1695         sig_pri_lock_private(pri->pvts[active_chanpos]);
1696         sig_pri_lock_private(pri->pvts[held_chanpos]);
1697         sig_pri_lock_owner(pri, active_chanpos);
1698         sig_pri_lock_owner(pri, held_chanpos);
1699
1700         active_ast = pri->pvts[active_chanpos]->owner;
1701         held_ast = pri->pvts[held_chanpos]->owner;
1702         if (!active_ast || !held_ast) {
1703                 if (active_ast) {
1704                         ast_channel_unlock(active_ast);
1705                 }
1706                 if (held_ast) {
1707                         ast_channel_unlock(held_ast);
1708                 }
1709                 sig_pri_unlock_private(pri->pvts[active_chanpos]);
1710                 sig_pri_unlock_private(pri->pvts[held_chanpos]);
1711                 return -1;
1712         }
1713
1714         bridged = ast_bridged_channel(held_ast);
1715         if (bridged) {
1716                 ast_queue_control(held_ast, AST_CONTROL_UNHOLD);
1717
1718                 ast_verb(3, "TRANSFERRING %s to %s\n", held_ast->name, active_ast->name);
1719                 retval = ast_channel_masquerade(active_ast, bridged);
1720         } else {
1721                 /*
1722                  * Could not transfer.  Held channel is not bridged anymore.
1723                  * Held party probably got tired of waiting and hung up.
1724                  */
1725                 retval = -1;
1726         }
1727
1728         ast_channel_unlock(active_ast);
1729         ast_channel_unlock(held_ast);
1730         sig_pri_unlock_private(pri->pvts[active_chanpos]);
1731         sig_pri_unlock_private(pri->pvts[held_chanpos]);
1732
1733         return retval;
1734 }
1735 #endif  /* defined(HAVE_PRI_CALL_HOLD) */
1736
1737 #if defined(HAVE_PRI_CALL_HOLD)
1738 /*!
1739  * \internal
1740  * \brief Handle the hold event from libpri.
1741  * \since 1.8
1742  *
1743  * \param pri sig_pri PRI control structure.
1744  * \param ev Hold event received.
1745  *
1746  * \note Assumes the pri->lock is already obtained.
1747  *
1748  * \retval 0 on success.
1749  * \retval -1 on error.
1750  */
1751 static int sig_pri_handle_hold(struct sig_pri_pri *pri, pri_event *ev)
1752 {
1753         int retval;
1754         int chanpos_old;
1755         int chanpos_new;
1756         struct ast_channel *bridged;
1757         struct ast_channel *owner;
1758
1759         chanpos_old = pri_find_principle(pri, ev->hold.channel, ev->hold.call);
1760         if (chanpos_old < 0) {
1761                 ast_log(LOG_WARNING,
1762                         "Received HOLD on unconfigured channel %d/%d span %d\n",
1763                         PRI_SPAN(ev->hold.channel), PRI_CHANNEL(ev->hold.channel), pri->span);
1764                 return -1;
1765         }
1766         if (pri->pvts[chanpos_old]->no_b_channel) {
1767                 /* Call is already on hold or is call waiting call. */
1768                 return -1;
1769         }
1770
1771         sig_pri_lock_private(pri->pvts[chanpos_old]);
1772         sig_pri_lock_owner(pri, chanpos_old);
1773         owner = pri->pvts[chanpos_old]->owner;
1774         if (!owner) {
1775                 retval = -1;
1776                 goto done_with_private;
1777         }
1778         bridged = ast_bridged_channel(owner);
1779         if (!bridged) {
1780                 /* Cannot hold a call that is not bridged. */
1781                 retval = -1;
1782                 goto done_with_owner;
1783         }
1784         chanpos_new = pri_find_empty_nobch(pri);
1785         if (chanpos_new < 0) {
1786                 /* No hold channel available. */
1787                 retval = -1;
1788                 goto done_with_owner;
1789         }
1790         sig_pri_handle_subcmds(pri, chanpos_old, ev->e, ev->hold.channel, ev->hold.subcmds,
1791                 ev->hold.call);
1792         chanpos_new = pri_fixup_principle(pri, chanpos_new, ev->hold.call);
1793         if (chanpos_new < 0) {
1794                 /* Should never happen. */
1795                 retval = -1;
1796         } else {
1797                 struct ast_frame f = { AST_FRAME_CONTROL, };
1798
1799                 f.subclass.integer = AST_CONTROL_HOLD;
1800                 ast_queue_frame(owner, &f);
1801                 retval = 0;
1802         }
1803
1804 done_with_owner:;
1805         ast_channel_unlock(owner);
1806 done_with_private:;
1807         sig_pri_unlock_private(pri->pvts[chanpos_old]);
1808
1809         return retval;
1810 }
1811 #endif  /* defined(HAVE_PRI_CALL_HOLD) */
1812
1813 #if defined(HAVE_PRI_CALL_HOLD)
1814 /*!
1815  * \internal
1816  * \brief Handle the retrieve event from libpri.
1817  * \since 1.8
1818  *
1819  * \param pri sig_pri PRI control structure.
1820  * \param ev Retrieve event received.
1821  *
1822  * \note Assumes the pri->lock is already obtained.
1823  *
1824  * \return Nothing
1825  */
1826 static void sig_pri_handle_retrieve(struct sig_pri_pri *pri, pri_event *ev)
1827 {
1828         int chanpos;
1829
1830         if (!(ev->retrieve.channel & PRI_HELD_CALL)
1831                 || pri_find_principle(pri, ev->retrieve.channel, ev->retrieve.call) < 0) {
1832                 /* The call is not currently held. */
1833                 pri_retrieve_rej(pri->pri, ev->retrieve.call,
1834                         PRI_CAUSE_RESOURCE_UNAVAIL_UNSPECIFIED);
1835                 return;
1836         }
1837         if (PRI_CHANNEL(ev->retrieve.channel) == 0xFF) {
1838                 chanpos = pri_find_empty_chan(pri, 1);
1839         } else {
1840                 chanpos = pri_find_principle(pri,
1841                         ev->retrieve.channel & ~PRI_HELD_CALL, ev->retrieve.call);
1842                 if (ev->retrieve.flexible
1843                         && (chanpos < 0 || pri->pvts[chanpos]->owner)) {
1844                         /*
1845                          * Channel selection is flexible and the requested channel
1846                          * is bad or already in use.  Pick another channel.
1847                          */
1848                         chanpos = pri_find_empty_chan(pri, 1);
1849                 }
1850         }
1851         if (chanpos < 0) {
1852                 pri_retrieve_rej(pri->pri, ev->retrieve.call,
1853                         ev->retrieve.flexible ? PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION
1854                         : PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);
1855                 return;
1856         }
1857         chanpos = pri_fixup_principle(pri, chanpos, ev->retrieve.call);
1858         if (chanpos < 0) {
1859                 /* Channel is already in use. */
1860                 pri_retrieve_rej(pri->pri, ev->retrieve.call,
1861                         PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);
1862                 return;
1863         }
1864         sig_pri_lock_private(pri->pvts[chanpos]);
1865         sig_pri_handle_subcmds(pri, chanpos, ev->e, ev->retrieve.channel,
1866                 ev->retrieve.subcmds, ev->retrieve.call);
1867         {
1868                 struct ast_frame f = { AST_FRAME_CONTROL, };
1869
1870                 f.subclass.integer = AST_CONTROL_UNHOLD;
1871                 pri_queue_frame(pri->pvts[chanpos], &f, pri);
1872         }
1873         sig_pri_unlock_private(pri->pvts[chanpos]);
1874         pri_retrieve_ack(pri->pri, ev->retrieve.call,
1875                 PVT_TO_CHANNEL(pri->pvts[chanpos]));
1876 }
1877 #endif  /* defined(HAVE_PRI_CALL_HOLD) */
1878
1879 static void *pri_dchannel(void *vpri)
1880 {
1881         struct sig_pri_pri *pri = vpri;
1882         pri_event *e;
1883         struct pollfd fds[NUM_DCHANS];
1884         int res;
1885         int chanpos = 0;
1886         int x;
1887         struct ast_channel *c;
1888         struct timeval tv, lowest, *next;
1889         int doidling=0;
1890         char *cc;
1891         time_t t;
1892         int i, which=-1;
1893         int numdchans;
1894         pthread_t threadid;
1895         char ani2str[6];
1896         char plancallingnum[AST_MAX_EXTENSION];
1897         char plancallingani[AST_MAX_EXTENSION];
1898         char calledtonstr[10];
1899         struct timeval lastidle = { 0, 0 };
1900         pthread_t p;
1901         struct ast_channel *idle;
1902         char idlen[80];
1903         int nextidle = -1;
1904         int haveidles;
1905         int activeidles;
1906
1907         gettimeofday(&lastidle, NULL);
1908         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
1909
1910         if (!ast_strlen_zero(pri->idledial) && !ast_strlen_zero(pri->idleext)) {
1911                 /* Need to do idle dialing, check to be sure though */
1912                 cc = strchr(pri->idleext, '@');
1913                 if (cc) {
1914                         *cc = '\0';
1915                         cc++;
1916                         ast_copy_string(pri->idlecontext, cc, sizeof(pri->idlecontext));
1917 #if 0
1918                         /* Extensions may not be loaded yet */
1919                         if (!ast_exists_extension(NULL, pri->idlecontext, pri->idleext, 1, NULL))
1920                                 ast_log(LOG_WARNING, "Extension '%s @ %s' does not exist\n", pri->idleext, pri->idlecontext);
1921                         else
1922 #endif
1923                                 doidling = 1;
1924                 } else
1925                         ast_log(LOG_WARNING, "Idle dial string '%s' lacks '@context'\n", pri->idleext);
1926         }
1927         for (;;) {
1928                 for (i = 0; i < NUM_DCHANS; i++) {
1929                         if (!pri->dchans[i])
1930                                 break;
1931                         fds[i].fd = pri->fds[i];
1932                         fds[i].events = POLLIN | POLLPRI;
1933                         fds[i].revents = 0;
1934                 }
1935                 numdchans = i;
1936                 time(&t);
1937                 ast_mutex_lock(&pri->lock);
1938                 if (pri->switchtype != PRI_SWITCH_GR303_TMC && (pri->sig != SIG_BRI_PTMP) && (pri->resetinterval > 0)) {
1939                         if (pri->resetting && pri_is_up(pri)) {
1940                                 if (pri->resetpos < 0)
1941                                         pri_check_restart(pri);
1942                         } else {
1943                                 if (!pri->resetting     && (t - pri->lastreset) >= pri->resetinterval) {
1944                                         pri->resetting = 1;
1945                                         pri->resetpos = -1;
1946                                 }
1947                         }
1948                 }
1949                 /* Look for any idle channels if appropriate */
1950                 if (doidling && pri_is_up(pri)) {
1951                         nextidle = -1;
1952                         haveidles = 0;
1953                         activeidles = 0;
1954                         for (x = pri->numchans; x >= 0; x--) {
1955                                 if (pri->pvts[x]
1956                                         && !pri->pvts[x]->owner
1957                                         && !pri->pvts[x]->call
1958                                         && !pri->pvts[x]->no_b_channel) {
1959                                         if (haveidles < pri->minunused) {
1960                                                 haveidles++;
1961                                         } else if (!pri->pvts[x]->resetting) {
1962                                                 nextidle = x;
1963                                                 break;
1964                                         }
1965                                 } else if (pri->pvts[x] && pri->pvts[x]->owner && pri->pvts[x]->isidlecall)
1966                                         activeidles++;
1967                         }
1968                         if (nextidle > -1) {
1969                                 if (ast_tvdiff_ms(ast_tvnow(), lastidle) > 1000) {
1970                                         /* Don't create a new idle call more than once per second */
1971                                         snprintf(idlen, sizeof(idlen), "%d/%s", pri->pvts[nextidle]->channel, pri->idledial);
1972                                         idle = sig_pri_request(pri->pvts[nextidle], AST_FORMAT_ULAW, NULL, 0);
1973                                         if (idle) {
1974                                                 pri->pvts[nextidle]->isidlecall = 1;
1975                                                 if (ast_pthread_create_background(&p, NULL, do_idle_thread, pri->pvts[nextidle])) {
1976                                                         ast_log(LOG_WARNING, "Unable to start new thread for idle channel '%s'\n", idle->name);
1977                                                         ast_hangup(idle);
1978                                                 }
1979                                         } else
1980                                                 ast_log(LOG_WARNING, "Unable to request channel 'DAHDI/%s' for idle call\n", idlen);
1981                                         gettimeofday(&lastidle, NULL);
1982                                 }
1983                         } else if ((haveidles < pri->minunused) &&
1984                                 (activeidles > pri->minidle)) {
1985                                 /* Mark something for hangup if there is something
1986                                    that can be hungup */
1987                                 for (x = pri->numchans; x >= 0; x--) {
1988                                         /* find a candidate channel */
1989                                         if (pri->pvts[x] && pri->pvts[x]->owner && pri->pvts[x]->isidlecall) {
1990                                                 pri->pvts[x]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
1991                                                 haveidles++;
1992                                                 /* Stop if we have enough idle channels or
1993                                                   can't spare any more active idle ones */
1994                                                 if ((haveidles >= pri->minunused) ||
1995                                                         (activeidles <= pri->minidle))
1996                                                         break;
1997                                         }
1998                                 }
1999                         }
2000                 }
2001                 /* Start with reasonable max */
2002                 lowest = ast_tv(60, 0);
2003                 for (i = 0; i < NUM_DCHANS; i++) {
2004                         /* Find lowest available d-channel */
2005                         if (!pri->dchans[i])
2006                                 break;
2007                         if ((next = pri_schedule_next(pri->dchans[i]))) {
2008                                 /* We need relative time here */
2009                                 tv = ast_tvsub(*next, ast_tvnow());
2010                                 if (tv.tv_sec < 0) {
2011                                         tv = ast_tv(0,0);
2012                                 }
2013                                 if (doidling || pri->resetting) {
2014                                         if (tv.tv_sec > 1) {
2015                                                 tv = ast_tv(1, 0);
2016                                         }
2017                                 } else {
2018                                         if (tv.tv_sec > 60) {
2019                                                 tv = ast_tv(60, 0);
2020                                         }
2021                                 }
2022                         } else if (doidling || pri->resetting) {
2023                                 /* Make sure we stop at least once per second if we're
2024                                    monitoring idle channels */
2025                                 tv = ast_tv(1,0);
2026                         } else {
2027                                 /* Don't poll for more than 60 seconds */
2028                                 tv = ast_tv(60, 0);
2029                         }
2030                         if (!i || ast_tvcmp(tv, lowest) < 0) {
2031                                 lowest = tv;
2032                         }
2033                 }
2034                 ast_mutex_unlock(&pri->lock);
2035
2036                 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
2037                 pthread_testcancel();
2038                 e = NULL;
2039                 res = poll(fds, numdchans, lowest.tv_sec * 1000 + lowest.tv_usec / 1000);
2040                 pthread_testcancel();
2041                 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
2042
2043                 ast_mutex_lock(&pri->lock);
2044                 if (!res) {
2045                         for (which = 0; which < NUM_DCHANS; which++) {
2046                                 if (!pri->dchans[which])
2047                                         break;
2048                                 /* Just a timeout, run the scheduler */
2049                                 e = pri_schedule_run(pri->dchans[which]);
2050                                 if (e)
2051                                         break;
2052                         }
2053                 } else if (res > -1) {
2054                         for (which = 0; which < NUM_DCHANS; which++) {
2055                                 if (!pri->dchans[which])
2056                                         break;
2057                                 if (fds[which].revents & POLLPRI) {
2058                                         sig_pri_handle_dchan_exception(pri, which);
2059                                 } else if (fds[which].revents & POLLIN) {
2060                                         e = pri_check_event(pri->dchans[which]);
2061                                 }
2062                                 if (e)
2063                                         break;
2064                         }
2065                 } else if (errno != EINTR)
2066                         ast_log(LOG_WARNING, "pri_event returned error %d (%s)\n", errno, strerror(errno));
2067
2068                 if (e) {
2069                         if (pri->debug)
2070                                 pri_dump_event(pri->dchans[which], e);
2071
2072                         if (e->e != PRI_EVENT_DCHAN_DOWN) {
2073                                 if (!(pri->dchanavail[which] & DCHAN_UP)) {
2074                                         ast_verb(2, "%s D-Channel on span %d up\n", pri_order(which), pri->span);
2075                                 }
2076                                 pri->dchanavail[which] |= DCHAN_UP;
2077                         } else {
2078                                 if (pri->dchanavail[which] & DCHAN_UP) {
2079                                         ast_verb(2, "%s D-Channel on span %d down\n", pri_order(which), pri->span);
2080                                 }
2081                                 pri->dchanavail[which] &= ~DCHAN_UP;
2082                         }
2083
2084                         if ((e->e != PRI_EVENT_DCHAN_UP) && (e->e != PRI_EVENT_DCHAN_DOWN) && (pri->pri != pri->dchans[which]))
2085                                 /* Must be an NFAS group that has the secondary dchan active */
2086                                 pri->pri = pri->dchans[which];
2087
2088                         switch (e->e) {
2089                         case PRI_EVENT_DCHAN_UP:
2090                                 if (!pri->pri) pri_find_dchan(pri);
2091
2092                                 /* Note presense of D-channel */
2093                                 time(&pri->lastreset);
2094
2095                                 /* Restart in 5 seconds */
2096                                 if (pri->resetinterval > -1) {
2097                                         pri->lastreset -= pri->resetinterval;
2098                                         pri->lastreset += 5;
2099                                 }
2100                                 pri->resetting = 0;
2101                                 /* Take the channels from inalarm condition */
2102                                 for (i = 0; i < pri->numchans; i++)
2103                                         if (pri->pvts[i]) {
2104                                                 pri->pvts[i]->inalarm = 0;
2105                                         }
2106                                 break;
2107                         case PRI_EVENT_DCHAN_DOWN:
2108                                 pri_find_dchan(pri);
2109                                 if (!pri_is_up(pri)) {
2110                                         pri->resetting = 0;
2111                                         if (pri->sig == SIG_BRI_PTMP) {
2112                                                 /* For PTMP connections with non persistent layer 2 we want
2113                                                  * to *not* declare inalarm unless there actually is an alarm */
2114                                                 break;
2115                                         }
2116                                         /* Hangup active channels and put them in alarm mode */
2117                                         for (i = 0; i < pri->numchans; i++) {
2118                                                 struct sig_pri_chan *p = pri->pvts[i];
2119                                                 if (p) {
2120                                                         if (!p->pri || !p->pri->pri || pri_get_timer(p->pri->pri, PRI_TIMER_T309) < 0) {
2121                                                                 /* T309 is not enabled : hangup calls when alarm occurs */
2122                                                                 if (p->call) {
2123                                                                         if (p->pri && p->pri->pri) {
2124                                                                                 pri_hangup(p->pri->pri, p->call, -1);
2125                                                                                 pri_destroycall(p->pri->pri, p->call);
2126                                                                                 p->call = NULL;
2127                                                                         } else
2128                                                                                 ast_log(LOG_WARNING, "The PRI Call have not been destroyed\n");
2129                                                                 }
2130                                                                 if (p->owner)
2131                                                                         ast_softhangup_nolock(p->owner, AST_SOFTHANGUP_DEV);
2132                                                         }
2133                                                         p->inalarm = 1;
2134                                                 }
2135                                         }
2136                                 }
2137                                 break;
2138                         case PRI_EVENT_RESTART:
2139                                 if (e->restart.channel > -1) {
2140                                         chanpos = pri_find_principle(pri, e->restart.channel, NULL);
2141                                         if (chanpos < 0)
2142                                                 ast_log(LOG_WARNING, "Restart requested on odd/unavailable channel number %d/%d on span %d\n",
2143                                                         PRI_SPAN(e->restart.channel), PRI_CHANNEL(e->restart.channel), pri->span);
2144                                         else {
2145                                                 int skipit = 0;
2146 #if defined(HAVE_PRI_SERVICE_MESSAGES)
2147                                                 unsigned why;
2148
2149                                                 why = pri->pvts[chanpos]->service_status;
2150                                                 if (why) {
2151                                                         ast_log(LOG_NOTICE,
2152                                                                 "span '%d' channel '%d' out-of-service (reason: %s), ignoring RESTART\n",
2153                                                                 pri->span, PRI_CHANNEL(e->restart.channel),
2154                                                                 (why & SRVST_FAREND) ? (why & SRVST_NEAREND) ? "both ends" : "far end" : "near end");
2155                                                         skipit = 1;
2156                                                 }
2157 #endif  /* defined(HAVE_PRI_SERVICE_MESSAGES) */
2158                                                 sig_pri_lock_private(pri->pvts[chanpos]);
2159                                                 if (!skipit) {
2160                                                         ast_verb(3, "B-channel %d/%d restarted on span %d\n",
2161                                                                 PRI_SPAN(e->restart.channel), PRI_CHANNEL(e->restart.channel), pri->span);
2162                                                         if (pri->pvts[chanpos]->call) {
2163                                                                 pri_destroycall(pri->pri, pri->pvts[chanpos]->call);
2164                                                                 pri->pvts[chanpos]->call = NULL;
2165                                                         }
2166                                                 }
2167                                                 /* Force soft hangup if appropriate */
2168                                                 if (pri->pvts[chanpos]->owner)
2169                                                         ast_softhangup_nolock(pri->pvts[chanpos]->owner, AST_SOFTHANGUP_DEV);
2170                                                 sig_pri_unlock_private(pri->pvts[chanpos]);
2171                                         }
2172                                 } else {
2173                                         ast_verb(3, "Restart requested on entire span %d\n", pri->span);
2174                                         for (x = 0; x < pri->numchans; x++)
2175                                                 if (pri->pvts[x]) {
2176                                                         sig_pri_lock_private(pri->pvts[x]);
2177                                                         if (pri->pvts[x]->call) {
2178                                                                 pri_destroycall(pri->pri, pri->pvts[x]->call);
2179                                                                 pri->pvts[x]->call = NULL;
2180                                                         }
2181                                                         if (pri->pvts[x]->owner)
2182                                                                 ast_softhangup_nolock(pri->pvts[x]->owner, AST_SOFTHANGUP_DEV);
2183                                                         sig_pri_unlock_private(pri->pvts[x]);
2184                                                 }
2185                                 }
2186                                 break;
2187                         case PRI_EVENT_KEYPAD_DIGIT:
2188                                 chanpos = pri_find_principle(pri, e->digit.channel, e->digit.call);
2189                                 if (chanpos < 0) {
2190                                         ast_log(LOG_WARNING, "KEYPAD_DIGITs received on unconfigured channel %d/%d span %d\n",
2191                                                 PRI_SPAN(e->digit.channel), PRI_CHANNEL(e->digit.channel), pri->span);
2192                                 } else {
2193                                         chanpos = pri_fixup_principle(pri, chanpos, e->digit.call);
2194                                         if (chanpos > -1) {
2195                                                 sig_pri_lock_private(pri->pvts[chanpos]);
2196                                                 sig_pri_handle_subcmds(pri, chanpos, e->e, e->digit.channel,
2197                                                         e->digit.subcmds, e->digit.call);
2198                                                 /* queue DTMF frame if the PBX for this call was already started (we're forwarding KEYPAD_DIGITs further on */
2199                                                 if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
2200                                                         && pri->pvts[chanpos]->call == e->digit.call
2201                                                         && pri->pvts[chanpos]->owner) {
2202                                                         /* how to do that */
2203                                                         int digitlen = strlen(e->digit.digits);
2204                                                         int i;
2205
2206                                                         for (i = 0; i < digitlen; i++) {
2207                                                                 struct ast_frame f = { AST_FRAME_DTMF, .subclass.integer = e->digit.digits[i], };
2208
2209                                                                 pri_queue_frame(pri->pvts[chanpos], &f, pri);
2210                                                         }
2211                                                 }
2212                                                 sig_pri_unlock_private(pri->pvts[chanpos]);
2213                                         }
2214                                 }
2215                                 break;
2216
2217                         case PRI_EVENT_INFO_RECEIVED:
2218                                 chanpos = pri_find_principle(pri, e->ring.channel, e->ring.call);
2219                                 if (chanpos < 0) {
2220                                         ast_log(LOG_WARNING, "INFO received on unconfigured channel %d/%d span %d\n",
2221                                                 PRI_SPAN(e->ring.channel), PRI_CHANNEL(e->ring.channel), pri->span);
2222                                 } else {
2223                                         chanpos = pri_fixup_principle(pri, chanpos, e->ring.call);
2224                                         if (chanpos > -1) {
2225                                                 sig_pri_lock_private(pri->pvts[chanpos]);
2226                                                 sig_pri_handle_subcmds(pri, chanpos, e->e, e->ring.channel,
2227                                                         e->ring.subcmds, e->ring.call);
2228                                                 /* queue DTMF frame if the PBX for this call was already started (we're forwarding INFORMATION further on */
2229                                                 if ((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
2230                                                         && pri->pvts[chanpos]->call == e->ring.call
2231                                                         && pri->pvts[chanpos]->owner) {
2232                                                         /* how to do that */
2233                                                         int digitlen = strlen(e->ring.callednum);
2234                                                         int i;
2235
2236                                                         for (i = 0; i < digitlen; i++) {
2237                                                                 struct ast_frame f = { AST_FRAME_DTMF, .subclass.integer = e->ring.callednum[i], };
2238
2239                                                                 pri_queue_frame(pri->pvts[chanpos], &f, pri);
2240                                                         }
2241                                                 }
2242                                                 sig_pri_unlock_private(pri->pvts[chanpos]);
2243                                         }
2244                                 }
2245                                 break;
2246 #if defined(HAVE_PRI_SERVICE_MESSAGES)
2247                         case PRI_EVENT_SERVICE:
2248                                 chanpos = pri_find_principle(pri, e->service.channel, NULL);
2249                                 if (chanpos < 0) {
2250                                         ast_log(LOG_WARNING, "Received service change status %d on unconfigured channel %d/%d span %d\n",
2251                                                 e->service_ack.changestatus, PRI_SPAN(e->service_ack.channel), PRI_CHANNEL(e->service_ack.channel), pri->span);
2252                                 } else {
2253                                         char db_chan_name[20];
2254                                         char db_answer[5];
2255                                         int ch;
2256                                         unsigned *why;
2257
2258                                         ch = pri->pvts[chanpos]->channel;
2259                                         snprintf(db_chan_name, sizeof(db_chan_name), "%s/%d:%d", dahdi_db, pri->span, ch);
2260                                         why = &pri->pvts[chanpos]->service_status;
2261                                         switch (e->service.changestatus) {
2262                                         case 0: /* in-service */
2263                                                 /* Far end wants to be in service now. */
2264                                                 ast_db_del(db_chan_name, SRVST_DBKEY);
2265                                                 *why &= ~SRVST_FAREND;
2266                                                 if (*why) {
2267                                                         snprintf(db_answer, sizeof(db_answer), "%s:%u",
2268                                                                 SRVST_TYPE_OOS, *why);
2269                                                         ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
2270                                                 }
2271                                                 break;
2272                                         case 2: /* out-of-service */
2273                                                 /* Far end wants to be out-of-service now. */
2274                                                 ast_db_del(db_chan_name, SRVST_DBKEY);
2275                                                 *why |= SRVST_FAREND;
2276                                                 snprintf(db_answer, sizeof(db_answer), "%s:%u", SRVST_TYPE_OOS,
2277                                                         *why);
2278                                                 ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
2279                                                 break;
2280                                         default:
2281                                                 ast_log(LOG_ERROR, "Huh?  changestatus is: %d\n", e->service.changestatus);
2282                                                 break;
2283                                         }
2284                                         ast_log(LOG_NOTICE, "Channel %d/%d span %d (logical: %d) received a change of service message, status '%d'\n",
2285                                                 PRI_SPAN(e->service.channel), PRI_CHANNEL(e->service.channel), pri->span, ch, e->service.changestatus);
2286                                 }
2287                                 break;
2288                         case PRI_EVENT_SERVICE_ACK:
2289                                 chanpos = pri_find_principle(pri, e->service_ack.channel, NULL);
2290                                 if (chanpos < 0) {
2291                                         ast_log(LOG_WARNING, "Received service acknowledge change status '%d' on unconfigured channel %d/%d span %d\n",
2292                                                 e->service_ack.changestatus, PRI_SPAN(e->service_ack.channel), PRI_CHANNEL(e->service_ack.channel), pri->span);
2293                                 } else {
2294                                         ast_debug(2, "Channel %d/%d span %d received a change os service acknowledgement message, status '%d'\n",
2295                                                 PRI_SPAN(e->service_ack.channel), PRI_CHANNEL(e->service_ack.channel), pri->span, e->service_ack.changestatus);
2296                                 }
2297                                 break;
2298 #endif  /* defined(HAVE_PRI_SERVICE_MESSAGES) */
2299                         case PRI_EVENT_RING:
2300                                 if (!ast_strlen_zero(pri->msn_list)
2301                                         && !sig_pri_msn_match(pri->msn_list, e->ring.callednum)) {
2302                                         /* The call is not for us so ignore it. */
2303                                         ast_verb(3,
2304                                                 "Ignoring call to '%s' on span %d.  Its not in the MSN list: %s\n",
2305                                                 e->ring.callednum, pri->span, pri->msn_list);
2306                                         pri_destroycall(pri->pri, e->ring.call);
2307                                         break;
2308                                 }
2309                                 if (e->ring.channel == -1)
2310                                         chanpos = pri_find_empty_chan(pri, 1);
2311                                 else
2312                                         chanpos = pri_find_principle(pri, e->ring.channel, e->ring.call);
2313                                 /* if no channel specified find one empty */
2314                                 if (chanpos < 0) {
2315                                         ast_log(LOG_WARNING, "Ring requested on unconfigured channel %d/%d span %d\n",
2316                                                 PRI_SPAN(e->ring.channel), PRI_CHANNEL(e->ring.channel), pri->span);
2317                                 } else {
2318                                         sig_pri_lock_private(pri->pvts[chanpos]);
2319                                         if (pri->pvts[chanpos]->owner) {
2320                                                 if (pri->pvts[chanpos]->call == e->ring.call) {
2321                                                         ast_log(LOG_WARNING, "Duplicate setup requested on channel %d/%d already in use on span %d\n",
2322                                                                 PRI_SPAN(e->ring.channel), PRI_CHANNEL(e->ring.channel), pri->span);
2323                                                         sig_pri_unlock_private(pri->pvts[chanpos]);
2324                                                         break;
2325                                                 } else {
2326                                                         /* This is where we handle initial glare */
2327                                                         ast_debug(1, "Ring requested on channel %d/%d already in use or previously requested on span %d.  Attempting to renegotiating channel.\n",
2328                                                         PRI_SPAN(e->ring.channel), PRI_CHANNEL(e->ring.channel), pri->span);
2329                                                         sig_pri_unlock_private(pri->pvts[chanpos]);
2330                                                         chanpos = -1;
2331                                                 }
2332                                         }
2333                                         if (chanpos > -1)
2334                                                 sig_pri_unlock_private(pri->pvts[chanpos]);
2335                                 }
2336                                 if ((chanpos < 0) && (e->ring.flexible))
2337                                         chanpos = pri_find_empty_chan(pri, 1);
2338                                 if (chanpos > -1) {
2339                                         sig_pri_lock_private(pri->pvts[chanpos]);
2340                                         pri->pvts[chanpos]->call = e->ring.call;
2341
2342                                         /* Use plancallingnum as a scratch buffer since it is initialized next. */
2343                                         apply_plan_to_number(plancallingnum, sizeof(plancallingnum), pri,
2344                                                 e->ring.redirectingnum, e->ring.callingplanrdnis);
2345                                         sig_pri_set_rdnis(pri->pvts[chanpos], plancallingnum);
2346
2347                                         /* Setup caller-id info */
2348                                         apply_plan_to_number(plancallingnum, sizeof(plancallingnum), pri, e->ring.callingnum, e->ring.callingplan);
2349                                         pri->pvts[chanpos]->cid_ani2 = 0;
2350                                         if (pri->pvts[chanpos]->use_callerid) {
2351                                                 ast_shrink_phone_number(plancallingnum);
2352                                                 ast_copy_string(pri->pvts[chanpos]->cid_num, plancallingnum, sizeof(pri->pvts[chanpos]->cid_num));
2353 #ifdef PRI_ANI
2354                                                 if (!ast_strlen_zero(e->ring.callingani)) {
2355                                                         apply_plan_to_number(plancallingani, sizeof(plancallingani), pri, e->ring.callingani, e->ring.callingplanani);
2356                                                         ast_shrink_phone_number(plancallingani);
2357                                                         ast_copy_string(pri->pvts[chanpos]->cid_ani, plancallingani, sizeof(pri->pvts[chanpos]->cid_ani));
2358                                                 } else {
2359                                                         pri->pvts[chanpos]->cid_ani[0] = '\0';
2360                                                 }
2361 #endif
2362                                                 pri->pvts[chanpos]->cid_subaddr[0] = '\0';
2363 #if defined(HAVE_PRI_SUBADDR)
2364                                                 if (e->ring.calling.subaddress.valid) {
2365                                                         struct ast_party_subaddress calling_subaddress;
2366
2367                                                         ast_party_subaddress_init(&calling_subaddress);
2368                                                         sig_pri_set_subaddress(&calling_subaddress,
2369                                                                 &e->ring.calling.subaddress);
2370                                                         if (calling_subaddress.str) {
2371                                                                 ast_copy_string(pri->pvts[chanpos]->cid_subaddr,
2372                                                                         calling_subaddress.str,
2373                                                                         sizeof(pri->pvts[chanpos]->cid_subaddr));
2374                                                         }
2375                                                         ast_party_subaddress_free(&calling_subaddress);
2376                                                 }
2377 #endif /* defined(HAVE_PRI_SUBADDR) */
2378                                                 ast_copy_string(pri->pvts[chanpos]->cid_name, e->ring.callingname, sizeof(pri->pvts[chanpos]->cid_name));
2379                                                 pri->pvts[chanpos]->cid_ton = e->ring.callingplan; /* this is the callingplan (TON/NPI), e->ring.callingplan>>4 would be the TON */
2380                                                 pri->pvts[chanpos]->callingpres = e->ring.callingpres;
2381                                                 if (e->ring.ani2 >= 0) {
2382                                                         pri->pvts[chanpos]->cid_ani2 = e->ring.ani2;
2383                                                 }
2384                                         } else {
2385                                                 pri->pvts[chanpos]->cid_num[0] = '\0';
2386                                                 pri->pvts[chanpos]->cid_subaddr[0] = '\0';
2387                                                 pri->pvts[chanpos]->cid_ani[0] = '\0';
2388                                                 pri->pvts[chanpos]->cid_name[0] = '\0';
2389                                                 pri->pvts[chanpos]->cid_ton = 0;
2390                                                 pri->pvts[chanpos]->callingpres = 0;
2391                                         }
2392                                         sig_pri_set_caller_id(pri->pvts[chanpos]);
2393
2394                                         /* Set DNID on all incoming calls -- even immediate */
2395                                         sig_pri_set_dnid(pri->pvts[chanpos], e->ring.callednum);
2396
2397                                         /* If immediate=yes go to s|1 */
2398                                         if (pri->pvts[chanpos]->immediate) {
2399                                                 ast_verb(3, "Going to extension s|1 because of immediate=yes\n");
2400                                                 pri->pvts[chanpos]->exten[0] = 's';
2401                                                 pri->pvts[chanpos]->exten[1] = '\0';
2402                                         }
2403                                         /* Get called number */
2404                                         else if (!ast_strlen_zero(e->ring.callednum)) {
2405                                                 ast_copy_string(pri->pvts[chanpos]->exten, e->ring.callednum, sizeof(pri->pvts[chanpos]->exten));
2406                                         } else if (pri->overlapdial)
2407                                                 pri->pvts[chanpos]->exten[0] = '\0';
2408                                         else {
2409                                                 /* Some PRI circuits are set up to send _no_ digits.  Handle them as 's'. */
2410                                                 pri->pvts[chanpos]->exten[0] = 's';
2411                                                 pri->pvts[chanpos]->exten[1] = '\0';
2412                                         }
2413                                         /* No number yet, but received "sending complete"? */
2414                                         if (e->ring.complete && (ast_strlen_zero(e->ring.callednum))) {
2415                                                 ast_verb(3, "Going to extension s|1 because of Complete received\n");
2416                                                 pri->pvts[chanpos]->exten[0] = 's';
2417                                                 pri->pvts[chanpos]->exten[1] = '\0';
2418                                         }
2419
2420                                         /* Make sure extension exists (or in overlap dial mode, can exist) */
2421                                         if (((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && ast_canmatch_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) ||
2422                                                 ast_exists_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) {
2423                                                 /* Setup law */
2424                                                 if (e->ring.complete || !(pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) {
2425                                                         /* Just announce proceeding */
2426                                                         pri->pvts[chanpos]->proceeding = 1;
2427                                                         pri_proceeding(pri->pri, e->ring.call, PVT_TO_CHANNEL(pri->pvts[chanpos]), 0);
2428                                                 } else {
2429                                                         if (pri->switchtype != PRI_SWITCH_GR303_TMC)
2430                                                                 pri_need_more_info(pri->pri, e->ring.call, PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
2431                                                         else
2432                                                                 pri_answer(pri->pri, e->ring.call, PVT_TO_CHANNEL(pri->pvts[chanpos]), 1);
2433                                                 }
2434
2435                                                 /* Start PBX */
2436                                                 if (!e->ring.complete
2437                                                         && (pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
2438                                                         && ast_matchmore_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) {
2439                                                         /*
2440                                                          * Release the PRI lock while we create the channel
2441                                                          * so other threads can send D channel messages.
2442                                                          */
2443                                                         ast_mutex_unlock(&pri->lock);
2444                                                         c = sig_pri_new_ast_channel(pri->pvts[chanpos],
2445                                                                 AST_STATE_RESERVED, 0,
2446                                                                 (e->ring.layer1 == PRI_LAYER_1_ALAW)
2447                                                                         ? SIG_PRI_ALAW : SIG_PRI_ULAW,
2448                                                                 e->ring.ctype, pri->pvts[chanpos]->exten, NULL);
2449                                                         ast_mutex_lock(&pri->lock);
2450                                                         if (c) {
2451 #if defined(HAVE_PRI_SUBADDR)
2452                                                                 if (e->ring.calling.subaddress.valid) {
2453                                                                         /* Set Calling Subaddress */
2454                                                                         sig_pri_lock_owner(pri, chanpos);
2455                                                                         sig_pri_set_subaddress(
2456                                                                                 &pri->pvts[chanpos]->owner->cid.subaddress,
2457                                                                                 &e->ring.calling.subaddress);
2458                                                                         if (!e->ring.calling.subaddress.type
2459                                                                                 && !ast_strlen_zero(
2460                                                                                         (char *) e->ring.calling.subaddress.data)) {
2461                                                                                 /* NSAP */
2462                                                                                 pbx_builtin_setvar_helper(c, "CALLINGSUBADDR",
2463                                                                                         (char *) e->ring.calling.subaddress.data);
2464                                                                         }
2465                                                                         ast_channel_unlock(c);
2466                                                                 }
2467                                                                 if (e->ring.called_subaddress.valid) {
2468                                                                         /* Set Called Subaddress */
2469                                                                         sig_pri_lock_owner(pri, chanpos);
2470                                                                         sig_pri_set_subaddress(
2471                                                                                 &pri->pvts[chanpos]->owner->cid.dialed_subaddress,
2472                                                                                 &e->ring.called_subaddress);
2473                                                                         if (!e->ring.called_subaddress.type
2474                                                                                 && !ast_strlen_zero(
2475                                                                                         (char *) e->ring.called_subaddress.data)) {
2476                                                                                 /* NSAP */
2477                                                                                 pbx_builtin_setvar_helper(c, "CALLEDSUBADDR",
2478                                                                                         (char *) e->ring.called_subaddress.data);
2479                                                                         }
2480                                                                         ast_channel_unlock(c);
2481                                                                 }
2482 #else
2483                                                                 if (!ast_strlen_zero(e->ring.callingsubaddr)) {
2484                                                                         pbx_builtin_setvar_helper(c, "CALLINGSUBADDR", e->ring.callingsubaddr);
2485                                                                 }
2486 #endif /* !defined(HAVE_PRI_SUBADDR) */
2487                                                                 if (e->ring.ani2 >= 0) {
2488                                                                         snprintf(ani2str, sizeof(ani2str), "%d", e->ring.ani2);
2489                                                                         pbx_builtin_setvar_helper(c, "ANI2", ani2str);
2490                                                                 }
2491
2492 #ifdef SUPPORT_USERUSER
2493                                                                 if (!ast_strlen_zero(e->ring.useruserinfo)) {
2494                                                                         pbx_builtin_setvar_helper(c, "USERUSERINFO", e->ring.useruserinfo);
2495                                                                 }
2496 #endif
2497
2498                                                                 snprintf(calledtonstr, sizeof(calledtonstr), "%d", e->ring.calledplan);
2499                                                                 pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr);
2500                                                                 if (e->ring.redirectingreason >= 0) {
2501                                                                         /* This is now just a status variable.  Use REDIRECTING() dialplan function. */
2502                                                                         pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
2503                                                                 }
2504 #if defined(HAVE_PRI_REVERSE_CHARGE)
2505                                                                 pri->pvts[chanpos]->reverse_charging_indication = e->ring.reversecharge;
2506 #endif
2507 #if defined(HAVE_PRI_SETUP_KEYPAD)
2508                                                                 ast_copy_string(pri->pvts[chanpos]->keypad_digits,
2509                                                                         e->ring.keypad_digits,
2510                                                                         sizeof(pri->pvts[chanpos]->keypad_digits));
2511 #endif  /* defined(HAVE_PRI_SETUP_KEYPAD) */
2512
2513                                                                 sig_pri_handle_subcmds(pri, chanpos, e->e, e->ring.channel,
2514                                                                         e->ring.subcmds, e->ring.call);
2515
2516                                                         }
2517                                                         if (c && !ast_pthread_create_detached(&threadid, NULL, pri_ss_thread, pri->pvts[chanpos])) {
2518                                                                 ast_verb(3, "Accepting overlap call from '%s' to '%s' on channel %d/%d, span %d\n",
2519                                                                         plancallingnum, S_OR(pri->pvts[chanpos]->exten, "<unspecified>"),
2520                                                                         pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
2521                                                         } else {
2522                                                                 ast_log(LOG_WARNING, "Unable to start PBX on channel %d/%d, span %d\n",
2523                                                                         pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
2524                                                                 if (c)
2525                                                                         ast_hangup(c);
2526                                                                 else {
2527                                                                         pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_SWITCH_CONGESTION);
2528                                                                         pri->pvts[chanpos]->call = NULL;
2529                                                                 }
2530                                                         }
2531                                                 } else {
2532                                                         /*
2533                                                          * Release the PRI lock while we create the channel
2534                                                          * so other threads can send D channel messages.
2535                                                          */
2536                                                         ast_mutex_unlock(&pri->lock);
2537                                                         c = sig_pri_new_ast_channel(pri->pvts[chanpos],
2538                                                                 AST_STATE_RING, 0,
2539                                                                 (e->ring.layer1 == PRI_LAYER_1_ALAW)
2540                                                                         ? SIG_PRI_ALAW : SIG_PRI_ULAW, e->ring.ctype,
2541                                                                 pri->pvts[chanpos]->exten, NULL);
2542                                                         ast_mutex_lock(&pri->lock);
2543                                                         if (c) {
2544                                                                 /*
2545                                                                  * It is reasonably safe to set the following
2546                                                                  * channel variables while the PRI and DAHDI private
2547                                                                  * structures are locked.  The PBX has not been
2548                                                                  * started yet and it is unlikely that any other task
2549                                                                  * will do anything with the channel we have just
2550                                                                  * created.
2551                                                                  */
2552 #if defined(HAVE_PRI_SUBADDR)
2553                                                                 if (e->ring.calling.subaddress.valid) {
2554                                                                         /* Set Calling Subaddress */
2555                                                                         sig_pri_lock_owner(pri, chanpos);
2556                                                                         sig_pri_set_subaddress(
2557                                                                                 &pri->pvts[chanpos]->owner->cid.subaddress,
2558                                                                                 &e->ring.calling.subaddress);
2559                                                                         if (!e->ring.calling.subaddress.type
2560                                                                                 && !ast_strlen_zero(
2561                                                                                         (char *) e->ring.calling.subaddress.data)) {
2562                                                                                 /* NSAP */
2563                                                                                 pbx_builtin_setvar_helper(c, "CALLINGSUBADDR",
2564                                                                                         (char *) e->ring.calling.subaddress.data);
2565                                                                         }
2566                                                                         ast_channel_unlock(c);
2567                                                                 }
2568                                                                 if (e->ring.called_subaddress.valid) {
2569                                                                         /* Set Called Subaddress */
2570                                                                         sig_pri_lock_owner(pri, chanpos);
2571                                                                         sig_pri_set_subaddress(
2572                                                                                 &pri->pvts[chanpos]->owner->cid.dialed_subaddress,
2573                                                                                 &e->ring.called_subaddress);
2574                                                                         if (!e->ring.called_subaddress.type
2575                                                                                 && !ast_strlen_zero(
2576                                                                                         (char *) e->ring.called_subaddress.data)) {
2577                                                                                 /* NSAP */
2578                                                                                 pbx_builtin_setvar_helper(c, "CALLEDSUBADDR",
2579                                                                                         (char *) e->ring.called_subaddress.data);
2580                                                                         }
2581                                                                         ast_channel_unlock(c);
2582                                                                 }
2583 #else
2584                                                                 if (!ast_strlen_zero(e->ring.callingsubaddr)) {
2585                                                                         pbx_builtin_setvar_helper(c, "CALLINGSUBADDR", e->ring.callingsubaddr);
2586                                                                 }
2587 #endif /* !defined(HAVE_PRI_SUBADDR) */
2588                                                                 if (e->ring.ani2 >= 0) {
2589                                                                         snprintf(ani2str, sizeof(ani2str), "%d", e->ring.ani2);
2590                                                                         pbx_builtin_setvar_helper(c, "ANI2", ani2str);
2591                                                                 }
2592
2593 #ifdef SUPPORT_USERUSER
2594                                                                 if (!ast_strlen_zero(e->ring.useruserinfo)) {
2595                                                                         pbx_builtin_setvar_helper(c, "USERUSERINFO", e->ring.useruserinfo);
2596                                                                 }
2597 #endif
2598
2599                                                                 if (e->ring.redirectingreason >= 0) {
2600                                                                         /* This is now just a status variable.  Use REDIRECTING() dialplan function. */
2601                                                                         pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
2602                                                                 }
2603 #if defined(HAVE_PRI_REVERSE_CHARGE)
2604                                                                 pri->pvts[chanpos]->reverse_charging_indication = e->ring.reversecharge;
2605 #endif
2606 #if defined(HAVE_PRI_SETUP_KEYPAD)
2607                                                                 ast_copy_string(pri->pvts[chanpos]->keypad_digits,
2608                                                                         e->ring.keypad_digits,
2609                                                                         sizeof(pri->pvts[chanpos]->keypad_digits));
2610 #endif  /* defined(HAVE_PRI_SETUP_KEYPAD) */
2611
2612                                                                 snprintf(calledtonstr, sizeof(calledtonstr), "%d", e->ring.calledplan);
2613                                                                 pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr);
2614
2615                                                                 sig_pri_handle_subcmds(pri, chanpos, e->e, e->ring.channel,
2616                                                                         e->ring.subcmds, e->ring.call);
2617
2618                                                         }
2619                                                         if (c && !ast_pbx_start(c)) {
2620                                                                 ast_verb(3, "Accepting call from '%s' to '%s' on channel %d/%d, span %d\n",
2621                                                                         plancallingnum, pri->pvts[chanpos]->exten,
2622                                                                         pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
2623                                                                 sig_pri_set_echocanceller(pri->pvts[chanpos], 1);
2624                                                         } else {
2625                                                                 ast_log(LOG_WARNING, "Unable to start PBX on channel %d/%d, span %d\n",
2626                                                                         pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
2627                                                                 if (c) {
2628                                                                         ast_hangup(c);
2629                                                                 } else {
2630                                                                         pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_SWITCH_CONGESTION);
2631                                                                         pri->pvts[chanpos]->call = NULL;
2632                                                                 }
2633                                                         }
2634                                                 }
2635                                         } else {
2636                                                 ast_verb(3, "Extension '%s' in context '%s' from '%s' does not exist.  Rejecting call on channel %d/%d, span %d\n",
2637                                                         pri->pvts[chanpos]->exten, pri->pvts[chanpos]->context, pri->pvts[chanpos]->cid_num, pri->pvts[chanpos]->logicalspan,
2638                                                         pri->pvts[chanpos]->prioffset, pri->span);
2639                                                 pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_UNALLOCATED);
2640                                                 pri->pvts[chanpos]->call = NULL;
2641                                                 pri->pvts[chanpos]->exten[0] = '\0';
2642                                         }
2643                                         sig_pri_unlock_private(pri->pvts[chanpos]);
2644                                 } else {
2645                                         if (e->ring.flexible)
2646                                                 pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION);
2647                                         else
2648                                                 pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);
2649                                 }
2650                                 break;
2651                         case PRI_EVENT_RINGING:
2652                                 chanpos = pri_find_principle(pri, e->ringing.channel, e->ringing.call);
2653                                 if (chanpos < 0) {
2654                                         ast_log(LOG_WARNING, "Ringing requested on unconfigured channel %d/%d span %d\n",
2655                                                 PRI_SPAN(e->ringing.channel), PRI_CHANNEL(e->ringing.channel), pri->span);
2656                                 } else {
2657                                         chanpos = pri_fixup_principle(pri, chanpos, e->ringing.call);
2658                                         if (chanpos < 0) {
2659                                                 ast_log(LOG_WARNING, "Ringing requested on channel %d/%d not in use on span %d\n",
2660                                                         PRI_SPAN(e->ringing.channel), PRI_CHANNEL(e->ringing.channel), pri->span);
2661                                         } else {
2662                                                 sig_pri_lock_private(pri->pvts[chanpos]);
2663
2664                                                 sig_pri_handle_subcmds(pri, chanpos, e->e, e->ringing.channel,
2665                                                         e->ringing.subcmds, e->ringing.call);
2666                                                 sig_pri_set_echocanceller(pri->pvts[chanpos], 1);
2667                                                 pri_queue_control(pri->pvts[chanpos], AST_CONTROL_RINGING, pri);
2668                                                 pri->pvts[chanpos]->alerting = 1;
2669
2670 #ifdef SUPPORT_USERUSER
2671                                                 if (!ast_strlen_zero(e->ringing.useruserinfo)) {
2672                                                         struct ast_channel *owner;
2673
2674                                                         sig_pri_lock_owner(pri, chanpos);
2675                                                         owner = pri->pvts[chanpos]->owner;
2676                                                         if (owner) {
2677                                                                 pbx_builtin_setvar_helper(owner, "USERUSERINFO",
2678                                                                         e->ringing.useruserinfo);
2679                                                                 ast_channel_unlock(owner);
2680                                                         }
2681                                                 }
2682 #endif
2683
2684                                                 sig_pri_unlock_private(pri->pvts[chanpos]);
2685                                         }
2686                                 }
2687                                 break;
2688                         case PRI_EVENT_PROGRESS:
2689                                 /* Get chan value if e->e is not PRI_EVNT_RINGING */
2690                                 chanpos = pri_find_principle(pri, e->proceeding.channel, e->proceeding.call);
2691                                 if (chanpos > -1) {
2692                                         sig_pri_lock_private(pri->pvts[chanpos]);
2693                                         sig_pri_handle_subcmds(pri, chanpos, e->e, e->proceeding.channel,
2694                                                 e->proceeding.subcmds, e->proceeding.call);
2695                                         if ((!pri->pvts[chanpos]->progress)
2696 #ifdef PRI_PROGRESS_MASK
2697                                                 || (e->proceeding.progressmask & PRI_PROG_INBAND_AVAILABLE)
2698 #else
2699                                                 || (e->proceeding.progress == 8)
2700 #endif
2701                                                 ) {
2702                                                 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_PROGRESS, };
2703
2704                                                 if (e->proceeding.cause > -1) {
2705                                                         ast_verb(3, "PROGRESS with cause code %d received\n", e->proceeding.cause);
2706
2707                                                         /* Work around broken, out of spec USER_BUSY cause in a progress message */
2708                                                         if (e->proceeding.cause == AST_CAUSE_USER_BUSY) {
2709                                                                 if (pri->pvts[chanpos]->owner) {
2710                                                                         ast_verb(3, "PROGRESS with 'user busy' received, signaling AST_CONTROL_BUSY instead of AST_CONTROL_PROGRESS\n");
2711
2712                                                                         pri->pvts[chanpos]->owner->hangupcause = e->proceeding.cause;
2713                                                                         f.subclass.integer = AST_CONTROL_BUSY;
2714                                                                 }
2715                                                         }
2716                                                 }
2717
2718                                                 ast_debug(1, "Queuing frame from PRI_EVENT_PROGRESS on channel %d/%d span %d\n",
2719                                                         pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset,pri->span);
2720