Procházet zdrojové kódy

Removing global buffer for Message Router Response

Global buffer variable is replaced by self-cleaning stack variable.
Also a bug in EncodeCipByteArray was fixed

Signed-off-by: Martin Melik Merkumians <melik-merkumians@acin.tuwien.ac.at>
Martin Melik Merkumians před 5 roky
rodič
revize
3fecdf87d7

+ 0 - 1
source/src/cip/cipassembly.c

@@ -163,7 +163,6 @@ EipStatus SetAssemblyAttributeSingle(CipInstance *const instance,
 
   const EipUint8 *const router_request_data = message_router_request->data;
 
-  InitializeENIPMessage(&message_router_response->message);
   message_router_response->reply_service =
     (0x80 | message_router_request->service);
   message_router_response->general_status = kCipErrorAttributeNotSupported;

+ 1 - 1
source/src/cip/cipcommon.c

@@ -578,7 +578,7 @@ void EncodeCipStringN(const void *const data, ENIPMessage *const outgoing_messag
 void EncodeCipByteArray(const void *const data, ENIPMessage *const outgoing_message) {
     OPENER_TRACE_INFO(" -> get attribute byte array\r\n");
     CipByteArray *cip_byte_array = (CipByteArray *) data;
-    memcpy(&outgoing_message->current_message_position, cip_byte_array->data, cip_byte_array->length);
+    memcpy(outgoing_message->current_message_position, cip_byte_array->data, cip_byte_array->length);
     outgoing_message->current_message_position += cip_byte_array->length;
     outgoing_message->used_message_length += cip_byte_array->length;
 }

+ 11 - 16
source/src/cip/cipmessagerouter.c

@@ -13,7 +13,6 @@
 #include "cipmessagerouter.h"
 
 CipMessageRouterRequest g_message_router_request;
-CipMessageRouterResponse g_message_router_response;
 
 /** @brief A class registry list node
  *
@@ -102,9 +101,6 @@ EipStatus CipMessageRouterInit() {
                 "GetAttributeSingle");
 
   /* reserved for future use -> set to zero */
-  g_message_router_response.reserved = 0;
-  InitializeENIPMessage(&g_message_router_response.message);
-
   return kEipStatusOk;
 }
 
@@ -180,23 +176,22 @@ EipStatus RegisterCipClass(CipClass *cip_class) {
 
 EipStatus NotifyMessageRouter(EipUint8 *data,
                               int data_length,
+                              CipMessageRouterResponse *message_router_response,
                               const struct sockaddr *const originator_address,
                               const int encapsulation_session) {
   EipStatus eip_status = kEipStatusOkSend;
   CipError status = kCipErrorSuccess;
 
-  InitializeENIPMessage(&g_message_router_response.message); /* Initialize reply buffer */
-
   OPENER_TRACE_INFO("NotifyMessageRouter: routing unconnected message\n");
   if ( kCipErrorSuccess
        != ( status = CreateMessageRouterRequestStructure(
               data, data_length, &g_message_router_request) ) ) { /* error from create MR structure*/
     OPENER_TRACE_ERR(
       "NotifyMessageRouter: error from createMRRequeststructure\n");
-    g_message_router_response.general_status = status;
-    g_message_router_response.size_of_additional_status = 0;
-    g_message_router_response.reserved = 0;
-    g_message_router_response.reply_service = (0x80
+    message_router_response->general_status = status;
+    message_router_response->size_of_additional_status = 0;
+    message_router_response->reserved = 0;
+    message_router_response->reply_service = (0x80
                                                | g_message_router_request.
                                                service);
   } else {
@@ -207,24 +202,24 @@ EipStatus NotifyMessageRouter(EipUint8 *data,
       OPENER_TRACE_ERR(
         "NotifyMessageRouter: sending CIP_ERROR_OBJECT_DOES_NOT_EXIST reply, class id 0x%x is not registered\n",
         (unsigned ) g_message_router_request.request_path.class_id);
-      g_message_router_response.general_status =
+      message_router_response->general_status =
         kCipErrorPathDestinationUnknown;   /*according to the test tool this should be the correct error flag instead of CIP_ERROR_OBJECT_DOES_NOT_EXIST;*/
-      g_message_router_response.size_of_additional_status = 0;
-      g_message_router_response.reserved = 0;
-      g_message_router_response.reply_service = (0x80
+      message_router_response->size_of_additional_status = 0;
+      message_router_response->reserved = 0;
+      message_router_response->reply_service = (0x80
                                                  | g_message_router_request.
                                                  service);
     } else {
       /* call notify function from Object with ClassID (gMRRequest.RequestPath.ClassID)
          object will or will not make an reply into gMRResponse*/
-      g_message_router_response.reserved = 0;
+    	message_router_response->reserved = 0;
       OPENER_ASSERT(NULL != registered_object->cip_class)
       OPENER_TRACE_INFO(
         "NotifyMessageRouter: calling notify function of class '%s'\n",
         registered_object->cip_class->class_name);
       eip_status = NotifyClass(registered_object->cip_class,
                                &g_message_router_request,
-                               &g_message_router_response,
+                               message_router_response,
                                originator_address,
                                encapsulation_session);
 

+ 1 - 7
source/src/cip/cipmessagerouter.h

@@ -12,13 +12,6 @@
 /** @brief Message Router class code */
 static const CipUint kCipMessageRouterClassCode = 0x02U;
 
-/** @brief Structure for storing the Response generated by an explict message.
- *
- *  This buffer will be used for storing the result. The response message will be generated
- *  by AssembleLinearMessage().
- */
-extern CipMessageRouterResponse g_message_router_response;
-
 /* public functions */
 
 /** @brief Initialize the data structures of the message router
@@ -43,6 +36,7 @@ void DeleteAllClasses(void);
  */
 EipStatus NotifyMessageRouter(EipUint8 *data,
                               int data_length,
+                              CipMessageRouterResponse *message_router_response,
                               const struct sockaddr *const originator_address,
                               const int encapsulation_session);
 

+ 14 - 2
source/src/enet_encap/cpf.c

@@ -24,6 +24,11 @@ const size_t sequenced_address_item_length = 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));
+  InitializeENIPMessage(&message_router_response->message);
+}
+
 EipStatus NotifyCommonPacketFormat
 (
   const EncapsulationData *const received_data,
@@ -31,6 +36,8 @@ EipStatus NotifyCommonPacketFormat
   ENIPMessage *const outgoing_message)
 {
   EipStatus return_value = kEipStatusError;
+  CipMessageRouterResponse message_router_response;
+  InitializeMessageRouterResponse(&message_router_response);
 
   if (kEipStatusError == ( return_value = CreateCommonPacketFormatStructure(
                              received_data->
@@ -48,6 +55,7 @@ EipStatus NotifyCommonPacketFormat
         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) {
@@ -55,7 +63,8 @@ EipStatus NotifyCommonPacketFormat
           /* TODO: Here we lose a possible kEipStatusError from AssembleLinearMessage().
            *  Its not clear how to transport this error information to the requester. */
           int response_len = AssembleLinearMessage(
-            &g_message_router_response, &g_common_packet_format_data_item,
+            &message_router_response,
+            &g_common_packet_format_data_item,
             outgoing_message);
 
           /* Save pointer and move to start for Encapusulation Header */
@@ -154,9 +163,12 @@ EipStatus NotifyConnectedCommonPacketFormat(
 
           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);
 
@@ -168,7 +180,7 @@ EipStatus NotifyConnectedCommonPacketFormat(
             /* TODO: Here we lose a possible kEipStatusError from AssembleLinearMessage().
              *  Its not clear how to transport this error information to the requester. */
             int response_len = AssembleLinearMessage(
-              &g_message_router_response, &g_common_packet_format_data_item,
+              &message_router_response, &g_common_packet_format_data_item,
               outgoing_message);
 
             CipOctet *buffer = outgoing_message->current_message_position;