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>
139 #include <asterisk/module.h>
140 #include <asterisk/channel.h>
141 #include <asterisk/config.h>
142 #include <asterisk/logger.h>
143 #include <asterisk/pbx.h>
144 #include <asterisk/options.h>
145 #include <asterisk/io.h>
146 #include <asterisk/frame.h>
147 #include <asterisk/translate.h>
148 #include <asterisk/cli.h>
149 #include <asterisk/musiconhold.h>
150 #include <asterisk/dsp.h>
151 #include <asterisk/translate.h>
152 #include <asterisk/file.h>
153 #ifdef LCR_FOR_ASTERISK
154 #include <asterisk/callerid.h>
156 #ifdef LCR_FOR_CALLWEAVER
157 #include <asterisk/phone_no_utils.h>
160 #include <asterisk/indications.h>
161 #include <asterisk/app.h>
162 #include <asterisk/features.h>
163 #include <asterisk/sched.h>
165 #include "extension.h"
167 #include "callerid.h"
168 #include "lcrsocket.h"
170 #include "bchannel.h"
172 #include "chan_lcr.h"
174 CHAN_LCR_STATE // state description structure
175 MESSAGES // message text
177 #ifdef LCR_FOR_CALLWEAVER
178 AST_MUTEX_DEFINE_STATIC(rand_lock);
181 unsigned char flip_bits[256];
183 #ifdef LCR_FOR_CALLWEAVER
184 static struct ast_frame nullframe = { AST_FRAME_NULL, };
190 char lcr_type[]="lcr";
192 #ifdef LCR_FOR_CALLWEAVER
193 static ast_mutex_t usecnt_lock;
195 static char *desc = "Channel driver for mISDN/LCR Support (Bri/Pri)";
199 ast_mutex_t chan_lock; /* global lock */
200 ast_mutex_t log_lock; /* logging log */
203 int glob_channel = 0;
208 struct admin_list *next;
209 struct admin_message msg;
210 } *admin_first = NULL;
212 static struct ast_channel_tech lcr_tech;
217 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, ...)
220 char call_text[128] = "NULL";
221 char ast_text[128] = "NULL";
224 ast_mutex_lock(&log_lock);
227 vsnprintf(buffer,sizeof(buffer)-1,fmt,args);
228 buffer[sizeof(buffer)-1]=0;
232 sprintf(call_text, "%d", call->ref);
234 strncpy(ast_text, ast->name, sizeof(ast_text)-1);
235 ast_text[sizeof(ast_text)-1] = '\0';
237 ast_log(type, file, line, function, "[call=%s ast=%s] %s", call_text, ast_text, buffer);
239 ast_mutex_unlock(&log_lock);
243 * channel and call instances
245 struct chan_call *call_first;
249 * special case: 0: find new ref, that has not been assigned a ref yet
252 struct chan_call *find_call_ref(unsigned int ref)
254 struct chan_call *call = call_first;
255 int assigned = (ref > 0);
259 if (call->ref == ref && call->ref_was_assigned == assigned)
266 void free_call(struct chan_call *call)
268 struct chan_call **temp = &call_first;
274 *temp = (*temp)->next;
275 if (call->pipe[0] > -1)
276 close(call->pipe[0]);
277 if (call->pipe[1] > -1)
278 close(call->pipe[1]);
281 if (call->bchannel->call != call)
282 CERROR(call, NULL, "Linked bchannel structure has no link to us.\n");
283 call->bchannel->call = NULL;
285 if (call->bridge_call)
287 if (call->bridge_call->bridge_call != call)
288 CERROR(call, NULL, "Linked call structure has no link to us.\n");
289 call->bridge_call->bridge_call = NULL;
292 ast_translator_free_path(call->trans);
294 ast_dsp_free(call->dsp);
295 CDEBUG(call, NULL, "Call instance freed.\n");
299 temp = &((*temp)->next);
301 CERROR(call, NULL, "Call instance not found in list.\n");
304 struct chan_call *alloc_call(void)
306 struct chan_call **callp = &call_first;
309 callp = &((*callp)->next);
311 *callp = (struct chan_call *)calloc(1, sizeof(struct chan_call));
313 memset(*callp, 0, sizeof(struct chan_call));
314 if (pipe((*callp)->pipe) < 0) {
315 CERROR(*callp, NULL, "Failed to create pipe.\n");
319 fcntl((*callp)->pipe[0], F_SETFL, O_NONBLOCK);
320 CDEBUG(*callp, NULL, "Call instance allocated.\n");
324 unsigned short new_bridge_id(void)
326 struct chan_call *call;
327 unsigned short id = 1;
329 /* search for lowest bridge id that is not in use and not 0 */
335 if (call->bridge_id == id)
343 CDEBUG(NULL, NULL, "New bridge ID %d.\n", id);
348 * enque message to LCR
350 int send_message(int message_type, unsigned int ref, union parameter *param)
352 struct admin_list *admin, **adminp;
355 CDEBUG(NULL, NULL, "Ignoring message %d, because socket is closed.\n", message_type);
358 CDEBUG(NULL, NULL, "Sending %s to socket.\n", messages_txt[message_type]);
360 adminp = &admin_first;
362 adminp = &((*adminp)->next);
363 admin = (struct admin_list *)calloc(1, sizeof(struct admin_list));
365 CERROR(NULL, NULL, "No memory for message to LCR.\n");
370 admin->msg.message = ADMIN_MESSAGE;
371 admin->msg.u.msg.type = message_type;
372 admin->msg.u.msg.ref = ref;
373 memcpy(&admin->msg.u.msg.param, param, sizeof(union parameter));
379 * apply options (in locked state)
381 void apply_opt(struct chan_call *call, char *data)
383 union parameter newparam;
384 char string[1024], *p = string, *opt, *key;
390 strncpy(string, data, sizeof(string)-1);
391 string[sizeof(string)-1] = '\0';
394 while((opt = strsep(&p, ":")))
398 if (opt[1] == '\0') {
399 CERROR(call, call->ast, "Option 'd' (display) expects parameter.\n", opt);
402 CDEBUG(call, call->ast, "Option 'd' (display) with text '%s'.\n", opt+1);
403 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
404 strncpy(call->display, opt+1, sizeof(call->display)-1);
406 memset(&newparam, 0, sizeof(union parameter));
407 strncpy(newparam.notifyinfo.display, opt+1, sizeof(newparam.notifyinfo.display)-1);
408 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
412 if (opt[1] != '\0') {
413 CERROR(call, call->ast, "Option 'n' (no DTMF) expects no parameter.\n", opt);
416 CDEBUG(call, call->ast, "Option 'n' (no DTMF).\n");
420 if (opt[1] == '\0') {
421 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter.\n", opt);
425 /* check for 0xXXXX... type of key */
426 if (!!strncmp((char *)key, "0x", 2)) {
427 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter starting with '0x'.\n", opt);
431 if (strlen(key) > 56*2 || (strlen(key) % 1)) {
432 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter with max 56 bytes ('0x' + 112 characters)\n", opt);
438 if (*key>='0' && *key<='9')
439 call->bf_key[i] = (*key-'0') << 8;
440 else if (*key>='a' && *key<='f')
441 call->bf_key[i] = (*key-'a'+10) << 8;
442 else if (*key>='A' && *key<='F')
443 call->bf_key[i] = (*key-'A'+10) << 8;
447 if (*key>='0' && *key<='9')
448 call->bf_key[i] += (*key - '0');
449 else if (*key>='a' && *key<='f')
450 call->bf_key[i] += (*key - 'a' + 10);
451 else if (*key>='A' && *key<='F')
452 call->bf_key[i] += (*key - 'A' + 10);
459 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter with hex values 0-9,a-f.\n");
463 CDEBUG(call, call->ast, "Option 'c' (encrypt) blowfish key '%s' (len=%d).\n", opt+1, i);
465 bchannel_blowfish(call->bchannel, call->bf_key, call->bf_len);
468 if (opt[1] != '\0') {
469 CERROR(call, call->ast, "Option 'h' (HDLC) expects no parameter.\n", opt);
472 CDEBUG(call, call->ast, "Option 'h' (HDLC).\n");
477 if (opt[1] != '\0') {
478 CERROR(call, call->ast, "Option 't' (no_dsp) expects no parameter.\n", opt);
481 CDEBUG(call, call->ast, "Option 't' (no dsp).\n");
486 if (opt[1] == '\0') {
487 CERROR(call, call->ast, "Option 'e' (echo cancel) expects parameter.\n", opt);
490 CDEBUG(call, call->ast, "Option 'e' (echo cancel) with config '%s'.\n", opt+1);
491 strncpy(call->pipeline, opt+1, sizeof(call->pipeline)-1);
493 bchannel_pipeline(call->bchannel, call->pipeline);
496 if (opt[1] == '\0') {
497 CERROR(call, call->ast, "Option 'f' (faxdetect) expects parameter.\n", opt);
500 call->faxdetect=atoi(opt+1);
502 call->dsp=ast_dsp_new();
504 #ifdef LCR_FOR_CALLWEAVER
505 ast_dsp_set_features(call->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_CNG_DETECT);
507 #ifdef LCR_FOR_ASTERISK
508 #ifdef DSP_FEATURE_DTMF_DETECT
509 ast_dsp_set_features(call->dsp, DSP_FEATURE_DTMF_DETECT| DSP_FEATURE_FAX_DETECT);
511 ast_dsp_set_features(call->dsp, DSP_FEATURE_DIGIT_DETECT| DSP_FEATURE_FAX_DETECT);
516 #ifdef LCR_FOR_CALLWEAVER
517 call->trans=ast_translator_build_path(AST_FORMAT_SLINEAR, 8000, (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW, 8000);
519 #ifdef LCR_FOR_ASTERISK
520 call->trans=ast_translator_build_path(AST_FORMAT_SLINEAR, (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW);
523 CDEBUG(call, call->ast, "Option 'f' (faxdetect) with config '%s'.\n", call->faxdetect);
526 if (opt[1] != '\0') {
527 CERROR(call, call->ast, "Option 'r' (re-buffer 160 bytes) expects no parameter.\n", opt);
530 CDEBUG(call, call->ast, "Option 'r' (re-buffer 160 bytes)");
535 if (opt[1] != '\0') {
536 CERROR(call, call->ast, "Option 's' (inband DTMF) expects no parameter.\n", opt);
539 CDEBUG(call, call->ast, "Option 's' (inband DTMF).\n");
540 call->inband_dtmf = 1;
543 if (opt[1] != 'r' && opt[1] != 't') {
544 CERROR(call, call->ast, "Option 'v' (volume) expects parameter.\n", opt);
548 if (gain < -8 || gain >8) {
549 CERROR(call, call->ast, "Option 'v' (volume) expects parameter in range of -8 through 8.\n");
552 CDEBUG(call, call->ast, "Option 'v' (volume) with gain 2^%d.\n", gain);
554 call->rx_gain = gain;
556 bchannel_gain(call->bchannel, call->rx_gain, 0);
558 call->tx_gain = gain;
560 bchannel_gain(call->bchannel, call->tx_gain, 1);
564 CERROR(call, call->ast, "Option '%s' unknown.\n", opt);
568 /* re-open, if bchannel is created */
569 if (call->bchannel && call->bchannel->b_sock > -1) {
570 bchannel_destroy(call->bchannel);
571 if (bchannel_create(call->bchannel, ((call->nodsp || call->faxdetect > 0)?1:0) + ((call->hdlc)?2:0)))
572 bchannel_activate(call->bchannel, 1);
577 * send setup info to LCR
578 * this function is called, when asterisk call is received and ref is received
580 static void send_setup_to_lcr(struct chan_call *call)
582 union parameter newparam;
583 struct ast_channel *ast = call->ast;
585 if (!call->ast || !call->ref)
588 CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->cid_num);
590 /* send setup message to LCR */
591 memset(&newparam, 0, sizeof(union parameter));
592 newparam.setup.dialinginfo.itype = INFO_ITYPE_ISDN;
593 newparam.setup.dialinginfo.ntype = INFO_NTYPE_UNKNOWN;
594 strncpy(newparam.setup.dialinginfo.id, call->dialstring, sizeof(newparam.setup.dialinginfo.id)-1);
595 strncpy(newparam.setup.dialinginfo.interfaces, call->interface, sizeof(newparam.setup.dialinginfo.interfaces)-1);
596 newparam.setup.callerinfo.itype = INFO_ITYPE_CHAN;
597 newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
598 strncpy(newparam.setup.callerinfo.display, call->display, sizeof(newparam.setup.callerinfo.display)-1);
599 call->display[0] = '\0';
600 if (call->cid_num[0])
601 strncpy(newparam.setup.callerinfo.id, call->cid_num, sizeof(newparam.setup.callerinfo.id)-1);
602 if (call->cid_name[0])
603 strncpy(newparam.setup.callerinfo.name, call->cid_name, sizeof(newparam.setup.callerinfo.name)-1);
604 if (call->cid_rdnis[0])
606 strncpy(newparam.setup.redirinfo.id, call->cid_rdnis, sizeof(newparam.setup.redirinfo.id)-1);
607 newparam.setup.redirinfo.itype = INFO_ITYPE_CHAN;
608 newparam.setup.redirinfo.ntype = INFO_NTYPE_UNKNOWN;
610 switch(ast->cid.cid_pres & AST_PRES_RESTRICTION)
612 case AST_PRES_RESTRICTED:
613 newparam.setup.callerinfo.present = INFO_PRESENT_RESTRICTED;
615 case AST_PRES_UNAVAILABLE:
616 newparam.setup.callerinfo.present = INFO_PRESENT_NOTAVAIL;
618 case AST_PRES_ALLOWED:
620 newparam.setup.callerinfo.present = INFO_PRESENT_ALLOWED;
622 switch(ast->cid.cid_ton)
625 newparam.setup.callerinfo.ntype = INFO_NTYPE_SUBSCRIBER;
628 newparam.setup.callerinfo.ntype = INFO_NTYPE_NATIONAL;
631 newparam.setup.callerinfo.ntype = INFO_NTYPE_INTERNATIONAL;
634 newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
636 newparam.setup.capainfo.bearer_capa = ast->transfercapability;
637 newparam.setup.capainfo.bearer_mode = INFO_BMODE_CIRCUIT;
639 newparam.setup.capainfo.source_mode = B_MODE_HDLC;
641 newparam.setup.capainfo.source_mode = B_MODE_TRANSPARENT;
642 newparam.setup.capainfo.bearer_info1 = (options.law=='a')?3:2;
644 newparam.setup.capainfo.hlc = INFO_HLC_NONE;
645 newparam.setup.capainfo.exthlc = INFO_HLC_NONE;
646 send_message(MESSAGE_SETUP, call->ref, &newparam);
648 /* change to outgoing setup state */
649 call->state = CHAN_LCR_STATE_OUT_SETUP;
653 * send dialing info to LCR
654 * this function is called, when setup acknowledge is received and dialing
657 static void send_dialque_to_lcr(struct chan_call *call)
659 union parameter newparam;
661 if (!call->ast || !call->ref || !call->dialque[0])
664 CDEBUG(call, call->ast, "Sending dial queue to LCR. (dialing=%s)\n", call->dialque);
666 /* send setup message to LCR */
667 memset(&newparam, 0, sizeof(union parameter));
668 strncpy(newparam.information.id, call->dialque, sizeof(newparam.information.id)-1);
669 call->dialque[0] = '\0';
670 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
674 * in case of a bridge, the unsupported message can be forwarded directly
675 * to the remote call.
677 static void bridge_message_if_bridged(struct chan_call *call, int message_type, union parameter *param)
681 if (!call->bridge_call) return;
682 CDEBUG(call, NULL, "Sending message due bridging.\n");
683 send_message(message_type, call->bridge_call->ref, param);
687 * send release message to LCR and import bchannel if exported
689 static void send_release_and_import(struct chan_call *call, int cause, int location)
691 union parameter newparam;
693 /* importing channel */
694 if (call->bchannel) {
695 memset(&newparam, 0, sizeof(union parameter));
696 newparam.bchannel.type = BCHANNEL_RELEASE;
697 newparam.bchannel.handle = call->bchannel->handle;
698 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
700 /* sending release */
701 memset(&newparam, 0, sizeof(union parameter));
702 newparam.disconnectinfo.cause = cause;
703 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
704 send_message(MESSAGE_RELEASE, call->ref, &newparam);
708 * check if extension matches and start asterisk
709 * if it can match, proceed
712 static void lcr_start_pbx(struct chan_call *call, struct ast_channel *ast, int complete)
715 union parameter newparam;
716 char *exten = ast->exten;
720 CDEBUG(call, ast, "Try to start pbx. (exten=%s context=%s complete=%s)\n", exten, ast->context, complete?"yes":"no");
725 if (!ast_canmatch_extension(ast, ast->context, exten, 1, call->oad))
727 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' will not match at context '%s' - releasing.\n", exten, ast->context);
731 if (!ast_exists_extension(ast, ast->context, exten, 1, call->oad))
733 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);
737 CDEBUG(call, ast, "Got 'sending complete', extensions matches.\n");
738 /* send setup acknowledge to lcr */
739 memset(&newparam, 0, sizeof(union parameter));
740 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
743 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
748 if (ast_canmatch_extension(ast, ast->context, exten, 1, call->oad))
750 /* send setup acknowledge to lcr */
751 if (call->state != CHAN_LCR_STATE_IN_DIALING) {
752 memset(&newparam, 0, sizeof(union parameter));
753 send_message(MESSAGE_OVERLAP, call->ref, &newparam);
757 call->state = CHAN_LCR_STATE_IN_DIALING;
759 /* if match, start pbx */
760 if (ast_exists_extension(ast, ast->context, exten, 1, call->oad)) {
761 CDEBUG(call, ast, "Extensions matches.\n");
766 CDEBUG(call, ast, "Extensions may match, if more digits are dialed.\n");
772 CDEBUG(call, ast, "There is no 's' extension (and we tried to match it implicitly). Extensions may match, if more digits are dialed.\n");
780 CDEBUG(call, ast, "Releasing due to extension missmatch.\n");
781 send_release_and_import(call, cause, LOCATION_PRIVATE_LOCAL);
783 /* release asterisk */
784 ast->hangupcause = call->cause;
785 /* change to release state */
786 call->state = CHAN_LCR_STATE_RELEASE;
787 ast_hangup(ast); // call will be destroyed here
791 /* send setup to asterisk */
792 CDEBUG(call, ast, "Starting call to Asterisk due to matching extension.\n");
794 #ifdef LCR_FOR_CALLWEAVER
796 snprintf(ast->name, sizeof(ast->name), "LCR/%s-%04x",ast->cid.cid_num, ast_random() & 0xffff);
799 ret = ast_pbx_start(ast);
802 cause = (ret==-2)?34:27;
805 call->pbx_started = 1;
806 ast_setstate(ast, AST_STATE_RING);
810 * incoming setup from LCR
812 static void lcr_in_setup(struct chan_call *call, int message_type, union parameter *param)
814 struct ast_channel *ast;
816 CDEBUG(call, NULL, "Incomming setup from LCR. (callerid %s, dialing %s)\n", param->setup.callerinfo.id, param->setup.dialinginfo.id);
818 /* create asterisk channel instrance */
820 #ifdef LCR_FOR_CALLWEAVER
821 ast = ast_channel_alloc(1);
824 #ifdef LCR_FOR_ASTERISK
825 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
831 CERROR(call, NULL, "Failed to create Asterisk channel - releasing.\n");
832 send_release_and_import(call, CAUSE_RESSOURCEUNAVAIL, LOCATION_PRIVATE_LOCAL);
839 ast->tech_pvt = call;
840 ast->tech = &lcr_tech;
841 ast->fds[0] = call->pipe[0];
843 /* fill setup information */
844 if (param->setup.dialinginfo.id)
845 strncpy(ast->exten, param->setup.dialinginfo.id, AST_MAX_EXTENSION-1);
846 if (param->setup.context[0])
847 strncpy(ast->context, param->setup.context, AST_MAX_CONTEXT-1);
849 strncpy(ast->context, param->setup.callerinfo.interface, AST_MAX_CONTEXT-1);
850 if (param->setup.callerinfo.id[0])
851 ast->cid.cid_num = strdup(param->setup.callerinfo.id);
852 if (param->setup.callerinfo.name[0])
853 ast->cid.cid_name = strdup(param->setup.callerinfo.name);
854 if (param->setup.redirinfo.id[0])
855 ast->cid.cid_name = strdup(numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international));
856 switch (param->setup.callerinfo.present)
858 case INFO_PRESENT_ALLOWED:
859 ast->cid.cid_pres = AST_PRES_ALLOWED;
861 case INFO_PRESENT_RESTRICTED:
862 ast->cid.cid_pres = AST_PRES_RESTRICTED;
865 ast->cid.cid_pres = AST_PRES_UNAVAILABLE;
867 switch (param->setup.callerinfo.ntype)
869 case INFO_NTYPE_SUBSCRIBER:
870 ast->cid.cid_ton = 4;
872 case INFO_NTYPE_NATIONAL:
873 ast->cid.cid_ton = 2;
875 case INFO_NTYPE_INTERNATIONAL:
876 ast->cid.cid_ton = 1;
879 ast->cid.cid_ton = 0;
881 ast->transfercapability = param->setup.capainfo.bearer_capa;
882 /* enable hdlc if transcap is data */
883 if (param->setup.capainfo.source_mode == B_MODE_HDLC)
885 strncpy(call->oad, numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international), sizeof(call->oad)-1);
887 /* configure channel */
888 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
889 ast->readformat = ast->rawreadformat = ast->nativeformats;
890 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
892 ast->hangupcause = 0;
895 call->state = CHAN_LCR_STATE_IN_SETUP;
897 if (!call->pbx_started)
898 lcr_start_pbx(call, ast, param->setup.dialinginfo.sending_complete);
902 * incoming setup acknowledge from LCR
904 static void lcr_in_overlap(struct chan_call *call, int message_type, union parameter *param)
906 if (!call->ast) return;
908 CDEBUG(call, call->ast, "Incomming setup acknowledge from LCR.\n");
910 /* send pending digits in dialque */
911 if (call->dialque[0])
912 send_dialque_to_lcr(call);
913 /* change to overlap state */
914 call->state = CHAN_LCR_STATE_OUT_DIALING;
918 * incoming proceeding from LCR
920 static void lcr_in_proceeding(struct chan_call *call, int message_type, union parameter *param)
922 CDEBUG(call, call->ast, "Incomming proceeding from LCR.\n");
925 call->state = CHAN_LCR_STATE_OUT_PROCEEDING;
926 /* queue event for asterisk */
927 if (call->ast && call->pbx_started)
928 strncat(call->queue_string, "P", sizeof(call->queue_string)-1);
932 * incoming alerting from LCR
934 static void lcr_in_alerting(struct chan_call *call, int message_type, union parameter *param)
936 CDEBUG(call, call->ast, "Incomming alerting from LCR.\n");
939 call->state = CHAN_LCR_STATE_OUT_ALERTING;
940 /* queue event to asterisk */
941 if (call->ast && call->pbx_started)
942 strncat(call->queue_string, "R", sizeof(call->queue_string)-1);
946 * incoming connect from LCR
948 static void lcr_in_connect(struct chan_call *call, int message_type, union parameter *param)
950 union parameter newparam;
952 CDEBUG(call, call->ast, "Incomming connect (answer) from LCR.\n");
955 call->state = CHAN_LCR_STATE_CONNECT;
956 /* request bchannel */
957 if (!call->bchannel) {
958 CDEBUG(call, call->ast, "Requesting B-channel.\n");
959 memset(&newparam, 0, sizeof(union parameter));
960 newparam.bchannel.type = BCHANNEL_REQUEST;
961 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
963 /* copy connectinfo */
964 memcpy(&call->connectinfo, ¶m->connectinfo, sizeof(struct connect_info));
965 /* queue event to asterisk */
966 if (call->ast && call->pbx_started)
967 strncat(call->queue_string, "N", sizeof(call->queue_string)-1);
971 * incoming disconnect from LCR
973 static void lcr_in_disconnect(struct chan_call *call, int message_type, union parameter *param)
975 struct ast_channel *ast = call->ast;
977 CDEBUG(call, call->ast, "Incomming disconnect from LCR. (cause=%d)\n", param->disconnectinfo.cause);
980 call->state = CHAN_LCR_STATE_IN_DISCONNECT;
982 call->cause = param->disconnectinfo.cause;
983 call->location = param->disconnectinfo.location;
984 /* if bridge, forward disconnect and return */
987 if (call->bridge_call)
989 CDEBUG(call, call->ast, "Only signal disconnect via bridge.\n");
990 bridge_message_if_bridged(call, message_type, param);
994 /* release lcr with same cause */
995 send_release_and_import(call, call->cause, call->location);
997 /* change to release state */
998 call->state = CHAN_LCR_STATE_RELEASE;
999 /* queue release asterisk */
1002 ast->hangupcause = call->cause;
1003 if (call->pbx_started)
1004 strcpy(call->queue_string, "H"); // overwrite other indications
1006 ast_hangup(ast); // call will be destroyed here
1012 * incoming release from LCR
1014 static void lcr_in_release(struct chan_call *call, int message_type, union parameter *param)
1016 struct ast_channel *ast = call->ast;
1018 CDEBUG(call, call->ast, "Incomming release from LCR, releasing ref. (cause=%d)\n", param->disconnectinfo.cause);
1022 /* change to release state */
1023 call->state = CHAN_LCR_STATE_RELEASE;
1024 /* copy release info */
1027 call->cause = param->disconnectinfo.cause;
1028 call->location = param->disconnectinfo.location;
1030 /* if we have an asterisk instance, queue hangup, else we are done */
1033 ast->hangupcause = call->cause;
1034 if (call->pbx_started)
1035 strcpy(call->queue_string, "H");
1037 ast_hangup(ast); // call will be destroyed here
1047 * incoming information from LCR
1049 static void lcr_in_information(struct chan_call *call, int message_type, union parameter *param)
1051 struct ast_channel *ast = call->ast;
1053 CDEBUG(call, call->ast, "Incoming information from LCR. (dialing=%s)\n", param->information.id);
1057 /* pbx not started */
1058 if (!call->pbx_started)
1060 CDEBUG(call, call->ast, "Asterisk not started, adding digits to number.\n");
1061 strncat(ast->exten, param->information.id, AST_MAX_EXTENSION-1);
1062 lcr_start_pbx(call, ast, param->information.sending_complete);
1066 /* change dailing state after setup */
1067 if (call->state == CHAN_LCR_STATE_IN_SETUP) {
1068 CDEBUG(call, call->ast, "Changing from SETUP to DIALING state.\n");
1069 call->state = CHAN_LCR_STATE_IN_DIALING;
1070 // ast_setstate(ast, AST_STATE_DIALING);
1074 if (call->state == CHAN_LCR_STATE_IN_DIALING && param->information.id[0])
1075 strncat(call->queue_string, param->information.id, sizeof(call->queue_string)-1);
1077 /* use bridge to forware message not supported by asterisk */
1078 if (call->state == CHAN_LCR_STATE_CONNECT) {
1079 CDEBUG(call, call->ast, "Call is connected, bridging.\n");
1080 bridge_message_if_bridged(call, message_type, param);
1085 * incoming information from LCR
1087 static void lcr_in_notify(struct chan_call *call, int message_type, union parameter *param)
1089 union parameter newparam;
1091 CDEBUG(call, call->ast, "Incomming notify from LCR. (notify=%d)\n", param->notifyinfo.notify);
1093 /* request bchannel, if call is resumed and we don't have it */
1094 if (param->notifyinfo.notify == INFO_NOTIFY_USER_RESUMED && !call->bchannel && call->ref) {
1095 CDEBUG(call, call->ast, "Reqesting bchannel at resume.\n");
1096 memset(&newparam, 0, sizeof(union parameter));
1097 newparam.bchannel.type = BCHANNEL_REQUEST;
1098 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
1101 if (!call->ast) return;
1103 /* use bridge to forware message not supported by asterisk */
1104 bridge_message_if_bridged(call, message_type, param);
1108 * incoming information from LCR
1110 static void lcr_in_facility(struct chan_call *call, int message_type, union parameter *param)
1112 CDEBUG(call, call->ast, "Incomming facility from LCR.\n");
1114 if (!call->ast) return;
1116 /* use bridge to forware message not supported by asterisk */
1117 bridge_message_if_bridged(call, message_type, param);
1121 * got dtmf from bchannel (locked state)
1123 void lcr_in_dtmf(struct chan_call *call, int val)
1125 struct ast_channel *ast = call->ast;
1130 if (!call->pbx_started)
1133 CDEBUG(call, call->ast, "Recognised DTMF digit '%c'.\n", val);
1136 strncat(call->queue_string, digit, sizeof(call->queue_string)-1);
1140 * message received from LCR
1142 int receive_message(int message_type, unsigned int ref, union parameter *param)
1144 struct bchannel *bchannel;
1145 struct chan_call *call;
1146 union parameter newparam;
1148 memset(&newparam, 0, sizeof(union parameter));
1150 /* handle bchannel message*/
1151 if (message_type == MESSAGE_BCHANNEL)
1153 switch(param->bchannel.type)
1155 case BCHANNEL_ASSIGN:
1156 CDEBUG(NULL, NULL, "Received BCHANNEL_ASSIGN message. (handle=%08lx) for ref %d\n", param->bchannel.handle, ref);
1157 if ((bchannel = find_bchannel_handle(param->bchannel.handle)))
1159 CERROR(NULL, NULL, "bchannel handle %x already assigned.\n", (int)param->bchannel.handle);
1162 /* create bchannel */
1163 bchannel = alloc_bchannel(param->bchannel.handle);
1166 CERROR(NULL, NULL, "alloc bchannel handle %x failed.\n", (int)param->bchannel.handle);
1170 /* configure channel */
1171 bchannel->b_tx_gain = param->bchannel.tx_gain;
1172 bchannel->b_rx_gain = param->bchannel.rx_gain;
1173 strncpy(bchannel->b_pipeline, param->bchannel.pipeline, sizeof(bchannel->b_pipeline)-1);
1174 if (param->bchannel.crypt_len && param->bchannel.crypt_len <= sizeof(bchannel->b_bf_key))
1176 bchannel->b_bf_len = param->bchannel.crypt_len;
1177 memcpy(bchannel->b_bf_key, param->bchannel.crypt, param->bchannel.crypt_len);
1179 bchannel->b_txdata = 0;
1180 bchannel->b_dtmf = 1;
1181 bchannel->b_tx_dejitter = 1;
1183 /* in case, ref is not set, this bchannel instance must
1184 * be created until it is removed again by LCR */
1186 call = find_call_ref(ref);
1189 bchannel->call = call;
1190 call->bchannel = bchannel;
1192 bchannel_dtmf(bchannel, 1);
1194 bchannel_blowfish(bchannel, call->bf_key, call->bf_len);
1195 if (call->pipeline[0])
1196 bchannel_pipeline(bchannel, call->pipeline);
1198 bchannel_gain(bchannel, call->rx_gain, 0);
1200 bchannel_gain(bchannel, call->tx_gain, 1);
1201 if (call->bridge_id) {
1202 CDEBUG(call, call->ast, "Join bchannel, because call is already bridged.\n");
1203 bchannel_join(bchannel, call->bridge_id);
1205 /* create only, if call exists, othewhise it bchannel is freed below... */
1206 if (bchannel_create(bchannel, ((call->nodsp || call->faxdetect > 0)?1:0) + ((call->hdlc)?2:0)))
1207 bchannel_activate(bchannel, 1);
1210 newparam.bchannel.type = BCHANNEL_ASSIGN_ACK;
1211 newparam.bchannel.handle = param->bchannel.handle;
1212 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1213 /* if call has released before bchannel is assigned */
1215 newparam.bchannel.type = BCHANNEL_RELEASE;
1216 newparam.bchannel.handle = param->bchannel.handle;
1217 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1222 case BCHANNEL_REMOVE:
1223 CDEBUG(NULL, NULL, "Received BCHANNEL_REMOVE message. (handle=%08lx)\n", param->bchannel.handle);
1224 if (!(bchannel = find_bchannel_handle(param->bchannel.handle)))
1226 CERROR(NULL, NULL, "Bchannel handle %x not assigned.\n", (int)param->bchannel.handle);
1229 /* unklink from call and destroy bchannel */
1230 free_bchannel(bchannel);
1233 newparam.bchannel.type = BCHANNEL_REMOVE_ACK;
1234 newparam.bchannel.handle = param->bchannel.handle;
1235 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1240 CDEBUG(NULL, NULL, "Received unknown bchannel message %d.\n", param->bchannel.type);
1245 /* handle new ref */
1246 if (message_type == MESSAGE_NEWREF)
1248 if (param->direction)
1250 /* new ref from lcr */
1251 CDEBUG(NULL, NULL, "Received new ref by LCR, due to incomming call. (ref=%ld)\n", ref);
1252 if (!ref || find_call_ref(ref))
1254 CERROR(NULL, NULL, "Illegal new ref %ld received.\n", ref);
1257 /* allocate new call instance */
1258 call = alloc_call();
1260 call->state = CHAN_LCR_STATE_IN_PREPARE;
1263 call->ref_was_assigned = 1;
1264 /* wait for setup (or release from asterisk) */
1267 /* new ref, as requested from this remote application */
1268 CDEBUG(NULL, NULL, "Received new ref by LCR, as requested from chan_lcr. (ref=%ld)\n", ref);
1269 call = find_call_ref(0);
1272 /* send release, if ref does not exist */
1273 CDEBUG(NULL, NULL, "No call found, that requests a ref.\n");
1274 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1279 call->ref_was_assigned = 1;
1280 /* send pending setup info */
1281 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
1282 send_setup_to_lcr(call);
1283 /* release if asterisk has signed off */
1284 else if (call->state == CHAN_LCR_STATE_RELEASE)
1288 send_release_and_import(call, call->cause, call->location);
1290 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1302 CERROR(NULL, NULL, "Received message %d without ref.\n", message_type);
1305 call = find_call_ref(ref);
1308 /* ignore ref that is not used (anymore) */
1309 CDEBUG(NULL, NULL, "Message %d from LCR ignored, because no call instance found.\n", message_type);
1313 /* handle messages */
1314 switch(message_type)
1317 lcr_in_setup(call, message_type, param);
1320 case MESSAGE_OVERLAP:
1321 lcr_in_overlap(call, message_type, param);
1324 case MESSAGE_PROCEEDING:
1325 lcr_in_proceeding(call, message_type, param);
1328 case MESSAGE_ALERTING:
1329 lcr_in_alerting(call, message_type, param);
1332 case MESSAGE_CONNECT:
1333 lcr_in_connect(call, message_type, param);
1336 case MESSAGE_DISCONNECT:
1337 lcr_in_disconnect(call, message_type, param);
1340 case MESSAGE_RELEASE:
1341 lcr_in_release(call, message_type, param);
1344 case MESSAGE_INFORMATION:
1345 lcr_in_information(call, message_type, param);
1348 case MESSAGE_NOTIFY:
1349 lcr_in_notify(call, message_type, param);
1352 case MESSAGE_FACILITY:
1353 lcr_in_facility(call, message_type, param);
1356 case MESSAGE_PATTERN: // audio available from LCR
1359 case MESSAGE_NOPATTERN: // audio not available from LCR
1362 case MESSAGE_AUDIOPATH: // if remote audio connected or hold
1363 call->audiopath = param->audiopath;
1367 CDEBUG(call, call->ast, "Message %d from LCR unhandled.\n", message_type);
1374 * release all calls (due to broken socket)
1376 static void release_all_calls(void)
1378 struct chan_call *call;
1383 /* no ast, so we may directly free call */
1385 CDEBUG(call, NULL, "Freeing call, because no Asterisk channel is linked.\n");
1389 /* already in release process */
1390 if (call->state == CHAN_LCR_STATE_RELEASE) {
1394 /* release or queue release */
1396 call->state = CHAN_LCR_STATE_RELEASE;
1397 if (!call->pbx_started) {
1398 CDEBUG(call, call->ast, "Releasing call, because no Asterisk channel is not started.\n");
1399 ast_hangup(call->ast); // call will be destroyed here
1402 CDEBUG(call, call->ast, "Queue call release, because Asterisk channel is running.\n");
1403 strcpy(call->queue_string, "H");
1407 /* release all bchannels */
1408 while(bchannel_first)
1409 free_bchannel(bchannel_first);
1414 * warning! not thread safe
1415 * returns -1 for socket error, 0 for no work, 1 for work
1417 int handle_socket(void)
1421 struct admin_list *admin;
1422 struct admin_message msg;
1424 /* read from socket */
1425 len = read(lcr_sock, &msg, sizeof(msg));
1428 CERROR(NULL, NULL, "Socket closed.\n");
1429 return(-1); // socket closed
1433 if (len != sizeof(msg))
1435 CERROR(NULL, NULL, "Socket short read. (len %d)\n", len);
1436 return(-1); // socket error
1438 if (msg.message != ADMIN_MESSAGE)
1440 CERROR(NULL, NULL, "Socket received illegal message %d.\n", msg.message);
1443 receive_message(msg.u.msg.type, msg.u.msg.ref, &msg.u.msg.param);
1447 if (errno != EWOULDBLOCK)
1449 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1454 /* write to socket */
1457 admin = admin_first;
1458 len = write(lcr_sock, &admin->msg, sizeof(msg));
1461 CERROR(NULL, NULL, "Socket closed.\n");
1462 return(-1); // socket closed
1466 if (len != sizeof(msg))
1468 CERROR(NULL, NULL, "Socket short write. (len %d)\n", len);
1469 return(-1); // socket error
1472 admin_first = admin->next;
1478 if (errno != EWOULDBLOCK)
1480 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1489 * open and close socket and thread
1491 int open_socket(void)
1495 struct sockaddr_un sock_address;
1496 unsigned int on = 1;
1497 union parameter param;
1500 if ((lcr_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
1502 CERROR(NULL, NULL, "Failed to create socket.\n");
1506 /* set socket address and name */
1507 memset(&sock_address, 0, sizeof(sock_address));
1508 sock_address.sun_family = PF_UNIX;
1509 sprintf(sock_address.sun_path, SOCKET_NAME, options.lock);
1511 /* connect socket */
1512 if ((conn = connect(lcr_sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0)
1516 CDEBUG(NULL, NULL, "Failed to connect to socket '%s'. Is LCR running?\n", sock_address.sun_path);
1520 /* set non-blocking io */
1521 if ((ret = ioctl(lcr_sock, FIONBIO, (unsigned char *)(&on))) < 0)
1525 CERROR(NULL, NULL, "Failed to set socket into non-blocking IO.\n");
1529 /* enque hello message */
1530 memset(¶m, 0, sizeof(param));
1531 strcpy(param.hello.application, "asterisk");
1532 send_message(MESSAGE_HELLO, 0, ¶m);
1537 void close_socket(void)
1539 struct admin_list *admin, *temp;
1541 /* flush pending messages */
1542 admin = admin_first;
1545 admin = admin->next;
1557 /* sending queue to asterisk */
1558 static int queue_send(void)
1561 struct chan_call *call;
1562 struct ast_channel *ast;
1563 struct ast_frame fr;
1568 p = call->queue_string;
1571 /* there is something to queue */
1572 if (!ast_channel_trylock(ast)) { /* succeed */
1576 CDEBUG(call, ast, "Sending queued PROCEEDING to Asterisk.\n");
1577 ast_queue_control(ast, AST_CONTROL_PROCEEDING);
1580 CDEBUG(call, ast, "Sending queued RINGING to Asterisk.\n");
1581 ast_queue_control(ast, AST_CONTROL_RINGING);
1582 ast_setstate(ast, AST_STATE_RINGING);
1585 CDEBUG(call, ast, "Sending queued ANSWER to Asterisk.\n");
1586 ast_queue_control(ast, AST_CONTROL_ANSWER);
1589 CDEBUG(call, ast, "Sending queued HANGUP to Asterisk.\n");
1590 ast_queue_hangup(ast);
1592 case '1': case '2': case '3': case 'A':
1593 case '4': case '5': case '6': case 'B':
1594 case '7': case '8': case '9': case 'C':
1595 case '*': case '0': case '#': case 'D':
1596 CDEBUG(call, ast, "Sending queued digit '%c' to Asterisk.\n", *p);
1597 /* send digit to asterisk */
1598 memset(&fr, 0, sizeof(fr));
1600 #ifdef LCR_FOR_ASTERISK
1601 fr.frametype = AST_FRAME_DTMF_BEGIN;
1604 #ifdef LCR_FOR_CALLWEAVER
1605 fr.frametype = AST_FRAME_DTMF;
1609 fr.delivery = ast_tv(0, 0);
1610 ast_queue_frame(ast, &fr);
1612 #ifdef LCR_FOR_ASTERISK
1613 fr.frametype = AST_FRAME_DTMF_END;
1614 ast_queue_frame(ast, &fr);
1619 CDEBUG(call, ast, "Ignoring queued digit 0x%02x.\n", *p);
1623 call->queue_string[0] = '\0';
1624 ast_channel_unlock(ast);
1634 /* signal handler */
1635 void sighandler(int sigset)
1639 /* chan_lcr thread */
1640 static void *chan_thread(void *arg)
1644 union parameter param;
1645 time_t retry = 0, now;
1647 bchannel_pid = getpid();
1649 // signal(SIGPIPE, sighandler);
1651 memset(¶m, 0, sizeof(union parameter));
1655 ast_mutex_lock(&chan_lock);
1662 ret = handle_socket();
1664 CERROR(NULL, NULL, "Handling of socket failed - closing for some seconds.\n");
1666 release_all_calls();
1673 if (retry && now-retry > 5) {
1674 CDEBUG(NULL, NULL, "Retry to open socket.\n");
1676 if (open_socket() < 0) {
1685 ret = bchannel_handle();
1689 /* handle messages to asterisk */
1694 /* delay if no work done */
1696 ast_mutex_unlock(&chan_lock);
1698 #ifdef LCR_FOR_ASTERISK
1702 #ifdef LCR_FOR_CALLWEAVER
1706 ast_mutex_lock(&chan_lock);
1712 CERROR(NULL, NULL, "Thread exit.\n");
1714 ast_mutex_unlock(&chan_lock);
1716 // signal(SIGPIPE, SIG_DFL);
1722 * new asterisk instance
1725 struct ast_channel *lcr_request(const char *type, int format, void *data, int *cause)
1727 char exten[256], *dial, *interface, *opt;
1728 struct ast_channel *ast;
1729 struct chan_call *call;
1731 ast_mutex_lock(&chan_lock);
1732 CDEBUG(NULL, NULL, "Received request from Asterisk. (data=%s)\n", (char *)data);
1734 /* if socket is closed */
1737 CERROR(NULL, NULL, "Rejecting call from Asterisk, because LCR not running.\n");
1738 ast_mutex_unlock(&chan_lock);
1742 /* create call instance */
1743 call = alloc_call();
1746 /* failed to create instance */
1747 ast_mutex_unlock(&chan_lock);
1751 /* create asterisk channel instrance */
1753 #ifdef LCR_FOR_ASTERISK
1754 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
1757 #ifdef LCR_FOR_CALLWEAVER
1758 ast = ast_channel_alloc(1);
1763 CERROR(NULL, NULL, "Failed to create Asterisk channel.\n");
1765 /* failed to create instance */
1766 ast_mutex_unlock(&chan_lock);
1769 ast->tech = &lcr_tech;
1770 ast->tech_pvt = (void *)1L; // set pointer or asterisk will not call
1771 /* configure channel */
1772 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
1773 ast->readformat = ast->rawreadformat = ast->nativeformats;
1774 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
1776 ast->hangupcause = 0;
1780 ast->tech_pvt = call;
1781 ast->fds[0] = call->pipe[0];
1782 call->pbx_started = 0;
1784 call->state = CHAN_LCR_STATE_OUT_PREPARE;
1787 * Extract interface, dialstring, options from data.
1790 * <interface>/<dialstring>
1791 * <interface>/<dialstring>/options
1793 strncpy(exten, (char *)data, sizeof(exten)-1);
1794 exten[sizeof(exten)-1] = '\0';
1795 if ((dial = strchr(exten, '/'))) {
1798 if ((opt = strchr(dial, '/')))
1807 strncpy(call->interface, interface, sizeof(call->interface)-1);
1808 strncpy(call->dialstring, dial, sizeof(call->dialstring)-1);
1809 apply_opt(call, (char *)opt);
1811 ast_mutex_unlock(&chan_lock);
1816 * call from asterisk
1818 static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
1820 union parameter newparam;
1821 struct chan_call *call;
1823 ast_mutex_lock(&chan_lock);
1824 call = ast->tech_pvt;
1826 #ifdef LCR_FOR_CALLWEAVER
1828 snprintf(ast->name, sizeof(ast->name), "LCR/%s-%04x",call->dialstring, ast_random() & 0xffff);
1832 CERROR(NULL, ast, "Received call from Asterisk, but call instance does not exist.\n");
1833 ast_mutex_unlock(&chan_lock);
1837 CDEBUG(NULL, ast, "Received call from Asterisk.\n");
1839 /* pbx process is started */
1840 call->pbx_started = 1;
1841 /* send MESSAGE_NEWREF */
1842 memset(&newparam, 0, sizeof(union parameter));
1843 newparam.direction = 0; /* request from app */
1844 send_message(MESSAGE_NEWREF, 0, &newparam);
1846 /* set hdlc if capability requires hdlc */
1847 if (ast->transfercapability == INFO_BC_DATAUNRESTRICTED
1848 || ast->transfercapability == INFO_BC_DATARESTRICTED
1849 || ast->transfercapability == INFO_BC_VIDEO)
1851 /* if hdlc is forced by option, we change transcap to data */
1853 && ast->transfercapability != INFO_BC_DATAUNRESTRICTED
1854 && ast->transfercapability != INFO_BC_DATARESTRICTED
1855 && ast->transfercapability != INFO_BC_VIDEO)
1856 ast->transfercapability = INFO_BC_DATAUNRESTRICTED;
1858 call->cid_num[0] = 0;
1859 call->cid_name[0] = 0;
1860 call->cid_rdnis[0] = 0;
1862 if (ast->cid.cid_num) if (ast->cid.cid_num[0])
1863 strncpy(call->cid_num, ast->cid.cid_num,
1864 sizeof(call->cid_num)-1);
1866 if (ast->cid.cid_name) if (ast->cid.cid_name[0])
1867 strncpy(call->cid_name, ast->cid.cid_name,
1868 sizeof(call->cid_name)-1);
1869 if (ast->cid.cid_rdnis) if (ast->cid.cid_rdnis[0])
1870 strncpy(call->cid_rdnis, ast->cid.cid_rdnis,
1871 sizeof(call->cid_rdnis)-1);
1873 ast_mutex_unlock(&chan_lock);
1877 static void send_digit_to_chan(struct ast_channel * ast, char digit )
1879 static const char* dtmf_tones[] = {
1880 "!941+1336/100,!0/100", /* 0 */
1881 "!697+1209/100,!0/100", /* 1 */
1882 "!697+1336/100,!0/100", /* 2 */
1883 "!697+1477/100,!0/100", /* 3 */
1884 "!770+1209/100,!0/100", /* 4 */
1885 "!770+1336/100,!0/100", /* 5 */
1886 "!770+1477/100,!0/100", /* 6 */
1887 "!852+1209/100,!0/100", /* 7 */
1888 "!852+1336/100,!0/100", /* 8 */
1889 "!852+1477/100,!0/100", /* 9 */
1890 "!697+1633/100,!0/100", /* A */
1891 "!770+1633/100,!0/100", /* B */
1892 "!852+1633/100,!0/100", /* C */
1893 "!941+1633/100,!0/100", /* D */
1894 "!941+1209/100,!0/100", /* * */
1895 "!941+1477/100,!0/100" }; /* # */
1897 if (digit >= '0' && digit <='9')
1898 ast_playtones_start(ast,0,dtmf_tones[digit-'0'], 0);
1899 else if (digit >= 'A' && digit <= 'D')
1900 ast_playtones_start(ast,0,dtmf_tones[digit-'A'+10], 0);
1901 else if (digit == '*')
1902 ast_playtones_start(ast,0,dtmf_tones[14], 0);
1903 else if (digit == '#')
1904 ast_playtones_start(ast,0,dtmf_tones[15], 0);
1907 ast_log(LOG_DEBUG, "Unable to handle DTMF tone "
1908 "'%c' for '%s'\n", digit, ast->name);
1912 #ifdef LCR_FOR_ASTERISK
1913 static int lcr_digit_begin(struct ast_channel *ast, char digit)
1915 #ifdef LCR_FOR_CALLWEAVER
1916 static int lcr_digit(struct ast_channel *ast, char digit)
1919 struct chan_call *call;
1920 union parameter newparam;
1923 #ifdef LCR_FOR_CALLWEAVER
1924 int inband_dtmf = 0;
1927 /* only pass IA5 number space */
1928 if (digit > 126 || digit < 32)
1931 ast_mutex_lock(&chan_lock);
1932 call = ast->tech_pvt;
1934 CERROR(NULL, ast, "Received digit from Asterisk, but no call instance exists.\n");
1935 ast_mutex_unlock(&chan_lock);
1939 CDEBUG(call, ast, "Received digit '%c' from Asterisk.\n", digit);
1941 /* send information or queue them */
1942 if (call->ref && call->state == CHAN_LCR_STATE_OUT_DIALING)
1944 CDEBUG(call, ast, "Sending digit to LCR, because we are in dialing state.\n");
1945 memset(&newparam, 0, sizeof(union parameter));
1946 newparam.information.id[0] = digit;
1947 newparam.information.id[1] = '\0';
1948 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
1951 && (call->state == CHAN_LCR_STATE_OUT_PREPARE || call->state == CHAN_LCR_STATE_OUT_SETUP))
1953 CDEBUG(call, ast, "Queue digits, because we are in setup/dialing state and have no ref yet.\n");
1955 strncat(call->dialque, buf, strlen(call->dialque)-1);
1958 ast_mutex_unlock(&chan_lock);
1960 #ifdef LCR_FOR_ASTERISK
1964 static int lcr_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
1966 int inband_dtmf = 0;
1967 struct chan_call *call;
1970 ast_mutex_lock(&chan_lock);
1972 call = ast->tech_pvt;
1976 "Received digit from Asterisk, "
1977 "but no call instance exists.\n");
1978 ast_mutex_unlock(&chan_lock);
1982 CDEBUG(call, ast, "DIGIT END '%c' from Asterisk.\n", digit);
1984 if (call->state == CHAN_LCR_STATE_CONNECT && call->inband_dtmf) {
1988 ast_mutex_unlock(&chan_lock);
1991 CDEBUG(call, ast, "-> sending '%c' inband.\n", digit);
1992 send_digit_to_chan(ast, digit);
1998 static int lcr_answer(struct ast_channel *ast)
2000 union parameter newparam;
2001 struct chan_call *call;
2003 ast_mutex_lock(&chan_lock);
2004 call = ast->tech_pvt;
2006 CERROR(NULL, ast, "Received answer from Asterisk, but no call instance exists.\n");
2007 ast_mutex_unlock(&chan_lock);
2011 CDEBUG(call, ast, "Received answer from Asterisk (maybe during lcr_bridge).\n");
2013 /* copy connectinfo, if bridged */
2014 if (call->bridge_call)
2015 memcpy(&call->connectinfo, &call->bridge_call->connectinfo, sizeof(struct connect_info));
2016 /* send connect message to lcr */
2017 if (call->state != CHAN_LCR_STATE_CONNECT) {
2018 memset(&newparam, 0, sizeof(union parameter));
2019 memcpy(&newparam.connectinfo, &call->connectinfo, sizeof(struct connect_info));
2020 send_message(MESSAGE_CONNECT, call->ref, &newparam);
2021 call->state = CHAN_LCR_STATE_CONNECT;
2024 /* request bchannel */
2025 if (!call->bchannel) {
2026 CDEBUG(call, ast, "Requesting B-channel.\n");
2027 memset(&newparam, 0, sizeof(union parameter));
2028 newparam.bchannel.type = BCHANNEL_REQUEST;
2029 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
2032 // memset(&newparam, 0, sizeof(union parameter));
2033 // send_message(MESSAGE_ENABLEKEYPAD, call->ref, &newparam);
2036 CDEBUG(call, ast, "DTMF is disabled by option.\n");
2040 ast_mutex_unlock(&chan_lock);
2044 static int lcr_hangup(struct ast_channel *ast)
2046 struct chan_call *call;
2047 pthread_t tid = pthread_self();
2049 if (!pthread_equal(tid, chan_tid))
2050 ast_mutex_lock(&chan_lock);
2051 call = ast->tech_pvt;
2053 CERROR(NULL, ast, "Received hangup from Asterisk, but no call instance exists.\n");
2054 if (!pthread_equal(tid, chan_tid))
2055 ast_mutex_unlock(&chan_lock);
2059 if (!pthread_equal(tid, chan_tid))
2060 CDEBUG(call, ast, "Received hangup from Asterisk thread.\n");
2062 CDEBUG(call, ast, "Received hangup from LCR thread.\n");
2064 /* disconnect asterisk, maybe not required */
2065 ast->tech_pvt = NULL;
2070 CDEBUG(call, ast, "Releasing ref and freeing call instance.\n");
2071 if (ast->hangupcause > 0)
2072 send_release_and_import(call, ast->hangupcause, LOCATION_PRIVATE_LOCAL);
2074 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
2077 if (!pthread_equal(tid, chan_tid))
2078 ast_mutex_unlock(&chan_lock);
2082 /* ref is not set, due to prepare setup or release */
2083 if (call->state == CHAN_LCR_STATE_RELEASE)
2085 /* we get the response to our release */
2086 CDEBUG(call, ast, "Freeing call instance, because we have no ref AND we are requesting no ref.\n");
2090 /* during prepare, we change to release state */
2091 CDEBUG(call, ast, "We must wait until we received our ref, until we can free call instance.\n");
2092 call->state = CHAN_LCR_STATE_RELEASE;
2096 if (!pthread_equal(tid, chan_tid))
2097 ast_mutex_unlock(&chan_lock);
2101 static int lcr_write(struct ast_channel *ast, struct ast_frame *f)
2103 struct chan_call *call;
2106 CDEBUG(NULL, ast, "No subclass\n");
2107 if (!(f->subclass & ast->nativeformats))
2108 CDEBUG(NULL, ast, "Unexpected format.\n");
2110 ast_mutex_lock(&chan_lock);
2111 call = ast->tech_pvt;
2113 ast_mutex_unlock(&chan_lock);
2116 if (call->bchannel && f->samples)
2117 bchannel_transmit(call->bchannel, *((unsigned char **)&(f->data)), f->samples);
2118 ast_mutex_unlock(&chan_lock);
2123 static struct ast_frame *lcr_read(struct ast_channel *ast)
2125 struct chan_call *call;
2128 ast_mutex_lock(&chan_lock);
2129 call = ast->tech_pvt;
2131 ast_mutex_unlock(&chan_lock);
2134 if (call->pipe[0] > -1) {
2135 if (call->rebuffer && !call->hdlc) {
2136 /* Make sure we have a complete 20ms (160byte) frame */
2137 len=read(call->pipe[0],call->read_buff + call->framepos, 160 - call->framepos);
2139 call->framepos += len;
2142 len = read(call->pipe[0], call->read_buff, sizeof(call->read_buff));
2144 if (len < 0 && errno == EAGAIN) {
2145 ast_mutex_unlock(&chan_lock);
2147 #ifdef LCR_FOR_ASTERISK
2148 return &ast_null_frame;
2151 #ifdef LCR_FOR_CALLWEAVER
2157 close(call->pipe[0]);
2159 ast_mutex_unlock(&chan_lock);
2161 } else if (call->rebuffer && call->framepos < 160) {
2162 /* Not a complete frame, so we send a null-frame */
2163 ast_mutex_unlock(&chan_lock);
2164 return &ast_null_frame;
2168 call->read_fr.frametype = AST_FRAME_VOICE;
2169 call->read_fr.subclass = ast->nativeformats;
2170 if (call->rebuffer) {
2171 call->read_fr.datalen = call->framepos;
2172 call->read_fr.samples = call->framepos;
2175 call->read_fr.datalen = len;
2176 call->read_fr.samples = len;
2178 call->read_fr.delivery = ast_tv(0,0);
2179 *((unsigned char **)&(call->read_fr.data)) = call->read_buff;
2180 ast_mutex_unlock(&chan_lock);
2182 return &call->read_fr;
2185 static int lcr_indicate(struct ast_channel *ast, int cond, const void *data, size_t datalen)
2187 union parameter newparam;
2189 struct chan_call *call;
2191 ast_mutex_lock(&chan_lock);
2192 call = ast->tech_pvt;
2194 CERROR(NULL, ast, "Received indicate from Asterisk, but no call instance exists.\n");
2195 ast_mutex_unlock(&chan_lock);
2200 case AST_CONTROL_BUSY:
2201 CDEBUG(call, ast, "Received indicate AST_CONTROL_BUSY from Asterisk.\n");
2202 ast_setstate(ast, AST_STATE_BUSY);
2203 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2204 /* send message to lcr */
2205 memset(&newparam, 0, sizeof(union parameter));
2206 newparam.disconnectinfo.cause = 17;
2207 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2208 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2210 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2213 case AST_CONTROL_CONGESTION:
2214 CDEBUG(call, ast, "Received indicate AST_CONTROL_CONGESTION from Asterisk. (cause %d)\n", ast->hangupcause);
2215 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2216 /* send message to lcr */
2217 memset(&newparam, 0, sizeof(union parameter));
2218 newparam.disconnectinfo.cause = ast->hangupcause;
2219 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2220 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2222 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2225 case AST_CONTROL_PROCEEDING:
2226 CDEBUG(call, ast, "Received indicate AST_CONTROL_PROCEEDING from Asterisk.\n");
2227 if (call->state == CHAN_LCR_STATE_IN_SETUP
2228 || call->state == CHAN_LCR_STATE_IN_DIALING) {
2229 /* send message to lcr */
2230 memset(&newparam, 0, sizeof(union parameter));
2231 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
2233 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
2236 case AST_CONTROL_RINGING:
2237 CDEBUG(call, ast, "Received indicate AST_CONTROL_RINGING from Asterisk.\n");
2238 ast_setstate(ast, AST_STATE_RINGING);
2239 if (call->state == CHAN_LCR_STATE_IN_SETUP
2240 || call->state == CHAN_LCR_STATE_IN_DIALING
2241 || call->state == CHAN_LCR_STATE_IN_PROCEEDING) {
2242 /* send message to lcr */
2243 memset(&newparam, 0, sizeof(union parameter));
2244 send_message(MESSAGE_ALERTING, call->ref, &newparam);
2246 call->state = CHAN_LCR_STATE_IN_ALERTING;
2250 CDEBUG(call, ast, "Received indicate -1.\n");
2254 case AST_CONTROL_VIDUPDATE:
2255 CDEBUG(call, ast, "Received indicate AST_CONTROL_VIDUPDATE.\n");
2258 case AST_CONTROL_HOLD:
2259 CDEBUG(call, ast, "Received indicate AST_CONTROL_HOLD from Asterisk.\n");
2260 /* send message to lcr */
2261 memset(&newparam, 0, sizeof(union parameter));
2262 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_HOLD;
2263 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2265 /*start music onhold*/
2266 #ifdef LCR_FOR_ASTERISK
2267 ast_moh_start(ast,data,ast->musicclass);
2270 #ifdef LCR_FOR_CALLWEAVER
2271 ast_moh_start(ast, NULL);
2276 case AST_CONTROL_UNHOLD:
2277 CDEBUG(call, ast, "Received indicate AST_CONTROL_UNHOLD from Asterisk.\n");
2278 /* send message to lcr */
2279 memset(&newparam, 0, sizeof(union parameter));
2280 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
2281 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2287 #ifdef AST_CONTROL_SRCUPDATE
2288 case AST_CONTROL_SRCUPDATE:
2289 CDEBUG(call, ast, "Received AST_CONTROL_SRCUPDATE from Asterisk.\n");
2293 CERROR(call, ast, "Received indicate from Asterisk with unknown condition %d.\n", cond);
2299 ast_mutex_unlock(&chan_lock);
2306 static int lcr_fixup(struct ast_channel *oldast, struct ast_channel *ast)
2308 struct chan_call *call;
2314 ast_mutex_lock(&chan_lock);
2315 call = ast->tech_pvt;
2317 CERROR(NULL, ast, "Received fixup from Asterisk, but no call instance exists.\n");
2318 ast_mutex_unlock(&chan_lock);
2322 CDEBUG(call, ast, "Received fixup from Asterisk.\n");
2324 ast_mutex_unlock(&chan_lock);
2329 * send_text asterisk
2331 static int lcr_send_text(struct ast_channel *ast, const char *text)
2333 struct chan_call *call;
2334 union parameter newparam;
2336 ast_mutex_lock(&chan_lock);
2337 call = ast->tech_pvt;
2339 CERROR(NULL, ast, "Received send_text from Asterisk, but no call instance exists.\n");
2340 ast_mutex_unlock(&chan_lock);
2344 CDEBUG(call, ast, "Received send_text from Asterisk. (text=%s)\n", text);
2345 memset(&newparam, 0, sizeof(union parameter));
2346 strncpy(newparam.notifyinfo.display, text, sizeof(newparam.notifyinfo.display)-1);
2347 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2348 ast_mutex_lock(&chan_lock);
2355 enum ast_bridge_result lcr_bridge(struct ast_channel *ast1,
2356 struct ast_channel *ast2, int flags,
2357 struct ast_frame **fo,
2358 struct ast_channel **rc, int timeoutms)
2361 struct chan_call *call1, *call2;
2362 struct ast_channel *carr[2], *who;
2364 struct ast_frame *f;
2367 CDEBUG(NULL, NULL, "Received bridging request from Asterisk.\n");
2372 /* join via dsp (if the channels are currently open) */
2373 ast_mutex_lock(&chan_lock);
2374 call1 = ast1->tech_pvt;
2375 call2 = ast2->tech_pvt;
2376 if (!call1 || !call2) {
2377 CDEBUG(NULL, NULL, "Bridge, but we don't have two call instances, exitting.\n");
2378 ast_mutex_unlock(&chan_lock);
2379 return AST_BRIDGE_COMPLETE;
2382 /* join, if both call instances uses dsp
2383 ignore the case of fax detection here it may be benificial for ISDN fax machines or pass through.
2385 if (!call1->nodsp && !call2->nodsp) {
2386 CDEBUG(NULL, NULL, "Both calls use DSP, bridging via DSP.\n");
2388 /* get bridge id and join */
2389 bridge_id = new_bridge_id();
2391 call1->bridge_id = bridge_id;
2392 if (call1->bchannel)
2393 bchannel_join(call1->bchannel, bridge_id);
2395 call2->bridge_id = bridge_id;
2396 if (call2->bchannel)
2397 bchannel_join(call2->bchannel, bridge_id);
2399 if (call1->nodsp && call2->nodsp)
2400 CDEBUG(NULL, NULL, "Both calls use no DSP, bridging in channel driver.\n");
2402 CDEBUG(NULL, NULL, "One call uses no DSP, bridging in channel driver.\n");
2403 call1->bridge_call = call2;
2404 call2->bridge_call = call1;
2406 if (call1->state == CHAN_LCR_STATE_IN_SETUP
2407 || call1->state == CHAN_LCR_STATE_IN_DIALING
2408 || call1->state == CHAN_LCR_STATE_IN_PROCEEDING
2409 || call1->state == CHAN_LCR_STATE_IN_ALERTING) {
2410 CDEBUG(call1, ast1, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
2413 if (call2->state == CHAN_LCR_STATE_IN_SETUP
2414 || call2->state == CHAN_LCR_STATE_IN_DIALING
2415 || call2->state == CHAN_LCR_STATE_IN_PROCEEDING
2416 || call2->state == CHAN_LCR_STATE_IN_ALERTING) {
2417 CDEBUG(call2, ast2, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
2421 /* sometimes SIP phones forget to send RETRIEVE before TRANSFER
2422 so let's do it for them. Hmpf.
2425 if (call1->on_hold) {
2426 union parameter newparam;
2428 memset(&newparam, 0, sizeof(union parameter));
2429 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
2430 send_message(MESSAGE_NOTIFY, call1->ref, &newparam);
2435 if (call2->on_hold) {
2436 union parameter newparam;
2438 memset(&newparam, 0, sizeof(union parameter));
2439 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
2440 send_message(MESSAGE_NOTIFY, call2->ref, &newparam);
2445 ast_mutex_unlock(&chan_lock);
2449 who = ast_waitfor_n(carr, 2, &to);
2452 CDEBUG(NULL, NULL, "Empty read on bridge, breaking out.\n");
2457 if (!f || f->frametype == AST_FRAME_CONTROL) {
2459 CDEBUG(NULL, NULL, "Got hangup.\n");
2461 CDEBUG(NULL, NULL, "Got CONTROL.\n");
2468 if ( f->frametype == AST_FRAME_DTMF ) {
2469 CDEBUG(NULL, NULL, "Got DTMF.\n");
2485 CDEBUG(NULL, NULL, "Releasing bridge.\n");
2487 /* split channels */
2488 ast_mutex_lock(&chan_lock);
2489 call1 = ast1->tech_pvt;
2490 call2 = ast2->tech_pvt;
2491 if (call1 && call1->bridge_id)
2493 call1->bridge_id = 0;
2494 if (call1->bchannel)
2495 bchannel_join(call1->bchannel, 0);
2496 if (call1->bridge_call)
2497 call1->bridge_call->bridge_call = NULL;
2499 if (call2 && call1->bridge_id)
2501 call2->bridge_id = 0;
2502 if (call2->bchannel)
2503 bchannel_join(call2->bchannel, 0);
2504 if (call2->bridge_call)
2505 call2->bridge_call->bridge_call = NULL;
2507 call1->bridge_call = NULL;
2508 call2->bridge_call = NULL;
2510 ast_mutex_unlock(&chan_lock);
2511 return AST_BRIDGE_COMPLETE;
2513 static struct ast_channel_tech lcr_tech = {
2515 .description = "Channel driver for connecting to Linux-Call-Router",
2516 .capabilities = AST_FORMAT_ALAW,
2517 .requester = lcr_request,
2519 #ifdef LCR_FOR_ASTERISK
2520 .send_digit_begin = lcr_digit_begin,
2521 .send_digit_end = lcr_digit_end,
2524 #ifdef LCR_FOR_CALLWEAVER
2525 .send_digit = lcr_digit,
2529 .bridge = lcr_bridge,
2530 .hangup = lcr_hangup,
2531 .answer = lcr_answer,
2534 .indicate = lcr_indicate,
2536 .send_text = lcr_send_text,
2545 static int lcr_show_lcr (int fd, int argc, char *argv[])
2550 static int lcr_show_calls (int fd, int argc, char *argv[])
2555 static int lcr_reload_routing (int fd, int argc, char *argv[])
2560 static int lcr_reload_interfaces (int fd, int argc, char *argv[])
2565 static int lcr_port_block (int fd, int argc, char *argv[])
2570 static int lcr_port_unblock (int fd, int argc, char *argv[])
2575 static int lcr_port_unload (int fd, int argc, char *argv[])
2580 static struct ast_cli_entry cli_show_lcr =
2581 { {"lcr", "show", "lcr", NULL},
2583 "Shows current states of LCR core",
2584 "Usage: lcr show lcr\n",
2587 static struct ast_cli_entry cli_show_calls =
2588 { {"lcr", "show", "calls", NULL},
2590 "Shows current calls made by LCR and Asterisk",
2591 "Usage: lcr show calls\n",
2594 static struct ast_cli_entry cli_reload_routing =
2595 { {"lcr", "reload", "routing", NULL},
2597 "Reloads routing conf of LCR, current uncomplete calls will be disconnected",
2598 "Usage: lcr reload routing\n",
2601 static struct ast_cli_entry cli_reload_interfaces =
2602 { {"lcr", "reload", "interfaces", NULL},
2603 lcr_reload_interfaces,
2604 "Reloads interfaces conf of LCR",
2605 "Usage: lcr reload interfaces\n",
2608 static struct ast_cli_entry cli_port_block =
2609 { {"lcr", "port", "block", NULL},
2611 "Blocks LCR port for further calls",
2612 "Usage: lcr port block \"<port>\"\n",
2615 static struct ast_cli_entry cli_port_unblock =
2616 { {"lcr", "port", "unblock", NULL},
2618 "Unblocks or loads LCR port, port is opened my mISDN",
2619 "Usage: lcr port unblock \"<port>\"\n",
2622 static struct ast_cli_entry cli_port_unload =
2623 { {"lcr", "port", "unload", NULL},
2625 "Unloads LCR port, port is closes by mISDN",
2626 "Usage: lcr port unload \"<port>\"\n",
2631 #ifdef LCR_FOR_ASTERISK
2632 static int lcr_config_exec(struct ast_channel *ast, void *data)
2635 #ifdef LCR_FOR_CALLWEAVER
2636 static int lcr_config_exec(struct ast_channel *ast, void *data, char **argv)
2639 struct chan_call *call;
2641 ast_mutex_lock(&chan_lock);
2643 #ifdef LCR_FOR_ASTERISK
2644 CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", (char *)data);
2647 #ifdef LCR_FOR_CALLWEAVER
2648 CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", argv[0]);
2654 if (call->ast == ast)
2660 #ifdef LCR_FOR_ASTERISK
2661 apply_opt(call, (char *)data);
2664 #ifdef LCR_FOR_CALLWEAVER
2665 apply_opt(call, (char *)argv[0]);
2669 CERROR(NULL, ast, "lcr_config app not called by chan_lcr channel.\n");
2671 ast_mutex_unlock(&chan_lock);
2676 * module loading and destruction
2678 int load_module(void)
2682 for (i = 0; i < 256; i++) {
2683 flip_bits[i] = (i>>7) | ((i>>5)&2) | ((i>>3)&4) | ((i>>1)&8)
2684 | (i<<7) | ((i&2)<<5) | ((i&4)<<3) | ((i&8)<<1);
2687 if (read_options() == 0) {
2688 CERROR(NULL, NULL, "%s", options_error);
2690 #ifdef LCR_FOR_ASTERISK
2691 return AST_MODULE_LOAD_DECLINE;
2694 #ifdef LCR_FOR_CALLWEAVER
2700 ast_mutex_init(&chan_lock);
2701 ast_mutex_init(&log_lock);
2703 if (open_socket() < 0) {
2704 /* continue with closed socket */
2707 if (bchannel_initialize()) {
2708 CERROR(NULL, NULL, "Unable to open mISDN device\n");
2711 #ifdef LCR_FOR_ASTERISK
2712 return AST_MODULE_LOAD_DECLINE;
2715 #ifdef LCR_FOR_CALLWEAVER
2721 lcr_tech.capabilities = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
2722 if (ast_channel_register(&lcr_tech)) {
2723 CERROR(NULL, NULL, "Unable to register channel class\n");
2724 bchannel_deinitialize();
2727 #ifdef LCR_FOR_ASTERISK
2728 return AST_MODULE_LOAD_DECLINE;
2731 #ifdef LCR_FOR_CALLWEAVER
2736 ast_register_application("lcr_config", lcr_config_exec, "lcr_config",
2738 #ifdef LCR_FOR_ASTERISK
2739 "lcr_config(<opt><optarg>:<opt>:...)\n"
2742 #ifdef LCR_FOR_CALLWEAVER
2743 "lcr_config(<opt><optarg>:<opt>:...)\n",
2746 "Sets LCR opts. and optargs\n"
2748 "The available options are:\n"
2749 " d - Send display text on called phone, text is the optarg.\n"
2750 " n - Don't detect dtmf tones on called channel.\n"
2751 " h - Force data call (HDLC).\n"
2752 " t - Disable mISDN_dsp features (required for fax application).\n"
2753 " f - Adding fax detection. It it timeouts, mISDN_dsp is used.\n"
2754 " Use time to detect for optarg.\n"
2755 " c - Make crypted outgoing call, optarg is keyindex.\n"
2756 " e - Perform echo cancelation on this channel.\n"
2757 " Takes mISDN pipeline option as optarg.\n"
2758 " s - Send Non Inband DTMF as inband.\n"
2759 " r - re-buffer packets (160 bytes). Required for some SIP-phones and fax applications.\n"
2760 " vr - rxgain control\n"
2761 " vt - txgain control\n"
2762 " Volume changes at factor 2 ^ optarg.\n"
2767 ast_cli_register(&cli_show_lcr);
2768 ast_cli_register(&cli_show_calls);
2769 ast_cli_register(&cli_reload_routing);
2770 ast_cli_register(&cli_reload_interfaces);
2771 ast_cli_register(&cli_port_block);
2772 ast_cli_register(&cli_port_unblock);
2773 ast_cli_register(&cli_port_unload);
2777 if ((pthread_create(&chan_tid, NULL, chan_thread, NULL)<0))
2779 /* failed to create thread */
2780 bchannel_deinitialize();
2782 ast_channel_unregister(&lcr_tech);
2784 #ifdef LCR_FOR_ASTERISK
2785 return AST_MODULE_LOAD_DECLINE;
2788 #ifdef LCR_FOR_CALLWEAVER
2796 int unload_module(void)
2798 /* First, take us out of the channel loop */
2799 CDEBUG(NULL, NULL, "-- Unregistering mISDN Channel Driver --\n");
2802 pthread_join(chan_tid, NULL);
2804 ast_channel_unregister(&lcr_tech);
2806 ast_unregister_application("lcr_config");
2809 if (mISDN_created) {
2810 bchannel_deinitialize();
2814 if (lcr_sock >= 0) {
2822 int reload_module(void)
2828 #ifdef LCR_FOR_ASTERISK
2829 #define AST_MODULE "chan_lcr"
2832 #ifdef LCR_FOR_CALLWEAVER
2836 ast_mutex_lock(&usecnt_lock);
2838 ast_mutex_unlock(&usecnt_lock);
2843 #ifdef LCR_FOR_ASTERISK
2844 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Channel driver for Linux-Call-Router Support (ISDN BRI/PRI)",
2845 .load = load_module,
2846 .unload = unload_module,
2847 .reload = reload_module,
2851 #ifdef LCR_FOR_CALLWEAVER
2852 char *description(void)