Merged revisions 44149 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r44149 | crichter | 2006-10-02 15:28:14 +0200 (Mo, 02 Okt 2006) | 1 line

fixed the hold/retrieve/transfer issues, removed a useless bc field, added setting of frame.delivery fields, some minor code cleanups
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@44559 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Christian Richter
2006-10-06 10:44:34 +00:00
parent dba3dae7f8
commit e0005b654a
3 changed files with 184 additions and 91 deletions

View File

@@ -501,7 +501,8 @@ char *bc_state2str(enum bchannel_state state) {
void bc_state_change(struct misdn_bchannel *bc, enum bchannel_state state)
{
cb_log(5,bc->port,"BC_STATE_CHANGE: from:%s to:%s\n",
cb_log(5,bc->port,"BC_STATE_CHANGE: l3id:%x from:%s to:%s\n",
bc->l3_id,
bc_state2str(bc->bc_state),
bc_state2str(state) );
@@ -616,8 +617,6 @@ static void empty_bc(struct misdn_bchannel *bc)
bc->fac_out.Function = Fac_None;
bc->te_choose_channel = 0;
bc->holded_bc=NULL;
}
@@ -1408,24 +1407,36 @@ static struct misdn_bchannel *find_bc_by_addr(unsigned long addr)
struct misdn_stack* stack;
int i;
for (stack=glob_mgr->stack_list;
stack;
stack=stack->next) {
for (i=0; i< stack->b_num; i++) {
if ( (stack->bc[i].addr&STACK_ID_MASK)==(addr&STACK_ID_MASK) || stack->bc[i].layer_id== addr ) {
return &stack->bc[i];
}
}
}
return NULL;
}
struct misdn_bchannel *find_bc_by_confid(unsigned long confid)
{
struct misdn_stack* stack;
int i;
for (stack=glob_mgr->stack_list;
stack;
stack=stack->next) {
for (i=0; i< stack->b_num; i++) {
if ( stack->bc[i].conf_id==confid ) {
return &stack->bc[i];
}
}
}
return NULL;
}
static struct misdn_bchannel *find_bc_by_channel(int port, int channel)
{
@@ -1745,16 +1756,17 @@ handle_event_nt(void *dat, void *arg)
struct misdn_bchannel *bc=find_bc_by_l3id(stack, hh->dinfo);
struct misdn_bchannel *hold_bc=stack_holder_find(stack,bc->l3_id);
cb_log(4, stack->port, "bc_l3id:%x holded_bc_l3id:%x\n",bc->l3_id, hold_bc->l3_id);
if (hold_bc) {
cb_log(4, stack->port, "REMOVEING Holder\n");
/*swap the backup to our new channel back*/
stack_holder_remove(stack, hold_bc);
memcpy(bc,hold_bc,sizeof(struct misdn_bchannel));
cb_event(EVENT_NEW_BC, hold_bc, bc);
free(hold_bc);
bc->holded=0;
}
}
@@ -3178,8 +3190,6 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
case EVENT_CONNECT:
case EVENT_RETRIEVE_ACKNOWLEDGE:
bc->holded=0;
if (stack->nt) {
if (bc->channel <=0 ) { /* else we have the channel already */
bc->channel = find_free_chan_in_stack(stack, bc, 0);
@@ -3198,9 +3208,6 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
cb_log(0,bc->port,"send_event: setup_bc failed\n");
}
cb_log(0,bc->port,"After SETUP BC\n");
if (misdn_cap_is_speech(bc->capability)) {
if ((event==EVENT_CONNECT)||(event==EVENT_RETRIEVE_ACKNOWLEDGE)) {
if ( *bc->crypt_key ) {
@@ -3228,14 +3235,27 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
case EVENT_HOLD_ACKNOWLEDGE:
{
struct misdn_bchannel *holded_bc=malloc(sizeof(struct misdn_bchannel));
if (!holded_bc) {
cb_log(0,bc->port, "Could not allocate holded_bc!!!\n");
return -1;
}
/*backup the bc*/
memcpy(holded_bc,bc,sizeof(struct misdn_bchannel));
holded_bc->holded=1;
bc_state_change(holded_bc,BCHAN_CLEANED);
stack_holder_add(stack,holded_bc);
/*kill the bridge and clean the bchannel*/
if (stack->nt) {
if (bc->bc_state == BCHAN_BRIDGED) {
misdn_split_conf(bc,bc->conf_id);
misdn_split_conf(bc->holded_bc,bc->holded_bc->conf_id);
struct misdn_bchannel *bc2=find_bc_by_confid(bc->conf_id);
if (!bc2)
cb_log(0,bc->port,"We have no second bc in bridge???\n");
else
misdn_split_conf(bc2,bc->conf_id);
}
if (bc->channel>0)
@@ -3244,11 +3264,6 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
clean_up_bc(bc);
}
/** we set it up later at RETRIEVE_ACK again.**/
/*holded_bc->upset=0;
holded_bc->active=0;*/
bc_state_change(holded_bc,BCHAN_CLEANED);
cb_event( EVENT_NEW_BC, bc, holded_bc);
}
break;
@@ -4084,6 +4099,27 @@ void stack_holder_remove(struct misdn_stack *stack, struct misdn_bchannel *holde
}
}
struct misdn_bchannel *stack_holder_find_bychan(struct misdn_stack *stack, int chan)
{
struct misdn_bchannel *help;
cb_log(4,stack?stack->port:0, "*HOLDER: find_bychan %c\n", chan);
if (!stack) return NULL;
for (help=stack->holding;
help;
help=help->next) {
if (help->channel == chan) {
cb_log(4,stack->port, "*HOLDER: found_bychan bc\n");
return help;
}
}
cb_log(4,stack->port, "*HOLDER: find_bychan nothing\n");
return NULL;
}
struct misdn_bchannel *stack_holder_find(struct misdn_stack *stack, unsigned long l3id)
{