Browse Source

First try making fix platform independent

CapXilinx 9 năm trước cách đây
mục cha
commit
d18ce65912
33 tập tin đã thay đổi với 101 bổ sung1015 xóa
  1. 1 1
      source/buildsupport/OpENer.cmake
  2. 1 3
      source/src/cip/CMakeLists.txt
  3. 2 2
      source/src/cip/cipassembly.c
  4. 3 3
      source/src/cip/cipcommon.c
  5. 3 3
      source/src/cip/cipcommon.h
  6. 10 11
      source/src/cip/cipconnectionmanager.c
  7. 1 1
      source/src/cip/cipconnectionmanager.h
  8. 0 179
      source/src/cip/cipconnectionobject.c
  9. 0 65
      source/src/cip/cipconnectionobject.h
  10. 6 3
      source/src/cip/cipidentity.c
  11. 12 1
      source/src/cip/cipioconnection.c
  12. 1 1
      source/src/cip/cipmessagerouter.c
  13. 1 1
      source/src/cip/cipmessagerouter.h
  14. 5 5
      source/src/cip/ciptcpipinterface.c
  15. 2 2
      source/src/cip/ciptypes.h
  16. 0 17
      source/src/cip/connectionmanager/CMakeLists.txt
  17. 0 397
      source/src/cip/connectionmanager/cipforwardopen.c
  18. 0 145
      source/src/cip/connectionmanager/cipforwardopen.h
  19. 2 2
      source/src/enet_encap/cpf.c
  20. 2 2
      source/src/enet_encap/cpf.h
  21. 6 5
      source/src/enet_encap/encap.c
  22. 1 1
      source/src/opener_api.h
  23. 11 4
      source/src/ports/POSIX/networkhandler.c
  24. 2 0
      source/src/ports/POSIX/networkhandler.h
  25. 7 2
      source/src/ports/WIN32/networkhandler.c
  26. 6 0
      source/src/ports/WIN32/networkhandler.h
  27. 15 23
      source/src/ports/generic_networkhandler.c
  28. 0 1
      source/tests/CMakeLists.txt
  29. 0 2
      source/tests/OpENerTests.h
  30. 1 3
      source/tests/cip/CMakeLists.txt
  31. 0 19
      source/tests/cip/cipconnectionobjecttest.cpp
  32. 0 10
      source/tests/cip/connectionmanager/CMakeLists.txt
  33. 0 101
      source/tests/cip/connectionmanager/cipforwardopentest.cpp

+ 1 - 1
source/buildsupport/OpENer.cmake

@@ -13,7 +13,7 @@ macro(opener_platform_support ARGS)
     message(FATAL_ERROR "No platform selected!")  
   endif(OpENer_PLATFORM STREQUAL "")
 
-  include( ${OpENer_BUILDSUPPORT_DIR}/${OpENer_PLATFORM}/OpENer_PLATFORM_${ARGS}.cmake)
+  include( ${OpENer_BUILDSUPPORT_DIR}/${OpENer_PLATFORM}/OpENer_PLATFORM_INCLUDES.cmake)
   opener_platform_spec()
 endmacro(opener_platform_support ARGS)
 

+ 1 - 3
source/src/cip/CMakeLists.txt

@@ -12,9 +12,7 @@ opener_common_includes()
 #######################################
 opener_platform_support("INCLUDES")
 
-add_subdirectory( connectionmanager )
-
 set( CIP_SRC appcontype.c cipassembly.c cipclass3connection.c cipcommon.c cipconnectionmanager.c ciperror.h cipethernetlink.c cipidentity.c cipioconnection.c cipmessagerouter.c ciptcpipinterface.c ciptypes.h cipepath.h cipepath.c cipelectronickey.h cipelectronickey.c )
 
 add_library( CIP ${CIP_SRC} )
-target_link_libraries( CIP CIP_CONNECTION_MANAGER )
+

+ 2 - 2
source/src/cip/cipassembly.c

@@ -22,7 +22,7 @@ EipStatus SetAssemblyAttributeSingle(
   CipInstance *const instance,
   CipMessageRouterRequest *const message_router_request,
   CipMessageRouterResponse *const message_router_response,
-  in_addr_t originator_address);
+  struct sockaddr *originator_address);
 
 /** @brief Constructor for the assembly object class
  *
@@ -123,7 +123,7 @@ EipStatus SetAssemblyAttributeSingle(
   CipInstance *const instance,
   CipMessageRouterRequest *const message_router_request,
   CipMessageRouterResponse *const message_router_response,
-  in_addr_t originator_address) {
+  struct sockaddr *originator_address) {
   OPENER_TRACE_INFO(" setAttribute %d\n",
                     message_router_request->request_path.attribute_number);
 

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

@@ -68,7 +68,7 @@ void ShutdownCipStack(void) {
 EipStatus NotifyClass(const CipClass *restrict const cip_class,
                       CipMessageRouterRequest *const message_router_request,
                       CipMessageRouterResponse *const message_router_response,
-                      in_addr_t originator_address) {
+                      struct sockaddr *originator_address) {
 
   /* find the instance: if instNr==0, the class is addressed, else find the instance */
   EipUint16 instance_number =
