MR_Reply *_SendMRRequest(Eip_Session *session,CIP_USINT service,BYTE *path, CIP_USINT requestpathsize,void *requestdata,int requestdatasize,int *replysize) { int mrsize=0; MR_Request *request=_BuildMRRequest(service,path,requestpathsize,requestdata,requestdatasize,&mrsize); MR_Reply *reply=_ExSendMRRequest(session,request,mrsize,replysize); free(request); return(reply); }
MR_Reply *_UnconnectedSend(Eip_Session *session,BYTE Priority, CIP_USINT TimeOut_Ticks, MR_Request *MRrequest,int MRrequestsize, BYTE *routepath,CIP_USINT routepathsize,int *replysize) { Unconnected_Send_Request *UCRequest=NULL; MR_Reply *reply=NULL; if ((MRrequest==NULL) && (MRrequestsize<=0)) { CIPERROR(Internal_Error,E_NothingToSend,0); return(NULL); } if ((routepath!=NULL) && (routepathsize>0)) // { int UCRequestsize=sizeof(Unconnected_Send_Request) +MRrequestsize +(MRrequestsize%2) // pad +routepathsize+routepathsize%2; UCRequest=malloc(UCRequestsize); if (UCRequest==NULL) { CIPERROR(Sys_Error,errno,0); return(NULL); }; memset(UCRequest,0,UCRequestsize); void *pos=(void *)(&(UCRequest->MRRequest)); UCRequest->Priority=Priority;//used to calculate request timeout information UCRequest->TimeOut_Ticks=TimeOut_Ticks;//used to calculate request timeout information UCRequest->Request_size=MRrequestsize; memcpy(pos,MRrequest,MRrequestsize); pos+=MRrequestsize+MRrequestsize%2; *((CIP_USINT *)pos)=routepathsize/2; pos+=2*sizeof(CIP_USINT); memcpy(pos,routepath,routepathsize); reply=_SendMRRequest(session,UNCONNECTED_SEND,CM_PATH,sizeof(CM_PATH),UCRequest,UCRequestsize,replysize); free(UCRequest); if (reply!=NULL) { if ((reply->Service!=(UNCONNECTED_SEND+0x80))&&(reply->Service!=(MRrequest->Service+0x80))) { CIPERROR(Internal_Error,E_UnsolicitedMsg,0); free(reply); return(NULL); } else { CIPERROR(MR_Error,reply->General_Status,_GetMRExtendedStatus(reply)); return(reply); } } else return(NULL); } else { reply=_ExSendMRRequest(session,MRrequest,MRrequestsize,replysize); if (reply!=NULL) { if (reply->Service!=(MRrequest->Service+0x80)) { CIPERROR(Internal_Error,E_UnsolicitedMsg,0); free(reply); return(NULL); } else { CIPERROR(MR_Error,reply->General_Status,_GetMRExtendedStatus(reply)); return(reply); } } else return(NULL); } }