2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2009, Digium, Inc.
6 * Mark Spencer <markster@digium.com>
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.
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.
21 * \brief PRI signaling module
23 * \author Matthew Fredrickson <creslin@digium.com>
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 #include "asterisk/aoc.h"
52 #ifndef PRI_EVENT_FACILITY
53 #error please update libpri
56 /* define this to send PRI user-user information elements */
57 #undef SUPPORT_USERUSER
60 * Define to make always pick a channel if allowed. Useful for
61 * testing channel shifting.
63 //#define ALWAYS_PICK_CHANNEL 1
66 * Define to force a RESTART on a channel that returns a cause
67 * code of PRI_CAUSE_REQUESTED_CHAN_UNAVAIL(44). If the cause
68 * is because of a stuck channel on the peer and the channel is
69 * always the next channel we pick for an outgoing call then
72 #define FORCE_RESTART_UNAVAIL_CHANS 1
74 #if defined(HAVE_PRI_CCSS)
75 struct sig_pri_cc_agent_prv {
76 /*! Asterisk span D channel control structure. */
77 struct sig_pri_span *pri;
78 /*! CC id value to use with libpri. -1 if invalid. */
80 /*! TRUE if CC has been requested and we are waiting for the response. */
81 unsigned char cc_request_response_pending;
84 struct sig_pri_cc_monitor_instance {
85 /*! \brief Asterisk span D channel control structure. */
86 struct sig_pri_span *pri;
87 /*! CC id value to use with libpri. (-1 if already canceled). */
89 /*! CC core id value. */
91 /*! Device name(Channel name less sequence number) */
95 /*! Upper level agent/monitor type name. */
96 static const char *sig_pri_cc_type_name;
97 /*! Container of sig_pri monitor instances. */
98 static struct ao2_container *sig_pri_cc_monitors;
99 #endif /* defined(HAVE_PRI_CCSS) */
101 static int pri_matchdigittimeout = 3000;
103 static int pri_gendigittimeout = 8000;
105 #define DCHAN_NOTINALARM (1 << 0)
106 #define DCHAN_UP (1 << 1)
108 /* Defines to help decode the encoded event channel id. */
109 #define PRI_CHANNEL(p) ((p) & 0xff)
110 #define PRI_SPAN(p) (((p) >> 8) & 0xff)
111 #define PRI_EXPLICIT (1 << 16)
112 #define PRI_CIS_CALL (1 << 17) /* Call is using the D channel only. */
113 #define PRI_HELD_CALL (1 << 18)
116 #define DCHAN_AVAILABLE (DCHAN_NOTINALARM | DCHAN_UP)
118 #define PRI_DEADLOCK_AVOIDANCE(p) \
120 sig_pri_unlock_private(p); \
122 sig_pri_lock_private(p); \
125 static int pri_active_dchan_index(struct sig_pri_span *pri);
127 static const char *sig_pri_call_level2str(enum sig_pri_call_level level)
130 case SIG_PRI_CALL_LEVEL_IDLE:
132 case SIG_PRI_CALL_LEVEL_SETUP:
134 case SIG_PRI_CALL_LEVEL_OVERLAP:
136 case SIG_PRI_CALL_LEVEL_PROCEEDING:
138 case SIG_PRI_CALL_LEVEL_ALERTING:
140 case SIG_PRI_CALL_LEVEL_CONNECT:
146 static inline void pri_rel(struct sig_pri_span *pri)
148 ast_mutex_unlock(&pri->lock);
151 static unsigned int PVT_TO_CHANNEL(struct sig_pri_chan *p)
153 int res = (((p)->prioffset) | ((p)->logicalspan << 8) | (p->mastertrunkgroup ? PRI_EXPLICIT : 0));
154 ast_debug(5, "prioffset: %d mastertrunkgroup: %d logicalspan: %d result: %d\n",
155 p->prioffset, p->mastertrunkgroup, p->logicalspan, res);
160 static void sig_pri_handle_dchan_exception(struct sig_pri_span *pri, int index)
162 if (pri->calls->handle_dchan_exception)
163 pri->calls->handle_dchan_exception(pri, index);
166 static void sig_pri_set_dialing(struct sig_pri_chan *p, int is_dialing)
168 if (p->calls->set_dialing) {
169 p->calls->set_dialing(p->chan_pvt, is_dialing);
173 static void sig_pri_set_digital(struct sig_pri_chan *p, int is_digital)
175 p->digital = is_digital;
176 if (p->calls->set_digital) {
177 p->calls->set_digital(p->chan_pvt, is_digital);
181 void sig_pri_set_alarm(struct sig_pri_chan *p, int in_alarm)
184 * Clear the channel restart flag when the channel alarm changes
185 * to prevent the flag from getting stuck when the link goes
190 p->inalarm = in_alarm;
191 if (p->calls->set_alarm) {
192 p->calls->set_alarm(p->chan_pvt, in_alarm);
196 static const char *sig_pri_get_orig_dialstring(struct sig_pri_chan *p)
198 if (p->calls->get_orig_dialstring) {
199 return p->calls->get_orig_dialstring(p->chan_pvt);
201 ast_log(LOG_ERROR, "get_orig_dialstring callback not defined\n");
205 #if defined(HAVE_PRI_CCSS)
206 static void sig_pri_make_cc_dialstring(struct sig_pri_chan *p, char *buf, size_t buf_size)
208 if (p->calls->make_cc_dialstring) {
209 p->calls->make_cc_dialstring(p->chan_pvt, buf, buf_size);
211 ast_log(LOG_ERROR, "make_cc_dialstring callback not defined\n");
215 #endif /* defined(HAVE_PRI_CCSS) */
219 * \brief Reevaluate the PRI span device state.
222 * \param pri PRI span control structure.
226 * \note Assumes the pri->lock is already obtained.
228 static void sig_pri_span_devstate_changed(struct sig_pri_span *pri)
230 if (pri->calls->update_span_devstate) {
231 pri->calls->update_span_devstate(pri);
237 * \brief Set the caller id information in the parent module.
240 * \param p sig_pri channel structure.
244 static void sig_pri_set_caller_id(struct sig_pri_chan *p)
246 struct ast_party_caller caller;
248 if (p->calls->set_callerid) {
249 ast_party_caller_init(&caller);
251 caller.id.name.str = p->cid_name;
252 caller.id.name.presentation = p->callingpres;
253 caller.id.name.valid = 1;
255 caller.id.number.str = p->cid_num;
256 caller.id.number.plan = p->cid_ton;
257 caller.id.number.presentation = p->callingpres;
258 caller.id.number.valid = 1;
260 if (!ast_strlen_zero(p->cid_subaddr)) {
261 caller.id.subaddress.valid = 1;
262 //caller.id.subaddress.type = 0;/* nsap */
263 //caller.id.subaddress.odd_even_indicator = 0;
264 caller.id.subaddress.str = p->cid_subaddr;
266 caller.id.tag = p->user_tag;
268 caller.ani.number.str = p->cid_ani;
269 //caller.ani.number.plan = p->xxx;
270 //caller.ani.number.presentation = p->xxx;
271 caller.ani.number.valid = 1;
273 caller.ani2 = p->cid_ani2;
274 p->calls->set_callerid(p->chan_pvt, &caller);
280 * \brief Set the Dialed Number Identifier.
283 * \param p sig_pri channel structure.
284 * \param dnid Dialed Number Identifier string.
288 static void sig_pri_set_dnid(struct sig_pri_chan *p, const char *dnid)
290 if (p->calls->set_dnid) {
291 p->calls->set_dnid(p->chan_pvt, dnid);
297 * \brief Set the Redirecting Directory Number Information Service (RDNIS).
300 * \param p sig_pri channel structure.
301 * \param rdnis Redirecting Directory Number Information Service (RDNIS) string.
305 static void sig_pri_set_rdnis(struct sig_pri_chan *p, const char *rdnis)
307 if (p->calls->set_rdnis) {
308 p->calls->set_rdnis(p->chan_pvt, rdnis);
312 static void sig_pri_unlock_private(struct sig_pri_chan *p)
314 if (p->calls->unlock_private)
315 p->calls->unlock_private(p->chan_pvt);
318 static void sig_pri_lock_private(struct sig_pri_chan *p)
320 if (p->calls->lock_private)
321 p->calls->lock_private(p->chan_pvt);
324 static void sig_pri_deadlock_avoidance_private(struct sig_pri_chan *p)
326 if (p->calls->deadlock_avoidance_private) {
327 p->calls->deadlock_avoidance_private(p->chan_pvt);
329 /* Fallback to the old way if callback not present. */
330 PRI_DEADLOCK_AVOIDANCE(p);
334 static inline int pri_grab(struct sig_pri_chan *p, struct sig_pri_span *pri)
337 /* Grab the lock first */
339 res = ast_mutex_trylock(&pri->lock);
341 sig_pri_deadlock_avoidance_private(p);
344 /* Then break the poll */
345 pthread_kill(pri->master, SIGURG);
351 * \brief Convert PRI redirecting reason to asterisk version.
354 * \param pri_reason PRI redirecting reason.
356 * \return Equivalent asterisk redirecting reason value.
358 static enum AST_REDIRECTING_REASON pri_to_ast_reason(int pri_reason)
360 enum AST_REDIRECTING_REASON ast_reason;
362 switch (pri_reason) {
363 case PRI_REDIR_FORWARD_ON_BUSY:
364 ast_reason = AST_REDIRECTING_REASON_USER_BUSY;
366 case PRI_REDIR_FORWARD_ON_NO_REPLY:
367 ast_reason = AST_REDIRECTING_REASON_NO_ANSWER;
369 case PRI_REDIR_DEFLECTION:
370 ast_reason = AST_REDIRECTING_REASON_DEFLECTION;
372 case PRI_REDIR_UNCONDITIONAL:
373 ast_reason = AST_REDIRECTING_REASON_UNCONDITIONAL;
375 case PRI_REDIR_UNKNOWN:
377 ast_reason = AST_REDIRECTING_REASON_UNKNOWN;
386 * \brief Convert asterisk redirecting reason to PRI version.
389 * \param ast_reason Asterisk redirecting reason.
391 * \return Equivalent PRI redirecting reason value.
393 static int ast_to_pri_reason(enum AST_REDIRECTING_REASON ast_reason)
397 switch (ast_reason) {
398 case AST_REDIRECTING_REASON_USER_BUSY:
399 pri_reason = PRI_REDIR_FORWARD_ON_BUSY;
401 case AST_REDIRECTING_REASON_NO_ANSWER:
402 pri_reason = PRI_REDIR_FORWARD_ON_NO_REPLY;
404 case AST_REDIRECTING_REASON_UNCONDITIONAL:
405 pri_reason = PRI_REDIR_UNCONDITIONAL;
407 case AST_REDIRECTING_REASON_DEFLECTION:
408 pri_reason = PRI_REDIR_DEFLECTION;
410 case AST_REDIRECTING_REASON_UNKNOWN:
412 pri_reason = PRI_REDIR_UNKNOWN;
421 * \brief Convert PRI number presentation to asterisk version.
424 * \param pri_presentation PRI number presentation.
426 * \return Equivalent asterisk number presentation value.
428 static int pri_to_ast_presentation(int pri_presentation)
430 int ast_presentation;
432 switch (pri_presentation) {
433 case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
434 ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
436 case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
437 ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
439 case PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
440 ast_presentation = AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN;
442 case PRES_ALLOWED_NETWORK_NUMBER:
443 ast_presentation = AST_PRES_ALLOWED_NETWORK_NUMBER;
445 case PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
446 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
448 case PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
449 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN;
451 case PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
452 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN;
454 case PRES_PROHIB_NETWORK_NUMBER:
455 ast_presentation = AST_PRES_PROHIB_NETWORK_NUMBER;
457 case PRES_NUMBER_NOT_AVAILABLE:
458 ast_presentation = AST_PRES_NUMBER_NOT_AVAILABLE;
461 ast_presentation = AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
465 return ast_presentation;
470 * \brief Convert asterisk number presentation to PRI version.
473 * \param ast_presentation Asterisk number presentation.
475 * \return Equivalent PRI number presentation value.
477 static int ast_to_pri_presentation(int ast_presentation)
479 int pri_presentation;
481 switch (ast_presentation) {
482 case AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
483 pri_presentation = PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
485 case AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
486 pri_presentation = PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
488 case AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
489 pri_presentation = PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN;
491 case AST_PRES_ALLOWED_NETWORK_NUMBER:
492 pri_presentation = PRES_ALLOWED_NETWORK_NUMBER;
494 case AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
495 pri_presentation = PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
497 case AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
498 pri_presentation = PRES_PROHIB_USER_NUMBER_PASSED_SCREEN;
500 case AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
501 pri_presentation = PRES_PROHIB_USER_NUMBER_FAILED_SCREEN;
503 case AST_PRES_PROHIB_NETWORK_NUMBER:
504 pri_presentation = PRES_PROHIB_NETWORK_NUMBER;
506 case AST_PRES_NUMBER_NOT_AVAILABLE:
507 pri_presentation = PRES_NUMBER_NOT_AVAILABLE;
510 pri_presentation = PRES_PROHIB_USER_NUMBER_NOT_SCREENED;
514 return pri_presentation;
519 * \brief Convert PRI name char_set to asterisk version.
522 * \param pri_char_set PRI name char_set.
524 * \return Equivalent asterisk name char_set value.
526 static enum AST_PARTY_CHAR_SET pri_to_ast_char_set(int pri_char_set)
528 enum AST_PARTY_CHAR_SET ast_char_set;
530 switch (pri_char_set) {
532 case PRI_CHAR_SET_UNKNOWN:
533 ast_char_set = AST_PARTY_CHAR_SET_UNKNOWN;
535 case PRI_CHAR_SET_ISO8859_1:
536 ast_char_set = AST_PARTY_CHAR_SET_ISO8859_1;
538 case PRI_CHAR_SET_WITHDRAWN:
539 ast_char_set = AST_PARTY_CHAR_SET_WITHDRAWN;
541 case PRI_CHAR_SET_ISO8859_2:
542 ast_char_set = AST_PARTY_CHAR_SET_ISO8859_2;
544 case PRI_CHAR_SET_ISO8859_3:
545 ast_char_set = AST_PARTY_CHAR_SET_ISO8859_3;
547 case PRI_CHAR_SET_ISO8859_4:
548 ast_char_set = AST_PARTY_CHAR_SET_ISO8859_4;
550 case PRI_CHAR_SET_ISO8859_5:
551 ast_char_set = AST_PARTY_CHAR_SET_ISO8859_5;
553 case PRI_CHAR_SET_ISO8859_7:
554 ast_char_set = AST_PARTY_CHAR_SET_ISO8859_7;
556 case PRI_CHAR_SET_ISO10646_BMPSTRING:
557 ast_char_set = AST_PARTY_CHAR_SET_ISO10646_BMPSTRING;
559 case PRI_CHAR_SET_ISO10646_UTF_8STRING:
560 ast_char_set = AST_PARTY_CHAR_SET_ISO10646_UTF_8STRING;
569 * \brief Convert asterisk name char_set to PRI version.
572 * \param ast_char_set Asterisk name char_set.
574 * \return Equivalent PRI name char_set value.
576 static int ast_to_pri_char_set(enum AST_PARTY_CHAR_SET ast_char_set)
580 switch (ast_char_set) {
582 case AST_PARTY_CHAR_SET_UNKNOWN:
583 pri_char_set = PRI_CHAR_SET_UNKNOWN;
585 case AST_PARTY_CHAR_SET_ISO8859_1:
586 pri_char_set = PRI_CHAR_SET_ISO8859_1;
588 case AST_PARTY_CHAR_SET_WITHDRAWN:
589 pri_char_set = PRI_CHAR_SET_WITHDRAWN;
591 case AST_PARTY_CHAR_SET_ISO8859_2:
592 pri_char_set = PRI_CHAR_SET_ISO8859_2;
594 case AST_PARTY_CHAR_SET_ISO8859_3:
595 pri_char_set = PRI_CHAR_SET_ISO8859_3;
597 case AST_PARTY_CHAR_SET_ISO8859_4:
598 pri_char_set = PRI_CHAR_SET_ISO8859_4;
600 case AST_PARTY_CHAR_SET_ISO8859_5:
601 pri_char_set = PRI_CHAR_SET_ISO8859_5;
603 case AST_PARTY_CHAR_SET_ISO8859_7:
604 pri_char_set = PRI_CHAR_SET_ISO8859_7;
606 case AST_PARTY_CHAR_SET_ISO10646_BMPSTRING:
607 pri_char_set = PRI_CHAR_SET_ISO10646_BMPSTRING;
609 case AST_PARTY_CHAR_SET_ISO10646_UTF_8STRING:
610 pri_char_set = PRI_CHAR_SET_ISO10646_UTF_8STRING;
617 #if defined(HAVE_PRI_SUBADDR)
620 * \brief Fill in the asterisk party subaddress from the given PRI party subaddress.
623 * \param ast_subaddress Asterisk party subaddress structure.
624 * \param pri_subaddress PRI party subaddress structure.
629 static void sig_pri_set_subaddress(struct ast_party_subaddress *ast_subaddress, const struct pri_party_subaddress *pri_subaddress)
634 if (ast_subaddress->str) {
635 ast_free(ast_subaddress->str);
637 if (pri_subaddress->length <= 0) {
638 ast_party_subaddress_init(ast_subaddress);
642 if (!pri_subaddress->type) {
644 ast_subaddress->str = ast_strdup((char *) pri_subaddress->data);
647 if (!(cnum = ast_malloc(2 * pri_subaddress->length + 1))) {
648 ast_party_subaddress_init(ast_subaddress);
653 len = pri_subaddress->length - 1; /* -1 account for zero based indexing */
654 for (x = 0; x < len; ++x) {
655 ptr += sprintf(ptr, "%02x", pri_subaddress->data[x]);
658 if (pri_subaddress->odd_even_indicator) {
660 sprintf(ptr, "%01x", (pri_subaddress->data[len]) >> 4);
663 sprintf(ptr, "%02x", pri_subaddress->data[len]);
665 ast_subaddress->str = cnum;
667 ast_subaddress->type = pri_subaddress->type;
668 ast_subaddress->odd_even_indicator = pri_subaddress->odd_even_indicator;
669 ast_subaddress->valid = 1;
671 #endif /* defined(HAVE_PRI_SUBADDR) */
673 #if defined(HAVE_PRI_SUBADDR)
674 static unsigned char ast_pri_pack_hex_char(char c)
680 } else if (c < ('9' + 1)) {
682 } else if (c < 'A') {
684 } else if (c < ('F' + 1)) {
686 } else if (c < 'a') {
688 } else if (c < ('f' + 1)) {
695 #endif /* defined(HAVE_PRI_SUBADDR) */
697 #if defined(HAVE_PRI_SUBADDR)
700 * \brief Convert a null terminated hexadecimal string to a packed hex byte array.
701 * \details left justified, with 0 padding if odd length.
704 * \param dst pointer to packed byte array.
705 * \param src pointer to null terminated hexadecimal string.
706 * \param maxlen destination array size.
708 * \return Length of byte array
710 * \note The dst is not an ASCIIz string.
711 * \note The src is an ASCIIz hex string.
713 static int ast_pri_pack_hex_string(unsigned char *dst, char *src, int maxlen)
716 int len = strlen(src);
718 if (len > (2 * maxlen)) {
722 res = len / 2 + len % 2;
725 *dst = ast_pri_pack_hex_char(*src) << 4;
727 *dst |= ast_pri_pack_hex_char(*src);
731 if (len) { /* 1 left */
732 *dst = ast_pri_pack_hex_char(*src) << 4;
736 #endif /* defined(HAVE_PRI_SUBADDR) */
738 #if defined(HAVE_PRI_SUBADDR)
741 * \brief Fill in the PRI party subaddress from the given asterisk party subaddress.
744 * \param pri_subaddress PRI party subaddress structure.
745 * \param ast_subaddress Asterisk party subaddress structure.
749 * \note Assumes that pri_subaddress has been previously memset to zero.
751 static void sig_pri_party_subaddress_from_ast(struct pri_party_subaddress *pri_subaddress, const struct ast_party_subaddress *ast_subaddress)
753 if (ast_subaddress->valid && !ast_strlen_zero(ast_subaddress->str)) {
754 pri_subaddress->type = ast_subaddress->type;
755 if (!ast_subaddress->type) {
757 ast_copy_string((char *) pri_subaddress->data, ast_subaddress->str,
758 sizeof(pri_subaddress->data));
759 pri_subaddress->length = strlen((char *) pri_subaddress->data);
760 pri_subaddress->odd_even_indicator = 0;
761 pri_subaddress->valid = 1;
763 /* 2 = User Specified */
765 * Copy HexString to packed HexData,
766 * if odd length then right pad trailing byte with 0
768 int length = ast_pri_pack_hex_string(pri_subaddress->data,
769 ast_subaddress->str, sizeof(pri_subaddress->data));
771 pri_subaddress->length = length; /* packed data length */
773 length = strlen(ast_subaddress->str);
774 if (length > 2 * sizeof(pri_subaddress->data)) {
775 pri_subaddress->odd_even_indicator = 0;
777 pri_subaddress->odd_even_indicator = (length & 1);
779 pri_subaddress->valid = 1;
783 #endif /* defined(HAVE_PRI_SUBADDR) */
787 * \brief Fill in the PRI party name from the given asterisk party name.
790 * \param pri_name PRI party name structure.
791 * \param ast_name Asterisk party name structure.
795 * \note Assumes that pri_name has been previously memset to zero.
797 static void sig_pri_party_name_from_ast(struct pri_party_name *pri_name, const struct ast_party_name *ast_name)
799 if (!ast_name->valid) {
803 pri_name->presentation = ast_to_pri_presentation(ast_name->presentation);
804 pri_name->char_set = ast_to_pri_char_set(ast_name->char_set);
805 if (!ast_strlen_zero(ast_name->str)) {
806 ast_copy_string(pri_name->str, ast_name->str, sizeof(pri_name->str));
812 * \brief Fill in the PRI party number from the given asterisk party number.
815 * \param pri_number PRI party number structure.
816 * \param ast_number Asterisk party number structure.
820 * \note Assumes that pri_number has been previously memset to zero.
822 static void sig_pri_party_number_from_ast(struct pri_party_number *pri_number, const struct ast_party_number *ast_number)
824 if (!ast_number->valid) {
827 pri_number->valid = 1;
828 pri_number->presentation = ast_to_pri_presentation(ast_number->presentation);
829 pri_number->plan = ast_number->plan;
830 if (!ast_strlen_zero(ast_number->str)) {
831 ast_copy_string(pri_number->str, ast_number->str, sizeof(pri_number->str));
837 * \brief Fill in the PRI party id from the given asterisk party id.
840 * \param pri_id PRI party id structure.
841 * \param ast_id Asterisk party id structure.
845 * \note Assumes that pri_id has been previously memset to zero.
847 static void sig_pri_party_id_from_ast(struct pri_party_id *pri_id, const struct ast_party_id *ast_id)
849 sig_pri_party_name_from_ast(&pri_id->name, &ast_id->name);
850 sig_pri_party_number_from_ast(&pri_id->number, &ast_id->number);
851 #if defined(HAVE_PRI_SUBADDR)
852 sig_pri_party_subaddress_from_ast(&pri_id->subaddress, &ast_id->subaddress);
853 #endif /* defined(HAVE_PRI_SUBADDR) */
858 * \brief Update the PRI redirecting information for the current call.
861 * \param pvt sig_pri private channel structure.
862 * \param ast Asterisk channel
866 * \note Assumes that the PRI lock is already obtained.
868 static void sig_pri_redirecting_update(struct sig_pri_chan *pvt, struct ast_channel *ast)
870 struct pri_party_redirecting pri_redirecting;
872 /*! \todo XXX Original called data can be put in a channel data store that is inherited. */
874 memset(&pri_redirecting, 0, sizeof(pri_redirecting));
875 sig_pri_party_id_from_ast(&pri_redirecting.from, &ast->redirecting.from);
876 sig_pri_party_id_from_ast(&pri_redirecting.to, &ast->redirecting.to);
877 pri_redirecting.count = ast->redirecting.count;
878 pri_redirecting.reason = ast_to_pri_reason(ast->redirecting.reason);
880 pri_redirecting_update(pvt->pri->pri, pvt->call, &pri_redirecting);
885 * \brief Reset DTMF detector.
888 * \param p sig_pri channel structure.
892 static void sig_pri_dsp_reset_and_flush_digits(struct sig_pri_chan *p)
894 if (p->calls->dsp_reset_and_flush_digits) {
895 p->calls->dsp_reset_and_flush_digits(p->chan_pvt);
899 static int sig_pri_set_echocanceller(struct sig_pri_chan *p, int enable)
901 if (p->calls->set_echocanceller)
902 return p->calls->set_echocanceller(p->chan_pvt, enable);
907 static void sig_pri_fixup_chans(struct sig_pri_chan *old_chan, struct sig_pri_chan *new_chan)
909 if (old_chan->calls->fixup_chans)
910 old_chan->calls->fixup_chans(old_chan->chan_pvt, new_chan->chan_pvt);
913 static int sig_pri_play_tone(struct sig_pri_chan *p, enum sig_pri_tone tone)
915 if (p->calls->play_tone)
916 return p->calls->play_tone(p->chan_pvt, tone);
921 static struct ast_channel *sig_pri_new_ast_channel(struct sig_pri_chan *p, int state, int ulaw, int transfercapability, char *exten, const struct ast_channel *requestor)
923 struct ast_channel *c;
925 if (p->calls->new_ast_channel) {
926 c = p->calls->new_ast_channel(p->chan_pvt, state, ulaw, exten, requestor);
937 p->alreadyhungup = 0;
938 c->transfercapability = transfercapability;
939 pbx_builtin_setvar_helper(c, "TRANSFERCAPABILITY",
940 ast_transfercapability2str(transfercapability));
941 if (transfercapability & AST_TRANS_CAP_DIGITAL) {
942 sig_pri_set_digital(p, 1);
945 ast_mutex_lock(&p->pri->lock);
946 sig_pri_span_devstate_changed(p->pri);
947 ast_mutex_unlock(&p->pri->lock);
955 * \brief Open the PRI channel media path.
958 * \param p Channel private control structure.
962 static void sig_pri_open_media(struct sig_pri_chan *p)
964 if (p->no_b_channel) {
968 if (p->calls->open_media) {
969 p->calls->open_media(p->chan_pvt);
975 * \brief Post an AMI B channel association event.
978 * \param p Channel private control structure.
980 * \note Assumes the private and owner are locked.
984 static void sig_pri_ami_channel_event(struct sig_pri_chan *p)
986 if (p->calls->ami_channel_event) {
987 p->calls->ami_channel_event(p->chan_pvt, p->owner);
991 struct ast_channel *sig_pri_request(struct sig_pri_chan *p, enum sig_pri_law law, const struct ast_channel *requestor, int transfercapability)
993 struct ast_channel *ast;
995 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
998 ast = sig_pri_new_ast_channel(p, AST_STATE_RESERVED, law, transfercapability, p->exten, requestor);
1005 int pri_is_up(struct sig_pri_span *pri)
1008 for (x = 0; x < SIG_PRI_NUM_DCHANS; x++) {
1009 if (pri->dchanavail[x] == DCHAN_AVAILABLE)
1015 static char *pri_order(int level)
1025 return "Quaternary";
1031 /* Returns index of the active dchan */
1032 static int pri_active_dchan_index(struct sig_pri_span *pri)
1036 for (x = 0; x < SIG_PRI_NUM_DCHANS; x++) {
1037 if ((pri->dchans[x] == pri->pri))
1041 ast_log(LOG_WARNING, "No active dchan found!\n");
1045 static int pri_find_dchan(struct sig_pri_span *pri)
1052 for (x = 0; x < SIG_PRI_NUM_DCHANS; x++) {
1053 if ((pri->dchanavail[x] == DCHAN_AVAILABLE) && (newslot < 0))
1055 if (pri->dchans[x] == old) {
1061 /* This is annoying to see on non persistent layer 2 connections. Let's not complain in that case */
1062 if (pri->sig != SIG_BRI_PTMP && !pri->no_d_channels) {
1063 pri->no_d_channels = 1;
1064 ast_log(LOG_WARNING,
1065 "Span %d: No D-channels available! Using Primary channel as D-channel anyway!\n",
1069 pri->no_d_channels = 0;
1071 if (old && (oldslot != newslot))
1072 ast_log(LOG_NOTICE, "Switching from d-channel fd %d to fd %d!\n",
1073 pri->fds[oldslot], pri->fds[newslot]);
1074 pri->pri = pri->dchans[newslot];
1080 * \brief Determine if a private channel structure is in use.
1083 * \param pvt Channel to determine if in use.
1085 * \return TRUE if the channel is in use.
1087 static int sig_pri_is_chan_in_use(struct sig_pri_chan *pvt)
1089 return pvt->owner || pvt->call || pvt->allocated || pvt->resetting || pvt->inalarm;
1093 * \brief Determine if a private channel structure is available.
1096 * \param pvt Channel to determine if available.
1098 * \return TRUE if the channel is available.
1100 int sig_pri_is_chan_available(struct sig_pri_chan *pvt)
1102 return !sig_pri_is_chan_in_use(pvt)
1103 #if defined(HAVE_PRI_SERVICE_MESSAGES)
1104 /* And not out-of-service */
1105 && !pvt->service_status
1106 #endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
1112 * \brief Obtain the sig_pri owner channel lock if the owner exists.
1115 * \param pri PRI span control structure.
1116 * \param chanpos Channel position in the span.
1118 * \note Assumes the pri->lock is already obtained.
1119 * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
1123 static void sig_pri_lock_owner(struct sig_pri_span *pri, int chanpos)
1126 if (!pri->pvts[chanpos]->owner) {
1127 /* There is no owner lock to get. */
1130 if (!ast_channel_trylock(pri->pvts[chanpos]->owner)) {
1131 /* We got the lock */
1134 /* We must unlock the PRI to avoid the possibility of a deadlock */
1135 ast_mutex_unlock(&pri->lock);
1136 sig_pri_deadlock_avoidance_private(pri->pvts[chanpos]);
1137 ast_mutex_lock(&pri->lock);
1143 * \brief Queue the given frame onto the owner channel.
1146 * \param pri PRI span control structure.
1147 * \param chanpos Channel position in the span.
1148 * \param frame Frame to queue onto the owner channel.
1150 * \note Assumes the pri->lock is already obtained.
1151 * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
1155 static void pri_queue_frame(struct sig_pri_span *pri, int chanpos, struct ast_frame *frame)
1157 sig_pri_lock_owner(pri, chanpos);
1158 if (pri->pvts[chanpos]->owner) {
1159 ast_queue_frame(pri->pvts[chanpos]->owner, frame);
1160 ast_channel_unlock(pri->pvts[chanpos]->owner);
1166 * \brief Queue a control frame of the specified subclass onto the owner channel.
1169 * \param pri PRI span control structure.
1170 * \param chanpos Channel position in the span.
1171 * \param subclass Control frame subclass to queue onto the owner channel.
1173 * \note Assumes the pri->lock is already obtained.
1174 * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
1178 static void pri_queue_control(struct sig_pri_span *pri, int chanpos, int subclass)
1180 struct ast_frame f = {AST_FRAME_CONTROL, };
1181 struct sig_pri_chan *p = pri->pvts[chanpos];
1183 if (p->calls->queue_control) {
1184 p->calls->queue_control(p->chan_pvt, subclass);
1187 f.subclass.integer = subclass;
1188 pri_queue_frame(pri, chanpos, &f);
1193 * \brief Find the channel associated with the libpri call.
1196 * \param pri PRI span control structure.
1197 * \param call LibPRI opaque call pointer to find.
1199 * \note Assumes the pri->lock is already obtained.
1201 * \retval array-index into private pointer array on success.
1202 * \retval -1 on error.
1204 static int pri_find_principle_by_call(struct sig_pri_span *pri, q931_call *call)
1209 /* Cannot find a call without a call. */
1212 for (idx = 0; idx < pri->numchans; ++idx) {
1213 if (pri->pvts[idx] && pri->pvts[idx]->call == call) {
1214 /* Found the principle */
1223 * \brief Kill the call.
1226 * \param pri PRI span control structure.
1227 * \param call LibPRI opaque call pointer to find.
1228 * \param cause Reason call was killed.
1230 * \note Assumes the pvt->pri->lock is already obtained.
1234 static void sig_pri_kill_call(struct sig_pri_span *pri, q931_call *call, int cause)
1238 chanpos = pri_find_principle_by_call(pri, call);
1240 pri_hangup(pri->pri, call, cause);
1243 sig_pri_lock_private(pri->pvts[chanpos]);
1244 if (!pri->pvts[chanpos]->owner) {
1245 pri_hangup(pri->pri, call, cause);
1246 pri->pvts[chanpos]->call = NULL;
1247 sig_pri_unlock_private(pri->pvts[chanpos]);
1248 sig_pri_span_devstate_changed(pri);
1251 pri->pvts[chanpos]->owner->hangupcause = cause;
1252 pri_queue_control(pri, chanpos, AST_CONTROL_HANGUP);
1253 sig_pri_unlock_private(pri->pvts[chanpos]);
1258 * \brief Find the private structure for the libpri call.
1260 * \param pri PRI span control structure.
1261 * \param channel LibPRI encoded channel ID.
1262 * \param call LibPRI opaque call pointer.
1264 * \note Assumes the pri->lock is already obtained.
1266 * \retval array-index into private pointer array on success.
1267 * \retval -1 on error.
1269 static int pri_find_principle(struct sig_pri_span *pri, int channel, q931_call *call)
1277 /* Channel is not picked yet. */
1281 prioffset = PRI_CHANNEL(channel);
1282 if (!prioffset || (channel & PRI_HELD_CALL)) {
1283 /* Find the call waiting call or held call. */
1284 return pri_find_principle_by_call(pri, call);
1287 span = PRI_SPAN(channel);
1288 if (!(channel & PRI_EXPLICIT)) {
1291 index = pri_active_dchan_index(pri);
1295 span = pri->dchan_logical_span[index];
1299 for (x = 0; x < pri->numchans; x++) {
1301 && pri->pvts[x]->prioffset == prioffset
1302 && pri->pvts[x]->logicalspan == span
1303 && !pri->pvts[x]->no_b_channel) {
1314 * \brief Fixup the private structure associated with the libpri call.
1316 * \param pri PRI span control structure.
1317 * \param principle Array-index into private array to move call to if not already there.
1318 * \param call LibPRI opaque call pointer to find if need to move call.
1320 * \note Assumes the pri->lock is already obtained.
1322 * \retval principle on success.
1323 * \retval -1 on error.
1325 static int pri_fixup_principle(struct sig_pri_span *pri, int principle, q931_call *call)
1329 if (principle < 0 || pri->numchans <= principle) {
1337 if (pri->pvts[principle] && pri->pvts[principle]->call == call) {
1338 /* Call is already on the specified principle. */
1342 /* Find the old principle location. */
1343 for (x = 0; x < pri->numchans; x++) {
1344 struct sig_pri_chan *new_chan;
1345 struct sig_pri_chan *old_chan;
1347 if (!pri->pvts[x] || pri->pvts[x]->call != call) {
1351 /* Found our call */
1352 new_chan = pri->pvts[principle];
1353 old_chan = pri->pvts[x];
1355 /* Get locks to safely move to the new private structure. */
1356 sig_pri_lock_private(old_chan);
1357 sig_pri_lock_owner(pri, x);
1358 sig_pri_lock_private(new_chan);
1360 ast_verb(3, "Moving call (%s) from channel %d to %d.\n",
1361 old_chan->owner ? old_chan->owner->name : "",
1362 old_chan->channel, new_chan->channel);
1363 if (!sig_pri_is_chan_available(new_chan)) {
1364 ast_log(LOG_WARNING,
1365 "Can't move call (%s) from channel %d to %d. It is already in use.\n",
1366 old_chan->owner ? old_chan->owner->name : "",
1367 old_chan->channel, new_chan->channel);
1368 sig_pri_unlock_private(new_chan);
1369 if (old_chan->owner) {
1370 ast_channel_unlock(old_chan->owner);
1372 sig_pri_unlock_private(old_chan);
1376 sig_pri_fixup_chans(old_chan, new_chan);
1378 /* Fix it all up now */
1379 new_chan->owner = old_chan->owner;
1380 old_chan->owner = NULL;
1382 new_chan->call = old_chan->call;
1383 old_chan->call = NULL;
1385 /* Transfer flags from the old channel. */
1386 #if defined(HAVE_PRI_AOC_EVENTS)
1387 new_chan->aoc_s_request_invoke_id_valid = old_chan->aoc_s_request_invoke_id_valid;
1388 new_chan->waiting_for_aoce = old_chan->waiting_for_aoce;
1389 new_chan->holding_aoce = old_chan->holding_aoce;
1390 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
1391 new_chan->alreadyhungup = old_chan->alreadyhungup;
1392 new_chan->isidlecall = old_chan->isidlecall;
1393 new_chan->progress = old_chan->progress;
1394 new_chan->allocated = old_chan->allocated;
1395 new_chan->outgoing = old_chan->outgoing;
1396 new_chan->digital = old_chan->digital;
1397 #if defined(HAVE_PRI_CALL_WAITING)
1398 new_chan->is_call_waiting = old_chan->is_call_waiting;
1399 #endif /* defined(HAVE_PRI_CALL_WAITING) */
1401 #if defined(HAVE_PRI_AOC_EVENTS)
1402 old_chan->aoc_s_request_invoke_id_valid = 0;
1403 old_chan->waiting_for_aoce = 0;
1404 old_chan->holding_aoce = 0;
1405 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
1406 old_chan->alreadyhungup = 0;
1407 old_chan->isidlecall = 0;
1408 old_chan->progress = 0;
1409 old_chan->allocated = 0;
1410 old_chan->outgoing = 0;
1411 old_chan->digital = 0;
1412 #if defined(HAVE_PRI_CALL_WAITING)
1413 old_chan->is_call_waiting = 0;
1414 #endif /* defined(HAVE_PRI_CALL_WAITING) */
1416 /* More stuff to transfer to the new channel. */
1417 new_chan->call_level = old_chan->call_level;
1418 old_chan->call_level = SIG_PRI_CALL_LEVEL_IDLE;
1419 #if defined(HAVE_PRI_REVERSE_CHARGE)
1420 new_chan->reverse_charging_indication = old_chan->reverse_charging_indication;
1421 #endif /* defined(HAVE_PRI_REVERSE_CHARGE) */
1422 #if defined(HAVE_PRI_SETUP_KEYPAD)
1423 strcpy(new_chan->keypad_digits, old_chan->keypad_digits);
1424 #endif /* defined(HAVE_PRI_SETUP_KEYPAD) */
1425 strcpy(new_chan->moh_suggested, old_chan->moh_suggested);
1426 new_chan->moh_state = old_chan->moh_state;
1427 old_chan->moh_state = SIG_PRI_MOH_STATE_IDLE;
1429 #if defined(HAVE_PRI_AOC_EVENTS)
1430 new_chan->aoc_s_request_invoke_id = old_chan->aoc_s_request_invoke_id;
1431 new_chan->aoc_e = old_chan->aoc_e;
1432 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
1433 strcpy(new_chan->user_tag, old_chan->user_tag);
1435 if (new_chan->no_b_channel) {
1436 /* Copy the real channel configuration to the no B channel interface. */
1437 new_chan->hidecallerid = old_chan->hidecallerid;
1438 new_chan->hidecalleridname = old_chan->hidecalleridname;
1439 new_chan->immediate = old_chan->immediate;
1440 new_chan->priexclusive = old_chan->priexclusive;
1441 new_chan->priindication_oob = old_chan->priindication_oob;
1442 new_chan->use_callerid = old_chan->use_callerid;
1443 new_chan->use_callingpres = old_chan->use_callingpres;
1444 new_chan->stripmsd = old_chan->stripmsd;
1445 strcpy(new_chan->context, old_chan->context);
1446 strcpy(new_chan->mohinterpret, old_chan->mohinterpret);
1448 /* Become a member of the old channel span/trunk-group. */
1449 new_chan->logicalspan = old_chan->logicalspan;
1450 new_chan->mastertrunkgroup = old_chan->mastertrunkgroup;
1451 } else if (old_chan->no_b_channel) {
1453 * We are transitioning from a held/call-waiting channel to a
1454 * real channel so we need to make sure that the media path is
1455 * open. (Needed especially if the channel is natively
1458 sig_pri_open_media(new_chan);
1461 if (new_chan->owner) {
1462 sig_pri_ami_channel_event(new_chan);
1465 sig_pri_unlock_private(old_chan);
1466 if (new_chan->owner) {
1467 ast_channel_unlock(new_chan->owner);
1469 sig_pri_unlock_private(new_chan);
1473 ast_verb(3, "Call specified, but not found.\n");
1479 * \brief Find and fixup the private structure associated with the libpri call.
1481 * \param pri PRI span control structure.
1482 * \param channel LibPRI encoded channel ID.
1483 * \param call LibPRI opaque call pointer.
1486 * This is a combination of pri_find_principle() and pri_fixup_principle()
1487 * to reduce code redundancy and to make handling several PRI_EVENT_xxx's
1488 * consistent for the current architecture.
1490 * \note Assumes the pri->lock is already obtained.
1492 * \retval array-index into private pointer array on success.
1493 * \retval -1 on error.
1495 static int pri_find_fixup_principle(struct sig_pri_span *pri, int channel, q931_call *call)
1499 chanpos = pri_find_principle(pri, channel, call);
1501 ast_log(LOG_WARNING, "Span %d: PRI requested channel %d/%d is unconfigured.\n",
1502 pri->span, PRI_SPAN(channel), PRI_CHANNEL(channel));
1503 sig_pri_kill_call(pri, call, PRI_CAUSE_IDENTIFIED_CHANNEL_NOTEXIST);
1506 chanpos = pri_fixup_principle(pri, chanpos, call);
1508 ast_log(LOG_WARNING, "Span %d: PRI requested channel %d/%d is not available.\n",
1509 pri->span, PRI_SPAN(channel), PRI_CHANNEL(channel));
1511 * Using Q.931 section 5.2.3.1 b) as the reason for picking
1512 * PRI_CAUSE_CHANNEL_UNACCEPTABLE. Receiving a
1513 * PRI_CAUSE_REQUESTED_CHAN_UNAVAIL would cause us to restart
1514 * that channel (which is not specified by Q.931) and kill some
1515 * other call which would be bad.
1517 sig_pri_kill_call(pri, call, PRI_CAUSE_CHANNEL_UNACCEPTABLE);
1523 static char * redirectingreason2str(int redirectingreason)
1525 switch (redirectingreason) {
1533 return "UNCONDITIONAL";
1535 return "NOREDIRECT";
1539 static char *dialplan2str(int dialplan)
1541 if (dialplan == -1) {
1542 return("Dynamically set dialplan in ISDN");
1544 return (pri_plan2str(dialplan));
1549 * \brief Apply numbering plan prefix to the given number.
1551 * \param buf Buffer to put number into.
1552 * \param size Size of given buffer.
1553 * \param pri PRI span control structure.
1554 * \param number Number to apply numbering plan.
1555 * \param plan Numbering plan to apply.
1559 static void apply_plan_to_number(char *buf, size_t size, const struct sig_pri_span *pri, const char *number, int plan)
1562 case PRI_INTERNATIONAL_ISDN: /* Q.931 dialplan == 0x11 international dialplan => prepend international prefix digits */
1563 snprintf(buf, size, "%s%s", pri->internationalprefix, number);
1565 case PRI_NATIONAL_ISDN: /* Q.931 dialplan == 0x21 national dialplan => prepend national prefix digits */
1566 snprintf(buf, size, "%s%s", pri->nationalprefix, number);
1568 case PRI_LOCAL_ISDN: /* Q.931 dialplan == 0x41 local dialplan => prepend local prefix digits */
1569 snprintf(buf, size, "%s%s", pri->localprefix, number);
1571 case PRI_PRIVATE: /* Q.931 dialplan == 0x49 private dialplan => prepend private prefix digits */
1572 snprintf(buf, size, "%s%s", pri->privateprefix, number);
1574 case PRI_UNKNOWN: /* Q.931 dialplan == 0x00 unknown dialplan => prepend unknown prefix digits */
1575 snprintf(buf, size, "%s%s", pri->unknownprefix, number);
1577 default: /* other Q.931 dialplan => don't twiddle with callingnum */
1578 snprintf(buf, size, "%s", number);
1585 * \brief Apply numbering plan prefix to the given number if the number exists.
1587 * \param buf Buffer to put number into.
1588 * \param size Size of given buffer.
1589 * \param pri PRI span control structure.
1590 * \param number Number to apply numbering plan.
1591 * \param plan Numbering plan to apply.
1595 static void apply_plan_to_existing_number(char *buf, size_t size, const struct sig_pri_span *pri, const char *number, int plan)
1597 /* Make sure a number exists so the prefix isn't placed on an empty string. */
1598 if (ast_strlen_zero(number)) {
1604 apply_plan_to_number(buf, size, pri, number, plan);
1609 * \brief Restart the next channel we think is idle on the span.
1611 * \param pri PRI span control structure.
1613 * \note Assumes the pri->lock is already obtained.
1617 static void pri_check_restart(struct sig_pri_span *pri)
1619 #if defined(HAVE_PRI_SERVICE_MESSAGES)
1621 #endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
1623 for (++pri->resetpos; pri->resetpos < pri->numchans; ++pri->resetpos) {
1624 if (!pri->pvts[pri->resetpos]
1625 || pri->pvts[pri->resetpos]->no_b_channel
1626 || sig_pri_is_chan_in_use(pri->pvts[pri->resetpos])) {
1629 #if defined(HAVE_PRI_SERVICE_MESSAGES)
1630 why = pri->pvts[pri->resetpos]->service_status;
1633 "Span %d: channel %d out-of-service (reason: %s), not sending RESTART\n",
1634 pri->span, pri->pvts[pri->resetpos]->channel,
1635 (why & SRVST_FAREND) ? (why & SRVST_NEAREND) ? "both ends" : "far end" : "near end");
1638 #endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
1641 if (pri->resetpos < pri->numchans) {
1642 /* Mark the channel as resetting and restart it */
1643 pri->pvts[pri->resetpos]->resetting = 1;
1644 pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[pri->resetpos]));
1647 time(&pri->lastreset);
1648 sig_pri_span_devstate_changed(pri);
1652 #if defined(HAVE_PRI_CALL_WAITING)
1655 * \brief Init the private channel configuration using the span controller.
1658 * \param pvt Channel to init the configuration.
1659 * \param pri PRI span control structure.
1661 * \note Assumes the pri->lock is already obtained.
1665 static void sig_pri_init_config(struct sig_pri_chan *pvt, struct sig_pri_span *pri)
1667 pvt->stripmsd = pri->ch_cfg.stripmsd;
1668 pvt->hidecallerid = pri->ch_cfg.hidecallerid;
1669 pvt->hidecalleridname = pri->ch_cfg.hidecalleridname;
1670 pvt->immediate = pri->ch_cfg.immediate;
1671 pvt->priexclusive = pri->ch_cfg.priexclusive;
1672 pvt->priindication_oob = pri->ch_cfg.priindication_oob;
1673 pvt->use_callerid = pri->ch_cfg.use_callerid;
1674 pvt->use_callingpres = pri->ch_cfg.use_callingpres;
1675 ast_copy_string(pvt->context, pri->ch_cfg.context, sizeof(pvt->context));
1676 ast_copy_string(pvt->mohinterpret, pri->ch_cfg.mohinterpret, sizeof(pvt->mohinterpret));
1678 if (pri->calls->init_config) {
1679 pri->calls->init_config(pvt->chan_pvt, pri);
1682 #endif /* defined(HAVE_PRI_CALL_WAITING) */
1686 * \brief Find an empty B-channel interface to use.
1688 * \param pri PRI span control structure.
1689 * \param backwards TRUE if the search starts from higher channels.
1691 * \note Assumes the pri->lock is already obtained.
1693 * \retval array-index into private pointer array on success.
1694 * \retval -1 on error.
1696 static int pri_find_empty_chan(struct sig_pri_span *pri, int backwards)
1704 if (backwards && (x < 0))
1706 if (!backwards && (x >= pri->numchans))
1709 && !pri->pvts[x]->no_b_channel
1710 && sig_pri_is_chan_available(pri->pvts[x])) {
1711 ast_debug(1, "Found empty available channel %d/%d\n",
1712 pri->pvts[x]->logicalspan, pri->pvts[x]->prioffset);
1723 #if defined(HAVE_PRI_CALL_HOLD)
1726 * \brief Find or create an empty no-B-channel interface to use.
1729 * \param pri PRI span control structure.
1731 * \note Assumes the pri->lock is already obtained.
1733 * \retval array-index into private pointer array on success.
1734 * \retval -1 on error.
1736 static int pri_find_empty_nobch(struct sig_pri_span *pri)
1740 for (idx = 0; idx < pri->numchans; ++idx) {
1742 && pri->pvts[idx]->no_b_channel
1743 && sig_pri_is_chan_available(pri->pvts[idx])) {
1744 ast_debug(1, "Found empty available no B channel interface\n");
1749 /* Need to create a new interface. */
1750 if (pri->calls->new_nobch_intf) {
1751 idx = pri->calls->new_nobch_intf(pri);
1757 #endif /* defined(HAVE_PRI_CALL_HOLD) */
1759 static void *do_idle_thread(void *v_pvt)
1761 struct sig_pri_chan *pvt = v_pvt;
1762 struct ast_channel *chan = pvt->owner;
1763 struct ast_frame *f;
1765 /* Wait up to 30 seconds for an answer */
1766 int newms, ms = 30000;
1768 ast_verb(3, "Initiating idle call on channel %s\n", chan->name);
1769 snprintf(ex, sizeof(ex), "%d/%s", pvt->channel, pvt->pri->idledial);
1770 if (ast_call(chan, ex, 0)) {
1771 ast_log(LOG_WARNING, "Idle dial failed on '%s' to '%s'\n", chan->name, ex);
1775 while ((newms = ast_waitfor(chan, ms)) > 0) {
1781 if (f->frametype == AST_FRAME_CONTROL) {
1782 switch (f->subclass.integer) {
1783 case AST_CONTROL_ANSWER:
1784 /* Launch the PBX */
1785 ast_copy_string(chan->exten, pvt->pri->idleext, sizeof(chan->exten));
1786 ast_copy_string(chan->context, pvt->pri->idlecontext, sizeof(chan->context));
1788 ast_verb(4, "Idle channel '%s' answered, sending to %s@%s\n", chan->name, chan->exten, chan->context);
1790 /* It's already hungup, return immediately */
1792 case AST_CONTROL_BUSY:
1793 ast_verb(4, "Idle channel '%s' busy, waiting...\n", chan->name);
1795 case AST_CONTROL_CONGESTION:
1796 ast_verb(4, "Idle channel '%s' congested, waiting...\n", chan->name);
1803 /* Hangup the channel since nothing happend */
1808 static void *pri_ss_thread(void *data)
1810 struct sig_pri_chan *p = data;
1811 struct ast_channel *chan = p->owner;
1812 char exten[AST_MAX_EXTENSION];
1818 /* We lost the owner before we could get started. */
1823 * In the bizarre case where the channel has become a zombie before we
1824 * even get started here, abort safely.
1826 if (!chan->tech_pvt) {
1827 ast_log(LOG_WARNING, "Channel became a zombie before simple switch could be started (%s)\n", chan->name);
1832 ast_verb(3, "Starting simple switch on '%s'\n", chan->name);
1834 sig_pri_dsp_reset_and_flush_digits(p);
1836 /* Now loop looking for an extension */
1837 ast_copy_string(exten, p->exten, sizeof(exten));
1838 len = strlen(exten);
1840 while ((len < AST_MAX_EXTENSION-1) && ast_matchmore_extension(chan, chan->context, exten, 1, p->cid_num)) {
1841 if (len && !ast_ignore_pattern(chan->context, exten))
1842 sig_pri_play_tone(p, -1);
1844 sig_pri_play_tone(p, SIG_PRI_TONE_DIALTONE);
1845 if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num))
1846 timeout = pri_matchdigittimeout;
1848 timeout = pri_gendigittimeout;
1849 res = ast_waitfordigit(chan, timeout);
1851 ast_debug(1, "waitfordigit returned < 0...\n");
1860 /* if no extension was received ('unspecified') on overlap call, use the 's' extension */
1861 if (ast_strlen_zero(exten)) {
1862 ast_verb(3, "Going to extension s|1 because of empty extension received on overlap call\n");
1866 ast_free(chan->dialed.number.str);
1867 chan->dialed.number.str = ast_strdup(exten);
1869 if (p->pri->append_msn_to_user_tag && p->pri->nodetype != PRI_NETWORK) {
1871 * Update the user tag for party id's from this device for this call
1872 * now that we have a complete MSN from the network.
1874 snprintf(p->user_tag, sizeof(p->user_tag), "%s_%s", p->pri->initial_user_tag,
1876 ast_free(chan->caller.id.tag);
1877 chan->caller.id.tag = ast_strdup(p->user_tag);
1880 sig_pri_play_tone(p, -1);
1881 if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num)) {
1882 /* Start the real PBX */
1883 ast_copy_string(chan->exten, exten, sizeof(chan->exten));
1884 sig_pri_dsp_reset_and_flush_digits(p);
1885 #if defined(ISSUE_16789)
1887 * Conditionaled out this code to effectively revert the Mantis
1888 * issue 16789 change. It breaks overlap dialing through
1889 * Asterisk. There is not enough information available at this
1890 * point to know if dialing is complete. The
1891 * ast_exists_extension(), ast_matchmore_extension(), and
1892 * ast_canmatch_extension() calls are not adequate to detect a
1893 * dial through extension pattern of "_9!".
1895 * Workaround is to use the dialplan Proceeding() application
1896 * early on non-dial through extensions.
1898 if ((p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)
1899 && !ast_matchmore_extension(chan, chan->context, exten, 1, p->cid_num)) {
1900 sig_pri_lock_private(p);
1902 if (!pri_grab(p, p->pri)) {
1903 if (p->call_level < SIG_PRI_CALL_LEVEL_PROCEEDING) {
1904 p->call_level = SIG_PRI_CALL_LEVEL_PROCEEDING;
1906 pri_proceeding(p->pri->pri, p->call, PVT_TO_CHANNEL(p), 0);
1909 ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->pri->span);
1912 sig_pri_unlock_private(p);
1914 #endif /* defined(ISSUE_16789) */
1916 sig_pri_set_echocanceller(p, 1);
1917 ast_setstate(chan, AST_STATE_RING);
1918 res = ast_pbx_run(chan);
1920 ast_log(LOG_WARNING, "PBX exited non-zero!\n");
1923 ast_debug(1, "No such possible extension '%s' in context '%s'\n", exten, chan->context);
1924 chan->hangupcause = AST_CAUSE_UNALLOCATED;
1927 /* Since we send release complete here, we won't get one */
1929 ast_mutex_lock(&p->pri->lock);
1930 sig_pri_span_devstate_changed(p->pri);
1931 ast_mutex_unlock(&p->pri->lock);
1936 void pri_event_alarm(struct sig_pri_span *pri, int index, int before_start_pri)
1938 pri->dchanavail[index] &= ~(DCHAN_NOTINALARM | DCHAN_UP);
1939 if (!before_start_pri)
1940 pri_find_dchan(pri);
1943 void pri_event_noalarm(struct sig_pri_span *pri, int index, int before_start_pri)
1945 pri->dchanavail[index] |= DCHAN_NOTINALARM;
1946 if (!before_start_pri)
1947 pri_restart(pri->dchans[index]);
1952 * \brief Convert libpri party name into asterisk party name.
1955 * \param ast_name Asterisk party name structure to fill. Must already be set initialized.
1956 * \param pri_name libpri party name structure containing source information.
1958 * \note The filled in ast_name structure needs to be destroyed by
1959 * ast_party_name_free() when it is no longer needed.
1963 static void sig_pri_party_name_convert(struct ast_party_name *ast_name, const struct pri_party_name *pri_name)
1965 ast_name->str = ast_strdup(pri_name->str);
1966 ast_name->char_set = pri_to_ast_char_set(pri_name->char_set);
1967 ast_name->presentation = pri_to_ast_presentation(pri_name->presentation);
1968 ast_name->valid = 1;
1973 * \brief Convert libpri party number into asterisk party number.
1976 * \param ast_number Asterisk party number structure to fill. Must already be set initialized.
1977 * \param pri_number libpri party number structure containing source information.
1978 * \param pri PRI span control structure.
1980 * \note The filled in ast_number structure needs to be destroyed by
1981 * ast_party_number_free() when it is no longer needed.
1985 static void sig_pri_party_number_convert(struct ast_party_number *ast_number, const struct pri_party_number *pri_number, struct sig_pri_span *pri)
1987 char number[AST_MAX_EXTENSION];
1989 apply_plan_to_existing_number(number, sizeof(number), pri, pri_number->str,
1991 ast_number->str = ast_strdup(number);
1992 ast_number->plan = pri_number->plan;
1993 ast_number->presentation = pri_to_ast_presentation(pri_number->presentation);
1994 ast_number->valid = 1;
1999 * \brief Convert libpri party id into asterisk party id.
2002 * \param ast_id Asterisk party id structure to fill. Must already be set initialized.
2003 * \param pri_id libpri party id structure containing source information.
2004 * \param pri PRI span control structure.
2006 * \note The filled in ast_id structure needs to be destroyed by
2007 * ast_party_id_free() when it is no longer needed.
2011 static void sig_pri_party_id_convert(struct ast_party_id *ast_id, const struct pri_party_id *pri_id, struct sig_pri_span *pri)
2013 if (pri_id->name.valid) {
2014 sig_pri_party_name_convert(&ast_id->name, &pri_id->name);
2016 if (pri_id->number.valid) {
2017 sig_pri_party_number_convert(&ast_id->number, &pri_id->number, pri);
2019 #if defined(HAVE_PRI_SUBADDR)
2020 if (pri_id->subaddress.valid) {
2021 sig_pri_set_subaddress(&ast_id->subaddress, &pri_id->subaddress);
2023 #endif /* defined(HAVE_PRI_SUBADDR) */
2028 * \brief Convert libpri redirecting information into asterisk redirecting information.
2031 * \param ast_redirecting Asterisk redirecting structure to fill.
2032 * \param pri_redirecting libpri redirecting structure containing source information.
2033 * \param ast_guide Asterisk redirecting structure to use as an initialization guide.
2034 * \param pri PRI span control structure.
2036 * \note The filled in ast_redirecting structure needs to be destroyed by
2037 * ast_party_redirecting_free() when it is no longer needed.
2041 static void sig_pri_redirecting_convert(struct ast_party_redirecting *ast_redirecting,
2042 const struct pri_party_redirecting *pri_redirecting,
2043 const struct ast_party_redirecting *ast_guide,
2044 struct sig_pri_span *pri)
2046 ast_party_redirecting_set_init(ast_redirecting, ast_guide);
2048 sig_pri_party_id_convert(&ast_redirecting->from, &pri_redirecting->from, pri);
2049 sig_pri_party_id_convert(&ast_redirecting->to, &pri_redirecting->to, pri);
2050 ast_redirecting->count = pri_redirecting->count;
2051 ast_redirecting->reason = pri_to_ast_reason(pri_redirecting->reason);
2056 * \brief Determine if the given extension matches one of the MSNs in the pattern list.
2059 * \param msn_patterns Comma separated list of MSN patterns to match.
2060 * \param exten Extension to match in the MSN list.
2062 * \retval 1 if matches.
2063 * \retval 0 if no match.
2065 static int sig_pri_msn_match(const char *msn_patterns, const char *exten)
2071 msn_list = ast_strdupa(msn_patterns);
2074 pattern = strtok_r(msn_list, ",", &list_tail);
2076 pattern = ast_strip(pattern);
2077 if (!ast_strlen_zero(pattern) && ast_extension_match(pattern, exten)) {
2078 /* Extension matched the pattern. */
2081 pattern = strtok_r(NULL, ",", &list_tail);
2083 /* Did not match any pattern in the list. */
2087 #if defined(HAVE_PRI_MCID)
2090 * \brief Append the given party id to the event string.
2093 * \param msg Event message string being built.
2094 * \param prefix Prefix to add to the party id lines.
2095 * \param party Party information to encode.
2099 static void sig_pri_event_party_id(struct ast_str **msg, const char *prefix, struct ast_party_id *party)
2103 /* Combined party presentation */
2104 pres = ast_party_id_presentation(party);
2105 ast_str_append(msg, 0, "%sPres: %d (%s)\r\n", prefix, pres,
2106 ast_describe_caller_presentation(pres));
2109 ast_str_append(msg, 0, "%sNumValid: %d\r\n", prefix,
2110 (unsigned) party->number.valid);
2111 ast_str_append(msg, 0, "%sNum: %s\r\n", prefix,
2112 S_COR(party->number.valid, party->number.str, ""));
2113 ast_str_append(msg, 0, "%ston: %d\r\n", prefix, party->number.plan);
2114 if (party->number.valid) {
2115 ast_str_append(msg, 0, "%sNumPlan: %d\r\n", prefix, party->number.plan);
2116 ast_str_append(msg, 0, "%sNumPres: %d (%s)\r\n", prefix,
2117 party->number.presentation,
2118 ast_describe_caller_presentation(party->number.presentation));
2122 ast_str_append(msg, 0, "%sNameValid: %d\r\n", prefix,
2123 (unsigned) party->name.valid);
2124 ast_str_append(msg, 0, "%sName: %s\r\n", prefix,
2125 S_COR(party->name.valid, party->name.str, ""));
2126 if (party->name.valid) {
2127 ast_str_append(msg, 0, "%sNameCharSet: %s\r\n", prefix,
2128 ast_party_name_charset_describe(party->name.char_set));
2129 ast_str_append(msg, 0, "%sNamePres: %d (%s)\r\n", prefix,
2130 party->name.presentation,
2131 ast_describe_caller_presentation(party->name.presentation));
2134 #if defined(HAVE_PRI_SUBADDR)
2135 /* Party subaddress */
2136 if (party->subaddress.valid) {
2137 static const char subaddress[] = "Subaddr";
2139 ast_str_append(msg, 0, "%s%s: %s\r\n", prefix, subaddress,
2140 S_OR(party->subaddress.str, ""));
2141 ast_str_append(msg, 0, "%s%sType: %d\r\n", prefix, subaddress,
2142 party->subaddress.type);
2143 ast_str_append(msg, 0, "%s%sOdd: %d\r\n", prefix, subaddress,
2144 party->subaddress.odd_even_indicator);
2146 #endif /* defined(HAVE_PRI_SUBADDR) */
2148 #endif /* defined(HAVE_PRI_MCID) */
2150 #if defined(HAVE_PRI_MCID)
2153 * \brief Handle the MCID event.
2156 * \param pri PRI span control structure.
2157 * \param mcid MCID event parameters.
2158 * \param owner Asterisk channel associated with the call.
2159 * NULL if Asterisk no longer has the ast_channel struct.
2161 * \note Assumes the pri->lock is already obtained.
2162 * \note Assumes the owner channel lock is already obtained if still present.
2166 static void sig_pri_mcid_event(struct sig_pri_span *pri, const struct pri_subcmd_mcid_req *mcid, struct ast_channel *owner)
2168 struct ast_channel *chans[1];
2169 struct ast_str *msg;
2170 struct ast_party_id party;
2172 msg = ast_str_create(4096);
2179 * The owner channel is present.
2180 * Pass the event to the peer as well.
2182 ast_queue_control(owner, AST_CONTROL_MCID);
2184 ast_str_append(&msg, 0, "Channel: %s\r\n", owner->name);
2185 ast_str_append(&msg, 0, "UniqueID: %s\r\n", owner->uniqueid);
2187 sig_pri_event_party_id(&msg, "CallerID", &owner->connected.id);
2190 * Since we no longer have an owner channel,
2191 * we have to use the caller information supplied by libpri.
2193 ast_party_id_init(&party);
2194 sig_pri_party_id_convert(&party, &mcid->originator, pri);
2195 sig_pri_event_party_id(&msg, "CallerID", &party);
2196 ast_party_id_free(&party);
2199 /* Always use libpri's called party information. */
2200 ast_party_id_init(&party);
2201 sig_pri_party_id_convert(&party, &mcid->answerer, pri);
2202 sig_pri_event_party_id(&msg, "ConnectedID", &party);
2203 ast_party_id_free(&party);
2206 ast_manager_event_multichan(EVENT_FLAG_CALL, "MCID", owner ? 1 : 0, chans, "%s",
2207 ast_str_buffer(msg));
2210 #endif /* defined(HAVE_PRI_MCID) */
2212 #if defined(HAVE_PRI_TRANSFER)
2213 struct xfer_rsp_data {
2214 struct sig_pri_span *pri;
2215 /*! Call to send transfer success/fail response over. */
2217 /*! Invocation ID to use when sending a reply to the transfer request. */
2220 #endif /* defined(HAVE_PRI_TRANSFER) */
2222 #if defined(HAVE_PRI_TRANSFER)
2225 * \brief Send the transfer success/fail response message.
2228 * \param data Callback user data pointer
2229 * \param is_successful TRUE if the transfer was successful.
2233 static void sig_pri_transfer_rsp(void *data, int is_successful)
2235 struct xfer_rsp_data *rsp = data;
2237 pri_transfer_rsp(rsp->pri->pri, rsp->call, rsp->invoke_id, is_successful);
2239 #endif /* defined(HAVE_PRI_TRANSFER) */
2241 #if defined(HAVE_PRI_CALL_HOLD) || defined(HAVE_PRI_TRANSFER)
2243 * \brief Protocol callback to indicate if transfer will happen.
2246 * \param data Callback user data pointer
2247 * \param is_successful TRUE if the transfer will happen.
2251 typedef void (*xfer_rsp_callback)(void *data, int is_successful);
2252 #endif /* defined(HAVE_PRI_CALL_HOLD) || defined(HAVE_PRI_TRANSFER) */
2254 #if defined(HAVE_PRI_CALL_HOLD) || defined(HAVE_PRI_TRANSFER)
2257 * \brief Attempt to transfer the two calls to each other.
2260 * \param pri PRI span control structure.
2261 * \param call_1_pri First call involved in the transfer. (transferee; usually on hold)
2262 * \param call_1_held TRUE if call_1_pri is on hold.
2263 * \param call_2_pri Second call involved in the transfer. (target; usually active/ringing)
2264 * \param call_2_held TRUE if call_2_pri is on hold.
2265 * \param rsp_callback Protocol callback to indicate if transfer will happen. NULL if not used.
2266 * \param data Callback user data pointer
2268 * \note Assumes the pri->lock is already obtained.
2270 * \retval 0 on success.
2271 * \retval -1 on error.
2273 static int sig_pri_attempt_transfer(struct sig_pri_span *pri, q931_call *call_1_pri, int call_1_held, q931_call *call_2_pri, int call_2_held, xfer_rsp_callback rsp_callback, void *data)
2275 struct attempt_xfer_call {
2277 struct ast_channel *ast;
2282 struct ast_channel *transferee;
2283 struct attempt_xfer_call *call_1;
2284 struct attempt_xfer_call *call_2;
2285 struct attempt_xfer_call *swap_call;
2286 struct attempt_xfer_call c1;
2287 struct attempt_xfer_call c2;
2289 c1.pri = call_1_pri;
2290 c1.held = call_1_held;
2293 c2.pri = call_2_pri;
2294 c2.held = call_2_held;
2297 call_1->chanpos = pri_find_principle_by_call(pri, call_1->pri);
2298 call_2->chanpos = pri_find_principle_by_call(pri, call_2->pri);
2299 if (call_1->chanpos < 0 || call_2->chanpos < 0) {
2300 /* Calls not found in span control. */
2302 /* Transfer failed. */
2303 rsp_callback(data, 0);
2308 /* Attempt to make transferee and target consistent. */
2309 if (!call_1->held && call_2->held) {
2311 * Swap call_1 and call_2 to make call_1 the transferee(held call)
2312 * and call_2 the target(active call).
2319 /* Deadlock avoidance is attempted. */
2320 sig_pri_lock_private(pri->pvts[call_1->chanpos]);
2321 sig_pri_lock_owner(pri, call_1->chanpos);
2322 sig_pri_lock_private(pri->pvts[call_2->chanpos]);
2323 sig_pri_lock_owner(pri, call_2->chanpos);
2325 call_1->ast = pri->pvts[call_1->chanpos]->owner;
2326 call_2->ast = pri->pvts[call_2->chanpos]->owner;
2327 if (!call_1->ast || !call_2->ast) {
2328 /* At least one owner is not present. */
2330 ast_channel_unlock(call_1->ast);
2333 ast_channel_unlock(call_2->ast);
2335 sig_pri_unlock_private(pri->pvts[call_1->chanpos]);
2336 sig_pri_unlock_private(pri->pvts[call_2->chanpos]);
2338 /* Transfer failed. */
2339 rsp_callback(data, 0);
2345 transferee = ast_bridged_channel(call_1->ast);
2350 /* Try masquerading the other way. */
2355 transferee = ast_bridged_channel(call_1->ast);
2360 /* Could not transfer. Neither call is bridged. */
2361 ast_channel_unlock(call_1->ast);
2362 ast_channel_unlock(call_2->ast);
2363 sig_pri_unlock_private(pri->pvts[call_1->chanpos]);
2364 sig_pri_unlock_private(pri->pvts[call_2->chanpos]);
2367 /* Transfer failed. */
2368 rsp_callback(data, 0);
2373 ast_verb(3, "TRANSFERRING %s to %s\n", call_1->ast->name, call_2->ast->name);
2376 * Setup transfer masquerade.
2378 * Note: There is an extremely nasty deadlock avoidance issue
2379 * with ast_channel_transfer_masquerade(). Deadlock may be possible if
2380 * the channels involved are proxies (chan_agent channels) and
2381 * it is called with locks. Unfortunately, there is no simple
2382 * or even merely difficult way to guarantee deadlock avoidance
2383 * and still be able to send an ECT success response without the
2384 * possibility of the bridged channel hanging up on us.
2386 ast_mutex_unlock(&pri->lock);
2387 retval = ast_channel_transfer_masquerade(
2389 &call_2->ast->connected,
2392 &call_1->ast->connected,
2395 /* Reacquire the pri->lock to hold off completion of the transfer masquerade. */
2396 ast_mutex_lock(&pri->lock);
2398 ast_channel_unlock(call_1->ast);
2399 ast_channel_unlock(call_2->ast);
2400 sig_pri_unlock_private(pri->pvts[call_1->chanpos]);
2401 sig_pri_unlock_private(pri->pvts[call_2->chanpos]);
2405 * Report transfer status.
2407 * Must do the callback before the masquerade completes to ensure
2408 * that the protocol message goes out before the call leg is
2411 rsp_callback(data, retval ? 0 : 1);
2415 #endif /* defined(HAVE_PRI_CALL_HOLD) || defined(HAVE_PRI_TRANSFER) */
2417 #if defined(HAVE_PRI_CCSS)
2420 * \brief Compare the CC agent private data by libpri cc_id.
2423 * \param obj pointer to the (user-defined part) of an object.
2424 * \param arg callback argument from ao2_callback()
2425 * \param flags flags from ao2_callback()
2427 * \return values are a combination of enum _cb_results.
2429 static int sig_pri_cc_agent_cmp_cc_id(void *obj, void *arg, int flags)
2431 struct ast_cc_agent *agent_1 = obj;
2432 struct sig_pri_cc_agent_prv *agent_prv_1 = agent_1->private_data;
2433 struct sig_pri_cc_agent_prv *agent_prv_2 = arg;
2435 return (agent_prv_1 && agent_prv_1->pri == agent_prv_2->pri
2436 && agent_prv_1->cc_id == agent_prv_2->cc_id) ? CMP_MATCH | CMP_STOP : 0;
2438 #endif /* defined(HAVE_PRI_CCSS) */
2440 #if defined(HAVE_PRI_CCSS)
2443 * \brief Find the CC agent by libpri cc_id.
2446 * \param pri PRI span control structure.
2447 * \param cc_id CC record ID to find.
2450 * Since agents are refcounted, and this function returns
2451 * a reference to the agent, it is imperative that you decrement
2452 * the refcount of the agent once you have finished using it.
2454 * \retval agent on success.
2455 * \retval NULL not found.
2457 static struct ast_cc_agent *sig_pri_find_cc_agent_by_cc_id(struct sig_pri_span *pri, long cc_id)
2459 struct sig_pri_cc_agent_prv finder = {
2464 return ast_cc_agent_callback(0, sig_pri_cc_agent_cmp_cc_id, &finder,
2465 sig_pri_cc_type_name);
2467 #endif /* defined(HAVE_PRI_CCSS) */
2469 #if defined(HAVE_PRI_CCSS)
2472 * \brief Compare the CC monitor instance by libpri cc_id.
2475 * \param obj pointer to the (user-defined part) of an object.
2476 * \param arg callback argument from ao2_callback()
2477 * \param flags flags from ao2_callback()
2479 * \return values are a combination of enum _cb_results.
2481 static int sig_pri_cc_monitor_cmp_cc_id(void *obj, void *arg, int flags)
2483 struct sig_pri_cc_monitor_instance *monitor_1 = obj;
2484 struct sig_pri_cc_monitor_instance *monitor_2 = arg;
2486 return (monitor_1->pri == monitor_2->pri
2487 && monitor_1->cc_id == monitor_2->cc_id) ? CMP_MATCH | CMP_STOP : 0;
2489 #endif /* defined(HAVE_PRI_CCSS) */
2491 #if defined(HAVE_PRI_CCSS)
2494 * \brief Find the CC monitor instance by libpri cc_id.
2497 * \param pri PRI span control structure.
2498 * \param cc_id CC record ID to find.
2501 * Since monitor_instances are refcounted, and this function returns
2502 * a reference to the instance, it is imperative that you decrement
2503 * the refcount of the instance once you have finished using it.
2505 * \retval monitor_instance on success.
2506 * \retval NULL not found.
2508 static struct sig_pri_cc_monitor_instance *sig_pri_find_cc_monitor_by_cc_id(struct sig_pri_span *pri, long cc_id)
2510 struct sig_pri_cc_monitor_instance finder = {
2515 return ao2_callback(sig_pri_cc_monitors, 0, sig_pri_cc_monitor_cmp_cc_id, &finder);
2517 #endif /* defined(HAVE_PRI_CCSS) */
2519 #if defined(HAVE_PRI_CCSS)
2522 * \brief Destroy the given monitor instance.
2525 * \param data Monitor instance to destroy.
2529 static void sig_pri_cc_monitor_instance_destroy(void *data)
2531 struct sig_pri_cc_monitor_instance *monitor_instance = data;
2533 if (monitor_instance->cc_id != -1) {
2534 ast_mutex_lock(&monitor_instance->pri->lock);
2535 pri_cc_cancel(monitor_instance->pri->pri, monitor_instance->cc_id);
2536 ast_mutex_unlock(&monitor_instance->pri->lock);
2538 monitor_instance->pri->calls->module_unref();
2540 #endif /* defined(HAVE_PRI_CCSS) */
2542 #if defined(HAVE_PRI_CCSS)
2545 * \brief Construct a new monitor instance.
2548 * \param core_id CC core ID.
2549 * \param pri PRI span control structure.
2550 * \param cc_id CC record ID.
2551 * \param device_name Name of device (Asterisk channel name less sequence number).
2554 * Since monitor_instances are refcounted, and this function returns
2555 * a reference to the instance, it is imperative that you decrement
2556 * the refcount of the instance once you have finished using it.
2558 * \retval monitor_instance on success.
2559 * \retval NULL on error.
2561 static struct sig_pri_cc_monitor_instance *sig_pri_cc_monitor_instance_init(int core_id, struct sig_pri_span *pri, long cc_id, const char *device_name)
2563 struct sig_pri_cc_monitor_instance *monitor_instance;
2565 if (!pri->calls->module_ref || !pri->calls->module_unref) {
2569 monitor_instance = ao2_alloc(sizeof(*monitor_instance) + strlen(device_name),
2570 sig_pri_cc_monitor_instance_destroy);
2571 if (!monitor_instance) {
2575 monitor_instance->cc_id = cc_id;
2576 monitor_instance->pri = pri;
2577 monitor_instance->core_id = core_id;
2578 strcpy(monitor_instance->name, device_name);
2580 pri->calls->module_ref();
2582 ao2_link(sig_pri_cc_monitors, monitor_instance);
2583 return monitor_instance;
2585 #endif /* defined(HAVE_PRI_CCSS) */
2587 #if defined(HAVE_PRI_CCSS)
2590 * \brief Announce to the CC core that protocol CC monitor is available for this call.
2593 * \param pri PRI span control structure.
2594 * \param chanpos Channel position in the span.
2595 * \param cc_id CC record ID.
2596 * \param service CCBS/CCNR indication.
2598 * \note Assumes the pri->lock is already obtained.
2599 * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
2600 * \note Assumes the sig_pri_lock_owner(pri, chanpos) is already obtained.
2602 * \retval 0 on success.
2603 * \retval -1 on error.
2605 static int sig_pri_cc_available(struct sig_pri_span *pri, int chanpos, long cc_id, enum ast_cc_service_type service)
2607 struct sig_pri_chan *pvt;
2608 struct ast_cc_config_params *cc_params;
2609 struct sig_pri_cc_monitor_instance *monitor;
2610 enum ast_cc_monitor_policies monitor_policy;
2613 char device_name[AST_CHANNEL_NAME];
2614 char dialstring[AST_CHANNEL_NAME];
2616 pvt = pri->pvts[chanpos];
2618 core_id = ast_cc_get_current_core_id(pvt->owner);
2619 if (core_id == -1) {
2623 cc_params = ast_channel_get_cc_config_params(pvt->owner);
2629 monitor_policy = ast_get_cc_monitor_policy(cc_params);
2630 switch (monitor_policy) {
2631 case AST_CC_MONITOR_NEVER:
2632 /* CCSS is not enabled. */
2634 case AST_CC_MONITOR_NATIVE:
2635 case AST_CC_MONITOR_ALWAYS:
2637 * If it is AST_CC_MONITOR_ALWAYS and native fails we will attempt the fallback
2638 * later in the call to sig_pri_cc_generic_check().
2640 ast_channel_get_device_name(pvt->owner, device_name, sizeof(device_name));
2641 sig_pri_make_cc_dialstring(pvt, dialstring, sizeof(dialstring));
2642 monitor = sig_pri_cc_monitor_instance_init(core_id, pri, cc_id, device_name);
2646 res = ast_queue_cc_frame(pvt->owner, sig_pri_cc_type_name, dialstring, service,
2649 monitor->cc_id = -1;
2650 ao2_unlink(sig_pri_cc_monitors, monitor);
2651 ao2_ref(monitor, -1);
2654 case AST_CC_MONITOR_GENERIC:
2655 ast_queue_cc_frame(pvt->owner, AST_CC_GENERIC_MONITOR_TYPE,
2656 sig_pri_get_orig_dialstring(pvt), service, NULL);
2657 /* Say it failed to force caller to cancel native CC. */
2662 #endif /* defined(HAVE_PRI_CCSS) */
2666 * \brief Check if generic CC monitor is needed and request it.
2669 * \param pri PRI span control structure.
2670 * \param chanpos Channel position in the span.
2671 * \param service CCBS/CCNR indication.
2673 * \note Assumes the pri->lock is already obtained.
2674 * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained.
2678 static void sig_pri_cc_generic_check(struct sig_pri_span *pri, int chanpos, enum ast_cc_service_type service)
2680 struct ast_channel *owner;
2681 struct ast_cc_config_params *cc_params;
2682 #if defined(HAVE_PRI_CCSS)
2683 struct ast_cc_monitor *monitor;
2684 char device_name[AST_CHANNEL_NAME];
2685 #endif /* defined(HAVE_PRI_CCSS) */
2686 enum ast_cc_monitor_policies monitor_policy;
2689 if (!pri->pvts[chanpos]->outgoing) {
2690 /* This is not an outgoing call so it cannot be CC monitor. */
2694 sig_pri_lock_owner(pri, chanpos);
2695 owner = pri->pvts[chanpos]->owner;
2699 core_id = ast_cc_get_current_core_id(owner);
2700 if (core_id == -1) {
2701 /* No CC core setup */
2705 cc_params = ast_channel_get_cc_config_params(owner);
2707 /* Could not get CC config parameters. */
2711 #if defined(HAVE_PRI_CCSS)
2712 ast_channel_get_device_name(owner, device_name, sizeof(device_name));
2713 monitor = ast_cc_get_monitor_by_recall_core_id(core_id, device_name);
2715 /* CC monitor is already present so no need for generic CC. */
2716 ao2_ref(monitor, -1);
2719 #endif /* defined(HAVE_PRI_CCSS) */
2721 monitor_policy = ast_get_cc_monitor_policy(cc_params);
2722 switch (monitor_policy) {
2723 case AST_CC_MONITOR_NEVER:
2724 /* CCSS is not enabled. */
2726 case AST_CC_MONITOR_NATIVE:
2727 if (pri->sig == SIG_BRI_PTMP && pri->nodetype == PRI_NETWORK) {
2728 /* Request generic CC monitor. */
2729 ast_queue_cc_frame(owner, AST_CC_GENERIC_MONITOR_TYPE,
2730 sig_pri_get_orig_dialstring(pri->pvts[chanpos]), service, NULL);
2733 case AST_CC_MONITOR_ALWAYS:
2734 if (pri->sig == SIG_BRI_PTMP && pri->nodetype != PRI_NETWORK) {
2736 * Cannot monitor PTMP TE side since this is not defined.
2737 * We are playing the roll of a phone in this case and
2738 * a phone cannot monitor a party over the network without
2744 * We are either falling back or this is a PTMP NT span.
2745 * Request generic CC monitor.
2747 ast_queue_cc_frame(owner, AST_CC_GENERIC_MONITOR_TYPE,
2748 sig_pri_get_orig_dialstring(pri->pvts[chanpos]), service, NULL);
2750 case AST_CC_MONITOR_GENERIC:
2751 if (pri->sig == SIG_BRI_PTMP && pri->nodetype == PRI_NETWORK) {
2752 /* Request generic CC monitor. */
2753 ast_queue_cc_frame(owner, AST_CC_GENERIC_MONITOR_TYPE,
2754 sig_pri_get_orig_dialstring(pri->pvts[chanpos]), service, NULL);
2760 ast_channel_unlock(owner);
2763 #if defined(HAVE_PRI_CCSS)
2766 * \brief The CC link canceled the CC instance.
2769 * \param pri PRI span control structure.
2770 * \param cc_id CC record ID.
2771 * \param is_agent TRUE if the cc_id is for an agent.
2775 static void sig_pri_cc_link_canceled(struct sig_pri_span *pri, long cc_id, int is_agent)
2778 struct ast_cc_agent *agent;
2780 agent = sig_pri_find_cc_agent_by_cc_id(pri, cc_id);
2784 ast_cc_failed(agent->core_id, "%s agent got canceled by link",
2785 sig_pri_cc_type_name);
2788 struct sig_pri_cc_monitor_instance *monitor;
2790 monitor = sig_pri_find_cc_monitor_by_cc_id(pri, cc_id);
2794 monitor->cc_id = -1;
2795 ast_cc_monitor_failed(monitor->core_id, monitor->name,
2796 "%s monitor got canceled by link", sig_pri_cc_type_name);
2797 ao2_ref(monitor, -1);
2800 #endif /* defined(HAVE_PRI_CCSS) */
2802 #if defined(HAVE_PRI_AOC_EVENTS)
2805 * \brief Convert ast_aoc_charged_item to PRI_AOC_CHARGED_ITEM .
2808 * \param value Value to convert to string.
2810 * \return PRI_AOC_CHARGED_ITEM
2812 static enum PRI_AOC_CHARGED_ITEM sig_pri_aoc_charged_item_to_pri(enum PRI_AOC_CHARGED_ITEM value)
2815 case AST_AOC_CHARGED_ITEM_NA:
2816 return PRI_AOC_CHARGED_ITEM_NOT_AVAILABLE;
2817 case AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT:
2818 return PRI_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT;
2819 case AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION:
2820 return PRI_AOC_CHARGED_ITEM_BASIC_COMMUNICATION;
2821 case AST_AOC_CHARGED_ITEM_CALL_ATTEMPT:
2822 return PRI_AOC_CHARGED_ITEM_CALL_ATTEMPT;
2823 case AST_AOC_CHARGED_ITEM_CALL_SETUP:
2824 return PRI_AOC_CHARGED_ITEM_CALL_SETUP;
2825 case AST_AOC_CHARGED_ITEM_USER_USER_INFO:
2826 return PRI_AOC_CHARGED_ITEM_USER_USER_INFO;
2827 case AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE:
2828 return PRI_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE;
2830 return PRI_AOC_CHARGED_ITEM_NOT_AVAILABLE;
2832 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
2834 #if defined(HAVE_PRI_AOC_EVENTS)
2837 * \brief Convert PRI_AOC_CHARGED_ITEM to ast_aoc_charged_item.
2840 * \param value Value to convert to string.
2842 * \return ast_aoc_charged_item
2844 static enum ast_aoc_s_charged_item sig_pri_aoc_charged_item_to_ast(enum PRI_AOC_CHARGED_ITEM value)
2847 case PRI_AOC_CHARGED_ITEM_NOT_AVAILABLE:
2848 return AST_AOC_CHARGED_ITEM_NA;
2849 case PRI_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT:
2850 return AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT;
2851 case PRI_AOC_CHARGED_ITEM_BASIC_COMMUNICATION:
2852 return AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION;
2853 case PRI_AOC_CHARGED_ITEM_CALL_ATTEMPT:
2854 return AST_AOC_CHARGED_ITEM_CALL_ATTEMPT;
2855 case PRI_AOC_CHARGED_ITEM_CALL_SETUP:
2856 return AST_AOC_CHARGED_ITEM_CALL_SETUP;
2857 case PRI_AOC_CHARGED_ITEM_USER_USER_INFO:
2858 return AST_AOC_CHARGED_ITEM_USER_USER_INFO;
2859 case PRI_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE:
2860 return AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE;
2862 return AST_AOC_CHARGED_ITEM_NA;
2864 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
2866 #if defined(HAVE_PRI_AOC_EVENTS)
2869 * \brief Convert AST_AOC_MULTIPLER to PRI_AOC_MULTIPLIER.
2872 * \return pri enum equivalent.
2874 static int sig_pri_aoc_multiplier_from_ast(enum ast_aoc_currency_multiplier mult)
2877 case AST_AOC_MULT_ONETHOUSANDTH:
2878 return PRI_AOC_MULTIPLIER_THOUSANDTH;
2879 case AST_AOC_MULT_ONEHUNDREDTH:
2880 return PRI_AOC_MULTIPLIER_HUNDREDTH;
2881 case AST_AOC_MULT_ONETENTH:
2882 return PRI_AOC_MULTIPLIER_TENTH;
2883 case AST_AOC_MULT_ONE:
2884 return PRI_AOC_MULTIPLIER_ONE;
2885 case AST_AOC_MULT_TEN:
2886 return PRI_AOC_MULTIPLIER_TEN;
2887 case AST_AOC_MULT_HUNDRED:
2888 return PRI_AOC_MULTIPLIER_HUNDRED;
2889 case AST_AOC_MULT_THOUSAND:
2890 return PRI_AOC_MULTIPLIER_THOUSAND;
2892 return PRI_AOC_MULTIPLIER_ONE;
2895 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
2897 #if defined(HAVE_PRI_AOC_EVENTS)
2900 * \brief Convert PRI_AOC_MULTIPLIER to AST_AOC_MULTIPLIER
2903 * \return ast enum equivalent.
2905 static int sig_pri_aoc_multiplier_from_pri(const int mult)
2908 case PRI_AOC_MULTIPLIER_THOUSANDTH:
2909 return AST_AOC_MULT_ONETHOUSANDTH;
2910 case PRI_AOC_MULTIPLIER_HUNDREDTH:
2911 return AST_AOC_MULT_ONEHUNDREDTH;
2912 case PRI_AOC_MULTIPLIER_TENTH:
2913 return AST_AOC_MULT_ONETENTH;
2914 case PRI_AOC_MULTIPLIER_ONE:
2915 return AST_AOC_MULT_ONE;
2916 case PRI_AOC_MULTIPLIER_TEN:
2917 return AST_AOC_MULT_TEN;
2918 case PRI_AOC_MULTIPLIER_HUNDRED:
2919 return AST_AOC_MULT_HUNDRED;
2920 case PRI_AOC_MULTIPLIER_THOUSAND:
2921 return AST_AOC_MULT_THOUSAND;
2923 return AST_AOC_MULT_ONE;
2926 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
2928 #if defined(HAVE_PRI_AOC_EVENTS)
2931 * \brief Convert ast_aoc_time_scale representation to PRI_AOC_TIME_SCALE
2934 * \param value Value to convert to ast representation
2936 * \return PRI_AOC_TIME_SCALE
2938 static enum PRI_AOC_TIME_SCALE sig_pri_aoc_scale_to_pri(enum ast_aoc_time_scale value)
2942 case AST_AOC_TIME_SCALE_HUNDREDTH_SECOND:
2943 return PRI_AOC_TIME_SCALE_HUNDREDTH_SECOND;
2944 case AST_AOC_TIME_SCALE_TENTH_SECOND:
2945 return PRI_AOC_TIME_SCALE_TENTH_SECOND;
2946 case AST_AOC_TIME_SCALE_SECOND:
2947 return PRI_AOC_TIME_SCALE_SECOND;
2948 case AST_AOC_TIME_SCALE_TEN_SECOND:
2949 return PRI_AOC_TIME_SCALE_TEN_SECOND;
2950 case AST_AOC_TIME_SCALE_MINUTE:
2951 return PRI_AOC_TIME_SCALE_MINUTE;
2952 case AST_AOC_TIME_SCALE_HOUR:
2953 return PRI_AOC_TIME_SCALE_HOUR;
2954 case AST_AOC_TIME_SCALE_DAY:
2955 return PRI_AOC_TIME_SCALE_DAY;
2958 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
2960 #if defined(HAVE_PRI_AOC_EVENTS)
2963 * \brief Convert PRI_AOC_TIME_SCALE to ast aoc representation
2966 * \param value Value to convert to ast representation
2968 * \return ast aoc time scale
2970 static enum ast_aoc_time_scale sig_pri_aoc_scale_to_ast(enum PRI_AOC_TIME_SCALE value)
2974 case PRI_AOC_TIME_SCALE_HUNDREDTH_SECOND:
2975 return AST_AOC_TIME_SCALE_HUNDREDTH_SECOND;
2976 case PRI_AOC_TIME_SCALE_TENTH_SECOND:
2977 return AST_AOC_TIME_SCALE_TENTH_SECOND;
2978 case PRI_AOC_TIME_SCALE_SECOND:
2979 return AST_AOC_TIME_SCALE_SECOND;
2980 case PRI_AOC_TIME_SCALE_TEN_SECOND:
2981 return AST_AOC_TIME_SCALE_TEN_SECOND;
2982 case PRI_AOC_TIME_SCALE_MINUTE:
2983 return AST_AOC_TIME_SCALE_MINUTE;
2984 case PRI_AOC_TIME_SCALE_HOUR:
2985 return AST_AOC_TIME_SCALE_HOUR;
2986 case PRI_AOC_TIME_SCALE_DAY:
2987 return AST_AOC_TIME_SCALE_DAY;
2989 return AST_AOC_TIME_SCALE_HUNDREDTH_SECOND;
2991 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
2993 #if defined(HAVE_PRI_AOC_EVENTS)
2996 * \brief Handle AOC-S control frame
2999 * \param aoc_s AOC-S event parameters.
3000 * \param owner Asterisk channel associated with the call.
3001 * \param passthrough indicating if this message should be queued on the ast channel
3003 * \note Assumes the pri->lock is already obtained.
3004 * \note Assumes the sig_pri private is locked
3005 * \note Assumes the owner channel lock is already obtained.
3009 static void sig_pri_aoc_s_from_pri(const struct pri_subcmd_aoc_s *aoc_s, struct ast_channel *owner, int passthrough)
3011 struct ast_aoc_decoded *decoded = NULL;
3012 struct ast_aoc_encoded *encoded = NULL;
3013 size_t encoded_size = 0;
3016 if (!owner || !aoc_s) {
3020 if (!(decoded = ast_aoc_create(AST_AOC_S, 0, 0))) {
3024 for (idx = 0; idx < aoc_s->num_items; ++idx) {
3025 enum ast_aoc_s_charged_item charged_item;
3027 charged_item = sig_pri_aoc_charged_item_to_ast(aoc_s->item[idx].chargeable);
3028 if (charged_item == AST_AOC_CHARGED_ITEM_NA) {
3029 /* Delete the unknown charged item from the list. */
3032 switch (aoc_s->item[idx].rate_type) {
3033 case PRI_AOC_RATE_TYPE_DURATION:
3034 ast_aoc_s_add_rate_duration(decoded,
3036 aoc_s->item[idx].rate.duration.amount.cost,
3037 sig_pri_aoc_multiplier_from_pri(aoc_s->item[idx].rate.duration.amount.multiplier),
3038 aoc_s->item[idx].rate.duration.currency,
3039 aoc_s->item[idx].rate.duration.time.length,
3040 sig_pri_aoc_scale_to_ast(aoc_s->item[idx].rate.duration.time.scale),
3041 aoc_s->item[idx].rate.duration.granularity.length,
3042 sig_pri_aoc_scale_to_ast(aoc_s->item[idx].rate.duration.granularity.scale),
3043 aoc_s->item[idx].rate.duration.charging_type);
3045 case PRI_AOC_RATE_TYPE_FLAT:
3046 ast_aoc_s_add_rate_flat(decoded,
3048 aoc_s->item[idx].rate.flat.amount.cost,
3049 sig_pri_aoc_multiplier_from_pri(aoc_s->item[idx].rate.flat.amount.multiplier),
3050 aoc_s->item[idx].rate.flat.currency);
3052 case PRI_AOC_RATE_TYPE_VOLUME:
3053 ast_aoc_s_add_rate_volume(decoded,
3055 aoc_s->item[idx].rate.volume.unit,
3056 aoc_s->item[idx].rate.volume.amount.cost,
3057 sig_pri_aoc_multiplier_from_pri(aoc_s->item[idx].rate.volume.amount.multiplier),
3058 aoc_s->item[idx].rate.volume.currency);
3060 case PRI_AOC_RATE_TYPE_SPECIAL_CODE:
3061 ast_aoc_s_add_rate_special_charge_code(decoded,
3063 aoc_s->item[idx].rate.special);
3065 case PRI_AOC_RATE_TYPE_FREE:
3066 ast_aoc_s_add_rate_free(decoded, charged_item, 0);
3068 case PRI_AOC_RATE_TYPE_FREE_FROM_BEGINNING:
3069 ast_aoc_s_add_rate_free(decoded, charged_item, 1);
3072 ast_aoc_s_add_rate_na(decoded, charged_item);
3077 if (passthrough && (encoded = ast_aoc_encode(decoded, &encoded_size, owner))) {
3078 ast_queue_control_data(owner, AST_CONTROL_AOC, encoded, encoded_size);
3081 ast_aoc_manager_event(decoded, owner);
3083 ast_aoc_destroy_decoded(decoded);
3084 ast_aoc_destroy_encoded(encoded);
3086 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
3088 #if defined(HAVE_PRI_AOC_EVENTS)
3091 * \brief Generate AOC Request Response
3094 * \param aoc_request
3096 * \note Assumes the pri->lock is already obtained.
3097 * \note Assumes the sig_pri private is locked
3098 * \note Assumes the owner channel lock is already obtained.
3102 static void sig_pri_aoc_request_from_pri(const struct pri_subcmd_aoc_request *aoc_request, struct sig_pri_chan *pvt, q931_call *call)
3110 request = aoc_request->charging_request;
3112 if (request & PRI_AOC_REQUEST_S) {
3113 if (pvt->pri->aoc_passthrough_flag & SIG_PRI_AOC_GRANT_S) {
3114 /* An AOC-S response must come from the other side, so save off this invoke_id
3115 * and see if an AOC-S message comes in before the call is answered. */
3116 pvt->aoc_s_request_invoke_id = aoc_request->invoke_id;
3117 pvt->aoc_s_request_invoke_id_valid = 1;
3120 pri_aoc_s_request_response_send(pvt->pri->pri,
3122 aoc_request->invoke_id,
3127 if (request & PRI_AOC_REQUEST_D) {
3128 if (pvt->pri->aoc_passthrough_flag & SIG_PRI_AOC_GRANT_D) {
3129 pri_aoc_de_request_response_send(pvt->pri->pri,
3131 PRI_AOC_REQ_RSP_CHARGING_INFO_FOLLOWS,
3132 aoc_request->invoke_id);
3134 pri_aoc_de_request_response_send(pvt->pri->pri,
3136 PRI_AOC_REQ_RSP_ERROR_NOT_AVAILABLE,
3137 aoc_request->invoke_id);
3141 if (request & PRI_AOC_REQUEST_E) {
3142 if (pvt->pri->aoc_passthrough_flag & SIG_PRI_AOC_GRANT_E) {
3143 pri_aoc_de_request_response_send(pvt->pri->pri,
3145 PRI_AOC_REQ_RSP_CHARGING_INFO_FOLLOWS,
3146 aoc_request->invoke_id);
3148 pri_aoc_de_request_response_send(pvt->pri->pri,
3150 PRI_AOC_REQ_RSP_ERROR_NOT_AVAILABLE,
3151 aoc_request->invoke_id);
3155 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
3157 #if defined(HAVE_PRI_AOC_EVENTS)
3160 * \brief Generate AOC-D AST_CONTROL_AOC frame
3163 * \param aoc_e AOC-D event parameters.
3164 * \param owner Asterisk channel associated with the call.
3165 * \param passthrough indicating if this message should be queued on the ast channel
3167 * \note Assumes the pri->lock is already obtained.
3168 * \note Assumes the sig_pri private is locked
3169 * \note Assumes the owner channel lock is already obtained.
3173 static void sig_pri_aoc_d_from_pri(const struct pri_subcmd_aoc_d *aoc_d, struct ast_channel *owner, int passthrough)
3175 struct ast_aoc_decoded *decoded = NULL;
3176 struct ast_aoc_encoded *encoded = NULL;
3177 size_t encoded_size = 0;
3178 enum ast_aoc_charge_type type;
3180 if (!owner || !aoc_d) {
3184 switch (aoc_d->charge) {
3185 case PRI_AOC_DE_CHARGE_CURRENCY:
3186 type = AST_AOC_CHARGE_CURRENCY;
3188 case PRI_AOC_DE_CHARGE_UNITS:
3189 type = AST_AOC_CHARGE_UNIT;
3191 case PRI_AOC_DE_CHARGE_FREE:
3192 type = AST_AOC_CHARGE_FREE;
3195 type = AST_AOC_CHARGE_NA;
3199 if (!(decoded = ast_aoc_create(AST_AOC_D, type, 0))) {
3203 switch (aoc_d->billing_accumulation) {
3205 ast_debug(1, "AOC-D billing accumulation has unknown value: %d\n",
3206 aoc_d->billing_accumulation);
3208 case 0:/* subTotal */
3209 ast_aoc_set_total_type(decoded, AST_AOC_SUBTOTAL);
3212 ast_aoc_set_total_type(decoded, AST_AOC_TOTAL);
3216 switch (aoc_d->billing_id) {
3217 case PRI_AOC_D_BILLING_ID_NORMAL:
3218 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_NORMAL);
3220 case PRI_AOC_D_BILLING_ID_REVERSE:
3221 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_REVERSE_CHARGE);
3223 case PRI_AOC_D_BILLING_ID_CREDIT_CARD:
3224 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CREDIT_CARD);
3226 case PRI_AOC_D_BILLING_ID_NOT_AVAILABLE:
3228 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_NA);
3232 switch (aoc_d->charge) {
3233 case PRI_AOC_DE_CHARGE_CURRENCY:
3234 ast_aoc_set_currency_info(decoded,
3235 aoc_d->recorded.money.amount.cost,
3236 sig_pri_aoc_multiplier_from_pri(aoc_d->recorded.money.amount.multiplier),
3237 aoc_d->recorded.money.currency);
3239 case PRI_AOC_DE_CHARGE_UNITS:
3242 for (i = 0; i < aoc_d->recorded.unit.num_items; ++i) {
3243 /* if type or number are negative, then they are not present */
3244 ast_aoc_add_unit_entry(decoded,
3245 (aoc_d->recorded.unit.item[i].number >= 0 ? 1 : 0),
3246 aoc_d->recorded.unit.item[i].number,
3247 (aoc_d->recorded.unit.item[i].type >= 0 ? 1 : 0),
3248 aoc_d->recorded.unit.item[i].type);
3254 if (passthrough && (encoded = ast_aoc_encode(decoded, &encoded_size, owner))) {
3255 ast_queue_control_data(owner, AST_CONTROL_AOC, encoded, encoded_size);
3258 ast_aoc_manager_event(decoded, owner);
3260 ast_aoc_destroy_decoded(decoded);
3261 ast_aoc_destroy_encoded(encoded);
3263 #endif /* defined(HAVE_PRI_AOC_EVENTS) */
3265 #if defined(HAVE_PRI_AOC_EVENTS)
3268 * \brief Generate AOC-E AST_CONTROL_AOC frame
3271 * \param aoc_e AOC-E event parameters.
3272 * \param owner Asterisk channel associated with the call.
3273 * \param passthrough indicating if this message should be queued on the ast channel
3275 * \note Assumes the pri->lock is already obtained.
3276 * \note Assumes the sig_pri private is locked
3277 * \note Assumes the owner channel lock is already obtained.
3278 * \note owner channel may be NULL. In that case, generate event only
3282 static void sig_pri_aoc_e_from_pri(const struct pri_subcmd_aoc_e *aoc_e, struct ast_channel *owner, int passthrough)
3284 struct ast_aoc_decoded *decoded = NULL;
3285 struct ast_aoc_encoded *encoded = NULL;
3286 size_t encoded_size = 0;
3287 enum ast_aoc_charge_type type;
3293 switch (aoc_e->charge) {
3294 case PRI_AOC_DE_CHARGE_CURRENCY:
3295 type = AST_AOC_CHARGE_CURRENCY;
3297 case PRI_AOC_DE_CHARGE_UNITS:
3298 type = AST_AOC_CHARGE_UNIT;
3300 case PRI_AOC_DE_CHARGE_FREE:
3301 type = AST_AOC_CHARGE_FREE;
3304 type = AST_AOC_CHARGE_NA;
3308 if (!(decoded = ast_aoc_create(AST_AOC_E, type, 0))) {
3312 switch (aoc_e->associated.charging_type) {
3313 case PRI_AOC_E_CHARGING_ASSOCIATION_NUMBER:
3314 if (!aoc_e->associated.charge.number.valid) {
3317 ast_aoc_set_association_number(decoded, aoc_e->associated.charge.number.str, aoc_e->associated.charge.number.plan);
3319 case PRI_AOC_E_CHARGING_ASSOCIATION_ID:
3320 ast_aoc_set_association_id(decoded, aoc_e->associated.charge.id);
3326 switch (aoc_e->billing_id) {
3327 case PRI_AOC_E_BILLING_ID_NORMAL:
3328 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_NORMAL);
3330 case PRI_AOC_E_BILLING_ID_REVERSE:
3331 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_REVERSE_CHARGE);
3333 case PRI_AOC_E_BILLING_ID_CREDIT_CARD:
3334 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CREDIT_CARD);
3336 case PRI_AOC_E_BILLING_ID_CALL_FORWARDING_UNCONDITIONAL:
3337 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL);
3339 case PRI_AOC_E_BILLING_ID_CALL_FORWARDING_BUSY:
3340 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CALL_FWD_BUSY);
3342 case PRI_AOC_E_BILLING_ID_CALL_FORWARDING_NO_REPLY:
3343 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CALL_FWD_NO_REPLY);
3345 case PRI_AOC_E_BILLING_ID_CALL_DEFLECTION:
3346 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CALL_DEFLECTION);
3348 case PRI_AOC_E_BILLING_ID_CALL_TRANSFER:
3349 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CALL_TRANSFER);
3351 case PRI_AOC_E_BILLING_ID_NOT_AVAILABLE:
3353 ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_NA);
3357 switch (aoc_e->charge) {
3358 case PRI_AOC_DE_CHARGE_CURRENCY:
3359 ast_aoc_set_currency_info(decoded,
3360 aoc_e->recorded.money.amount.cost,
3361 sig_pri_aoc_multiplier_from_pri(aoc_e->recorded.money.amount.multiplier),
3362 aoc_e->recorded.money.currency);
3364 case PRI_AOC_DE_CHARGE_UNITS:
3367 for (i = 0; i < aoc_e->recorded.unit.num_items; ++i) {
3368 /* if type or number are negative, then they are not present */
3369 ast_aoc_add_unit_entry(decoded,
3370 (aoc_e->recorded.unit.item[i].number >= 0 ? 1 : 0),
3371 aoc_e->recorded.unit.item[i].number,
3372 (aoc_e->recorded.unit.item[i].type >= 0 ? 1 : 0),
3373 aoc_e->recorded.unit.item[i].type);