@ -174,6 +174,7 @@ int setup_bc(struct misdn_bchannel *bc);
int manager_isdn_handler ( iframe_t * frm , msg_t * msg ) ;
int misdn_lib_port_restart ( int port ) ;
int misdn_lib_pid_restart ( int pid ) ;
extern struct isdn_msg msgs_g [ ] ;
@ -446,7 +447,7 @@ static int find_free_chan_in_stack(struct misdn_stack *stack, int channel)
int empty_chan_in_stack ( struct misdn_stack * stack , int channel )
{
if ( channel < = 0 ) {
if ( channel < = 0 | | channel > = MAX_BCHANS ) {
cb_log ( 0 , stack ? stack - > port : 0 , " empty_chan_inst_stack: cannot empty channel %d \n " , channel ) ;
return - 1 ;
}
@ -666,7 +667,7 @@ int set_chan_in_stack(struct misdn_stack *stack, int channel)
cb_log ( 4 , stack - > port , " set_chan_in_stack: %d \n " , channel ) ;
dump_chan_list ( stack ) ;
if ( channel > = 1 ) {
if ( channel > = 1 & & channel < = MAX_BCHANS ) {
if ( ! stack - > channels [ channel - 1 ] )
stack - > channels [ channel - 1 ] = 1 ;
else {
@ -2807,7 +2808,6 @@ int handle_mgmt(msg_t *msg)
stack - > l1link = 0 ;
clear_l3 ( stack ) ;
break ;
case SSTATUS_L2_ESTABLISHED :
@ -3307,6 +3307,16 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
bc - > need_disconnect = 0 ;
bc - > need_release = 0 ;
bc - > need_release_complete = 0 ;
if ( ! stack - > nt ) {
/*create clenaup in TE*/
if ( bc - > channel > 0 )
empty_chan_in_stack ( stack , bc - > channel ) ;
int tmpcause = bc - > cause ;
empty_bc ( bc ) ;
bc - > cause = tmpcause ;
clean_up_bc ( bc ) ;
}
break ;
case EVENT_CONNECT_ACKNOWLEDGE :
@ -3558,6 +3568,15 @@ int queue_cleanup_bc(struct misdn_bchannel *bc)
}
int misdn_lib_pid_restart ( int pid )
{
struct misdn_bchannel * bc = manager_find_bc_by_pid ( pid ) ;
if ( bc ) {
manager_clean_bc ( bc ) ;
}
}
int misdn_lib_port_restart ( int port )
{
struct misdn_stack * stack = find_stack_by_port ( port ) ;
@ -4042,7 +4061,7 @@ void manager_clean_bc(struct misdn_bchannel *bc )
empty_chan_in_stack ( stack , bc - > channel ) ;
empty_bc ( bc ) ;
misdn_lib_send_event( bc , EVENT_RELEASE_COMPLETE ) ;
cb_event( EVENT_CLEANUP , bc , NULL ) ;
}