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); }
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); } }
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); } }
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); }