فهرست منبع

Fixes wrong transfer of ownership to LO connections

Signed-off-by: Martin Melik-Merkumians <melik-merkumians@acin.tuwien.ac.at>
Martin Melik-Merkumians 7 سال پیش
والد
کامیت
0a10fd9611

+ 4 - 3
source/src/cip/appcontype.c

@@ -375,7 +375,7 @@ CipConnectionObject *GetNextNonControlMasterConnection(
   while (NULL != node) {
     CipConnectionObject *next_non_control_master_connection =
       node->data;
-    if ( true == ConnectionObjectIsTypeIOConnection(next_non_control_master_connection)
+    if ( true == ConnectionObjectIsTypeNonLOIOConnection(next_non_control_master_connection)
          && kConnectionObjectStateEstablished == ConnectionObjectGetState(next_non_control_master_connection)
          && input_point == next_non_control_master_connection->produced_path.instance_id
          &&  kConnectionObjectConnectionTypeMulticast == ConnectionObjectGetTToOConnectionType(next_non_control_master_connection)
@@ -391,14 +391,15 @@ CipConnectionObject *GetNextNonControlMasterConnection(
 }
 
 void CloseAllConnectionsForInputWithSameType(const EipUint32 input_point,
-                                             const ConnectionObjectConnectionType instance_type)
+                                             const ConnectionObjectInstanceType instance_type)
 {
 
+  OPENER_TRACE_INFO("Close all instance type %d only connections\n", instance_type);
   DoublyLinkedListNode *node = connection_list.first;
   while (NULL != node) {
     CipConnectionObject *connection = node->data;
     node = node->next;
-    if ( (instance_type == connection->instance_type)
+    if ( (instance_type == ConnectionObjectGetInstanceType(connection))
          && (input_point == connection->produced_path.instance_id) ) {
       CipConnectionObject *connection_to_delete = connection;
       CheckIoConnectionEvent(

+ 1 - 1
source/src/cip/appcontype.h

@@ -56,7 +56,7 @@ CipConnectionObject *GetNextNonControlMasterConnection(
  * @param instance_type the connection application type
  */
 void CloseAllConnectionsForInputWithSameType(const EipUint32 input_point,
-                                             const ConnectionObjectConnectionType instance_type);
+                                             const ConnectionObjectInstanceType instance_type);
 
 /**@ brief close all open connections.
  *

+ 12 - 0
source/src/cip/cipconnectionobject.c

@@ -289,6 +289,18 @@ CipUsint ConnectionObjectGetInstanceTypeForAttribute(
   return instance_type;
 }
 
+bool ConnectionObjectIsTypeNonLOIOConnection(
+  const CipConnectionObject *const connection_object) {
+  switch(connection_object->instance_type) {
+    case kConnectionObjectInstanceTypeIO:
+    case kConnectionObjectInstanceTypeIOExclusiveOwner:
+    case kConnectionObjectInstanceTypeIOInputOnly:
+      return true;
+    default: return false;
+  }
+  return false;
+}
+
 bool ConnectionObjectIsTypeIOConnection(
   const CipConnectionObject *const connection_object) {
   switch(connection_object->instance_type) {

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

@@ -419,6 +419,9 @@ void ConnectionObjectResetProductionInhibitTimer(
 void ConnectionObjectGeneralConfiguration(
   CipConnectionObject *const connection_object);
 
+bool ConnectionObjectIsTypeNonLOIOConnection(
+  const CipConnectionObject *const connection_object);
+
 bool ConnectionObjectIsTypeIOConnection(
   const CipConnectionObject *const connection_object);
 

+ 3 - 1
source/src/cip/cipioconnection.c

@@ -674,6 +674,7 @@ void CloseIoConnection(CipConnectionObject *connection_object) {
   CheckIoConnectionEvent(connection_object->consumed_path.instance_id,
                          connection_object->produced_path.instance_id,
                          kIoConnectionEventClosed);
+  ConnectionObjectSetState(connection_object, kConnectionObjectStateNonExistent);
 
   if ( kConnectionObjectInstanceTypeIOExclusiveOwner ==
        ConnectionObjectGetInstanceType(connection_object)
@@ -684,12 +685,13 @@ void CloseIoConnection(CipConnectionObject *connection_object) {
          && (kEipInvalidSocket
              != connection_object->socket[kUdpCommuncationDirectionProducing]) )
     {
+      OPENER_TRACE_INFO("Exclusive Owner or Input Only connection closed - Instance type :%d\n", ConnectionObjectGetInstanceType(connection_object));
       CipConnectionObject *next_non_control_master_connection =
         GetNextNonControlMasterConnection(
           connection_object->produced_path.instance_id);
       if (NULL != next_non_control_master_connection) {
 
-        /* Transfer socket ownership */
+        OPENER_TRACE_INFO("Transfer socket ownership\n");
         next_non_control_master_connection->socket[
           kUdpCommuncationDirectionProducing] =
           connection_object->socket[kUdpCommuncationDirectionProducing];