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