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