Răsfoiți Sursa

Fixes timeout too many recevied packages bug

Signed-off-by: CapXilinx <melik-merkumians@acin.tuwien.ac.at>
CapXilinx 8 ani în urmă
părinte
comite
eba906b82a

+ 6 - 7
source/src/cip/cipconnectionmanager.c

@@ -17,6 +17,7 @@
 #include "encap.h"
 #include "cipidentity.h"
 #include "trace.h"
+#include "cipconnectionobject.h"
 #include "cipclass3connection.h"
 #include "cipioconnection.h"
 #include "cipassembly.h"
@@ -685,9 +686,7 @@ EipStatus ManageConnections(MilliSeconds elapsed_time) {
             if ( kConnectionObjectTransportClassTriggerProductionTriggerCyclic
                  != ConnectionObjectGetTransportClassTriggerProductionTrigger(connection_object) ) {
               /* non cyclic connections have to reload the production inhibit timer */
-              connection_object->production_inhibit_timer = connection_object
-                                                            ->
-                                                            production_inhibit_time;
+              ConnectionObjectResetProductionInhibitTimer(connection_object);
             }
           }
         }
@@ -1360,8 +1359,8 @@ EipBool8 IsConnectedOutputAssembly(const EipUint32 instance_number) {
   DoublyLinkedListNode *node = connection_list.first;
 
   while (NULL != node) {
-    CipDword produced_connection_point = ((CipConnectionObject*)node->data)->produced_path.attribute_id_or_connection_point;
-    if (instance_number == produced_connection_point) {
+    CipDword consumed_connection_point = ((CipConnectionObject*)node->data)->consumed_path.instance_id;
+    if (instance_number == consumed_connection_point) {
       is_connected = true;
       break;
     }
@@ -1414,9 +1413,9 @@ EipStatus TriggerConnections(
   DoublyLinkedListNode *node = connection_list.first;
   while (NULL != node) {
   CipConnectionObject *connection_object = node->data;
-    if ( (output_assembly == connection_object->produced_path.attribute_id_or_connection_point)
+    if ( (output_assembly == connection_object->consumed_path.instance_id)
          && (input_assembly ==
-             connection_object->consumed_path.attribute_id_or_connection_point) ) {
+             connection_object->produced_path.instance_id) ) {
       if ( kConnectionObjectTransportClassTriggerProductionTriggerApplicationObject
            == ConnectionObjectGetTransportClassTriggerProductionTrigger(connection_object) ) {
         /* produce at the next allowed occurrence */

+ 9 - 9
source/src/cip/cipconnectionobject.c

@@ -138,10 +138,9 @@ void ConnectionObjectInitializeFromMessage(
   //TODO: introduce setter function
   connection_object->o_to_t_network_connection_parameters = GetIntFromMessage(message);
 
-  connection_object->t_to_o_requested_packet_interval = GetDintFromMessage(message);
+  ConnectionObjectSetTToORequestedPacketInterval(connection_object, GetDintFromMessage(message));
 
-  ConnectionObjectSetExpectedPacketRate(connection_object,
-      connection_object->t_to_o_requested_packet_interval);
+  ConnectionObjectSetExpectedPacketRate(connection_object);
 
   connection_object->t_to_o_network_connection_parameters = GetIntFromMessage(message);
 
@@ -356,15 +355,14 @@ CipUint ConnectionObjectGetExpectedPacketRate(
 }
 
 void ConnectionObjectSetExpectedPacketRate(
-  CipConnectionObject *const connection_object,
-  CipUint expected_packet_rate) {
-  if( (expected_packet_rate % (kOpenerTimerTickInMilliSeconds * 1000)) == 0 ) {
-    connection_object->expected_packet_rate = expected_packet_rate / 1000;
+  CipConnectionObject *const connection_object) {
+  if( (connection_object->t_to_o_requested_packet_interval % (kOpenerTimerTickInMilliSeconds * 1000)) == 0 ) {
+    connection_object->expected_packet_rate = connection_object->t_to_o_requested_packet_interval / 1000;
   }
   else{
-    connection_object->expected_packet_rate = expected_packet_rate / 1000 +
+    connection_object->expected_packet_rate = connection_object->t_to_o_requested_packet_interval / 1000 +
                                               (kOpenerTimerTickInMilliSeconds -
-                                               (expected_packet_rate / 1000) %
+                                               (connection_object->t_to_o_requested_packet_interval / 1000) %
                                                (kOpenerTimerTickInMilliSeconds * 1000) );
   }
 }
@@ -502,6 +500,8 @@ uint64_t ConnectionObjectCalculateRegularInactivityWatchdogTimerValue(
              1000 ) << (2 + connection_object->connection_timeout_multiplier) );
 }
 
+
+
 CipUint ConnectionObjectGetConnectionSerialNumber(
     const CipConnectionObject *const connection_object) {
   return connection_object->connection_serial_number;

+ 3 - 2
source/src/cip/cipconnectionobject.h

@@ -255,8 +255,7 @@ CipUint ConnectionObjectGetExpectedPacketRate(
  * the exact value entered, but rounded up to the next serviceable increment, relative to the timer resolution
  */
 void ConnectionObjectSetExpectedPacketRate(
-  CipConnectionObject *const connection_object,
-  CipUint expected_packet_rate);
+  CipConnectionObject *const connection_object);
 
 CipUdint ConnectionObjectGetCipProducedConnectionID(
   const CipConnectionObject *const connection_object);
@@ -371,6 +370,8 @@ size_t ConnectionObjectGetTToOConnectionSize(const CipConnectionObject *const co
  */
 void ConnectionObjectDeepCopy(CipConnectionObject *RESTRICT destination, const CipConnectionObject *RESTRICT const source);
 
+void ConnectionObjectResetProductionInhibitTimer(CipConnectionObject *const connection_object);
+
 /** @brief Generate the ConnectionIDs and set the general configuration
  * parameter in the given connection object.
  *

+ 5 - 4
source/src/cip/cipioconnection.c

@@ -666,6 +666,7 @@ void CloseIoConnection(CipConnectionObject *connection_object) {
             connection_object->eip_level_sequence_count_producing;
         next_non_control_master_connection->sequence_count_producing =
           connection_object->sequence_count_producing;
+        CloseUdpSocket(connection_object->socket[kUdpCommuncationDirectionProducing]);
         connection_object->socket[kUdpCommuncationDirectionProducing] =
           kEipInvalidSocket;
         next_non_control_master_connection->transmission_trigger_timer =
@@ -692,10 +693,10 @@ void HandleIoConnectionTimeOut(CipConnectionObject *connection_object) {
     switch (connection_object->instance_type) {
       case kConnectionObjectInstanceTypeIOExclusiveOwner:
         CloseAllConnectionsForInputWithSameType(
-          connection_object->consumed_path.instance_id,
+          connection_object->produced_path.instance_id,
           kConnectionObjectInstanceTypeIOInputOnly);
         CloseAllConnectionsForInputWithSameType(
-          connection_object->consumed_path.instance_id,
+          connection_object->produced_path.instance_id,
           kConnectionObjectInstanceTypeIOListenOnly);
         break;
       case kConnectionObjectInstanceTypeIOInputOnly:
@@ -703,7 +704,7 @@ void HandleIoConnectionTimeOut(CipConnectionObject *connection_object) {
             != connection_object->socket[kUdpCommuncationDirectionProducing]) { /* we are the controlling input only connection find a new controller*/
           CipConnectionObject *next_non_control_master_connection =
             GetNextNonControlMasterConnection(
-              connection_object->consumed_path.instance_id);
+              connection_object->produced_path.instance_id);
           if (NULL != next_non_control_master_connection) {
             next_non_control_master_connection->socket[
               kUdpCommuncationDirectionProducing] =
@@ -714,7 +715,7 @@ void HandleIoConnectionTimeOut(CipConnectionObject *connection_object) {
               connection_object->transmission_trigger_timer;
           } else { /* this was the last master connection close all listen only connections listening on the port */
             CloseAllConnectionsForInputWithSameType(
-              connection_object->consumed_path.instance_id,
+              connection_object->produced_path.instance_id,
               kConnectionObjectInstanceTypeIOListenOnly);
           }
         }

+ 14 - 4
source/src/ports/generic_networkhandler.c

@@ -561,7 +561,8 @@ EipStatus HandleDataOnTcpSocket(int socket) {
   if (number_of_read_bytes == 0) {
     int error_code = GetSocketErrorNumber();
     char *error_message = GetErrorMessage(error_code);
-    OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n",
+    OPENER_TRACE_ERR("networkhandler: socket: %d - connection closed by client: %d - %s\n",
+    		socket,
                      error_code,
                      error_message);
     FreeErrorMessage(error_message);
@@ -603,7 +604,8 @@ EipStatus HandleDataOnTcpSocket(int socket) {
         int error_code = GetSocketErrorNumber();
         char *error_message = GetErrorMessage(error_code);
         OPENER_TRACE_ERR(
-          "networkhandler: connection closed by client: %d - %s\n",
+          "networkhandler: socket: %d - connection closed by client: %d - %s\n",
+		  socket,
           error_code,
           error_message);
         FreeErrorMessage(error_message);
@@ -639,7 +641,8 @@ EipStatus HandleDataOnTcpSocket(int socket) {
   {
     int error_code = GetSocketErrorNumber();
     char *error_message = GetErrorMessage(error_code);
-    OPENER_TRACE_ERR("networkhandler: connection closed by client: %d - %s\n",
+    OPENER_TRACE_ERR("networkhandler: socket: %d - connection closed by client: %d - %s\n",
+    		socket,
                      error_code,
                      error_message);
     FreeErrorMessage(error_message);
@@ -842,12 +845,19 @@ void CheckAndHandleConsumingUdpSockets(void) {
         g_ethernet_communication_buffer, PC_OPENER_ETHERNET_BUFFER_SIZE, 0,
         (struct sockaddr *) &from_address, &from_address_length);
       if (0 == received_size) {
-        OPENER_TRACE_STATE("connection closed by client\n");
+    	  int error_code = GetSocketErrorNumber();
+    	           char *error_message = GetErrorMessage(error_code);
+    	           OPENER_TRACE_ERR("networkhandler: socket: %d - connection closed by client: %d - %s\n",
+    	        		   current_connection_object->socket[kUdpCommuncationDirectionConsuming],
+    	                            error_code,
+    	                            error_message);
+    	           FreeErrorMessage(error_message);
         current_connection_object->connection_close_function(
           current_connection_object);
         continue;
       }
 
+
       if (0 > received_size) {
         int error_code = GetSocketErrorNumber();
         char *error_message = GetErrorMessage(error_code);