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 A new chan_call instance is created. The call reference (ref) is given by
25 MESSAGE_NEWREF. The state is CHAN_LCR_STATE_IN_PREPARE.
26 After receiving MESSAGE_SETUP from LCR, the ast_channel instance is created
27 using ast_channel_alloc(1). The setup information is given to asterisk.
28 The new Asterisk instance pointer (ast) is stored to chan_call structure.
29 The state changes to CHAN_LCR_STATE_IN_SETUP.
32 Call is initiated by Asterisk:
34 If a call is requested from Asterisk, a new chan_call instance is created.
35 The new Asterisk instance pointer (ast) is stored to chan_call structure.
36 The current call ref is set to 0, the state is CHAN_LCR_STATE_OUT_PREPARE.
37 If the call is received (lcr_call) A MESSASGE_NEWREF is sent to LCR requesting
38 a new call reference (ref).
39 Further dialing information is queued.
40 After the new callref is received by special MESSAGE_NEWREF reply, new ref
41 is stored in the chan_call structure.
42 The setup information is sent to LCR using MESSAGE_SETUP.
43 The state changes to CHAN_LCR_STATE_OUT_SETUP.
48 During call process, messages are received and sent.
49 The state changes accordingly.
50 Any message is allowed to be sent to LCR at any time except MESSAGE_RELEASE.
51 If a MESSAGE_OVERLAP is received, further dialing is required.
52 Queued dialing information, if any, is sent to LCR using MESSAGE_DIALING.
53 In this case, the state changes to CHAN_LCR_STATE_OUT_DIALING.
56 Call is released by LCR:
58 A MESSAGE_RELEASE is received with the call reference (ref) to be released.
59 The current ref is set to 0, to indicate released reference.
60 The state changes to CHAN_LCR_STATE_RELEASE.
61 ast_queue_hangup() is called, if asterisk instance (ast) exists, if not,
62 the chan_call instance is destroyed.
63 After lcr_hangup() is called-back by Asterisk, the chan_call instance
64 is destroyed, because the current ref is set to 0 and the state equals
65 CHAN_LCR_STATE_RELEASE.
66 If the ref is 0 and the state is not CHAN_LCR_STATE_RELEASE, see the proceedure
67 "Call is released by Asterisk".
70 Call is released by Asterisk:
72 lcr_hangup() is called-back by Asterisk. If the call reference (ref) is set,
73 a MESSAGE_RELEASE is sent to LCR and the chan_call instance is destroyed.
74 If the ref is 0 and the state is not CHAN_LCR_STATE_RELEASE, the new state is
75 set to CHAN_LCR_STATE_RELEASE.
76 Later, if the MESSAGE_NEWREF reply is received, a MESSAGE_RELEASE is sent to
77 LCR and the chan_call instance is destroyed.
78 If the ref is 0 and the state is CHAN_LCR_STATE_RELEASE, see the proceedure
79 "Call is released by LCR".
84 The deadlocking problem:
86 - chan_lcr locks chan_lock and waits inside ast_queue_xxxx() for ast_channel
88 - ast_channel thread locks ast_channel and calls a tech function and waits
89 there for chan_lock to be unlocked.
93 Never call ast_queue_xxxx() if ast_channel is not locked and don't wait until
94 ast_channel can be locked. All messages to asterisk are queued inside call
95 instance and will be handled using a try-lock to get ast_channel lock.
96 If it succeeds to lock ast_channel, the ast_queue_xxxx can safely called even
97 if the lock is incremented and decremented there.
99 Exception: Calling ast_queue_frame inside ast->tech->read is safe, because
100 it is called from ast_channel process which has already locked ast_channel.
109 #include <sys/types.h>
111 //#include <signal.h>
114 #include <sys/ioctl.h>
115 #include <sys/socket.h>
118 #include <semaphore.h>
120 #include <asterisk/module.h>
121 #include <asterisk/channel.h>
122 #include <asterisk/config.h>
123 #include <asterisk/logger.h>
124 #include <asterisk/pbx.h>
125 #include <asterisk/options.h>
126 #include <asterisk/io.h>
127 #include <asterisk/frame.h>
128 #include <asterisk/translate.h>
129 #include <asterisk/cli.h>
130 #include <asterisk/musiconhold.h>
131 #include <asterisk/dsp.h>
132 #include <asterisk/translate.h>
133 #include <asterisk/file.h>
134 #include <asterisk/callerid.h>
135 #include <asterisk/indications.h>
136 #include <asterisk/app.h>
137 #include <asterisk/features.h>
138 #include <asterisk/sched.h>
140 #include "extension.h"
142 #include "callerid.h"
143 #include "lcrsocket.h"
145 #include "bchannel.h"
147 #include "chan_lcr.h"
149 CHAN_LCR_STATE // state description structure
150 MESSAGES // message text
152 unsigned char flip_bits[256];
157 char lcr_type[]="lcr";
160 ast_mutex_t chan_lock; /* global lock */
161 ast_mutex_t log_lock; /* logging log */
164 int glob_channel = 0;
169 struct admin_list *next;
170 struct admin_message msg;
171 } *admin_first = NULL;
173 static struct ast_channel_tech lcr_tech;
178 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, ...)
181 char call_text[128] = "NULL";
182 char ast_text[128] = "NULL";
185 ast_mutex_lock(&log_lock);
188 vsnprintf(buffer,sizeof(buffer)-1,fmt,args);
189 buffer[sizeof(buffer)-1]=0;
193 sprintf(call_text, "%d", call->ref);
195 strncpy(ast_text, ast->name, sizeof(ast_text)-1);
196 ast_text[sizeof(ast_text)-1] = '\0';
198 ast_log(type, file, line, function, "[call=%s ast=%s] %s", call_text, ast_text, buffer);
200 ast_mutex_unlock(&log_lock);
204 * channel and call instances
206 struct chan_call *call_first;
208 struct chan_call *find_call_ref(unsigned int ref)
210 struct chan_call *call = call_first;
214 if (call->ref == ref)
222 struct chan_call *find_call_ast(struct ast_channel *ast)
224 struct chan_call *call = call_first;
228 if (call->ast == ast)
235 struct chan_call *find_call_handle(unsigned int handle)
237 struct chan_call *call = call_first;
241 if (call->bchannel_handle == handle)
249 void free_call(struct chan_call *call)
251 struct chan_call **temp = &call_first;
257 *temp = (*temp)->next;
258 if (call->pipe[0] > -1)
259 close(call->pipe[0]);
260 if (call->pipe[1] > -1)
261 close(call->pipe[1]);
264 if (call->bchannel->call != call)
265 CERROR(call, NULL, "Linked bchannel structure has no link to us.\n");
266 call->bchannel->call = NULL;
268 if (call->bridge_call)
270 if (call->bridge_call->bridge_call != call)
271 CERROR(call, NULL, "Linked call structure has no link to us.\n");
272 call->bridge_call->bridge_call = NULL;
274 CDEBUG(call, NULL, "Call instance freed.\n");
278 temp = &((*temp)->next);
280 CERROR(call, NULL, "Call instance not found in list.\n");
283 struct chan_call *alloc_call(void)
285 struct chan_call **callp = &call_first;
288 callp = &((*callp)->next);
290 *callp = (struct chan_call *)calloc(1, sizeof(struct chan_call));
292 memset(*callp, 0, sizeof(struct chan_call));
293 if (pipe((*callp)->pipe) < 0) {
294 CERROR(*callp, NULL, "Failed to create pipe.\n");
298 CDEBUG(*callp, NULL, "Call instance allocated.\n");
303 unsigned short new_bridge_id(void)
305 struct chan_call *call;
306 unsigned short id = 1;
308 /* search for lowest bridge id that is not in use and not 0 */
314 if (call->bridge_id == id)
322 CDEBUG(NULL, NULL, "New bridge ID %d.\n", id);
327 * enque message to LCR
329 int send_message(int message_type, unsigned int ref, union parameter *param)
331 struct admin_list *admin, **adminp;
334 CDEBUG(NULL, NULL, "Ignoring message %d, because socket is closed.\n", message_type);
337 CDEBUG(NULL, NULL, "Sending %s to socket.\n", messages_txt[message_type]);
339 adminp = &admin_first;
341 adminp = &((*adminp)->next);
342 admin = (struct admin_list *)calloc(1, sizeof(struct admin_list));
344 CERROR(NULL, NULL, "No memory for message to LCR.\n");
349 admin->msg.message = ADMIN_MESSAGE;
350 admin->msg.u.msg.type = message_type;
351 admin->msg.u.msg.ref = ref;
352 memcpy(&admin->msg.u.msg.param, param, sizeof(union parameter));
358 * apply options (in locked state)
360 void apply_opt(struct chan_call *call, char *data)
362 union parameter newparam;
363 char string[1024], *p = string, *opt, *key;
364 int gain, i, newmode = 0;
369 strncpy(string, data, sizeof(string)-1);
370 string[sizeof(string)-1] = '\0';
373 while((opt = strsep(&p, ":")))
377 if (opt[1] == '\0') {
378 CERROR(call, call->ast, "Option 'd' (display) expects parameter.\n", opt);
381 CDEBUG(call, call->ast, "Option 'd' (display) with text '%s'.\n", opt+1);
382 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
383 strncpy(call->display, opt+1, sizeof(call->display)-1);
385 memset(&newparam, 0, sizeof(union parameter));
386 strncpy(newparam.notifyinfo.display, opt+1, sizeof(newparam.notifyinfo.display)-1);
387 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
391 if (opt[1] != '\0') {
392 CERROR(call, call->ast, "Option 'n' (no DTMF) expects no parameter.\n", opt);
395 CDEBUG(call, call->ast, "Option 'n' (no DTMF).\n");
399 if (opt[1] == '\0') {
400 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter.\n", opt);
404 /* check for 0xXXXX... type of key */
405 if (!!strncmp((char *)key, "0x", 2)) {
406 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter starting with '0x'.\n", opt);
410 if (strlen(key) > 56*2 || (strlen(key) % 1)) {
411 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter with max 56 bytes ('0x' + 112 characters)\n", opt);
417 if (*key>='0' && *key<='9')
418 call->bf_key[i] = (*key-'0') << 8;
419 else if (*key>='a' && *key<='f')
420 call->bf_key[i] = (*key-'a'+10) << 8;
421 else if (*key>='A' && *key<='F')
422 call->bf_key[i] = (*key-'A'+10) << 8;
426 if (*key>='0' && *key<='9')
427 call->bf_key[i] += (*key - '0');
428 else if (*key>='a' && *key<='f')
429 call->bf_key[i] += (*key - 'a' + 10);
430 else if (*key>='A' && *key<='F')
431 call->bf_key[i] += (*key - 'A' + 10);
438 CERROR(call, call->ast, "Option 'c' (encrypt) expects key parameter with hex values 0-9,a-f.\n");
442 CDEBUG(call, call->ast, "Option 'c' (encrypt) blowfish key '%s' (len=%d).\n", opt+1, i);
444 bchannel_blowfish(call->bchannel, call->bf_key, call->bf_len);
447 if (opt[1] != '\0') {
448 CERROR(call, call->ast, "Option 'h' (HDLC) expects no parameter.\n", opt);
451 CDEBUG(call, call->ast, "Option 'h' (HDLC).\n");
458 if (opt[1] != '\0') {
459 CERROR(call, call->ast, "Option 't' (no_dsp) expects no parameter.\n", opt);
462 CDEBUG(call, call->ast, "Option 't' (no dsp).\n");
469 if (opt[1] == '\0') {
470 CERROR(call, call->ast, "Option 'e' (echo cancel) expects parameter.\n", opt);
473 CDEBUG(call, call->ast, "Option 'e' (echo cancel) with config '%s'.\n", opt+1);
474 strncpy(call->pipeline, opt+1, sizeof(call->pipeline)-1);
476 bchannel_pipeline(call->bchannel, call->pipeline);
479 if (opt[1] == '\0') {
480 CERROR(call, call->ast, "Option 'r' (re-buffer 160 bytes) expects no parameter.\n", opt);
483 CDEBUG(call, call->ast, "Option 'r' (re-buffer 160 bytes)");
488 if (opt[1] != '\0') {
489 CERROR(call, call->ast, "Option 's' (inband DTMF) expects no parameter.\n", opt);
492 CDEBUG(call, call->ast, "Option 's' (inband DTMF).\n");
493 call->inband_dtmf = 1;
498 if (opt[1] != 'r' && opt[1] != 't') {
499 CERROR(call, call->ast, "Option 'v' (volume) expects parameter.\n", opt);
503 if (gain < -8 || gain >8) {
504 CERROR(call, call->ast, "Option 'v' (volume) expects parameter in range of -8 through 8.\n");
507 CDEBUG(call, call->ast, "Option 'v' (volume) with gain 2^%d.\n", gain);
509 call->rx_gain = gain;
511 bchannel_gain(call->bchannel, call->rx_gain, 0);
513 call->tx_gain = gain;
515 bchannel_gain(call->bchannel, call->tx_gain, 1);
519 CERROR(call, call->ast, "Option '%s' unknown.\n", opt);
523 /* re-open, if bchannel is created */
524 if (call->bchannel && call->bchannel->b_sock > -1) {
525 bchannel_destroy(call->bchannel);
526 if (bchannel_create(call->bchannel, ((call->nodsp)?1:0) + ((call->hdlc)?2:0)))
527 bchannel_activate(call->bchannel, 1);
532 * send setup info to LCR
533 * this function is called, when asterisk call is received and ref is received
535 static void send_setup_to_lcr(struct chan_call *call)
537 union parameter newparam;
538 struct ast_channel *ast = call->ast;
540 if (!call->ast || !call->ref)
543 CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->cid_num);
545 /* send setup message to LCR */
546 memset(&newparam, 0, sizeof(union parameter));
547 newparam.setup.dialinginfo.itype = INFO_ITYPE_ISDN;
548 newparam.setup.dialinginfo.ntype = INFO_NTYPE_UNKNOWN;
549 strncpy(newparam.setup.dialinginfo.id, call->dialstring, sizeof(newparam.setup.dialinginfo.id)-1);
550 strncpy(newparam.setup.dialinginfo.interfaces, call->interface, sizeof(newparam.setup.dialinginfo.interfaces)-1);
551 newparam.setup.callerinfo.itype = INFO_ITYPE_CHAN;
552 newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
553 strncpy(newparam.setup.callerinfo.display, call->display, sizeof(newparam.setup.callerinfo.display)-1);
554 call->display[0] = '\0';
555 if (call->cid_num[0])
556 strncpy(newparam.setup.callerinfo.id, call->cid_num, sizeof(newparam.setup.callerinfo.id)-1);
557 if (call->cid_name[0])
558 strncpy(newparam.setup.callerinfo.name, call->cid_name, sizeof(newparam.setup.callerinfo.name)-1);
559 if (call->cid_rdnis[0])
561 strncpy(newparam.setup.redirinfo.id, call->cid_rdnis, sizeof(newparam.setup.redirinfo.id)-1);
562 newparam.setup.redirinfo.itype = INFO_ITYPE_CHAN;
563 newparam.setup.redirinfo.ntype = INFO_NTYPE_UNKNOWN;
565 switch(ast->cid.cid_pres & AST_PRES_RESTRICTION)
567 case AST_PRES_ALLOWED:
568 newparam.setup.callerinfo.present = INFO_PRESENT_ALLOWED;
570 case AST_PRES_RESTRICTED:
571 newparam.setup.callerinfo.present = INFO_PRESENT_RESTRICTED;
573 case AST_PRES_UNAVAILABLE:
574 newparam.setup.callerinfo.present = INFO_PRESENT_NOTAVAIL;
577 newparam.setup.callerinfo.present = INFO_PRESENT_NULL;
579 switch(ast->cid.cid_ton)
582 newparam.setup.callerinfo.ntype = INFO_NTYPE_SUBSCRIBER;
585 newparam.setup.callerinfo.ntype = INFO_NTYPE_NATIONAL;
588 newparam.setup.callerinfo.ntype = INFO_NTYPE_INTERNATIONAL;
591 newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
593 newparam.setup.capainfo.bearer_capa = ast->transfercapability;
594 newparam.setup.capainfo.bearer_mode = INFO_BMODE_CIRCUIT;
596 newparam.setup.capainfo.source_mode = B_MODE_HDLC;
598 newparam.setup.capainfo.source_mode = B_MODE_TRANSPARENT;
599 newparam.setup.capainfo.bearer_info1 = (options.law=='a')?3:2;
601 newparam.setup.capainfo.hlc = INFO_HLC_NONE;
602 newparam.setup.capainfo.exthlc = INFO_HLC_NONE;
603 send_message(MESSAGE_SETUP, call->ref, &newparam);
605 /* change to outgoing setup state */
606 call->state = CHAN_LCR_STATE_OUT_SETUP;
610 * send dialing info to LCR
611 * this function is called, when setup acknowledge is received and dialing
614 static void send_dialque_to_lcr(struct chan_call *call)
616 union parameter newparam;
618 if (!call->ast || !call->ref || !call->dialque[0])
621 CDEBUG(call, call->ast, "Sending dial queue to LCR. (dialing=%s)\n", call->dialque);
623 /* send setup message to LCR */
624 memset(&newparam, 0, sizeof(union parameter));
625 strncpy(newparam.information.id, call->dialque, sizeof(newparam.information.id)-1);
626 call->dialque[0] = '\0';
627 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
631 * in case of a bridge, the unsupported message can be forwarded directly
632 * to the remote call.
634 static void bridge_message_if_bridged(struct chan_call *call, int message_type, union parameter *param)
638 if (!call->bridge_call) return;
639 CDEBUG(call, NULL, "Sending message due briding.\n");
640 send_message(message_type, call->bridge_call->ref, param);
644 * send release message to LCR and import bchannel if exported
646 static void send_release_and_import(struct chan_call *call, int cause, int location)
648 union parameter newparam;
650 /* importing channel */
651 if (call->bchannel) {
652 memset(&newparam, 0, sizeof(union parameter));
653 newparam.bchannel.type = BCHANNEL_RELEASE;
654 newparam.bchannel.handle = call->bchannel->handle;
655 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
657 /* sending release */
658 memset(&newparam, 0, sizeof(union parameter));
659 newparam.disconnectinfo.cause = cause;
660 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
661 send_message(MESSAGE_RELEASE, call->ref, &newparam);
665 * check if extension matches and start asterisk
666 * if it can match, proceed
669 static void lcr_start_pbx(struct chan_call *call, struct ast_channel *ast, int complete)
672 union parameter newparam;
674 CDEBUG(call, ast, "Try to start pbx. (exten=%s context=%s complete=%s)\n", ast->exten, ast->context, complete?"yes":"no");
679 if (!ast_canmatch_extension(ast, ast->context, ast->exten, 1, call->oad))
681 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' will not match at context '%s' - releasing.\n", ast->exten, ast->context);
685 if (!ast_exists_extension(ast, ast->context, ast->exten, 1, call->oad))
687 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' would match at context '%s', if more digits would be dialed - releasing.\n", ast->exten, ast->context);
691 CDEBUG(call, ast, "Got 'sending complete', extensions matches.\n");
692 /* send setup acknowledge to lcr */
693 memset(&newparam, 0, sizeof(union parameter));
694 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
697 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
702 if (ast_canmatch_extension(ast, ast->context, ast->exten, 1, call->oad))
704 /* send setup acknowledge to lcr */
705 if (call->state != CHAN_LCR_STATE_IN_DIALING) {
706 memset(&newparam, 0, sizeof(union parameter));
707 send_message(MESSAGE_OVERLAP, call->ref, &newparam);
711 call->state = CHAN_LCR_STATE_IN_DIALING;
713 /* if match, start pbx */
714 if (ast_exists_extension(ast, ast->context, ast->exten, 1, call->oad)) {
715 CDEBUG(call, ast, "Extensions matches.\n");
720 CDEBUG(call, ast, "Extensions may match, if more digits are dialed.\n");
728 CDEBUG(call, ast, "Releasing due to extension missmatch.\n");
729 send_release_and_import(call, cause, LOCATION_PRIVATE_LOCAL);
731 /* release asterisk */
732 ast->hangupcause = call->cause;
733 /* change to release state */
734 call->state = CHAN_LCR_STATE_RELEASE;
735 ast_hangup(ast); // call will be destroyed here
739 /* send setup to asterisk */
740 CDEBUG(call, ast, "Starting call to Asterisk due to matching extension.\n");
741 ret = ast_pbx_start(ast);
744 cause = (ret==-2)?34:27;
747 call->pbx_started = 1;
748 // if (call->state == CHAN_LCR_STATE_IN_DIALING)
749 ast_setstate(ast, AST_STATE_RINGING);
751 // ast_setstate(ast, AST_STATE_RINGING);
756 * incoming setup from LCR
758 static void lcr_in_setup(struct chan_call *call, int message_type, union parameter *param)
760 struct ast_channel *ast;
762 CDEBUG(call, NULL, "Incomming setup from LCR. (callerid %s, dialing %s)\n", param->setup.callerinfo.id, param->setup.dialinginfo.id);
764 /* create asterisk channel instrance */
765 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
769 CERROR(call, NULL, "Failed to create Asterisk channel - releasing.\n");
770 send_release_and_import(call, CAUSE_RESSOURCEUNAVAIL, LOCATION_PRIVATE_LOCAL);
777 ast->tech_pvt = call;
778 ast->tech = &lcr_tech;
779 ast->fds[0] = call->pipe[0];
781 /* fill setup information */
782 if (param->setup.dialinginfo.id)
783 strncpy(ast->exten, param->setup.dialinginfo.id, AST_MAX_EXTENSION-1);
784 if (param->setup.context[0])
785 strncpy(ast->context, param->setup.context, AST_MAX_CONTEXT-1);
787 strncpy(ast->context, param->setup.callerinfo.interface, AST_MAX_CONTEXT-1);
788 if (param->setup.callerinfo.id[0])
789 ast->cid.cid_num = strdup(param->setup.callerinfo.id);
790 if (param->setup.callerinfo.name[0])
791 ast->cid.cid_name = strdup(param->setup.callerinfo.name);
792 if (param->setup.redirinfo.id[0])
793 ast->cid.cid_name = strdup(numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international));
794 switch (param->setup.callerinfo.present)
796 case INFO_PRESENT_ALLOWED:
797 ast->cid.cid_pres = AST_PRES_ALLOWED;
799 case INFO_PRESENT_RESTRICTED:
800 ast->cid.cid_pres = AST_PRES_RESTRICTED;
803 ast->cid.cid_pres = AST_PRES_UNAVAILABLE;
805 switch (param->setup.callerinfo.ntype)
807 case INFO_NTYPE_SUBSCRIBER:
808 ast->cid.cid_ton = 4;
810 case INFO_NTYPE_NATIONAL:
811 ast->cid.cid_ton = 2;
813 case INFO_NTYPE_INTERNATIONAL:
814 ast->cid.cid_ton = 1;
817 ast->cid.cid_ton = 0;
819 ast->transfercapability = param->setup.capainfo.bearer_capa;
820 /* enable hdlc if transcap is data */
821 if (param->setup.capainfo.source_mode == B_MODE_HDLC)
823 strncpy(call->oad, numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international), sizeof(call->oad)-1);
825 /* configure channel */
826 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
827 ast->readformat = ast->rawreadformat = ast->nativeformats;
828 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
830 ast->hangupcause = 0;
833 call->state = CHAN_LCR_STATE_IN_SETUP;
835 if (!call->pbx_started)
836 lcr_start_pbx(call, ast, param->setup.dialinginfo.sending_complete);
840 * incoming setup acknowledge from LCR
842 static void lcr_in_overlap(struct chan_call *call, int message_type, union parameter *param)
844 if (!call->ast) return;
846 CDEBUG(call, call->ast, "Incomming setup acknowledge from LCR.\n");
848 /* send pending digits in dialque */
849 if (call->dialque[0])
850 send_dialque_to_lcr(call);
851 /* change to overlap state */
852 call->state = CHAN_LCR_STATE_OUT_DIALING;
856 * incoming proceeding from LCR
858 static void lcr_in_proceeding(struct chan_call *call, int message_type, union parameter *param)
860 CDEBUG(call, call->ast, "Incomming proceeding from LCR.\n");
863 call->state = CHAN_LCR_STATE_OUT_PROCEEDING;
864 /* queue event for asterisk */
865 if (call->ast && call->pbx_started)
866 strncat(call->queue_string, "P", sizeof(call->queue_string)-1);
870 * incoming alerting from LCR
872 static void lcr_in_alerting(struct chan_call *call, int message_type, union parameter *param)
874 CDEBUG(call, call->ast, "Incomming alerting from LCR.\n");
877 call->state = CHAN_LCR_STATE_OUT_ALERTING;
878 /* queue event to asterisk */
879 if (call->ast && call->pbx_started)
880 strncat(call->queue_string, "R", sizeof(call->queue_string)-1);
884 * incoming connect from LCR
886 static void lcr_in_connect(struct chan_call *call, int message_type, union parameter *param)
888 union parameter newparam;
890 CDEBUG(call, call->ast, "Incomming connect (answer) from LCR.\n");
893 call->state = CHAN_LCR_STATE_CONNECT;
894 /* request bchannel */
895 if (!call->bchannel) {
896 CDEBUG(call, call->ast, "Requesting B-channel.\n");
897 memset(&newparam, 0, sizeof(union parameter));
898 newparam.bchannel.type = BCHANNEL_REQUEST;
899 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
901 /* copy connectinfo */
902 memcpy(&call->connectinfo, ¶m->connectinfo, sizeof(struct connect_info));
903 /* queue event to asterisk */
904 if (call->ast && call->pbx_started)
905 strncat(call->queue_string, "A", sizeof(call->queue_string)-1);
909 * incoming disconnect from LCR
911 static void lcr_in_disconnect(struct chan_call *call, int message_type, union parameter *param)
913 struct ast_channel *ast = call->ast;
915 CDEBUG(call, call->ast, "Incomming disconnect from LCR. (cause=%d)\n", param->disconnectinfo.cause);
918 call->state = CHAN_LCR_STATE_IN_DISCONNECT;
920 call->cause = param->disconnectinfo.cause;
921 call->location = param->disconnectinfo.location;
922 /* if bridge, forward disconnect and return */
925 if (call->bridge_call)
927 CDEBUG(call, call->ast, "Only signal disconnect via bridge.\n");
928 bridge_message_if_bridged(call, message_type, param);
932 /* release lcr with same cause */
933 send_release_and_import(call, call->cause, call->location);
935 /* change to release state */
936 call->state = CHAN_LCR_STATE_RELEASE;
937 /* queue release asterisk */
940 ast->hangupcause = call->cause;
941 if (call->pbx_started)
942 strcpy(call->queue_string, "H"); // overwrite other indications
944 ast_hangup(ast); // call will be destroyed here
950 * incoming setup acknowledge from LCR
952 static void lcr_in_release(struct chan_call *call, int message_type, union parameter *param)
954 struct ast_channel *ast = call->ast;
956 CDEBUG(call, call->ast, "Incomming release from LCR, releasing ref. (cause=%d)\n", param->disconnectinfo.cause);
960 /* change to release state */
961 call->state = CHAN_LCR_STATE_RELEASE;
962 /* copy release info */
965 call->cause = param->disconnectinfo.cause;
966 call->location = param->disconnectinfo.location;
968 /* if we have an asterisk instance, queue hangup, else we are done */
971 ast->hangupcause = call->cause;
972 if (call->pbx_started)
973 strcpy(call->queue_string, "H");
975 ast_hangup(ast); // call will be destroyed here
985 * incoming information from LCR
987 static void lcr_in_information(struct chan_call *call, int message_type, union parameter *param)
989 struct ast_channel *ast = call->ast;
991 CDEBUG(call, call->ast, "Incoming information from LCR. (dialing=%s)\n", param->information.id);
995 /* pbx not started */
996 if (!call->pbx_started)
998 CDEBUG(call, call->ast, "Asterisk not started, adding digits to number.\n");
999 strncat(ast->exten, param->information.id, AST_MAX_EXTENSION-1);
1000 lcr_start_pbx(call, ast, param->information.sending_complete);
1004 /* change dailing state after setup */
1005 if (call->state == CHAN_LCR_STATE_IN_SETUP) {
1006 CDEBUG(call, call->ast, "Changing from SETUP to DIALING state.\n");
1007 call->state = CHAN_LCR_STATE_IN_DIALING;
1008 // ast_setstate(ast, AST_STATE_DIALING);
1012 if (call->state == CHAN_LCR_STATE_IN_DIALING && param->information.id[0])
1013 strncat(call->queue_string, param->information.id, sizeof(call->queue_string)-1);
1015 /* use bridge to forware message not supported by asterisk */
1016 if (call->state == CHAN_LCR_STATE_CONNECT) {
1017 CDEBUG(call, call->ast, "Call is connected, briding.\n");
1018 bridge_message_if_bridged(call, message_type, param);
1023 * incoming information from LCR
1025 static void lcr_in_notify(struct chan_call *call, int message_type, union parameter *param)
1027 union parameter newparam;
1029 CDEBUG(call, call->ast, "Incomming notify from LCR. (notify=%d)\n", param->notifyinfo.notify);
1031 /* request bchannel, if call is resumed and we don't have it */
1032 if (param->notifyinfo.notify == INFO_NOTIFY_USER_RESUMED && !call->bchannel && call->ref) {
1033 CDEBUG(call, call->ast, "Reqesting bchannel at resume.\n");
1034 memset(&newparam, 0, sizeof(union parameter));
1035 newparam.bchannel.type = BCHANNEL_REQUEST;
1036 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
1039 if (!call->ast) return;
1041 /* use bridge to forware message not supported by asterisk */
1042 bridge_message_if_bridged(call, message_type, param);
1046 * incoming information from LCR
1048 static void lcr_in_facility(struct chan_call *call, int message_type, union parameter *param)
1050 CDEBUG(call, call->ast, "Incomming facility from LCR.\n");
1052 if (!call->ast) return;
1054 /* use bridge to forware message not supported by asterisk */
1055 bridge_message_if_bridged(call, message_type, param);
1059 * got dtmf from bchannel (locked state)
1061 void lcr_in_dtmf(struct chan_call *call, int val)
1063 struct ast_channel *ast = call->ast;
1068 if (!call->pbx_started)
1071 CDEBUG(call, call->ast, "Recognised DTMF digit '%c'.\n", val);
1074 strncat(call->queue_string, digit, sizeof(call->queue_string)-1);
1078 * message received from LCR
1080 int receive_message(int message_type, unsigned int ref, union parameter *param)
1082 struct bchannel *bchannel;
1083 struct chan_call *call;
1084 union parameter newparam;
1086 memset(&newparam, 0, sizeof(union parameter));
1088 /* handle bchannel message*/
1089 if (message_type == MESSAGE_BCHANNEL)
1091 switch(param->bchannel.type)
1093 case BCHANNEL_ASSIGN:
1094 CDEBUG(NULL, NULL, "Received BCHANNEL_ASSIGN message. (handle=%08lx) for ref %d\n", param->bchannel.handle, ref);
1095 if ((bchannel = find_bchannel_handle(param->bchannel.handle)))
1097 CERROR(NULL, NULL, "bchannel handle %x already assigned.\n", (int)param->bchannel.handle);
1100 /* create bchannel */
1101 bchannel = alloc_bchannel(param->bchannel.handle);
1104 CERROR(NULL, NULL, "alloc bchannel handle %x failed.\n", (int)param->bchannel.handle);
1108 /* configure channel */
1109 bchannel->b_tx_gain = param->bchannel.tx_gain;
1110 bchannel->b_rx_gain = param->bchannel.rx_gain;
1111 strncpy(bchannel->b_pipeline, param->bchannel.pipeline, sizeof(bchannel->b_pipeline)-1);
1112 if (param->bchannel.crypt_len && param->bchannel.crypt_len <= sizeof(bchannel->b_bf_key))
1114 bchannel->b_bf_len = param->bchannel.crypt_len;
1115 memcpy(bchannel->b_bf_key, param->bchannel.crypt, param->bchannel.crypt_len);
1117 bchannel->b_txdata = 0;
1118 bchannel->b_dtmf = 1;
1119 bchannel->b_tx_dejitter = 1;
1121 /* in case, ref is not set, this bchannel instance must
1122 * be created until it is removed again by LCR */
1124 call = find_call_ref(ref);
1127 bchannel->call = call;
1128 call->bchannel = bchannel;
1130 bchannel_dtmf(bchannel, 1);
1132 bchannel_blowfish(bchannel, call->bf_key, call->bf_len);
1133 if (call->pipeline[0])
1134 bchannel_pipeline(bchannel, call->pipeline);
1136 bchannel_gain(bchannel, call->rx_gain, 0);
1138 bchannel_gain(bchannel, call->tx_gain, 1);
1139 if (call->bridge_id) {
1140 CDEBUG(call, call->ast, "Join bchannel, because call is already bridged.\n");
1141 bchannel_join(bchannel, call->bridge_id);
1143 /* create only, if call exists, othewhise it bchannel is freed below... */
1144 if (bchannel_create(bchannel, ((call->nodsp)?1:0) + ((call->hdlc)?2:0)))
1145 bchannel_activate(bchannel, 1);
1148 newparam.bchannel.type = BCHANNEL_ASSIGN_ACK;
1149 newparam.bchannel.handle = param->bchannel.handle;
1150 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1151 /* if call has released before bchannel is assigned */
1153 newparam.bchannel.type = BCHANNEL_RELEASE;
1154 newparam.bchannel.handle = param->bchannel.handle;
1155 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1160 case BCHANNEL_REMOVE:
1161 CDEBUG(NULL, NULL, "Received BCHANNEL_REMOVE message. (handle=%08lx)\n", param->bchannel.handle);
1162 if (!(bchannel = find_bchannel_handle(param->bchannel.handle)))
1164 CERROR(NULL, NULL, "Bchannel handle %x not assigned.\n", (int)param->bchannel.handle);
1167 /* unklink from call and destroy bchannel */
1168 free_bchannel(bchannel);
1171 newparam.bchannel.type = BCHANNEL_REMOVE_ACK;
1172 newparam.bchannel.handle = param->bchannel.handle;
1173 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1178 CDEBUG(NULL, NULL, "Received unknown bchannel message %d.\n", param->bchannel.type);
1183 /* handle new ref */
1184 if (message_type == MESSAGE_NEWREF)
1186 if (param->direction)
1188 /* new ref from lcr */
1189 CDEBUG(NULL, NULL, "Received new ref by LCR, due to incomming call. (ref=%ld)\n", ref);
1190 if (!ref || find_call_ref(ref))
1192 CERROR(NULL, NULL, "Illegal new ref %ld received.\n", ref);
1195 /* allocate new call instance */
1196 call = alloc_call();
1198 call->state = CHAN_LCR_STATE_IN_PREPARE;
1201 /* wait for setup (or release from asterisk) */
1204 /* new ref, as requested from this remote application */
1205 CDEBUG(NULL, NULL, "Received new ref by LCR, as requested from chan_lcr. (ref=%ld)\n", ref);
1206 call = find_call_ref(0);
1209 /* send release, if ref does not exist */
1210 CDEBUG(NULL, NULL, "No call found, that requests a ref.\n");
1211 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1216 /* send pending setup info */
1217 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
1218 send_setup_to_lcr(call);
1219 /* release if asterisk has signed off */
1220 else if (call->state == CHAN_LCR_STATE_RELEASE)
1224 send_release_and_import(call, call->cause, call->location);
1226 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1238 CERROR(NULL, NULL, "Received message %d without ref.\n", message_type);
1241 call = find_call_ref(ref);
1244 /* ignore ref that is not used (anymore) */
1245 CDEBUG(NULL, NULL, "Message %d from LCR ignored, because no call instance found.\n", message_type);
1249 /* handle messages */
1250 switch(message_type)
1253 lcr_in_setup(call, message_type, param);
1256 case MESSAGE_OVERLAP:
1257 lcr_in_overlap(call, message_type, param);
1260 case MESSAGE_PROCEEDING:
1261 lcr_in_proceeding(call, message_type, param);
1264 case MESSAGE_ALERTING:
1265 lcr_in_alerting(call, message_type, param);
1268 case MESSAGE_CONNECT:
1269 lcr_in_connect(call, message_type, param);
1272 case MESSAGE_DISCONNECT:
1273 lcr_in_disconnect(call, message_type, param);
1276 case MESSAGE_RELEASE:
1277 lcr_in_release(call, message_type, param);
1280 case MESSAGE_INFORMATION:
1281 lcr_in_information(call, message_type, param);
1284 case MESSAGE_NOTIFY:
1285 lcr_in_notify(call, message_type, param);
1288 case MESSAGE_FACILITY:
1289 lcr_in_facility(call, message_type, param);
1292 case MESSAGE_PATTERN: // audio available from LCR
1295 case MESSAGE_NOPATTERN: // audio not available from LCR
1298 case MESSAGE_AUDIOPATH: // if remote audio connected or hold
1299 call->audiopath = param->audiopath;
1303 CDEBUG(call, call->ast, "Message %d from LCR unhandled.\n", message_type);
1310 * release all calls (due to broken socket)
1312 static void release_all_calls(void)
1314 struct chan_call *call;
1319 /* no ast, so we may directly free call */
1321 CDEBUG(call, NULL, "Freeing call, because no Asterisk channel is linked.\n");
1325 /* already in release process */
1326 if (call->state == CHAN_LCR_STATE_RELEASE) {
1330 /* release or queue release */
1332 call->state = CHAN_LCR_STATE_RELEASE;
1333 if (!call->pbx_started) {
1334 CDEBUG(call, call->ast, "Releasing call, because no Asterisk channel is not started.\n");
1335 ast_hangup(call->ast); // call will be destroyed here
1338 CDEBUG(call, call->ast, "Queue call release, because Asterisk channel is running.\n");
1339 strcpy(call->queue_string, "H");
1343 /* release all bchannels */
1344 while(bchannel_first)
1345 free_bchannel(bchannel_first);
1350 * warning! not thread safe
1351 * returns -1 for socket error, 0 for no work, 1 for work
1353 int handle_socket(void)
1357 struct admin_list *admin;
1358 struct admin_message msg;
1360 /* read from socket */
1361 len = read(lcr_sock, &msg, sizeof(msg));
1364 CERROR(NULL, NULL, "Socket closed.\n");
1365 return(-1); // socket closed
1369 if (len != sizeof(msg))
1371 CERROR(NULL, NULL, "Socket short read. (len %d)\n", len);
1372 return(-1); // socket error
1374 if (msg.message != ADMIN_MESSAGE)
1376 CERROR(NULL, NULL, "Socket received illegal message %d.\n", msg.message);
1379 receive_message(msg.u.msg.type, msg.u.msg.ref, &msg.u.msg.param);
1383 if (errno != EWOULDBLOCK)
1385 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1390 /* write to socket */
1393 admin = admin_first;
1394 len = write(lcr_sock, &admin->msg, sizeof(msg));
1397 CERROR(NULL, NULL, "Socket closed.\n");
1398 return(-1); // socket closed
1402 if (len != sizeof(msg))
1404 CERROR(NULL, NULL, "Socket short write. (len %d)\n", len);
1405 return(-1); // socket error
1408 admin_first = admin->next;
1414 if (errno != EWOULDBLOCK)
1416 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1425 * open and close socket and thread
1427 int open_socket(void)
1430 char *socket_name = SOCKET_NAME;
1432 struct sockaddr_un sock_address;
1433 unsigned int on = 1;
1434 union parameter param;
1437 if ((lcr_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
1439 CERROR(NULL, NULL, "Failed to create socket.\n");
1443 /* set socket address and name */
1444 memset(&sock_address, 0, sizeof(sock_address));
1445 sock_address.sun_family = PF_UNIX;
1446 strcpy(sock_address.sun_path, socket_name);
1448 /* connect socket */
1449 if ((conn = connect(lcr_sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0)
1453 CDEBUG(NULL, NULL, "Failed to connect to socket '%s'. Is LCR running?\n", sock_address.sun_path);
1457 /* set non-blocking io */
1458 if ((ret = ioctl(lcr_sock, FIONBIO, (unsigned char *)(&on))) < 0)
1462 CERROR(NULL, NULL, "Failed to set socket into non-blocking IO.\n");
1466 /* enque hello message */
1467 memset(¶m, 0, sizeof(param));
1468 strcpy(param.hello.application, "asterisk");
1469 send_message(MESSAGE_HELLO, 0, ¶m);
1474 void close_socket(void)
1476 struct admin_list *admin, *temp;
1478 /* flush pending messages */
1479 admin = admin_first;
1482 admin = admin->next;
1494 /* sending queue to asterisk */
1495 static int queue_send(void)
1498 struct chan_call *call;
1499 struct ast_channel *ast;
1500 struct ast_frame fr;
1505 p = call->queue_string;
1508 /* there is something to queue */
1509 if (!ast_channel_trylock(ast)) { /* succeed */
1513 CDEBUG(call, ast, "Sending queued PROCEEDING to Asterisk.\n");
1514 ast_queue_control(ast, AST_CONTROL_PROCEEDING);
1517 CDEBUG(call, ast, "Sending queued RINGING to Asterisk.\n");
1518 ast_queue_control(ast, AST_CONTROL_RINGING);
1521 CDEBUG(call, ast, "Sending queued ANSWER to Asterisk.\n");
1522 ast_queue_control(ast, AST_CONTROL_ANSWER);
1525 CDEBUG(call, ast, "Sending queued HANGUP to Asterisk.\n");
1526 ast_queue_hangup(ast);
1528 case '1': case '2': case '3': case 'a':
1529 case '4': case '5': case '6': case 'b':
1530 case '7': case '8': case '9': case 'c':
1531 case '*': case '0': case '#': case 'd':
1532 CDEBUG(call, ast, "Sending queued digit '%c' to Asterisk.\n", *p);
1533 /* send digit to asterisk */
1534 memset(&fr, 0, sizeof(fr));
1535 fr.frametype = AST_FRAME_DTMF_BEGIN;
1537 fr.delivery = ast_tv(0, 0);
1538 ast_queue_frame(ast, &fr);
1539 fr.frametype = AST_FRAME_DTMF_END;
1540 ast_queue_frame(ast, &fr);
1543 CDEBUG(call, ast, "Ignoring queued digit 0x%02d.\n", *p);
1547 call->queue_string[0] = '\0';
1548 ast_channel_unlock(ast);
1558 /* signal handler */
1559 void sighandler(int sigset)
1563 /* chan_lcr thread */
1564 static void *chan_thread(void *arg)
1568 union parameter param;
1569 time_t retry = 0, now;
1571 bchannel_pid = getpid();
1573 // signal(SIGPIPE, sighandler);
1575 memset(¶m, 0, sizeof(union parameter));
1579 ast_mutex_lock(&chan_lock);
1586 ret = handle_socket();
1588 CERROR(NULL, NULL, "Handling of socket failed - closing for some seconds.\n");
1590 release_all_calls();
1597 if (retry && now-retry > 5) {
1598 CDEBUG(NULL, NULL, "Retry to open socket.\n");
1600 if (open_socket() < 0) {
1609 ret = bchannel_handle();
1613 /* handle messages to asterisk */
1618 /* delay if no work done */
1620 ast_mutex_unlock(&chan_lock);
1622 ast_mutex_lock(&chan_lock);
1628 CERROR(NULL, NULL, "Thread exit.\n");
1630 ast_mutex_unlock(&chan_lock);
1632 // signal(SIGPIPE, SIG_DFL);
1638 * new asterisk instance
1641 struct ast_channel *lcr_request(const char *type, int format, void *data, int *cause)
1643 char exten[256], *dial, *interface, *opt;
1644 struct ast_channel *ast;
1645 struct chan_call *call;
1647 ast_mutex_lock(&chan_lock);
1648 CDEBUG(NULL, NULL, "Received request from Asterisk. (data=%s)\n", (char *)data);
1650 /* if socket is closed */
1653 CERROR(NULL, NULL, "Rejecting call from Asterisk, because LCR not running.\n");
1654 ast_mutex_unlock(&chan_lock);
1658 /* create call instance */
1659 call = alloc_call();
1662 /* failed to create instance */
1663 ast_mutex_unlock(&chan_lock);
1667 /* create asterisk channel instrance */
1668 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
1671 CERROR(NULL, NULL, "Failed to create Asterisk channel.\n");
1673 /* failed to create instance */
1674 ast_mutex_unlock(&chan_lock);
1677 ast->tech = &lcr_tech;
1678 ast->tech_pvt = (void *)1L; // set pointer or asterisk will not call
1679 /* configure channel */
1680 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
1681 ast->readformat = ast->rawreadformat = ast->nativeformats;
1682 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
1684 ast->hangupcause = 0;
1688 ast->tech_pvt = call;
1689 ast->fds[0] = call->pipe[0];
1690 call->pbx_started = 0;
1692 call->state = CHAN_LCR_STATE_OUT_PREPARE;
1695 * Extract interface, dialstring, options from data.
1698 * <interface>/<dialstring>
1699 * <interface>/<dialstring>/options
1701 strncpy(exten, (char *)data, sizeof(exten)-1);
1702 exten[sizeof(exten)-1] = '\0';
1703 if ((dial = strchr(exten, '/'))) {
1706 if ((opt = strchr(dial, '/')))
1715 strncpy(call->interface, interface, sizeof(call->interface)-1);
1716 strncpy(call->dialstring, dial, sizeof(call->dialstring)-1);
1717 apply_opt(call, (char *)opt);
1719 ast_mutex_unlock(&chan_lock);
1724 * call from asterisk
1726 static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
1728 union parameter newparam;
1729 struct chan_call *call;
1731 ast_mutex_lock(&chan_lock);
1732 call = ast->tech_pvt;
1734 CERROR(NULL, ast, "Received call from Asterisk, but call instance does not exist.\n");
1735 ast_mutex_unlock(&chan_lock);
1739 CDEBUG(NULL, ast, "Received call from Asterisk.\n");
1741 /* pbx process is started */
1742 call->pbx_started = 1;
1743 /* send MESSAGE_NEWREF */
1744 memset(&newparam, 0, sizeof(union parameter));
1745 newparam.direction = 0; /* request from app */
1746 send_message(MESSAGE_NEWREF, 0, &newparam);
1748 /* set hdlc if capability requires hdlc */
1749 if (ast->transfercapability == INFO_BC_DATAUNRESTRICTED
1750 || ast->transfercapability == INFO_BC_DATARESTRICTED
1751 || ast->transfercapability == INFO_BC_VIDEO)
1753 /* if hdlc is forced by option, we change transcap to data */
1755 && ast->transfercapability != INFO_BC_DATAUNRESTRICTED
1756 && ast->transfercapability != INFO_BC_DATARESTRICTED
1757 && ast->transfercapability != INFO_BC_VIDEO)
1758 ast->transfercapability = INFO_BC_DATAUNRESTRICTED;
1760 call->cid_num[0] = 0;
1761 call->cid_name[0] = 0;
1762 call->cid_rdnis[0] = 0;
1764 if (ast->cid.cid_num) if (ast->cid.cid_num[0])
1765 strncpy(call->cid_num, ast->cid.cid_num,
1766 sizeof(call->cid_num)-1);
1768 if (ast->cid.cid_name) if (ast->cid.cid_name[0])
1769 strncpy(call->cid_name, ast->cid.cid_name,
1770 sizeof(call->cid_name)-1);
1771 if (ast->cid.cid_rdnis) if (ast->cid.cid_rdnis[0])
1772 strncpy(call->cid_rdnis, ast->cid.cid_rdnis,
1773 sizeof(call->cid_rdnis)-1);
1775 ast_mutex_unlock(&chan_lock);
1779 static int lcr_digit_begin(struct ast_channel *ast, char digit)
1781 struct chan_call *call;
1782 union parameter newparam;
1785 /* only pass IA5 number space */
1786 if (digit > 126 || digit < 32)
1789 ast_mutex_lock(&chan_lock);
1790 call = ast->tech_pvt;
1792 CERROR(NULL, ast, "Received digit from Asterisk, but no call instance exists.\n");
1793 ast_mutex_unlock(&chan_lock);
1797 CDEBUG(call, ast, "Received digit '%c' from Asterisk.\n", digit);
1799 /* send information or queue them */
1800 if (call->ref && call->state == CHAN_LCR_STATE_OUT_DIALING)
1802 CDEBUG(call, ast, "Sending digit to LCR, because we are in dialing state.\n");
1803 memset(&newparam, 0, sizeof(union parameter));
1804 newparam.information.id[0] = digit;
1805 newparam.information.id[1] = '\0';
1806 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
1809 && (call->state == CHAN_LCR_STATE_OUT_PREPARE || call->state == CHAN_LCR_STATE_OUT_SETUP))
1811 CDEBUG(call, ast, "Queue digits, because we are in setup/dialing state and have no ref yet.\n");
1813 strncat(call->dialque, buf, strlen(call->dialque)-1);
1816 ast_mutex_unlock(&chan_lock);
1820 static int lcr_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
1822 printf("DIGIT END %c\n", digit);
1826 static int lcr_answer(struct ast_channel *ast)
1828 union parameter newparam;
1829 struct chan_call *call;
1831 ast_mutex_lock(&chan_lock);
1832 call = ast->tech_pvt;
1834 CERROR(NULL, ast, "Received answer from Asterisk, but no call instance exists.\n");
1835 ast_mutex_unlock(&chan_lock);
1839 CDEBUG(call, ast, "Received answer from Asterisk (maybe during lcr_bridge).\n");
1841 /* copy connectinfo, if bridged */
1842 if (call->bridge_call)
1843 memcpy(&call->connectinfo, &call->bridge_call->connectinfo, sizeof(struct connect_info));
1844 /* send connect message to lcr */
1845 if (call->state != CHAN_LCR_STATE_CONNECT) {
1846 memset(&newparam, 0, sizeof(union parameter));
1847 memcpy(&newparam.connectinfo, &call->connectinfo, sizeof(struct connect_info));
1848 send_message(MESSAGE_CONNECT, call->ref, &newparam);
1849 call->state = CHAN_LCR_STATE_CONNECT;
1852 /* request bchannel */
1853 if (!call->bchannel) {
1854 CDEBUG(call, ast, "Requesting B-channel.\n");
1855 memset(&newparam, 0, sizeof(union parameter));
1856 newparam.bchannel.type = BCHANNEL_REQUEST;
1857 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
1860 // memset(&newparam, 0, sizeof(union parameter));
1861 // send_message(MESSAGE_ENABLEKEYPAD, call->ref, &newparam);
1864 CDEBUG(call, ast, "DTMF is disabled by option.\n");
1868 ast_mutex_unlock(&chan_lock);
1872 static int lcr_hangup(struct ast_channel *ast)
1874 struct chan_call *call;
1875 pthread_t tid = pthread_self();
1877 if (!pthread_equal(tid, chan_tid))
1878 ast_mutex_lock(&chan_lock);
1879 call = ast->tech_pvt;
1881 CERROR(NULL, ast, "Received hangup from Asterisk, but no call instance exists.\n");
1882 if (!pthread_equal(tid, chan_tid))
1883 ast_mutex_unlock(&chan_lock);
1887 if (!pthread_equal(tid, chan_tid))
1888 CDEBUG(call, ast, "Received hangup from Asterisk thread.\n");
1890 CDEBUG(call, ast, "Received hangup from LCR thread.\n");
1892 /* disconnect asterisk, maybe not required */
1893 ast->tech_pvt = NULL;
1898 CDEBUG(call, ast, "Releasing ref and freeing call instance.\n");
1899 if (ast->hangupcause > 0)
1900 send_release_and_import(call, ast->hangupcause, LOCATION_PRIVATE_LOCAL);
1902 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1905 if (!pthread_equal(tid, chan_tid))
1906 ast_mutex_unlock(&chan_lock);
1910 /* ref is not set, due to prepare setup or release */
1911 if (call->state == CHAN_LCR_STATE_RELEASE)
1913 /* we get the response to our release */
1914 CDEBUG(call, ast, "Freeing call instance, because we have no ref AND we are requesting no ref.\n");
1918 /* during prepare, we change to release state */
1919 CDEBUG(call, ast, "We must wait until we received our ref, until we can free call instance.\n");
1920 call->state = CHAN_LCR_STATE_RELEASE;
1923 if (!pthread_equal(tid, chan_tid))
1924 ast_mutex_unlock(&chan_lock);
1928 static int lcr_write(struct ast_channel *ast, struct ast_frame *f)
1930 struct chan_call *call;
1933 CDEBUG(NULL, ast, "No subclass\n");
1934 if (!(f->subclass & ast->nativeformats))
1935 CDEBUG(NULL, ast, "Unexpected format.\n");
1937 ast_mutex_lock(&chan_lock);
1938 call = ast->tech_pvt;
1940 ast_mutex_unlock(&chan_lock);
1943 if (call->bchannel && f->samples)
1944 bchannel_transmit(call->bchannel, f->data, f->samples);
1945 ast_mutex_unlock(&chan_lock);
1950 static struct ast_frame *lcr_read(struct ast_channel *ast)
1952 struct chan_call *call;
1955 ast_mutex_lock(&chan_lock);
1956 call = ast->tech_pvt;
1958 ast_mutex_unlock(&chan_lock);
1961 if (call->pipe[0] > -1) {
1962 if (call->rebuffer && !call->hdlc) {
1963 len = read(call->pipe[0], call->read_buff, 160);
1965 len = read(call->pipe[0], call->read_buff, sizeof(call->read_buff));
1968 close(call->pipe[0]);
1974 call->read_fr.frametype = AST_FRAME_VOICE;
1975 call->read_fr.subclass = ast->nativeformats;
1976 call->read_fr.datalen = len;
1977 call->read_fr.samples = len;
1978 call->read_fr.delivery = ast_tv(0,0);
1979 call->read_fr.data = call->read_buff;
1980 ast_mutex_unlock(&chan_lock);
1982 return &call->read_fr;
1985 static int lcr_indicate(struct ast_channel *ast, int cond, const void *data, size_t datalen)
1987 union parameter newparam;
1989 struct chan_call *call;
1991 ast_mutex_lock(&chan_lock);
1992 call = ast->tech_pvt;
1994 CERROR(NULL, ast, "Received indicate from Asterisk, but no call instance exists.\n");
1995 ast_mutex_unlock(&chan_lock);
2000 case AST_CONTROL_BUSY:
2001 CDEBUG(call, ast, "Received indicate AST_CONTROL_BUSY from Asterisk.\n");
2002 ast_setstate(ast, AST_STATE_BUSY);
2003 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2004 /* send message to lcr */
2005 memset(&newparam, 0, sizeof(union parameter));
2006 newparam.disconnectinfo.cause = 17;
2007 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2008 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2010 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2013 case AST_CONTROL_CONGESTION:
2014 CDEBUG(call, ast, "Received indicate AST_CONTROL_CONGESTION from Asterisk. (cause %d)\n", ast->hangupcause);
2015 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2016 /* send message to lcr */
2017 memset(&newparam, 0, sizeof(union parameter));
2018 newparam.disconnectinfo.cause = ast->hangupcause;
2019 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2020 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2022 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2025 case AST_CONTROL_PROCEEDING:
2026 CDEBUG(call, ast, "Received indicate AST_CONTROL_PROCEEDING from Asterisk.\n");
2027 if (call->state == CHAN_LCR_STATE_IN_SETUP
2028 || call->state == CHAN_LCR_STATE_IN_DIALING) {
2029 /* send message to lcr */
2030 memset(&newparam, 0, sizeof(union parameter));
2031 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
2033 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
2036 case AST_CONTROL_RINGING:
2037 CDEBUG(call, ast, "Received indicate AST_CONTROL_RINGING from Asterisk.\n");
2038 ast_setstate(ast, AST_STATE_RINGING);
2039 if (call->state == CHAN_LCR_STATE_IN_SETUP
2040 || call->state == CHAN_LCR_STATE_IN_DIALING
2041 || call->state == CHAN_LCR_STATE_IN_PROCEEDING) {
2042 /* send message to lcr */
2043 memset(&newparam, 0, sizeof(union parameter));
2044 send_message(MESSAGE_ALERTING, call->ref, &newparam);
2046 call->state = CHAN_LCR_STATE_IN_ALERTING;
2050 CDEBUG(call, ast, "Received indicate -1.\n");
2054 case AST_CONTROL_VIDUPDATE:
2055 CDEBUG(call, ast, "Received indicate AST_CONTROL_VIDUPDATE.\n");
2058 case AST_CONTROL_HOLD:
2059 CDEBUG(call, ast, "Received indicate AST_CONTROL_HOLD from Asterisk.\n");
2060 /* send message to lcr */
2061 memset(&newparam, 0, sizeof(union parameter));
2062 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_HOLD;
2063 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2065 /*start music onhold*/
2066 ast_moh_start(ast,data,ast->musicclass);
2068 case AST_CONTROL_UNHOLD:
2069 CDEBUG(call, ast, "Received indicate AST_CONTROL_UNHOLD from Asterisk.\n");
2070 /* send message to lcr */
2071 memset(&newparam, 0, sizeof(union parameter));
2072 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
2073 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2080 CERROR(call, ast, "Received indicate from Asterisk with unknown condition %d.\n", cond);
2086 ast_mutex_unlock(&chan_lock);
2093 static int lcr_fixup(struct ast_channel *oldast, struct ast_channel *newast)
2095 struct chan_call *call;
2097 ast_mutex_lock(&chan_lock);
2098 call = oldast->tech_pvt;
2100 CERROR(NULL, oldast, "Received fixup from Asterisk, but no call instance exists.\n");
2101 ast_mutex_unlock(&chan_lock);
2105 CDEBUG(call, oldast, "Received fixup from Asterisk.\n");
2107 ast_mutex_lock(&chan_lock);
2112 * send_text asterisk
2114 static int lcr_send_text(struct ast_channel *ast, const char *text)
2116 struct chan_call *call;
2117 union parameter newparam;
2119 ast_mutex_lock(&chan_lock);
2120 call = ast->tech_pvt;
2122 CERROR(NULL, ast, "Received send_text from Asterisk, but no call instance exists.\n");
2123 ast_mutex_unlock(&chan_lock);
2127 CDEBUG(call, ast, "Received send_text from Asterisk. (text=%s)\n", text);
2128 memset(&newparam, 0, sizeof(union parameter));
2129 strncpy(newparam.notifyinfo.display, text, sizeof(newparam.notifyinfo.display)-1);
2130 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2131 ast_mutex_lock(&chan_lock);
2138 enum ast_bridge_result lcr_bridge(struct ast_channel *ast1,
2139 struct ast_channel *ast2, int flags,
2140 struct ast_frame **fo,
2141 struct ast_channel **rc, int timeoutms)
2144 struct chan_call *call1, *call2;
2145 struct ast_channel *carr[2], *who;
2147 struct ast_frame *f;
2150 CDEBUG(NULL, NULL, "Received briding request from Asterisk.\n");
2155 /* join via dsp (if the channels are currently open) */
2156 ast_mutex_lock(&chan_lock);
2157 call1 = ast1->tech_pvt;
2158 call2 = ast2->tech_pvt;
2159 if (!call1 || !call2) {
2160 CDEBUG(NULL, NULL, "Bridge, but we don't have two call instances, exitting.\n");
2161 ast_mutex_unlock(&chan_lock);
2162 return AST_BRIDGE_COMPLETE;
2165 /* join, if both call instances uses dsp */
2166 if (!call1->nodsp && !call2->nodsp) {
2167 CDEBUG(NULL, NULL, "Both calls use DSP, briding via DSP.\n");
2169 /* get bridge id and join */
2170 bridge_id = new_bridge_id();
2172 call1->bridge_id = bridge_id;
2173 if (call1->bchannel)
2174 bchannel_join(call1->bchannel, bridge_id);
2176 call2->bridge_id = bridge_id;
2177 if (call2->bchannel)
2178 bchannel_join(call2->bchannel, bridge_id);
2180 if (call1->nodsp && call2->nodsp)
2181 CDEBUG(NULL, NULL, "Both calls use no DSP, briding in channel driver.\n");
2183 CDEBUG(NULL, NULL, "One call uses no DSP, briding in channel driver.\n");
2184 call1->bridge_call = call2;
2185 call2->bridge_call = call1;
2187 if (call1->state == CHAN_LCR_STATE_IN_SETUP
2188 || call1->state == CHAN_LCR_STATE_IN_DIALING
2189 || call1->state == CHAN_LCR_STATE_IN_PROCEEDING
2190 || call1->state == CHAN_LCR_STATE_IN_ALERTING) {
2191 CDEBUG(call1, ast1, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
2194 if (call2->state == CHAN_LCR_STATE_IN_SETUP
2195 || call2->state == CHAN_LCR_STATE_IN_DIALING
2196 || call2->state == CHAN_LCR_STATE_IN_PROCEEDING
2197 || call2->state == CHAN_LCR_STATE_IN_ALERTING) {
2198 CDEBUG(call2, ast2, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
2202 ast_mutex_unlock(&chan_lock);
2206 who = ast_waitfor_n(carr, 2, &to);
2209 CDEBUG(NULL, NULL, "Empty read on bridge, breaking out.\n");
2214 if (!f || f->frametype == AST_FRAME_CONTROL) {
2216 CDEBUG(NULL, NULL, "Got hangup.\n");
2218 CDEBUG(NULL, NULL, "Got CONTROL.\n");
2225 if ( f->frametype == AST_FRAME_DTMF ) {
2226 CDEBUG(NULL, NULL, "Got DTMF.\n");
2242 CDEBUG(NULL, NULL, "Releasing bride.\n");
2244 /* split channels */
2245 ast_mutex_lock(&chan_lock);
2246 call1 = ast1->tech_pvt;
2247 call2 = ast2->tech_pvt;
2248 if (call1 && call1->bridge_id)
2250 call1->bridge_id = 0;
2251 if (call1->bchannel)
2252 bchannel_join(call1->bchannel, 0);
2253 if (call1->bridge_call)
2254 call1->bridge_call->bridge_call = NULL;
2256 if (call2 && call1->bridge_id)
2258 call2->bridge_id = 0;
2259 if (call2->bchannel)
2260 bchannel_join(call2->bchannel, 0);
2261 if (call2->bridge_call)
2262 call2->bridge_call->bridge_call = NULL;
2264 call1->bridge_call = NULL;
2265 call2->bridge_call = NULL;
2267 ast_mutex_unlock(&chan_lock);
2268 return AST_BRIDGE_COMPLETE;
2270 static struct ast_channel_tech lcr_tech = {
2272 .description="Channel driver for connecting to Linux-Call-Router",
2273 .requester=lcr_request,
2274 .send_digit_begin=lcr_digit_begin,
2275 .send_digit_end=lcr_digit_end,
2282 .indicate=lcr_indicate,
2284 .send_text=lcr_send_text,
2293 static int lcr_show_lcr (int fd, int argc, char *argv[])
2298 static int lcr_show_calls (int fd, int argc, char *argv[])
2303 static int lcr_reload_routing (int fd, int argc, char *argv[])
2308 static int lcr_reload_interfaces (int fd, int argc, char *argv[])
2313 static int lcr_port_block (int fd, int argc, char *argv[])
2318 static int lcr_port_unblock (int fd, int argc, char *argv[])
2323 static int lcr_port_unload (int fd, int argc, char *argv[])
2328 static struct ast_cli_entry cli_show_lcr =
2329 { {"lcr", "show", "lcr", NULL},
2331 "Shows current states of LCR core",
2332 "Usage: lcr show lcr\n",
2335 static struct ast_cli_entry cli_show_calls =
2336 { {"lcr", "show", "calls", NULL},
2338 "Shows current calls made by LCR and Asterisk",
2339 "Usage: lcr show calls\n",
2342 static struct ast_cli_entry cli_reload_routing =
2343 { {"lcr", "reload", "routing", NULL},
2345 "Reloads routing conf of LCR, current uncomplete calls will be disconnected",
2346 "Usage: lcr reload routing\n",
2349 static struct ast_cli_entry cli_reload_interfaces =
2350 { {"lcr", "reload", "interfaces", NULL},
2351 lcr_reload_interfaces,
2352 "Reloads interfaces conf of LCR",
2353 "Usage: lcr reload interfaces\n",
2356 static struct ast_cli_entry cli_port_block =
2357 { {"lcr", "port", "block", NULL},
2359 "Blocks LCR port for further calls",
2360 "Usage: lcr port block \"<port>\"\n",
2363 static struct ast_cli_entry cli_port_unblock =
2364 { {"lcr", "port", "unblock", NULL},
2366 "Unblocks or loads LCR port, port is opened my mISDN",
2367 "Usage: lcr port unblock \"<port>\"\n",
2370 static struct ast_cli_entry cli_port_unload =
2371 { {"lcr", "port", "unload", NULL},
2373 "Unloads LCR port, port is closes by mISDN",
2374 "Usage: lcr port unload \"<port>\"\n",
2380 static int lcr_config_exec(struct ast_channel *ast, void *data)
2382 struct chan_call *call;
2384 ast_mutex_lock(&chan_lock);
2385 CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", (char *)data);
2389 if (call->ast == ast)
2394 apply_opt(call, (char *)data);
2396 CERROR(NULL, ast, "lcr_config app not called by chan_lcr channel.\n");
2398 ast_mutex_unlock(&chan_lock);
2403 * module loading and destruction
2405 int load_module(void)
2409 for (i = 0; i < 256; i++) {
2410 flip_bits[i] = (i>>7) | ((i>>5)&2) | ((i>>3)&4) | ((i>>1)&8)
2411 | (i<<7) | ((i&2)<<5) | ((i&4)<<3) | ((i&8)<<1);
2414 if (read_options() == 0) {
2415 CERROR(NULL, NULL, "%s", options_error);
2416 return AST_MODULE_LOAD_DECLINE;
2419 ast_mutex_init(&chan_lock);
2420 ast_mutex_init(&log_lock);
2422 if (open_socket() < 0) {
2423 /* continue with closed socket */
2426 if (bchannel_initialize()) {
2427 CERROR(NULL, NULL, "Unable to open mISDN device\n");
2429 return AST_MODULE_LOAD_DECLINE;
2433 lcr_tech.capabilities = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
2434 if (ast_channel_register(&lcr_tech)) {
2435 CERROR(NULL, NULL, "Unable to register channel class\n");
2436 bchannel_deinitialize();
2438 return AST_MODULE_LOAD_DECLINE;
2441 ast_register_application("lcr_config", lcr_config_exec, "lcr_config",
2442 "lcr_config(<opt><optarg>:<opt>:...)\n"
2443 "Sets LCR opts. and optargs\n"
2445 "The available options are:\n"
2446 " d - Send display text on called phone, text is the optarg.\n"
2447 " n - Don't detect dtmf tones on called channel.\n"
2448 " h - Force data call (HDLC).\n"
2449 " t - Disable mISDN_dsp features (required for fax application).\n"
2450 " c - Make crypted outgoing call, optarg is keyindex.\n"
2451 " e - Perform echo cancelation on this channel.\n"
2452 " Takes mISDN pipeline option as optarg.\n"
2453 // " s - Send Non Inband DTMF as inband.\n"
2454 " vr - rxgain control\n"
2455 " vt - txgain control\n"
2456 " Volume changes at factor 2 ^ optarg.\n"
2461 ast_cli_register(&cli_show_lcr);
2462 ast_cli_register(&cli_show_calls);
2463 ast_cli_register(&cli_reload_routing);
2464 ast_cli_register(&cli_reload_interfaces);
2465 ast_cli_register(&cli_port_block);
2466 ast_cli_register(&cli_port_unblock);
2467 ast_cli_register(&cli_port_unload);
2471 if ((pthread_create(&chan_tid, NULL, chan_thread, NULL)<0))
2473 /* failed to create thread */
2474 bchannel_deinitialize();
2476 ast_channel_unregister(&lcr_tech);
2477 return AST_MODULE_LOAD_DECLINE;
2482 int unload_module(void)
2484 /* First, take us out of the channel loop */
2485 CDEBUG(NULL, NULL, "-- Unregistering mISDN Channel Driver --\n");
2488 pthread_join(chan_tid, NULL);
2490 ast_channel_unregister(&lcr_tech);
2492 ast_unregister_application("lcr_config");
2495 if (mISDN_created) {
2496 bchannel_deinitialize();
2500 if (lcr_sock >= 0) {
2508 int reload_module(void)
2515 #define AST_MODULE "chan_lcr"
2517 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Channel driver for Linux-Call-Router Support (ISDN BRI/PRI)",
2518 .load = load_module,
2519 .unload = unload_module,
2520 .reload = reload_module,