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 + -
显示快捷键?