ooh245.c
来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 1,743 行 · 第 1/5 页
C
1,743 行
T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_videoData: case T_H245DataType_audioData: ooHandleOpenLogicalChannel_helper(call, olc); break; case T_H245DataType_data: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_data' not supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_encryptionData: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_encryptionData' not supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_h235Control: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_h235Control' not supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_h235Media: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_h235Media' not supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_multiplexedStream: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_multiplexedStream' not supported(%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_redundancyEncoding: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_redundancyEncoding' not supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_multiplePayloadStream: OOTRACEWARN3("Warn:Media channel data type " "'T_H245DataType_multiplePayloadStream' not supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; case T_H245DataType_fec: OOTRACEWARN3("Warn:Media channel data type 'T_H245DataType_fec' not " "supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); break; default: OOTRACEERR3("ERROR:Unknown media channel data type (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); } return OO_OK;} /*TODO: Need to clean logical channel in case of failure after creating one */int ooHandleOpenLogicalChannel_helper(OOH323CallData *call, H245OpenLogicalChannel*olc){ int ret=0; H245Message *ph245msg=NULL; H245ResponseMessage *response; H245OpenLogicalChannelAck *olcAck; ooH323EpCapability *epCap=NULL; H245H2250LogicalChannelAckParameters *h2250lcap=NULL; OOCTXT *pctxt; H245UnicastAddress *unicastAddrs, *unicastAddrs1; H245UnicastAddress_iPAddress *iPAddress, *iPAddress1; ooLogicalChannel *pLogicalChannel = NULL; H245H2250LogicalChannelParameters *h2250lcp=NULL; H245OpenLogicalChannel_forwardLogicalChannelParameters *flcp = &(olc->forwardLogicalChannelParameters); if(!flcp || flcp->multiplexParameters.t != T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters) { OOTRACEERR3("Error:ooHandleOpenLogicalChannel_helper - invalid forward " "logical channel parameters. (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_unspecified); return OO_FAILED; } h2250lcp = flcp->multiplexParameters.u.h2250LogicalChannelParameters; if(!(epCap=ooIsDataTypeSupported(call, &flcp->dataType, OORX))) { OOTRACEERR3("ERROR:HandleOpenLogicalChannel_helper - capability not " "supported (%s, %s)\n", call->callType, call->callToken); ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber, T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported); return OO_FAILED; } /* Generate an Ack for the open channel request */ ret = ooCreateH245Message(&ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { OOTRACEERR3("Error: H245 message creation failed for - " "OpenLogicalChannel Ack (%s, %s)\n", call->callType, call->callToken); memFreePtr(call->pctxt, epCap); epCap = NULL; return OO_FAILED; } ph245msg->msgType = OOOpenLogicalChannelAck; ph245msg->logicalChannelNo = olc->forwardLogicalChannelNumber; response = ph245msg->h245Msg.u.response; pctxt = &gH323ep.msgctxt; memset(response, 0, sizeof(H245ResponseMessage)); response->t = T_H245ResponseMessage_openLogicalChannelAck; response->u.openLogicalChannelAck = (H245OpenLogicalChannelAck*) memAlloc(pctxt, sizeof(H245OpenLogicalChannelAck)); olcAck = response->u.openLogicalChannelAck; memset(olcAck, 0, sizeof(H245OpenLogicalChannelAck)); olcAck->forwardLogicalChannelNumber = olc->forwardLogicalChannelNumber; olcAck->m.forwardMultiplexAckParametersPresent = 1; olcAck->forwardMultiplexAckParameters.t = T_H245OpenLogicalChannelAck_forwardMultiplexAckParameters_h2250LogicalChannelAckParameters; olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters = (H245H2250LogicalChannelAckParameters*)ASN1MALLOC(pctxt, sizeof(H245H2250LogicalChannelAckParameters)); h2250lcap = olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters; memset(h2250lcap, 0, sizeof(H245H2250LogicalChannelAckParameters)); h2250lcap->m.mediaChannelPresent = 1; h2250lcap->m.mediaControlChannelPresent = 1; h2250lcap->m.sessionIDPresent = 1; if(h2250lcp->sessionID == 0) h2250lcap->sessionID = ooCallGenerateSessionID(call, epCap->capType, "receive"); else h2250lcap->sessionID = h2250lcp->sessionID; h2250lcap->mediaChannel.t = T_H245TransportAddress_unicastAddress; h2250lcap->mediaChannel.u.unicastAddress = (H245UnicastAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress)); unicastAddrs = h2250lcap->mediaChannel.u.unicastAddress; memset(unicastAddrs, 0, sizeof(H245UnicastAddress)); unicastAddrs->t = T_H245UnicastAddress_iPAddress; unicastAddrs->u.iPAddress = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, sizeof(H245UnicastAddress_iPAddress)); iPAddress = unicastAddrs->u.iPAddress; memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress)); pLogicalChannel = ooAddNewLogicalChannel(call, olc->forwardLogicalChannelNumber, h2250lcap->sessionID, "receive", epCap); if(!pLogicalChannel) { OOTRACEERR3("ERROR:Failed to add new logical channel entry to call " "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } ooSocketConvertIpToNwAddr(call->localIP, iPAddress->network.data); iPAddress->network.numocts = 4; iPAddress->tsapIdentifier = pLogicalChannel->localRtpPort; /* media contrcol channel */ h2250lcap->mediaControlChannel.t = T_H245TransportAddress_unicastAddress; h2250lcap->mediaControlChannel.u.unicastAddress = (H245UnicastAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress)); unicastAddrs1 = h2250lcap->mediaControlChannel.u.unicastAddress; memset(unicastAddrs1, 0, sizeof(H245UnicastAddress)); unicastAddrs1->t = T_H245UnicastAddress_iPAddress; unicastAddrs1->u.iPAddress = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, sizeof(H245UnicastAddress_iPAddress)); iPAddress1 = unicastAddrs1->u.iPAddress; memset(iPAddress1, 0, sizeof(H245UnicastAddress_iPAddress)); ooSocketConvertIpToNwAddr(call->localIP, iPAddress1->network.data); iPAddress1->network.numocts = 4; iPAddress1->tsapIdentifier = pLogicalChannel->localRtcpPort; OOTRACEDBGA3("Built OpenLogicalChannelAck (%s, %s)\n", call->callType, call->callToken); ret = ooSendH245Msg(call, ph245msg); if(ret != OO_OK) { OOTRACEERR3("Error:Failed to enqueue OpenLogicalChannelAck message to " "outbound queue. (%s, %s)\n", call->callType, call->callToken); } ooFreeH245Message(call, ph245msg); if(epCap->startReceiveChannel) { epCap->startReceiveChannel(call, pLogicalChannel); OOTRACEINFO6("Receive channel of type %s started at %s:%d(%s, %s)\n", ooGetCapTypeText(epCap->cap), call->localIP, pLogicalChannel->localRtpPort, call->callType, call->callToken); } else{ OOTRACEERR3("ERROR:No callback registered to start receive audio " "channel (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; return ret;}int ooSendOpenLogicalChannelReject (OOH323CallData *call, ASN1UINT channelNum, ASN1UINT cause){ int ret=0; H245ResponseMessage* response=NULL; H245Message *ph245msg=NULL; OOCTXT *pctxt=&gH323ep.msgctxt; ret = ooCreateH245Message (&ph245msg, T_H245MultimediaSystemControlMessage_response); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - OpenLogicalChannel" "Reject (%s, %s)\n",call->callType, call->callToken); return OO_FAILED; } ph245msg->msgType = OOOpenLogicalChannelReject; response = ph245msg->h245Msg.u.response; response->t = T_H245ResponseMessage_openLogicalChannelReject; response->u.openLogicalChannelReject = (H245OpenLogicalChannelReject*) memAlloc (pctxt, sizeof(H245OpenLogicalChannelReject)); if(!response->u.openLogicalChannelReject) { OOTRACEERR3("Error: Failed to allocate memory for OpenLogicalChannel" "Reject message. (%s, %s)\n", call->callType, call->callToken); ooFreeH245Message(call, ph245msg); return OO_FAILED; } response->u.openLogicalChannelReject->forwardLogicalChannelNumber = channelNum; response->u.openLogicalChannelReject->cause.t = cause; OOTRACEDBGA3 ("Built OpenLogicalChannelReject (%s, %s)\n", call->callType, call->callToken); ret = ooSendH245Msg (call, ph245msg); if (ret != OO_OK) { OOTRACEERR3 ("Error:Failed to enqueue OpenLogicalChannelReject " "message to outbound queue.(%s, %s)\n", call->callType, call->callToken); } ooFreeH245Message (call, ph245msg); return ret;}int ooOnReceivedOpenLogicalChannelAck(OOH323CallData *call, H245OpenLogicalChannelAck *olcAck){ char remoteip[20]; ooLogicalChannel *pLogicalChannel; H245H2250LogicalChannelAckParameters *h2250lcap; H245UnicastAddress *unicastAddr; H245UnicastAddress_iPAddress *iPAddress; H245UnicastAddress *unicastAddr1; H245UnicastAddress_iPAddress *iPAddress1; if(!((olcAck->m.forwardMultiplexAckParametersPresent == 1) && (olcAck->forwardMultiplexAckParameters.t == T_H245OpenLogicalChannelAck_forwardMultiplexAckParameters_h2250LogicalChannelAckParameters))) { OOTRACEERR3("Error: Processing open logical channel ack - LogicalChannel" "Ack parameters absent (%s, %s)\n", call->callType, call->callToken); return OO_OK; /* should send CloseLogicalChannel request */ } h2250lcap = olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters; /* Extract media channel address */ if(h2250lcap->m.mediaChannelPresent != 1) { OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel " "absent (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } if(h2250lcap->mediaChannel.t != T_H245TransportAddress_unicastAddress) { OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel " "address type is not unicast (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } unicastAddr = h2250lcap->mediaChannel.u.unicastAddress; if(unicastAddr->t != T_H245UnicastAddress_iPAddress) { OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel " "address type is not IP (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } iPAddress = unicastAddr->u.iPAddress; sprintf(remoteip,"%d.%d.%d.%d", iPAddress->network.data[0], iPAddress->network.data[1], iPAddress->network.data[2], iPAddress->network.data[3]); /* Extract media control channel address */ if(h2250lcap->m.mediaControlChannelPresent != 1) { OOTRACEERR3("Error: Processing OpenLogicalChannelAck - Missing media " "control channel (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } if(h2250lcap->mediaControlChannel.t != T_H245TransportAddress_unicastAddress) { OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control " "channel addres type is not unicast (%s, %s)\n",
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?