ooh323.c

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

C
1,721
字号
            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;            }            return OO_FAILED;         }         /* For now, just add decoded fast start elemts to list. This list            will be processed at the time of sending CONNECT message. */         dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc);      }      finishPrint();      removeEventHandler(call->pctxt);   }   return OO_OK;}int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg){   H225CallProceeding_UUIE *callProceeding=NULL;   H245OpenLogicalChannel* olc;   ASN1OCTET msgbuf[MAXMSGLEN];   ooLogicalChannel * pChannel = NULL;   H245H2250LogicalChannelParameters * h2250lcp = NULL;     int i=0, ret=0;   if(!q931Msg->userInfo)   {      OOTRACEERR3("ERROR:No User-User IE in received CallProceeding message."                  " (%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   callProceeding =              q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.callProceeding;   if(callProceeding == NULL)   {      OOTRACEERR3("Error: Received CallProceeding message does not have "                  "CallProceeding 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))   {      if(callProceeding->m.fastStartPresent)      {         /* 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)callProceeding->fastStart.n; i++)         {            olc = NULL;            olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,                                               sizeof(H245OpenLogicalChannel));            if(!olc)            {               OOTRACEERR3("ERROR:Memory - ooOnReceivedCallProceeding - 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;               }               return OO_FAILED;            }            memset(olc, 0, sizeof(H245OpenLogicalChannel));            memcpy(msgbuf, callProceeding->fastStart.elem[i].data,                                     callProceeding->fastStart.elem[i].numocts);            setPERBuffer(call->pctxt, msgbuf,                          callProceeding->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;               }               return OO_FAILED;            }            dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc);            pChannel = ooFindLogicalChannelByOLC(call, olc);            if(!pChannel)            {               OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. "                           "(%s, %s)\n",                            olc->forwardLogicalChannelNumber, call->callType,                             call->callToken);               return OO_FAILED;            }            if(pChannel->channelNo != olc->forwardLogicalChannelNumber)            {               OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"                            "Number 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);                  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);                  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);                  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(callProceeding->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 callProceeding message (%s, %s)\n",                       call->callType, call->callToken);      }      ret = ooH323GetIpPortFromH225TransportAddress(call,                                   &callProceeding->h245Address, call->remoteIP,                                  &call->remoteH245Port);      if(ret != OO_OK)      {         OOTRACEERR3("Error: Unknown H245 address type in received "                     "CallProceeding 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 ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg){   H225Alerting_UUIE *alerting=NULL;   H245OpenLogicalChannel* olc;   ASN1OCTET msgbuf[MAXMSGLEN];   ooLogicalChannel * pChannel = NULL;   H245H2250LogicalChannelParameters * h2250lcp = NULL;     int i=0, ret=0;   if(!q931Msg->userInfo)   {      OOTRACEERR3("ERROR:No User-User IE in received Alerting message."                  " (%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   alerting = q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.alerting;   if(alerting == NULL)   {      OOTRACEERR3("Error: Received Alerting message does not have "                  "alerting 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(alerting->m.fastStartPresent)      {         /* 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)alerting->fastStart.n; i++)         {            olc = NULL;            olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,                                               sizeof(H245OpenLogicalChannel));            if(!olc)            {               OOTRACEERR3("ERROR:Memory - ooOnReceivedAlerting - 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;               }               return OO_FAILED;            }            memset(olc, 0, sizeof(H245OpenLogicalChannel));            memcpy(msgbuf, alerting->fastStart.elem[i].data,                                     alerting->fastStart.elem[i].numocts);            setPERBuffer(call->pctxt, msgbuf,                          alerting->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;               }               return OO_FAILED;            }            dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc);            pChannel = ooFindLogicalChannelByOLC(call, olc);            if(!pChannel)            {               OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. "                           "(%s, %s)\n",                            olc->forwardLogicalChannelNumber, call->callType,                             call->callToken);               return OO_FAILED;            }            if(pChannel->channelNo != olc->forwardLogicalChannelNumber)            {               OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"                            "Number 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);                  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);                  return OO_FAILED;               }               ret = ooGetIpPortFromH245TransportAddress(call,                                    &h2250lcp->mediaChannel, pChannel->remoteIP,                                   &pChannel->remoteMediaPort);                              if(ret != OO_OK)               {

⌨️ 快捷键说明

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