struct conn_triad { uint16_t usConnSno; uint16_t usVendorId; uint32_t ulOrigSno; }; EIP_OBJECT_PACKET_CONNECTION_IND_T* ptInd = (EIP_OBJECT_PACKET_CONNECTION_IND_T*) (&ptAppData->aptChannels[EIP_DEMO_CHANNEL_INDEX]->tPacket); bool fIsCyclic = ((ptInd->tData.bConnType == EIP_CONN_TYPE_CLASS_0_1_EXCLUSIVE_OWNER) || (ptInd->tData.bConnType == EIP_CONN_TYPE_CLASS_0_1_REDUNDANT_OWNER) || (ptInd->tData.bConnType == EIP_CONN_TYPE_CLASS_0_1_LISTEN_ONLY) || (ptInd->tData.bConnType == EIP_CONN_TYPE_CLASS_0_1_INPUT_ONLY)); bool fIsPoint2Point = (ptInd->tData.usTOConnParam & EIP_CM_PARAM_TYPE_MASK) == EIP_CM_PARAM_TYPE_POINT; bool fisTimeout = (ptInd->tData.ulConnectionState == EIP_UNCONNECT) && (ptInd->tData.ulExtendedState == EIP_CONN_STATE_TIMEOUT); struct conn_triad triad = { ptInd->tData.usConnSerialNum, ptInd->tData.usVendorId, ptInd->tData.ulOSerialNum }; if (fIsCyclic && fIsPoint2Point && fisTimeout) { EIP_OBJECT_PACKET_TERMINATE_CONNECTION_REQ_T* ptReq = (EIP_OBJECT_PACKET_TERMINATE_CONNECTION_REQ_T*)(&ptAppData->aptChannels[EIP_DEMO_CHANNEL_INDEX]->tPacket); memset(&ptReq->tHead, 0, sizeof(ptReq->tHead)); ptReq->tHead.ulCmd = EIP_OBJECT_TERMINATE_CONNECTION_REQ; ptReq->tHead.ulLen = 8; ptReq->tHead.ulDest = 0x20; ptReq->tData.usConnectionSerialNumber = triad.usConnSno; ptReq->tData.usVendorId = triad.usVendorId; ptReq->tData.ulOriginatorSerialNum = triad.ulOrigSno; (void)Pkt_SendReceivePacket(ptAppData, EIP_DEMO_CHANNEL_INDEX, (CIFX_PACKET*)ptReq, TX_TIMEOUT); EIP_OBJECT_PACKET_TERMINATE_CONNECTION_CNF_T* ptCnf = (EIP_OBJECT_PACKET_TERMINATE_CONNECTION_CNF_T*)(&ptAppData->aptChannels[EIP_DEMO_CHANNEL_INDEX]->tPacket); if (ptCnf->tHead.ulSta != 0) { PRINTF("Error/Warning: Failed to terminate connection" NEWLINE); } else { PRINTF("Successfully terminated timed-out class 0/1 PointToPoint (Safety) connection" NEWLINE); } }