1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** Asterisk socket client **
10 \*****************************************************************************/
16 To connect, open an LCR socket and send a MESSAGE_HELLO to socket with
17 the application name. This name is unique an can be used for routing calls.
18 Now the channel driver is linked to LCR and can receive and make calls.
21 Call is initiated by LCR:
23 If a call is received from LCR, a MESSAGE_NEWREF is received first.
24 The ref_was_assigned ist set to 1.
25 A new chan_call instance is created. The call reference (ref) is given by
26 the received MESSAGE_NEWREF. The state is CHAN_LCR_STATE_IN_PREPARE.
27 After receiving MESSAGE_SETUP from LCR, the ast_channel instance is created
28 using ast_channel_alloc(1). The setup information is given to asterisk.
29 The new Asterisk instance pointer (ast) is stored to chan_call structure.
30 The state changes to CHAN_LCR_STATE_IN_SETUP.
33 Call is initiated by Asterisk:
35 If a call is requested from Asterisk, a new chan_call instance is created.
36 The new Asterisk instance pointer (ast) is stored to chan_call structure.
37 The current call ref is set to 0, the state is CHAN_LCR_STATE_OUT_PREPARE.
38 If the call is received (lcr_call) A MESSAGE_NEWREF is sent to LCR requesting
39 a new call reference (ref).
40 The ref_was_assigned ist set to 1.
41 Further dialing information is queued.
42 After the new callref is received by special MESSAGE_NEWREF reply, new ref
43 is stored in the chan_call structure.
44 The setup information is sent to LCR using MESSAGE_SETUP.
45 The state changes to CHAN_LCR_STATE_OUT_SETUP.
50 During call process, messages are received and sent.
51 The state changes accordingly.
52 Any message is allowed to be sent to LCR at any time except MESSAGE_RELEASE.
53 If a MESSAGE_OVERLAP is received, further dialing is required.
54 Queued dialing information, if any, is sent to LCR using MESSAGE_DIALING.
55 In this case, the state changes to CHAN_LCR_STATE_OUT_DIALING.
58 Call is released by LCR:
60 A MESSAGE_RELEASE is received with the call reference (ref) to be released.
61 The current ref is set to 0, to indicate released reference.
62 The ref_was_assigned==1 shows that there is no other ref to be assigned.
63 The state changes to CHAN_LCR_STATE_RELEASE.
64 ast_queue_hangup() is called, if asterisk instance (ast) exists, if not,
65 the chan_call instance is destroyed.
66 After lcr_hangup() is called-back by Asterisk, the chan_call instance
67 is destroyed, because the current ref is set to 0 and the state equals
68 CHAN_LCR_STATE_RELEASE.
69 If the ref is 0 and the state is not CHAN_LCR_STATE_RELEASE, see the proceedure
70 "Call is released by Asterisk".
73 Call is released by Asterisk:
75 lcr_hangup() is called-back by Asterisk. If the call reference (ref) is set,
76 a MESSAGE_RELEASE is sent to LCR and the chan_call instance is destroyed.
77 If the ref is 0 and the state is not CHAN_LCR_STATE_RELEASE, the new state is
78 set to CHAN_LCR_STATE_RELEASE.
79 The ref_was_assigned==0 shows that a ref is still requested.
80 Later, if the MESSAGE_NEWREF reply is received, a MESSAGE_RELEASE is sent to
81 LCR and the chan_call instance is destroyed.
82 If the ref is 0 and the state is CHAN_LCR_STATE_RELEASE, see the proceedure
83 "Call is released by LCR".
88 The deadlocking problem:
90 - chan_lcr locks chan_lock and waits inside ast_queue_xxxx() for ast_channel
92 - ast_channel thread locks ast_channel and calls a tech function and waits
93 there for chan_lock to be unlocked.
97 Never call ast_queue_xxxx() if ast_channel is not locked and don't wait until
98 ast_channel can be locked. All messages to asterisk are queued inside call
99 instance and will be handled using a try-lock to get ast_channel lock.
100 If it succeeds to lock ast_channel, the ast_queue_xxxx can safely called even
101 if the lock is incremented and decremented there.
103 Exception: Calling ast_queue_frame inside ast->tech->read is safe, because
104 it is called from ast_channel process which has already locked ast_channel.
109 /* Choose if you want to have chan_lcr for Asterisk 1.4.x or CallWeaver 1.2.x */
110 #define LCR_FOR_ASTERISK
111 /* #define LCR_FOR_CALLWEAVER */
118 #include <sys/types.h>
120 //#include <signal.h>
123 #include <sys/ioctl.h>
124 #include <sys/socket.h>
127 #include <semaphore.h>
129 #define HAVE_ATTRIBUTE_always_inline 1
130 #define HAVE_ARPA_INET_H 1
131 #define HAVE_TIMERSUB 1
132 #define HAVE_STRTOQ 1
133 #define HAVE_INET_ATON 1
135 #include <asterisk/compiler.h>
136 #ifdef LCR_FOR_ASTERISK
137 #include <asterisk/buildopts.h>
141 * Fwd declare struct ast_channel to get rid of gcc warning about
142 * incompatible pointer type passed to ast_register_application2.
146 #include <asterisk/module.h>
147 #include <asterisk/channel.h>
148 #include <asterisk/config.h>
149 #include <asterisk/logger.h>
150 #include <asterisk/pbx.h>
151 #include <asterisk/options.h>
152 #include <asterisk/io.h>
153 #include <asterisk/frame.h>
154 #include <asterisk/translate.h>
155 #include <asterisk/cli.h>
156 #include <asterisk/musiconhold.h>
157 #include <asterisk/dsp.h>
158 #include <asterisk/translate.h>
159 #include <asterisk/file.h>
160 #ifdef LCR_FOR_ASTERISK
161 #include <asterisk/callerid.h>
163 #ifdef LCR_FOR_CALLWEAVER
164 #include <asterisk/phone_no_utils.h>
167 #include <asterisk/indications.h>
168 #include <asterisk/app.h>
169 #include <asterisk/features.h>
170 #include <asterisk/sched.h>
171 #if ASTERISK_VERSION_NUM < 110000
172 #include <asterisk/version.h>
174 #include "extension.h"
176 #include "callerid.h"
177 #include "lcrsocket.h"
181 #include "chan_lcr.h"
183 CHAN_LCR_STATE // state description structure
184 MESSAGES // message text
186 #ifdef LCR_FOR_CALLWEAVER
187 AST_MUTEX_DEFINE_STATIC(rand_lock);
190 unsigned char flip_bits[256];
192 #ifdef LCR_FOR_CALLWEAVER
193 static struct ast_frame nullframe = { AST_FRAME_NULL, };
198 char lcr_type[]="lcr";
200 #ifdef LCR_FOR_CALLWEAVER
201 static ast_mutex_t usecnt_lock;
203 static char *desc = "Channel driver for mISDN/LCR Support (Bri/Pri)";
207 ast_mutex_t chan_lock; /* global lock */
208 ast_mutex_t log_lock; /* logging log */
210 * used to indicate change in file descriptors, so select function's result may
213 int global_change = 0;
216 struct lcr_fd wake_fd;
218 int glob_channel = 0;
221 struct lcr_fd socket_fd;
222 struct lcr_timer socket_retry;
225 struct admin_list *next;
226 struct admin_message msg;
227 } *admin_first = NULL;
229 static struct ast_channel_tech lcr_tech;
234 void chan_lcr_log(int type, const char *file, int line, const char *function, struct chan_call *call, struct ast_channel *ast, const char *fmt, ...)
237 char call_text[128] = "NULL";
238 char ast_text[128] = "NULL";
241 ast_mutex_lock(&log_lock);
244 vsnprintf(buffer,sizeof(buffer)-1,fmt,args);
245 buffer[sizeof(buffer)-1]=0;
249 sprintf(call_text, "%d", call->ref);
251 #if ASTERISK_VERSION_NUM < 110000
252 strncpy(ast_text, ast->name, sizeof(ast_text)-1);
254 strncpy(ast_text, ast_channel_name(ast), sizeof(ast_text)-1);
256 ast_text[sizeof(ast_text)-1] = '\0';
258 // ast_log(type, file, line, function, "[call=%s ast=%s] %s", call_text, ast_text, buffer);
259 printf("[call=%s ast=%s line=%d] %s", call_text, ast_text, line, buffer);
261 ast_mutex_unlock(&log_lock);
265 * channel and call instances
267 struct chan_call *call_first;
271 * special case: 0: find new ref, that has not been assigned a ref yet
274 struct chan_call *find_call_ref(unsigned int ref)
276 struct chan_call *call = call_first;
277 int assigned = (ref > 0);
280 if (call->ref == ref && call->ref_was_assigned == assigned)
287 void free_call(struct chan_call *call)
289 struct chan_call **temp = &call_first;
293 *temp = (*temp)->next;
294 if (call->pipe[0] > -1)
295 close(call->pipe[0]);
296 if (call->pipe[1] > -1)
297 close(call->pipe[1]);
298 if (call->bridge_call) {
299 if (call->bridge_call->bridge_call != call)
300 CERROR(call, NULL, "Linked call structure has no link to us.\n");
301 call->bridge_call->bridge_call = NULL;
304 ast_translator_free_path(call->trans);
306 ast_dsp_free(call->dsp);
307 CDEBUG(call, NULL, "Call instance freed.\n");
312 temp = &((*temp)->next);
314 CERROR(call, NULL, "Call instance not found in list.\n");
317 struct chan_call *alloc_call(void)
319 struct chan_call **callp = &call_first;
322 callp = &((*callp)->next);
324 *callp = (struct chan_call *)calloc(1, sizeof(struct chan_call));
326 memset(*callp, 0, sizeof(struct chan_call));
327 if (pipe((*callp)->pipe) < 0) {
328 CERROR(*callp, NULL, "Failed to create pipe.\n");
332 fcntl((*callp)->pipe[0], F_SETFL, O_NONBLOCK);
333 CDEBUG(*callp, NULL, "Call instance allocated.\n");
337 unsigned short new_bridge_id(void)
339 struct chan_call *call;
340 unsigned short id = 1;
342 /* search for lowest bridge id that is not in use and not 0 */
346 if (call->bridge_id == id)
354 CDEBUG(NULL, NULL, "New bridge ID %d.\n", id);
359 * enque message to LCR
361 int send_message(int message_type, unsigned int ref, union parameter *param)
363 struct admin_list *admin, **adminp;
366 CDEBUG(NULL, NULL, "Ignoring message %d, because socket is closed.\n", message_type);
369 if (message_type != MESSAGE_TRAFFIC)
370 CDEBUG(NULL, NULL, "Sending %s to socket. (ref=%d)\n", messages_txt[message_type], ref);
372 adminp = &admin_first;
374 adminp = &((*adminp)->next);
375 admin = (struct admin_list *)calloc(1, sizeof(struct admin_list));
377 CERROR(NULL, NULL, "No memory for message to LCR.\n");
382 admin->msg.message = ADMIN_MESSAGE;
383 admin->msg.u.msg.type = message_type;
384 admin->msg.u.msg.ref = ref;
385 memcpy(&admin->msg.u.msg.param, param, sizeof(union parameter));
386 socket_fd.when |= LCR_FD_WRITE;
391 rc = write(wake_pipe[1], &byte, 1);
398 * apply options (in locked state)
400 void apply_opt(struct chan_call *call, char *data)
402 union parameter newparam;
403 char string[1024], *p = string, *opt;//, *key;
409 strncpy(string, data, sizeof(string)-1);
410 string[sizeof(string)-1] = '\0';
413 while((opt = strsep(&p, ":"))) {
416 if (opt[1] == '\0') {
417 CERROR(call, call->ast, "Option 'd' (display) expects parameter.\n", opt);
420 CDEBUG(call, call->ast, "Option 'd' (display) with text '%s'.\n", opt+1);
421 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
422 strncpy(call->display, opt+1, sizeof(call->display)-1);
424 memset(&newparam, 0, sizeof(union parameter));
425 strncpy(newparam.notifyinfo.display, opt+1, sizeof(newparam.notifyinfo.display)-1);
426 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
430 if (opt[1] != '\0') {
431 CERROR(call, call->ast, "Option 'n' (no DTMF) expects no parameter.\n", opt);
434 CDEBUG(call, call->ast, "Option 'n' (no DTMF).\n");
439 if (opt[1] == '\0') {
440 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter.\n", opt);
444 /* check for 0xXXXX... type of key */
445 if (!!strncmp((char *)key, "0x", 2)) {
446 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter starting with '0x'.\n", opt);
450 if (strlen(key) > 56*2 || (strlen(key) % 1)) {
451 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter with max 56 bytes ('0x' + 112 characters)\n", opt);
456 if (*key>='0' && *key<='9')
457 call->bf_key[i] = (*key-'0') << 8;
458 else if (*key>='a' && *key<='f')
459 call->bf_key[i] = (*key-'a'+10) << 8;
460 else if (*key>='A' && *key<='F')
461 call->bf_key[i] = (*key-'A'+10) << 8;
465 if (*key>='0' && *key<='9')
466 call->bf_key[i] += (*key - '0');
467 else if (*key>='a' && *key<='f')
468 call->bf_key[i] += (*key - 'a' + 10);
469 else if (*key>='A' && *key<='F')
470 call->bf_key[i] += (*key - 'A' + 10);
477 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter with hex values 0-9,a-f.\n");
481 CDEBUG(call, call->ast, "Option 'c' (encrypt) blowfish key '%s' (len=%d).\n", opt+1, i);
483 bchannel_blowfish(call->bchannel, call->bf_key, call->bf_len);
487 if (opt[1] != '\0') {
488 CERROR(call, call->ast, "Option 'h' (HDLC) expects no parameter.\n", opt);
491 CDEBUG(call, call->ast, "Option 'h' (HDLC).\n");
496 if (opt[1] == '\0') {
497 CERROR(call, call->ast, "Option 'q' (queue) expects parameter.\n", opt);
500 CDEBUG(call, call->ast, "Option 'q' (queue).\n");
501 call->tx_queue = atoi(opt+1);
505 if (opt[1] == '\0') {
506 CERROR(call, call->ast, "Option 'e' (echo cancel) expects parameter.\n", opt);
509 CDEBUG(call, call->ast, "Option 'e' (echo cancel) with config '%s'.\n", opt+1);
510 strncpy(call->pipeline, opt+1, sizeof(call->pipeline)-1);
512 bchannel_pipeline(call->bchannel, call->pipeline);
516 if (opt[1] == '\0') {
517 CERROR(call, call->ast, "Option 'f' (faxdetect) expects parameter.\n", opt);
520 call->faxdetect=atoi(opt+1);
522 call->dsp=ast_dsp_new();
524 #ifdef LCR_FOR_CALLWEAVER
525 ast_dsp_set_features(call->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_CNG_DETECT);
527 #ifdef LCR_FOR_ASTERISK
528 #ifdef DSP_FEATURE_DTMF_DETECT
529 ast_dsp_set_features(call->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_DETECT);
531 ast_dsp_set_features(call->dsp, DSP_FEATURE_DIGIT_DETECT| DSP_FEATURE_FAX_DETECT);
536 #ifdef LCR_FOR_CALLWEAVER
537 call->trans=ast_translator_build_path(AST_FORMAT_SLINEAR, 8000, (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW, 8000);
539 #ifdef LCR_FOR_ASTERISK
540 #if ASTERISK_VERSION_NUM < 100000
541 call->trans=ast_translator_build_path(AST_FORMAT_SLINEAR, (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW);
543 struct ast_format src;
544 struct ast_format dst;
545 ast_format_set(&dst, AST_FORMAT_SLINEAR, 0);
546 ast_format_set(&dst,(options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW , 0);
547 call->trans=ast_translator_build_path(&dst, &src);
552 CDEBUG(call, call->ast, "Option 'f' (faxdetect) with config '%s'.\n", call->faxdetect);
555 if (opt[1] != '\0') {
556 CERROR(call, call->ast, "Option 'r' (re-buffer 160 bytes) expects no parameter.\n", opt);
559 CDEBUG(call, call->ast, "Option 'r' (re-buffer 160 bytes)");
564 if (opt[1] != '\0') {
565 CERROR(call, call->ast, "Option 's' (inband DTMF) expects no parameter.\n", opt);
568 CDEBUG(call, call->ast, "Option 's' (inband DTMF).\n");
569 call->inband_dtmf = 1;
573 if (opt[1] != 'r' && opt[1] != 't') {
574 CERROR(call, call->ast, "Option 'v' (volume) expects parameter.\n", opt);
578 if (gain < -8 || gain >8) {
579 CERROR(call, call->ast, "Option 'v' (volume) expects parameter in range of -8 through 8.\n");
582 CDEBUG(call, call->ast, "Option 'v' (volume) with gain 2^%d.\n", gain);
584 call->rx_gain = gain;
586 bchannel_gain(call->bchannel, call->rx_gain, 0);
588 call->tx_gain = gain;
590 bchannel_gain(call->bchannel, call->tx_gain, 1);
595 if (opt[1] != '\0') {
596 CERROR(call, call->ast, "Option 'k' (keypad) expects no parameter.\n", opt);
599 CDEBUG(call, call->ast, "Option 'k' (keypad).\n");
604 CERROR(call, call->ast, "Option '%s' unknown.\n", opt);
610 * send setup info to LCR
611 * this function is called, when asterisk call is received and ref is received
613 static void send_setup_to_lcr(struct chan_call *call)
615 union parameter newparam;
616 struct ast_channel *ast = call->ast;
619 if (!call->ast || !call->ref)
622 #ifdef AST_1_8_OR_HIGHER
623 CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->callerinfo.id);
625 CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->cid_num);
628 /* send setup message to LCR */
629 memset(&newparam, 0, sizeof(union parameter));
630 newparam.setup.dialinginfo.itype = INFO_ITYPE_ISDN;
631 newparam.setup.dialinginfo.ntype = INFO_NTYPE_UNKNOWN;
633 strncpy(newparam.setup.dialinginfo.keypad, call->dialstring, sizeof(newparam.setup.dialinginfo.keypad)-1);
635 strncpy(newparam.setup.dialinginfo.id, call->dialstring, sizeof(newparam.setup.dialinginfo.id)-1);
636 if (!!strcmp(call->interface, "pbx"))
637 strncpy(newparam.setup.dialinginfo.interfaces, call->interface, sizeof(newparam.setup.dialinginfo.interfaces)-1);
638 newparam.setup.callerinfo.itype = INFO_ITYPE_CHAN;
639 newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
640 strncpy(newparam.setup.callerinfo.display, call->display, sizeof(newparam.setup.callerinfo.display)-1);
641 call->display[0] = '\0';
643 #ifdef AST_1_8_OR_HIGHER
644 /* set stored call information */
645 memcpy(&newparam.setup.callerinfo, &call->callerinfo, sizeof(struct caller_info));
646 memcpy(&newparam.setup.redirinfo, &call->redirinfo, sizeof(struct redir_info));
648 if (call->cid_num[0])
649 strncpy(newparam.setup.callerinfo.id, call->cid_num, sizeof(newparam.setup.callerinfo.id)-1);
650 if (call->cid_name[0])
651 strncpy(newparam.setup.callerinfo.name, call->cid_name, sizeof(newparam.setup.callerinfo.name)-1);
652 if (call->cid_rdnis[0]) {
653 strncpy(newparam.setup.redirinfo.id, call->cid_rdnis, sizeof(newparam.setup.redirinfo.id)-1);
654 newparam.setup.redirinfo.itype = INFO_ITYPE_CHAN;
655 newparam.setup.redirinfo.ntype = INFO_NTYPE_UNKNOWN;
657 switch(ast->cid.cid_pres & AST_PRES_RESTRICTION) {
658 case AST_PRES_RESTRICTED:
659 newparam.setup.callerinfo.present = INFO_PRESENT_RESTRICTED;
661 case AST_PRES_UNAVAILABLE:
662 newparam.setup.callerinfo.present = INFO_PRESENT_NOTAVAIL;
664 case AST_PRES_ALLOWED:
666 newparam.setup.callerinfo.present = INFO_PRESENT_ALLOWED;
668 switch(ast->cid.cid_ton) {
670 newparam.setup.callerinfo.ntype = INFO_NTYPE_SUBSCRIBER;
673 newparam.setup.callerinfo.ntype = INFO_NTYPE_NATIONAL;
676 newparam.setup.callerinfo.ntype = INFO_NTYPE_INTERNATIONAL;
679 newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
682 #warning DISABLED DUE TO DOUBLE LOCKING PROBLEM
683 // tmp = pbx_builtin_getvar_helper(ast, "LCR_TRANSFERCAPABILITY");
685 #if ASTERISK_VERSION_NUM < 110000
686 // ast->transfercapability = atoi(tmp);
687 newparam.setup.capainfo.bearer_capa = ast->transfercapability;
689 // ast_channel_transfercapability_set(ast, atoi(tmp));
690 newparam.setup.capainfo.bearer_capa = ast_channel_transfercapability(ast);
692 newparam.setup.capainfo.bearer_mode = INFO_BMODE_CIRCUIT;
694 newparam.setup.capainfo.source_mode = B_MODE_HDLC;
696 newparam.setup.capainfo.source_mode = B_MODE_TRANSPARENT;
697 newparam.setup.capainfo.bearer_info1 = (options.law=='a')?3:2;
699 newparam.setup.capainfo.hlc = INFO_HLC_NONE;
700 newparam.setup.capainfo.exthlc = INFO_HLC_NONE;
701 send_message(MESSAGE_SETUP, call->ref, &newparam);
702 if (call->tx_queue) {
703 memset(&newparam, 0, sizeof(union parameter));
704 newparam.queue = call->tx_queue * 8;
705 send_message(MESSAGE_DISABLE_DEJITTER, call->ref, &newparam);
708 /* change to outgoing setup state */
709 call->state = CHAN_LCR_STATE_OUT_SETUP;
713 * send dialing info to LCR
714 * this function is called, when setup acknowledge is received and dialing
717 static void send_dialque_to_lcr(struct chan_call *call)
719 union parameter newparam;
721 if (!call->ast || !call->ref || !call->dialque[0])
724 CDEBUG(call, call->ast, "Sending dial queue to LCR. (dialing=%s)\n", call->dialque);
726 /* send setup message to LCR */
727 memset(&newparam, 0, sizeof(union parameter));
729 strncpy(newparam.information.keypad, call->dialque, sizeof(newparam.information.keypad)-1);
731 strncpy(newparam.information.id, call->dialque, sizeof(newparam.information.id)-1);
732 call->dialque[0] = '\0';
733 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
737 * in case of a bridge, the unsupported message can be forwarded directly
738 * to the remote call.
740 static void bridge_message_if_bridged(struct chan_call *call, int message_type, union parameter *param)
744 if (!call->bridge_call) return;
745 CDEBUG(call, NULL, "Sending message due bridging.\n");
746 send_message(message_type, call->bridge_call->ref, param);
750 * send release message to LCR
752 static void send_release(struct chan_call *call, int cause, int location)
754 union parameter newparam;
756 /* sending release */
757 memset(&newparam, 0, sizeof(union parameter));
758 newparam.disconnectinfo.cause = cause;
759 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
760 send_message(MESSAGE_RELEASE, call->ref, &newparam);
764 * check if extension matches and start asterisk
765 * if it can match, proceed
768 static void lcr_start_pbx(struct chan_call *call, struct ast_channel *ast, int complete)
771 union parameter newparam;
772 #if ASTERISK_VERSION_NUM < 110000
773 char *exten = ast->exten;
775 char s_exten[AST_MAX_EXTENSION];
778 strncpy(exten, ast_channel_exten(ast), AST_MAX_EXTENSION-1);
784 #if ASTERISK_VERSION_NUM < 110000
785 CDEBUG(call, ast, "Try to start pbx. (exten=%s context=%s complete=%s)\n", exten, ast->context, complete?"yes":"no");
787 CDEBUG(call, ast, "Try to start pbx. (exten=%s context=%s complete=%s)\n", exten, ast_channel_context(ast), complete?"yes":"no");
792 #if ASTERISK_VERSION_NUM < 110000
793 if (!ast_canmatch_extension(ast, ast->context, exten, 1, call->oad)) {
794 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' will not match at context '%s' - releasing.\n", exten, ast->context);
796 if (!ast_canmatch_extension(ast, ast_channel_context(ast), exten, 1, call->oad)) {
797 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' will not match at context '%s' - releasing.\n", exten, ast_channel_context(ast));
802 #if ASTERISK_VERSION_NUM < 110000
803 if (!ast_exists_extension(ast, ast->context, exten, 1, call->oad)) {
804 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' would match at context '%s', if more digits would be dialed - releasing.\n", exten, ast->context);
806 if (!ast_exists_extension(ast, ast_channel_context(ast), exten, 1, call->oad)) {
807 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' would match at context '%s', if more digits would be dialed - releasing.\n", exten, ast_channel_context(ast));
812 CDEBUG(call, ast, "Got 'sending complete', extensions matches.\n");
813 /* send setup acknowledge to lcr */
814 memset(&newparam, 0, sizeof(union parameter));
815 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
818 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
823 #if ASTERISK_VERSION_NUM < 110000
824 if (ast_canmatch_extension(ast, ast->context, exten, 1, call->oad)) {
826 if (ast_canmatch_extension(ast, ast_channel_context(ast), exten, 1, call->oad)) {
828 /* send setup acknowledge to lcr */
829 if (call->state != CHAN_LCR_STATE_IN_DIALING) {
830 memset(&newparam, 0, sizeof(union parameter));
831 send_message(MESSAGE_OVERLAP, call->ref, &newparam);
835 call->state = CHAN_LCR_STATE_IN_DIALING;
837 /* if match, start pbx */
838 #if ASTERISK_VERSION_NUM < 110000
839 if (ast_exists_extension(ast, ast->context, exten, 1, call->oad)) {
841 if (ast_exists_extension(ast, ast_channel_context(ast), exten, 1, call->oad)) {
843 CDEBUG(call, ast, "Extensions matches.\n");
847 /* send setup acknowledge to lcr */
848 if (call->state != CHAN_LCR_STATE_IN_DIALING) {
849 memset(&newparam, 0, sizeof(union parameter));
850 send_message(MESSAGE_OVERLAP, call->ref, &newparam);
854 call->state = CHAN_LCR_STATE_IN_DIALING;
857 CDEBUG(call, ast, "Extensions may match, if more digits are dialed.\n");
861 #if ASTERISK_VERSION_NUM < 110000
864 if (!*ast_channel_exten(ast)) {
866 /* send setup acknowledge to lcr */
867 if (call->state != CHAN_LCR_STATE_IN_DIALING) {
868 memset(&newparam, 0, sizeof(union parameter));
869 send_message(MESSAGE_OVERLAP, call->ref, &newparam);
873 call->state = CHAN_LCR_STATE_IN_DIALING;
876 CDEBUG(call, ast, "There is no 's' extension (and we tried to match it implicitly). Extensions may match, if more digits are dialed.\n");
884 CDEBUG(call, ast, "Releasing due to extension missmatch.\n");
885 send_release(call, cause, LOCATION_PRIVATE_LOCAL);
887 /* release asterisk */
888 #if ASTERISK_VERSION_NUM < 110000
889 ast->hangupcause = call->cause;
891 ast_channel_hangupcause_set(ast, call->cause);
893 /* change to release state */
894 call->state = CHAN_LCR_STATE_RELEASE;
895 ast_hangup(ast); // call will be destroyed here
899 /* send setup to asterisk */
900 CDEBUG(call, ast, "Starting call to Asterisk due to matching extension.\n");
902 #ifdef LCR_FOR_CALLWEAVER
904 snprintf(ast->name, sizeof(ast->name), "%s/%s-%04x",lcr_type ,ast->cid.cid_num, ast_random() & 0xffff);
907 ret = ast_pbx_start(ast);
909 cause = (ret==-2)?34:27;
912 call->pbx_started = 1;
913 ast_setstate(ast, AST_STATE_RING);
917 * incoming setup from LCR
919 static void lcr_in_setup(struct chan_call *call, int message_type, union parameter *param)
921 struct ast_channel *ast;
922 struct ast_party_redirecting *ast_redir;
923 struct ast_party_caller *ast_caller;
924 #if ASTERISK_VERSION_NUM >= 110000
925 struct ast_party_redirecting s_ast_redir;
926 struct ast_party_caller s_ast_caller;
927 ast_party_redirecting_init(&s_ast_redir);
928 ast_party_caller_init(&s_ast_caller);
930 CDEBUG(call, NULL, "Incomming setup from LCR. (callerid %s, dialing %s)\n", param->setup.callerinfo.id, param->setup.dialinginfo.id);
932 /* create asterisk channel instrance */
934 #ifdef LCR_FOR_CALLWEAVER
935 ast = ast_channel_alloc(1);
938 #ifdef LCR_FOR_ASTERISK
939 #ifdef AST_1_8_OR_HIGHER
940 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", "", 0, "%s/%d", lcr_type, ++glob_channel);
942 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
946 #if ASTERISK_VERSION_NUM < 110000
947 ast_redir = &ast->redirecting;
948 ast_caller = &ast->caller;
950 ast_redir = &s_ast_redir;
951 ast_caller = &s_ast_caller;
956 CERROR(call, NULL, "Failed to create Asterisk channel - releasing.\n");
957 send_release(call, CAUSE_RESSOURCEUNAVAIL, LOCATION_PRIVATE_LOCAL);
964 #if ASTERISK_VERSION_NUM < 110000
965 ast->tech_pvt = call;
966 ast->tech = &lcr_tech;
967 ast->fds[0] = call->pipe[0];
969 ast_channel_tech_pvt_set(ast, call);
970 ast_channel_tech_set(ast, &lcr_tech);
971 ast_channel_set_fd(ast, 0, call->pipe[0]);
974 /* fill setup information */
975 if (param->setup.dialinginfo.id)
976 #if ASTERISK_VERSION_NUM < 110000
977 strncpy(ast->exten, param->setup.dialinginfo.id, AST_MAX_EXTENSION-1);
978 if (param->setup.dialinginfo.context[0])
979 strncpy(ast->context, param->setup.dialinginfo.context, AST_MAX_CONTEXT-1);
981 strncpy(ast->context, param->setup.callerinfo.interface, AST_MAX_CONTEXT-1);
983 ast_channel_exten_set(ast, param->setup.dialinginfo.id);
984 if (param->setup.context[0])
985 ast_channel_context_set(ast, param->setup.context);
987 ast_channel_context_set(ast, param->setup.callerinfo.interface);
991 #ifdef AST_1_8_OR_HIGHER
992 if (param->setup.callerinfo.id[0]) {
993 ast_caller->id.number.valid = 1;
994 ast_caller->id.number.str = strdup(param->setup.callerinfo.id);
995 if (!param->setup.callerinfo.id[0]) {
996 ast_caller->id.number.presentation = AST_PRES_RESTRICTED;
997 ast_caller->id.number.plan = (0 << 4) | 1;
999 switch (param->setup.callerinfo.present) {
1000 case INFO_PRESENT_ALLOWED:
1001 ast_caller->id.number.presentation = AST_PRES_ALLOWED;
1003 case INFO_PRESENT_RESTRICTED:
1004 ast_caller->id.number.presentation = AST_PRES_RESTRICTED;
1007 ast_caller->id.number.presentation = AST_PRES_UNAVAILABLE;
1009 switch (param->setup.callerinfo.screen) {
1010 case INFO_SCREEN_USER:
1011 ast_caller->id.number.presentation |= AST_PRES_USER_NUMBER_UNSCREENED;
1013 case INFO_SCREEN_USER_VERIFIED_PASSED:
1014 ast_caller->id.number.presentation |= AST_PRES_USER_NUMBER_PASSED_SCREEN;
1016 case INFO_SCREEN_USER_VERIFIED_FAILED:
1017 ast_caller->id.number.presentation |= AST_PRES_USER_NUMBER_FAILED_SCREEN;
1020 ast_caller->id.number.presentation |= AST_PRES_NETWORK_NUMBER;
1022 switch (param->setup.callerinfo.ntype) {
1023 case INFO_NTYPE_SUBSCRIBER:
1024 ast_caller->id.number.plan = (4 << 4) | 1;
1026 case INFO_NTYPE_NATIONAL:
1027 ast_caller->id.number.plan = (2 << 4) | 1;
1029 case INFO_NTYPE_INTERNATIONAL:
1030 ast_caller->id.number.plan = (1 << 4) | 1;
1033 ast_caller->id.number.plan = (0 << 4) | 1;
1036 if (param->setup.callerinfo.id2[0]) {
1037 ast_caller->ani.number.valid = 1;
1038 ast_caller->ani.number.str = strdup(param->setup.callerinfo.id2);
1039 switch (param->setup.callerinfo.present2) {
1040 case INFO_PRESENT_ALLOWED:
1041 ast_caller->ani.number.presentation = AST_PRES_ALLOWED;
1043 case INFO_PRESENT_RESTRICTED:
1044 ast_caller->ani.number.presentation = AST_PRES_RESTRICTED;
1047 ast_caller->ani.number.presentation = AST_PRES_UNAVAILABLE;
1049 switch (param->setup.callerinfo.screen2) {
1050 case INFO_SCREEN_USER:
1051 ast_caller->ani.number.presentation |= AST_PRES_USER_NUMBER_UNSCREENED;
1053 case INFO_SCREEN_USER_VERIFIED_PASSED:
1054 ast_caller->ani.number.presentation |= AST_PRES_USER_NUMBER_PASSED_SCREEN;
1056 case INFO_SCREEN_USER_VERIFIED_FAILED:
1057 ast_caller->ani.number.presentation |= AST_PRES_USER_NUMBER_FAILED_SCREEN;
1060 ast_caller->ani.number.presentation |= AST_PRES_NETWORK_NUMBER;
1062 switch (param->setup.callerinfo.ntype2) {
1063 case INFO_NTYPE_SUBSCRIBER:
1064 ast_caller->ani.number.plan = (4 << 4) | 1;
1066 case INFO_NTYPE_NATIONAL:
1067 ast_caller->ani.number.plan = (2 << 4) | 1;
1069 case INFO_NTYPE_INTERNATIONAL:
1070 ast_caller->ani.number.plan = (1 << 4) | 1;
1073 ast_caller->ani.number.plan = (0 << 4) | 1;
1076 if (param->setup.callerinfo.name[0]) {
1077 ast_caller->id.name.valid = 1;
1078 ast_caller->id.name.str = strdup(param->setup.callerinfo.name);
1080 #if ASTERISK_VERSION_NUM >= 110000
1081 ast_channel_caller_set(ast, ast_caller);
1083 if (param->setup.redirinfo.id[0]) {
1084 ast_redir->from.number.valid = 1;
1085 ast_redir->from.number.str = strdup(param->setup.redirinfo.id);
1086 switch (param->setup.redirinfo.present) {
1087 case INFO_PRESENT_ALLOWED:
1088 ast_redir->from.number.presentation = AST_PRES_ALLOWED;
1090 case INFO_PRESENT_RESTRICTED:
1091 ast_redir->from.number.presentation = AST_PRES_RESTRICTED;
1094 ast_redir->from.number.presentation = AST_PRES_UNAVAILABLE;
1096 switch (param->setup.redirinfo.screen) {
1097 case INFO_SCREEN_USER:
1098 ast_redir->from.number.presentation |= AST_PRES_USER_NUMBER_UNSCREENED;
1100 case INFO_SCREEN_USER_VERIFIED_PASSED:
1101 ast_redir->from.number.presentation |= AST_PRES_USER_NUMBER_PASSED_SCREEN;
1103 case INFO_SCREEN_USER_VERIFIED_FAILED:
1104 ast_redir->from.number.presentation |= AST_PRES_USER_NUMBER_FAILED_SCREEN;
1107 ast_redir->from.number.presentation |= AST_PRES_NETWORK_NUMBER;
1109 switch (param->setup.redirinfo.ntype) {
1110 case INFO_NTYPE_SUBSCRIBER:
1111 ast_redir->from.number.plan = (4 << 4) | 1;
1113 case INFO_NTYPE_NATIONAL:
1114 ast_redir->from.number.plan = (2 << 4) | 1;
1116 case INFO_NTYPE_INTERNATIONAL:
1117 ast_redir->from.number.plan = (1 << 4) | 1;
1120 ast_redir->from.number.plan = (0 << 4) | 1;
1122 #if ASTERISK_VERSION_NUM >= 110000
1123 ast_channel_redirecting_set(ast, ast_redir);
1127 memset(&ast->cid, 0, sizeof(ast->cid));
1128 if (param->setup.callerinfo.id[0])
1129 ast->cid.cid_num = strdup(param->setup.callerinfo.id);
1130 if (param->setup.callerinfo.id2[0])
1131 ast->cid.cid_ani = strdup(param->setup.callerinfo.id2);
1132 if (param->setup.callerinfo.name[0])
1133 ast->cid.cid_name = strdup(param->setup.callerinfo.name);
1134 if (param->setup.redirinfo.id[0])
1135 ast->cid.cid_rdnis = strdup(numberrize_callerinfo(param->setup.redirinfo.id, param->setup.redirinfo.ntype, options.national, options.international));
1136 switch (param->setup.callerinfo.present) {
1137 case INFO_PRESENT_ALLOWED:
1138 ast->cid.cid_pres = AST_PRES_ALLOWED;
1140 case INFO_PRESENT_RESTRICTED:
1141 ast->cid.cid_pres = AST_PRES_RESTRICTED;
1144 ast->cid.cid_pres = AST_PRES_UNAVAILABLE;
1146 switch (param->setup.callerinfo.ntype) {
1147 case INFO_NTYPE_SUBSCRIBER:
1148 ast->cid.cid_ton = 4;
1150 case INFO_NTYPE_NATIONAL:
1151 ast->cid.cid_ton = 2;
1153 case INFO_NTYPE_INTERNATIONAL:
1154 ast->cid.cid_ton = 1;
1157 ast->cid.cid_ton = 0;
1161 #if ASTERISK_VERSION_NUM < 110000
1162 ast->transfercapability = param->setup.capainfo.bearer_capa;
1164 ast_channel_transfercapability_set(ast, param->setup.capainfo.bearer_capa);
1166 /* enable hdlc if transcap is data */
1167 if (param->setup.capainfo.source_mode == B_MODE_HDLC)
1169 strncpy(call->oad, numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international), sizeof(call->oad)-1);
1171 /* configure channel */
1172 #if ASTERISK_VERSION_NUM < 100000
1173 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
1174 ast->readformat = ast->rawreadformat = ast->nativeformats;
1175 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
1177 #if ASTERISK_VERSION_NUM < 110000
1178 ast_format_set(&ast->rawwriteformat ,(options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW , 0);
1179 ast_format_copy(&ast->rawreadformat, &ast->rawwriteformat);
1180 ast_format_cap_set(ast->nativeformats, &ast->rawwriteformat);
1181 ast_set_write_format(ast, &ast->rawwriteformat);
1182 ast_set_read_format(ast, &ast->rawreadformat);
1184 ast_format_set(ast_channel_rawwriteformat(ast) ,(options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW , 0);
1185 ast_format_copy(ast_channel_rawreadformat(ast), ast_channel_rawwriteformat(ast));
1186 ast_format_cap_set(ast_channel_nativeformats(ast), ast_channel_rawwriteformat(ast));
1187 ast_set_write_format(ast, ast_channel_rawwriteformat(ast));
1188 ast_set_read_format(ast, ast_channel_rawreadformat(ast));
1191 #if ASTERISK_VERSION_NUM < 110000
1193 ast->hangupcause = 0;
1195 ast_channel_priority_set(ast, 1);
1196 ast_channel_hangupcause_set(ast, 0);
1200 call->state = CHAN_LCR_STATE_IN_SETUP;
1202 if (!call->pbx_started)
1203 lcr_start_pbx(call, ast, param->setup.dialinginfo.sending_complete);
1207 * incoming setup acknowledge from LCR
1209 static void lcr_in_overlap(struct chan_call *call, int message_type, union parameter *param)
1211 if (!call->ast) return;
1213 CDEBUG(call, call->ast, "Incomming setup acknowledge from LCR.\n");
1215 /* send pending digits in dialque */
1216 if (call->dialque[0])
1217 send_dialque_to_lcr(call);
1218 /* change to overlap state */
1219 call->state = CHAN_LCR_STATE_OUT_DIALING;
1223 * incoming proceeding from LCR
1225 static void lcr_in_proceeding(struct chan_call *call, int message_type, union parameter *param)
1227 CDEBUG(call, call->ast, "Incomming proceeding from LCR.\n");
1230 call->state = CHAN_LCR_STATE_OUT_PROCEEDING;
1231 /* queue event for asterisk */
1232 if (call->ast && call->pbx_started) {
1237 rc = write(wake_pipe[1], &byte, 1);
1239 strncat(call->queue_string, "P", sizeof(call->queue_string)-1);
1245 * incoming alerting from LCR
1247 static void lcr_in_alerting(struct chan_call *call, int message_type, union parameter *param)
1249 CDEBUG(call, call->ast, "Incomming alerting from LCR.\n");
1252 call->state = CHAN_LCR_STATE_OUT_ALERTING;
1253 /* queue event to asterisk */
1254 if (call->ast && call->pbx_started) {
1259 rc = write(wake_pipe[1], &byte, 1);
1261 strncat(call->queue_string, "R", sizeof(call->queue_string)-1);
1266 * incoming connect from LCR
1268 static void lcr_in_connect(struct chan_call *call, int message_type, union parameter *param)
1270 CDEBUG(call, call->ast, "Incomming connect (answer) from LCR.\n");
1273 call->state = CHAN_LCR_STATE_CONNECT;
1274 /* copy connectinfo */
1275 memcpy(&call->connectinfo, ¶m->connectinfo, sizeof(struct connect_info));
1276 /* queue event to asterisk */
1277 if (call->ast && call->pbx_started) {
1282 rc = write(wake_pipe[1], &byte, 1);
1284 strncat(call->queue_string, "N", sizeof(call->queue_string)-1);
1289 * incoming disconnect from LCR
1291 static void lcr_in_disconnect(struct chan_call *call, int message_type, union parameter *param)
1293 struct ast_channel *ast = call->ast;
1295 CDEBUG(call, call->ast, "Incomming disconnect from LCR. (cause=%d)\n", param->disconnectinfo.cause);
1298 call->state = CHAN_LCR_STATE_IN_DISCONNECT;
1300 call->cause = param->disconnectinfo.cause;
1301 call->location = param->disconnectinfo.location;
1302 /* if bridge, forward disconnect and return */
1305 if (call->bridge_call) {
1306 CDEBUG(call, call->ast, "Only signal disconnect via bridge.\n");
1307 bridge_message_if_bridged(call, message_type, param);
1311 /* release lcr with same cause */
1312 send_release(call, call->cause, call->location);
1314 /* change to release state */
1315 call->state = CHAN_LCR_STATE_RELEASE;
1316 /* queue release asterisk */
1318 #if ASTERISK_VERSION_NUM < 110000
1319 ast->hangupcause = call->cause;
1321 ast_channel_hangupcause_set(ast, call->cause);
1323 if (call->pbx_started) {
1328 rc = write(wake_pipe[1], &byte, 1);
1330 strcpy(call->queue_string, "H"); // overwrite other indications
1332 ast_hangup(ast); // call will be destroyed here
1338 * incoming release from LCR
1340 static void lcr_in_release(struct chan_call *call, int message_type, union parameter *param)
1342 struct ast_channel *ast = call->ast;
1344 CDEBUG(call, call->ast, "Incomming release from LCR, releasing ref. (cause=%d)\n", param->disconnectinfo.cause);
1348 /* change to release state */
1349 call->state = CHAN_LCR_STATE_RELEASE;
1350 /* copy release info */
1352 call->cause = param->disconnectinfo.cause;
1353 call->location = param->disconnectinfo.location;
1355 /* if we have an asterisk instance, queue hangup, else we are done */
1357 #if ASTERISK_VERSION_NUM < 110000
1358 ast->hangupcause = call->cause;
1360 ast_channel_hangupcause_set(ast, call->cause);
1362 if (call->pbx_started) {
1367 rc = write(wake_pipe[1], &byte, 1);
1369 strcpy(call->queue_string, "H");
1371 ast_hangup(ast); // call will be destroyed here
1380 * incoming information from LCR
1382 static void lcr_in_information(struct chan_call *call, int message_type, union parameter *param)
1384 struct ast_channel *ast = call->ast;
1386 CDEBUG(call, call->ast, "Incoming information from LCR. (dialing=%s)\n", param->information.id);
1390 /* pbx not started */
1391 if (!call->pbx_started) {
1392 CDEBUG(call, call->ast, "Asterisk not started, adding digits to number.\n");
1393 #if ASTERISK_VERSION_NUM < 110000
1394 strncat(ast->exten, param->information.id, AST_MAX_EXTENSION-1);
1396 ast_channel_exten_set(ast, param->information.id);
1398 lcr_start_pbx(call, ast, param->information.sending_complete);
1402 /* change dailing state after setup */
1403 if (call->state == CHAN_LCR_STATE_IN_SETUP) {
1404 CDEBUG(call, call->ast, "Changing from SETUP to DIALING state.\n");
1405 call->state = CHAN_LCR_STATE_IN_DIALING;
1406 // ast_setstate(ast, AST_STATE_DIALING);
1410 if (call->state == CHAN_LCR_STATE_IN_DIALING && param->information.id[0]) {
1415 rc = write(wake_pipe[1], &byte, 1);
1417 strncat(call->queue_string, param->information.id, sizeof(call->queue_string)-1);
1420 /* use bridge to forware message not supported by asterisk */
1421 if (call->state == CHAN_LCR_STATE_CONNECT) {
1422 CDEBUG(call, call->ast, "Call is connected, bridging.\n");
1423 bridge_message_if_bridged(call, message_type, param);
1428 * incoming information from LCR
1430 static void lcr_in_notify(struct chan_call *call, int message_type, union parameter *param)
1432 CDEBUG(call, call->ast, "Incomming notify from LCR. (notify=%d)\n", param->notifyinfo.notify);
1434 if (!call->ast) return;
1436 /* use bridge to forware message not supported by asterisk */
1437 bridge_message_if_bridged(call, message_type, param);
1441 * incoming information from LCR
1443 static void lcr_in_facility(struct chan_call *call, int message_type, union parameter *param)
1445 CDEBUG(call, call->ast, "Incomming facility from LCR.\n");
1447 if (!call->ast) return;
1449 /* use bridge to forware message not supported by asterisk */
1450 bridge_message_if_bridged(call, message_type, param);
1454 * incoming pattern from LCR
1456 static void lcr_in_pattern(struct chan_call *call, int message_type, union parameter *param)
1458 union parameter newparam;
1460 CDEBUG(call, call->ast, "Incomming pattern indication from LCR.\n");
1462 if (!call->ast) return;
1464 /* pattern are indicated only once */
1465 if (call->has_pattern)
1467 call->has_pattern = 1;
1469 /* request bchannel */
1470 CDEBUG(call, call->ast, "Requesting audio path (ref=%d)\n", call->ref);
1471 memset(&newparam, 0, sizeof(union parameter));
1472 send_message(MESSAGE_AUDIOPATH, call->ref, &newparam);
1474 /* queue PROGRESS, because tones are available */
1475 if (call->ast && call->pbx_started) {
1480 rc = write(wake_pipe[1], &byte, 1);
1482 strncat(call->queue_string, "T", sizeof(call->queue_string)-1);
1487 * got dtmf from bchannel (locked state)
1489 void lcr_in_dtmf(struct chan_call *call, int val)
1491 struct ast_channel *ast = call->ast;
1496 if (!call->pbx_started)
1499 if (!call->dsp_dtmf) {
1500 CDEBUG(call, call->ast, "Recognised DTMF digit '%c', but ignoring. This is fixed in later mISDN driver.\n", val);
1504 CDEBUG(call, call->ast, "Recognised DTMF digit '%c'.\n", val);
1511 rc = write(wake_pipe[1], &byte, 1);
1513 strncat(call->queue_string, digit, sizeof(call->queue_string)-1);
1517 * message received from LCR
1519 int receive_message(int message_type, unsigned int ref, union parameter *param)
1521 struct chan_call *call;
1522 union parameter newparam;
1525 memset(&newparam, 0, sizeof(union parameter));
1527 /* handle new ref */
1528 if (message_type == MESSAGE_NEWREF) {
1529 if (param->newref.direction) {
1530 /* new ref from lcr */
1531 CDEBUG(NULL, NULL, "Received new ref by LCR, due to incomming call. (ref=%ld)\n", ref);
1532 if (!ref || find_call_ref(ref)) {
1533 CERROR(NULL, NULL, "Illegal new ref %ld received.\n", ref);
1536 /* allocate new call instance */
1537 call = alloc_call();
1539 call->state = CHAN_LCR_STATE_IN_PREPARE;
1542 call->ref_was_assigned = 1;
1543 /* set dtmf (default, use option 'n' to disable */
1545 /* wait for setup (or release from asterisk) */
1547 /* new ref, as requested from this remote application */
1548 CDEBUG(NULL, NULL, "Received new ref by LCR, as requested from chan_lcr. (ref=%ld)\n", ref);
1549 call = find_call_ref(0);
1551 /* send release, if ref does not exist */
1552 CERROR(NULL, NULL, "No call found, that requests a ref.\n");
1557 call->ref_was_assigned = 1;
1558 /* set dtmf (default, use option 'n' to disable */
1560 /* send pending setup info */
1561 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
1562 send_setup_to_lcr(call);
1563 /* release if asterisk has signed off */
1564 else if (call->state == CHAN_LCR_STATE_RELEASE) {
1567 send_release(call, call->cause, call->location);
1569 send_release(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1580 CERROR(NULL, NULL, "Received message %d without ref.\n", message_type);
1583 call = find_call_ref(ref);
1585 /* ignore ref that is not used (anymore) */
1586 CDEBUG(NULL, NULL, "Message %d from LCR ignored, because no call instance found.\n", message_type);
1590 /* handle messages */
1591 switch(message_type) {
1593 lcr_in_setup(call, message_type, param);
1596 case MESSAGE_OVERLAP:
1597 lcr_in_overlap(call, message_type, param);
1600 case MESSAGE_PROCEEDING:
1601 lcr_in_proceeding(call, message_type, param);
1604 case MESSAGE_ALERTING:
1605 lcr_in_alerting(call, message_type, param);
1608 case MESSAGE_CONNECT:
1609 lcr_in_connect(call, message_type, param);
1612 case MESSAGE_DISCONNECT:
1613 lcr_in_disconnect(call, message_type, param);
1616 case MESSAGE_RELEASE:
1617 lcr_in_release(call, message_type, param);
1620 case MESSAGE_INFORMATION:
1621 lcr_in_information(call, message_type, param);
1624 case MESSAGE_NOTIFY:
1625 lcr_in_notify(call, message_type, param);
1628 case MESSAGE_FACILITY:
1629 lcr_in_facility(call, message_type, param);
1632 case MESSAGE_PATTERN: // audio available from LCR
1633 if (!call->has_pattern)
1634 lcr_in_pattern(call, message_type, param);
1637 case MESSAGE_NOPATTERN: // audio not available from LCR
1640 case MESSAGE_AUDIOPATH: // if remote audio connected or hold
1641 call->audiopath = param->audiopath;
1644 case MESSAGE_TRAFFIC: // if remote audio connected or hold
1646 unsigned char *p = param->traffic.data;
1647 int i, len = param->traffic.len;
1648 for (i = 0; i < len; i++, p++)
1651 rc = write(call->pipe[1], param->traffic.data, param->traffic.len);
1655 CDEBUG(call, call->ast, "Message %d from LCR unhandled.\n", message_type);
1662 * release all calls (due to broken socket)
1664 static void release_all_calls(void)
1666 struct chan_call *call;
1671 /* no ast, so we may directly free call */
1673 CDEBUG(call, NULL, "Freeing call, because no Asterisk channel is linked.\n");
1677 /* already in release process */
1678 if (call->state == CHAN_LCR_STATE_RELEASE) {
1682 /* release or queue release */
1684 call->state = CHAN_LCR_STATE_RELEASE;
1685 if (!call->pbx_started) {
1686 CDEBUG(call, call->ast, "Releasing call, because no Asterisk channel is not started.\n");
1687 ast_hangup(call->ast); // call will be destroyed here
1690 CDEBUG(call, call->ast, "Queue call release, because Asterisk channel is running.\n");
1695 rc = write(wake_pipe[1], &byte, 1);
1697 strcpy(call->queue_string, "H");
1702 void close_socket(void);
1705 * warning! not thread safe
1706 * returns -1 for socket error, 0 for no work, 1 for work
1708 static int handle_socket(struct lcr_fd *fd, unsigned int what, void *instance, int index)
1711 struct admin_list *admin;
1712 struct admin_message msg;
1714 if ((what & LCR_FD_READ)) {
1715 /* read from socket */
1716 len = read(lcr_sock, &msg, sizeof(msg));
1718 CERROR(NULL, NULL, "Socket closed.(read)\n");
1720 CERROR(NULL, NULL, "Handling of socket failed - closing for some seconds.\n");
1722 release_all_calls();
1723 schedule_timer(&socket_retry, SOCKET_RETRY_TIMER, 0);
1727 if (len != sizeof(msg)) {
1728 CERROR(NULL, NULL, "Socket short read. (len %d)\n", len);
1731 if (msg.message != ADMIN_MESSAGE) {
1732 CERROR(NULL, NULL, "Socket received illegal message %d.\n", msg.message);
1735 receive_message(msg.u.msg.type, msg.u.msg.ref, &msg.u.msg.param);
1737 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1742 if ((what & LCR_FD_WRITE)) {
1743 /* write to socket */
1745 socket_fd.when &= ~LCR_FD_WRITE;
1748 admin = admin_first;
1749 len = write(lcr_sock, &admin->msg, sizeof(msg));
1751 CERROR(NULL, NULL, "Socket closed.(write)\n");
1755 if (len != sizeof(msg)) {
1756 CERROR(NULL, NULL, "Socket short write. (len %d)\n", len);
1760 admin_first = admin->next;
1764 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1773 * open and close socket and thread
1775 int open_socket(void)
1778 struct sockaddr_un sock_address;
1779 union parameter param;
1782 if ((lcr_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
1783 CERROR(NULL, NULL, "Failed to create socket.\n");
1787 /* set socket address and name */
1788 memset(&sock_address, 0, sizeof(sock_address));
1789 sock_address.sun_family = PF_UNIX;
1790 sprintf(sock_address.sun_path, SOCKET_NAME, options.lock);
1792 /* connect socket */
1793 if ((conn = connect(lcr_sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0) {
1796 CDEBUG(NULL, NULL, "Failed to connect to socket '%s'. Is LCR running?\n", sock_address.sun_path);
1800 /* register socket fd */
1801 memset(&socket_fd, 0, sizeof(socket_fd));
1802 socket_fd.fd = lcr_sock;
1803 register_fd(&socket_fd, LCR_FD_READ | LCR_FD_EXCEPT, handle_socket, NULL, 0);
1805 /* enque hello message */
1806 memset(¶m, 0, sizeof(param));
1807 strcpy(param.hello.application, "asterisk");
1808 send_message(MESSAGE_HELLO, 0, ¶m);
1813 void close_socket(void)
1815 struct admin_list *admin, *temp;
1817 /* socket not created */
1821 unregister_fd(&socket_fd);
1823 /* flush pending messages */
1824 admin = admin_first;
1827 admin = admin->next;
1839 /* sending queue to asterisk */
1840 static int wake_event(struct lcr_fd *fd, unsigned int what, void *instance, int index)
1845 rc = read(wake_pipe[0], &byte, 1);
1852 static void handle_queue()
1854 struct chan_call *call;
1855 struct ast_channel *ast;
1856 struct ast_frame fr;
1862 p = call->queue_string;
1865 if (ast_channel_trylock(ast)) {
1866 ast_mutex_unlock(&chan_lock);
1868 ast_mutex_lock(&chan_lock);
1874 CDEBUG(call, ast, "Sending queued PROGRESS to Asterisk.\n");
1875 ast_queue_control(ast, AST_CONTROL_PROGRESS);
1878 CDEBUG(call, ast, "Sending queued PROCEEDING to Asterisk.\n");
1879 ast_queue_control(ast, AST_CONTROL_PROCEEDING);
1882 CDEBUG(call, ast, "Sending queued RINGING to Asterisk.\n");
1883 ast_queue_control(ast, AST_CONTROL_RINGING);
1884 ast_setstate(ast, AST_STATE_RINGING);
1887 CDEBUG(call, ast, "Sending queued ANSWER to Asterisk.\n");
1888 ast_queue_control(ast, AST_CONTROL_ANSWER);
1891 CDEBUG(call, ast, "Sending queued HANGUP to Asterisk.\n");
1892 ast_queue_hangup(ast);
1894 case '1': case '2': case '3': case 'A':
1895 case '4': case '5': case '6': case 'B':
1896 case '7': case '8': case '9': case 'C':
1897 case '*': case '0': case '#': case 'D':
1898 CDEBUG(call, ast, "Sending queued digit '%c' to Asterisk.\n", *p);
1899 /* send digit to asterisk */
1900 memset(&fr, 0, sizeof(fr));
1902 #ifdef LCR_FOR_ASTERISK
1903 fr.frametype = AST_FRAME_DTMF_BEGIN;
1906 #ifdef LCR_FOR_CALLWEAVER
1907 fr.frametype = AST_FRAME_DTMF;
1910 #ifdef AST_1_8_OR_HIGHER
1911 fr.subclass.integer = *p;
1915 fr.delivery = ast_tv(0, 0);
1916 ast_queue_frame(ast, &fr);
1918 #ifdef LCR_FOR_ASTERISK
1919 fr.frametype = AST_FRAME_DTMF_END;
1920 ast_queue_frame(ast, &fr);
1925 CDEBUG(call, ast, "Ignoring queued digit 0x%02x.\n", *p);
1929 call->queue_string[0] = '\0';
1930 ast_channel_unlock(ast);
1936 static int handle_retry(struct lcr_timer *timer, void *instance, int index)
1938 CDEBUG(NULL, NULL, "Retry to open socket.\n");
1939 if (open_socket() < 0)
1940 schedule_timer(&socket_retry, SOCKET_RETRY_TIMER, 0);
1945 void lock_chan(void)
1947 ast_mutex_lock(&chan_lock);
1950 void unlock_chan(void)
1952 ast_mutex_unlock(&chan_lock);
1955 /* chan_lcr thread */
1956 static void *chan_thread(void *arg)
1958 if (pipe(wake_pipe) < 0) {
1959 CERROR(NULL, NULL, "Failed to open pipe.\n");
1962 memset(&wake_fd, 0, sizeof(wake_fd));
1963 wake_fd.fd = wake_pipe[0];
1964 register_fd(&wake_fd, LCR_FD_READ, wake_event, NULL, 0);
1966 memset(&socket_retry, 0, sizeof(socket_retry));
1967 add_timer(&socket_retry, handle_retry, NULL, 0);
1969 /* open socket the first time */
1970 handle_retry(NULL, NULL, 0);
1972 ast_mutex_lock(&chan_lock);
1976 select_main(0, &global_change, lock_chan, unlock_chan);
1983 * new asterisk instance
1986 #ifdef AST_1_8_OR_HIGHER
1987 #if ASTERISK_VERSION_NUM < 100000
1988 struct ast_channel *lcr_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause)
1990 struct ast_channel *lcr_request(const char *type, struct ast_format_cap *format, const struct ast_channel *requestor, void *data, int *cause)
1993 struct ast_channel *lcr_request(const char *type, int format, void *data, int *cause)
1996 char exten[256], *dial, *interface, *opt;
1997 struct ast_channel *ast;
1998 struct chan_call *call;
1999 const struct ast_party_redirecting *req_redir;
2000 const struct ast_party_caller *req_caller;
2002 ast_mutex_lock(&chan_lock);
2003 CDEBUG(NULL, NULL, "Received request from Asterisk. (data=%s)\n", (char *)data);
2005 /* if socket is closed */
2007 CERROR(NULL, NULL, "Rejecting call from Asterisk, because LCR not running.\n");
2008 ast_mutex_unlock(&chan_lock);
2012 /* create call instance */
2013 call = alloc_call();
2015 /* failed to create instance */
2016 ast_mutex_unlock(&chan_lock);
2020 /* create asterisk channel instrance */
2022 #ifdef LCR_FOR_ASTERISK
2023 #ifdef AST_1_8_OR_HIGHER
2024 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, NULL, NULL, NULL, NULL, 0, "%s/%d", lcr_type, ++glob_channel);
2026 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
2030 #ifdef LCR_FOR_CALLWEAVER
2031 ast = ast_channel_alloc(1);
2035 CERROR(NULL, NULL, "Failed to create Asterisk channel.\n");
2037 /* failed to create instance */
2038 ast_mutex_unlock(&chan_lock);
2041 #if ASTERISK_VERSION_NUM < 110000
2042 ast->tech = &lcr_tech;
2043 ast->tech_pvt = (void *)1L; // set pointer or asterisk will not call
2044 req_redir = &requestor->redirecting;
2045 req_caller = &requestor->caller;
2047 ast_channel_tech_set(ast, &lcr_tech);
2048 ast_channel_tech_pvt_set(ast, (void *)1L); // set pointer or asterisk will not call
2049 req_redir = ast_channel_redirecting(requestor);
2050 req_caller = ast_channel_caller(requestor);
2052 /* configure channel */
2053 #if ASTERISK_VERSION_NUM < 100000
2054 #if ASTERISK_VERSION_NUM < 110000
2055 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
2056 ast->readformat = ast->rawreadformat = ast->nativeformats;
2057 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
2059 ast_channel_nativeformats_set(ast, (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW);
2060 ast->readformat = ast->rawreadformat = ast_channel_nativeformats(ast);
2061 ast->writeformat = ast->rawwriteformat = ast_channel_nativeformats(ast);
2064 #if ASTERISK_VERSION_NUM < 110000
2065 ast_format_set(&ast->rawwriteformat ,(options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW , 0);
2066 ast_format_copy(&ast->rawreadformat, &ast->rawwriteformat);
2067 ast_format_cap_set(ast->nativeformats, &ast->rawwriteformat);
2068 ast_set_write_format(ast, &ast->rawwriteformat);
2069 ast_set_read_format(ast, &ast->rawreadformat);
2071 ast_format_set(ast_channel_rawwriteformat(ast) ,(options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW , 0);
2072 ast_format_copy(ast_channel_rawreadformat(ast), ast_channel_rawwriteformat(ast));
2073 ast_format_cap_set(ast_channel_nativeformats(ast), ast_channel_rawwriteformat(ast));
2074 ast_set_write_format(ast, ast_channel_rawwriteformat(ast));
2075 ast_set_read_format(ast, ast_channel_rawreadformat(ast));
2078 #if ASTERISK_VERSION_NUM < 110000
2080 ast->hangupcause = 0;
2082 ast_channel_priority_set(ast, 1);
2083 ast_channel_hangupcause_set(ast, 0);
2088 #if ASTERISK_VERSION_NUM < 110000
2089 ast->tech_pvt = call;
2090 ast->fds[0] = call->pipe[0];
2092 ast_channel_tech_pvt_set(ast, call);
2093 ast_channel_set_fd(ast, 0, call->pipe[0]);
2095 call->pbx_started = 0;
2097 call->state = CHAN_LCR_STATE_OUT_PREPARE;
2100 * Extract interface, dialstring, options from data.
2103 * <interface>/<dialstring>
2104 * <interface>/<dialstring>/options
2106 strncpy(exten, (char *)data, sizeof(exten)-1);
2107 exten[sizeof(exten)-1] = '\0';
2108 if ((dial = strchr(exten, '/'))) {
2111 if ((opt = strchr(dial, '/')))
2120 strncpy(call->interface, interface, sizeof(call->interface)-1);
2121 strncpy(call->dialstring, dial, sizeof(call->dialstring)-1);
2122 apply_opt(call, (char *)opt);
2124 #ifdef AST_1_8_OR_HIGHER
2125 // clone_variables(requestor, ast);
2128 ast->caller.ani.number.valid= req_caller->ani.number.valid;
2129 if (req_caller->ani.number.valid)
2130 if (req_caller->ani.number.str)
2131 if (req_caller->ani.number.str[0])
2132 ast->caller.ani.number.str= strdup(req_caller->ani.number.str);
2133 ast->caller.ani.number.plan= req_caller->ani.number.plan;
2134 ast->caller.ani.number.presentation= req_caller->ani.number.presentation;
2136 ast->caller.ani.name.valid= req_caller->ani.name.valid;
2137 if (req_caller->ani.name.valid)
2138 if (req_caller->ani.name.str)
2139 if (req_caller->ani.name.str[0])
2140 ast->caller.ani.name.str= strdup(req_caller->ani.name.str);
2141 ast->caller.ani.name.presentation= req_caller->ani.name.presentation;
2143 ast->caller.ani.subaddress.valid= req_caller->ani.subaddress.valid;
2144 if (req_caller->ani.subaddress.valid)
2145 if (req_caller->ani.subaddress.str)
2146 if (req_caller->ani.subaddress.str[0])
2147 ast->caller.ani.subaddress.str= strdup(req_caller->ani.subaddress.str);
2148 ast->caller.ani.subaddress.type= req_caller->ani.subaddress.type;
2150 ast->caller.id.number.valid= req_caller->id.number.valid;
2151 if (req_caller->id.number.valid)
2152 if (req_caller->id.number.str)
2153 if (req_caller->id.number.str[0])
2154 ast->caller.id.number.str= strdup(req_caller->id.number.str);
2155 ast->caller.id.number.plan= req_caller->id.number.plan;
2156 ast->caller.id.number.presentation= req_caller->id.number.presentation;
2158 ast->caller.id.name.valid= req_caller->id.name.valid;
2159 if (req_caller->id.name.valid)
2160 if (req_caller->id.name.str)
2161 if (req_caller->id.name.str[0])
2162 ast->caller.id.name.str= strdup(req_caller->id.name.str);
2163 ast->caller.id.name.presentation= req_caller->id.name.presentation;
2165 ast->caller.id.subaddress.valid= req_caller->id.subaddress.valid;
2166 if (req_caller->id.subaddress.valid)
2167 if (req_caller->id.subaddress.str)
2168 if (req_caller->id.subaddress.str[0])
2169 ast->caller.id.subaddress.str= strdup(req_caller->id.subaddress.str);
2170 ast->caller.id.subaddress.type= req_caller->id.subaddress.type;
2172 if (requestor->dialed.number.str)
2173 if (requestor->dialed.number.str[0])
2174 ast->dialed.number.str= strdup(requestor->dialed.number.str);
2175 ast->dialed.number.plan= requestor->dialed.number.plan;
2177 ast->dialed.subaddress.valid= requestor->dialed.subaddress.valid;
2178 if (requestor->dialed.subaddress.valid)
2179 if (requestor->dialed.subaddress.str)
2180 if (requestor->dialed.subaddress.str[0])
2181 ast->dialed.subaddress.str= strdup(requestor->dialed.subaddress.str);
2182 ast->dialed.subaddress.type= requestor->dialed.subaddress.type;
2184 ast->dialed.transit_network_select= requestor->dialed.transit_network_select;
2185 ast->redirecting.count= req_redir->count;
2186 ast->redirecting.reason= req_redir->reason;
2188 ast->redirecting.from.number.valid= req_redir->from.number.valid;
2189 if (req_redir->from.number.valid)
2190 if (req_redir->from.number.str)
2191 if (req_redir->from.number.str[0])
2192 ast->redirecting.from.number.str= strdup(req_redir->from.number.str);
2193 ast->redirecting.from.number.plan= req_redir->from.number.plan;
2194 ast->redirecting.from.number.presentation= req_redir->from.number.presentation;
2196 ast->redirecting.to.number.valid= req_redir->to.number.valid;
2197 if (req_redir->to.number.valid)
2198 if (req_redir->to.number.str)
2199 if (req_redir->to.number.str[0])
2200 ast->redirecting.to.number.str= strdup(req_redir->to.number.str);
2201 ast->redirecting.to.number.plan= req_redir->to.number.plan;
2202 ast->redirecting.to.number.presentation= req_redir->to.number.presentation;
2204 /* store call information for setup */
2207 if (requestor && req_caller->id.number.valid) {
2208 if (req_caller->id.number.str)
2209 strncpy(call->callerinfo.id, req_caller->id.number.str, sizeof(call->callerinfo.id)-1);
2210 switch(req_caller->id.number.presentation & AST_PRES_RESTRICTION) {
2211 case AST_PRES_RESTRICTED:
2212 call->callerinfo.present = INFO_PRESENT_RESTRICTED;
2214 case AST_PRES_UNAVAILABLE:
2215 call->callerinfo.present = INFO_PRESENT_NOTAVAIL;
2217 case AST_PRES_ALLOWED:
2219 call->callerinfo.present = INFO_PRESENT_ALLOWED;
2221 switch(req_caller->id.number.presentation & AST_PRES_NUMBER_TYPE) {
2222 case AST_PRES_USER_NUMBER_UNSCREENED:
2223 call->callerinfo.screen = INFO_SCREEN_USER;
2225 case AST_PRES_USER_NUMBER_PASSED_SCREEN:
2226 call->callerinfo.screen = INFO_SCREEN_USER_VERIFIED_PASSED;
2228 case AST_PRES_USER_NUMBER_FAILED_SCREEN:
2229 call->callerinfo.screen = INFO_SCREEN_USER_VERIFIED_FAILED;
2232 call->callerinfo.screen = INFO_SCREEN_NETWORK;
2234 switch((req_caller->id.number.plan >> 4) & 7) {
2236 call->callerinfo.ntype = INFO_NTYPE_SUBSCRIBER;
2239 call->callerinfo.ntype = INFO_NTYPE_NATIONAL;
2242 call->callerinfo.ntype = INFO_NTYPE_INTERNATIONAL;
2245 call->callerinfo.ntype = INFO_NTYPE_UNKNOWN;
2248 call->callerinfo.present = INFO_PRESENT_NOTAVAIL;
2251 if (requestor && req_caller->ani.number.valid) {
2252 if (req_caller->ani.number.str)
2253 strncpy(call->callerinfo.id2, req_caller->ani.number.str, sizeof(call->callerinfo.id2)-1);
2254 switch(req_caller->ani.number.presentation & AST_PRES_RESTRICTION) {
2255 case AST_PRES_RESTRICTED:
2256 call->callerinfo.present2 = INFO_PRESENT_RESTRICTED;
2258 case AST_PRES_UNAVAILABLE:
2259 call->callerinfo.present2 = INFO_PRESENT_NOTAVAIL;
2261 case AST_PRES_ALLOWED:
2263 call->callerinfo.present2 = INFO_PRESENT_ALLOWED;
2265 switch(req_caller->ani.number.presentation & AST_PRES_NUMBER_TYPE) {
2266 case AST_PRES_USER_NUMBER_UNSCREENED:
2267 call->callerinfo.screen2 = INFO_SCREEN_USER;
2269 case AST_PRES_USER_NUMBER_PASSED_SCREEN:
2270 call->callerinfo.screen2 = INFO_SCREEN_USER_VERIFIED_PASSED;
2272 case AST_PRES_USER_NUMBER_FAILED_SCREEN:
2273 call->callerinfo.screen2 = INFO_SCREEN_USER_VERIFIED_FAILED;
2276 call->callerinfo.screen2 = INFO_SCREEN_NETWORK;
2278 switch((req_caller->ani.number.plan >> 4) & 7) {
2280 call->callerinfo.ntype2 = INFO_NTYPE_SUBSCRIBER;
2283 call->callerinfo.ntype2 = INFO_NTYPE_NATIONAL;
2286 call->callerinfo.ntype2 = INFO_NTYPE_INTERNATIONAL;
2289 call->callerinfo.ntype2 = INFO_NTYPE_UNKNOWN;
2292 call->callerinfo.present2 = INFO_PRESENT_NOTAVAIL;
2295 if (requestor && req_caller->id.name.valid) {
2296 if (req_caller->id.name.str)
2297 strncpy(call->callerinfo.name, req_caller->id.name.str, sizeof(call->callerinfo.name)-1);
2301 if (requestor && req_redir->from.number.valid) {
2302 call->redirinfo.itype = INFO_ITYPE_CHAN;
2303 if (req_redir->from.number.str)
2304 strncpy(call->redirinfo.id, req_redir->from.number.str, sizeof(call->redirinfo.id)-1);
2305 switch(req_redir->from.number.presentation & AST_PRES_RESTRICTION) {
2306 case AST_PRES_RESTRICTED:
2307 call->redirinfo.present = INFO_PRESENT_RESTRICTED;
2309 case AST_PRES_UNAVAILABLE:
2310 call->redirinfo.present = INFO_PRESENT_NOTAVAIL;
2312 case AST_PRES_ALLOWED:
2314 call->redirinfo.present = INFO_PRESENT_ALLOWED;
2316 switch(req_redir->from.number.presentation & AST_PRES_NUMBER_TYPE) {
2317 case AST_PRES_USER_NUMBER_UNSCREENED:
2318 call->redirinfo.screen = INFO_SCREEN_USER;
2320 case AST_PRES_USER_NUMBER_PASSED_SCREEN:
2321 call->redirinfo.screen = INFO_SCREEN_USER_VERIFIED_PASSED;
2323 case AST_PRES_USER_NUMBER_FAILED_SCREEN:
2324 call->redirinfo.screen = INFO_SCREEN_USER_VERIFIED_FAILED;
2327 call->redirinfo.screen = INFO_SCREEN_NETWORK;
2329 switch((req_redir->from.number.plan >> 4) & 7) {
2331 call->redirinfo.ntype = INFO_NTYPE_SUBSCRIBER;
2334 call->redirinfo.ntype = INFO_NTYPE_NATIONAL;
2337 call->redirinfo.ntype = INFO_NTYPE_INTERNATIONAL;
2340 call->redirinfo.ntype = INFO_NTYPE_UNKNOWN;
2345 ast_mutex_unlock(&chan_lock);
2350 * call from asterisk
2352 static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
2354 union parameter newparam;
2355 struct chan_call *call;
2356 #if ASTERISK_VERSION_NUM >= 110000
2357 int transfercapability;
2360 ast_mutex_lock(&chan_lock);
2361 #if ASTERISK_VERSION_NUM < 110000
2362 call = ast->tech_pvt;
2364 call = ast_channel_tech_pvt(ast);
2367 #ifdef LCR_FOR_CALLWEAVER
2369 snprintf(ast->name, sizeof(ast->name), "%s/%s-%04x",lcr_type, call->dialstring, ast_random() & 0xffff);
2373 CERROR(NULL, ast, "Received call from Asterisk, but call instance does not exist.\n");
2374 ast_mutex_unlock(&chan_lock);
2378 CDEBUG(NULL, ast, "Received call from Asterisk.\n");
2380 /* pbx process is started */
2381 call->pbx_started = 1;
2382 /* send MESSAGE_NEWREF */
2383 memset(&newparam, 0, sizeof(union parameter));
2384 newparam.newref.direction = 0; /* request from app */
2385 send_message(MESSAGE_NEWREF, 0, &newparam);
2387 /* set hdlc if capability requires hdlc */
2388 #if ASTERISK_VERSION_NUM < 110000
2389 if (ast->transfercapability == INFO_BC_DATAUNRESTRICTED
2390 || ast->transfercapability == INFO_BC_DATARESTRICTED
2391 || ast->transfercapability == INFO_BC_VIDEO)
2393 transfercapability=ast_channel_transfercapability(ast);
2394 if (transfercapability == INFO_BC_DATAUNRESTRICTED
2395 || transfercapability == INFO_BC_DATARESTRICTED
2396 || transfercapability == INFO_BC_VIDEO)
2399 /* if hdlc is forced by option, we change transcap to data */
2401 #if ASTERISK_VERSION_NUM < 110000
2402 && ast->transfercapability != INFO_BC_DATAUNRESTRICTED
2403 && ast->transfercapability != INFO_BC_DATARESTRICTED
2404 && ast->transfercapability != INFO_BC_VIDEO)
2405 ast->transfercapability = INFO_BC_DATAUNRESTRICTED;
2407 && transfercapability != INFO_BC_DATAUNRESTRICTED
2408 && transfercapability != INFO_BC_DATARESTRICTED
2409 && transfercapability != INFO_BC_VIDEO)
2410 transfercapability = INFO_BC_DATAUNRESTRICTED;
2413 #ifndef AST_1_8_OR_HIGHER
2414 call->cid_num[0] = 0;
2415 call->cid_name[0] = 0;
2416 call->cid_rdnis[0] = 0;
2418 if (ast->cid.cid_num) if (ast->cid.cid_num[0])
2419 strncpy(call->cid_num, ast->cid.cid_num,
2420 sizeof(call->cid_num)-1);
2421 if (ast->cid.cid_name) if (ast->cid.cid_name[0])
2422 strncpy(call->cid_name, ast->cid.cid_name,
2423 sizeof(call->cid_name)-1);
2424 if (ast->cid.cid_rdnis) if (ast->cid.cid_rdnis[0])
2425 strncpy(call->cid_rdnis, ast->cid.cid_rdnis,
2426 sizeof(call->cid_rdnis)-1);
2429 ast_mutex_unlock(&chan_lock);
2433 static void send_digit_to_chan(struct ast_channel * ast, char digit )
2435 static const char* dtmf_tones[] = {
2436 "!941+1336/100,!0/100", /* 0 */
2437 "!697+1209/100,!0/100", /* 1 */
2438 "!697+1336/100,!0/100", /* 2 */
2439 "!697+1477/100,!0/100", /* 3 */
2440 "!770+1209/100,!0/100", /* 4 */
2441 "!770+1336/100,!0/100", /* 5 */
2442 "!770+1477/100,!0/100", /* 6 */
2443 "!852+1209/100,!0/100", /* 7 */
2444 "!852+1336/100,!0/100", /* 8 */
2445 "!852+1477/100,!0/100", /* 9 */
2446 "!697+1633/100,!0/100", /* A */
2447 "!770+1633/100,!0/100", /* B */
2448 "!852+1633/100,!0/100", /* C */
2449 "!941+1633/100,!0/100", /* D */
2450 "!941+1209/100,!0/100", /* * */
2451 "!941+1477/100,!0/100" }; /* # */
2453 if (digit >= '0' && digit <='9')
2454 ast_playtones_start(ast,0,dtmf_tones[digit-'0'], 0);
2455 else if (digit >= 'A' && digit <= 'D')
2456 ast_playtones_start(ast,0,dtmf_tones[digit-'A'+10], 0);
2457 else if (digit == '*')
2458 ast_playtones_start(ast,0,dtmf_tones[14], 0);
2459 else if (digit == '#')
2460 ast_playtones_start(ast,0,dtmf_tones[15], 0);
2462 #if ASTERISK_VERSION_NUM < 110000
2463 CDEBUG(NULL, ast, "Unable to handle DTMF tone '%c' for '%s'\n", digit, ast->name);
2465 CDEBUG(NULL, ast, "Unable to handle DTMF tone '%c' for '%s'\n", digit, ast_channel_name(ast));
2470 #ifdef LCR_FOR_ASTERISK
2471 static int lcr_digit_begin(struct ast_channel *ast, char digit)
2473 #ifdef LCR_FOR_CALLWEAVER
2474 static int lcr_digit(struct ast_channel *ast, char digit)
2477 struct chan_call *call;
2478 union parameter newparam;
2481 #ifdef LCR_FOR_CALLWEAVER
2482 int inband_dtmf = 0;
2485 /* only pass IA5 number space */
2486 if (digit > 126 || digit < 32)
2489 ast_mutex_lock(&chan_lock);
2490 #if ASTERISK_VERSION_NUM < 110000
2491 call = ast->tech_pvt;
2493 call = ast_channel_tech_pvt(ast);
2496 CERROR(NULL, ast, "Received digit from Asterisk, but no call instance exists.\n");
2497 ast_mutex_unlock(&chan_lock);
2501 CDEBUG(call, ast, "Received digit '%c' from Asterisk.\n", digit);
2503 /* send information or queue them */
2504 if (call->ref && call->state == CHAN_LCR_STATE_OUT_DIALING) {
2505 CDEBUG(call, ast, "Sending digit to LCR, because we are in dialing state.\n");
2506 memset(&newparam, 0, sizeof(union parameter));
2508 newparam.information.keypad[0] = digit;
2509 newparam.information.keypad[1] = '\0';
2511 newparam.information.id[0] = digit;
2512 newparam.information.id[1] = '\0';
2514 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
2517 && (call->state == CHAN_LCR_STATE_OUT_PREPARE || call->state == CHAN_LCR_STATE_OUT_SETUP)) {
2518 CDEBUG(call, ast, "Queue digits, because we are in setup/dialing state and have no ref yet.\n");
2520 strncat(call->dialque, buf, strlen(call->dialque)-1);
2523 ast_mutex_unlock(&chan_lock);
2525 #ifdef LCR_FOR_ASTERISK
2529 static int lcr_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
2531 int inband_dtmf = 0;
2532 struct chan_call *call;
2535 ast_mutex_lock(&chan_lock);
2537 #if ASTERISK_VERSION_NUM < 110000
2538 call = ast->tech_pvt;
2540 call = ast_channel_tech_pvt(ast);
2545 "Received digit from Asterisk, "
2546 "but no call instance exists.\n");
2547 ast_mutex_unlock(&chan_lock);
2551 CDEBUG(call, ast, "DIGIT END '%c' from Asterisk.\n", digit);
2553 if (call->state == CHAN_LCR_STATE_CONNECT && call->inband_dtmf) {
2557 ast_mutex_unlock(&chan_lock);
2560 CDEBUG(call, ast, "-> sending '%c' inband.\n", digit);
2561 send_digit_to_chan(ast, digit);
2567 static int lcr_answer(struct ast_channel *ast)
2569 union parameter newparam;
2570 struct chan_call *call;
2572 ast_mutex_lock(&chan_lock);
2573 #if ASTERISK_VERSION_NUM < 110000
2574 call = ast->tech_pvt;
2576 call = ast_channel_tech_pvt(ast);
2579 CERROR(NULL, ast, "Received answer from Asterisk, but no call instance exists.\n");
2580 ast_mutex_unlock(&chan_lock);
2584 CDEBUG(call, ast, "Received answer from Asterisk (maybe during lcr_bridge).\n");
2586 /* copy connectinfo, if bridged */
2587 if (call->bridge_call)
2588 memcpy(&call->connectinfo, &call->bridge_call->connectinfo, sizeof(struct connect_info));
2589 /* send connect message to lcr */
2590 if (call->state != CHAN_LCR_STATE_CONNECT) {
2591 memset(&newparam, 0, sizeof(union parameter));
2592 memcpy(&newparam.connectinfo, &call->connectinfo, sizeof(struct connect_info));
2593 send_message(MESSAGE_CONNECT, call->ref, &newparam);
2594 call->state = CHAN_LCR_STATE_CONNECT;
2598 // memset(&newparam, 0, sizeof(union parameter));
2599 // send_message(MESSAGE_ENABLEKEYPAD, call->ref, &newparam);
2601 ast_mutex_unlock(&chan_lock);
2605 static int lcr_hangup(struct ast_channel *ast)
2607 struct chan_call *call;
2608 pthread_t tid = pthread_self();
2610 if (!pthread_equal(tid, chan_tid)) {
2611 ast_mutex_lock(&chan_lock);
2613 #if ASTERISK_VERSION_NUM < 110000
2614 call = ast->tech_pvt;
2616 call = ast_channel_tech_pvt(ast);
2619 CERROR(NULL, ast, "Received hangup from Asterisk, but no call instance exists.\n");
2620 if (!pthread_equal(tid, chan_tid)) {
2621 ast_mutex_unlock(&chan_lock);
2626 if (!pthread_equal(tid, chan_tid))
2627 CDEBUG(call, ast, "Received hangup from Asterisk thread.\n");
2629 CDEBUG(call, ast, "Received hangup from LCR thread.\n");
2631 /* disconnect asterisk, maybe not required */
2632 #if ASTERISK_VERSION_NUM < 110000
2633 ast->tech_pvt = NULL;
2636 ast_channel_tech_pvt_set(ast, NULL);
2637 ast_channel_set_fd(ast, 0, -1);
2641 CDEBUG(call, ast, "Releasing ref and freeing call instance.\n");
2642 #if ASTERISK_VERSION_NUM < 110000
2643 if (ast->hangupcause > 0)
2644 send_release(call, ast->hangupcause, LOCATION_PRIVATE_LOCAL);
2646 if (ast_channel_hangupcause(ast) > 0)
2647 send_release(call, ast_channel_hangupcause(ast), LOCATION_PRIVATE_LOCAL);
2650 send_release(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
2653 if (!pthread_equal(tid, chan_tid)) {
2654 ast_mutex_unlock(&chan_lock);
2658 /* ref is not set, due to prepare setup or release */
2659 if (call->state == CHAN_LCR_STATE_RELEASE) {
2660 /* we get the response to our release */
2661 CDEBUG(call, ast, "Freeing call instance, because we have no ref AND we are requesting no ref.\n");
2664 /* during prepare, we change to release state */
2665 CDEBUG(call, ast, "We must wait until we received our ref, until we can free call instance.\n");
2666 call->state = CHAN_LCR_STATE_RELEASE;
2670 if (!pthread_equal(tid, chan_tid)) {
2671 ast_mutex_unlock(&chan_lock);
2676 static int lcr_write(struct ast_channel *ast, struct ast_frame *fr)
2678 union parameter newparam;
2679 struct chan_call *call;
2680 struct ast_frame * f = fr;
2681 unsigned char *p, *q;
2684 #if ASTERISK_VERSION_NUM < 100000
2685 #ifdef AST_1_8_OR_HIGHER
2686 if (!f->subclass.codec)
2690 CDEBUG(NULL, ast, "No subclass\n");
2692 #ifdef AST_1_8_OR_HIGHER
2693 #if ASTERISK_VERSION_NUM < 100000
2694 #if ASTERISK_VERSION_NUM < 110000
2695 if (!(f->subclass.codec & ast->nativeformats)) {
2697 if (!(f->subclass.codec & ast_channel_nativeformats(ast))) {
2700 #if ASTERISK_VERSION_NUM < 110000
2701 if (!ast_format_cap_iscompatible(ast->nativeformats, &f->subclass.format)) {
2703 if (!ast_format_cap_iscompatible(ast_channel_nativeformats(ast), &f->subclass.format)) {
2707 #if ASTERISK_VERSION_NUM < 110000
2708 if (!(f->subclass & ast->nativeformats)) {
2710 if (!(f->subclass & ast_channel_nativeformats(ast))) {
2714 "Unexpected format. "
2715 "Activating emergency conversion...\n");
2717 #ifdef AST_1_8_OR_HIGHER
2718 #if ASTERISK_VERSION_NUM < 100000
2719 ast_set_write_format(ast, f->subclass.codec);
2721 ast_set_write_format(ast, &f->subclass.format);
2724 ast_set_write_format(ast, f->subclass);
2726 #if ASTERISK_VERSION_NUM < 110000
2727 f = (ast->writetrans) ? ast_translate(
2728 ast->writetrans, fr, 0) : fr;
2730 f = (ast_channel_writetrans(ast)) ? ast_translate(
2731 ast_channel_writetrans(ast), fr, 0) : fr;
2735 ast_mutex_lock(&chan_lock);
2736 #if ASTERISK_VERSION_NUM < 110000
2737 call = ast->tech_pvt;
2739 call = ast_channel_tech_pvt(ast);
2742 ast_mutex_unlock(&chan_lock);
2749 p = *((unsigned char **)&(f->data));
2750 q = newparam.traffic.data;
2751 memset(&newparam, 0, sizeof(union parameter));
2753 l = (len > sizeof(newparam.traffic.data)) ? sizeof(newparam.traffic.data) : len;
2754 newparam.traffic.len = l;
2757 *q++ = flip_bits[*p++];
2758 send_message(MESSAGE_TRAFFIC, call->ref, &newparam);
2760 ast_mutex_unlock(&chan_lock);
2768 static struct ast_frame *lcr_read(struct ast_channel *ast)
2770 struct chan_call *call;
2773 ast_mutex_lock(&chan_lock);
2774 #if ASTERISK_VERSION_NUM < 110000
2775 call = ast->tech_pvt;
2777 call = ast_channel_tech_pvt(ast);
2780 ast_mutex_unlock(&chan_lock);
2783 if (call->pipe[0] > -1) {
2784 if (call->rebuffer && !call->hdlc) {
2785 /* Make sure we have a complete 20ms (160byte) frame */
2786 len=read(call->pipe[0],call->read_buff + call->framepos, 160 - call->framepos);
2788 call->framepos += len;
2791 len = read(call->pipe[0], call->read_buff, sizeof(call->read_buff));
2793 if (len < 0 && errno == EAGAIN) {
2794 ast_mutex_unlock(&chan_lock);
2796 #ifdef LCR_FOR_ASTERISK
2797 return &ast_null_frame;
2800 #ifdef LCR_FOR_CALLWEAVER
2806 close(call->pipe[0]);
2809 ast_mutex_unlock(&chan_lock);
2811 } else if (call->rebuffer && call->framepos < 160) {
2812 /* Not a complete frame, so we send a null-frame */
2813 ast_mutex_unlock(&chan_lock);
2814 return &ast_null_frame;
2818 call->read_fr.frametype = AST_FRAME_VOICE;
2819 #ifdef AST_1_8_OR_HIGHER
2820 #if ASTERISK_VERSION_NUM < 100000
2821 #if ASTERISK_VERSION_NUM < 110000
2822 call->read_fr.subclass.codec = ast->nativeformats;
2824 call->read_fr.subclass.codec = ast_channel_nativeformats(ast);
2827 #if ASTERISK_VERSION_NUM < 110000
2828 ast_best_codec(ast->nativeformats, &call->read_fr.subclass.format);
2830 ast_best_codec(ast_channel_nativeformats(ast), &call->read_fr.subclass.format);
2832 call->read_fr.subclass.integer = call->read_fr.subclass.format.id;
2835 #if ASTERISK_VERSION_NUM < 110000
2836 call->read_fr.subclass = ast->nativeformats;
2838 call->read_fr.subclass = ast_channel_nativeformats(ast);
2841 if (call->rebuffer) {
2842 call->read_fr.datalen = call->framepos;
2843 call->read_fr.samples = call->framepos;
2846 call->read_fr.datalen = len;
2847 call->read_fr.samples = len;
2849 call->read_fr.delivery = ast_tv(0,0);
2850 *((unsigned char **)&(call->read_fr.data)) = call->read_buff;
2851 ast_mutex_unlock(&chan_lock);
2853 return &call->read_fr;
2856 static int lcr_indicate(struct ast_channel *ast, int cond, const void *data, size_t datalen)
2858 union parameter newparam;
2860 struct chan_call *call;
2861 const struct ast_tone_zone_sound *ts = NULL;
2863 ast_mutex_lock(&chan_lock);
2864 #if ASTERISK_VERSION_NUM < 110000
2865 call = ast->tech_pvt;
2867 call = ast_channel_tech_pvt(ast);
2870 CERROR(NULL, ast, "Received indicate from Asterisk, but no call instance exists.\n");
2871 ast_mutex_unlock(&chan_lock);
2876 case AST_CONTROL_BUSY:
2877 CDEBUG(call, ast, "Received indicate AST_CONTROL_BUSY from Asterisk.\n");
2878 ast_setstate(ast, AST_STATE_BUSY);
2879 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2880 /* send message to lcr */
2881 memset(&newparam, 0, sizeof(union parameter));
2882 newparam.disconnectinfo.cause = 17;
2883 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2884 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2886 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2888 CDEBUG(call, ast, "Using Asterisk 'busy' indication\n");
2889 #if ASTERISK_VERSION_NUM < 110000
2890 ts = ast_get_indication_tone(ast->zone, "busy");
2892 ts = ast_get_indication_tone(ast_channel_zone(ast), "busy");
2896 case AST_CONTROL_CONGESTION:
2897 #if ASTERISK_VERSION_NUM < 110000
2898 CDEBUG(call, ast, "Received indicate AST_CONTROL_CONGESTION from Asterisk. (cause %d)\n", ast->hangupcause);
2900 CDEBUG(call, ast, "Received indicate AST_CONTROL_CONGESTION from Asterisk. (cause %d)\n", ast_channel_hangupcause(ast));
2902 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2903 /* send message to lcr */
2904 memset(&newparam, 0, sizeof(union parameter));
2905 #if ASTERISK_VERSION_NUM < 110000
2906 newparam.disconnectinfo.cause = ast->hangupcause;
2908 newparam.disconnectinfo.cause = ast_channel_hangupcause(ast);
2910 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2911 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2913 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2915 CDEBUG(call, ast, "Using Asterisk 'congestion' indication\n");
2916 #if ASTERISK_VERSION_NUM < 110000
2917 ts = ast_get_indication_tone(ast->zone, "congestion");
2919 ts = ast_get_indication_tone(ast_channel_zone(ast), "congestion");
2923 case AST_CONTROL_PROCEEDING:
2924 CDEBUG(call, ast, "Received indicate AST_CONTROL_PROCEEDING from Asterisk.\n");
2925 if (call->state == CHAN_LCR_STATE_IN_SETUP
2926 || call->state == CHAN_LCR_STATE_IN_DIALING) {
2927 /* send message to lcr */
2928 memset(&newparam, 0, sizeof(union parameter));
2929 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
2931 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
2934 case AST_CONTROL_RINGING:
2935 CDEBUG(call, ast, "Received indicate AST_CONTROL_RINGING from Asterisk.\n");
2936 ast_setstate(ast, AST_STATE_RING);
2937 if (call->state == CHAN_LCR_STATE_IN_SETUP
2938 || call->state == CHAN_LCR_STATE_IN_DIALING
2939 || call->state == CHAN_LCR_STATE_IN_PROCEEDING) {
2940 /* send message to lcr */
2941 memset(&newparam, 0, sizeof(union parameter));
2942 send_message(MESSAGE_ALERTING, call->ref, &newparam);
2944 call->state = CHAN_LCR_STATE_IN_ALERTING;
2946 CDEBUG(call, ast, "Using Asterisk 'ring' indication\n");
2947 #if ASTERISK_VERSION_NUM < 110000
2948 ts = ast_get_indication_tone(ast->zone, "ring");
2950 ts = ast_get_indication_tone(ast_channel_zone(ast), "ring");
2954 case AST_CONTROL_PROGRESS:
2955 CDEBUG(call, ast, "Received indicate AST_CONTROL_PROGRESS from Asterisk.\n");
2956 /* request bchannel */
2957 CDEBUG(call, ast, "Requesting audio path.\n");
2958 memset(&newparam, 0, sizeof(union parameter));
2959 send_message(MESSAGE_AUDIOPATH, call->ref, &newparam);
2962 CDEBUG(call, ast, "Received indicate -1.\n");
2963 ast_playtones_stop(ast);
2967 case AST_CONTROL_VIDUPDATE:
2968 CDEBUG(call, ast, "Received indicate AST_CONTROL_VIDUPDATE.\n");
2971 case AST_CONTROL_HOLD:
2972 CDEBUG(call, ast, "Received indicate AST_CONTROL_HOLD from Asterisk.\n");
2973 /* send message to lcr */
2974 memset(&newparam, 0, sizeof(union parameter));
2975 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_HOLD;
2976 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2978 /*start music onhold*/
2979 #ifdef LCR_FOR_ASTERISK
2980 #if ASTERISK_VERSION_NUM <110000
2981 ast_moh_start(ast,data,ast->musicclass);
2983 ast_moh_start(ast,data,ast_channel_musicclass(ast));
2987 #ifdef LCR_FOR_CALLWEAVER
2988 ast_moh_start(ast, NULL);
2993 case AST_CONTROL_UNHOLD:
2994 CDEBUG(call, ast, "Received indicate AST_CONTROL_UNHOLD from Asterisk.\n");
2995 /* send message to lcr */
2996 memset(&newparam, 0, sizeof(union parameter));
2997 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
2998 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
3004 #ifdef AST_CONTROL_SRCUPDATE
3005 case AST_CONTROL_SRCUPDATE:
3009 CDEBUG(call, ast, "Received AST_CONTROL_SRCUPDATE from Asterisk.\n");
3012 CERROR(call, ast, "Received indicate from Asterisk with unknown condition %d.\n", cond);
3017 if (ts && ts->data[0]) {
3018 ast_playtones_start(ast, 0, ts->data, 1);
3022 ast_mutex_unlock(&chan_lock);
3029 static int lcr_fixup(struct ast_channel *oldast, struct ast_channel *ast)
3031 struct chan_call *call;
3037 ast_mutex_lock(&chan_lock);
3038 #if ASTERISK_VERSION_NUM < 110000
3039 call = ast->tech_pvt;
3041 call = ast_channel_tech_pvt(ast);
3044 CERROR(NULL, ast, "Received fixup from Asterisk, but no call instance exists.\n");
3045 ast_mutex_unlock(&chan_lock);
3049 CDEBUG(call, ast, "Received fixup from Asterisk.\n");
3051 ast_mutex_unlock(&chan_lock);
3056 * send_text asterisk
3058 static int lcr_send_text(struct ast_channel *ast, const char *text)
3060 struct chan_call *call;
3061 union parameter newparam;
3063 ast_mutex_lock(&chan_lock);
3064 #if ASTERISK_VERSION_NUM < 110000
3065 call = ast->tech_pvt;
3067 call = ast_channel_tech_pvt(ast);
3070 CERROR(NULL, ast, "Received send_text from Asterisk, but no call instance exists.\n");
3071 ast_mutex_unlock(&chan_lock);
3075 CDEBUG(call, ast, "Received send_text from Asterisk. (text=%s)\n", text);
3076 memset(&newparam, 0, sizeof(union parameter));
3077 strncpy(newparam.notifyinfo.display, text, sizeof(newparam.notifyinfo.display)-1);
3078 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
3079 ast_mutex_unlock(&chan_lock);
3086 enum ast_bridge_result lcr_bridge(struct ast_channel *ast1,
3087 struct ast_channel *ast2, int flags,
3088 struct ast_frame **fo,
3089 struct ast_channel **rc, int timeoutms)
3092 struct chan_call *call1, *call2;
3093 struct ast_channel *carr[2], *who;
3095 struct ast_frame *f;
3098 CDEBUG(NULL, NULL, "Received bridging request from Asterisk.\n");
3103 /* join via dsp (if the channels are currently open) */
3104 ast_mutex_lock(&chan_lock);
3105 #if ASTERISK_VERSION_NUM < 110000
3106 call1 = ast1->tech_pvt;
3107 call2 = ast2->tech_pvt;
3109 call1 = ast_channel_tech_pvt(ast1);
3110 call2 = ast_channel_tech_pvt(ast2);
3112 if (!call1 || !call2) {
3113 CDEBUG(NULL, NULL, "Bridge, but we don't have two call instances, exitting.\n");
3114 ast_mutex_unlock(&chan_lock);
3115 return AST_BRIDGE_COMPLETE;
3118 /* join, if both call instances uses dsp
3119 ignore the case of fax detection here it may be benificial for ISDN fax machines or pass through.
3121 CDEBUG(NULL, NULL, "Both calls use DSP, bridging via DSP.\n");
3123 /* get bridge id and join */
3124 bridge_id = new_bridge_id();
3127 call1->bridge_id = bridge_id;
3128 if (call1->bchannel)
3129 bchannel_join(call1->bchannel, bridge_id);
3131 call2->bridge_id = bridge_id;
3132 if (call2->bchannel)
3133 bchannel_join(call2->bchannel, bridge_id);
3139 call1->bridge_call = call2;
3140 call2->bridge_call = call1;
3142 if (call1->state == CHAN_LCR_STATE_IN_SETUP
3143 || call1->state == CHAN_LCR_STATE_IN_DIALING
3144 || call1->state == CHAN_LCR_STATE_IN_PROCEEDING
3145 || call1->state == CHAN_LCR_STATE_IN_ALERTING) {
3146 CDEBUG(call1, ast1, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
3149 if (call2->state == CHAN_LCR_STATE_IN_SETUP
3150 || call2->state == CHAN_LCR_STATE_IN_DIALING
3151 || call2->state == CHAN_LCR_STATE_IN_PROCEEDING
3152 || call2->state == CHAN_LCR_STATE_IN_ALERTING) {
3153 CDEBUG(call2, ast2, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
3157 /* sometimes SIP phones forget to send RETRIEVE before TRANSFER
3158 so let's do it for them. Hmpf.
3161 if (call1->on_hold) {
3162 union parameter newparam;
3164 memset(&newparam, 0, sizeof(union parameter));
3165 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
3166 send_message(MESSAGE_NOTIFY, call1->ref, &newparam);
3171 if (call2->on_hold) {
3172 union parameter newparam;
3174 memset(&newparam, 0, sizeof(union parameter));
3175 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
3176 send_message(MESSAGE_NOTIFY, call2->ref, &newparam);
3181 ast_mutex_unlock(&chan_lock);
3185 who = ast_waitfor_n(carr, 2, &to);
3188 CDEBUG(NULL, NULL, "Empty read on bridge, breaking out.\n");
3193 if (!f || f->frametype == AST_FRAME_CONTROL) {
3195 CDEBUG(NULL, NULL, "Got hangup.\n");
3197 CDEBUG(NULL, NULL, "Got CONTROL.\n");
3204 if ( f->frametype == AST_FRAME_DTMF ) {
3205 CDEBUG(NULL, NULL, "Got DTMF.\n");
3221 CDEBUG(NULL, NULL, "Releasing bridge.\n");
3223 /* split channels */
3224 ast_mutex_lock(&chan_lock);
3225 #if ASTERISK_VERSION_NUM < 110000
3226 call1 = ast1->tech_pvt;
3227 call2 = ast2->tech_pvt;
3229 call1 = ast_channel_tech_pvt(ast1);
3230 call2 = ast_channel_tech_pvt(ast2);
3232 if (call1 && call1->bridge_id) {
3233 call1->bridge_id = 0;
3234 if (call1->bridge_call)
3235 call1->bridge_call->bridge_call = NULL;
3237 if (call2 && call1->bridge_id) {
3238 call2->bridge_id = 0;
3239 if (call2->bridge_call)
3240 call2->bridge_call->bridge_call = NULL;
3242 call1->bridge_call = NULL;
3243 call2->bridge_call = NULL;
3245 ast_mutex_unlock(&chan_lock);
3246 return AST_BRIDGE_COMPLETE;
3248 static struct ast_channel_tech lcr_tech = {
3250 .description = "Channel driver for connecting to Linux-Call-Router",
3251 #if ASTERISK_VERSION_NUM < 100000
3252 .capabilities = AST_FORMAT_ALAW,
3254 .requester = lcr_request,
3256 #ifdef LCR_FOR_ASTERISK
3257 .send_digit_begin = lcr_digit_begin,
3258 .send_digit_end = lcr_digit_end,
3261 #ifdef LCR_FOR_CALLWEAVER
3262 .send_digit = lcr_digit,
3266 .bridge = lcr_bridge,
3267 .hangup = lcr_hangup,
3268 .answer = lcr_answer,
3271 .indicate = lcr_indicate,
3273 .send_text = lcr_send_text,
3282 static int lcr_show_lcr (int fd, int argc, char *argv[])
3287 static int lcr_show_calls (int fd, int argc, char *argv[])
3292 static int lcr_reload_routing (int fd, int argc, char *argv[])
3297 static int lcr_reload_interfaces (int fd, int argc, char *argv[])
3302 static int lcr_port_block (int fd, int argc, char *argv[])
3307 static int lcr_port_unblock (int fd, int argc, char *argv[])
3312 static int lcr_port_unload (int fd, int argc, char *argv[])
3317 static struct ast_cli_entry cli_show_lcr =
3318 { {"lcr", "show", "lcr", NULL},
3320 "Shows current states of LCR core",
3321 "Usage: lcr show lcr\n",
3324 static struct ast_cli_entry cli_show_calls =
3325 { {"lcr", "show", "calls", NULL},
3327 "Shows current calls made by LCR and Asterisk",
3328 "Usage: lcr show calls\n",
3331 static struct ast_cli_entry cli_reload_routing =
3332 { {"lcr", "reload", "routing", NULL},
3334 "Reloads routing conf of LCR, current uncomplete calls will be disconnected",
3335 "Usage: lcr reload routing\n",
3338 static struct ast_cli_entry cli_reload_interfaces =
3339 { {"lcr", "reload", "interfaces", NULL},
3340 lcr_reload_interfaces,
3341 "Reloads interfaces conf of LCR",
3342 "Usage: lcr reload interfaces\n",
3345 static struct ast_cli_entry cli_port_block =
3346 { {"lcr", "port", "block", NULL},
3348 "Blocks LCR port for further calls",
3349 "Usage: lcr port block \"<port>\"\n",
3352 static struct ast_cli_entry cli_port_unblock =
3353 { {"lcr", "port", "unblock", NULL},
3355 "Unblocks or loads LCR port, port is opened my mISDN",
3356 "Usage: lcr port unblock \"<port>\"\n",
3359 static struct ast_cli_entry cli_port_unload =
3360 { {"lcr", "port", "unload", NULL},
3362 "Unloads LCR port, port is closes by mISDN",
3363 "Usage: lcr port unload \"<port>\"\n",
3368 #ifdef LCR_FOR_ASTERISK
3369 #ifdef AST_1_8_OR_HIGHER
3370 static int lcr_config_exec(struct ast_channel *ast, const char *data)
3372 static int lcr_config_exec(struct ast_channel *ast, void *data)
3376 #ifdef LCR_FOR_CALLWEAVER
3377 static int lcr_config_exec(struct ast_channel *ast, void *data, char **argv)
3380 struct chan_call *call;
3382 ast_mutex_lock(&chan_lock);
3384 #ifdef LCR_FOR_ASTERISK
3385 CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", (char *)data);
3388 #ifdef LCR_FOR_CALLWEAVER
3389 CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", argv[0]);
3395 if (call->ast == ast)
3401 #ifdef LCR_FOR_ASTERISK
3402 apply_opt(call, (char *)data);
3405 #ifdef LCR_FOR_CALLWEAVER
3406 apply_opt(call, (char *)argv[0]);
3410 if (call->tx_queue) {
3411 union parameter newparam;
3413 memset(&newparam, 0, sizeof(union parameter));
3414 newparam.queue = call->tx_queue * 8;
3415 send_message(MESSAGE_DISABLE_DEJITTER, call->ref, &newparam);
3418 CERROR(NULL, ast, "lcr_config app not called by chan_lcr channel.\n");
3420 ast_mutex_unlock(&chan_lock);
3425 * module loading and destruction
3427 int load_module(void)
3430 char options_error[256];
3432 for (i = 0; i < 256; i++) {
3433 flip_bits[i] = (i>>7) | ((i>>5)&2) | ((i>>3)&4) | ((i>>1)&8)
3434 | (i<<7) | ((i&2)<<5) | ((i&4)<<3) | ((i&8)<<1);
3437 if (read_options(options_error) == 0) {
3438 CERROR(NULL, NULL, "%s", options_error);
3440 #ifdef LCR_FOR_ASTERISK
3441 return AST_MODULE_LOAD_DECLINE;
3444 #ifdef LCR_FOR_CALLWEAVER
3450 ast_mutex_init(&chan_lock);
3451 ast_mutex_init(&log_lock);
3453 #if ASTERISK_VERSION_NUM < 100000
3454 lcr_tech.capabilities = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
3456 struct ast_format tmp;
3457 ast_format_set(&tmp ,(options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW , 0);
3458 if (!(lcr_tech.capabilities = ast_format_cap_alloc())) {
3459 return AST_MODULE_LOAD_DECLINE;
3461 ast_format_cap_add(lcr_tech.capabilities, &tmp);
3463 if (ast_channel_register(&lcr_tech)) {
3464 CERROR(NULL, NULL, "Unable to register channel class\n");
3467 #ifdef LCR_FOR_ASTERISK
3468 return AST_MODULE_LOAD_DECLINE;
3471 #ifdef LCR_FOR_CALLWEAVER
3476 ast_register_application("lcr_config", lcr_config_exec, "lcr_config",
3478 #ifdef LCR_FOR_ASTERISK
3479 "lcr_config(<opt><optarg>:<opt>:...)\n"
3482 #ifdef LCR_FOR_CALLWEAVER
3483 "lcr_config(<opt><optarg>:<opt>:...)\n",
3486 "Sets LCR opts. and optargs\n"
3488 "The available options are:\n"
3489 " d - Send display text on called phone, text is the optarg.\n"
3490 " n - Don't detect dtmf tones on called channel.\n"
3491 " h - Force data call (HDLC).\n"
3492 " q - Add queue to make fax stream seamless (required for fax app).\n"
3493 " Use queue size in miliseconds for optarg. (try 250)\n"
3494 " f - Adding fax detection. It it timeouts, mISDN_dsp is used.\n"
3495 " Use time to detect for optarg.\n"
3497 " c - Make crypted outgoing call, optarg is keyindex.\n"
3498 " e - Perform echo cancelation on this channel.\n"
3500 " Takes mISDN pipeline option as optarg.\n"
3501 " s - Send Non Inband DTMF as inband.\n"
3502 " r - re-buffer packets (160 bytes). Required for some SIP-phones and fax applications.\n"
3504 " vr - rxgain control\n"
3505 " vt - txgain control\n"
3507 " Volume changes at factor 2 ^ optarg.\n"
3508 " k - use keypad to dial this call.\n"
3510 "set LCR_TRANSFERCAPABILITY to the numerical bearer capabilty in order to alter caller's capability\n"
3511 " -> use 16 for fax (3.1k audio)\n"
3513 "To send a fax, you need to set LCR_TRANSFERCAPABILITY environment to 16, also you need to set\n"
3514 "options: \"n:t:q250\" for seamless audio transmission.\n"
3519 ast_cli_register(&cli_show_lcr);
3520 ast_cli_register(&cli_show_calls);
3521 ast_cli_register(&cli_reload_routing);
3522 ast_cli_register(&cli_reload_interfaces);
3523 ast_cli_register(&cli_port_block);
3524 ast_cli_register(&cli_port_unblock);
3525 ast_cli_register(&cli_port_unload);
3528 if ((pthread_create(&chan_tid, NULL, chan_thread, NULL)<0)) {
3529 /* failed to create thread */
3531 ast_channel_unregister(&lcr_tech);
3533 #ifdef LCR_FOR_ASTERISK
3534 return AST_MODULE_LOAD_DECLINE;
3537 #ifdef LCR_FOR_CALLWEAVER
3545 int unload_module(void)
3547 /* First, take us out of the channel loop */
3548 CDEBUG(NULL, NULL, "-- Unregistering Linux-Call-Router Channel Driver --\n");
3550 pthread_cancel(chan_tid);
3554 del_timer(&socket_retry);
3556 unregister_fd(&wake_fd);
3557 close(wake_pipe[0]);
3558 close(wake_pipe[1]);
3560 // ast_mutex_unlock(&chan_lock);
3562 ast_channel_unregister(&lcr_tech);
3564 ast_unregister_application("lcr_config");
3566 if (lcr_sock >= 0) {
3571 #if ASTERISK_VERSION_NUM >= 100000
3572 lcr_tech.capabilities = ast_format_cap_destroy(lcr_tech.capabilities);
3577 int reload_module(void)
3583 #ifdef LCR_FOR_ASTERISK
3584 #define AST_MODULE "chan_lcr"
3587 #ifdef LCR_FOR_CALLWEAVER
3592 ast_mutex_lock(&usecnt_lock);
3594 ast_mutex_unlock(&usecnt_lock);
3599 #ifdef LCR_FOR_ASTERISK
3600 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Channel driver for Linux-Call-Router Support (ISDN BRI/PRI)",
3601 .load = load_module,
3602 .unload = unload_module,
3603 .reload = reload_module,
3607 #ifdef LCR_FOR_CALLWEAVER
3608 char *description(void)