mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
added the option 'reject_cause' to make it possible to set the RELEASE_COMPLETE - cause on the 3. incoming PMP channel, which is automatically rejected because chan_misdn does not support that kind of callwaiting. Therefore chan_misdn supports now 3 incoming channels on a PMP BRI Port. misdn_lib_get_free_bc now gets the info if the requested channel is incoming or outgoing to make the 3. channel possible
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@44334 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -94,7 +94,7 @@ struct misdn_stack* get_stack_by_bc(struct misdn_bchannel *bc)
|
||||
|
||||
for ( ; stack; stack=stack->next) {
|
||||
int i;
|
||||
for (i=0; i <stack->b_num; i++) {
|
||||
for (i=0; i <=stack->b_num; i++) {
|
||||
if ( bc->port == stack->port) return stack;
|
||||
}
|
||||
}
|
||||
@@ -408,7 +408,7 @@ void dump_chan_list(struct misdn_stack *stack)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i <stack->b_num; i++) {
|
||||
for (i=0; i <= stack->b_num; i++) {
|
||||
cb_log(6, stack->port, "Idx:%d stack->cchan:%d Chan:%d\n",i,stack->channels[i], i+1);
|
||||
}
|
||||
}
|
||||
@@ -523,6 +523,7 @@ void empty_bc(struct misdn_bchannel *bc)
|
||||
|
||||
|
||||
bc->in_use= 0;
|
||||
bc->cw= 0;
|
||||
|
||||
bc->channel = 0;
|
||||
|
||||
@@ -655,7 +656,7 @@ void clear_l3(struct misdn_stack *stack)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if (global_state == MISDN_INITIALIZED) {
|
||||
cb_event(EVENT_CLEANUP, &stack->bc[i], NULL);
|
||||
empty_chan_in_stack(stack,i+1);
|
||||
@@ -1148,7 +1149,7 @@ struct misdn_stack* stack_init( int midev, int port, int ptp )
|
||||
stack->d_stid = stinf->id;
|
||||
stack->b_num = stinf->childcnt;
|
||||
|
||||
for (i=0; i<stinf->childcnt; i++)
|
||||
for (i=0; i<=stinf->childcnt; i++)
|
||||
stack->b_stids[i] = stinf->child[i];
|
||||
|
||||
switch(stinf->pid.protocol[0] & ~ISDN_PID_FEATURE_MASK) {
|
||||
@@ -1353,7 +1354,7 @@ struct misdn_stack * find_stack_by_mgr(manager_t* mgr_nt)
|
||||
struct misdn_bchannel *find_bc_by_masked_l3id(struct misdn_stack *stack, unsigned long l3id, unsigned long mask)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if ( (stack->bc[i].l3_id & mask) == (l3id & mask)) return &stack->bc[i] ;
|
||||
}
|
||||
return stack_holder_find(stack,l3id);
|
||||
@@ -1363,7 +1364,7 @@ struct misdn_bchannel *find_bc_by_masked_l3id(struct misdn_stack *stack, unsigne
|
||||
struct misdn_bchannel *find_bc_by_l3id(struct misdn_stack *stack, unsigned long l3id)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if (stack->bc[i].l3_id == l3id) return &stack->bc[i] ;
|
||||
}
|
||||
return stack_holder_find(stack,l3id);
|
||||
@@ -1372,7 +1373,7 @@ struct misdn_bchannel *find_bc_by_l3id(struct misdn_stack *stack, unsigned long
|
||||
struct misdn_bchannel *find_bc_holded(struct misdn_stack *stack)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if (stack->bc[i].holded ) return &stack->bc[i] ;
|
||||
}
|
||||
return NULL;
|
||||
@@ -1387,7 +1388,7 @@ struct misdn_bchannel *find_bc_by_addr(unsigned long addr)
|
||||
for (stack=glob_mgr->stack_list;
|
||||
stack;
|
||||
stack=stack->next) {
|
||||
for (i=0; i< stack->b_num; i++) {
|
||||
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];
|
||||
}
|
||||
@@ -1405,7 +1406,7 @@ struct misdn_bchannel *find_bc_by_confid(unsigned long confid)
|
||||
for (stack=glob_mgr->stack_list;
|
||||
stack;
|
||||
stack=stack->next) {
|
||||
for (i=0; i< stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if ( stack->bc[i].conf_id==confid ) {
|
||||
return &stack->bc[i];
|
||||
}
|
||||
@@ -1422,7 +1423,7 @@ struct misdn_bchannel *find_bc_by_channel(int port, int channel)
|
||||
|
||||
if (!stack) return NULL;
|
||||
|
||||
for (i=0; i< stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if ( stack->bc[i].channel== channel ) {
|
||||
return &stack->bc[i];
|
||||
}
|
||||
@@ -1512,7 +1513,7 @@ int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_t *frm)
|
||||
int handle_new_process(struct misdn_stack *stack, iframe_t *frm)
|
||||
{
|
||||
|
||||
struct misdn_bchannel* bc=misdn_lib_get_free_bc(stack->port, 0);
|
||||
struct misdn_bchannel* bc=misdn_lib_get_free_bc(stack->port, 0, 1);
|
||||
|
||||
|
||||
if (!bc) {
|
||||
@@ -1532,8 +1533,9 @@ int handle_cr ( struct misdn_stack *stack, iframe_t *frm)
|
||||
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)
|
||||
if (handle_new_process(stack, frm) <0) {
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
case CC_NEW_CR|CONFIRM:
|
||||
return 1;
|
||||
@@ -2177,6 +2179,30 @@ static int do_tone(struct misdn_bchannel *bc, int len)
|
||||
}
|
||||
|
||||
|
||||
#ifdef MISDN_SAVE_DATA
|
||||
static void misdn_save_data(int id, char *p1, int l1, char *p2, int l2)
|
||||
{
|
||||
char n1[32],n2[32];
|
||||
|
||||
sprintf(n1,"/tmp/misdn-rx-%d.raw",id);
|
||||
sprintf(n2,"/tmp/misdn-tx-%d.raw",id);
|
||||
|
||||
FILE *rx=fopen(n1,"a+");
|
||||
FILE *tx=fopen(n2,"a+");
|
||||
|
||||
if (!rx || !tx) {
|
||||
cb_log(0,0,"Couldn't open files: %s\n",strerror(errno));
|
||||
return ;
|
||||
}
|
||||
|
||||
fwrite(p1,1,l1,rx);
|
||||
fwrite(p2,1,l2,tx);
|
||||
|
||||
fclose(rx);
|
||||
fclose(tx);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
void misdn_tx_jitter(struct misdn_bchannel *bc, int len)
|
||||
{
|
||||
@@ -2188,6 +2214,9 @@ void misdn_tx_jitter(struct misdn_bchannel *bc, int len)
|
||||
jlen=cb_jb_empty(bc,data,len);
|
||||
|
||||
if (jlen) {
|
||||
#ifdef MISDN_SAVE_DATA
|
||||
misdn_save_data((bc->port*100+bc->channel), data, jlen, bc->bframe, bc->bframe_len);
|
||||
#endif
|
||||
flip_buf_bits( data, jlen);
|
||||
|
||||
if (jlen < len) {
|
||||
@@ -2202,7 +2231,7 @@ void misdn_tx_jitter(struct misdn_bchannel *bc, int len)
|
||||
|
||||
txfrm->len =jlen;
|
||||
cb_log(9, bc->port, "Transmitting %d samples 2 misdn\n", txfrm->len);
|
||||
|
||||
|
||||
r=mISDN_write( glob_mgr->midev, buf, txfrm->len + mISDN_HEADER_LEN, 8000 );
|
||||
} else {
|
||||
#define MISDN_GEN_SILENCE
|
||||
@@ -2548,6 +2577,8 @@ int handle_frm(msg_t *msg)
|
||||
|
||||
if (ret<0) {
|
||||
cb_log(3,stack?stack->port:0,"handle_frm: handle_cr <0 prim:%x addr:%x\n", frm->prim, frm->addr);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if(ret) {
|
||||
@@ -2582,8 +2613,9 @@ int handle_frm(msg_t *msg)
|
||||
break;
|
||||
case RESPONSE_IGNORE_SETUP:
|
||||
/* I think we should send CC_RELEASE_CR, but am not sure*/
|
||||
|
||||
bc->out_cause=16;
|
||||
|
||||
case RESPONSE_RELEASE_SETUP:
|
||||
misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
|
||||
if (bc->channel>0)
|
||||
empty_chan_in_stack(stack, bc->channel);
|
||||
@@ -2646,7 +2678,7 @@ int handle_l1(msg_t *msg)
|
||||
free_msg(msg);
|
||||
}
|
||||
|
||||
for (i=0;i<stack->b_num; i++) {
|
||||
for (i=0;i<=stack->b_num; i++) {
|
||||
if (stack->bc[i].evq != EVENT_NOTHING) {
|
||||
cb_log(4, stack->port, "Fireing Queued Event %s because L1 got up\n", isdn_get_info(msgs_g, stack->bc[i].evq, 0));
|
||||
misdn_lib_send_event(&stack->bc[i],stack->bc[i].evq);
|
||||
@@ -2670,7 +2702,7 @@ int handle_l1(msg_t *msg)
|
||||
case PH_DEACTIVATE | INDICATION:
|
||||
cb_log (3, stack->port, "L1: PH L1Link Down! \n");
|
||||
|
||||
for (i=0; i<stack->b_num; i++) {
|
||||
for (i=0; i<=stack->b_num; i++) {
|
||||
if (global_state == MISDN_INITIALIZED) {
|
||||
cb_event(EVENT_CLEANUP, &stack->bc[i], glob_mgr->user_data);
|
||||
}
|
||||
@@ -2977,7 +3009,7 @@ struct misdn_bchannel *manager_find_bc_by_pid(int pid)
|
||||
for (stack=glob_mgr->stack_list;
|
||||
stack;
|
||||
stack=stack->next) {
|
||||
for (i=0; i<stack->b_num; i++)
|
||||
for (i=0; i<=stack->b_num; i++)
|
||||
if (stack->bc[i].pid == pid) return &stack->bc[i];
|
||||
}
|
||||
|
||||
@@ -3012,7 +3044,7 @@ void prepare_bc(struct misdn_bchannel*bc, int channel)
|
||||
#endif
|
||||
}
|
||||
|
||||
struct misdn_bchannel* misdn_lib_get_free_bc(int port, int channel)
|
||||
struct misdn_bchannel* misdn_lib_get_free_bc(int port, int channel, int inout)
|
||||
{
|
||||
struct misdn_stack *stack;
|
||||
int i;
|
||||
@@ -3043,8 +3075,14 @@ struct misdn_bchannel* misdn_lib_get_free_bc(int port, int channel)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < stack->b_num; i++) {
|
||||
|
||||
int maxnum=inout&&!stack->pri&&!stack->ptp?stack->b_num+1:stack->b_num;
|
||||
for (i = 0; i <maxnum; i++) {
|
||||
if (!stack->bc[i].in_use) {
|
||||
/* 3. channel on bri means CW*/
|
||||
if (!stack->pri && i==stack->b_num)
|
||||
stack->bc[i].cw=1;
|
||||
|
||||
prepare_bc(&stack->bc[i], channel);
|
||||
return &stack->bc[i];
|
||||
}
|
||||
@@ -3751,7 +3789,7 @@ int misdn_lib_init(char *portlist, struct misdn_lib_iface *iface, void *user_dat
|
||||
first=0;
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<stack->b_num; i++) {
|
||||
for(i=0;i<=stack->b_num; i++) {
|
||||
int r;
|
||||
if ((r=init_bc(stack, &stack->bc[i], stack->midev,port,i, "", 1))<0) {
|
||||
cb_log(0, port, "Got Err @ init_bc :%d\n",r);
|
||||
@@ -3773,7 +3811,7 @@ int misdn_lib_init(char *portlist, struct misdn_lib_iface *iface, void *user_dat
|
||||
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<stack->b_num; i++) {
|
||||
for(i=0;i<=stack->b_num; i++) {
|
||||
int r;
|
||||
if ((r=init_bc(stack, &stack->bc[i], stack->midev,port,i, "",1 ))<0) {
|
||||
cb_log(0, port, "Got Err @ init_bc :%d\n",r);
|
||||
@@ -3808,7 +3846,7 @@ void misdn_lib_destroy()
|
||||
int i;
|
||||
|
||||
for ( help=glob_mgr->stack_list; help; help=help->next ) {
|
||||
for(i=0;i<help->b_num; i++) {
|
||||
for(i=0;i<=help->b_num; i++) {
|
||||
char buf[1024];
|
||||
mISDN_write_frame(help->midev, buf, help->bc[i].addr, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC);
|
||||
help->bc[i].addr = 0;
|
||||
|
Reference in New Issue
Block a user