|
|
@@ -24,39 +24,58 @@ const size_t kSequencedAddressItemLength = 8;
|
|
|
|
|
|
CipCommonPacketFormatData g_common_packet_format_data_item; /**< CPF global data items */
|
|
|
|
|
|
-static void InitializeMessageRouterResponse(CipMessageRouterResponse *const message_router_response) {
|
|
|
- memset(message_router_response, 0, sizeof(*message_router_response));
|
|
|
+static void InitializeMessageRouterResponse(
|
|
|
+ CipMessageRouterResponse *const message_router_response) {
|
|
|
+ memset(message_router_response, 0, sizeof(*message_router_response) );
|
|
|
InitializeENIPMessage(&message_router_response->message);
|
|
|
}
|
|
|
|
|
|
-EipStatus NotifyCommonPacketFormat(const EncapsulationData *const received_data, const struct sockaddr *const originator_address,
|
|
|
- ENIPMessage *const outgoing_message) {
|
|
|
+EipStatus NotifyCommonPacketFormat(const EncapsulationData *const received_data,
|
|
|
+ const struct sockaddr *const originator_address,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
EipStatus return_value = kEipStatusError;
|
|
|
CipMessageRouterResponse message_router_response;
|
|
|
InitializeMessageRouterResponse(&message_router_response);
|
|
|
|
|
|
if(kEipStatusError
|
|
|
- == (return_value = CreateCommonPacketFormatStructure(received_data->current_communication_buffer_position, received_data->data_length,
|
|
|
- &g_common_packet_format_data_item))) {
|
|
|
+ == (return_value =
|
|
|
+ CreateCommonPacketFormatStructure(received_data->
|
|
|
+ current_communication_buffer_position,
|
|
|
+ received_data->data_length,
|
|
|
+ &
|
|
|
+ g_common_packet_format_data_item) ) )
|
|
|
+ {
|
|
|
OPENER_TRACE_ERR("notifyCPF: error from createCPFstructure\n");
|
|
|
} else {
|
|
|
return_value = kEipStatusOkSend; /* In cases of errors we normally need to send an error response */
|
|
|
- if(g_common_packet_format_data_item.address_item.type_id == kCipItemIdNullAddress) /* check if NullAddressItem received, otherwise it is no unconnected message and should not be here*/
|
|
|
+ if(g_common_packet_format_data_item.address_item.type_id ==
|
|
|
+ kCipItemIdNullAddress) /* check if NullAddressItem received, otherwise it is no unconnected message and should not be here*/
|
|
|
{ /* found null address item*/
|
|
|
- if(g_common_packet_format_data_item.data_item.type_id == kCipItemIdUnconnectedDataItem) { /* unconnected data item received*/
|
|
|
- return_value = NotifyMessageRouter(g_common_packet_format_data_item.data_item.data, g_common_packet_format_data_item.data_item.length,
|
|
|
- &message_router_response, originator_address, received_data->session_handle);
|
|
|
+ if(g_common_packet_format_data_item.data_item.type_id ==
|
|
|
+ kCipItemIdUnconnectedDataItem) { /* unconnected data item received*/
|
|
|
+ return_value = NotifyMessageRouter(
|
|
|
+ g_common_packet_format_data_item.data_item.data,
|
|
|
+ g_common_packet_format_data_item.data_item.length,
|
|
|
+ &message_router_response,
|
|
|
+ originator_address,
|
|
|
+ received_data->session_handle);
|
|
|
if(return_value != kEipStatusError) {
|
|
|
SkipEncapsulationHeader(outgoing_message);
|
|
|
/* TODO: Here we get the status. What to do? kEipStatusError from AssembleLinearMessage().
|
|
|
* Its not clear how to transport this error information to the requester. */
|
|
|
- EipStatus status = AssembleLinearMessage(&message_router_response, &g_common_packet_format_data_item, outgoing_message);
|
|
|
+ EipStatus status = AssembleLinearMessage(&message_router_response,
|
|
|
+ &g_common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
|
|
|
/* Save pointer and move to start for Encapusulation Header */
|
|
|
CipOctet *buffer = outgoing_message->current_message_position;
|
|
|
- outgoing_message->current_message_position = outgoing_message->message_buffer;
|
|
|
- GenerateEncapsulationHeader(received_data, outgoing_message->used_message_length, received_data->session_handle, kEncapsulationProtocolSuccess,
|
|
|
- outgoing_message);
|
|
|
+ outgoing_message->current_message_position =
|
|
|
+ outgoing_message->message_buffer;
|
|
|
+ GenerateEncapsulationHeader(received_data,
|
|
|
+ outgoing_message->used_message_length,
|
|
|
+ received_data->session_handle,
|
|
|
+ kEncapsulationProtocolSuccess,
|
|
|
+ outgoing_message);
|
|
|
/* Move pointer back to last octet */
|
|
|
outgoing_message->current_message_position = buffer;
|
|
|
return_value = kEipStatusOkSend;
|
|
|
@@ -64,97 +83,137 @@ EipStatus NotifyCommonPacketFormat(const EncapsulationData *const received_data,
|
|
|
} else {
|
|
|
/* wrong data item detected*/
|
|
|
OPENER_TRACE_ERR(
|
|
|
- "notifyCPF: got something besides the expected CIP_ITEM_ID_UNCONNECTEDMESSAGE\n");
|
|
|
- GenerateEncapsulationHeader(received_data, 0, received_data->session_handle, kEncapsulationProtocolIncorrectData, outgoing_message);
|
|
|
+ "notifyCPF: got something besides the expected CIP_ITEM_ID_UNCONNECTEDMESSAGE\n");
|
|
|
+ GenerateEncapsulationHeader(received_data,
|
|
|
+ 0,
|
|
|
+ received_data->session_handle,
|
|
|
+ kEncapsulationProtocolIncorrectData,
|
|
|
+ outgoing_message);
|
|
|
return_value = kEipStatusOkSend;
|
|
|
}
|
|
|
} else {
|
|
|
OPENER_TRACE_ERR(
|
|
|
- "notifyCPF: got something besides the expected CIP_ITEM_ID_NULL\n");
|
|
|
- GenerateEncapsulationHeader(received_data, 0, received_data->session_handle, kEncapsulationProtocolIncorrectData, outgoing_message);
|
|
|
+ "notifyCPF: got something besides the expected CIP_ITEM_ID_NULL\n");
|
|
|
+ GenerateEncapsulationHeader(received_data,
|
|
|
+ 0,
|
|
|
+ received_data->session_handle,
|
|
|
+ kEncapsulationProtocolIncorrectData,
|
|
|
+ outgoing_message);
|
|
|
return_value = kEipStatusOkSend;
|
|
|
}
|
|
|
}
|
|
|
return return_value;
|
|
|
}
|
|
|
|
|
|
-EipStatus NotifyConnectedCommonPacketFormat(const EncapsulationData *const received_data, const struct sockaddr *const originator_address,
|
|
|
- ENIPMessage *const outgoing_message) {
|
|
|
+EipStatus NotifyConnectedCommonPacketFormat(
|
|
|
+ const EncapsulationData *const received_data,
|
|
|
+ const struct sockaddr *const originator_address,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
|
|
|
- EipStatus return_value = CreateCommonPacketFormatStructure(received_data->current_communication_buffer_position, received_data->data_length,
|
|
|
+ EipStatus return_value = CreateCommonPacketFormatStructure(
|
|
|
+ received_data->current_communication_buffer_position,
|
|
|
+ received_data->data_length,
|
|
|
&g_common_packet_format_data_item);
|
|
|
|
|
|
if(kEipStatusError == return_value) {
|
|
|
OPENER_TRACE_ERR("notifyConnectedCPF: error from createCPFstructure\n");
|
|
|
} else {
|
|
|
return_value = kEipStatusError; /* For connected explicit messages status always has to be 0*/
|
|
|
- if(g_common_packet_format_data_item.address_item.type_id == kCipItemIdConnectionAddress) /* check if ConnectedAddressItem received, otherwise it is no connected message and should not be here*/
|
|
|
+ if(g_common_packet_format_data_item.address_item.type_id ==
|
|
|
+ kCipItemIdConnectionAddress) /* check if ConnectedAddressItem received, otherwise it is no connected message and should not be here*/
|
|
|
{ /* ConnectedAddressItem item */
|
|
|
- CipConnectionObject *connection_object = GetConnectedObject(g_common_packet_format_data_item.address_item.data.connection_identifier);
|
|
|
+ CipConnectionObject *connection_object = GetConnectedObject(
|
|
|
+ g_common_packet_format_data_item.address_item.data.connection_identifier);
|
|
|
if(NULL != connection_object) {
|
|
|
/* reset the watchdog timer */
|
|
|
ConnectionObjectResetInactivityWatchdogTimerValue(connection_object);
|
|
|
|
|
|
/*TODO check connection id and sequence count */
|
|
|
- if(g_common_packet_format_data_item.data_item.type_id == kCipItemIdConnectedDataItem) { /* connected data item received*/
|
|
|
+ if(g_common_packet_format_data_item.data_item.type_id ==
|
|
|
+ kCipItemIdConnectedDataItem) { /* connected data item received*/
|
|
|
EipUint8 *buffer = g_common_packet_format_data_item.data_item.data;
|
|
|
- g_common_packet_format_data_item.address_item.data.sequence_number = GetUintFromMessage((const EipUint8** const ) &buffer);
|
|
|
+ g_common_packet_format_data_item.address_item.data.sequence_number =
|
|
|
+ GetUintFromMessage( (const EipUint8 **const ) &buffer );
|
|
|
OPENER_TRACE_INFO(
|
|
|
- "Class 3 sequence number: %d, last sequence number: %d\n",
|
|
|
- g_common_packet_format_data_item.address_item.data.sequence_number,
|
|
|
- connection_object->sequence_count_consuming);
|
|
|
- if(connection_object->sequence_count_consuming == g_common_packet_format_data_item.address_item.data.sequence_number) {
|
|
|
- memcpy(outgoing_message, &(connection_object->last_reply_sent), sizeof(ENIPMessage));
|
|
|
- outgoing_message->current_message_position = outgoing_message->message_buffer;
|
|
|
+ "Class 3 sequence number: %d, last sequence number: %d\n",
|
|
|
+ g_common_packet_format_data_item.address_item.data.sequence_number,
|
|
|
+ connection_object->sequence_count_consuming);
|
|
|
+ if(connection_object->sequence_count_consuming ==
|
|
|
+ g_common_packet_format_data_item.address_item.data.sequence_number)
|
|
|
+ {
|
|
|
+ memcpy(outgoing_message,
|
|
|
+ &(connection_object->last_reply_sent),
|
|
|
+ sizeof(ENIPMessage) );
|
|
|
+ outgoing_message->current_message_position =
|
|
|
+ outgoing_message->message_buffer;
|
|
|
/* Regenerate encapsulation header for new message */
|
|
|
outgoing_message->used_message_length -=
|
|
|
- ENCAPSULATION_HEADER_LENGTH;
|
|
|
- GenerateEncapsulationHeader(received_data, outgoing_message->used_message_length, received_data->session_handle, kEncapsulationProtocolSuccess,
|
|
|
- outgoing_message);
|
|
|
+ ENCAPSULATION_HEADER_LENGTH;
|
|
|
+ GenerateEncapsulationHeader(received_data,
|
|
|
+ outgoing_message->used_message_length,
|
|
|
+ received_data->session_handle,
|
|
|
+ kEncapsulationProtocolSuccess,
|
|
|
+ outgoing_message);
|
|
|
outgoing_message->current_message_position = buffer;
|
|
|
/* End regenerate encapsulation header for new message */
|
|
|
return kEipStatusOkSend;
|
|
|
}
|
|
|
- connection_object->sequence_count_consuming = g_common_packet_format_data_item.address_item.data.sequence_number;
|
|
|
+ connection_object->sequence_count_consuming =
|
|
|
+ g_common_packet_format_data_item.address_item.data.sequence_number;
|
|
|
|
|
|
ConnectionObjectResetInactivityWatchdogTimerValue(connection_object);
|
|
|
|
|
|
CipMessageRouterResponse message_router_response;
|
|
|
InitializeMessageRouterResponse(&message_router_response);
|
|
|
- return_value = NotifyMessageRouter(buffer, g_common_packet_format_data_item.data_item.length - 2, &message_router_response, originator_address,
|
|
|
- received_data->session_handle);
|
|
|
+ return_value = NotifyMessageRouter(buffer,
|
|
|
+ g_common_packet_format_data_item.data_item.length - 2,
|
|
|
+ &message_router_response,
|
|
|
+ originator_address,
|
|
|
+ received_data->session_handle);
|
|
|
|
|
|
if(return_value != kEipStatusError) {
|
|
|
- g_common_packet_format_data_item.address_item.data.connection_identifier = connection_object->cip_produced_connection_id;
|
|
|
+ g_common_packet_format_data_item.address_item.data.
|
|
|
+ connection_identifier =
|
|
|
+ connection_object->cip_produced_connection_id;
|
|
|
SkipEncapsulationHeader(outgoing_message);
|
|
|
/* TODO: Here we get the status. What to do? kEipStatusError from AssembleLinearMessage().
|
|
|
* Its not clear how to transport this error information to the requester. */
|
|
|
- EipStatus status = AssembleLinearMessage(&message_router_response, &g_common_packet_format_data_item, outgoing_message);
|
|
|
+ EipStatus status = AssembleLinearMessage(&message_router_response,
|
|
|
+ &g_common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
|
|
|
CipOctet *buffer = outgoing_message->current_message_position;
|
|
|
- outgoing_message->current_message_position = outgoing_message->message_buffer;
|
|
|
- GenerateEncapsulationHeader(received_data, outgoing_message->used_message_length, received_data->session_handle, kEncapsulationProtocolSuccess,
|
|
|
- outgoing_message);
|
|
|
+ outgoing_message->current_message_position =
|
|
|
+ outgoing_message->message_buffer;
|
|
|
+ GenerateEncapsulationHeader(received_data,
|
|
|
+ outgoing_message->used_message_length,
|
|
|
+ received_data->session_handle,
|
|
|
+ kEncapsulationProtocolSuccess,
|
|
|
+ outgoing_message);
|
|
|
outgoing_message->current_message_position = buffer;
|
|
|
- memcpy(&connection_object->last_reply_sent, outgoing_message, sizeof(ENIPMessage));
|
|
|
+ memcpy(&connection_object->last_reply_sent,
|
|
|
+ outgoing_message,
|
|
|
+ sizeof(ENIPMessage) );
|
|
|
return_value = kEipStatusOkSend;
|
|
|
}
|
|
|
} else {
|
|
|
/* wrong data item detected*/
|
|
|
OPENER_TRACE_ERR(
|
|
|
- "notifyConnectedCPF: got something besides the expected CIP_ITEM_ID_UNCONNECTEDMESSAGE\n");
|
|
|
+ "notifyConnectedCPF: got something besides the expected CIP_ITEM_ID_UNCONNECTEDMESSAGE\n");
|
|
|
}
|
|
|
} else {
|
|
|
OPENER_TRACE_ERR(
|
|
|
- "notifyConnectedCPF: connection with given ID could not be found\n");
|
|
|
+ "notifyConnectedCPF: connection with given ID could not be found\n");
|
|
|
}
|
|
|
} else {
|
|
|
OPENER_TRACE_ERR(
|
|
|
- "notifyConnectedCPF: got something besides the expected CIP_ITEM_ID_NULL\n");
|
|
|
+ "notifyConnectedCPF: got something besides the expected CIP_ITEM_ID_NULL\n");
|
|
|
}
|
|
|
}
|
|
|
// return outgoing_message->used_message_length;
|
|
|
- return (0 != outgoing_message->used_message_length ? kEipStatusOkSend : kEipStatusOk); /* TODO: What would the right EipStatus to return? */
|
|
|
+ return (0 !=
|
|
|
+ outgoing_message->used_message_length ? kEipStatusOkSend :
|
|
|
+ kEipStatusOk); /* TODO: What would the right EipStatus to return? */
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -166,12 +225,15 @@ EipStatus NotifyConnectedCommonPacketFormat(const EncapsulationData *const recei
|
|
|
* @return kEipStatusOk .. success
|
|
|
* kEipStatusError .. error
|
|
|
*/
|
|
|
-EipStatus CreateCommonPacketFormatStructure(const EipUint8 *data, size_t data_length, CipCommonPacketFormatData *common_packet_format_data) {
|
|
|
+EipStatus CreateCommonPacketFormatStructure(const EipUint8 *data,
|
|
|
+ size_t data_length,
|
|
|
+ CipCommonPacketFormatData *common_packet_format_data)
|
|
|
+{
|
|
|
|
|
|
common_packet_format_data->address_info_item[0].type_id = 0;
|
|
|
common_packet_format_data->address_info_item[1].type_id = 0;
|
|
|
|
|
|
- int length_count = 0;
|
|
|
+ size_t length_count = 0;
|
|
|
CipUint item_count = GetUintFromMessage(&data);
|
|
|
//OPENER_ASSERT(4U >= item_count);/* Sanitizing data - probably needs to be changed for productive code */
|
|
|
common_packet_format_data->item_count = item_count;
|
|
|
@@ -181,34 +243,49 @@ EipStatus CreateCommonPacketFormatStructure(const EipUint8 *data, size_t data_le
|
|
|
common_packet_format_data->address_item.length = GetUintFromMessage(&data);
|
|
|
length_count += 4;
|
|
|
if(common_packet_format_data->address_item.length >= 4) {
|
|
|
- common_packet_format_data->address_item.data.connection_identifier = GetUdintFromMessage(&data);
|
|
|
+ common_packet_format_data->address_item.data.connection_identifier =
|
|
|
+ GetUdintFromMessage(&data);
|
|
|
length_count += 4;
|
|
|
}
|
|
|
if(common_packet_format_data->address_item.length == 8) {
|
|
|
- common_packet_format_data->address_item.data.sequence_number = GetUdintFromMessage(&data);
|
|
|
+ common_packet_format_data->address_item.data.sequence_number =
|
|
|
+ GetUdintFromMessage(&data);
|
|
|
length_count += 4;
|
|
|
}
|
|
|
}
|
|
|
if(common_packet_format_data->item_count >= 2) {
|
|
|
common_packet_format_data->data_item.type_id = GetUintFromMessage(&data);
|
|
|
common_packet_format_data->data_item.length = GetUintFromMessage(&data);
|
|
|
- common_packet_format_data->data_item.data = (EipUint8*) data;
|
|
|
- data += common_packet_format_data->data_item.length;
|
|
|
- length_count += (4 + common_packet_format_data->data_item.length);
|
|
|
+ common_packet_format_data->data_item.data = (EipUint8 *) data;
|
|
|
+ if(data_length >=
|
|
|
+ length_count + 4 + common_packet_format_data->data_item.length) {
|
|
|
+ data += common_packet_format_data->data_item.length;
|
|
|
+ length_count += (4 + common_packet_format_data->data_item.length);
|
|
|
+ } else {
|
|
|
+ return kEipStatusError;
|
|
|
+ }
|
|
|
|
|
|
CipUsint address_item_count = common_packet_format_data->item_count - 2;
|
|
|
- for(size_t j = 0; j < (address_item_count > 2 ? 2 : address_item_count); j++) /* TODO there needs to be a limit check here???*/
|
|
|
+ for(size_t j = 0; j < (address_item_count > 2 ? 2 : address_item_count);
|
|
|
+ j++) /* TODO there needs to be a limit check here???*/
|
|
|
{
|
|
|
- common_packet_format_data->address_info_item[j].type_id = GetIntFromMessage(&data);
|
|
|
+ common_packet_format_data->address_info_item[j].type_id =
|
|
|
+ GetIntFromMessage(&data);
|
|
|
OPENER_TRACE_INFO("Sockaddr type id: %x\n",
|
|
|
- common_packet_format_data->address_info_item[j].type_id);
|
|
|
+ common_packet_format_data->address_info_item[j].type_id);
|
|
|
length_count += 2;
|
|
|
- if((common_packet_format_data->address_info_item[j].type_id == kCipItemIdSocketAddressInfoOriginatorToTarget)
|
|
|
- || (common_packet_format_data->address_info_item[j].type_id == kCipItemIdSocketAddressInfoTargetToOriginator)) {
|
|
|
- common_packet_format_data->address_info_item[j].length = GetIntFromMessage(&data);
|
|
|
- common_packet_format_data->address_info_item[j].sin_family = GetIntFromMessage(&data);
|
|
|
- common_packet_format_data->address_info_item[j].sin_port = GetIntFromMessage(&data);
|
|
|
- common_packet_format_data->address_info_item[j].sin_addr = GetUdintFromMessage(&data);
|
|
|
+ if( (common_packet_format_data->address_info_item[j].type_id ==
|
|
|
+ kCipItemIdSocketAddressInfoOriginatorToTarget)
|
|
|
+ || (common_packet_format_data->address_info_item[j].type_id ==
|
|
|
+ kCipItemIdSocketAddressInfoTargetToOriginator) ) {
|
|
|
+ common_packet_format_data->address_info_item[j].length =
|
|
|
+ GetIntFromMessage(&data);
|
|
|
+ common_packet_format_data->address_info_item[j].sin_family =
|
|
|
+ GetIntFromMessage(&data);
|
|
|
+ common_packet_format_data->address_info_item[j].sin_port =
|
|
|
+ GetIntFromMessage(&data);
|
|
|
+ common_packet_format_data->address_info_item[j].sin_addr =
|
|
|
+ GetUdintFromMessage(&data);
|
|
|
for(size_t i = 0; i < 8; i++) {
|
|
|
common_packet_format_data->address_info_item[j].nasin_zero[i] = *data;
|
|
|
data++;
|
|
|
@@ -231,7 +308,7 @@ EipStatus CreateCommonPacketFormatStructure(const EipUint8 *data, size_t data_le
|
|
|
return kEipStatusOk;
|
|
|
} else {
|
|
|
OPENER_TRACE_WARN(
|
|
|
- "something is wrong with the length in Message Router @ CreateCommonPacketFormatStructure\n");
|
|
|
+ "something is wrong with the length in Message Router @ CreateCommonPacketFormatStructure\n");
|
|
|
if(common_packet_format_data->item_count > 2) {
|
|
|
/* there is an optional packet in data stream which is not sockaddr item */
|
|
|
return kEipStatusOk;
|
|
|
@@ -256,11 +333,15 @@ void EncodeNullAddressItem(ENIPMessage *const outgoing_message) {
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeConnectedAddressItem(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeConnectedAddressItem(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
/* connected data item -> address length set to 4 and copy ConnectionIdentifier */
|
|
|
AddIntToMessage(kCipItemIdConnectionAddress, outgoing_message);
|
|
|
AddIntToMessage(4, outgoing_message);
|
|
|
- AddDintToMessage(common_packet_format_data_item->address_item.data.connection_identifier, outgoing_message);
|
|
|
+ AddDintToMessage(
|
|
|
+ common_packet_format_data_item->address_item.data.connection_identifier,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -269,12 +350,18 @@ void EncodeConnectedAddressItem(const CipCommonPacketFormatData *const common_pa
|
|
|
* @param common_packet_format_data_item Common Packet Format item which is used in the encoding
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeSequencedAddressItem(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeSequencedAddressItem(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
/* sequenced address item -> address length set to 8 and copy ConnectionIdentifier and SequenceNumber */
|
|
|
AddIntToMessage(kCipItemIdSequencedAddressItem, outgoing_message);
|
|
|
AddIntToMessage(kSequencedAddressItemLength, outgoing_message);
|
|
|
- AddDintToMessage(common_packet_format_data_item->address_item.data.connection_identifier, outgoing_message);
|
|
|
- AddDintToMessage(common_packet_format_data_item->address_item.data.sequence_number, outgoing_message);
|
|
|
+ AddDintToMessage(
|
|
|
+ common_packet_format_data_item->address_item.data.connection_identifier,
|
|
|
+ outgoing_message);
|
|
|
+ AddDintToMessage(
|
|
|
+ common_packet_format_data_item->address_item.data.sequence_number,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -283,7 +370,9 @@ void EncodeSequencedAddressItem(const CipCommonPacketFormatData *const common_pa
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeItemCount(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeItemCount(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
AddIntToMessage(common_packet_format_data_item->item_count, outgoing_message); /* item count */
|
|
|
}
|
|
|
|
|
|
@@ -293,8 +382,11 @@ void EncodeItemCount(const CipCommonPacketFormatData *const common_packet_format
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeDataItemType(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
- AddIntToMessage(common_packet_format_data_item->data_item.type_id, outgoing_message);
|
|
|
+void EncodeDataItemType(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddIntToMessage(common_packet_format_data_item->data_item.type_id,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -303,8 +395,11 @@ void EncodeDataItemType(const CipCommonPacketFormatData *const common_packet_for
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeDataItemLength(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
- AddIntToMessage(common_packet_format_data_item->data_item.length, outgoing_message);
|
|
|
+void EncodeDataItemLength(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddIntToMessage(common_packet_format_data_item->data_item.length,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -313,10 +408,16 @@ void EncodeDataItemLength(const CipCommonPacketFormatData *const common_packet_f
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeDataItemData(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
- memcpy(outgoing_message->current_message_position, common_packet_format_data_item->data_item.data, common_packet_format_data_item->data_item.length);
|
|
|
- outgoing_message->current_message_position += common_packet_format_data_item->data_item.length;
|
|
|
- outgoing_message->used_message_length += common_packet_format_data_item->data_item.length;
|
|
|
+void EncodeDataItemData(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ memcpy(outgoing_message->current_message_position,
|
|
|
+ common_packet_format_data_item->data_item.data,
|
|
|
+ common_packet_format_data_item->data_item.length);
|
|
|
+ outgoing_message->current_message_position +=
|
|
|
+ common_packet_format_data_item->data_item.length;
|
|
|
+ outgoing_message->used_message_length +=
|
|
|
+ common_packet_format_data_item->data_item.length;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -326,9 +427,15 @@ void EncodeDataItemData(const CipCommonPacketFormatData *const common_packet_for
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
|
|
|
-void EncodeConnectedDataItemLength(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
- AddIntToMessage((EipUint16) (message_router_response->message.used_message_length + 4 + 2 /* TODO: Magic numbers */
|
|
|
- + (2 * message_router_response->size_of_additional_status)), outgoing_message);
|
|
|
+void EncodeConnectedDataItemLength(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddIntToMessage( (EipUint16) (message_router_response->message.
|
|
|
+ used_message_length + 4 + 2 /* TODO: Magic numbers */
|
|
|
+ + (2 *
|
|
|
+ message_router_response->
|
|
|
+ size_of_additional_status) ),
|
|
|
+ outgoing_message );
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -337,8 +444,12 @@ void EncodeConnectedDataItemLength(const CipMessageRouterResponse *const message
|
|
|
* @param common_packet_format_data_item
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeSequenceNumber(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
- AddIntToMessage((EipUint16) common_packet_format_data_item->address_item.data.sequence_number, outgoing_message);
|
|
|
+void EncodeSequenceNumber(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddIntToMessage(
|
|
|
+ (EipUint16) common_packet_format_data_item->address_item.data.sequence_number,
|
|
|
+ outgoing_message );
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -347,7 +458,9 @@ void EncodeSequenceNumber(const CipCommonPacketFormatData *const common_packet_f
|
|
|
* @param message_router_response The router response message data structure to be processed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeReplyService(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeReplyService(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
AddSintToMessage(message_router_response->reply_service, outgoing_message);
|
|
|
}
|
|
|
|
|
|
@@ -357,7 +470,9 @@ void EncodeReplyService(const CipMessageRouterResponse *const message_router_res
|
|
|
* @param message_router_response Router Response message to be processed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeReservedFieldOfLengthByte(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeReservedFieldOfLengthByte(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
AddSintToMessage(message_router_response->reserved, outgoing_message);
|
|
|
}
|
|
|
|
|
|
@@ -367,7 +482,9 @@ void EncodeReservedFieldOfLengthByte(const CipMessageRouterResponse *const messa
|
|
|
* @param message_router_response Router Response message to be processed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeGeneralStatus(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeGeneralStatus(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
AddSintToMessage(message_router_response->general_status, outgoing_message);
|
|
|
}
|
|
|
|
|
|
@@ -378,8 +495,11 @@ void EncodeGeneralStatus(const CipMessageRouterResponse *const message_router_re
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
|
|
|
-void EncodeExtendedStatusLength(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
- AddSintToMessage(message_router_response->size_of_additional_status, outgoing_message);
|
|
|
+void EncodeExtendedStatusLength(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddSintToMessage(message_router_response->size_of_additional_status,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -388,9 +508,14 @@ void EncodeExtendedStatusLength(const CipMessageRouterResponse *const message_ro
|
|
|
* @param message_router_response Router Response message to be processed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeExtendedStatusDataItems(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
- for(size_t i = 0; i < message_router_response->size_of_additional_status && i < MAX_SIZE_OF_ADD_STATUS; i++) {
|
|
|
- AddIntToMessage(message_router_response->additional_status[i], outgoing_message);
|
|
|
+void EncodeExtendedStatusDataItems(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ for(size_t i = 0;
|
|
|
+ i < message_router_response->size_of_additional_status &&
|
|
|
+ i < MAX_SIZE_OF_ADD_STATUS; i++) {
|
|
|
+ AddIntToMessage(message_router_response->additional_status[i],
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -404,7 +529,9 @@ void EncodeExtendedStatusDataItems(const CipMessageRouterResponse *const message
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
|
|
|
-void EncodeExtendedStatus(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeExtendedStatus(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
EncodeExtendedStatusLength(message_router_response, outgoing_message);
|
|
|
EncodeExtendedStatusDataItems(message_router_response, outgoing_message);
|
|
|
}
|
|
|
@@ -416,9 +543,15 @@ void EncodeExtendedStatus(const CipMessageRouterResponse *const message_router_r
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*
|
|
|
*/
|
|
|
-void EncodeUnconnectedDataItemLength(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
- AddIntToMessage((EipUint16) (message_router_response->message.used_message_length + 4 /* TODO: Magic number */
|
|
|
- + (2 * message_router_response->size_of_additional_status)), outgoing_message);
|
|
|
+void EncodeUnconnectedDataItemLength(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddIntToMessage( (EipUint16) (message_router_response->message.
|
|
|
+ used_message_length + 4 /* TODO: Magic number */
|
|
|
+ + (2 *
|
|
|
+ message_router_response->
|
|
|
+ size_of_additional_status) ),
|
|
|
+ outgoing_message );
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -427,11 +560,17 @@ void EncodeUnconnectedDataItemLength(const CipMessageRouterResponse *const messa
|
|
|
* @param message_router_response Router Response message to be processed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeMessageRouterResponseData(const CipMessageRouterResponse *const message_router_response, ENIPMessage *const outgoing_message) {
|
|
|
- memcpy(outgoing_message->current_message_position, message_router_response->message.message_buffer, message_router_response->message.used_message_length);
|
|
|
-
|
|
|
- outgoing_message->current_message_position += message_router_response->message.used_message_length;
|
|
|
- outgoing_message->used_message_length += message_router_response->message.used_message_length;
|
|
|
+void EncodeMessageRouterResponseData(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ memcpy(outgoing_message->current_message_position,
|
|
|
+ message_router_response->message.message_buffer,
|
|
|
+ message_router_response->message.used_message_length);
|
|
|
+
|
|
|
+ outgoing_message->current_message_position +=
|
|
|
+ message_router_response->message.used_message_length;
|
|
|
+ outgoing_message->used_message_length +=
|
|
|
+ message_router_response->message.used_message_length;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -441,9 +580,13 @@ void EncodeMessageRouterResponseData(const CipMessageRouterResponse *const messa
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeSockaddrInfoItemTypeId(int item_type, const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
+void EncodeSockaddrInfoItemTypeId(int item_type,
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
OPENER_ASSERT(item_type == 0 || item_type == 1);
|
|
|
- AddIntToMessage(common_packet_format_data_item->address_info_item[item_type].type_id, outgoing_message);
|
|
|
+ AddIntToMessage(
|
|
|
+ common_packet_format_data_item->address_info_item[item_type].type_id,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -453,12 +596,18 @@ void EncodeSockaddrInfoItemTypeId(int item_type, const CipCommonPacketFormatData
|
|
|
* @param common_packet_format_data_item The Common Packet Format data structure from which the message is constructed
|
|
|
* @param outgoing_message The outgoing message object
|
|
|
*/
|
|
|
-void EncodeSockaddrInfoLength(int item_type, const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
- AddIntToMessage(common_packet_format_data_item->address_info_item[item_type].length, outgoing_message);
|
|
|
+void EncodeSockaddrInfoLength(int item_type,
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
+ AddIntToMessage(
|
|
|
+ common_packet_format_data_item->address_info_item[item_type].length,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
-EipStatus AssembleLinearMessage(const CipMessageRouterResponse *const message_router_response,
|
|
|
- const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
+EipStatus AssembleLinearMessage(
|
|
|
+ const CipMessageRouterResponse *const message_router_response,
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
|
|
|
if(message_router_response) {
|
|
|
/* add Interface Handle and Timeout = 0 -> only for SendRRData and SendUnitData necessary */
|
|
|
@@ -469,17 +618,19 @@ EipStatus AssembleLinearMessage(const CipMessageRouterResponse *const message_ro
|
|
|
EncodeItemCount(common_packet_format_data_item, outgoing_message);
|
|
|
|
|
|
/* process Address Item */
|
|
|
- switch(common_packet_format_data_item->address_item.type_id){
|
|
|
+ switch(common_packet_format_data_item->address_item.type_id) {
|
|
|
case kCipItemIdNullAddress: {
|
|
|
EncodeNullAddressItem(outgoing_message);
|
|
|
break;
|
|
|
}
|
|
|
case kCipItemIdConnectionAddress: {
|
|
|
- EncodeConnectedAddressItem(common_packet_format_data_item, outgoing_message);
|
|
|
+ EncodeConnectedAddressItem(common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
break;
|
|
|
}
|
|
|
case kCipItemIdSequencedAddressItem: {
|
|
|
- EncodeSequencedAddressItem(common_packet_format_data_item, outgoing_message);
|
|
|
+ EncodeSequencedAddressItem(common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
break;
|
|
|
}
|
|
|
default:
|
|
|
@@ -488,26 +639,34 @@ EipStatus AssembleLinearMessage(const CipMessageRouterResponse *const message_ro
|
|
|
}
|
|
|
|
|
|
/* process Data Item */
|
|
|
- if((common_packet_format_data_item->data_item.type_id == kCipItemIdUnconnectedDataItem)
|
|
|
- || (common_packet_format_data_item->data_item.type_id == kCipItemIdConnectedDataItem)) {
|
|
|
+ if( (common_packet_format_data_item->data_item.type_id ==
|
|
|
+ kCipItemIdUnconnectedDataItem)
|
|
|
+ || (common_packet_format_data_item->data_item.type_id ==
|
|
|
+ kCipItemIdConnectedDataItem) ) {
|
|
|
|
|
|
if(message_router_response) {
|
|
|
EncodeDataItemType(common_packet_format_data_item, outgoing_message);
|
|
|
|
|
|
- if(common_packet_format_data_item->data_item.type_id == kCipItemIdConnectedDataItem) { /* Connected Item */
|
|
|
- EncodeConnectedDataItemLength(message_router_response, outgoing_message);
|
|
|
- EncodeSequenceNumber(&g_common_packet_format_data_item, outgoing_message);
|
|
|
+ if(common_packet_format_data_item->data_item.type_id ==
|
|
|
+ kCipItemIdConnectedDataItem) { /* Connected Item */
|
|
|
+ EncodeConnectedDataItemLength(message_router_response,
|
|
|
+ outgoing_message);
|
|
|
+ EncodeSequenceNumber(&g_common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
|
|
|
} else { /* Unconnected Item */
|
|
|
- EncodeUnconnectedDataItemLength(message_router_response, outgoing_message);
|
|
|
+ EncodeUnconnectedDataItemLength(message_router_response,
|
|
|
+ outgoing_message);
|
|
|
}
|
|
|
|
|
|
/* write message router response into linear memory */
|
|
|
EncodeReplyService(message_router_response, outgoing_message);
|
|
|
- EncodeReservedFieldOfLengthByte(message_router_response, outgoing_message);
|
|
|
+ EncodeReservedFieldOfLengthByte(message_router_response,
|
|
|
+ outgoing_message);
|
|
|
EncodeGeneralStatus(message_router_response, outgoing_message);
|
|
|
EncodeExtendedStatus(message_router_response, outgoing_message);
|
|
|
- EncodeMessageRouterResponseData(message_router_response, outgoing_message);
|
|
|
+ EncodeMessageRouterResponseData(message_router_response,
|
|
|
+ outgoing_message);
|
|
|
} else { /* connected IO Message to send */
|
|
|
EncodeDataItemType(common_packet_format_data_item, outgoing_message);
|
|
|
|
|
|
@@ -522,17 +681,26 @@ EipStatus AssembleLinearMessage(const CipMessageRouterResponse *const message_ro
|
|
|
* EtherNet/IP specification doesn't demand it, but there are EIP
|
|
|
* devices which depend on CPF items to appear in the order of their
|
|
|
* ID number */
|
|
|
- for(int type = kCipItemIdSocketAddressInfoOriginatorToTarget; type <= kCipItemIdSocketAddressInfoTargetToOriginator; type++) {
|
|
|
+ for(int type = kCipItemIdSocketAddressInfoOriginatorToTarget;
|
|
|
+ type <= kCipItemIdSocketAddressInfoTargetToOriginator; type++) {
|
|
|
for(int j = 0; j < 2; j++) {
|
|
|
if(common_packet_format_data_item->address_info_item[j].type_id == type) {
|
|
|
- EncodeSockaddrInfoItemTypeId(j, common_packet_format_data_item, outgoing_message);
|
|
|
+ EncodeSockaddrInfoItemTypeId(j,
|
|
|
+ common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
|
|
|
- EncodeSockaddrInfoLength(j, common_packet_format_data_item, outgoing_message);
|
|
|
+ EncodeSockaddrInfoLength(j,
|
|
|
+ common_packet_format_data_item,
|
|
|
+ outgoing_message);
|
|
|
|
|
|
- EncapsulateIpAddress(common_packet_format_data_item->address_info_item[j].sin_port, common_packet_format_data_item->address_info_item[j].sin_addr,
|
|
|
+ EncapsulateIpAddress(
|
|
|
+ common_packet_format_data_item->address_info_item[j].sin_port,
|
|
|
+ common_packet_format_data_item->address_info_item[j].sin_addr,
|
|
|
outgoing_message);
|
|
|
|
|
|
- FillNextNMessageOctetsWithValueAndMoveToNextPosition(0, 8, outgoing_message);
|
|
|
+ FillNextNMessageOctetsWithValueAndMoveToNextPosition(0,
|
|
|
+ 8,
|
|
|
+ outgoing_message);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
@@ -540,6 +708,8 @@ EipStatus AssembleLinearMessage(const CipMessageRouterResponse *const message_ro
|
|
|
return kEipStatusOk;
|
|
|
}
|
|
|
|
|
|
-void AssembleIOMessage(const CipCommonPacketFormatData *const common_packet_format_data_item, ENIPMessage *const outgoing_message) {
|
|
|
+void AssembleIOMessage(
|
|
|
+ const CipCommonPacketFormatData *const common_packet_format_data_item,
|
|
|
+ ENIPMessage *const outgoing_message) {
|
|
|
AssembleLinearMessage(0, common_packet_format_data_item, outgoing_message);
|
|
|
}
|