@ -132,7 +132,6 @@ enum misdn_chan_state {
/* misdn_hangup */
/* misdn_hangup */
MISDN_HOLDED , /*!< if this chan is holded */
MISDN_HOLDED , /*!< if this chan is holded */
MISDN_HOLD_DISCONNECT , /*!< if this chan is holded */
MISDN_HOLD_DISCONNECT , /*!< if this chan is holded */
MISDN_FIXUP /*!< if this chan is holded */
} ;
} ;
@ -778,6 +777,20 @@ static int misdn_restart_port (int fd, int argc, char *argv[])
return 0 ;
return 0 ;
}
}
static int misdn_restart_pid ( int fd , int argc , char * argv [ ] )
{
int pid ;
if ( argc ! = 4 )
return RESULT_SHOWUSAGE ;
pid = atoi ( argv [ 3 ] ) ;
misdn_lib_pid_restart ( pid ) ;
return 0 ;
}
static int misdn_port_up ( int fd , int argc , char * argv [ ] )
static int misdn_port_up ( int fd , int argc , char * argv [ ] )
{
{
int port ;
int port ;
@ -933,7 +946,6 @@ static struct state_struct state_array[] = {
{ MISDN_HUNGUP_FROM_MISDN , " HUNGUP_FROM_MISDN " } , /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */
{ MISDN_HUNGUP_FROM_MISDN , " HUNGUP_FROM_MISDN " } , /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */
{ MISDN_HOLDED , " HOLDED " } , /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */
{ MISDN_HOLDED , " HOLDED " } , /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */
{ MISDN_HOLD_DISCONNECT , " HOLD_DISCONNECT " } , /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */
{ MISDN_HOLD_DISCONNECT , " HOLD_DISCONNECT " } , /* when DISCONNECT/RELEASE/REL_COMP cam from misdn */
{ MISDN_FIXUP , " FIXUP " } , /**/
{ MISDN_HUNGUP_FROM_AST , " HUNGUP_FROM_AST " } /* when DISCONNECT/RELEASE/REL_COMP came out of */
{ MISDN_HUNGUP_FROM_AST , " HUNGUP_FROM_AST " } /* when DISCONNECT/RELEASE/REL_COMP came out of */
/* misdn_hangup */
/* misdn_hangup */
} ;
} ;
@ -1411,6 +1423,8 @@ static struct ast_cli_entry chan_misdn_clis[] = {
" Usage: misdn port unblock \n " } ,
" Usage: misdn port unblock \n " } ,
{ { " misdn " , " restart " , " port " , NULL } , misdn_restart_port , " Restarts the given port " ,
{ { " misdn " , " restart " , " port " , NULL } , misdn_restart_port , " Restarts the given port " ,
" Usage: misdn restart port \n " } ,
" Usage: misdn restart port \n " } ,
{ { " misdn " , " restart " , " pid " , NULL } , misdn_restart_pid , " Restarts the given pid " ,
" Usage: misdn restart pid \n " } ,
{ { " misdn " , " port " , " up " , NULL } , misdn_port_up , " Tries to establish L1 on the given port " ,
{ { " misdn " , " port " , " up " , NULL } , misdn_port_up , " Tries to establish L1 on the given port " ,
" Usage: misdn port up <port> \n " } ,
" Usage: misdn port up <port> \n " } ,
{ { " misdn " , " port " , " down " , NULL } , misdn_port_down , " Tries to deacivate the L1 on the given port " ,
{ { " misdn " , " port " , " down " , NULL } , misdn_port_down , " Tries to deacivate the L1 on the given port " ,
@ -1427,7 +1441,6 @@ static struct ast_cli_entry chan_misdn_clis[] = {
" Usage: misdn set crypt debug <level> \n " }
" Usage: misdn set crypt debug <level> \n " }
} ;
} ;
static int update_config ( struct chan_list * ch , int orig )
static int update_config ( struct chan_list * ch , int orig )
{
{
if ( ! ch ) {
if ( ! ch ) {
@ -1952,6 +1965,15 @@ static int misdn_call(struct ast_channel *ast, char *dest, int timeout)
else
else
chan_misdn_log ( 2 , port , " NO OPTS GIVEN \n " ) ;
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 ( 0 , port , " Disabling EC on both Sides \n " ) ;
ch - > bc - > ec_enable = 0 ;
ch - > other_ch - > bc - > ec_enable = 0 ;
}
r = misdn_lib_send_event ( newbc , EVENT_SETUP ) ;
r = misdn_lib_send_event ( newbc , EVENT_SETUP ) ;
/** we should have l3id after sending setup **/
/** we should have l3id after sending setup **/
@ -2026,7 +2048,6 @@ static int misdn_answer(struct ast_channel *ast)
}
}
p - > state = MISDN_CONNECTED ;
p - > state = MISDN_CONNECTED ;
misdn_lib_echo ( p - > bc , 0 ) ;
stop_indicate ( p ) ;
stop_indicate ( p ) ;
if ( ast_strlen_zero ( p - > bc - > cad ) ) {
if ( ast_strlen_zero ( p - > bc - > cad ) ) {
@ -2113,7 +2134,6 @@ static int misdn_fixup(struct ast_channel *oldast, struct ast_channel *ast)
chan_misdn_log ( 1 , p - > bc ? p - > bc - > port : 0 , " * IND: Got Fixup State:%s L3id:%x \n " , misdn_get_ch_state ( p ) , p - > l3id ) ;
chan_misdn_log ( 1 , p - > bc ? p - > bc - > port : 0 , " * IND: Got Fixup State:%s L3id:%x \n " , misdn_get_ch_state ( p ) , p - > l3id ) ;
p - > ast = ast ;
p - > ast = ast ;
p - > state = MISDN_FIXUP ;
return 0 ;
return 0 ;
}
}
@ -2248,7 +2268,7 @@ static int misdn_indication(struct ast_channel *ast, int cond, const void *data,
chan_misdn_log ( 1 , p - > bc - > port , " --> * \t UNHOLD pid:%d \n " , p - > bc ? p - > bc - > pid : - 1 ) ;
chan_misdn_log ( 1 , p - > bc - > port , " --> * \t UNHOLD pid:%d \n " , p - > bc ? p - > bc - > pid : - 1 ) ;
break ;
break ;
default :
default :
ast_log( LOG_NOTICE , " --> * Unknown Indication:%d pid:%d \n " , cond , p - > bc ? p - > bc - > pid : - 1 ) ;
chan_misdn_log( 1 , p - > bc - > port , " --> * Unknown Indication:%d pid:%d \n " , cond , p - > bc ? p - > bc - > pid : - 1 ) ;
}
}
return 0 ;
return 0 ;
@ -2281,7 +2301,6 @@ static int misdn_hangup(struct ast_channel *ast)
if ( ast - > _state = = AST_STATE_RESERVED | |
if ( ast - > _state = = AST_STATE_RESERVED | |
p - > state = = MISDN_NOTHING | |
p - > state = = MISDN_NOTHING | |
p - > state = = MISDN_HOLDED | |
p - > state = = MISDN_HOLDED | |
p - > state = = MISDN_FIXUP | |
p - > state = = MISDN_HOLD_DISCONNECT ) {
p - > state = = MISDN_HOLD_DISCONNECT ) {
CLEAN_CH :
CLEAN_CH :
@ -2677,28 +2696,11 @@ static enum ast_bridge_result misdn_bridge (struct ast_channel *c0,
else
else
return - 1 ;
return - 1 ;
int bridging ;
int bridging ;
misdn_cfg_get ( 0 , MISDN_GEN_BRIDGING , & bridging , sizeof ( int ) ) ;
misdn_cfg_get ( 0 , MISDN_GEN_BRIDGING , & bridging , sizeof ( int ) ) ;
if ( bridging ) {
if ( bridging ) {
int ecwb , ec ;
misdn_cfg_get ( ch1 - > bc - > port , MISDN_CFG_ECHOCANCELWHENBRIDGED , & ecwb , sizeof ( int ) ) ;
misdn_cfg_get ( ch1 - > bc - > port , MISDN_CFG_ECHOCANCEL , & ec , sizeof ( int ) ) ;
if ( ! ecwb & & ec ) {
chan_misdn_log ( 2 , ch1 - > bc - > port , " Disabling Echo Cancellor when Bridged \n " ) ;
ch1 - > bc - > ec_enable = 0 ;
manager_ec_disable ( ch1 - > bc ) ;
}
misdn_cfg_get ( ch2 - > bc - > port , MISDN_CFG_ECHOCANCELWHENBRIDGED , & ecwb , sizeof ( int ) ) ;
misdn_cfg_get ( ch2 - > bc - > port , MISDN_CFG_ECHOCANCEL , & ec , sizeof ( int ) ) ;
if ( ! ecwb & & ec ) {
chan_misdn_log ( 2 , ch2 - > bc - > port , " Disabling Echo Cancellor when Bridged \n " ) ;
ch2 - > bc - > ec_enable = 0 ;
manager_ec_disable ( ch2 - > bc ) ;
}
/* trying to make a mISDN_dsp conference */
/* trying to make a mISDN_dsp conference */
chan_misdn_log ( 1 , ch1 - > bc - > port , " I SEND: Making conference with Number:%d \n " , ch1 - > bc - > pid + 1 ) ;
chan_misdn_log ( 1 , ch1 - > bc - > port , " I SEND: Making conference with Number:%d \n " , ch1 - > bc - > pid + 1 ) ;
misdn_lib_bridge ( ch1 - > bc , ch2 - > bc ) ;
misdn_lib_bridge ( ch1 - > bc , ch2 - > bc ) ;
}
}
@ -2777,6 +2779,10 @@ static int dialtone_indicate(struct chan_list *cl)
const struct ind_tone_zone_sound * ts = NULL ;
const struct ind_tone_zone_sound * ts = NULL ;
struct ast_channel * ast = cl - > ast ;
struct ast_channel * ast = cl - > ast ;
if ( ! ast ) {
chan_misdn_log ( 0 , cl - > bc - > port , " No Ast in dialtone_indicate \n " ) ;
return - 1 ;
}
int nd = 0 ;
int nd = 0 ;
misdn_cfg_get ( cl - > bc - > port , MISDN_CFG_NODIALTONE , & nd , sizeof ( nd ) ) ;
misdn_cfg_get ( cl - > bc - > port , MISDN_CFG_NODIALTONE , & nd , sizeof ( nd ) ) ;
@ -2810,6 +2816,12 @@ static int hanguptone_indicate(struct chan_list *cl)
static int stop_indicate ( struct chan_list * cl )
static int stop_indicate ( struct chan_list * cl )
{
{
struct ast_channel * ast = cl - > ast ;
struct ast_channel * ast = cl - > ast ;
if ( ! ast ) {
chan_misdn_log ( 0 , cl - > bc - > port , " No Ast in stop_indicate \n " ) ;
return - 1 ;
}
chan_misdn_log ( 3 , cl - > bc - > port , " --> None \n " ) ;
chan_misdn_log ( 3 , cl - > bc - > port , " --> None \n " ) ;
misdn_lib_tone_generator_stop ( cl - > bc ) ;
misdn_lib_tone_generator_stop ( cl - > bc ) ;
ast_playtones_stop ( ast ) ;
ast_playtones_stop ( ast ) ;
@ -3553,6 +3565,11 @@ void import_ch(struct ast_channel *chan, struct misdn_bchannel *bc, struct chan_
if ( ch - > other_ch ) ch - > other_ch - > other_ch = ch ;
if ( ch - > other_ch ) ch - > other_ch - > other_ch = ch ;
}
}
}
}
tmp = pbx_builtin_getvar_helper ( chan , " MISDN_ADDRESS_COMPLETE " ) ;
if ( tmp & & ( atoi ( tmp ) = = 1 ) ) {
bc - > sending_complete = 1 ;
}
}
}
void export_ch ( struct ast_channel * chan , struct misdn_bchannel * bc , struct chan_list * ch )
void export_ch ( struct ast_channel * chan , struct misdn_bchannel * bc , struct chan_list * ch )
@ -3561,6 +3578,16 @@ void export_ch(struct ast_channel *chan, struct misdn_bchannel *bc, struct chan_
chan_misdn_log ( 3 , bc - > port , " --> EXPORT_PID: pid:%d \n " , bc - > pid ) ;
chan_misdn_log ( 3 , bc - > port , " --> EXPORT_PID: pid:%d \n " , bc - > pid ) ;
sprintf ( tmp , " %d " , bc - > pid ) ;
sprintf ( tmp , " %d " , bc - > pid ) ;
pbx_builtin_setvar_helper ( chan , " _MISDN_PID " , tmp ) ;
pbx_builtin_setvar_helper ( chan , " _MISDN_PID " , tmp ) ;
if ( bc - > sending_complete ) {
sprintf ( tmp , " %d " , bc - > sending_complete ) ;
pbx_builtin_setvar_helper ( chan , " MISDN_ADDRESS_COMPLETE " , tmp ) ;
}
if ( bc - > urate ) {
sprintf ( tmp , " %d " , bc - > urate ) ;
pbx_builtin_setvar_helper ( chan , " MISDN_URATE " , tmp ) ;
}
}
}
int add_in_calls ( int port )
int add_in_calls ( int port )
@ -3608,7 +3635,6 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
if ( event ! = EVENT_BCHAN_DATA & & event ! = EVENT_TONE_GENERATE ) { /* Debug Only Non-Bchan */
if ( event ! = EVENT_BCHAN_DATA & & event ! = EVENT_TONE_GENERATE ) { /* Debug Only Non-Bchan */
int debuglevel = 1 ;
int debuglevel = 1 ;
if ( event = = EVENT_CLEANUP & & ! user_data )
if ( event = = EVENT_CLEANUP & & ! user_data )
debuglevel = 5 ;
debuglevel = 5 ;
@ -4191,8 +4217,6 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
misdn_lib_send_event ( bc , EVENT_CONNECT_ACKNOWLEDGE ) ;
misdn_lib_send_event ( bc , EVENT_CONNECT_ACKNOWLEDGE ) ;
struct ast_channel * bridged = AST_BRIDGED_P ( ch - > ast ) ;
struct ast_channel * bridged = AST_BRIDGED_P ( ch - > ast ) ;
misdn_lib_echo ( bc , 0 ) ;
stop_indicate ( ch ) ;
stop_indicate ( ch ) ;
if ( bridged & & ! strcasecmp ( bridged - > tech - > type , " mISDN " ) ) {
if ( bridged & & ! strcasecmp ( bridged - > tech - > type , " mISDN " ) ) {
@ -4378,7 +4402,11 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
int ret = write ( ch - > pipe [ 1 ] , bc - > bframe , bc - > bframe_len ) ;
int ret = write ( ch - > pipe [ 1 ] , bc - > bframe , bc - > bframe_len ) ;
if ( ret < = 0 ) {
if ( ret < = 0 ) {
chan_misdn_log ( - 1 , bc - > port , " Write returned <=0 (err=%s) \n " , strerror ( errno ) ) ;
chan_misdn_log ( - 1 , bc - > port , " Write returned <=0 (err=%s) --> hanging up channel \n " , strerror ( errno ) ) ;
stop_bc_tones ( ch ) ;
hangup_chan ( ch ) ;
release_chan ( bc ) ;
}
}
} else {
} else {
chan_misdn_log ( 1 , bc - > port , " Wripe Pipe full! \n " ) ;
chan_misdn_log ( 1 , bc - > port , " Wripe Pipe full! \n " ) ;
@ -4547,7 +4575,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
break ;
break ;
default :
default :
ast_log( LOG_NOTICE , " Got Unknown Event \n " ) ;
chan_misdn_log( 1 , 0 , " Got Unknown Event \n " ) ;
break ;
break ;
}
}
@ -4773,7 +4801,7 @@ static int misdn_facility_exec(struct ast_channel *chan, void *data)
strncpy ( ( char * ) ch - > bc - > fac_out . u . CDeflection . DeflectedToNumber , tok , sizeof ( ch - > bc - > fac_out . u . CDeflection . DeflectedToNumber ) ) ;
strncpy ( ( char * ) ch - > bc - > fac_out . u . CDeflection . DeflectedToNumber , tok , sizeof ( ch - > bc - > fac_out . u . CDeflection . DeflectedToNumber ) ) ;
misdn_lib_send_event ( ch - > bc , EVENT_FACILITY ) ;
misdn_lib_send_event ( ch - > bc , EVENT_FACILITY ) ;
} else {
} else {
ast_log( LOG_WARNING , " Unknown Facility: %s \n " , tok ) ;
chan_misdn_log( 1 , ch - > bc - > port , " Unknown Facility: %s \n " , tok ) ;
}
}
return 0 ;
return 0 ;