@ -649,17 +649,12 @@ static int clean_up_bc(struct misdn_bchannel *bc)
cb_log ( 2 , stack - > port , " $$$ Cleaning up bc with stid :%x pid:%d \n " , bc - > b_stid , bc - > pid ) ;
cb_log ( 2 , stack - > port , " $$$ Cleaning up bc with stid :%x pid:%d \n " , bc - > b_stid , bc - > pid ) ;
manager_bchannel_deactivate ( bc ) ;
manager_ec_disable ( bc ) ;
manager_ec_disable ( bc ) ;
manager_bchannel_deactivate ( bc ) ;
mISDN_write_frame ( stack - > midev , buff , bc - > layer_id | FLG_MSG_TARGET | FLG_MSG_DOWN , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
mISDN_write_frame ( stack - > midev , buff , bc - > layer_id | FLG_MSG_TARGET | FLG_MSG_DOWN , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
/*mISDN_clear_stack(stack->midev, bc->b_stid);*/
bc - > b_stid = 0 ;
bc - > b_stid = 0 ;
bc_state_change ( bc , BCHAN_CLEANED ) ;
bc_state_change ( bc , BCHAN_CLEANED ) ;
@ -1032,6 +1027,7 @@ int setup_bc(struct misdn_bchannel *bc)
mISDN_write_frame ( midev , buff , bc - > layer_id , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
mISDN_write_frame ( midev , buff , bc - > layer_id , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
bc_state_change ( bc , BCHAN_ERROR ) ;
bc_state_change ( bc , BCHAN_ERROR ) ;
cb_event ( EVENT_BCHAN_ERROR , bc , glob_mgr - > user_data ) ;
return ( - EINVAL ) ;
return ( - EINVAL ) ;
}
}
@ -1042,6 +1038,7 @@ int setup_bc(struct misdn_bchannel *bc)
mISDN_write_frame ( midev , buff , bc - > layer_id , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
mISDN_write_frame ( midev , buff , bc - > layer_id , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
bc_state_change ( bc , BCHAN_ERROR ) ;
bc_state_change ( bc , BCHAN_ERROR ) ;
cb_event ( EVENT_BCHAN_ERROR , bc , glob_mgr - > user_data ) ;
return ( - EINVAL ) ;
return ( - EINVAL ) ;
}
}
@ -1054,6 +1051,8 @@ int setup_bc(struct misdn_bchannel *bc)
mISDN_write_frame ( midev , buff , bc - > layer_id , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
mISDN_write_frame ( midev , buff , bc - > layer_id , MGR_DELLAYER | REQUEST , 0 , 0 , NULL , TIMEOUT_1SEC ) ;
bc_state_change ( bc , BCHAN_ERROR ) ;
bc_state_change ( bc , BCHAN_ERROR ) ;
cb_event ( EVENT_BCHAN_ERROR , bc , glob_mgr - > user_data ) ;
return ( - EINVAL ) ;
}
}
manager_bchannel_activate ( bc ) ;
manager_bchannel_activate ( bc ) ;
@ -1538,12 +1537,15 @@ static int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_
return 0 ;
return 0 ;
}
}
static int handle_ new_process( struct misdn_stack * stack , iframe_t * frm )
static int handle_ cr ( struct misdn_stack * stack , iframe_t * frm )
{
{
if ( ! stack ) return - 1 ;
struct misdn_bchannel * bc = misdn_lib_get_free_bc ( stack - > port , 0 , 1 ) ;
switch ( frm - > prim ) {
case CC_NEW_CR | INDICATION :
cb_log ( 7 , stack - > port , " --> lib: NEW_CR Ind with l3id:%x on this port. \n " , frm - > dinfo ) ;
struct misdn_bchannel * bc = misdn_lib_get_free_bc ( stack - > port , 0 , 1 ) ;
if ( ! bc ) {
if ( ! bc ) {
cb_log ( 0 , stack - > port , " --> !! lib: No free channel! \n " ) ;
cb_log ( 0 , stack - > port , " --> !! lib: No free channel! \n " ) ;
return - 1 ;
return - 1 ;
@ -1551,19 +1553,6 @@ static int handle_new_process(struct misdn_stack *stack, iframe_t *frm)
cb_log ( 7 , stack - > port , " --> new_process: New L3Id: %x \n " , frm - > dinfo ) ;
cb_log ( 7 , stack - > port , " --> new_process: New L3Id: %x \n " , frm - > dinfo ) ;
bc - > l3_id = frm - > dinfo ;
bc - > l3_id = frm - > dinfo ;
return 0 ;
}
static int handle_cr ( struct misdn_stack * stack , iframe_t * frm )
{
if ( ! stack ) return - 1 ;
switch ( frm - > prim ) {
case CC_NEW_CR | INDICATION :
cb_log ( 7 , stack - > port , " --> lib: NEW_CR Ind with l3id:%x on this port. \n " , frm - > dinfo ) ;
if ( handle_new_process ( stack , frm ) < 0 ) {
return - 1 ;
}
return 1 ;
return 1 ;
case CC_NEW_CR | CONFIRM :
case CC_NEW_CR | CONFIRM :
return 1 ;
return 1 ;
@ -1796,12 +1785,10 @@ handle_event_nt(void *dat, void *arg)
case CC_SETUP | INDICATION :
case CC_SETUP | INDICATION :
{
{
iframe_t frm ; /* fake te frm to add callref to global callreflist */
struct misdn_bchannel * bc = misdn_lib_get_free_bc ( stack - > port , 0 , 1 ) ;
frm . dinfo = hh - > dinfo ;
if ( ! bc )
frm . addr = stack - > upper_id ;
ERR_NO_CHANNEL :
frm . prim = CC_NEW_CR | INDICATION ;
{
if ( handle_cr ( stack , & frm ) < 0 ) {
msg_t * dmsg ;
msg_t * dmsg ;
cb_log ( 4 , stack - > port , " Patch from MEIDANIS:Sending RELEASE_COMPLETE %x (No free Chan for you..) \n " , hh - > dinfo ) ;
cb_log ( 4 , stack - > port , " Patch from MEIDANIS:Sending RELEASE_COMPLETE %x (No free Chan for you..) \n " , hh - > dinfo ) ;
dmsg = create_l3msg ( CC_RELEASE_COMPLETE | REQUEST , MT_RELEASE_COMPLETE , hh - > dinfo , sizeof ( RELEASE_COMPLETE_t ) , 1 ) ;
dmsg = create_l3msg ( CC_RELEASE_COMPLETE | REQUEST , MT_RELEASE_COMPLETE , hh - > dinfo , sizeof ( RELEASE_COMPLETE_t ) , 1 ) ;
@ -1809,6 +1796,16 @@ handle_event_nt(void *dat, void *arg)
free_msg ( msg ) ;
free_msg ( msg ) ;
return 0 ;
return 0 ;
}
}
cb_log ( 7 , stack - > port , " --> new_process: New L3Id: %x \n " , hh - > dinfo ) ;
bc - > l3_id = hh - > dinfo ;
if ( bc - > channel < = 0 ) {
bc - > channel = find_free_chan_in_stack ( stack , 0 , 0 ) ;
if ( bc - > channel < = 0 )
goto ERR_NO_CHANNEL ;
}
}
}
break ;
break ;