Ejemplo n.º 1
0
Encap_Header *_BuildRequest(Eip_Session *session,Eip_Item *adressitem,void *adress,
										Eip_Item *dataitem,void *data,int timeout)
{ int requestsize=0;
	Encap_Header *request=NULL;
	CIPERROR(0,0,0);
	LogCip(LogTrace,"->Entering BuildRequest \n");
	requestsize=sizeof(SendData_Request)+sizeof(CIP_UINT)+//sizeof(Eip_Common_Packet)+
	_GetItemSize(adressitem)+adressitem->Length+_GetItemSize(dataitem)+dataitem->Length;
	request=malloc(requestsize);
	if (request==NULL)
	{
		CIPERROR(Sys_Error,errno,0);
		LogCip(LogTrace,"!Exiting BuildRequest with error : %s\n",_cip_err_msg);
		return(NULL);
	}
	memset(request,0,requestsize);
	request->Length=sizeof(CIP_UDINT)+/*Interface_Handle*/
									sizeof(CIP_UINT);/*Timeout*/
	request->Session_Handle=session->Session_Handle;
	request->Sender_ContextL=session->Sender_ContextL;
	request->Sender_ContextH=session->Sender_ContextH;
	((SendData_Request*)request)->Timeout=timeout/1000;
	_AddCPF(request,adressitem,adress,dataitem,data);
	FlushCipBuffer(LogDebug,request,requestsize);
	LogCip(LogTrace,"<-Exiting BuildRequest : size=%d (%p)\n",requestsize,request);
	return(request);
}
Ejemplo n.º 2
0
Eip_CDI *_ConnectedSend( Eip_Session *session,Eip_Connection *connection,
                    void *request,int size)
{ Eip_CAI adressitem;
	Eip_CDI dataitem;
	Eip_CDI *result=NULL;
	Encap_Header *reply=NULL;

	LogCip(LogTrace,"->Entering ConnectedSend \n");

	// adressitem
	adressitem.Type_Id=ItemId_ConnectionBased;
	adressitem.Length=0;
	adressitem.CID=connection->OT_ConnID;

	// dataitem
	dataitem.Type_Id=ItemId_ConnectedTP;
	dataitem.Packet=++(connection->packet);
	dataitem.Length=size;

	reply=_SendData_WaitReply(session,EIP_SENDUNITDATA,(void*)&adressitem,NULL,(void*)&dataitem,request);
	if (reply!=NULL)
		{
			Eip_CDI *respdataitem =(Eip_CDI *)_GetDataItem(reply);
			if (respdataitem==NULL)
			{
				CIPERROR(EIP_Error,reply->Status,0);
				free(reply);
				LogCip(LogTrace,"!Exiting ConnectedSend with error : %s\n",_cip_err_msg);
				return(NULL);
			}
			if ((reply->Command!=EIP_SENDUNITDATA)||(respdataitem->Packet!=connection->packet))
				{
					CIPERROR(Internal_Error,E_UnsolicitedMsg,0);
					free(reply);
					LogCip(LogTrace,"!Exiting ConnectedSend with error : %s\n",_cip_err_msg);
					return(NULL);
				}
			/* Result is OK */
      CIPERROR(EIP_Error,reply->Status,0);
			result=malloc(sizeof(Eip_CDI)+respdataitem->Length);
			memcpy(result,respdataitem,sizeof(Eip_Item)+respdataitem->Length);
			LogCip(LogTrace,"<-Exiting ConnectedSend : size=%d (%p)\n",sizeof(Eip_Item)+respdataitem->Length,respdataitem);
			free(reply);
			return(result);
		}
		else
		{
			LogCip(LogTrace,"!Exiting ConnectedSend with no response\n");
			return(NULL);
		}
}
Ejemplo n.º 3
0
Archivo: CM.c Proyecto: arhunn/pvbaddon
int _ExForward_Close(Eip_Session *session,CIP_USINT Priority,	
			CIP_USINT TimeOut_Ticks,CIP_UINT ConnSerialNumber,CIP_UINT OriginatorVendorID,
			CIP_UDINT OriginatorSerialNumber,BYTE *path,CIP_USINT requestpathsize)
{	int pathsize=((requestpathsize%2)?(requestpathsize/2+1):(requestpathsize/2));
	int requestsize=sizeof(Forward_Close_Request)+2*pathsize;
	int replysize=0;
	Forward_Close_Request *request=malloc(requestsize);	
	if (request==NULL)
	{
		CIPERROR(Sys_Error,errno,0);
		return(EX_Error);
	}
	memset(request,0,requestsize);
	request->Priority=Priority;//used to calculate request timeout information
	request->TimeOut_Ticks=TimeOut_Ticks;//used to calculate request timeout information
	request->ConnSerialNumber=ConnSerialNumber;// session serial number
	request->OriginatorVendorID=OriginatorVendorID;
	request->OriginatorSerialNumber=OriginatorSerialNumber;
	request->PathSize=pathsize;// size of session path in 16 bits words
	memcpy(&(request->Path),path,requestpathsize);// padded EPath
	MR_Reply *reply=_SendMRRequest(session,FORWARD_CLOSE,CM_PATH,sizeof(CM_PATH),request,requestsize,&replysize);
	free(request);
	if (reply!=NULL)
	{
		LogCip(LogDebug,"_ExForward_Close : reply=%p (%d)\n",reply,replysize);
		CIPERROR(MR_Error,reply->General_Status,_GetMRExtendedStatus(reply));
		int status=reply->General_Status;
		free(reply);
		return(status);
	} else
	{
		return(EX_Error);
	}
}
Ejemplo n.º 4
0
Encap_Header *_SendData_WaitReply(Eip_Session *session,CIP_UINT command,
							Eip_Item *adressitem,void *adress,
							Eip_Item *dataitem,void *data)
{ Encap_Header *request=NULL;
	Encap_Header *reply=NULL;
	CIPERROR(0,0,0);
	LogCip(LogTrace,"->Entering SendData_WaitReply\n");
	request=_BuildRequest(session,adressitem,adress,dataitem,data,session->timeout);
	if (request==NULL)
	{
		CIPERROR(Sys_Error,errno,0);
		LogCip(LogTrace,"!Exiting SendData with error : %s\n",_cip_err_msg);
		return(NULL);
	}
	request->Command=command;
	reply=CipSendData_WaitReply(session->sock,request,session->timeout,session->timeout);
	free(request);
	LogCip(LogTrace,"<-Exiting SendData_WaitReply : %p\n",request);
	return(reply);
}