@@ -370,7 +370,7 @@ CipAttributeStruct *GetCipAttribute(const CipInstance *const instance,
 EipStatus GetAttributeSingle(CipInstance *restrict const instance,
                              CipMessageRouterRequest *const message_router_request,
                              CipMessageRouterResponse *const message_router_response,
-                             in_addr_t originator_address) {
+                             struct sockaddr *originator_address) {
   /* Mask for filtering get-ability */
   EipByte get_mask = kNotSetOrGetable;
 
@@ -661,7 +661,7 @@ int DecodeData(const EipUint8 cip_type,
 EipStatus GetAttributeAll(CipInstance *instance,
                           CipMessageRouterRequest *message_router_request,
                           CipMessageRouterResponse *message_router_response,
-                          in_addr_t originator_address) {
+                          struct sockaddr *originator_address) {
 
   EipUint8 *reply = message_router_response->data; /* pointer into the reply */
   CipAttributeStruct *attribute = instance->attributes; /* pointer to list of attributes*/

+ 3 - 3
source/src/cip/cipcommon.h

@@ -34,7 +34,7 @@ extern EipUint8 g_message_data_reply_buffer[];
 EipStatus NotifyClass(const CipClass *restrict const class,
                       CipMessageRouterRequest *const message_router_request,
                       CipMessageRouterResponse *const message_router_response,
-                      in_addr_t originator_address);
+                      struct sockaddr *originator_address);
 
 /** @brief Generic implementation of the GetAttributeSingle CIP service
  *
@@ -49,7 +49,7 @@ EipStatus NotifyClass(const CipClass *restrict const class,
 EipStatus GetAttributeSingle(CipInstance *restrict const instance,
                              CipMessageRouterRequest *const message_router_request,
                              CipMessageRouterResponse *const message_router_response,
-                             in_addr_t originator_address);
+                             struct sockaddr *originator_address);
 
 /** @brief Generic implementation of the GetAttributeAll CIP service
  *
@@ -63,7 +63,7 @@ EipStatus GetAttributeSingle(CipInstance *restrict const instance,
 EipStatus GetAttributeAll(CipInstance *instance,
                           CipMessageRouterRequest *message_router_request,
                           CipMessageRouterResponse *message_router_response,
-                          in_addr_t originator_address);
+                          struct sockaddr *originator_address);
 
 /** @brief Decodes padded EPath
  *  @param epath EPath to the receiving element

+ 10 - 11
source/src/cip/cipconnectionmanager.c

@@ -123,17 +123,17 @@ EipUint32 g_incarnation_id;
 EipStatus ForwardOpen(CipInstance *instance,
                       CipMessageRouterRequest *message_router_request,
                       CipMessageRouterResponse *message_router_response,
-                      in_addr_t originator_address);
+                      struct sockaddr *originator_address);
 
 EipStatus ForwardClose(CipInstance *instance,
                        CipMessageRouterRequest *message_router_request,
                        CipMessageRouterResponse *message_router_response,
-                       in_addr_t originator_address);
+                       struct sockaddr *originator_address);
 
 EipStatus GetConnectionOwner(CipInstance *instance,
                              CipMessageRouterRequest *message_router_request,
                              CipMessageRouterResponse *message_router_response,
-                             in_addr_t originator_address);
+                             struct sockaddr *originator_address);
 
 EipStatus AssembleForwardOpenResponse(
   ConnectionObject *connection_object,CipMessageRouterResponse *
@@ -587,11 +587,9 @@ static const HandleForwardOpenRequestFunction
 EipStatus ForwardOpen(CipInstance *instance,
                       CipMessageRouterRequest *message_router_request,
                       CipMessageRouterResponse *message_router_response,
-                      in_addr_t originator_address) {
+                      struct sockaddr *originator_address) {
   (void) instance;       /*suppress compiler warning */
 
-  OPENER_TRACE_INFO("Forward Open invoked by: %d", originator_address);
-
   uint8_t is_null_request = -1;       /* 1 = Null Request, 0 =  Non-Null Request  */
   uint8_t is_matching_request = -1;       /* 1 = Matching Request, 0 = Non-Matching Request  */
 
@@ -599,7 +597,8 @@ EipStatus ForwardOpen(CipInstance *instance,
   ReadOutConnectionObjectFromMessage(message_router_request,
                                      &g_dummy_connection_object);
 
-  g_dummy_connection_object.original_opener_ip_address = originator_address;
+  memcpy( &(g_dummy_connection_object.originator_address), originator_address,
+          sizeof(g_dummy_connection_object.original_opener_ip_address) );
 
   ForwardOpenConnectionType o_to_t_connection_type = GetConnectionType(
     g_dummy_connection_object.o_to_t_network_connection_parameter);
@@ -718,7 +717,7 @@ void GeneralConnectionConfiguration(ConnectionObject *connection_object) {
 EipStatus ForwardClose(CipInstance *instance,
                        CipMessageRouterRequest *message_router_request,
                        CipMessageRouterResponse *message_router_response,
-                       in_addr_t originator_address) {
+                       struct sockaddr *originator_address) {
   /*Suppress compiler warning*/
   (void) instance;
 
@@ -755,8 +754,8 @@ EipStatus ForwardClose(CipInstance *instance,
         /* found the corresponding connection object -> close it */
         OPENER_ASSERT(
           NULL != connection_object->connection_close_function);
-        if(originator_address ==
-           connection_object->original_opener_ip_address) {
+        if( ( (struct sockaddr_in *)originator_address )->sin_addr.s_addr ==
+            connection_object->originator_address.sin_addr.s_addr ) {
           connection_object->connection_close_function(connection_object);
           connection_status = kConnectionManagerExtendedStatusCodeSuccess;
         } else {
@@ -780,7 +779,7 @@ EipStatus ForwardClose(CipInstance *instance,
 EipStatus GetConnectionOwner(CipInstance *instance,
                              CipMessageRouterRequest *message_router_request,
                              CipMessageRouterResponse *message_router_response,
-                             in_addr_t originator_address) {
+                             struct sockaddr *originator_address) {
   /* suppress compiler warnings */
   (void) instance;
   (void) message_router_request;

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

@@ -331,7 +331,7 @@ typedef struct connection_object {
 
   EipUint16 correct_originator_to_target_size;
   EipUint16 correct_target_to_originator_size;
-  in_addr_t original_opener_ip_address;
+  struct sockaddr_in original_opener_ip_address;
 } ConnectionObject;
 
 /** @brief Connection Manager class code */

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

@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
-
-#include "cipconnectionobject.h"
-
-#include "typedefs.h"
-
-typedef struct {
-  CipUint size;
-  CipUint *array;
-} CipConnectionBindingList;
-
-typedef struct cip_connection_object {
-  CipUsint state; /**< Attribute 1: State of the object, see enum CipConnectionObjectState */
-  CipUsint instance_type; /**< Attribute 2: Defines instance type I/O, explicit, or bridged, see enum CipConnectionObjectInstanceType */
-  CipByte transport_class_trigger; /**< Attribute 3 */
-  /* CipUint device_net_produced_connection_id;  **< Attribute 4: Only used on DeviceNet */
-  /* CipUint device_net_consumed_connection_id;  **< Attribute 5: Only used on DeviceNet */
-  /* CipUsint device_net_initial_comm_characteristics; **< Attribute 6: Only used on DeviceNet */
-  CipUint produced_connection_size; /**< Attribute 7: See Vol.1 3-4.4.7 */
-  CipUint consumed_connection_size; /**< Attribute 8: See Vol.1 3-4.4.8 */
-  CipUint expected_packet_rate; /**< Attribute 9: Resolution in milliseconds*/
-  CipUdint cip_produced_connection_id; /**< Attribute 10: */
-  CipUdint cip_consumed_connection_id; /**< Attribute 11: */
-  CipUsint watchdog_timeout_action; /**< Attribute 12: */
-  CipUint produced_connection_path_length; /**< Attribute 13: Number of bytes of the produced_connection_path attribute */
-  CipEpath produced_connection_path; /**< Attribute 14: */
-  CipUint consumed_connection_path_length; /**< Attribute 15: Number of bytes of the produced_connection_path attribute */
-  CipEpath consumed_connection_path; /**< Attribute 16: */
-  CipUint production_inhibit_time; /**< Attribute 17: */
-  CipUsint connection_timeout_multiplier; /**< Attribute 18: */
-  CipConnectionBindingList connection_binding_list; /**< Attribute 19: */
-} CipConnectionObject;
-
-const size_t ConnectionObjectSize = sizeof(CipConnectionObject);
-
-CipConnectionObjectState ConnectionObjectGetState(
-  const CipConnectionObject *restrict const connection_object) {
-  return (CipConnectionObjectState) connection_object->state;
-}
-
-CipConnectionObjectInstanceType ConnectionObjectGetInstanceType(
-  const CipConnectionObject *restrict const connection_object) {
-  return (CipConnectionObjectInstanceType) connection_object->instance_type;
-}
-
-CipConnectionObjectTransportClassTriggerDirection
-GetTransportClassTriggerDirection(
-  const CipConnectionObject *restrict const connection_object) {
-  const CipByte direction_mask = 0x80;       /* Last bit of the byte is the direction flag */
-  CipByte direction = connection_object->transport_class_trigger &
-                      direction_mask;
-  return (CipConnectionObjectTransportClassTriggerDirection)direction >> 7;       /* Move to match enum values 0 or 1 */
-}
-
-CipConnectionObjectTransportClassTriggerProductionTrigger
-GetTransportClassTriggerProductionTrigger(
-  const CipConnectionObject *restrict const connection_object) {
-  const CipByte kProductionTriggerMask = 0x70;       /* Bits 4-7 are representing the production trigger */
-  CipByte production_trigger = connection_object->transport_class_trigger &
-                               kProductionTriggerMask;
-  return (CipConnectionObjectTransportClassTriggerProductionTrigger)
-         production_trigger >> 4;
-}
-
-CipConnectionObjectTransportClassTriggerClass
-GetTransportClassTriggerTransportClass(
-  const CipConnectionObject *restrict const connection_object) {
-  const CipByte kTransportClassMask = 0x0F;
-  const CipByte kTransportClass = connection_object->transport_class_trigger &
-                                  kTransportClassMask;
-  CipConnectionObjectTransportClassTriggerClass transport_class =
-    kCipConnectionObjectTransportClassTriggerClassInvalid;
-  switch(kTransportClass) {
-    case 0: transport_class = kCipConnectionObjectTransportClassTriggerClass0;
-      break;
-    case 1: transport_class = kCipConnectionObjectTransportClassTriggerClass1;
-      break;
-    case 2: transport_class = kCipConnectionObjectTransportClassTriggerClass2;
-      break;
-    case 3: transport_class = kCipConnectionObjectTransportClassTriggerClass3;
-      break;
-    default: transport_class =
-      kCipConnectionObjectTransportClassTriggerClassInvalid; break;
-  }
-  return kTransportClass;
-}
-
-CipUint ConnectionObjectGetProducedConnectionSize(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->produced_connection_size;
-}
-
-CipUint ConnectionObjectGetConsumedConnectionSize(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->consumed_connection_size;
-}
-
-CipUint ConnectionObjectGetExpectedPacketRate(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->expected_packet_rate;
-}
-
-CipUdint ConnectionObjectGetCipProducedConnectionId(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->cip_produced_connection_id;
-}
-
-CipUdint ConnectionObjectGetCipConsumedConnectionId(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->cip_consumed_connection_id;
-}
-
-CipConnectionObjectWatchdogTimeoutAction
-ConnectionObjectGetWatchdogTimeoutActionValue(
-  const CipConnectionObject *restrict const connection_object) {
-  return (CipConnectionObjectWatchdogTimeoutAction) connection_object->
-         watchdog_timeout_action;
-}
-
-CipUint ConnectionObjectGetProducedConnectionPathLength(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->produced_connection_path_length;
-}
-
-CipEpath ConnectionObjectGetProducedConnectionPath(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->produced_connection_path;
-}
-
-CipUint ConnectionObjectGetConsumedConnectionPathLength(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->consumed_connection_path_length;
-}
-
-CipEpath ConnectionObjectGetConsumedConnectionPath(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->consumed_connection_path;
-}
-
-CipUint ConnectionObjectGetProductionInhibitTime(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->production_inhibit_time;
-}
-
-CipUsint ConnectionObjectGetConnectionTimeoutMultiplier(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->connection_timeout_multiplier;
-}
-
-CipConnectionBindingList ConnectionObjectGetConnectionBindingList(
-  const CipConnectionObject *restrict const connection_object) {
-  return connection_object->connection_binding_list;
-}
-
-EipStatus ConnectionObjectGetAttributeSingle(
-  CipInstance *const restrict instance,
-  CipMessageRouterRequest *restrict const message_router_request,
-  CipMessageRouterResponse *restrict const message_router_response) {
-
-}
-
-CipClass *CreateCipConnectionClass(void) {
-  CipClass connection_object_class = CreateCipClass(kConnectionObjectClassId,
-                                                    0,
-                                                    0,
-                                                    0,
-                                                    16,
-                                                    0,
-                                                    0,
-                                                    0,
-                                                    "connection",
-                                                    1);
-
-  return connection_object_class;
-}

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

@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
-
-#ifndef OPENER_SRC_CIP_CIPCONNECTIONOBJECT_H_
-#define OPENER_SRC_CIP_CIPCONNECTIONOBJECT_H_
-
-static const int kConnectionObjectClassId = 0x05;
-
-typedef struct cip_connection_object CipConnectionObject;
-
-extern const size_t CipConnectionObjectSize;
-
-/** @brief Valid values for the state attribute of the Connection Object */
-typedef enum {
-  kCipConnectionObjectStateNonExistent = 0, /**< Connection not yet instantiated */
-  kCipConnectionObjectStateConfiguring = 1, /**< Waiting to be configured or waiting to be told to apply configuration */
-  kCipConnectionObjectStateWaitingForConnectionId = 2, /**< Only used on DeviceNet */
-  kCipConnectionObjectStateEstablished = 3, /**< Fully configured and successfully applied */
-  kCipConnectionObjectStateTimedOut = 4, /**< Has been timed out (Inactivity/Watchdog) */
-  kCipConnectionObjectStateDeferredDelete = 5, /**< Only used on DeviceNet */
-  kCipConnectionObjectStateClosing = 6 /**< CIP bridge is waiting for successful Forward Close from target node */
-} CipConnectionObjectState;
-
-typedef enum {
-  kCipConnectionObjectInstanceTypeExplicitMessaging = 0,
-  kCipConnectionObjectInstanceTypeIo = 1,
-  kCipConnectionObjectInstanceTypeCipBridged = 2
-} CipConnectionObjectInstanceType;
-
-typedef enum {
-  kCipConnectionObjectTransportClassTriggerDirectionClient = 0,
-  kCipConnectionObjectTransportClassTriggerDirectionServer = 1
-} CipConnectionObjectTransportClassTriggerDirection;
-
-typedef enum {
-  kCipConnectionObjectTransportClassTriggerProductionTriggerInvalid,
-  kCipConnectionObjectTransportClassTriggerProductionTriggerCyclic,
-  kCipConnectionObjectTransportClassTriggerProductionTriggerChangeOfState,
-  kCipConnectionObjectTransportClassTriggerProductionTriggerApplicationObject
-} CipConnectionObjectTransportClassTriggerProductionTrigger;
-
-typedef enum {
-  kCipConnectionObjectTransportClassTriggerClassInvalid = -1,
-  kCipConnectionObjectTransportClassTriggerClass0 = 0,
-  kCipConnectionObjectTransportClassTriggerClass1 = 1,
-  kCipConnectionObjectTransportClassTriggerClass2 = 2,
-  kCipConnectionObjectTransportClassTriggerClass3 = 3,
-  kCipConnectionObjectTransportClassTriggerClass4 = 4,
-  kCipConnectionObjectTransportClassTriggerClass5 = 5,
-  kCipConnectionObjectTransportClassTriggerClass6 = 6
-} CipConnectionObjectTransportClassTriggerClass;
-
-typedef enum {
-  kCipConnectionObjectWatchdogTimeoutActionTransitionToTimedOut = 0,
-  kCipConnectionObjectWatchdogTimeoutActionAutoDelete = 1,
-  kCipConnectionObjectWatchdogTimeoutActionAutoReset = 2,
-  kCipConnectionObjectWatchdogTimeoutActionDeferredDelete = 3
-} CipConnectionObjectWatchdogTimeoutAction;
-
-CipConnectionObject *NewCipConnectionObject(CipConnectionObjectInstanceType type);
-
-#endif /* OPENER_SRC_CIP_CIPCONNECTIONOBJECT_H_ */

+ 6 - 3
source/src/cip/cipidentity.c

@@ -68,9 +68,12 @@ void SetDeviceStatus(const EipUint16 status) {
  * @param message_router_response
  * @returns Currently always kEipOkSend is returned
  */
-static EipStatus Reset(CipInstance *instance, /* pointer to instance*/
-                       CipMessageRouterRequest *message_router_request, /* pointer to message router request*/
-                       CipMessageRouterResponse *message_router_response) { /* pointer to message router response*/
+static EipStatus Reset(CipInstance *instance,
+                       /* pointer to instance*/
+                       CipMessageRouterRequest *message_router_request,
+                       /* pointer to message router request*/
+                       CipMessageRouterResponse *message_router_response,
+                       struct sockaddr_in *originator_address) {                      /* pointer to message router response*/
   (void) instance;
 
   EipStatus eip_status = kEipStatusOkSend;

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

@@ -8,7 +8,6 @@
 
 #include "cipioconnection.h"
 
-#include "cipconnectionobject.h"
 #include "generic_networkhandler.h"
 #include "cipconnectionmanager.h"
 #include "cipassembly.h"
@@ -19,6 +18,18 @@
 #include "trace.h"
 #include "endianconv.h"
 
+typedef enum {
+  kCipConnectionObjectTransportClassTriggerClassInvalid = -1,
+  kCipConnectionObjectTransportClassTriggerClass0 = 0,
+  kCipConnectionObjectTransportClassTriggerClass1 = 1,
+  kCipConnectionObjectTransportClassTriggerClass2 = 2,
+  kCipConnectionObjectTransportClassTriggerClass3 = 3,
+  kCipConnectionObjectTransportClassTriggerClass4 = 4,
+  kCipConnectionObjectTransportClassTriggerClass5 = 5,
+  kCipConnectionObjectTransportClassTriggerClass6 = 6
+} CipConnectionObjectTransportClassTriggerClass;
+
+
 const unsigned int kConnectionPointConsumer = 0; /**< Consumer connection point */
 const unsigned int kConnectionPointProducer = 1; /**< Producer connection point */
 const unsigned int kConnectionPointConfig = 2; /**< Config connection point */

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

@@ -143,7 +143,7 @@ EipStatus RegisterCipClass(CipClass *cip_class) {
 
 EipStatus NotifyMessageRouter(EipUint8 *data,
                               int data_length,
-                              in_addr_t originator_address) {
+                              struct sockaddr *originator_address) {
   EipStatus eip_status = kEipStatusOkSend;
   EipByte status = kCipErrorSuccess;
 

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

@@ -40,7 +40,7 @@ void DeleteAllClasses(void);
  */
 EipStatus NotifyMessageRouter(EipUint8 *data,
                               int data_length,
-                              in_addr_t originator_address);
+                              struct sockaddr *originator_address);
 
 /*! Register a class at the message router.
  *  In order that the message router can deliver

+ 5 - 5
source/src/cip/ciptcpipinterface.c

@@ -59,13 +59,13 @@ EipStatus GetAttributeSingleTcpIpInterface(
   CipInstance *instance,
   CipMessageRouterRequest *message_router_request,
   CipMessageRouterResponse *message_router_response,
-  in_addr_t originator_address);
+  struct sockaddr_in *originator_address);
 
 EipStatus GetAttributeAllTcpIpInterface(
   CipInstance *instance,
   CipMessageRouterRequest *message_router_request,
   CipMessageRouterResponse *message_router_response,
-  in_addr_t originator_address);
+  struct sockaddr_in *originator_address);
 
 EipStatus ConfigureNetworkInterface(const char *const ip_address,
                                     const char *const subnet_mask,
@@ -126,7 +126,7 @@ EipStatus SetAttributeSingleTcp(
   CipInstance *instance,
   CipMessageRouterRequest *message_router_request,
   CipMessageRouterResponse *message_router_response,
-  in_addr_t originator_address) {
+  struct sockaddr_in *originator_address) {
   CipAttributeStruct *attribute = GetCipAttribute(
     instance, message_router_request->request_path.attribute_number);
   (void) instance; /*Suppress compiler warning */
@@ -211,7 +211,7 @@ EipStatus GetAttributeSingleTcpIpInterface(
   CipInstance *const restrict instance,
   CipMessageRouterRequest *restrict const message_router_request,
   CipMessageRouterResponse *restrict const message_router_response,
-  in_addr_t originator_address) {
+  struct sockaddr_in *originator_address) {
 
   EipStatus status = kEipStatusOkSend;
   EipByte *message = message_router_response->data;
@@ -251,7 +251,7 @@ EipStatus GetAttributeAllTcpIpInterface(
   CipInstance *instance,
   CipMessageRouterRequest *message_router_request,
   CipMessageRouterResponse *message_router_response,
-  in_addr_t originator_address) {
+  struct sockaddr_in *originator_address) {
 
   EipUint8 *response = message_router_response->data; /* pointer into the reply */
   CipAttributeStruct *attribute = instance->attributes;

+ 2 - 2
source/src/cip/ciptypes.h

@@ -7,7 +7,7 @@
 #define OPENER_CIPTYPES_H_
 
 #include "typedefs.h"
-#include <arpa/inet.h>
+#include "networkhandler.h"
 
 /** @brief Enum containing the encoding values for CIP data types for CIP
  * Messages */
@@ -285,7 +285,7 @@ typedef EipStatus (*CipServiceFunction)(
   CipInstance *const instance,
   CipMessageRouterRequest *const message_router_request,
   CipMessageRouterResponse *const message_router_response,
-  in_addr_t originator_address);
+  struct sockaddr *originator_address);
 
 /** @brief Service descriptor. These are stored in an array */
 typedef struct cip_service_struct {

+ 0 - 17
source/src/cip/connectionmanager/CMakeLists.txt

@@ -1,17 +0,0 @@
-#######################################
-# CIP connection manager library      #
-#######################################
-
-#######################################
-# Add common includes                 #
-#######################################
-opener_common_includes()
-
-#######################################
-# Add platform-specific includes      #
-#######################################
-opener_platform_support("INCLUDES")
-
-set( CIP_CONNECTION_MANAGER_SRC cipforwardopen.c )
-
-add_library( CIP_CONNECTION_MANAGER ${CIP_CONNECTION_MANAGER_SRC} )

+ 0 - 397
source/src/cip/connectionmanager/cipforwardopen.c

@@ -1,397 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
-
-#include "cipforwardopen.h"
-
-#include "endianconv.h"
-
-typedef struct cip_forward_open_data {
-  CipByte priority_time_tick;
-  CipUsint timeout_ticks;
-  CipUdint originiator_to_target_network_connection_id;
-  CipUdint target_to_originator_network_connection_id;
-  CipUint connection_serial_number;
-  CipUint originator_vendor_id;
-  CipUdint originator_serial_number;
-  CipUsint connection_timeout_multiplier;
-  CipUdint originator_to_target_requested_packet_interval;
-  CipWord originator_to_target_network_connection_parameters;
-  CipUdint target_to_originator_requested_packet_interval;
-  CipWord target_to_originator_network_connection_parameters;
-  CipByte transport_class_and_trigger;
-  CipUsint connection_path_size;
-  const CipOctet *connection_path;
-} CipForwardOpenData;
-
-const size_t kCipForwardOpenDataSize = sizeof(CipForwardOpenData);
-
-const CipOctet *CipForwardOpenGetForwardOpenDataFromMessage(
-  CipForwardOpenData *const data, const CipOctet **const message) {
-  const CipOctet **message_runner = message;
-  data->priority_time_tick = GetByteFromMessage(message_runner);
-  data->timeout_ticks = GetUsintFromMessage(message_runner);
-  data->originiator_to_target_network_connection_id = GetUdintFromMessage(
-    message_runner);
-  data->target_to_originator_network_connection_id = GetUdintFromMessage(
-    message_runner);
-  data->connection_serial_number = GetUintFromMessage(message_runner);
-  data->originator_vendor_id = GetUintFromMessage(message_runner);
-  data->originator_serial_number = GetUdintFromMessage(message_runner);
-  data->connection_timeout_multiplier = GetUsintFromMessage(message_runner);
-  *message_runner += 3; //Move pointer over the reserved space
-  data->originator_to_target_requested_packet_interval = GetUdintFromMessage(
-    message_runner);
-  data->originator_to_target_network_connection_parameters = GetWordFromMessage(
-    message_runner);
-  data->target_to_originator_requested_packet_interval = GetUdintFromMessage(
-    message_runner);
-  data->target_to_originator_network_connection_parameters = GetWordFromMessage(
-    message_runner);
-  data->transport_class_and_trigger = GetByteFromMessage(message_runner);
-  data->connection_path_size = GetUsintFromMessage(message_runner);
-  data->connection_path = *message_runner;
-  *message_runner = *message_runner + data->connection_path_size *
-                    sizeof(CipOctet);
-  return *message_runner;
-}
-
-CipForwardOpenPriorityTickTime CipForwardOpenGetPriorityTickTime(
-  CipForwardOpenData *forward_open_data) {
-  const CipByte kPriorityMask = 0x10;
-  if( kPriorityMask ==
-      ( (forward_open_data->priority_time_tick) & kPriorityMask ) ) {
-    return kCipForwardOpenPriorityTickTimeReserved;
-  }
-  else {
-    return kCipForwardOpenPriorityTickTimeNormal;
-  }
-}
-
-uint8_t CipForwardOpenGetTickTime(CipForwardOpenData *forward_open_data) {
-  const CipByte kTickTimeMask = 0x0F;
-  return (forward_open_data->priority_time_tick & kTickTimeMask);
-}
-
-CipUsint CipForwardOpenGetTimeoutTick(CipForwardOpenData *forward_open_data) {
-  return forward_open_data->timeout_ticks;
-}
-
-MilliSeconds CipForwardOpenGetTimeoutInMilliseconds(
-  CipForwardOpenData *forward_open_data) {
-  return CipForwardOpenGetTimeoutTick(forward_open_data) * 1 <<
-         CipForwardOpenGetTickTime(forward_open_data);
-}
-
-CipUdint CipForwardOpenGetOriginatorToTargetNetworkConnectionId(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->originiator_to_target_network_connection_id;
-}
-
-CipUdint CipForwardOpenGetTargetToOriginatorNetworkConnectionId(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->target_to_originator_network_connection_id;
-}
-
-CipUint CipForwardOpenGetConnectionSerialNumber(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->connection_serial_number;
-}
-
-CipUint CipForwardOpenGetOriginatorVendorId(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->originator_vendor_id;
-}
-
-CipUdint CipForwardOpenGetOriginatorSerialNumber(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->originator_serial_number;
-}
-
-uint16_t CipForwardOpenGetTimeoutMultiplier(
-  CipForwardOpenData *forward_open_data) {
-  if (8 > forward_open_data->connection_timeout_multiplier) {
-    return 4 << forward_open_data->connection_timeout_multiplier;
-  }
-
-  return 0;
-}
-
-MicroSeconds CipForwardOpenGetOriginatorToTargetRequestedPacketInterval(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->originator_to_target_requested_packet_interval;
-}
-
-CipWord CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->originator_to_target_network_connection_parameters;
-}
-
-static bool GetRedundantOwner(const CipWord connection_parameters) {
-  const CipWord kRedundantOwnerMask = 0x8000;
-  if ( kRedundantOwnerMask == (kRedundantOwnerMask & connection_parameters) ) {
-    return true;
-  }
-  return false;
-}
-
-bool CipForwardOpenGetOriginatorToTargetRedundantOwner(
-  CipForwardOpenData *forward_open_data) {
-  return GetRedundantOwner( CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-                              forward_open_data) );
-}
-
-static CipForwardOpenConnectionType GetConnectionType(
-  CipWord connection_parameters) {
-#define NULL_CONNECTION_TYPE 0x0000
-#define MULTICAST_CONNECTION_TYPE 0x2000
-#define POINT_TO_POINT_CONNECTION_TYPE 0x4000
-
-  const CipWord kConnectionTypeMask = 0x6000;
-  const CipWord kConnectionType = kConnectionTypeMask & connection_parameters;
-
-  CipForwardOpenConnectionType type = kCipForwardOpenConnectionTypeReserved;
-
-  switch(kConnectionType) {
-    case NULL_CONNECTION_TYPE: type = kCipForwardOpenConnectionTypeNull; break;
-    case MULTICAST_CONNECTION_TYPE: type =
-      kCipForwardOpenConnectionTypeMulticastConnection; break;
-    case POINT_TO_POINT_CONNECTION_TYPE: type =
-      kCipForwardOpenConnectionTypePointToPointConnection; break;
-    default: type = kCipForwardOpenConnectionTypeReserved; break;
-  }
-
-  return type;
-
-#undef NULL_CONNECTION_TYPE
-#undef MULTICAST_CONNECTION_TYPE
-#undef POINT_TO_POINT_CONNECTION_TYPE
-}
-
-CipForwardOpenConnectionType CipForwardOpenGetOriginatorToTargetConnectionType(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionType( CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-                              forward_open_data) );
-}
-
-static CipForwardOpenConnectionPriority GetConnectionPriority(
-  const CipWord connection_parameters) {
-#define LOW_PRIORITY 0x0000
-#define HIGH_PRIORITY 0x0800
-#define SCHEDULED_PRIORITY 0x1000
-#define URGENT_PRIORITY 0x1800
-  const CipWord kPriorityMask = 0x1800;
-  const CipWord kPriority = kPriorityMask & connection_parameters;
-
-  CipForwardOpenConnectionPriority priority =
-    kCipForwardOpenConnectionPriorityLow;
-  switch(kPriority) {
-    case LOW_PRIORITY: priority = kCipForwardOpenConnectionPriorityLow; break;
-    case HIGH_PRIORITY: priority = kCipForwardOpenConnectionPriorityHigh; break;
-    case SCHEDULED_PRIORITY: priority =
-      kCipForwardOpenConnectionPriorityScheduled; break;
-    case URGENT_PRIORITY: priority = kCipForwardOpenConnectionPriorityUrgent;
-      break;
-  }
-  return priority;
-#undef LOW_PRIORITY
-#undef HIGH_PRIORITY
-#undef SCHEDULED_PRIORITY
-#undef URGENT_PRIORITY
-}
-
-CipForwardOpenConnectionPriority
-CipForwardOpenGetOriginatorToTargetConnectionPriority(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionPriority( CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-                                  forward_open_data) );
-
-}
-
-static CipForwardOpenConnectionSizeType GetConnectionSizeType(
-  CipWord connection_parameters) {
-#define CONNECTION_SIZE_TYPE_FIXED 0x0000
-#define CONNECTION_SIZE_TYPE_VARIABLE 0x0200
-  const CipWord kConnectionSizeTypeMask = 0x0200;
-  const CipWord kConnectionSizeType = kConnectionSizeTypeMask &
-                                      connection_parameters;
-
-  CipForwardOpenConnectionSizeType type =
-    kCipForwardOpenConnectionSizeTypeFixed;
-  switch (kConnectionSizeType) {
-    case CONNECTION_SIZE_TYPE_FIXED: type =
-      kCipForwardOpenConnectionSizeTypeFixed; break;
-    case CONNECTION_SIZE_TYPE_VARIABLE: type =
-      kCipForwardOpenConnectionSizeTypeVariable; break;
-  }
-
-  return type;
-
-#undef CONNECTION_SIZE_TYPE_FIXED
-#undef CONNECTION_SIZE_TYPE_VARIABLE
-
-}
-
-CipForwardOpenConnectionSizeType
-CipForwardOpenGetOriginatorToTargetConnectionSizeType(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionSizeType( CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-                                  forward_open_data) );
-}
-
-static uint16_t GetConnectionSize(CipWord connection_parameters) {
-  const CipWord kConnectionSizeMask = 0x01FF;
-  return kConnectionSizeMask & connection_parameters;
-}
-
-uint16_t CipForwardOpenGetOriginatorToTargetConnectionSize(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionSize( CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-                              forward_open_data) );
-}
-
-MicroSeconds CipForwardOpenGetTargetToOriginatorRequestedPacketInterval(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->target_to_originator_requested_packet_interval;
-}
-
-CipWord CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->target_to_originator_network_connection_parameters;
-}
-
-bool CipForwardOpenGetTargetToOriginatorRedundantOwner(
-  CipForwardOpenData *forward_open_data) {
-  return GetRedundantOwner( CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-                              forward_open_data) );
-}
-
-CipForwardOpenConnectionType CipForwardOpenGetTargetToOriginatorConnectionType(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionType( CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-                              forward_open_data) );
-}
-
-CipForwardOpenConnectionPriority
-CipForwardOpenGetTargetToOriginatorConnectionPriority(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionPriority( CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-                                  forward_open_data) );
-}
-
-CipForwardOpenConnectionSizeType
-CipForwardOpenGetTargetToOriginatorConnectionSizeType(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionSizeType( CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-                                  forward_open_data) );
-}
-
-uint16_t CipForwardOpenGetTargetToOriginatorConnectionSize(
-  CipForwardOpenData *forward_open_data) {
-  return GetConnectionSize( CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-                              forward_open_data) );
-}
-
-CipConnectionObjectTransportClassTriggerDirection
-CipForwardOpenGetTransportClassTriggerDirection(
-  CipForwardOpenData *forward_open_data) {
-#define DIRECTION_CLIENT 0x00
-#define DIRECTION_SERVER 0x80
-  const CipByte kDirectionMask = 0x80;
-  const CipByte kDirection = kDirectionMask &
-                             forward_open_data->transport_class_and_trigger;
-
-  CipConnectionObjectTransportClassTriggerDirection direction =
-    kCipConnectionObjectTransportClassTriggerDirectionClient;
-
-  switch(kDirection) {
-    case DIRECTION_CLIENT: direction =
-      kCipConnectionObjectTransportClassTriggerDirectionClient; break;
-    case DIRECTION_SERVER: direction =
-      kCipConnectionObjectTransportClassTriggerDirectionServer; break;
-  }
-
-  return direction;
-#undef DIRECTION_CLIENT
-#undef DIRECTION_SERVER
-}
-
-CipConnectionObjectTransportClassTriggerProductionTrigger
-CipForwardOpenGetTransportClassTriggerProductionTrigger(
-  CipForwardOpenData *forward_open_data) {
-#define PRODUCTION_TRIGGER_CYCLIC 0x00
-#define PRODUCTION_TRIGGER_CHANGE_OF_STATE 0x10
-#define PRODUCTION_TRIGGER_APPLICATION_OBJECT 0x20
-
-  const CipByte kProductionTriggerMask = 0x70;
-  const CipByte kProductionTrigger = kProductionTriggerMask &
-                                     forward_open_data->
-                                     transport_class_and_trigger;
-  CipConnectionObjectTransportClassTriggerProductionTrigger trigger =
-    kCipConnectionObjectTransportClassTriggerProductionTriggerInvalid;
-
-  switch(kProductionTrigger) {
-    case PRODUCTION_TRIGGER_CYCLIC: trigger =
-      kCipConnectionObjectTransportClassTriggerProductionTriggerCyclic;
-      break;
-    case PRODUCTION_TRIGGER_CHANGE_OF_STATE: trigger =
-      kCipConnectionObjectTransportClassTriggerProductionTriggerChangeOfState;
-      break;
-    case PRODUCTION_TRIGGER_APPLICATION_OBJECT: trigger =
-      kCipConnectionObjectTransportClassTriggerProductionTriggerApplicationObject;
-      break;
-    default: trigger =
-      kCipConnectionObjectTransportClassTriggerProductionTriggerInvalid;
-      break;
-  }
-
-  return trigger;
-
-#undef PRODUCTION_TRIGGER_CYCLIC
-#undef PRODUCTION_TRIGGER_CHANGE_OF_STATE
-#undef PRODUCTION_TRIGGER_APPLICATION_OBJECT
-}
-
-CipConnectionObjectTransportClassTriggerClass
-CipForwardOpenGetTransportClassTriggerClass(
-  CipForwardOpenData *forward_open_data) {
-#define TRANSPORT_CLASS_0 0x00
-#define TRANSPORT_CLASS_1 0x01
-#define TRANSPORT_CLASS_2 0x02
-#define TRANSPORT_CLASS_3 0x03
-  const CipByte kTransportClassMask = 0x0F;
-  const CipByte kTransportClass = kTransportClassMask &
-                                  forward_open_data->transport_class_and_trigger;
-
-  CipConnectionObjectTransportClassTriggerClass transport_class =
-    kCipConnectionObjectTransportClassTriggerClass0;
-  switch(kTransportClass) {
-    case TRANSPORT_CLASS_0: transport_class =
-      kCipConnectionObjectTransportClassTriggerClass0; break;
-    case TRANSPORT_CLASS_1: transport_class =
-      kCipConnectionObjectTransportClassTriggerClass1; break;
-    case TRANSPORT_CLASS_2: transport_class =
-      kCipConnectionObjectTransportClassTriggerClass2; break;
-    case TRANSPORT_CLASS_3: transport_class =
-      kCipConnectionObjectTransportClassTriggerClass3; break;
-  }
-
-  return transport_class;
-
-#undef TRANSPORT_CLASS_0
-#undef TRANSPORT_CLASS_1
-#undef TRANSPORT_CLASS_2
-#undef TRANSPORT_CLASS_3
-}
-
-CipUsint CipForwardOpenGetConnectionPathSizeInWords(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->connection_path_size;
-}
-
-const CipOctet *CipForwardOpenGetConnectionPath(
-  CipForwardOpenData *forward_open_data) {
-  return forward_open_data->connection_path;
-}

+ 0 - 145
source/src/cip/connectionmanager/cipforwardopen.h

@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
-
-#ifndef SRC_CIP_CONNECTIONMANAGER_CIPFORWARDOPEN_H_
-#define SRC_CIP_CONNECTIONMANAGER_CIPFORWARDOPEN_H_
-
-#include <stdbool.h>
-#include <stddef.h>
-
-#include "typedefs.h"
-#include "cipconnectionobject.h"
-
-typedef struct cip_forward_open_data CipForwardOpenData;
-extern const size_t kCipForwardOpenDataSize;
-
-typedef enum cip_forward_open_priority_tick_time {
-  kCipForwardOpenPriorityTickTimeNormal,
-  kCipForwardOpenPriorityTickTimeReserved
-} CipForwardOpenPriorityTickTime;
-
-/**
- * @brief Connection Type constants of the Forward Open service request
- *   Indicates either a
- * - Null Request
- * - Point-to-point connection request (unicast)
- * - Multicast connection request
- */
-typedef enum cip_forward_open_connection_type {
-  kCipForwardOpenConnectionTypeNull,
-  kCipForwardOpenConnectionTypePointToPointConnection,
-  kCipForwardOpenConnectionTypeMulticastConnection,
-  kCipForwardOpenConnectionTypeReserved  /**< Reserved and therefore invalid type */
-} CipForwardOpenConnectionType;
-
-typedef enum cip_forward_open_connection_priority {
-  kCipForwardOpenConnectionPriorityLow,
-  kCipForwardOpenConnectionPriorityHigh,
-  kCipForwardOpenConnectionPriorityScheduled,
-  kCipForwardOpenConnectionPriorityUrgent
-} CipForwardOpenConnectionPriority;
-
-typedef enum cip_forward_open_connection_size_type {
-  kCipForwardOpenConnectionSizeTypeFixed,
-  kCipForwardOpenConnectionSizeTypeVariable
-} CipForwardOpenConnectionSizeType;
-
-const CipOctet *CipForwardOpenGetForwardOpenDataFromMessage(
-  CipForwardOpenData *const data, const CipOctet **const message);
-
-CipForwardOpenPriorityTickTime CipForwardOpenGetPriorityTickTime(
-  CipForwardOpenData *forward_open_data);
-
-uint8_t CipForwardOpenGetTickTime(CipForwardOpenData *forward_open_data);
-
-CipUsint CipForwardOpenGetTimeoutTick(CipForwardOpenData *forward_open_data);
-
-MilliSeconds CipForwardOpenGetTimeoutInMilliseconds(
-  CipForwardOpenData *forward_open_data);
-
-CipUdint CipForwardOpenGetOriginatorToTargetNetworkConnectionId(
-  CipForwardOpenData *forward_open_data);
-
-CipUdint CipForwardOpenGetTargetToOriginatorNetworkConnectionId(
-  CipForwardOpenData *forward_open_data);
-
-CipUint CipForwardOpenGetConnectionSerialNumber(
-  CipForwardOpenData *forward_open_data);
-
-CipUint CipForwardOpenGetOriginatorVendorId(
-  CipForwardOpenData *forward_open_data);
-
-CipUdint CipForwardOpenGetOriginatorSerialNumber(
-  CipForwardOpenData *forward_open_data);
-
-uint16_t CipForwardOpenGetTimeoutMultiplier(
-  CipForwardOpenData *forward_open_data);
-
-MicroSeconds CipForwardOpenGetOriginatorToTargetRequestedPacketInterval(
-  CipForwardOpenData *forward_open_data);
-
-CipWord CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-  CipForwardOpenData *forward_open_data);
-
-bool CipForwardOpenGetOriginatorToTargetRedundantOwner(
-  CipForwardOpenData *forward_open_data);
-
-CipForwardOpenConnectionType CipForwardOpenGetOriginatorToTargetConnectionType(
-  CipForwardOpenData *forward_open_data);
-
-CipForwardOpenConnectionPriority
-CipForwardOpenGetOriginatorToTargetConnectionPriority(
-  CipForwardOpenData *forward_open_data);
-
-CipForwardOpenConnectionSizeType
-CipForwardOpenGetOriginatorToTargetConnectionSizeType(
-  CipForwardOpenData *forward_open_data);
-
-uint16_t CipForwardOpenGetOriginatorToTargetConnectionSize(
-  CipForwardOpenData *forward_open_data);
-
-MicroSeconds CipForwardOpenGetTargetToOriginatorRequestedPacketInterval(
-  CipForwardOpenData *forward_open_data);
-
-CipWord CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-  CipForwardOpenData *forward_open_data);
-
-bool CipForwardOpenGetTargetToOriginatorRedundantOwner(
-  CipForwardOpenData *forward_open_data);
-
-CipForwardOpenConnectionType CipForwardOpenGetTargetToOriginatorConnectionType(
-  CipForwardOpenData *forward_open_data);
-
-CipForwardOpenConnectionPriority
-CipForwardOpenGetTargetToOriginatorConnectionPriority(
-  CipForwardOpenData *forward_open_data);
-
-CipForwardOpenConnectionSizeType
-CipForwardOpenGetTargetToOriginatorConnectionSizeType(
-  CipForwardOpenData *forward_open_data);
-
-uint16_t CipForwardOpenGetTargetToOriginatorConnectionSize(
-  CipForwardOpenData *forward_open_data);
-
-CipConnectionObjectTransportClassTriggerDirection
-CipForwardOpenGetTransportClassTriggerDirection(
-  CipForwardOpenData *forward_open_data);
-
-CipConnectionObjectTransportClassTriggerProductionTrigger
-CipForwardOpenGetTransportClassTriggerProductionTrigger(
-  CipForwardOpenData *forward_open_data);
-
-CipConnectionObjectTransportClassTriggerClass
-CipForwardOpenGetTransportClassTriggerClass(
-  CipForwardOpenData *forward_open_data);
-
-CipUsint CipForwardOpenGetConnectionPathSizeInWords(
-  CipForwardOpenData *forward_open_data);
-
-const CipOctet *CipForwardOpenGetConnectionPath(
-  CipForwardOpenData *forward_open_data);
-
-#endif /* SRC_CIP_CONNECTIONMANAGER_CIPFORWARDOPEN_H_ */

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

@@ -24,7 +24,7 @@ CipCommonPacketFormatData g_common_packet_format_data_item; /**< CPF global data
 
 int NotifyCommonPacketFormat(EncapsulationData *const receive_data,
                              EipUint8 *reply_buffer,
-                             in_addr_t originator_address) {
+                             struct sockaddr *originator_address) {
   int return_value = kEipStatusError;
 
   if ( ( return_value = CreateCommonPacketFormatStructure(
@@ -65,7 +65,7 @@ int NotifyCommonPacketFormat(EncapsulationData *const receive_data,
 
 int NotifyConnectedCommonPacketFormat(EncapsulationData *received_data,
                                       EipUint8 *reply_buffer,
-                                      in_addr_t originator_address) {
+                                      struct sockaddr *originator_address) {
 
   int return_value = CreateCommonPacketFormatStructure(
     received_data->current_communication_buffer_position,

+ 2 - 2
source/src/enet_encap/cpf.h

@@ -81,7 +81,7 @@ typedef struct {
  */
 int NotifyCommonPacketFormat(EncapsulationData *const received_data,
                              EipUint8 *const reply_buffer,
-                             in_addr_t originator_address);
+                             struct sockaddr *originator_address);
 
 /** @ingroup ENCAP
  * Parse the CPF data from a received connected explicit message, check
@@ -94,7 +94,7 @@ int NotifyCommonPacketFormat(EncapsulationData *const received_data,
  */
 int NotifyConnectedCommonPacketFormat(EncapsulationData *received_data,
                                       EipUint8 *reply_buffer,
-                                      in_addr_t originator_address);
+                                      struct sockaddr *originator_address);
 
 /** @ingroup ENCAP
  *  Create CPF structure out of the received data.

+ 6 - 5
source/src/enet_encap/encap.c

@@ -105,10 +105,10 @@ EipStatus HandleReceivedUnregisterSessionCommand(
   EncapsulationData *receive_data);
 
 EipStatus HandleReceivedSendUnitDataCommand(EncapsulationData *receive_data,
-                                            in_addr_t originator_address);
+                                            struct sockaddr *originator_address);
 
 EipStatus HandleReceivedSendRequestResponseDataCommand(
-  EncapsulationData *receive_data, in_addr_t originator_address);
+  EncapsulationData *receive_data, struct sockaddr *originator_address);
 
 int GetFreeSessionIndex(void);
 
@@ -158,7 +158,7 @@ int HandleReceivedExplictTcpData(int socket,
                                  EipUint8 *buffer,
                                  unsigned int length,
                                  int *remaining_bytes,
-                                 in_addr_t originator_address) {
+                                 struct sockaddr *originator_address) {
   EipStatus return_value = kEipStatusOk;
   EncapsulationData encapsulation_data;
   /* eat the encapsulation header*/
@@ -505,7 +505,8 @@ EipStatus HandleReceivedUnregisterSessionCommand(
  *  @param receive_data Pointer to structure with data and header information.
  */
 EipStatus HandleReceivedSendUnitDataCommand(EncapsulationData *receive_data,
-                                            in_addr_t originator_address) {
+                                            struct sockaddr *originator_address)
+{
   EipInt16 send_size;
   EipStatus return_value = kEipStatusOkSend;
 
@@ -545,7 +546,7 @@ EipStatus HandleReceivedSendUnitDataCommand(EncapsulationData *receive_data,
  *                                      -1 .. error
  */
 EipStatus HandleReceivedSendRequestResponseDataCommand(
-  EncapsulationData *receive_data, in_addr_t originator_address) {
+  EncapsulationData *receive_data, struct sockaddr *originator_address) {
   EipInt16 send_size = 0;
   EipStatus return_value = kEipStatusOkSend;
 

+ 1 - 1
source/src/opener_api.h

@@ -421,7 +421,7 @@ int HandleReceivedExplictTcpData(int socket,
                                  EipUint8 *buffer,
                                  unsigned int buffer_length,
                                  int *number_of_remaining_bytes,
-                                 in_addr_t originator_address);
+                                 struct sockaddr *originator_address);
 
 /** @ingroup CIP_API
  * @brief Notify the encapsulation layer that an explicit message has been

+ 11 - 4
source/src/ports/POSIX/networkhandler.c

@@ -6,6 +6,7 @@
 #include <unistd.h>
 #include <sys/time.h>
 #include <time.h>
+#include <fcntl.h>
 
 #include "networkhandler.h"
 
@@ -15,7 +16,8 @@ MicroSeconds GetMicroSeconds(void) {
   struct timespec now;
 
   clock_gettime( CLOCK_MONOTONIC, &now );
-  MicroSeconds micro_seconds =  (MicroSeconds)now.tv_nsec / 1000ULL + now.tv_sec * 1000000ULL;
+  MicroSeconds micro_seconds =  (MicroSeconds)now.tv_nsec / 1000ULL +
+                               now.tv_sec * 1000000ULL;
   return micro_seconds;
 }
 
@@ -28,8 +30,13 @@ EipStatus NetworkHandlerInitializePlatform(void) {
   return kEipStatusOk;
 }
 
-
 void CloseSocketPlatform(int socket_handle) {
-    shutdown(socket_handle, SHUT_RDWR);
-    close(socket_handle);
+  shutdown(socket_handle, SHUT_RDWR);
+  close(socket_handle);
+}
+
+int SetSocketToNonBlocking(int socket_handle) {
+  return fcntl(socket_handle, F_SETFL, fcntl(socket_handle,
+                                             F_GETFL,
+                                             0) | O_NONBLOCK);
 }

+ 2 - 0
source/src/ports/POSIX/networkhandler.h

@@ -23,6 +23,8 @@ EipStatus NetworkHandlerInitializePlatform(void);
  */
 void CloseSocketPlatform(int socket_handle);
 
+int SetSocketToNonBlocking(int socket_handle);
+
 /** @brief This function shall return the current time in microseconds relative to epoch, and shall be implemented in a port specific networkhandler
  *
  *  @return Current time relative to epoch as MicroSeconds

+ 7 - 2
source/src/ports/WIN32/networkhandler.c

@@ -24,7 +24,7 @@ MicroSeconds getMicroSeconds() {
   QueryPerformanceFrequency(&performance_frequency);
 
   return (MicroSeconds) (performance_counter.QuadPart * 1000000LL
-      / performance_frequency.QuadPart);
+                         / performance_frequency.QuadPart);
 }
 
 MilliSeconds GetMilliSeconds(void) {
@@ -42,5 +42,10 @@ EipStatus NetworkHandlerInitializePlatform(void) {
 }
 
 void CloseSocketPlatform(int socket_handle) {
-    closesocket(socket_handle);
+  closesocket(socket_handle);
+}
+
+int SetSocketToNonBlocking(int socket_handle) {
+  u_long iMode = 0;
+  ioctlsocket(m_socket, FIONBIO, &iMode);
 }

+ 6 - 0
source/src/ports/WIN32/networkhandler.h

@@ -12,8 +12,14 @@ typedef unsigned long socklen_t;
 
 EipStatus NetworkHandlerInitializePlatform(void);
 
+/** @brief Platform dependent code to close a socket
+ *
+ *  @param socket_handle The socket handle to be closed
+ */
 void CloseSocketPlatform(int socket_handle);
 
+int SetSocketToNonBlocking(int socket_handle);
+
 /** @brief This function shall return the current time in microseconds relative to epoch, and shall be implemented in a port specific networkhandler
  *
  *  @return Current time relative to epoch as MicroSeconds

+ 15 - 23
source/src/ports/generic_networkhandler.c

@@ -14,7 +14,6 @@
 #include <assert.h>
 #include <stdbool.h>
 #include <unistd.h>
-#include <fcntl.h>
 
 #include "generic_networkhandler.h"
 
@@ -88,6 +87,8 @@ EipStatus NetworkHandlerInitialize(void) {
     return kEipStatusError;
   }
 
+  int status = SetSocketToNonBlocking(g_network_status.tcp_listener);
+
   /* create a new UDP socket */
   if ( ( g_network_status.udp_global_broadcast_listener = socket(AF_INET,
                                                                  SOCK_DGRAM,
@@ -123,6 +124,9 @@ EipStatus NetworkHandlerInitialize(void) {
     return kEipStatusError;
   }
 
+  status =
+    SetSocketToNonBlocking(g_network_status.udp_global_broadcast_listener);
+
   /* Activates address reuse */
   if (setsockopt( g_network_status.udp_unicast_listener, SOL_SOCKET,
                   SO_REUSEADDR, (char *) &set_socket_option_value,
@@ -132,6 +136,8 @@ EipStatus NetworkHandlerInitialize(void) {
     return kEipStatusError;
   }
 
+  status = SetSocketToNonBlocking(g_network_status.udp_unicast_listener);
+
   struct sockaddr_in my_address = { .sin_family = AF_INET, .sin_port = htons(
                                       kOpenerEthernetPort),
                                     .sin_addr.s_addr = interface_configuration_
@@ -499,22 +505,10 @@ EipStatus HandleDataOnTcpSocket(int socket) {
      the fastest way and a loop here with a non blocking socket would better
      fit*/
 
-  struct timeval timeout = {
-    .tv_sec = 0,
-    .tv_usec = 10000
-  };
-
-  setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
-              sizeof(struct timeval) );
   /*Check how many data is here -- read the first four bytes from the connection */
   long number_of_read_bytes = recv(socket, g_ethernet_communication_buffer, 4,
                                    0); /*TODO we may have to set the socket to a non blocking socket */
 
-//  OPENER_TRACE_INFO("from IPv4 address %s\n",
-//                  inet_ntop(AF_INET,
-//                      &((struct sockaddr_in *)&addr)->sin_addr,
-//                      ipstr, sizeof ipstr));
-
   if (number_of_read_bytes == 0) {
     int error_code = GetSocketErrorNumber();
     char *error_message = GetErrorMessage(error_code);
@@ -611,19 +605,14 @@ EipStatus HandleDataOnTcpSocket(int socket) {
 
     g_current_active_tcp_socket = socket;
 
-    struct sockaddr_in addr;
-    memset( &addr, 0, sizeof(addr) );
-    socklen_t fromlen = sizeof(addr);
-    getpeername(socket, (struct sockaddr *)&addr, &fromlen);
-    char ipstr[INET6_ADDRSTRLEN];
-    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
-    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
-
-    OPENER_TRACE_INFO("Peer IP address: %s\n", ipstr);
+    struct sockaddr sender_address;
+    memset( &sender_address, 0, sizeof(sender_address) );
+    socklen_t fromlen = sizeof(sender_address);
+    getpeername(socket, (struct sockaddr *)&sender_address, &fromlen);
 
     number_of_read_bytes = HandleReceivedExplictTcpData(
       socket, g_ethernet_communication_buffer, data_size, &remaining_bytes,
-      ( (struct sockaddr_in *)&addr )->sin_addr.s_addr);
+      &sender_address);
 
     g_current_active_tcp_socket = -1;
 
@@ -680,6 +669,9 @@ int CreateUdpSocket(UdpCommuncationDirection communication_direction,
     return kEipInvalidSocket;
   }
 
+  int status = SetSocketToNonBlocking(new_socket);
+
+
   OPENER_TRACE_INFO("networkhandler: UDP socket %d\n", new_socket);
 
   /* check if it is sending or receiving */

+ 0 - 1
source/tests/CMakeLists.txt

@@ -25,7 +25,6 @@ target_link_libraries( OpENer_Tests gcov ${CPPUTEST_LIBRARY} ${CPPUTESTEXT_LIBRA
 target_link_libraries( OpENer_Tests UtilsTest Utils ) 
 target_link_libraries( OpENer_Tests EthernetEncapsulationTest ENET_ENCAP )
 target_link_libraries( OpENer_Tests CipTest CIP )
-target_link_libraries( OpENer_Tests CipConnectionManagerTest CIP_CONNECTION_MANAGER )
 
 ########################################
 # Adds test to CTest environment       #

+ 0 - 2
source/tests/OpENerTests.h

@@ -5,5 +5,3 @@ IMPORT_TEST_GROUP(XorShiftRandom);
 IMPORT_TEST_GROUP(EndianConversion);
 IMPORT_TEST_GROUP(CipEpath);
 IMPORT_TEST_GROUP(CipElectronicKey);
-IMPORT_TEST_GROUP(CipConnectionObject);
-IMPORT_TEST_GROUP(CipForwardOpen);

+ 1 - 3
source/tests/cip/CMakeLists.txt

@@ -1,9 +1,7 @@
 
 opener_common_includes()
 
-add_subdirectory( connectionmanager )
-
-set( CipTestSrc cipepathtest.cpp cipelectronickeytest.cpp cipconnectionobjecttest.cpp )
+set( CipTestSrc cipepathtest.cpp cipelectronickeytest.cpp )
 
 include_directories( ${SRC_DIR}/cip )
 

+ 0 - 19
source/tests/cip/cipconnectionobjecttest.cpp

@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
-
-#include <CppUTest/TestHarness.h>
-#include <stdint.h>
-#include <string.h>
-
-extern "C" {
-
-#include "cipconnectionobject.h"
-
-}
-
-TEST_GROUP(CipConnectionObject) {
-
-};

+ 0 - 10
source/tests/cip/connectionmanager/CMakeLists.txt

@@ -1,10 +0,0 @@
-
-opener_common_includes()
-
-set( CipConnectionManagerTestSrc cipforwardopentest.cpp )
-
-include_directories( ${SRC_DIR}/cip ${SRC_DIR}/cip/connectionmanager )
-
-add_library( CipConnectionManagerTest ${CipConnectionManagerTestSrc} )
-
-target_link_libraries( CipConnectionManagerTest gcov ${CPPUTEST_LIBRARY} ${CPPUTESTEXT_LIBRARY} )

+ 0 - 101
source/tests/cip/connectionmanager/cipforwardopentest.cpp

@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
-
-#include <CppUTest/TestHarness.h>
-#include <stdint.h>
-#include <string.h>
-
-extern "C" {
-
-#include "cipforwardopen.h"
-
-}
-
-TEST_GROUP(CipForwardOpen) {
-
-};
-
-CipOctet message[] =
-{ 0x06, 0x28, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x26, 0x00, 0x18,
-  0x00, 0x78,
-  0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x62, 0x02, 0x00, 0xff, 0x43,
-  0x5a, 0x62,
-  0x02, 0x00, 0xff, 0x43, 0xa3, 0x02, 0x20, 0x02, 0x24, 0x01};
-
-TEST(CipForwardOpen, ParseMessage) {
-  CipOctet *array_address = message;
-  CipOctet **message_runner = &array_address;
-
-  CipForwardOpenData *forward_open_data;
-  forward_open_data = (CipForwardOpenData *)calloc(1, kCipForwardOpenDataSize);
-  CipForwardOpenGetForwardOpenDataFromMessage(forward_open_data,
-                                              (const CipOctet **)message_runner);
-  CHECK_EQUAL( kCipForwardOpenPriorityTickTimeNormal, CipForwardOpenGetPriorityTickTime(
-                 forward_open_data) );
-  CHECK_EQUAL( 6, CipForwardOpenGetTickTime(forward_open_data) );
-  CHECK_EQUAL( 40, CipForwardOpenGetTimeoutTick(forward_open_data) );
-  CHECK_EQUAL( 2560,
-               CipForwardOpenGetTimeoutInMilliseconds(forward_open_data) );
-  CHECK_EQUAL( 0x00000000, CipForwardOpenGetOriginatorToTargetNetworkConnectionId(
-                 forward_open_data) );
-  CHECK_EQUAL( 0x00000026, CipForwardOpenGetTargetToOriginatorNetworkConnectionId(
-                 forward_open_data) );
-  CHECK_EQUAL( 0x0026, CipForwardOpenGetConnectionSerialNumber(
-                 forward_open_data) );
-  CHECK_EQUAL( 0x0018, CipForwardOpenGetOriginatorVendorId(forward_open_data) );
-  CHECK_EQUAL( 0x12345678,
-               CipForwardOpenGetOriginatorSerialNumber(forward_open_data) );
-  CHECK_EQUAL( 4, CipForwardOpenGetTimeoutMultiplier(forward_open_data) );
-
-  CHECK_EQUAL( 156250, CipForwardOpenGetOriginatorToTargetRequestedPacketInterval(
-                 forward_open_data) );
-  CHECK_EQUAL( 0x43ff, CipForwardOpenGetOriginatorToTargetNetworkConnectionParameters(
-                 forward_open_data) );
-  CHECK_EQUAL( false,
-               CipForwardOpenGetOriginatorToTargetRedundantOwner(
-                 forward_open_data) );
-  CHECK_EQUAL( kCipForwardOpenConnectionTypePointToPointConnection, CipForwardOpenGetOriginatorToTargetConnectionType(
-                 forward_open_data) );
-  CHECK_EQUAL( kCipForwardOpenConnectionPriorityLow, CipForwardOpenGetOriginatorToTargetConnectionPriority(
-                 forward_open_data) );
-  CHECK_EQUAL( kCipForwardOpenConnectionSizeTypeVariable, CipForwardOpenGetOriginatorToTargetConnectionSizeType(
-                 forward_open_data) );
-  CHECK_EQUAL( 511,
-               CipForwardOpenGetOriginatorToTargetConnectionSize(
-                 forward_open_data) );
-
-  CHECK_EQUAL( 156250, CipForwardOpenGetTargetToOriginatorRequestedPacketInterval(
-                 forward_open_data) );
-  CHECK_EQUAL( 0x43ff, CipForwardOpenGetTargetToOriginatorNetworkConnectionParameters(
-                 forward_open_data) );
-  CHECK_EQUAL( false,
-               CipForwardOpenGetTargetToOriginatorRedundantOwner(
-                 forward_open_data) );
-  CHECK_EQUAL( kCipForwardOpenConnectionTypePointToPointConnection, CipForwardOpenGetTargetToOriginatorConnectionType(
-                 forward_open_data) );
-  CHECK_EQUAL( kCipForwardOpenConnectionPriorityLow, CipForwardOpenGetTargetToOriginatorConnectionPriority(
-                 forward_open_data) );
-  CHECK_EQUAL( kCipForwardOpenConnectionSizeTypeVariable, CipForwardOpenGetTargetToOriginatorConnectionSizeType(
-                 forward_open_data) );
-  CHECK_EQUAL( 511,
-               CipForwardOpenGetTargetToOriginatorConnectionSize(
-                 forward_open_data) );
-
-  CHECK_EQUAL( kCipConnectionObjectTransportClassTriggerDirectionServer, CipForwardOpenGetTransportClassTriggerDirection(
-                 forward_open_data) );
-  CHECK_EQUAL(
-    kCipConnectionObjectTransportClassTriggerProductionTriggerApplicationObject,
-    CipForwardOpenGetTransportClassTriggerProductionTrigger(forward_open_data) );
-  CHECK_EQUAL( kCipConnectionObjectTransportClassTriggerClass3, CipForwardOpenGetTransportClassTriggerClass(
-                 forward_open_data) );
-  CHECK_EQUAL( 2,
-               CipForwardOpenGetConnectionPathSizeInWords(forward_open_data) );
-
-  const CipOctet expected_connection_path[] = {0x20, 0x02, 0x24, 0x01};
-  MEMCMP_EQUAL(expected_connection_path,
-               CipForwardOpenGetConnectionPath(forward_open_data), 4);
-  free(forward_open_data);
-}