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