📄 message.c
字号:
if(p_chi[0]>35) /* check length of channel ID */ { Info = _WRONG_MESSAGE_FORMAT; } } else Info = _WRONG_MESSAGE_FORMAT; } if(ch==3 && ai_parms[0].length>=7 && ai_parms[0].length<=36) { dir = GET_WORD(ai_parms[0].info+3); ch_mask = 0; m = 0x3f; for(i=0; i+5<=ai_parms[0].length; i++) { if(ai_parms[0].info[i+5]!=0) { if((ai_parms[0].info[i+5] | m) != 0xff) Info = _WRONG_MESSAGE_FORMAT; else { if (ch_mask == 0) channel = i; ch_mask |= 1L << i; } } m = 0; } if (ch_mask == 0) Info = _WRONG_MESSAGE_FORMAT; if (!Info) { if ((ai_parms[0].length == 36) || (ch_mask != ((dword)(1L << channel)))) { esc_chi[0] = (byte)(ai_parms[0].length - 2); for(i=0; i+5<=ai_parms[0].length; i++) esc_chi[i+3] = ai_parms[0].info[i+5]; } else esc_chi[0] = 2; esc_chi[2] = (byte)channel; plci->b_channel = (byte)channel; /* not correct for ETSI ch 17..31 */ add_p(plci,LLI,lli); add_p(plci,ESC,esc_chi); plci->State = LOCAL_CONNECT; if(!dir) plci->call_dir |= CALL_DIR_FORCE_OUTG_NL; /* dir 0=DTE, 1=DCE */ } } } } else Info = _WRONG_MESSAGE_FORMAT; } dbug(1,dprintf("ch=%x,dir=%x,p_ch=%d",ch,dir,channel)); plci->command = _CONNECT_R; plci->number = Number; /* x.31 or D-ch free SAPI in LinkLayer? */ if(ch==1 && LinkLayer!=3 && LinkLayer!=12) noCh = TRUE; if((ch==0 || ch==2 || noCh || ch==3 || ch==4) && !Info) { /* B-channel used for B3 connections (ch==0), or no B channel */ /* is used (ch==2) or perm. connection (3) is used do a CALL */ if(noCh) Info = add_b1(plci,&parms[5],2,0); /* no resource */ else Info = add_b1(plci,&parms[5],ch,0); add_s(plci,OAD,&parms[2]); add_s(plci,OSA,&parms[4]); add_s(plci,BC,&parms[6]); add_s(plci,LLC,&parms[7]); add_s(plci,HLC,&parms[8]); CIP = GET_WORD(parms[0].info); if (a->Info_Mask[appl->Id-1] & 0x200) { /* early B3 connect (CIP mask bit 9) no release after a disc */ add_p(plci,LLI,"\x01\x01"); } if(GET_WORD(parms[0].info)<29) { add_p(plci,BC,cip_bc[GET_WORD(parms[0].info)][a->u_law]); add_p(plci,HLC,cip_hlc[GET_WORD(parms[0].info)]); } add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30"); sig_req(plci,ASSIGN,DSIG_ID); } else if(ch==1) { /* D-Channel used for B3 connections */ plci->Sig.Id = 0xff; Info = 0; } if(!Info && ch!=2 && !noCh ) { Info = add_b23(plci,&parms[5]); if(!Info) { if(!(plci->tel && !plci->adv_nl))nl_req_ncci(plci,ASSIGN,0); } } if(!Info) { if(ch==0 || ch==2 || ch==3 || noCh || ch==4) { if(plci->spoofed_msg==SPOOFING_REQUIRED) { api_save_msg(parms, "wsssssssss", &plci->saved_msg); plci->spoofed_msg = CALL_REQ; plci->internal_command = BLOCK_PLCI; plci->command = 0; dbug(1,dprintf("Spoof")); send_req(plci); return FALSE; } if(ch==4)add_p(plci,CHI,p_chi); add_s(plci,CPN,&parms[1]); add_s(plci,DSA,&parms[3]); if(noCh) add_p(plci,ESC,"\x02\x18\xfd"); /* D-channel, no B-L3 */ add_ai(plci,&parms[9]); if(!dir)sig_req(plci,CALL_REQ,0); else { plci->command = PERM_LIST_REQ; plci->appl = appl; sig_req(plci,LISTEN_REQ,0); send_req(plci); return FALSE; } } send_req(plci); return FALSE; } plci->Id = 0; } } sendf(appl, _CONNECT_R|CONFIRM, Id, Number, "w",Info); return 2;}byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms){ word i, Info; word Reject; static byte cau_t[] = {0,0,0x90,0x91,0xac,0x9d,0x86,0xd8,0x9b}; static byte esc_t[] = {0x03,0x08,0x00,0x00}; API_PARSE * ai; API_PARSE ai_parms[5]; word ch=0; if(!plci) { dbug(1,dprintf("connect_res(no plci)")); return 0; /* no plci, no send */ } dbug(1,dprintf("connect_res(State=0x%x)",plci->State)); for(i=0;i<5;i++) ai_parms[i].length = 0; ai = &parms[5]; dbug(1,dprintf("ai->length=%d",ai->length)); if(ai->length) { if(!api_parse(&ai->info[1],(word)ai->length,"ssss",ai_parms)) { dbug(1,dprintf("ai_parms[0].length=%d/0x%x",ai_parms[0].length,GET_WORD(ai_parms[0].info+1))); ch = 0; if(ai_parms[0].length) { ch = GET_WORD(ai_parms[0].info+1); dbug(1,dprintf("BCH-I=0x%x",ch)); } } } if(plci->State==INC_CON_CONNECTED_ALERT) { dbug(1,dprintf("Connected Alert Call_Res")); if (a->Info_Mask[appl->Id-1] & 0x200) { /* early B3 connect (CIP mask bit 9) no release after a disc */ add_p(plci,LLI,"\x01\x01"); } add_s(plci, CONN_NR, &parms[2]); add_s(plci, LLC, &parms[4]); add_ai(plci, &parms[5]); plci->State = INC_CON_ACCEPT; sig_req(plci, CALL_RES,0); return 1; } else if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT) { clear_c_ind_mask_bit (plci, (word)(appl->Id-1)); dump_c_ind_mask (plci); Reject = GET_WORD(parms[0].info); dbug(1,dprintf("Reject=0x%x",Reject)); if(Reject) { if(c_ind_mask_empty (plci)) { if((Reject&0xff00)==0x3400) { esc_t[2] = ((byte)(Reject&0x00ff)) | 0x80; add_p(plci,ESC,esc_t); add_ai(plci, &parms[5]); sig_req(plci,REJECT,0); } else if(Reject==1 || Reject>9) { add_ai(plci, &parms[5]); sig_req(plci,HANGUP,0); } else { esc_t[2] = cau_t[(Reject&0x000f)]; add_p(plci,ESC,esc_t); add_ai(plci, &parms[5]); sig_req(plci,REJECT,0); } plci->appl = appl; } else { sendf(appl, _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED); } } else { plci->appl = appl; if(Id & EXT_CONTROLLER){ if(AdvCodecSupport(a, plci, appl, 0)){ dbug(1,dprintf("connect_res(error from AdvCodecSupport)")); sig_req(plci,HANGUP,0); return 1; } if(plci->tel == ADV_VOICE && a->AdvCodecPLCI) { Info = add_b23(plci, &parms[1]); if (Info) { dbug(1,dprintf("connect_res(error from add_b23)")); sig_req(plci,HANGUP,0); return 1; } if(plci->adv_nl) { nl_req_ncci(plci, ASSIGN, 0); } } } else { plci->tel = 0; if(ch!=2) { Info = add_b23(plci, &parms[1]); if (Info) { dbug(1,dprintf("connect_res(error from add_b23 2)")); sig_req(plci,HANGUP,0); return 1; } } nl_req_ncci(plci, ASSIGN, 0); } if(plci->spoofed_msg==SPOOFING_REQUIRED) { api_save_msg(parms, "wsssss", &plci->saved_msg); plci->spoofed_msg = CALL_RES; plci->internal_command = BLOCK_PLCI; plci->command = 0; dbug(1,dprintf("Spoof")); } else { add_b1 (plci, &parms[1], ch, plci->B1_facilities); if (a->Info_Mask[appl->Id-1] & 0x200) { /* early B3 connect (CIP mask bit 9) no release after a disc */ add_p(plci,LLI,"\x01\x01"); } add_s(plci, CONN_NR, &parms[2]); add_s(plci, LLC, &parms[4]); add_ai(plci, &parms[5]); plci->State = INC_CON_ACCEPT; sig_req(plci, CALL_RES,0); } for(i=0; i<max_appl; i++) { if(test_c_ind_mask_bit (plci, i)) { sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED); } } } } return 1;}byte connect_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ dbug(1,dprintf("connect_a_res")); return FALSE;}byte disconnect_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ word Info; word i; dbug(1,dprintf("disconnect_req")); Info = _WRONG_IDENTIFIER; if(plci) { if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT) { clear_c_ind_mask_bit (plci, (word)(appl->Id-1)); plci->appl = appl; for(i=0; i<max_appl; i++) { if(test_c_ind_mask_bit (plci, i)) sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0); } plci->State = OUTG_DIS_PENDING; } if(plci->Sig.Id && plci->appl) { Info = 0; if(plci->Sig.Id!=0xff) { if(plci->State!=INC_DIS_PENDING) { add_ai(plci, &msg[0]); sig_req(plci,HANGUP,0); plci->State = OUTG_DIS_PENDING; return 1; } } else { if (plci->NL.Id && !plci->nl_remove_id) { mixer_remove (plci); nl_req_ncci(plci,REMOVE,0); sendf(appl,_DISCONNECT_R|CONFIRM,Id,Number,"w",0); sendf(appl, _DISCONNECT_I, Id, 0, "w", 0); plci->State = INC_DIS_PENDING; } return 1; } } } if(!appl) return FALSE; sendf(appl, _DISCONNECT_R|CONFIRM, Id, Number, "w",Info); return FALSE;}byte disconnect_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ dbug(1,dprintf("disconnect_res")); if(plci) { /* clear ind mask bit, just in case of collsion of */ /* DISCONNECT_IND and CONNECT_RES */ clear_c_ind_mask_bit (plci, (word)(appl->Id-1)); ncci_free_receive_buffers (plci, 0); if(plci_remove_check(plci)) { return 0; } if(plci->State==INC_DIS_PENDING || plci->State==SUSPENDING) { if(c_ind_mask_empty (plci)) { if(plci->State!=SUSPENDING)plci->State = IDLE; dbug(1,dprintf("chs=%d",plci->channels)); if(!plci->channels) { plci_remove(plci); } } } } return 0;}byte listen_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms){ word Info; byte i; dbug(1,dprintf("listen_req(Appl=0x%x)",appl->Id)); Info = _WRONG_IDENTIFIER; if(a) { Info = 0; a->Info_Mask[appl->Id-1] = GET_DWORD(parms[0].info); a->CIP_Mask[appl->Id-1] = GET_DWORD(parms[1].info); dbug(1,dprintf("CIP_MASK=0x%lx",GET_DWORD(parms[1].info))); if (a->Info_Mask[appl->Id-1] & 0x200){ /* early B3 connect provides */ a->Info_Mask[appl->Id-1] |= 0x10; /* call progression infos */ } /* check if external controller listen and switch listen on or off*/ if(Id&EXT_CONTROLLER && GET_DWORD(parms[1].info)){ if(a->profile.Global_Options & ON_BOARD_CODEC) { dummy_plci.State = IDLE; a->codec_listen[appl->Id-1] = &dummy_plci; a->TelOAD[0] = (byte)(parms[3].length); for(i=1;parms[3].length>=i && i<22;i++) { a->TelOAD[i] = parms[3].info[i]; } a->TelOAD[i] = 0; a->TelOSA[0] = (byte)(parms[4].length); for(i=1;parms[4].length>=i && i<22;i++) { a->TelOSA[i] = parms[4].info[i]; } a->TelOSA[i] = 0; } else Info = 0x2002; /* wrong controller, codec not supported */ } else{ /* clear listen */ a->codec_listen[appl->Id-1] = (PLCI *)0; } } sendf(appl, _LISTEN_R|CONFIRM, Id,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -