示例#1
0
文件: LGX.cpp 项目: tcrutt/tuxeip-1
IdList *_GetIdList(Eip_Session *session,BYTE routepath[],int routepathsize)
{
	int replysize=0,MRrequestsize=0;
	int mrdatasize=0;int count=0;
	void *MRData=NULL;
	IdList *result=NULL;
	BYTE path[4]={0x20,OBJECT_PROP,0x24,0x00};
	//BYTE routepath[2]={0x01,0x00};

	MR_Request *MRrequest=_BuildMRRequest(CIP_LIST_ALL_OBJECTS,path,sizeof(path),NULL,0,&MRrequestsize);
	MR_Reply *reply=UnconnectedSend(session,MRrequest,MRrequestsize,routepath,routepathsize,&replysize);
	free(MRrequest);
	if (reply!=NULL)
	{
		//_CipFlushBuffer(reply,replysize);
		MRData=_GetMRData(reply);
		mrdatasize=replysize-sizeof(MR_Reply)-reply->Add_Status_Size;
		if (mrdatasize>0)
		{
			count=mrdatasize/4;
			result=(IdList *)malloc(sizeof(result->IdCount)+mrdatasize);
			if (result!=NULL)
			{
				result->IdCount=count;
				memcpy(&(result->Id[0]),MRData,mrdatasize);
			} else
			{
				CIPERROR(Sys_Error,errno,0);
			}
		}
		//printf("replysize : %d : %d\n",replysize,mrdatasize);
		free(reply);
		return(result);
	} else return(NULL);
}
示例#2
0
文件: CM.c 项目: arhunn/pvbaddon
Eip_Connection *_Forward_Open(Eip_Session *session,/*Eip_Connection *connection,*/BYTE Priority,
			CIP_USINT TimeOut_Ticks,CIP_UDINT TO_ConnID,CIP_UINT ConnSerialNumber,
			CIP_UINT OriginatorVendorID,CIP_UDINT OriginatorSerialNumber,
			CIP_USINT TimeOutMultiplier,CIP_UDINT RPI,CIP_UINT Parameters,CIP_USINT Transport,
			BYTE *path,CIP_USINT requestpathsize)
{	int taille=((requestpathsize%2)?(requestpathsize/2+1):(requestpathsize/2));
	Forward_Open_Request *request=malloc(sizeof(Forward_Open_Request)+2*taille);
	if (request==NULL)
	{
		CIPERROR(Sys_Error,errno,0);
		return(NULL);
	}
	memset(request,0,sizeof(*request)+2*taille);
	request->Priority=Priority;//used to calculate request timeout information
	request->TimeOut_Ticks=TimeOut_Ticks;//used to calculate request timeout information
	request->OT_ConnID=0;//TO_ConnID; //originator's CIP Produced session ID
	request->TO_ConnID=TO_ConnID; //originator's CIP consumed session ID
	request->ConnSerialNumber=ConnSerialNumber;// session serial number
	request->OriginatorVendorID=OriginatorVendorID;
	request->OriginatorSerialNumber=OriginatorSerialNumber;
	request->TimeOutMultiplier=TimeOutMultiplier;
	request->OT_RPI=1000*RPI;// originator to target packet rate in msec
	request->OT_Parameters=Parameters; 
	request->TO_RPI=1000*RPI;// target to originator packet rate in msec
	request->TO_Parameters=Parameters; 
	request->Transport=Transport;// class T3
	request->PathSize=taille;// size of session path in 16 bits words
	memcpy(&(request->Path),path,requestpathsize);// padded EPath
	MR_Reply *reply=_SendMRRequest(session,FORWARD_OPEN,CM_PATH,sizeof(CM_PATH),request,sizeof(*request)+2*request->PathSize,NULL);
	free(request);
	if (reply!=NULL) 
	{ 
	 //Success_Forward_Open_Reply *sfor=_GetCMReply(session->reply);
		Success_Forward_Open_Reply *sfor=_GetMRData(reply);
		if (sfor!=NULL)
		{ Eip_Connection *connection=malloc(sizeof(Eip_Connection)+2*requestpathsize);
			if (connection==NULL)
			{
				CIPERROR(Sys_Error,errno,0);
				free(reply);
				return(NULL);
			}	
			connection->Session=session;
			connection->OriginatorVendorID=OriginatorVendorID;
			connection->OriginatorSerialNumber=OriginatorSerialNumber;
			connection->ConnectionSerialNumber=ConnSerialNumber;
			connection->OT_ConnID=sfor->OT_ConnID;
			connection->TO_ConnID=sfor->TO_ConnID;
			connection->packet=0;
			connection->Path_size=requestpathsize;
			memcpy(((void*)connection)+sizeof(Eip_Connection),path,requestpathsize);
			free(reply);
			return(connection);
		} else 
		{
			free(reply);
			return(NULL);
		}
	} else return(NULL);	
}