⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
                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 + -