now gives warning if mISDN branch is wrong.

also some work on chan_lcr.

	modified:   Makefile
	modified:   apppbx.cpp
	modified:   bchannel.c
	modified:   chan_lcr.c
	modified:   chan_lcr.h
	modified:   dss1.cpp
	modified:   dss1.h
	modified:   extension.c
	modified:   extension.h
	modified:   genrc.c
	modified:   ie.cpp
	renamed:    admin_client.c -> lcradmin.c
	renamed:    admin.h -> lcrsocket.h
	modified:   mISDN.cpp
	modified:   main.h
	renamed:    admin_server.c -> socket_server.c
	renamed:    admin_server.h -> socket_server.h
	modified:   todo.txt
This commit is contained in:
Super User 2008-02-03 13:47:33 +01:00
parent 57c3ea7aa2
commit 5ad4c41dc4
18 changed files with 278 additions and 139 deletions

View File

@ -146,8 +146,8 @@ crypt.o: crypt.cpp *.h Makefile
genext.o: genext.c *.h Makefile
$(PP) -c $(CFLAGS) genext.c -o genext.o
admin_server.o: admin_server.c *.h Makefile
$(PP) -c $(CFLAGS) admin_server.c -o admin_server.o
socket_server.o: socket_server.c *.h Makefile
$(PP) -c $(CFLAGS) socket_server.c -o socket_server.o
trace.o: trace.c *.h Makefile
$(PP) -c $(CFLAGS) trace.c -o trace.o
@ -187,7 +187,7 @@ $(LCR): main.o \
join.o \
joinpbx.o \
joinremote.o \
admin_server.o \
socket_server.o \
trace.o
$(PP) $(LIBDIR) \
main.o \
@ -214,12 +214,12 @@ $(LCR): main.o \
join.o \
joinpbx.o \
joinremote.o \
admin_server.o \
socket_server.o \
trace.o \
$(LIBS) -o $(LCR)
$(LCRADMIN): admin_client.c cause.c *.h Makefile
$(PP) $(LIBDIR) $(CFLAGS) $(CURSES) -lm admin_client.c cause.c \
$(LCRADMIN): lcradmin.c cause.c *.h Makefile
$(PP) $(LIBDIR) $(CFLAGS) $(CURSES) -lm lcradmin.c cause.c \
-o $(LCRADMIN)
$(CHAN_LCR): chan_lcr.o bchannel.o

View File

@ -1001,7 +1001,7 @@ void EndpointAppPBX::out_setup(void)
goto check_anycall_intern;
}
/* directory.list */
if (e_callerinfo.id[0] && (e_ext.centrex || e_ext.display_name))
if (e_callerinfo.id[0] && e_ext.display_name)
{
dirname = parse_directory(e_callerinfo.id, e_callerinfo.ntype);
if (dirname)
@ -1025,8 +1025,8 @@ void EndpointAppPBX::out_setup(void)
SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name));
//printf("\n\ndisplay = %s\n\n\n",message->param.setup.callerinfo.display);
/* use cnip, if enabld */
if (!e_ext.centrex)
message->param.setup.callerinfo.name[0] = '\0';
// if (!e_ext.centrex)
// message->param.setup.callerinfo.name[0] = '\0';
/* screen clip if prefix is required */
if (message->param.setup.callerinfo.id[0] && e_ext.clip_prefix[0])
{
@ -2986,8 +2986,8 @@ void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type,
SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name));
/* use conp, if enabld */
if (!e_ext.centrex)
message->param.connectinfo.name[0] = '\0';
// if (!e_ext.centrex)
// message->param.connectinfo.name[0] = '\0';
/* send connect */
message_put(message);

View File

@ -424,6 +424,8 @@ static void bchannel_activated(struct bchannel *channel)
ph_control(handle, DTMF_TONE_START, 0, "DSP-DTMF", 1);
if (channel->b_crypt_len)
ph_control_block(handle, BF_ENABLE_KEY, channel->b_crypt_key, channel->b_crypt_len, "DSP-CRYPT", channel->b_crypt_len);
if (channel->b_conf)
ph_control(handle, CMX_CONF_JOIN, channel->b_conf, "DSP-CONF", channel->b_conf);
channel->b_state = BSTATE_ACTIVE;
}

