www.pudn.com > VOIP(H323).rar > ooRas.c
/* * Copyright (C) 2004 by Giant Electronics, Inc. *****************************************************************************/ #include "ooRas.h" #ifdef _WIN32 //#include//#include #include #endif static ASN1OBJID gRasProtocolID = { 6, { 0, 0, 8, 2250, 0, 2 } }; int ooCreateRasMessage(struct ooAppContext *context, int type) { OOCTXT* pctxt = NULL; if(context->outgoingRas != NULL) { OOTRACEWARN2(context, "Can not create Ras message - message exists"); return OO_FAILED; } pctxt = (OOCTXT*)newContext(); if(pctxt == NULL) { OOTRACEERR2(context,"ERROR: Failed to allocate ASN1 context for " "outgoing Ras message creation"); return OO_FAILED; } context->outgoingRas = (RasMessage*)ASN1MALLOC(pctxt,sizeof(RasMessage)); if(context->outgoingRas == NULL) { OOTRACEERR2(context,"Failed to allocate memory for Ras message"); return OO_FAILED; } else { memset(context->outgoingRas, 0, sizeof(context->outgoingRas)); context->outgoingRas->pctxt = pctxt; context->outgoingRas->RasMsg.t = type; switch(type) { case T_H225RasMessage_gatekeeperRequest: context->outgoingRas->RasMsg.u.gatekeeperRequest = (H225GatekeeperRequest*)ASN1MALLOC(pctxt,sizeof(H225GatekeeperRequest)); if(context->outgoingRas->RasMsg.u.gatekeeperRequest == 0) { OOTRACEERR2(context, "Memory allocation for Ras gatekeeper request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.gatekeeperRequest, 0, sizeof(H225GatekeeperRequest)); break; case T_H225RasMessage_gatekeeperConfirm : context->outgoingRas->RasMsg.u.gatekeeperConfirm = (H225GatekeeperConfirm*)ASN1MALLOC(pctxt,sizeof(H225GatekeeperConfirm)); if(context->outgoingRas->RasMsg.u.gatekeeperConfirm == 0) { OOTRACEERR2(context, "Memory allocation for Ras confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.gatekeeperConfirm, 0, sizeof(H225GatekeeperConfirm)); break; case T_H225RasMessage_gatekeeperReject: context->outgoingRas->RasMsg.u.gatekeeperReject = (H225GatekeeperReject*)ASN1MALLOC(pctxt,sizeof(H225GatekeeperReject)); if(context->outgoingRas->RasMsg.u.gatekeeperReject == 0) { OOTRACEERR2(context, "Memory allocation for ras gatekeeper reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.gatekeeperReject, 0, sizeof(H225GatekeeperReject)); break; case T_H225RasMessage_registrationRequest: context->outgoingRas->RasMsg.u.registrationRequest = (H225RegistrationRequest*)ASN1MALLOC(pctxt,sizeof(H225RegistrationRequest)); if(context->outgoingRas->RasMsg.u.registrationRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras registration request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.registrationRequest, 0, sizeof(H225RegistrationRequest)); break; case T_H225RasMessage_registrationConfirm: context->outgoingRas->RasMsg.u.registrationConfirm = (H225RegistrationConfirm*)ASN1MALLOC(pctxt,sizeof(H225RegistrationConfirm)); if(context->outgoingRas->RasMsg.u.registrationConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras registration confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.registrationConfirm,0, sizeof(H225RegistrationConfirm)); break; case T_H225RasMessage_registrationReject: context->outgoingRas->RasMsg.u.registrationReject = (H225RegistrationReject*)ASN1MALLOC(pctxt,sizeof(H225RegistrationReject)); if(context->outgoingRas->RasMsg.u.registrationReject == 0) { OOTRACEERR2(context, "Memory allocation for ras registration reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.registrationReject,0, sizeof(H225RegistrationReject)); break; case T_H225RasMessage_unregistrationRequest: context->outgoingRas->RasMsg.u.unregistrationRequest = (H225UnregistrationRequest*)ASN1MALLOC(pctxt,sizeof(H225UnregistrationRequest)); if(context->outgoingRas->RasMsg.u.unregistrationRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras unregistration request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.unregistrationRequest,0, sizeof(H225UnregistrationRequest)); break; case T_H225RasMessage_unregistrationConfirm: context->outgoingRas->RasMsg.u.unregistrationConfirm = (H225UnregistrationConfirm*)ASN1MALLOC(pctxt,sizeof(H225UnregistrationConfirm)); if(context->outgoingRas->RasMsg.u.unregistrationConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras unregistration confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.unregistrationConfirm,0, sizeof(H225UnregistrationConfirm)); break; case T_H225RasMessage_unregistrationReject: context->outgoingRas->RasMsg.u.unregistrationReject = (H225UnregistrationReject*)ASN1MALLOC(pctxt,sizeof(H225UnregistrationReject)); if(context->outgoingRas->RasMsg.u.unregistrationReject == 0) { OOTRACEERR2(context, "Memory allocation for ras unregistration reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.unregistrationReject,0, sizeof(H225UnregistrationReject)); break; case T_H225RasMessage_admissionRequest: context->outgoingRas->RasMsg.u.admissionRequest = (H225AdmissionRequest*)ASN1MALLOC(pctxt,sizeof(H225AdmissionRequest)); if(context->outgoingRas->RasMsg.u.admissionRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras admission request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.admissionRequest,0, sizeof(H225AdmissionRequest)); break; case T_H225RasMessage_admissionConfirm: context->outgoingRas->RasMsg.u.admissionConfirm = (H225AdmissionConfirm*)ASN1MALLOC(pctxt,sizeof(H225AdmissionConfirm)); if(context->outgoingRas->RasMsg.u.admissionConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras admission confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.admissionConfirm,0, sizeof(H225AdmissionConfirm)); break; case T_H225RasMessage_admissionReject: context->outgoingRas->RasMsg.u.admissionReject = (H225AdmissionReject*)ASN1MALLOC(pctxt,sizeof(H225AdmissionReject)); if(context->outgoingRas->RasMsg.u.admissionReject == 0) { OOTRACEERR2(context, "Memory allocation for ras admission reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.admissionReject,0, sizeof(H225AdmissionReject)); break; case T_H225RasMessage_bandwidthRequest: context->outgoingRas->RasMsg.u.bandwidthRequest = (H225BandwidthRequest*)ASN1MALLOC(pctxt,sizeof(H225BandwidthRequest)); if(context->outgoingRas->RasMsg.u.bandwidthRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras bandwidth request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.bandwidthRequest,0, sizeof(H225BandwidthRequest)); break; case T_H225RasMessage_bandwidthConfirm: context->outgoingRas->RasMsg.u.bandwidthConfirm = (H225BandwidthConfirm*)ASN1MALLOC(pctxt,sizeof(H225BandwidthConfirm)); if(context->outgoingRas->RasMsg.u.bandwidthConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras bandwidth confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.bandwidthConfirm,0, sizeof(H225BandwidthConfirm)); break; case T_H225RasMessage_bandwidthReject: context->outgoingRas->RasMsg.u.bandwidthReject = (H225BandwidthReject*)ASN1MALLOC(pctxt,sizeof(H225BandwidthReject)); if(context->outgoingRas->RasMsg.u.bandwidthReject == 0) { OOTRACEERR2(context, "Memory allocation for ras bandwidth reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.bandwidthReject,0, sizeof(H225AdmissionReject)); break; case T_H225RasMessage_disengageRequest: context->outgoingRas->RasMsg.u.disengageRequest = (H225DisengageRequest*)ASN1MALLOC(pctxt,sizeof(H225DisengageRequest)); if(context->outgoingRas->RasMsg.u.disengageRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras disengage request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.disengageRequest,0, sizeof(H225DisengageRequest)); break; case T_H225RasMessage_disengageConfirm: context->outgoingRas->RasMsg.u.disengageConfirm = (H225DisengageConfirm*)ASN1MALLOC(pctxt,sizeof(H225DisengageConfirm)); if(context->outgoingRas->RasMsg.u.disengageConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras disengage confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.disengageConfirm,0, sizeof(H225BandwidthConfirm)); break; case T_H225RasMessage_disengageReject: context->outgoingRas->RasMsg.u.disengageReject = (H225DisengageReject*)ASN1MALLOC(pctxt,sizeof(H225DisengageReject)); if(context->outgoingRas->RasMsg.u.disengageReject == 0) { OOTRACEERR2(context, "Memory allocation for ras disengage reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.disengageReject,0, sizeof(H225DisengageReject)); break; case T_H225RasMessage_locationRequest: context->outgoingRas->RasMsg.u.locationRequest = (H225LocationRequest*)ASN1MALLOC(pctxt,sizeof(H225LocationRequest)); if(context->outgoingRas->RasMsg.u.locationRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras location request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.locationRequest,0, sizeof(H225LocationRequest)); break; case T_H225RasMessage_locationConfirm: context->outgoingRas->RasMsg.u.locationConfirm = (H225LocationConfirm*)ASN1MALLOC(pctxt,sizeof(H225LocationConfirm)); if(context->outgoingRas->RasMsg.u.locationConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras location confirm" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.locationConfirm,0, sizeof(H225LocationConfirm)); break; case T_H225RasMessage_locationReject: context->outgoingRas->RasMsg.u.locationReject = (H225LocationReject*)ASN1MALLOC(pctxt,sizeof(H225LocationReject)); if(context->outgoingRas->RasMsg.u.locationReject == 0) { OOTRACEERR2(context, "Memory allocation for ras location reject" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.locationReject,0, sizeof(H225LocationReject)); break; case T_H225RasMessage_infoRequest: context->outgoingRas->RasMsg.u.infoRequest = (H225InfoRequest*)ASN1MALLOC(pctxt,sizeof(H225InfoRequest)); if(context->outgoingRas->RasMsg.u.infoRequest == 0) { OOTRACEERR2(context, "Memory allocation for ras info request" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.infoRequest,0, sizeof(H225InfoRequest)); break; case T_H225RasMessage_infoRequestResponse: context->outgoingRas->RasMsg.u.infoRequestResponse = (H225InfoRequestResponse*)ASN1MALLOC(pctxt,sizeof(H225InfoRequestResponse)); if(context->outgoingRas->RasMsg.u.infoRequestResponse == 0) { OOTRACEERR2(context, "Memory allocation for ras info Request response" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.infoRequestResponse,0, sizeof(H225InfoRequestResponse)); break; case T_H225RasMessage_nonStandardMessage: context->outgoingRas->RasMsg.u.nonStandardMessage = (H225NonStandardMessage*)ASN1MALLOC(pctxt,sizeof(H225NonStandardMessage)); if(context->outgoingRas->RasMsg.u.nonStandardMessage == 0) { OOTRACEERR2(context, "Memory allocation for ras nonStandard message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.nonStandardMessage,0, sizeof(H225NonStandardMessage)); break; case T_H225RasMessage_requestInProgress: context->outgoingRas->RasMsg.u.requestInProgress = (H225RequestInProgress*)ASN1MALLOC(pctxt,sizeof(H225RequestInProgress)); if(context->outgoingRas->RasMsg.u.requestInProgress == 0) { OOTRACEERR2(context, "Memory allocation for ras request In progress message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.requestInProgress,0, sizeof(H225RequestInProgress)); break; case T_H225RasMessage_resourcesAvailableIndicate: context->outgoingRas->RasMsg.u.resourcesAvailableIndicate = (H225ResourcesAvailableIndicate*)ASN1MALLOC(pctxt,sizeof(H225ResourcesAvailableIndicate)); if(context->outgoingRas->RasMsg.u.resourcesAvailableIndicate == 0) { OOTRACEERR2(context, "Memory allocation for ras resources Available Indicate message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.resourcesAvailableIndicate,0, sizeof(H225ResourcesAvailableIndicate)); break; case T_H225RasMessage_resourcesAvailableConfirm: context->outgoingRas->RasMsg.u.resourcesAvailableConfirm = (H225ResourcesAvailableConfirm*)ASN1MALLOC(pctxt,sizeof(H225ResourcesAvailableConfirm)); if(context->outgoingRas->RasMsg.u.resourcesAvailableConfirm == 0) { OOTRACEERR2(context, "Memory allocation for ras resourcesAvailableConfirm message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.resourcesAvailableConfirm,0, sizeof(H225ResourcesAvailableConfirm)); break; case T_H225RasMessage_infoRequestAck: context->outgoingRas->RasMsg.u.infoRequestAck = (H225InfoRequestAck*)ASN1MALLOC(pctxt,sizeof(H225InfoRequestAck)); if(context->outgoingRas->RasMsg.u.infoRequestAck == 0) { OOTRACEERR2(context, "Memory allocation for ras info request message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.infoRequestAck,0, sizeof(H225InfoRequestAck)); break; case T_H225RasMessage_infoRequestNak: context->outgoingRas->RasMsg.u.infoRequestNak = (H225InfoRequestNak*)ASN1MALLOC(pctxt,sizeof(H225InfoRequestNak)); if(context->outgoingRas->RasMsg.u.infoRequestNak == 0) { OOTRACEERR2(context, "Memory allocation for ras InfoRequestNak message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.infoRequestNak,0, sizeof(H225InfoRequestNak)); break; case T_H225RasMessage_serviceControlIndication: context->outgoingRas->RasMsg.u.serviceControlIndication = (H225ServiceControlIndication*)ASN1MALLOC(pctxt,sizeof(H225ServiceControlIndication)); if(context->outgoingRas->RasMsg.u.serviceControlIndication == 0) { OOTRACEERR2(context, "Memory allocation for ras serviceControlIndication message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.serviceControlIndication,0, sizeof(H225ServiceControlIndication)); break; case T_H225RasMessage_serviceControlResponse: context->outgoingRas->RasMsg.u.serviceControlResponse = (H225ServiceControlResponse*)ASN1MALLOC(pctxt,sizeof(H225ServiceControlResponse)); if(context->outgoingRas->RasMsg.u.serviceControlResponse == 0) { OOTRACEERR2(context, "Memory allocation for ras serviceControlResponse message" " message failed"); return OO_FAILED; } else memset(context->outgoingRas->RasMsg.u.serviceControlResponse,0, sizeof(H225ServiceControlResponse)); break; case T_H225RasMessage_admissionConfirmSequence: break; default: OOTRACEERR2(context,"ERROR: Ras message type not supported"); } return OO_OK; } } int ooFreeRasMessage(struct ooAppContext *context, RasMessage *pmsg) { OOCTXT *pctxt; if(pmsg == NULL) { OOTRACEWARN2(context, "ERROR: No Ras message to free"); return OO_FAILED; } if(context->outgoingRas == pmsg) context->outgoingRas = NULL; pctxt = pmsg->pctxt; freeContext(pctxt); ASN1CRTFREE0(pctxt); return OO_OK; } int ooGetOutgoingRasMsgbuf(struct ooAppContext *context,ASN1OCTET *msgbuf,int *len,int *msgType) { RasMessage *p_RasMsg=NULL; H225RasMessage *h225RasMsg=NULL; DListNode * p_msgNode=NULL; int i =0; ASN1BOOL aligned =TRUE, trace =FALSE; ASN1OCTET encodeBuf[1024]; ASN1OCTET* encodeptr=NULL; int encodeLen=0; OOCTXT* pctxt=NULL; memset(encodeBuf, 0, sizeof(encodeBuf)); if(context->outRasQueue.count == 0) { OOTRACEERR2(context,"ERROR:No outgoing ras message"); return OO_FAILED; } p_msgNode = context->outRasQueue.head; p_RasMsg = (RasMessage*) p_msgNode->data; *msgType = p_RasMsg->msgType; h225RasMsg = &(p_RasMsg->RasMsg); /* Encode the Multimedia Control Message */ pctxt = p_RasMsg->pctxt; setPERBuffer(pctxt, encodeBuf, sizeof(encodeBuf), aligned); if(asn1PE_H225RasMessage(pctxt, h225RasMsg)!=ASN_OK) { OOTRACEERR2(context, "ERROR: ras Message encoding failed"); /* Free memory associated with the message */ freeContext(pctxt); ASN1CRTFREE0(pctxt); return OO_FAILED; } encodeptr = encodeGetMsgPtr(pctxt, &encodeLen); memcpy(msgbuf,encodeptr,encodeLen); *len = encodeLen; dListRemove(&(context->outRasQueue), p_msgNode); /* Free memory associated with the message */ freeContext(pctxt); ASN1CRTFREE0(pctxt); if(p_msgNode) ASN1MEMFREEPTR(&(context->outRasListCtxt), p_msgNode); return OO_OK; } /*EXTERN int ooSendRegistrationRequestMsg(struct ooAppContext *context) { int ret; H225RegistrationRequest *regRequest; OOCTXT *pctxt; static ASN1USINT SeqNo = 0; H225TransportAddress *CallSignalAddress; int addr_seg1,addr_seg2,addr_seg3,addr_seg4; char hexIp[20]; H225TransportAddress_ipAddress destIpAddr; H225TransportAddress *RasAddress; ret = ooCreateRasMessage(context,T_H225RasMessage_registrationRequest); if(ret == OO_FAILED) { OOTRACEERR2(context,"Error:Failed to create Ras message"); return ret; } regRequest = context->outgoingRas->RasMsg.u.registrationRequest; pctxt = context->outgoingRas->pctxt; regRequest->m.terminalAliasPresent = 1; regRequest->requestSeqNum = ( SeqNo++ ) % 65536; regRequest->protocolIdentifier = gRasProtocolID; regRequest->discoveryComplete = FALSE; CallSignalAddress = (H225TransportAddress*)ASN1MALLOC(pctxt,sizeof(H225TransportAddress)); memset(CallSignalAddress,0,sizeof(H225TransportAddress)); CallSignalAddress->t = T_H225TransportAddress_ipAddress; sscanf(destIp,"%d.%d.%d.%d",&addr_seg1,&addr_seg2,&addr_seg3,&addr_seg4); sprintf(hexIp,"%x %x %x %x",addr_seg1,addr_seg2,addr_seg3,addr_seg4); sscanf(hexIp,"%x %x %x %x",&destIpAddr.ip.data[0],&destIpAddr.ip.data[1], &destIpAddr.ip.data[2],&destIpAddr.ip.data[3]); CallSignalAddress->u.ipAddress = &destIpAddr; dListInit(&(regRequest->callSignalAddress)); dListAppend(pctxt,&(regRequest->callSignalAddress),CallSignalAddress); RasAddress = (H225TransportAddress*)ASN1MALLOC(pctxt,sizeof(H225TransportAddress)); memset(RasAddress,0,sizeof(H225TransportAddress)); dListInit(&(regRequest->rasAddress)); dListAppend(pctxt,&(regRequest->rasAddress),RasAddress); return OO_OK; }*/