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.bearer_info1 = (options.law=='a')?3:2;
597 newparam.setup.capainfo.hlc = INFO_HLC_NONE;
598 newparam.setup.capainfo.exthlc = INFO_HLC_NONE;
599 send_message(MESSAGE_SETUP, call->ref, &newparam);
601 /* change to outgoing setup state */
602 call->state = CHAN_LCR_STATE_OUT_SETUP;
606 * send dialing info to LCR
607 * this function is called, when setup acknowledge is received and dialing
610 static void send_dialque_to_lcr(struct chan_call *call)
612 union parameter newparam;
614 if (!call->ast || !call->ref || !call->dialque[0])
617 CDEBUG(call, call->ast, "Sending dial queue to LCR. (dialing=%s)\n", call->dialque);
619 /* send setup message to LCR */
620 memset(&newparam, 0, sizeof(union parameter));
621 strncpy(newparam.information.id, call->dialque, sizeof(newparam.information.id)-1);
622 call->dialque[0] = '\0';
623 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
627 * in case of a bridge, the unsupported message can be forwarded directly
628 * to the remote call.
630 static void bridge_message_if_bridged(struct chan_call *call, int message_type, union parameter *param)
634 if (!call->bridge_call) return;
635 CDEBUG(call, NULL, "Sending message due briding.\n");
636 send_message(message_type, call->bridge_call->ref, param);
640 * send release message to LCR and import bchannel if exported
642 static void send_release_and_import(struct chan_call *call, int cause, int location)
644 union parameter newparam;
646 /* importing channel */
647 if (call->bchannel) {
648 memset(&newparam, 0, sizeof(union parameter));
649 newparam.bchannel.type = BCHANNEL_RELEASE;
650 newparam.bchannel.handle = call->bchannel->handle;
651 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
653 /* sending release */
654 memset(&newparam, 0, sizeof(union parameter));
655 newparam.disconnectinfo.cause = cause;
656 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
657 send_message(MESSAGE_RELEASE, call->ref, &newparam);
661 * check if extension matches and start asterisk
662 * if it can match, proceed
665 static void lcr_start_pbx(struct chan_call *call, struct ast_channel *ast, int complete)
668 union parameter newparam;
670 CDEBUG(call, ast, "Try to start pbx. (exten=%s context=%s complete=%s)\n", ast->exten, ast->context, complete?"yes":"no");
675 if (!ast_canmatch_extension(ast, ast->context, ast->exten, 1, call->oad))
677 CDEBUG(call, ast, "Got 'sending complete', but extension '%s' will not match at context '%s' - releasing.\n", ast->exten, ast->context);
681 if (!ast_exists_extension(ast, ast->context, ast->exten, 1, call->oad))
683 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);
687 CDEBUG(call, ast, "Got 'sending complete', extensions matches.\n");
688 /* send setup acknowledge to lcr */
689 memset(&newparam, 0, sizeof(union parameter));
690 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
693 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
698 if (ast_canmatch_extension(ast, ast->context, ast->exten, 1, call->oad))
700 /* send setup acknowledge to lcr */
701 if (call->state != CHAN_LCR_STATE_IN_DIALING) {
702 memset(&newparam, 0, sizeof(union parameter));
703 send_message(MESSAGE_OVERLAP, call->ref, &newparam);
707 call->state = CHAN_LCR_STATE_IN_DIALING;
709 /* if match, start pbx */
710 if (ast_exists_extension(ast, ast->context, ast->exten, 1, call->oad)) {
711 CDEBUG(call, ast, "Extensions matches.\n");
716 CDEBUG(call, ast, "Extensions may match, if more digits are dialed.\n");
724 CDEBUG(call, ast, "Releasing due to extension missmatch.\n");
725 send_release_and_import(call, cause, LOCATION_PRIVATE_LOCAL);
727 /* release asterisk */
728 ast->hangupcause = call->cause;
729 /* change to release state */
730 call->state = CHAN_LCR_STATE_RELEASE;
731 ast_hangup(ast); // call will be destroyed here
735 /* send setup to asterisk */
736 CDEBUG(call, ast, "Starting call to Asterisk due to matching extension.\n");
737 ret = ast_pbx_start(ast);
740 cause = (ret==-2)?34:27;
743 call->pbx_started = 1;
744 // if (call->state == CHAN_LCR_STATE_IN_DIALING)
745 // ast_setstate(ast, AST_STATE_DIALING);
747 // ast_setstate(ast, AST_STATE_OFFHOOK);
752 * incoming setup from LCR
754 static void lcr_in_setup(struct chan_call *call, int message_type, union parameter *param)
756 struct ast_channel *ast;
758 CDEBUG(call, NULL, "Incomming setup from LCR. (callerid %s, dialing %s)\n", param->setup.callerinfo.id, param->setup.dialinginfo.id);
760 /* create asterisk channel instrance */
761 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
765 CERROR(call, NULL, "Failed to create Asterisk channel - releasing.\n");
766 send_release_and_import(call, CAUSE_RESSOURCEUNAVAIL, LOCATION_PRIVATE_LOCAL);
773 ast->tech_pvt = call;
774 ast->tech = &lcr_tech;
775 ast->fds[0] = call->pipe[0];
777 /* fill setup information */
778 if (param->setup.dialinginfo.id)
779 strncpy(ast->exten, param->setup.dialinginfo.id, AST_MAX_EXTENSION-1);
780 if (param->setup.context[0])
781 strncpy(ast->context, param->setup.context, AST_MAX_CONTEXT-1);
783 strncpy(ast->context, param->setup.callerinfo.interface, AST_MAX_CONTEXT-1);
784 if (param->setup.callerinfo.id[0])
785 ast->cid.cid_num = strdup(param->setup.callerinfo.id);
786 if (param->setup.callerinfo.name[0])
787 ast->cid.cid_name = strdup(param->setup.callerinfo.name);
788 if (param->setup.redirinfo.id[0])
789 ast->cid.cid_name = strdup(numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international));
790 switch (param->setup.callerinfo.present)
792 case INFO_PRESENT_ALLOWED:
793 ast->cid.cid_pres = AST_PRES_ALLOWED;
795 case INFO_PRESENT_RESTRICTED:
796 ast->cid.cid_pres = AST_PRES_RESTRICTED;
799 ast->cid.cid_pres = AST_PRES_UNAVAILABLE;
801 switch (param->setup.callerinfo.ntype)
803 case INFO_NTYPE_SUBSCRIBER:
804 ast->cid.cid_ton = 4;
806 case INFO_NTYPE_NATIONAL:
807 ast->cid.cid_ton = 2;
809 case INFO_NTYPE_INTERNATIONAL:
810 ast->cid.cid_ton = 1;
813 ast->cid.cid_ton = 0;
815 ast->transfercapability = param->setup.capainfo.bearer_capa;
816 /* enable hdlc if transcap is data */
817 if (ast->transfercapability == INFO_BC_DATAUNRESTRICTED
818 || ast->transfercapability == INFO_BC_DATARESTRICTED
819 || ast->transfercapability == INFO_BC_VIDEO)
821 strncpy(call->oad, numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international), sizeof(call->oad)-1);
823 /* configure channel */
824 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
825 ast->readformat = ast->rawreadformat = ast->nativeformats;
826 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
828 ast->hangupcause = 0;
831 call->state = CHAN_LCR_STATE_IN_SETUP;
833 if (!call->pbx_started)
834 lcr_start_pbx(call, ast, param->setup.dialinginfo.sending_complete);
838 * incoming setup acknowledge from LCR
840 static void lcr_in_overlap(struct chan_call *call, int message_type, union parameter *param)
842 if (!call->ast) return;
844 CDEBUG(call, call->ast, "Incomming setup acknowledge from LCR.\n");
846 /* send pending digits in dialque */
847 if (call->dialque[0])
848 send_dialque_to_lcr(call);
849 /* change to overlap state */
850 call->state = CHAN_LCR_STATE_OUT_DIALING;
854 * incoming proceeding from LCR
856 static void lcr_in_proceeding(struct chan_call *call, int message_type, union parameter *param)
858 CDEBUG(call, call->ast, "Incomming proceeding from LCR.\n");
861 call->state = CHAN_LCR_STATE_OUT_PROCEEDING;
862 /* queue event for asterisk */
863 if (call->ast && call->pbx_started)
864 strncat(call->queue_string, "P", sizeof(call->queue_string)-1);
868 * incoming alerting from LCR
870 static void lcr_in_alerting(struct chan_call *call, int message_type, union parameter *param)
872 CDEBUG(call, call->ast, "Incomming alerting from LCR.\n");
875 call->state = CHAN_LCR_STATE_OUT_ALERTING;
876 /* queue event to asterisk */
877 if (call->ast && call->pbx_started)
878 strncat(call->queue_string, "R", sizeof(call->queue_string)-1);
882 * incoming connect from LCR
884 static void lcr_in_connect(struct chan_call *call, int message_type, union parameter *param)
886 union parameter newparam;
888 CDEBUG(call, call->ast, "Incomming connect (answer) from LCR.\n");
891 call->state = CHAN_LCR_STATE_CONNECT;
892 /* request bchannel */
893 if (!call->bchannel) {
894 CDEBUG(call, call->ast, "Requesting B-channel.\n");
895 memset(&newparam, 0, sizeof(union parameter));
896 newparam.bchannel.type = BCHANNEL_REQUEST;
897 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
899 /* copy connectinfo */
900 memcpy(&call->connectinfo, ¶m->connectinfo, sizeof(struct connect_info));
901 /* queue event to asterisk */
902 if (call->ast && call->pbx_started)
903 strncat(call->queue_string, "A", sizeof(call->queue_string)-1);
907 * incoming disconnect from LCR
909 static void lcr_in_disconnect(struct chan_call *call, int message_type, union parameter *param)
911 struct ast_channel *ast = call->ast;
913 CDEBUG(call, call->ast, "Incomming disconnect from LCR. (cause=%d)\n", param->disconnectinfo.cause);
916 call->state = CHAN_LCR_STATE_IN_DISCONNECT;
918 call->cause = param->disconnectinfo.cause;
919 call->location = param->disconnectinfo.location;
920 /* if bridge, forward disconnect and return */
923 if (call->bridge_call)
925 CDEBUG(call, call->ast, "Only signal disconnect via bridge.\n");
926 bridge_message_if_bridged(call, message_type, param);
930 /* release lcr with same cause */
931 send_release_and_import(call, call->cause, call->location);
933 /* change to release state */
934 call->state = CHAN_LCR_STATE_RELEASE;
935 /* queue release asterisk */
938 ast->hangupcause = call->cause;
939 if (call->pbx_started)
940 strcpy(call->queue_string, "H"); // overwrite other indications
942 ast_hangup(ast); // call will be destroyed here
948 * incoming setup acknowledge from LCR
950 static void lcr_in_release(struct chan_call *call, int message_type, union parameter *param)
952 struct ast_channel *ast = call->ast;
954 CDEBUG(call, call->ast, "Incomming release from LCR, releasing ref. (cause=%d)\n", param->disconnectinfo.cause);
958 /* change to release state */
959 call->state = CHAN_LCR_STATE_RELEASE;
960 /* copy release info */
963 call->cause = param->disconnectinfo.cause;
964 call->location = param->disconnectinfo.location;
966 /* if we have an asterisk instance, queue hangup, else we are done */
969 ast->hangupcause = call->cause;
970 if (call->pbx_started)
971 strcpy(call->queue_string, "H");
973 ast_hangup(ast); // call will be destroyed here
983 * incoming information from LCR
985 static void lcr_in_information(struct chan_call *call, int message_type, union parameter *param)
987 struct ast_channel *ast = call->ast;
989 CDEBUG(call, call->ast, "Incoming information from LCR. (dialing=%s)\n", param->information.id);
993 /* pbx not started */
994 if (!call->pbx_started)
996 CDEBUG(call, call->ast, "Asterisk not started, adding digits to number.\n");
997 strncat(ast->exten, param->information.id, AST_MAX_EXTENSION-1);
998 lcr_start_pbx(call, ast, param->information.sending_complete);
1002 /* change dailing state after setup */
1003 if (call->state == CHAN_LCR_STATE_IN_SETUP) {
1004 CDEBUG(call, call->ast, "Changing from SETUP to DIALING state.\n");
1005 call->state = CHAN_LCR_STATE_IN_DIALING;
1006 // ast_setstate(ast, AST_STATE_DIALING);
1010 if (call->state == CHAN_LCR_STATE_IN_DIALING && param->information.id[0])
1011 strncat(call->queue_string, param->information.id, sizeof(call->queue_string)-1);
1013 /* use bridge to forware message not supported by asterisk */
1014 if (call->state == CHAN_LCR_STATE_CONNECT) {
1015 CDEBUG(call, call->ast, "Call is connected, briding.\n");
1016 bridge_message_if_bridged(call, message_type, param);
1021 * incoming information from LCR
1023 static void lcr_in_notify(struct chan_call *call, int message_type, union parameter *param)
1025 union parameter newparam;
1027 CDEBUG(call, call->ast, "Incomming notify from LCR. (notify=%d)\n", param->notifyinfo.notify);
1029 /* request bchannel, if call is resumed and we don't have it */
1030 if (param->notifyinfo.notify == INFO_NOTIFY_USER_RESUMED && !call->bchannel && call->ref) {
1031 CDEBUG(call, call->ast, "Reqesting bchannel at resume.\n");
1032 memset(&newparam, 0, sizeof(union parameter));
1033 newparam.bchannel.type = BCHANNEL_REQUEST;
1034 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
1037 if (!call->ast) return;
1039 /* use bridge to forware message not supported by asterisk */
1040 bridge_message_if_bridged(call, message_type, param);
1044 * incoming information from LCR
1046 static void lcr_in_facility(struct chan_call *call, int message_type, union parameter *param)
1048 CDEBUG(call, call->ast, "Incomming facility from LCR.\n");
1050 if (!call->ast) return;
1052 /* use bridge to forware message not supported by asterisk */
1053 bridge_message_if_bridged(call, message_type, param);
1057 * got dtmf from bchannel (locked state)
1059 void lcr_in_dtmf(struct chan_call *call, int val)
1061 struct ast_channel *ast = call->ast;
1066 if (!call->pbx_started)
1069 CDEBUG(call, call->ast, "Recognised DTMF digit '%c'.\n", val);
1072 strncat(call->queue_string, digit, sizeof(call->queue_string)-1);
1076 * message received from LCR
1078 int receive_message(int message_type, unsigned int ref, union parameter *param)
1080 struct bchannel *bchannel;
1081 struct chan_call *call;
1082 union parameter newparam;
1084 memset(&newparam, 0, sizeof(union parameter));
1086 /* handle bchannel message*/
1087 if (message_type == MESSAGE_BCHANNEL)
1089 switch(param->bchannel.type)
1091 case BCHANNEL_ASSIGN:
1092 CDEBUG(NULL, NULL, "Received BCHANNEL_ASSIGN message. (handle=%08lx) for ref %d\n", param->bchannel.handle, ref);
1093 if ((bchannel = find_bchannel_handle(param->bchannel.handle)))
1095 CERROR(NULL, NULL, "bchannel handle %x already assigned.\n", (int)param->bchannel.handle);
1098 /* create bchannel */
1099 bchannel = alloc_bchannel(param->bchannel.handle);
1102 CERROR(NULL, NULL, "alloc bchannel handle %x failed.\n", (int)param->bchannel.handle);
1106 /* configure channel */
1107 bchannel->b_tx_gain = param->bchannel.tx_gain;
1108 bchannel->b_rx_gain = param->bchannel.rx_gain;
1109 strncpy(bchannel->b_pipeline, param->bchannel.pipeline, sizeof(bchannel->b_pipeline)-1);
1110 if (param->bchannel.crypt_len && param->bchannel.crypt_len <= sizeof(bchannel->b_bf_key))
1112 bchannel->b_bf_len = param->bchannel.crypt_len;
1113 memcpy(bchannel->b_bf_key, param->bchannel.crypt, param->bchannel.crypt_len);
1115 bchannel->b_txdata = 0;
1116 bchannel->b_dtmf = 1;
1117 bchannel->b_tx_dejitter = 1;
1119 /* in case, ref is not set, this bchannel instance must
1120 * be created until it is removed again by LCR */
1122 call = find_call_ref(ref);
1125 bchannel->call = call;
1126 call->bchannel = bchannel;
1128 bchannel_dtmf(bchannel, 1);
1130 bchannel_blowfish(bchannel, call->bf_key, call->bf_len);
1131 if (call->pipeline[0])
1132 bchannel_pipeline(bchannel, call->pipeline);
1134 bchannel_gain(bchannel, call->rx_gain, 0);
1136 bchannel_gain(bchannel, call->tx_gain, 1);
1137 if (call->bridge_id) {
1138 CDEBUG(call, call->ast, "Join bchannel, because call is already bridged.\n");
1139 bchannel_join(bchannel, call->bridge_id);
1141 /* create only, if call exists, othewhise it bchannel is freed below... */
1142 if (bchannel_create(bchannel, ((call->nodsp)?1:0) + ((call->hdlc)?2:0)))
1143 bchannel_activate(bchannel, 1);
1146 newparam.bchannel.type = BCHANNEL_ASSIGN_ACK;
1147 newparam.bchannel.handle = param->bchannel.handle;
1148 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1149 /* if call has released before bchannel is assigned */
1151 newparam.bchannel.type = BCHANNEL_RELEASE;
1152 newparam.bchannel.handle = param->bchannel.handle;
1153 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1158 case BCHANNEL_REMOVE:
1159 CDEBUG(NULL, NULL, "Received BCHANNEL_REMOVE message. (handle=%08lx)\n", param->bchannel.handle);
1160 if (!(bchannel = find_bchannel_handle(param->bchannel.handle)))
1162 CERROR(NULL, NULL, "Bchannel handle %x not assigned.\n", (int)param->bchannel.handle);
1165 /* unklink from call and destroy bchannel */
1166 free_bchannel(bchannel);
1169 newparam.bchannel.type = BCHANNEL_REMOVE_ACK;
1170 newparam.bchannel.handle = param->bchannel.handle;
1171 send_message(MESSAGE_BCHANNEL, 0, &newparam);
1176 CDEBUG(NULL, NULL, "Received unknown bchannel message %d.\n", param->bchannel.type);
1181 /* handle new ref */
1182 if (message_type == MESSAGE_NEWREF)
1184 if (param->direction)
1186 /* new ref from lcr */
1187 CDEBUG(NULL, NULL, "Received new ref by LCR, due to incomming call. (ref=%ld)\n", ref);
1188 if (!ref || find_call_ref(ref))
1190 CERROR(NULL, NULL, "Illegal new ref %ld received.\n", ref);
1193 /* allocate new call instance */
1194 call = alloc_call();
1196 call->state = CHAN_LCR_STATE_IN_PREPARE;
1199 /* wait for setup (or release from asterisk) */
1202 /* new ref, as requested from this remote application */
1203 CDEBUG(NULL, NULL, "Received new ref by LCR, as requested from chan_lcr. (ref=%ld)\n", ref);
1204 call = find_call_ref(0);
1207 /* send release, if ref does not exist */
1208 CDEBUG(NULL, NULL, "No call found, that requests a ref.\n");
1209 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1214 /* send pending setup info */
1215 if (call->state == CHAN_LCR_STATE_OUT_PREPARE)
1216 send_setup_to_lcr(call);
1217 /* release if asterisk has signed off */
1218 else if (call->state == CHAN_LCR_STATE_RELEASE)
1222 send_release_and_import(call, call->cause, call->location);
1224 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1236 CERROR(NULL, NULL, "Received message %d without ref.\n", message_type);
1239 call = find_call_ref(ref);
1242 /* ignore ref that is not used (anymore) */
1243 CDEBUG(NULL, NULL, "Message %d from LCR ignored, because no call instance found.\n", message_type);
1247 /* handle messages */
1248 switch(message_type)
1251 lcr_in_setup(call, message_type, param);
1254 case MESSAGE_OVERLAP:
1255 lcr_in_overlap(call, message_type, param);
1258 case MESSAGE_PROCEEDING:
1259 lcr_in_proceeding(call, message_type, param);
1262 case MESSAGE_ALERTING:
1263 lcr_in_alerting(call, message_type, param);
1266 case MESSAGE_CONNECT:
1267 lcr_in_connect(call, message_type, param);
1270 case MESSAGE_DISCONNECT:
1271 lcr_in_disconnect(call, message_type, param);
1274 case MESSAGE_RELEASE:
1275 lcr_in_release(call, message_type, param);
1278 case MESSAGE_INFORMATION:
1279 lcr_in_information(call, message_type, param);
1282 case MESSAGE_NOTIFY:
1283 lcr_in_notify(call, message_type, param);
1286 case MESSAGE_FACILITY:
1287 lcr_in_facility(call, message_type, param);
1290 case MESSAGE_PATTERN: // audio available from LCR
1293 case MESSAGE_NOPATTERN: // audio not available from LCR
1296 case MESSAGE_AUDIOPATH: // if remote audio connected or hold
1297 call->audiopath = param->audiopath;
1301 CDEBUG(call, call->ast, "Message %d from LCR unhandled.\n", message_type);
1308 * release all calls (due to broken socket)
1310 static void release_all_calls(void)
1312 struct chan_call *call;
1317 /* no ast, so we may directly free call */
1319 CDEBUG(call, NULL, "Freeing call, because no Asterisk channel is linked.\n");
1323 /* already in release process */
1324 if (call->state == CHAN_LCR_STATE_RELEASE) {
1328 /* release or queue release */
1330 call->state = CHAN_LCR_STATE_RELEASE;
1331 if (!call->pbx_started) {
1332 CDEBUG(call, call->ast, "Releasing call, because no Asterisk channel is not started.\n");
1333 ast_hangup(call->ast); // call will be destroyed here
1336 CDEBUG(call, call->ast, "Queue call release, because Asterisk channel is running.\n");
1337 strcpy(call->queue_string, "H");
1341 /* release all bchannels */
1342 while(bchannel_first)
1343 free_bchannel(bchannel_first);
1348 * warning! not thread safe
1349 * returns -1 for socket error, 0 for no work, 1 for work
1351 int handle_socket(void)
1355 struct admin_list *admin;
1356 struct admin_message msg;
1358 /* read from socket */
1359 len = read(lcr_sock, &msg, sizeof(msg));
1362 CERROR(NULL, NULL, "Socket closed.\n");
1363 return(-1); // socket closed
1367 if (len != sizeof(msg))
1369 CERROR(NULL, NULL, "Socket short read. (len %d)\n", len);
1370 return(-1); // socket error
1372 if (msg.message != ADMIN_MESSAGE)
1374 CERROR(NULL, NULL, "Socket received illegal message %d.\n", msg.message);
1377 receive_message(msg.u.msg.type, msg.u.msg.ref, &msg.u.msg.param);
1381 if (errno != EWOULDBLOCK)
1383 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1388 /* write to socket */
1391 admin = admin_first;
1392 len = write(lcr_sock, &admin->msg, sizeof(msg));
1395 CERROR(NULL, NULL, "Socket closed.\n");
1396 return(-1); // socket closed
1400 if (len != sizeof(msg))
1402 CERROR(NULL, NULL, "Socket short write. (len %d)\n", len);
1403 return(-1); // socket error
1406 admin_first = admin->next;
1412 if (errno != EWOULDBLOCK)
1414 CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno);
1423 * open and close socket and thread
1425 int open_socket(void)
1428 char *socket_name = SOCKET_NAME;
1430 struct sockaddr_un sock_address;
1431 unsigned int on = 1;
1432 union parameter param;
1435 if ((lcr_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
1437 CERROR(NULL, NULL, "Failed to create socket.\n");
1441 /* set socket address and name */
1442 memset(&sock_address, 0, sizeof(sock_address));
1443 sock_address.sun_family = PF_UNIX;
1444 strcpy(sock_address.sun_path, socket_name);
1446 /* connect socket */
1447 if ((conn = connect(lcr_sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0)
1451 CDEBUG(NULL, NULL, "Failed to connect to socket '%s'. Is LCR running?\n", sock_address.sun_path);
1455 /* set non-blocking io */
1456 if ((ret = ioctl(lcr_sock, FIONBIO, (unsigned char *)(&on))) < 0)
1460 CERROR(NULL, NULL, "Failed to set socket into non-blocking IO.\n");
1464 /* enque hello message */
1465 memset(¶m, 0, sizeof(param));
1466 strcpy(param.hello.application, "asterisk");
1467 send_message(MESSAGE_HELLO, 0, ¶m);
1472 void close_socket(void)
1474 struct admin_list *admin, *temp;
1476 /* flush pending messages */
1477 admin = admin_first;
1480 admin = admin->next;
1492 /* sending queue to asterisk */
1493 static int queue_send(void)
1496 struct chan_call *call;
1497 struct ast_channel *ast;
1498 struct ast_frame fr;
1503 p = call->queue_string;
1506 /* there is something to queue */
1507 if (!ast_channel_trylock(ast)) { /* succeed */
1511 CDEBUG(call, ast, "Sending queued PROCEEDING to Asterisk.\n");
1512 ast_queue_control(ast, AST_CONTROL_PROCEEDING);
1515 CDEBUG(call, ast, "Sending queued RINGING to Asterisk.\n");
1516 ast_queue_control(ast, AST_CONTROL_RINGING);
1519 CDEBUG(call, ast, "Sending queued ANSWER to Asterisk.\n");
1520 ast_queue_control(ast, AST_CONTROL_ANSWER);
1523 CDEBUG(call, ast, "Sending queued HANGUP to Asterisk.\n");
1524 ast_queue_hangup(ast);
1526 case '1': case '2': case '3': case 'a':
1527 case '4': case '5': case '6': case 'b':
1528 case '7': case '8': case '9': case 'c':
1529 case '*': case '0': case '#': case 'd':
1530 CDEBUG(call, ast, "Sending queued digit '%c' to Asterisk.\n", *p);
1531 /* send digit to asterisk */
1532 memset(&fr, 0, sizeof(fr));
1533 fr.frametype = AST_FRAME_DTMF_BEGIN;
1535 fr.delivery = ast_tv(0, 0);
1536 ast_queue_frame(ast, &fr);
1537 fr.frametype = AST_FRAME_DTMF_END;
1538 ast_queue_frame(ast, &fr);
1541 CDEBUG(call, ast, "Ignoring queued digit 0x%02d.\n", *p);
1545 call->queue_string[0] = '\0';
1546 ast_channel_unlock(ast);
1556 /* signal handler */
1557 void sighandler(int sigset)
1561 /* chan_lcr thread */
1562 static void *chan_thread(void *arg)
1566 union parameter param;
1567 time_t retry = 0, now;
1569 bchannel_pid = getpid();
1571 // signal(SIGPIPE, sighandler);
1573 memset(¶m, 0, sizeof(union parameter));
1577 ast_mutex_lock(&chan_lock);
1584 ret = handle_socket();
1586 CERROR(NULL, NULL, "Handling of socket failed - closing for some seconds.\n");
1588 release_all_calls();
1595 if (retry && now-retry > 5) {
1596 CDEBUG(NULL, NULL, "Retry to open socket.\n");
1598 if (open_socket() < 0) {
1607 ret = bchannel_handle();
1611 /* handle messages to asterisk */
1616 /* delay if no work done */
1618 ast_mutex_unlock(&chan_lock);
1620 ast_mutex_lock(&chan_lock);
1626 CERROR(NULL, NULL, "Thread exit.\n");
1628 ast_mutex_unlock(&chan_lock);
1630 // signal(SIGPIPE, SIG_DFL);
1636 * new asterisk instance
1639 struct ast_channel *lcr_request(const char *type, int format, void *data, int *cause)
1641 char exten[256], *dial, *interface, *opt;
1642 struct ast_channel *ast;
1643 struct chan_call *call;
1645 ast_mutex_lock(&chan_lock);
1646 CDEBUG(NULL, NULL, "Received request from Asterisk. (data=%s)\n", (char *)data);
1648 /* if socket is closed */
1651 CERROR(NULL, NULL, "Rejecting call from Asterisk, because LCR not running.\n");
1652 ast_mutex_unlock(&chan_lock);
1656 /* create call instance */
1657 call = alloc_call();
1660 /* failed to create instance */
1661 ast_mutex_unlock(&chan_lock);
1665 /* create asterisk channel instrance */
1666 ast = ast_channel_alloc(1, AST_STATE_RESERVED, NULL, NULL, "", NULL, "", 0, "%s/%d", lcr_type, ++glob_channel);
1669 CERROR(NULL, NULL, "Failed to create Asterisk channel.\n");
1671 /* failed to create instance */
1672 ast_mutex_unlock(&chan_lock);
1675 ast->tech = &lcr_tech;
1676 ast->tech_pvt = (void *)1L; // set pointer or asterisk will not call
1677 /* configure channel */
1678 ast->nativeformats = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
1679 ast->readformat = ast->rawreadformat = ast->nativeformats;
1680 ast->writeformat = ast->rawwriteformat = ast->nativeformats;
1682 ast->hangupcause = 0;
1686 ast->tech_pvt = call;
1687 ast->fds[0] = call->pipe[0];
1688 call->pbx_started = 0;
1690 call->state = CHAN_LCR_STATE_OUT_PREPARE;
1693 * Extract interface, dialstring, options from data.
1696 * <interface>/<dialstring>
1697 * <interface>/<dialstring>/options
1699 strncpy(exten, (char *)data, sizeof(exten)-1);
1700 exten[sizeof(exten)-1] = '\0';
1701 if ((dial = strchr(exten, '/'))) {
1704 if ((opt = strchr(dial, '/')))
1713 strncpy(call->interface, interface, sizeof(call->interface)-1);
1714 strncpy(call->dialstring, dial, sizeof(call->dialstring)-1);
1715 apply_opt(call, (char *)opt);
1717 ast_mutex_unlock(&chan_lock);
1722 * call from asterisk
1724 static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
1726 union parameter newparam;
1727 struct chan_call *call;
1729 ast_mutex_lock(&chan_lock);
1730 call = ast->tech_pvt;
1732 CERROR(NULL, ast, "Received call from Asterisk, but call instance does not exist.\n");
1733 ast_mutex_unlock(&chan_lock);
1737 CDEBUG(NULL, ast, "Received call from Asterisk.\n");
1739 /* pbx process is started */
1740 call->pbx_started = 1;
1741 /* send MESSAGE_NEWREF */
1742 memset(&newparam, 0, sizeof(union parameter));
1743 newparam.direction = 0; /* request from app */
1744 send_message(MESSAGE_NEWREF, 0, &newparam);
1746 /* set hdlc if capability requires hdlc */
1747 if (ast->transfercapability == INFO_BC_DATAUNRESTRICTED
1748 || ast->transfercapability == INFO_BC_DATARESTRICTED
1749 || ast->transfercapability == INFO_BC_VIDEO)
1751 /* if hdlc is forced by option, we change transcap to data */
1753 && ast->transfercapability != INFO_BC_DATAUNRESTRICTED
1754 && ast->transfercapability != INFO_BC_DATARESTRICTED
1755 && ast->transfercapability != INFO_BC_VIDEO)
1756 ast->transfercapability = INFO_BC_DATAUNRESTRICTED;
1758 call->cid_num[0] = 0;
1759 call->cid_name[0] = 0;
1760 call->cid_rdnis[0] = 0;
1762 if (ast->cid.cid_num) if (ast->cid.cid_num[0])
1763 strncpy(call->cid_num, ast->cid.cid_num,
1764 sizeof(call->cid_num)-1);
1766 if (ast->cid.cid_name) if (ast->cid.cid_name[0])
1767 strncpy(call->cid_name, ast->cid.cid_name,
1768 sizeof(call->cid_name)-1);
1769 if (ast->cid.cid_rdnis) if (ast->cid.cid_rdnis[0])
1770 strncpy(call->cid_rdnis, ast->cid.cid_rdnis,
1771 sizeof(call->cid_rdnis)-1);
1773 ast_mutex_unlock(&chan_lock);
1777 static int lcr_digit_begin(struct ast_channel *ast, char digit)
1779 struct chan_call *call;
1780 union parameter newparam;
1783 /* only pass IA5 number space */
1784 if (digit > 126 || digit < 32)
1787 ast_mutex_lock(&chan_lock);
1788 call = ast->tech_pvt;
1790 CERROR(NULL, ast, "Received digit from Asterisk, but no call instance exists.\n");
1791 ast_mutex_unlock(&chan_lock);
1795 CDEBUG(call, ast, "Received digit '%c' from Asterisk.\n", digit);
1797 /* send information or queue them */
1798 if (call->ref && call->state == CHAN_LCR_STATE_OUT_DIALING)
1800 CDEBUG(call, ast, "Sending digit to LCR, because we are in dialing state.\n");
1801 memset(&newparam, 0, sizeof(union parameter));
1802 newparam.information.id[0] = digit;
1803 newparam.information.id[1] = '\0';
1804 send_message(MESSAGE_INFORMATION, call->ref, &newparam);
1807 && (call->state == CHAN_LCR_STATE_OUT_PREPARE || call->state == CHAN_LCR_STATE_OUT_SETUP))
1809 CDEBUG(call, ast, "Queue digits, because we are in setup/dialing state and have no ref yet.\n");
1811 strncat(call->dialque, buf, strlen(call->dialque)-1);
1814 ast_mutex_unlock(&chan_lock);
1818 static int lcr_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
1820 printf("DIGIT END %c\n", digit);
1824 static int lcr_answer(struct ast_channel *ast)
1826 union parameter newparam;
1827 struct chan_call *call;
1829 ast_mutex_lock(&chan_lock);
1830 call = ast->tech_pvt;
1832 CERROR(NULL, ast, "Received answer from Asterisk, but no call instance exists.\n");
1833 ast_mutex_unlock(&chan_lock);
1837 CDEBUG(call, ast, "Received answer from Asterisk (maybe during lcr_bridge).\n");
1839 /* copy connectinfo, if bridged */
1840 if (call->bridge_call)
1841 memcpy(&call->connectinfo, &call->bridge_call->connectinfo, sizeof(struct connect_info));
1842 /* send connect message to lcr */
1843 if (call->state != CHAN_LCR_STATE_CONNECT) {
1844 memset(&newparam, 0, sizeof(union parameter));
1845 memcpy(&newparam.connectinfo, &call->connectinfo, sizeof(struct connect_info));
1846 send_message(MESSAGE_CONNECT, call->ref, &newparam);
1847 call->state = CHAN_LCR_STATE_CONNECT;
1850 /* request bchannel */
1851 if (!call->bchannel) {
1852 CDEBUG(call, ast, "Requesting B-channel.\n");
1853 memset(&newparam, 0, sizeof(union parameter));
1854 newparam.bchannel.type = BCHANNEL_REQUEST;
1855 send_message(MESSAGE_BCHANNEL, call->ref, &newparam);
1858 // memset(&newparam, 0, sizeof(union parameter));
1859 // send_message(MESSAGE_ENABLEKEYPAD, call->ref, &newparam);
1862 CDEBUG(call, ast, "DTMF is disabled by option.\n");
1866 ast_mutex_unlock(&chan_lock);
1870 static int lcr_hangup(struct ast_channel *ast)
1872 struct chan_call *call;
1873 pthread_t tid = pthread_self();
1875 if (!pthread_equal(tid, chan_tid))
1876 ast_mutex_lock(&chan_lock);
1877 call = ast->tech_pvt;
1879 CERROR(NULL, ast, "Received hangup from Asterisk, but no call instance exists.\n");
1880 if (!pthread_equal(tid, chan_tid))
1881 ast_mutex_unlock(&chan_lock);
1885 if (!pthread_equal(tid, chan_tid))
1886 CDEBUG(call, ast, "Received hangup from Asterisk thread.\n");
1888 CDEBUG(call, ast, "Received hangup from LCR thread.\n");
1890 /* disconnect asterisk, maybe not required */
1891 ast->tech_pvt = NULL;
1896 CDEBUG(call, ast, "Releasing ref and freeing call instance.\n");
1897 if (ast->hangupcause > 0)
1898 send_release_and_import(call, ast->hangupcause, LOCATION_PRIVATE_LOCAL);
1900 send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
1903 if (!pthread_equal(tid, chan_tid))
1904 ast_mutex_unlock(&chan_lock);
1908 /* ref is not set, due to prepare setup or release */
1909 if (call->state == CHAN_LCR_STATE_RELEASE)
1911 /* we get the response to our release */
1912 CDEBUG(call, ast, "Freeing call instance, because we have no ref AND we are requesting no ref.\n");
1916 /* during prepare, we change to release state */
1917 CDEBUG(call, ast, "We must wait until we received our ref, until we can free call instance.\n");
1918 call->state = CHAN_LCR_STATE_RELEASE;
1921 if (!pthread_equal(tid, chan_tid))
1922 ast_mutex_unlock(&chan_lock);
1926 static int lcr_write(struct ast_channel *ast, struct ast_frame *f)
1928 struct chan_call *call;
1931 CDEBUG(NULL, ast, "No subclass\n");
1932 if (!(f->subclass & ast->nativeformats))
1933 CDEBUG(NULL, ast, "Unexpected format.\n");
1935 ast_mutex_lock(&chan_lock);
1936 call = ast->tech_pvt;
1938 ast_mutex_unlock(&chan_lock);
1941 if (call->bchannel && f->samples)
1942 bchannel_transmit(call->bchannel, f->data, f->samples);
1943 ast_mutex_unlock(&chan_lock);
1948 static struct ast_frame *lcr_read(struct ast_channel *ast)
1950 struct chan_call *call;
1953 ast_mutex_lock(&chan_lock);
1954 call = ast->tech_pvt;
1956 ast_mutex_unlock(&chan_lock);
1959 if (call->pipe[0] > -1) {
1960 if (call->rebuffer && !call->hdlc) {
1961 len = read(call->pipe[0], call->read_buff, 160);
1963 len = read(call->pipe[0], call->read_buff, sizeof(call->read_buff));
1966 close(call->pipe[0]);
1972 call->read_fr.frametype = AST_FRAME_VOICE;
1973 call->read_fr.subclass = ast->nativeformats;
1974 call->read_fr.datalen = len;
1975 call->read_fr.samples = len;
1976 call->read_fr.delivery = ast_tv(0,0);
1977 call->read_fr.data = call->read_buff;
1978 ast_mutex_unlock(&chan_lock);
1980 return &call->read_fr;
1983 static int lcr_indicate(struct ast_channel *ast, int cond, const void *data, size_t datalen)
1985 union parameter newparam;
1987 struct chan_call *call;
1989 ast_mutex_lock(&chan_lock);
1990 call = ast->tech_pvt;
1992 CERROR(NULL, ast, "Received indicate from Asterisk, but no call instance exists.\n");
1993 ast_mutex_unlock(&chan_lock);
1998 case AST_CONTROL_BUSY:
1999 CDEBUG(call, ast, "Received indicate AST_CONTROL_BUSY from Asterisk.\n");
2000 ast_setstate(ast, AST_STATE_BUSY);
2001 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2002 /* send message to lcr */
2003 memset(&newparam, 0, sizeof(union parameter));
2004 newparam.disconnectinfo.cause = 17;
2005 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2006 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2008 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2011 case AST_CONTROL_CONGESTION:
2012 CDEBUG(call, ast, "Received indicate AST_CONTROL_CONGESTION from Asterisk. (cause %d)\n", ast->hangupcause);
2013 if (call->state != CHAN_LCR_STATE_OUT_DISCONNECT) {
2014 /* send message to lcr */
2015 memset(&newparam, 0, sizeof(union parameter));
2016 newparam.disconnectinfo.cause = ast->hangupcause;
2017 newparam.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
2018 send_message(MESSAGE_DISCONNECT, call->ref, &newparam);
2020 call->state = CHAN_LCR_STATE_OUT_DISCONNECT;
2023 case AST_CONTROL_PROCEEDING:
2024 CDEBUG(call, ast, "Received indicate AST_CONTROL_PROCEEDING from Asterisk.\n");
2025 if (call->state == CHAN_LCR_STATE_IN_SETUP
2026 || call->state == CHAN_LCR_STATE_IN_DIALING) {
2027 /* send message to lcr */
2028 memset(&newparam, 0, sizeof(union parameter));
2029 send_message(MESSAGE_PROCEEDING, call->ref, &newparam);
2031 call->state = CHAN_LCR_STATE_IN_PROCEEDING;
2034 case AST_CONTROL_RINGING:
2035 CDEBUG(call, ast, "Received indicate AST_CONTROL_RINGING from Asterisk.\n");
2036 ast_setstate(ast, AST_STATE_RINGING);
2037 if (call->state == CHAN_LCR_STATE_IN_SETUP
2038 || call->state == CHAN_LCR_STATE_IN_DIALING
2039 || call->state == CHAN_LCR_STATE_IN_PROCEEDING) {
2040 /* send message to lcr */
2041 memset(&newparam, 0, sizeof(union parameter));
2042 send_message(MESSAGE_ALERTING, call->ref, &newparam);
2044 call->state = CHAN_LCR_STATE_IN_ALERTING;
2048 CDEBUG(call, ast, "Received indicate -1.\n");
2052 case AST_CONTROL_VIDUPDATE:
2053 CDEBUG(call, ast, "Received indicate AST_CONTROL_VIDUPDATE.\n");
2056 case AST_CONTROL_HOLD:
2057 CDEBUG(call, ast, "Received indicate AST_CONTROL_HOLD from Asterisk.\n");
2058 /* send message to lcr */
2059 memset(&newparam, 0, sizeof(union parameter));
2060 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_HOLD;
2061 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2063 /*start music onhold*/
2064 ast_moh_start(ast,data,ast->musicclass);
2066 case AST_CONTROL_UNHOLD:
2067 CDEBUG(call, ast, "Received indicate AST_CONTROL_UNHOLD from Asterisk.\n");
2068 /* send message to lcr */
2069 memset(&newparam, 0, sizeof(union parameter));
2070 newparam.notifyinfo.notify = INFO_NOTIFY_REMOTE_RETRIEVAL;
2071 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2078 CERROR(call, ast, "Received indicate from Asterisk with unknown condition %d.\n", cond);
2084 ast_mutex_unlock(&chan_lock);
2091 static int lcr_fixup(struct ast_channel *oldast, struct ast_channel *newast)
2093 struct chan_call *call;
2095 ast_mutex_lock(&chan_lock);
2096 call = oldast->tech_pvt;
2098 CERROR(NULL, oldast, "Received fixup from Asterisk, but no call instance exists.\n");
2099 ast_mutex_unlock(&chan_lock);
2103 CDEBUG(call, oldast, "Received fixup from Asterisk.\n");
2105 ast_mutex_lock(&chan_lock);
2110 * send_text asterisk
2112 static int lcr_send_text(struct ast_channel *ast, const char *text)
2114 struct chan_call *call;
2115 union parameter newparam;
2117 ast_mutex_lock(&chan_lock);
2118 call = ast->tech_pvt;
2120 CERROR(NULL, ast, "Received send_text from Asterisk, but no call instance exists.\n");
2121 ast_mutex_unlock(&chan_lock);
2125 CDEBUG(call, ast, "Received send_text from Asterisk. (text=%s)\n", text);
2126 memset(&newparam, 0, sizeof(union parameter));
2127 strncpy(newparam.notifyinfo.display, text, sizeof(newparam.notifyinfo.display)-1);
2128 send_message(MESSAGE_NOTIFY, call->ref, &newparam);
2129 ast_mutex_lock(&chan_lock);
2136 enum ast_bridge_result lcr_bridge(struct ast_channel *ast1,
2137 struct ast_channel *ast2, int flags,
2138 struct ast_frame **fo,
2139 struct ast_channel **rc, int timeoutms)
2142 struct chan_call *call1, *call2;
2143 struct ast_channel *carr[2], *who;
2145 struct ast_frame *f;
2148 CDEBUG(NULL, NULL, "Received briding request from Asterisk.\n");
2153 /* join via dsp (if the channels are currently open) */
2154 ast_mutex_lock(&chan_lock);
2155 call1 = ast1->tech_pvt;
2156 call2 = ast2->tech_pvt;
2157 if (!call1 || !call2) {
2158 CDEBUG(NULL, NULL, "Bridge, but we don't have two call instances, exitting.\n");
2159 ast_mutex_unlock(&chan_lock);
2160 return AST_BRIDGE_COMPLETE;
2163 /* join, if both call instances uses dsp */
2164 if (!call1->nodsp && !call2->nodsp) {
2165 CDEBUG(NULL, NULL, "Both calls use DSP, briding via DSP.\n");
2167 /* get bridge id and join */
2168 bridge_id = new_bridge_id();
2170 call1->bridge_id = bridge_id;
2171 if (call1->bchannel)
2172 bchannel_join(call1->bchannel, bridge_id);
2174 call2->bridge_id = bridge_id;
2175 if (call2->bchannel)
2176 bchannel_join(call2->bchannel, bridge_id);
2178 if (call1->nodsp && call2->nodsp)
2179 CDEBUG(NULL, NULL, "Both calls use no DSP, briding in channel driver.\n");
2181 CDEBUG(NULL, NULL, "One call uses no DSP, briding in channel driver.\n");
2182 call1->bridge_call = call2;
2183 call2->bridge_call = call1;
2185 if (call1->state == CHAN_LCR_STATE_IN_SETUP
2186 || call1->state == CHAN_LCR_STATE_IN_DIALING
2187 || call1->state == CHAN_LCR_STATE_IN_PROCEEDING
2188 || call1->state == CHAN_LCR_STATE_IN_ALERTING) {
2189 CDEBUG(call1, ast1, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
2192 if (call2->state == CHAN_LCR_STATE_IN_SETUP
2193 || call2->state == CHAN_LCR_STATE_IN_DIALING
2194 || call2->state == CHAN_LCR_STATE_IN_PROCEEDING
2195 || call2->state == CHAN_LCR_STATE_IN_ALERTING) {
2196 CDEBUG(call2, ast2, "Bridge established before lcr_answer, so we call it ourself: Calling lcr_answer...\n");
2200 ast_mutex_unlock(&chan_lock);
2204 who = ast_waitfor_n(carr, 2, &to);
2207 CDEBUG(NULL, NULL, "Empty read on bridge, breaking out.\n");
2212 if (!f || f->frametype == AST_FRAME_CONTROL) {
2214 CDEBUG(NULL, NULL, "Got hangup.\n");
2216 CDEBUG(NULL, NULL, "Got CONTROL.\n");
2223 if ( f->frametype == AST_FRAME_DTMF ) {
2224 CDEBUG(NULL, NULL, "Got DTMF.\n");
2240 CDEBUG(NULL, NULL, "Releasing bride.\n");
2242 /* split channels */
2243 ast_mutex_lock(&chan_lock);
2244 call1 = ast1->tech_pvt;
2245 call2 = ast2->tech_pvt;
2246 if (call1 && call1->bridge_id)
2248 call1->bridge_id = 0;
2249 if (call1->bchannel)
2250 bchannel_join(call1->bchannel, 0);
2251 if (call1->bridge_call)
2252 call1->bridge_call->bridge_call = NULL;
2254 if (call2 && call1->bridge_id)
2256 call2->bridge_id = 0;
2257 if (call2->bchannel)
2258 bchannel_join(call2->bchannel, 0);
2259 if (call2->bridge_call)
2260 call2->bridge_call->bridge_call = NULL;
2262 call1->bridge_call = NULL;
2263 call2->bridge_call = NULL;
2265 ast_mutex_unlock(&chan_lock);
2266 return AST_BRIDGE_COMPLETE;
2268 static struct ast_channel_tech lcr_tech = {
2270 .description="Channel driver for connecting to Linux-Call-Router",
2271 .requester=lcr_request,
2272 .send_digit_begin=lcr_digit_begin,
2273 .send_digit_end=lcr_digit_end,
2280 .indicate=lcr_indicate,
2282 .send_text=lcr_send_text,
2291 static int lcr_show_lcr (int fd, int argc, char *argv[])
2296 static int lcr_show_calls (int fd, int argc, char *argv[])
2301 static int lcr_reload_routing (int fd, int argc, char *argv[])
2306 static int lcr_reload_interfaces (int fd, int argc, char *argv[])
2311 static int lcr_port_block (int fd, int argc, char *argv[])
2316 static int lcr_port_unblock (int fd, int argc, char *argv[])
2321 static int lcr_port_unload (int fd, int argc, char *argv[])
2326 static struct ast_cli_entry cli_show_lcr =
2327 { {"lcr", "show", "lcr", NULL},
2329 "Shows current states of LCR core",
2330 "Usage: lcr show lcr\n",
2333 static struct ast_cli_entry cli_show_calls =
2334 { {"lcr", "show", "calls", NULL},
2336 "Shows current calls made by LCR and Asterisk",
2337 "Usage: lcr show calls\n",
2340 static struct ast_cli_entry cli_reload_routing =
2341 { {"lcr", "reload", "routing", NULL},
2343 "Reloads routing conf of LCR, current uncomplete calls will be disconnected",
2344 "Usage: lcr reload routing\n",
2347 static struct ast_cli_entry cli_reload_interfaces =
2348 { {"lcr", "reload", "interfaces", NULL},
2349 lcr_reload_interfaces,
2350 "Reloads interfaces conf of LCR",
2351 "Usage: lcr reload interfaces\n",
2354 static struct ast_cli_entry cli_port_block =
2355 { {"lcr", "port", "block", NULL},
2357 "Blocks LCR port for further calls",
2358 "Usage: lcr port block \"<port>\"\n",
2361 static struct ast_cli_entry cli_port_unblock =
2362 { {"lcr", "port", "unblock", NULL},
2364 "Unblocks or loads LCR port, port is opened my mISDN",
2365 "Usage: lcr port unblock \"<port>\"\n",
2368 static struct ast_cli_entry cli_port_unload =
2369 { {"lcr", "port", "unload", NULL},
2371 "Unloads LCR port, port is closes by mISDN",
2372 "Usage: lcr port unload \"<port>\"\n",
2378 static int lcr_config_exec(struct ast_channel *ast, void *data)
2380 struct chan_call *call;
2382 ast_mutex_lock(&chan_lock);
2383 CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", (char *)data);
2387 if (call->ast == ast)
2392 apply_opt(call, (char *)data);
2394 CERROR(NULL, ast, "lcr_config app not called by chan_lcr channel.\n");
2396 ast_mutex_unlock(&chan_lock);
2401 * module loading and destruction
2403 int load_module(void)
2407 for (i = 0; i < 256; i++) {
2408 flip_bits[i] = (i>>7) | ((i>>5)&2) | ((i>>3)&4) | ((i>>1)&8)
2409 | (i<<7) | ((i&2)<<5) | ((i&4)<<3) | ((i&8)<<1);
2412 if (read_options() == 0) {
2413 CERROR(NULL, NULL, "%s", options_error);
2414 return AST_MODULE_LOAD_DECLINE;
2417 ast_mutex_init(&chan_lock);
2418 ast_mutex_init(&log_lock);
2420 if (open_socket() < 0) {
2421 /* continue with closed socket */
2424 if (bchannel_initialize()) {
2425 CERROR(NULL, NULL, "Unable to open mISDN device\n");
2427 return AST_MODULE_LOAD_DECLINE;
2431 lcr_tech.capabilities = (options.law=='a')?AST_FORMAT_ALAW:AST_FORMAT_ULAW;
2432 if (ast_channel_register(&lcr_tech)) {
2433 CERROR(NULL, NULL, "Unable to register channel class\n");
2434 bchannel_deinitialize();
2436 return AST_MODULE_LOAD_DECLINE;
2439 ast_register_application("lcr_config", lcr_config_exec, "lcr_config",
2440 "lcr_config(<opt><optarg>:<opt>:...)\n"
2441 "Sets LCR opts. and optargs\n"
2443 "The available options are:\n"
2444 " d - Send display text on called phone, text is the optarg.\n"
2445 " n - Don't detect dtmf tones on called channel.\n"
2446 " h - Force data call (HDLC).\n"
2447 " t - Disable mISDN_dsp features (required for fax application).\n"
2448 " c - Make crypted outgoing call, optarg is keyindex.\n"
2449 " e - Perform echo cancelation on this channel.\n"
2450 " Takes mISDN pipeline option as optarg.\n"
2451 // " s - Send Non Inband DTMF as inband.\n"
2452 " vr - rxgain control\n"
2453 " vt - txgain control\n"
2454 " Volume changes at factor 2 ^ optarg.\n"
2459 ast_cli_register(&cli_show_lcr);
2460 ast_cli_register(&cli_show_calls);
2461 ast_cli_register(&cli_reload_routing);
2462 ast_cli_register(&cli_reload_interfaces);
2463 ast_cli_register(&cli_port_block);
2464 ast_cli_register(&cli_port_unblock);
2465 ast_cli_register(&cli_port_unload);
2469 if ((pthread_create(&chan_tid, NULL, chan_thread, NULL)<0))
2471 /* failed to create thread */
2472 bchannel_deinitialize();
2474 ast_channel_unregister(&lcr_tech);
2475 return AST_MODULE_LOAD_DECLINE;
2480 int unload_module(void)
2482 /* First, take us out of the channel loop */
2483 CDEBUG(NULL, NULL, "-- Unregistering mISDN Channel Driver --\n");
2486 pthread_join(chan_tid, NULL);
2488 ast_channel_unregister(&lcr_tech);
2490 ast_unregister_application("lcr_config");
2493 if (mISDN_created) {
2494 bchannel_deinitialize();
2498 if (lcr_sock >= 0) {
2506 int reload_module(void)
2513 #define AST_MODULE "chan_lcr"
2515 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Channel driver for Linux-Call-Router Support (ISDN BRI/PRI)",
2516 .load = load_module,
2517 .unload = unload_module,
2518 .reload = reload_module,