View File

@ -42,7 +42,7 @@ with that reference.
#include <sys/un.h>
#include "extension.h"
#include "message.h"
#include "admin.h"
#include "lcrsocket.h"
#include "cause.h"
#include "bchannel.h"
#include "chan_lcr.h"
@ -112,6 +112,28 @@ void free_call(struct chan_call *call)
}
}
unsigned short new_brige_id(void)
{
struct chan_call *call;
unsigned short id = 1;
/* search for lowest bridge id that is not in use and not 0 */
while(id)
{
call = call_first;
while(call)
{
if (call->bridge_id == id)
break;
call = call->next;
}
if (!call)
break;
id++;
}
return(id);
}
/*
* receive bchannel data
@ -195,6 +217,8 @@ int receive_message(int message_type, unsigned long ref, union parameter *param)
{
bchannel->ref = ref;
call->bchannel_handle = param->bchannel.handle;
#warning hier muesen alle stati gesetzt werden falls sie vor dem b-kanal verfügbar waren
bchannel_join(call->bridge_id);
}
if (bchannel_create(bchannel))
bchannel_activate(bchannel, 1);
@ -495,6 +519,146 @@ void lcr_thread(void)
}
}
/* call from asterisk (new instance) */
static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
{
int port=0;
int r;
struct chan_list *ch=MISDN_ASTERISK_TECH_PVT(ast);
struct misdn_bchannel *newbc;
char *opts=NULL, *ext;
char dest_cp[256];
{
strncpy(dest_cp,dest,sizeof(dest_cp)-1);
dest_cp[sizeof(dest_cp)]=0;
ext=dest_cp;
strsep(&ext,"/");
if (ext) {
opts=ext;
strsep(&opts,"/");
} else {
ast_log(LOG_WARNING, "Malformed dialstring\n");
return -1;
}
}
if (!ast) {
ast_log(LOG_WARNING, " --> ! misdn_call called on ast_channel *ast where ast == NULL\n");
return -1;
}
if (((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) || !dest ) {
ast_log(LOG_WARNING, " --> ! misdn_call called on %s, neither down nor reserved (or dest==NULL)\n", ast->name);
ast->hangupcause=41;
ast_setstate(ast, AST_STATE_DOWN);
return -1;
}
if (!ch) {
ast_log(LOG_WARNING, " --> ! misdn_call called on %s, neither down nor reserved (or dest==NULL)\n", ast->name);
ast->hangupcause=41;
ast_setstate(ast, AST_STATE_DOWN);
return -1;
}
newbc=ch->bc;
if (!newbc) {
ast_log(LOG_WARNING, " --> ! misdn_call called on %s, neither down nor reserved (or dest==NULL)\n", ast->name);
ast->hangupcause=41;
ast_setstate(ast, AST_STATE_DOWN);
return -1;
}
port=newbc->port;
chan_misdn_log(1, port, "* CALL: %s\n",dest);
chan_misdn_log(2, port, " --> * dad:%s tech:%s ctx:%s\n",ast->exten,ast->name, ast->context);
chan_misdn_log(3, port, " --> * adding2newbc ext %s\n",ast->exten);
if (ast->exten) {
int l = sizeof(newbc->dad);
strncpy(ast->exten,ext,sizeof(ast->exten));
strncpy(newbc->dad,ext,l);
newbc->dad[l-1] = 0;
}
newbc->rad[0]=0;
chan_misdn_log(3, port, " --> * adding2newbc callerid %s\n",AST_CID_P(ast));
if (ast_strlen_zero(newbc->oad) && AST_CID_P(ast) ) {
if (AST_CID_P(ast)) {
int l = sizeof(newbc->oad);
strncpy(newbc->oad,AST_CID_P(ast), l);
newbc->oad[l-1] = 0;
}
}
{
struct chan_list *ch=MISDN_ASTERISK_TECH_PVT(ast);
if (!ch) { ast_verbose("No chan_list in misdn_call\n"); return -1;}
newbc->capability=ast->transfercapability;
pbx_builtin_setvar_helper(ast,"TRANSFERCAPABILITY",ast_transfercapability2str(newbc->capability));
if ( ast->transfercapability == INFO_CAPABILITY_DIGITAL_UNRESTRICTED) {
chan_misdn_log(2, port, " --> * Call with flag Digital\n");
}
/* update screening and presentation */
update_config(ch,ORG_AST);
/* fill in some ies from channel vary*/
import_ch(ast, newbc, ch);
/* Finally The Options Override Everything */
if (opts)
misdn_set_opt_exec(ast,opts);
else
chan_misdn_log(2,port,"NO OPTS GIVEN\n");
/*check for bridging*/
int bridging;
misdn_cfg_get( 0, MISDN_GEN_BRIDGING, &bridging, sizeof(int));
if (bridging && ch->other_ch) {
chan_misdn_log(1, port, "Disabling EC (aka Pipeline) on both Sides\n");
*ch->bc->pipeline=0;
*ch->other_ch->bc->pipeline=0;
}
r=misdn_lib_send_event( newbc, EVENT_SETUP );
/** we should have l3id after sending setup **/
ch->l3id=newbc->l3_id;
}
if ( r == -ENOCHAN ) {
chan_misdn_log(0, port, " --> * Theres no Channel at the moment .. !\n");
chan_misdn_log(1, port, " --> * SEND: State Down pid:%d\n",newbc?newbc->pid:-1);
ast->hangupcause=34;
ast_setstate(ast, AST_STATE_DOWN);
return -1;
}
chan_misdn_log(2, port, " --> * SEND: State Dialing pid:%d\n",newbc?newbc->pid:1);
ast_setstate(ast, AST_STATE_DIALING);
ast->hangupcause=16;
wenn pattern available soll gestoppt werden, sonst nicht:
if (newbc->nt) stop_bc_tones(ch);
ch->state=MISDN_CALLING;
return 0;
}
static struct ast_channel_tech misdn_tech = {
.type="lcr",
.description="Channel driver for connecting to Linux-Call-Router",
@ -542,12 +706,13 @@ int load_module(void)
return -1;
}
ast_cli_register(&cli_show_cls);
ast_cli_register(&cli_show_cl);
ast_cli_register(&cli_show_config);
ast_cli_register(&cli_reload);
ast_cli_register(&cli_show_lcr);
ast_cli_register(&cli_show_calls);
ast_cli_register(&cli_reload_routing);
ast_cli_register(&cli_reload_interfaces);
ast_cli_register(&cli_port_block);
ast_cli_register(&cli_port_unblock);
ast_register_application("misdn_set_opt", misdn_set_opt_exec, "misdn_set_opt",
"misdn_set_opt(:<opt><optarg>:<opt><optarg>..):\n"
@ -582,10 +747,12 @@ int unload_module(void)
if (!g_config_initialized) return 0;
ast_cli_unregister(&cli_show_cls);
ast_cli_unregister(&cli_show_cl);
ast_cli_unregister(&cli_show_config);
ast_cli_unregister(&cli_reload);
ast_cli_unregister(&cli_show_lcr);
ast_cli_unregister(&cli_show_calls);
ast_cli_unregister(&cli_reload_routing);
ast_cli_unregister(&cli_reload_interfaces);
ast_cli_unregister(&cli_port_block);
ast_cli_unregister(&cli_port_unblock);
ast_unregister_application("misdn_set_opt");
ast_channel_unregister(&lcr_tech);

View File

@ -14,6 +14,8 @@ struct chan_call {
struct chan_call *next;
unsigned long ref; /* callref, is 0, if not yet set */
unsigned long bchannel_handle; /* reference to bchannel, if set */
unsigned short bridge_id; /* 0 = off, equal ids are bridged */
};

View File

@ -25,8 +25,6 @@ extern "C" {
#include <mISDNuser/net_l2.h>
}
//#define CENTREX
#include "q931.h"
#include "ie.cpp"
@ -501,11 +499,9 @@ void Pdss1::setup_ind(unsigned long prim, unsigned long dinfo, void *data)
dec_ie_calling_pn(setup->CALLING_PN, (Q931_info_t *)((unsigned long)data+headerlen), &calling_type, &calling_plan, &calling_present, &calling_screen, (unsigned char *)p_callerinfo.id, sizeof(p_callerinfo.id));
dec_ie_called_pn(setup->CALLED_PN, (Q931_info_t *)((unsigned long)data+headerlen), &called_type, &called_plan, (unsigned char *)p_dialinginfo.id, sizeof(p_dialinginfo.id));
dec_ie_keypad(setup->KEYPAD, (Q931_info_t *)((unsigned long)data+headerlen), (unsigned char *)keypad, sizeof(keypad));
#ifdef CENTREX
/* te-mode: CNIP (calling name identification presentation) */
if (!p_m_d_ntmode)
dec_facility_centrex(setup->FACILITY, (Q931_info_t *)((unsigned long)data+headerlen), (unsigned char *)p_callerinfo.name, sizeof(p_callerinfo.name));
#endif
dec_ie_useruser(setup->USER_USER, (Q931_info_t *)((unsigned long)data+headerlen), &useruser_protocol, useruser, &useruser_len);
dec_ie_complete(setup->COMPLETE, (Q931_info_t *)((unsigned long)data+headerlen), &p_dialinginfo.sending_complete);
dec_ie_redir_nr(setup->REDIR_NR, (Q931_info_t *)((unsigned long)data+headerlen), &redir_type, &redir_plan, &redir_present, &redir_screen, &redir_reason, (unsigned char *)p_redirinfo.id, sizeof(p_redirinfo.id));
@ -1016,11 +1012,9 @@ void Pdss1::connect_ind(unsigned long prim, unsigned long dinfo, void *data)
l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN);
dec_ie_channel_id(connect->CHANNEL_ID, (Q931_info_t *)((unsigned long)data+headerlen), &exclusive, &channel);
dec_ie_connected_pn(connect->CONNECT_PN, (Q931_info_t *)((unsigned long)data+headerlen), &type, &plan, &present, &screen, (unsigned char *)p_connectinfo.id, sizeof(p_connectinfo.id));
#ifdef CENTREX
/* te-mode: CONP (connected name identification presentation) */
if (!p_m_d_ntmode)
dec_facility_centrex(connect->FACILITY, (Q931_info_t *)((unsigned long)data+headerlen), (unsigned char *)p_connectinfo.name, sizeof(p_connectinfo.name));
#endif
end_trace();
/* select channel */
@ -2310,11 +2304,9 @@ void Pdss1::message_setup(unsigned long epoint_id, int message_id, union paramet
/* display */
if (p_callerinfo.display[0] && p_m_d_ntmode)
enc_ie_display(&setup->DISPLAY, dmsg, (unsigned char *)p_callerinfo.display);
#ifdef CENTREX
/* nt-mode: CNIP (calling name identification presentation) */
if (p_callerinfo.name[0] && p_m_d_ntmode)
enc_facility_centrex(&setup->FACILITY, dmsg, (unsigned char *)p_callerinfo.name, 1);
#endif
// if (p_callerinfo.name[0] && p_m_d_ntmode)
// enc_facility_centrex(&setup->FACILITY, dmsg, (unsigned char *)p_callerinfo.name, 1);
end_trace();
/* send setup message now */
@ -2650,11 +2642,9 @@ void Pdss1::message_connect(unsigned long epoint_id, int message_id, union param
/* display */
if (p_connectinfo.display[0] && p_m_d_ntmode)
enc_ie_display(&connect->DISPLAY, dmsg, (unsigned char *)p_connectinfo.display);
#ifdef CENTREX
/* nt-mode: CONP (connected name identification presentation) */
if (p_connectinfo.name[0] && p_m_d_ntmode)
enc_facility_centrex(&connect->FACILITY, dmsg, (unsigned char *)p_connectinfo.name, 0);
#endif
// if (p_connectinfo.name[0] && p_m_d_ntmode)
// enc_facility_centrex(&connect->FACILITY, dmsg, (unsigned char *)p_connectinfo.name, 0);
/* date & time */
if (p_m_d_ntmode)
{
@ -3271,7 +3261,7 @@ int stack2manager_te(struct mISDNport *mISDNport, msg_t *msg)
if (frm->prim == (CC_RELEASE_CR | INDICATION))
{
PERROR("unhandled message from stack: call ref released (l3id=0x%x)\n", frm->dinfo);
PDEBUG(DEBUG_ISDN, "unhandled message from stack: call ref released (l3id=0x%x)\n", frm->dinfo);
free_msg(msg);
return(0);
}

1
dss1.h
View File

@ -94,7 +94,6 @@ class Pdss1 : public PmISDN
void dec_ie_redir_dn(unsigned char *p, Q931_info_t *qi, int *type, int *plan, int *present, unsigned char *number, int number_len);
void enc_ie_facility(unsigned char **ntmode, msg_t *msg, unsigned char *facility, int facility_len);
void dec_ie_facility(unsigned char *p, Q931_info_t *qi, unsigned char *facility, int *facility_len);
void enc_facility_centrex(unsigned char **ntmode, msg_t *msg, unsigned char *cnip, int setup);
void dec_facility_centrex(unsigned char *p, Q931_info_t *qi, unsigned char *cnip, int cnip_len);
void enc_ie_useruser(unsigned char **ntmode, msg_t *msg, int protocol, unsigned char *user, int user_len);
void dec_ie_useruser(unsigned char *p, Q931_info_t *qi, int *protocol, unsigned char *user, int *user_len);

View File

@ -396,24 +396,6 @@ int read_extension(struct extension *ext, char *num)
PDEBUG(DEBUG_CONFIG, "unknown parameter given keypad: %s\n", param);
}
} else
if (!strcmp(option,"centrex"))
{
i=0;
while(ext_yesno[i])
{
if (!strcasecmp(param,ext_yesno[i]))
break;
i++;
}
if (ext_yesno[i])
{
ext->centrex = i;
PDEBUG(DEBUG_CONFIG, "use centrex to display name %s\n", ext_yesno[i]);
} else
{
PDEBUG(DEBUG_CONFIG, "unknown parameter given centrex: %s\n", param);
}
} else
if (!strcmp(option,"rights"))
{
i=0;
@ -1094,11 +1076,6 @@ int write_extension(struct extension *ext, char *number)
fprintf(fp,"# DTMF tone, but the digit is transmitted via D-channel diaing info.\n");
fprintf(fp,"keypad %s\n\n",(ext->keypad)?"yes":"no");
fprintf(fp,"# Called Name Identification Presentation (CNIP/CONP)\n");
fprintf(fp,"# If supported by telephone, special information element on the d-channel are\n");
fprintf(fp,"# used to show name of caller. It is supported by newer Siemens telephones\n# (Centrex).\n");
fprintf(fp,"centrex %s #this is currently not working!!!\n\n",(ext->centrex)?"yes":"no");
fprintf(fp,"# Ignore restriction of COLP and CLIP\n");
fprintf(fp,"# In this case even restricted numbers are presented to this extension.\n");
fprintf(fp,"# This also works for incoming external anonymous calls IF:\n");

View File

@ -132,7 +132,6 @@ struct extension {
int colp; /* how to present called line id on forwarded calls */
char clip_prefix[32]; /* prefix for screening incoming clip */
int keypad; /* support keypad for call control */
int centrex; /* present name of caller/called on internal extension */
int anon_ignore; /* ignore anonymouse calls */
int rights;
int delete_ext; /* delete function for external dialing */

14
genrc.c
View File

@ -171,14 +171,14 @@ int main(void)
fprintf(fp, "# rc script for mISDN driver\n\n");
fprintf(fp, "case \"$1\" in\n");
fprintf(fp, "\tstart|--start)\n");
fprintf(fp, "\t\t%s %smISDN_core%s debug=0x%x\n", input[0]?"insmod -f":"modprobe", input, input[0]?".ko":"", coredebug);
fprintf(fp, "\t\t%s %smISDN_core%s debug=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, input[0]?".ko":"", coredebug);
if (anyte)
{
fprintf(fp, "\t\t%s %smISDN_l1%s debug=0x%x\n", input[0]?"insmod -f":"modprobe", input, input[0]?".ko":"", l1debug);
fprintf(fp, "\t\t%s %smISDN_l2%s debug=0x%x\n", input[0]?"insmod -f":"modprobe", input, input[0]?".ko":"", l2debug);
fprintf(fp, "\t\t%s %sl3udss1%s debug=0x%x\n", input[0]?"insmod -f":"modprobe", input, input[0]?".ko":"", l3debug);
fprintf(fp, "\t\t%s %smISDN_l1%s debug=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, input[0]?".ko":"", l1debug);
fprintf(fp, "\t\t%s %smISDN_l2%s debug=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, input[0]?".ko":"", l2debug);
fprintf(fp, "\t\t%s %sl3udss1%s debug=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, input[0]?".ko":"", l3debug);
}
fprintf(fp, "\t\t%s %smISDN_dsp%s debug=0x%x options=0x%x\n", input[0]?"insmod -f":"modprobe", input, input[0]?".ko":"", dspdebug, lawopt);
fprintf(fp, "\t\t%s %smISDN_dsp%s debug=0x%x options=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, input[0]?".ko":"", dspdebug, lawopt);
j = 0;
while(cards[j].card)
{
@ -202,9 +202,9 @@ int main(void)
if (types[0])
{
types[strlen(types)-1] = '\0';
fprintf(fp, "\t\t%s %s%s%s type=%s protocol=%s layermask=%s debug=0x%x\n", input[0]?"insmod -f":"modprobe", input, cards[j].module, input[0]?".ko":"", types, protocol, layermask, carddebug);
fprintf(fp, "\t\t%s %s%s%s type=%s protocol=%s layermask=%s debug=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, cards[j].module, input[0]?".ko":"", types, protocol, layermask, carddebug);
} else
fprintf(fp, "\t\t%s %s%s%s protocol=%s layermask=%s debug=0x%x\n", input[0]?"insmod -f":"modprobe", input, cards[j].module, input[0]?".ko":"", protocol, layermask, carddebug);
fprintf(fp, "\t\t%s %s%s%s protocol=%s layermask=%s debug=0x%x\n", input[0]?"insmod -f":"modprobe --ignore-install", input, cards[j].module, input[0]?".ko":"", protocol, layermask, carddebug);
}
j++;
}

52
ie.cpp
View File

@ -1450,58 +1450,6 @@ void Pdss1::dec_ie_facility(unsigned char *p, Q931_info_t *qi, unsigned char *fa
}
/* facility for siemens CENTEX (known parts implemented only) */
void Pdss1::enc_facility_centrex(unsigned char **ntmode, msg_t *msg, unsigned char *cnip, int setup)
{
unsigned char centrex[256];
int i = 0;
if (!cnip)
return;
/* centrex facility */
centrex[i++] = CENTREX_FAC;
centrex[i++] = CENTREX_ID;
/* cnip */
if (strlen((char *)cnip) > 15)
{
PDEBUG(DEBUG_PORT, "%s: CNIP/CONP text too long (max 13 chars), cutting.\n");
cnip[15] = '\0';
}
// dunno what the 8 bytes mean
if (setup)
{
centrex[i++] = 0x17;
centrex[i++] = 0x02;
centrex[i++] = 0x02;
centrex[i++] = 0x44;
centrex[i++] = 0x18;
centrex[i++] = 0x02;
centrex[i++] = 0x01;
centrex[i++] = 0x09;
} else
{
centrex[i++] = 0x18;
centrex[i++] = 0x02;
centrex[i++] = 0x02;
centrex[i++] = 0x81;
centrex[i++] = 0x09;
centrex[i++] = 0x02;
centrex[i++] = 0x01;
centrex[i++] = 0x0a;
}
centrex[i++] = 0x80;
centrex[i++] = strlen((char *)cnip);
UCPY((char *)(&centrex[i]), (char *)cnip);
i += strlen((char *)cnip);
add_trace("facility", "cnip", "%s", cnip);
/* encode facility */
enc_ie_facility(ntmode, msg, centrex, i);
}
void Pdss1::dec_facility_centrex(unsigned char *p, Q931_info_t *qi, unsigned char *cnip, int cnip_len)
{
unsigned char centrex[256];

View File

@ -27,7 +27,7 @@
#include "joinpbx.h"
#include "extension.h"
#include "message.h"
#include "admin.h"
#include "lcrsocket.h"
#include "cause.h"
#define LTEE {addch(ACS_LTEE);addch(ACS_HLINE);addch(ACS_HLINE);}

View File

@ -9,7 +9,6 @@
** **
\*****************************************************************************/
#include "main.h"
#include <poll.h>
#include <errno.h>
@ -32,6 +31,43 @@ extern "C" {
}
#endif
#ifndef CMX_TXDATA_ON
#define OLD_MISDN
#endif
#ifndef CMX_TXDATA_OFF
#define OLD_MISDN
#endif
#ifndef CMX_DELAY
#define OLD_MISDN
#endif
#ifndef PIPELINE_CFG
#define OLD_MISDN
#endif
#ifndef CMX_TX_DATA
#define OLD_MISDN
#endif
#ifdef OLD_MISDN
#warning
#warning *********************************************************
#warning *
#warning * It seems that you use an older version of mISDN.
#warning * Features like voice recording or echo will not work.
#warning * Also it causes problems with loading modules and may
#warning * not work at all.
#warning *
#warning * Please upgrade to newer version. A working version can
#warning * be found at www.linux-call-router.de.
#warning *
#warning * Do not use the mISDN_1_1 branch, it does not have all
#warning * the features that are required. Use the master branch
#warning * instead.
#warning *
#warning *********************************************************
#warning
#error
#endif
#ifndef ISDN_PID_L4_B_USER
#define ISDN_PID_L4_B_USER 0x440000ff
#endif
@ -633,16 +669,20 @@ static void _bchannel_configure(struct mISDNport *mISDNport, int i)
}
/* set dsp features */
#ifndef OLD_MISDN
if (port->p_m_txdata)
ph_control(mISDNport, port, handle, (port->p_m_txdata)?CMX_TXDATA_ON:CMX_TXDATA_OFF, 0, "DSP-TXDATA", port->p_m_txdata);
if (port->p_m_delay)
ph_control(mISDNport, port, handle, CMX_DELAY, port->p_m_delay, "DSP-DELAY", port->p_m_delay);
#endif
if (port->p_m_tx_gain)
ph_control(mISDNport, port, handle, VOL_CHANGE_TX, port->p_m_tx_gain, "DSP-TX_GAIN", port->p_m_tx_gain);
if (port->p_m_rx_gain)
ph_control(mISDNport, port, handle, VOL_CHANGE_RX, port->p_m_rx_gain, "DSP-RX_GAIN", port->p_m_rx_gain);
#ifndef OLD_MISDN
if (port->p_m_pipeline[0])
ph_control_block(mISDNport, port, handle, PIPELINE_CFG, port->p_m_pipeline, strlen(port->p_m_pipeline)+1, "DSP-PIPELINE", 0);
#endif
if (port->p_m_conf)
ph_control(mISDNport, port, handle, CMX_CONF_JOIN, port->p_m_conf, "DSP-CONF", port->p_m_conf);
if (port->p_m_echo)
@ -1570,6 +1610,7 @@ void PmISDN::bchannel_receive(iframe_t *frm)
{
switch(frm->dinfo)
{
#ifndef OLD_MISDN
case CMX_TX_DATA:
if (!p_m_txdata)
{
@ -1585,6 +1626,7 @@ void PmISDN::bchannel_receive(iframe_t *frm)
if (p_record)
record(data, len, 1); // from up
break;
#endif
default:
chan_trace_header(p_m_mISDNport, this, "BCHANNEL signal", DIRECTION_IN);
@ -1870,12 +1912,14 @@ void PmISDN::message_mISDNsignal(unsigned long epoint_id, int message_id, union
{
p_m_delay = param->mISDNsignal.delay;
PDEBUG(DEBUG_BCHANNEL, "we change delay mode to delay=%d.\n", p_m_delay);
#ifndef OLD_MISDN
if (p_m_b_index >= 0)
if (p_m_mISDNport->b_state[p_m_b_index] == B_STATE_ACTIVE)
#ifdef SOCKET_MISDN
ph_control(p_m_mISDNport, this, p_m_mISDNport->b_socket[p_m_b_index], p_m_delay?CMX_DELAY:CMX_JITTER, p_m_delay, "DSP-DELAY", p_m_delay);
#else
ph_control(p_m_mISDNport, this, p_m_mISDNport->b_addr[p_m_b_index], p_m_delay?CMX_DELAY:CMX_JITTER, p_m_delay, "DSP-DELAY", p_m_delay);
#endif
#endif
} else
PDEBUG(DEBUG_BCHANNEL, "we already have delay=%d.\n", p_m_delay);
@ -2208,8 +2252,10 @@ int mISDN_handler(void)
/* turn on RX */
isdnport->p_m_txdata = 1;
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is required, so we turn them on\n");
#ifndef OLD_MISDN
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_addr[isdnport->p_m_b_index], CMX_TXDATA_ON, 0, "DSP-TXDATA", 1);
#endif
return(1);
}
} else
@ -2220,8 +2266,10 @@ int mISDN_handler(void)
/* turn off RX */
isdnport->p_m_txdata = 0;
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is not required, so we turn them off\n");
#ifndef OLD_MISDN
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_addr[isdnport->p_m_b_index], CMX_TXDATA_OFF, 0, "DSP-TXDATA", 0);
#endif
return(1);
}
}

2
main.h
View File

@ -140,7 +140,7 @@ extern "C" {
#include "alawulaw.h"
#include "tones.h"
#include "crypt.h"
#include "admin_server.h"
#include "socket_server.h"
#include "trace.h"
extern double now_d;

View File

@ -9,7 +9,7 @@
** **
\*****************************************************************************/
#include "admin.h"
#include "lcrsocket.h"
struct admin_queue {
struct admin_queue *next;

View File

@ -1,3 +1,25 @@
chan_lcr:
show calls
show lcr
block/unblock port
reload interfaces/routing
release call
setup: es werden setupdaten gespeichert, bis eine ref vom lcr erfolgt.
dabei werden zusätzliche wahlinformationen der rufummer hinzugefügt.
bridge: jede instanz (chan_call) hat eine bridge_id
wenn keine bridge, dann ist sie 0.
mit new_bridge_id() wird eine neue id gesucht. diese wird in beide instanzen eingetragen
zudem wird fuer jede instanz (zwei) der bridge eine bchannel_join ausgeführt, wenn die bchannels verfügbar sind.
schon implementiert: falls der bchannel später kommt, wird der join beim exporieren des b-channels ausgeführt.
doku: rx_vol -> rx_gain
context
@ -26,20 +48,5 @@ delay - per param setzen, lokal als mISDNsignal und remote mittels setup
old stuff....
NOTE: check CENTREX
durchstellen mit disconnect
durchstellen mit keypad
short ring
sleep relaxed
auto pick
alarm clock (timer)
sonderwahlton
facility: diversion, 3pty, ...