27 const struct sockaddr *
const originator_address,
33 current_communication_buffer_position,
35 &g_common_packet_format_data_item) ) ) {
69 "notifyCPF: got something besides the expected CIP_ITEM_ID_UNCONNECTEDMESSAGE\n");
79 "notifyCPF: got something besides the expected CIP_ITEM_ID_NULL\n");
93 const struct sockaddr *
const originator_address,
98 received_data->
data_length, &g_common_packet_format_data_item);
110 if (NULL != connection_object) {
121 "Class 3 sequence number: %d, last sequence number: %d\n",
127 memcpy(outgoing_message,
181 "notifyConnectedCPF: got something besides the expected CIP_ITEM_ID_UNCONNECTEDMESSAGE\n");
185 "notifyConnectedCPF: connection with given ID could not be found\n");
189 "notifyConnectedCPF: got something besides the expected CIP_ITEM_ID_NULL\n");
212 int length_count = 0;
215 common_packet_format_data->
item_count = item_count;
217 if (common_packet_format_data->
item_count >= 1U) {
232 if (common_packet_format_data->
item_count >= 2) {
239 for (
size_t j = 0; j < (common_packet_format_data->
item_count - 2); j++)
259 for (
size_t i = 0; i < 8; i++) {
271 if (common_packet_format_data->
item_count < 4) {
273 if (common_packet_format_data->
item_count < 3) {
277 if (length_count == data_length) {
281 "something is wrong with the length in Message Router @ CreateCommonPacketFormatStructure\n");
282 if (common_packet_format_data->
item_count > 2) {
418 for (
size_t i = 0; i < common_packet_format_data_item->
data_item.
length;
601 for (
size_t i = 0; i < message_router_response->
data_length; i++) {
654 if (message_router_response) {
691 if (message_router_response) {
734 for (
int j = 0; j < 2; j++) {
738 j, common_packet_format_data_item, outgoing_message);
int EncodeDataItemData(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
int EncodeSequencedAddressItem(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
Encodes a sequenced address item into the message.
int EncodeSockaddrInfoLength(int item_type, const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
Encodes the sockaddr info length into the message.
EipStatus CreateCommonPacketFormatStructure(const EipUint8 *data, size_t data_length, CipCommonPacketFormatData *common_packet_format_data)
Creates Common Packet Format structure out of data.
Tracing infrastructure for OpENer.
EipStatus NotifyMessageRouter(EipUint8 *data, int data_length, const struct sockaddr *const originator_address, const int encapsulation_session)
Notify the MessageRouter that an explicit message (connected or unconnected) has been received...
EipUint16 additional_status[MAX_SIZE_OF_ADD_STATUS]
int FillNextNMessageOctetsWithValueAndMoveToNextPosition(CipOctet value, unsigned int amount_of_filled_bytes, CipOctet **message)
int EncodeExtendedStatusLength(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the length of the extended status data part.
CipOctet message_buffer[PC_OPENER_ETHERNET_BUFFER_SIZE]
const EipUint8 * current_communication_buffer_position
int EncodeExtendedStatus(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the extended status (length and data) into the message.
#define OPENER_ASSERT(assertion)
int EncodeUnconnectedDataItemLength(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encode the data item length of the unconnected data segment.
EipUint32 GetDintFromMessage(const EipUint8 **const buffer)
Reads EIP_UINT32 from *buffer and converts little endian to host.
CipOctet * current_message_position
CipCommonPacketFormatData g_common_packet_format_data_item
Data storage for the any CPF data Currently we are single threaded and need only one CPF at the time...
int EncodeDataItemType(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
ENIPMessage last_reply_sent
void ConnectionObjectResetInactivityWatchdogTimerValue(CipConnectionObject *const connection_object)
Responsible for Endianess conversion.
#define OPENER_TRACE_ERR(...)
void GenerateEncapsulationHeader(const EncapsulationData *const receive_data, const size_t command_specific_data_length, const size_t session_handle, const EncapsulationProtocolErrorCode encapsulation_protocol_status, ENIPMessage *const outgoing_message)
#define MAX_SIZE_OF_ADD_STATUS
int EncodeItemCount(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
Adds the item count to the message frame.
int EncodeConnectedDataItemLength(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the Connected Data item length.
int AssembleIOMessage(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
int EncodeSockaddrInfoItemTypeId(int item_type, const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
Encodes the sockaddr info type id into the message.
uint8_t CipOctet
Data types as defined in the CIP Specification Vol 1 Appendix C.
int AddIntToMessage(const EipUint16 data, EipUint8 **const buffer)
converts UINT16 data from host to little endian an writes it to buffer.
EipStatus
EIP stack status enum.
int EncodeGeneralStatus(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the general status of a Router Response.
CipMessageRouterResponse g_message_router_response
Structure for storing the Response generated by an explict message.
int AddDintToMessage(const EipUint32 data, EipUint8 **const buffer)
Converts UINT32 data from host to little endian and writes it to buffer.
int EncodeConnectedAddressItem(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
#define OPENER_TRACE_INFO(...)
int AddSintToMessage(const EipUint8 data, EipUint8 **const buffer)
converts UINT8 data from host to little endian an writes it to buffer.
void SkipEncapsulationHeader(ENIPMessage *const outgoing_message)
int EncodeMessageRouterResponseData(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the Message Router Response data.
int NotifyConnectedCommonPacketFormat(const EncapsulationData *const received_data, const struct sockaddr *const originator_address, ENIPMessage *const outgoing_message)
int EncodeSequenceNumber(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
Encodes a sequence number into the message.
int EncodeDataItemLength(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
#define ENCAPSULATION_HEADER_LENGTH
EipUint32 sequence_number
int EncodeReplyService(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the reply service code for the requested service.
int EncodeNullAddressItem(ENIPMessage *const outgoing_message)
Encodes a Null Address Item into the message frame.
const size_t item_count_field_size
#define OPENER_TRACE_WARN(...)
This file contains the public interface of the encapsulation layer.
size_t EncodeExtendedStatusDataItems(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the extended status data items.
int AssembleLinearMessage(const CipMessageRouterResponse *const message_router_response, const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message)
Copy data from message_router_response struct and common_packet_format_data_item into ENIPMessage str...
CipConnectionObject * GetConnectedObject(const EipUint32 connection_id)
Get a connected object dependent on requested ConnectionID.
const size_t item_data_type_id_field_length
CipUdint cip_produced_connection_id
EipUint32 connection_identifier
EipUint16 GetIntFromMessage(const EipUint8 **const buffer)
Reads EIP_UINT16 from *buffer and converts little endian to host.
size_t used_message_length
CIP Message Router Response.
CipUint sequence_count_consuming
int EncapsulateIpAddress(EipUint16 port, EipUint32 address, EipByte **communication_buffer)
Encapsulate the sockaddr information as necessary for the Common Packet Format data items...
const size_t sequenced_address_item_length
int NotifyCommonPacketFormat(EncapsulationData *const received_data, const struct sockaddr *const originator_address, ENIPMessage *const outgoing_message)
int EncodeReservedFieldOfLengthByte(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message)
Encodes the reserved byte in the message router response.
CipUsint size_of_additional_status