ooh323.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 1,721 行 · 第 1/5 页

C
1,721
字号
                  OOTRACEERR3("ERROR:Unsupported media channel address type "                              "(%s, %s)\n", call->callType, call->callToken);                  return OO_FAILED;               }                      if(!pChannel->chanCap->startTransmitChannel)               {                  OOTRACEERR3("ERROR:No callback registered to start transmit "                              "channel (%s, %s)\n",call->callType,                               call->callToken);                  return OO_FAILED;               }               pChannel->chanCap->startTransmitChannel(call, pChannel);            }            /* Mark the current channel as established and close all other                logical channels with same session id and in same direction.            */            ooOnLogicalChannelEstablished(call, pChannel);         }         finishPrint();         removeEventHandler(call->pctxt);         OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);      }         }   /* Retrieve the H.245 control channel address from the connect msg */   if(alerting->m.h245AddressPresent)   {      if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))      {         OO_CLRFLAG (call->flags, OO_M_TUNNELING);         OOTRACEINFO3("Tunneling is disabled for call as H245 address is "                      "provided in Alerting message (%s, %s)\n",                       call->callType, call->callToken);      }      ret = ooH323GetIpPortFromH225TransportAddress(call,                                   &alerting->h245Address, call->remoteIP,                                  &call->remoteH245Port);      if(ret != OO_OK)      {         OOTRACEERR3("Error: Unknown H245 address type in received "                     "Alerting message (%s, %s)", call->callType,                      call->callToken);         /* Mark call for clearing */         if(call->callState < OO_CALL_CLEAR)         {            call->callEndReason = OO_REASON_INVALIDMESSAGE;            call->callState = OO_CALL_CLEAR;         }         return OO_FAILED;      }   }   return OO_OK;}   int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg){   int ret, i;   H225Connect_UUIE *connect;   H245OpenLogicalChannel* olc;   ASN1OCTET msgbuf[MAXMSGLEN];   ooLogicalChannel * pChannel = NULL;   H245H2250LogicalChannelParameters * h2250lcp = NULL;     if(!q931Msg->userInfo)   {      OOTRACEERR3("Error: UUIE not found in received H.225 Connect message"                  " (%s, %s)\n", call->callType, call->callToken);      /* Mark call for clearing */      if(call->callState < OO_CALL_CLEAR)      {         call->callEndReason = OO_REASON_INVALIDMESSAGE;         call->callState = OO_CALL_CLEAR;      }      return OO_FAILED;   }   /* Retrieve the connect message from the user-user IE */   connect = q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.connect;   if(connect == NULL)   {      OOTRACEERR3("Error: Received Connect message does not have Connect UUIE"                  " (%s, %s)\n", call->callType, call->callToken);      /* Mark call for clearing */      if(call->callState < OO_CALL_CLEAR)      {         call->callEndReason = OO_REASON_INVALIDMESSAGE;         call->callState = OO_CALL_CLEAR;      }      return OO_FAILED;   }   /*Handle fast-start */   if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&       !OO_TESTFLAG (call->flags, OO_M_FASTSTARTANSWERED))   {      if(!connect->m.fastStartPresent)      {         OOTRACEINFO3("Remote endpoint has rejected fastStart. (%s, %s)\n",                      call->callType, call->callToken);         /* Clear all channels we might have created */         ooClearAllLogicalChannels(call);         OO_CLRFLAG (call->flags, OO_M_FASTSTART);      }   }   if (connect->m.fastStartPresent &&        !OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED))   {      /* For printing the decoded message to log, initialize handler. */      initializePrintHandler(&printHandler, "FastStart Elements");      /* Set print handler */      setEventHandler (call->pctxt, &printHandler);      for(i=0; i<(int)connect->fastStart.n; i++)      {         olc = NULL;	 /*         memset(msgbuf, 0, sizeof(msgbuf));*/         olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,                                               sizeof(H245OpenLogicalChannel));         if(!olc)         {            OOTRACEERR3("ERROR:Memory - ooOnReceivedSignalConnect - olc"                        "(%s, %s)\n", call->callType, call->callToken);            /*Mark call for clearing */            if(call->callState < OO_CALL_CLEAR)            {               call->callEndReason = OO_REASON_LOCAL_CLEARED;               call->callState = OO_CALL_CLEAR;            }            finishPrint();            removeEventHandler(call->pctxt);            return OO_FAILED;         }         memset(olc, 0, sizeof(H245OpenLogicalChannel));         memcpy(msgbuf, connect->fastStart.elem[i].data,                                            connect->fastStart.elem[i].numocts);         setPERBuffer(call->pctxt, msgbuf,                       connect->fastStart.elem[i].numocts, 1);         ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);         if(ret != ASN_OK)         {            OOTRACEERR3("ERROR:Failed to decode fast start olc element "                        "(%s, %s)\n", call->callType, call->callToken);            /* Mark call for clearing */            if(call->callState < OO_CALL_CLEAR)            {               call->callEndReason = OO_REASON_INVALIDMESSAGE;               call->callState = OO_CALL_CLEAR;            }            finishPrint();            removeEventHandler(call->pctxt);            return OO_FAILED;         }         dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc);         pChannel = ooFindLogicalChannelByOLC(call, olc);         if(!pChannel)         {            OOTRACEERR4("ERROR: Logical Channel %d not found, fasts start "                        "answered. (%s, %s)\n",                         olc->forwardLogicalChannelNumber, call->callType,                          call->callToken);            finishPrint();            removeEventHandler(call->pctxt);            return OO_FAILED;         }         if(pChannel->channelNo != olc->forwardLogicalChannelNumber)         {            OOTRACEINFO5("Remote endpoint changed forwardLogicalChannelNumber"                         "from %d to %d (%s, %s)\n", pChannel->channelNo,                          olc->forwardLogicalChannelNumber, call->callType,                           call->callToken);            pChannel->channelNo = olc->forwardLogicalChannelNumber;         }         if(!strcmp(pChannel->dir, "transmit"))         {            if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=                T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)            {               OOTRACEERR4("ERROR:Unknown multiplex parameter type for channel"                           " %d (%s, %s)\n", olc->forwardLogicalChannelNumber,                            call->callType, call->callToken);               continue;            }                        /* Extract the remote media endpoint address */            h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;            if(!h2250lcp)            {               OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "                           "forward Logical Channel Parameters found. (%s, %s)"                           "\n", call->callType, call->callToken);               finishPrint();               removeEventHandler(call->pctxt);               return OO_FAILED;            }            if(!h2250lcp->m.mediaChannelPresent)            {               OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "                           "reverse media channel information found. (%s, %s)"                           "\n", call->callType, call->callToken);               finishPrint();               removeEventHandler(call->pctxt);               return OO_FAILED;            }            ret = ooGetIpPortFromH245TransportAddress(call,                                    &h2250lcp->mediaChannel, pChannel->remoteIP,                                   &pChannel->remoteMediaPort);            if(ret != OO_OK)            {               OOTRACEERR3("ERROR:Unsupported media channel address type "                           "(%s, %s)\n", call->callType, call->callToken);               finishPrint();               removeEventHandler(call->pctxt);               return OO_FAILED;            }            if(!pChannel->chanCap->startTransmitChannel)            {               OOTRACEERR3("ERROR:No callback registered to start transmit "                         "channel (%s, %s)\n",call->callType, call->callToken);               finishPrint();               removeEventHandler(call->pctxt);               return OO_FAILED;            }            pChannel->chanCap->startTransmitChannel(call, pChannel);         }         /* Mark the current channel as established and close all other             logical channels with same session id and in same direction.         */         ooOnLogicalChannelEstablished(call, pChannel);      }      finishPrint();      removeEventHandler(call->pctxt);      OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);   }   /* Retrieve the H.245 control channel address from the connect msg */   if(connect->m.h245AddressPresent)   {      if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))      {         OO_CLRFLAG (call->flags, OO_M_TUNNELING);         OOTRACEINFO3("Tunneling is disabled for call as H245 address is "                      "provided in connect message (%s, %s)\n",                       call->callType, call->callToken);      }      ret = ooH323GetIpPortFromH225TransportAddress(call,                  &connect->h245Address, call->remoteIP, &call->remoteH245Port);      if(ret != OO_OK)      {         OOTRACEERR3("Error: Unknown H245 address type in received Connect "                     "message (%s, %s)", call->callType, call->callToken);         /* Mark call for clearing */         if(call->callState < OO_CALL_CLEAR)         {            call->callEndReason = OO_REASON_INVALIDMESSAGE;            call->callState = OO_CALL_CLEAR;         }         return OO_FAILED;      }   }   if(call->remoteH245Port != 0)   {       /* Create an H.245 connection.       */      if(ooCreateH245Connection(call)== OO_FAILED)      {         OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",                      call->callType, call->callToken);         if(call->callState < OO_CALL_CLEAR)         {            call->callEndReason = OO_REASON_TRANSPORTFAILURE;            call->callState = OO_CALL_CLEAR;         }         return OO_FAILED;      }   }   if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent)   {      if (!q931Msg->userInfo->h323_uu_pdu.h245Tunneling)      {         if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))         {            OO_CLRFLAG (call->flags, OO_M_TUNNELING);            OOTRACEINFO3("Tunneling is disabled by remote endpoint.(%s, %s)\n",                          call->callType, call->callToken);         }      }   }   if (OO_TESTFLAG(call->flags, OO_M_TUNNELING))   {      OOTRACEDBGB3("Handling tunneled messages in CONNECT. (%s, %s)\n",                    call->callType, call->callToken);      ret = ooHandleTunneledH245Messages	 (call, &q931Msg->userInfo->h323_uu_pdu);      OOTRACEDBGB3("Finished tunneled messages in Connect. (%s, %s)\n",                    call->callType, call->callToken);      /*Send TCS as call established and no capability exchange has yet         started. This will be true only when separate h245 connection is not        established and tunneling is being used.*/      if(call->localTermCapState == OO_LocalTermCapExchange_Idle)      {         /*Start terminal capability exchange and master slave determination */         ret = ooSendTermCapMsg(call);         if(ret != OO_OK)         {            OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n",                         call->callType, call->callToken);            return ret;         }      }      if(call->masterSlaveState == OO_MasterSlave_Idle)      {         ret = ooSendMasterSlaveDetermination(call);         if(ret != OO_OK)         {            OOTRACEERR3("ERROR:Sending Master-slave determination message "                     "(%s, %s)\n", call->callType, call->callToken);            return ret;         }         }   }   return OO_OK;  }int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg){   int ret=OO_OK;   ASN1UINT i;   DListNode *pNode = NULL;   OOTimer *pTimer=NULL;   int type = q931Msg->messageType;   switch(type)   {      case Q931SetupMsg: /* Setup message is received */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?