Explorar o código

InsertAttribute param update (decode added to attribute struct)

micsat %!s(int64=5) %!d(string=hai) anos
pai
achega
791b3fa2c6

+ 17 - 34
source/src/cip/cipassembly.c

@@ -62,25 +62,18 @@ CipClass *CreateAssemblyClass(void) {
                                             "assembly", /* name */
                                             "assembly", /* name */
                                             2, /* Revision, according to the CIP spec currently this has to be 2 */
                                             2, /* Revision, according to the CIP spec currently this has to be 2 */
                                             NULL); /* # function pointer for initialization*/
                                             NULL); /* # function pointer for initialization*/
-  if(NULL != assembly_class) {
-    InsertService(assembly_class,
-                  kGetAttributeSingle,
-                  &GetAttributeSingle,
-                  "GetAttributeSingle");
-
-//    InsertService(assembly_class,
-//                  kSetAttributeSingle,
-//                  &SetAssemblyAttributeSingle,
-//                  "SetAssemblyAttributeSingle");
-
-    InsertService(assembly_class,						//TODO: used for testing, remove
-                      kSetAttributeSingle,
-                      &SetAttributeSingle,
-                      "SetAttributeSingle");
-
-    InsertGetSetCallback(assembly_class, AssemblyPreGetCallback, kPreGetFunc);
-    InsertGetSetCallback(assembly_class, AssemblyPostSetCallback, kPostSetFunc);
-  }
+	if (NULL != assembly_class) {
+		InsertService(assembly_class, kGetAttributeSingle, &GetAttributeSingle,
+				"GetAttributeSingle");
+
+		InsertService(assembly_class, kSetAttributeSingle, &SetAttributeSingle,
+				"SetAttributeSingle");
+
+		InsertGetSetCallback(assembly_class, AssemblyPreGetCallback,
+				kPreGetFunc);
+		InsertGetSetCallback(assembly_class, AssemblyPostSetCallback,
+				kPostSetFunc);
+	}
 
 
   return assembly_class;
   return assembly_class;
 }
 }
@@ -130,13 +123,8 @@ CipInstance *CreateAssemblyObject(const EipUint32 instance_id,
 
 
   assembly_byte_array->length = data_length;
   assembly_byte_array->length = data_length;
   assembly_byte_array->data = data;
   assembly_byte_array->data = data;
-//  InsertAttribute(instance,
-//                  3,
-//                  kCipByteArray,
-//                  EncodeCipByteArray,
-//                  assembly_byte_array,
-//                  kSetAndGetAble | kPreGetFunc | kPostSetFunc);
-  InsertAttribute2(instance,
+
+  InsertAttribute(instance,
                    3,
                    3,
                    kCipByteArray,
                    kCipByteArray,
                    EncodeCipByteArray,
                    EncodeCipByteArray,
@@ -144,17 +132,12 @@ CipInstance *CreateAssemblyObject(const EipUint32 instance_id,
                    assembly_byte_array,
                    assembly_byte_array,
                    kSetAndGetAble | kPreGetFunc | kPostSetFunc);
                    kSetAndGetAble | kPreGetFunc | kPostSetFunc);
   /* Attribute 4 Number of bytes in Attribute 3 */
   /* Attribute 4 Number of bytes in Attribute 3 */
-//  InsertAttribute(instance,
-//                  4,
-//                  kCipUint,
-//                  EncodeCipUint,
-//                  &(assembly_byte_array->length),
-//                  kGetableSingle);
-  InsertAttribute2(instance,
+
+  InsertAttribute(instance,
                     4,
                     4,
                     kCipUint,
                     kCipUint,
                     EncodeCipUint,
                     EncodeCipUint,
-					DecodeCipUint,
+					NULL,
                     &(assembly_byte_array->length),
                     &(assembly_byte_array->length),
                     kGetableSingle);
                     kGetableSingle);
 
 

+ 18 - 65
source/src/cip/cipcommon.c

@@ -285,24 +285,24 @@ CipClass *CreateCipClass(const CipUdint class_code,
   AllocateAttributeMasks(cip_class); /* Allocation of bitmasks for Instance Attributes */
   AllocateAttributeMasks(cip_class); /* Allocation of bitmasks for Instance Attributes */
 
 
   if(NULL == initializer) {
   if(NULL == initializer) {
-    InsertAttribute( (CipInstance *) cip_class, 1, kCipUint, EncodeCipUint,
-                     (void *) &cip_class->revision, kGetableSingleAndAll );                                                /* revision */
-    InsertAttribute( (CipInstance *) cip_class, 2, kCipUint, EncodeCipUint,
-                     (void *) &cip_class->number_of_instances,
-                     kGetableSingleAndAll );                                                                                          /* #2 Max instance no. */
-    InsertAttribute( (CipInstance *) cip_class, 3, kCipUint, EncodeCipUint,
-                     (void *) &cip_class->number_of_instances,
-                     kGetableSingleAndAll );                                                                                          /* number of instances currently existing*/
-    InsertAttribute( (CipInstance *) cip_class, 4, kCipUint, EncodeCipUint,
-                     (void *) &kCipUintZero, kGetableAllDummy );                                                /* optional attribute list - default = 0 */
-    InsertAttribute( (CipInstance *) cip_class, 5, kCipUint, EncodeCipUint,
-                     (void *) &kCipUintZero, kNotSetOrGetable );                                                /* optional service list - default = 0 */
-    InsertAttribute( (CipInstance *) cip_class, 6, kCipUint, EncodeCipUint,
-                     (void *) &meta_class->highest_attribute_number,
-                     kGetableSingle );                                                                                                /* max class attribute number*/
-    InsertAttribute( (CipInstance *) cip_class, 7, kCipUint, EncodeCipUint,
-                     (void *) &cip_class->highest_attribute_number,
-                     kGetableSingle );                                                                                               /* max instance attribute number*/
+	InsertAttribute((CipInstance*) cip_class, 1, kCipUint, EncodeCipUint,
+			NULL, (void*) &cip_class->revision, kGetableSingleAndAll); 			/* revision */
+	InsertAttribute((CipInstance*) cip_class, 2, kCipUint, EncodeCipUint,
+			NULL, (void*) &cip_class->number_of_instances,
+			kGetableSingleAndAll); 												/* #2 Max instance no. */
+	InsertAttribute((CipInstance*) cip_class, 3, kCipUint, EncodeCipUint,
+			NULL, (void*) &cip_class->number_of_instances,
+			kGetableSingleAndAll); 												/* number of instances currently existing*/
+	InsertAttribute((CipInstance*) cip_class, 4, kCipUint, EncodeCipUint,
+			NULL, (void*) &kCipUintZero, kGetableAllDummy); 					/* optional attribute list - default = 0 */
+	InsertAttribute((CipInstance*) cip_class, 5, kCipUint, EncodeCipUint,
+			NULL, (void*) &kCipUintZero, kNotSetOrGetable); 					/* optional service list - default = 0 */
+	InsertAttribute((CipInstance*) cip_class, 6, kCipUint, EncodeCipUint,
+			NULL, (void*) &meta_class->highest_attribute_number,
+			kGetableSingle); 													/* max class attribute number*/
+	InsertAttribute((CipInstance*) cip_class, 7, kCipUint, EncodeCipUint,
+			NULL, (void*) &cip_class->highest_attribute_number,
+			kGetableSingle);                                                     /* max instance attribute number*/
     if(number_of_class_services > 0) {
     if(number_of_class_services > 0) {
       if(number_of_class_services > 1) { /*only if the mask has values add the get_attribute_all service */
       if(number_of_class_services > 1) { /*only if the mask has values add the get_attribute_all service */
         InsertService(meta_class,
         InsertService(meta_class,
@@ -324,53 +324,6 @@ CipClass *CreateCipClass(const CipUdint class_code,
 }
 }
 
 
 void InsertAttribute(CipInstance *const instance,
 void InsertAttribute(CipInstance *const instance,
-                     const EipUint16 attribute_number,
-                     const EipUint8 cip_type,
-                     CipAttributeEncodeInMessage encode_function,
-					 //CipAttributeDecodeInMessage decode_function, //TODO: add decode
-                     void *const data,
-                     const EipByte cip_flags) {
-
-  OPENER_ASSERT(NULL != data); /* Its not allowed to push a NULL pointer, as this marks an unused attribute struct */
-
-  CipAttributeStruct *attribute = instance->attributes;
-  CipClass *cip_class = instance->cip_class;
-
-  OPENER_ASSERT(NULL != attribute);
-/* adding a attribute to a class that was not declared to have any attributes is not allowed */
-  for(int i = 0; i < instance->cip_class->number_of_attributes; i++) {
-    if(attribute->data == NULL) { /* found non set attribute */
-      attribute->attribute_number = attribute_number;
-      attribute->type = cip_type;
-      attribute->encode = encode_function;
-      attribute->attribute_flags = cip_flags;
-      attribute->data = data;
-
-      OPENER_ASSERT(attribute_number <= cip_class->highest_attribute_number);
-
-      size_t index = CalculateIndex(attribute_number);
-
-      cip_class->get_single_bit_mask[index] |=
-        (cip_flags & kGetableSingle) ? 1 << (attribute_number) % 8 : 0;
-      cip_class->get_all_bit_mask[index] |=
-        (cip_flags & (kGetableAll | kGetableAllDummy) ) ? 1 <<
-        (attribute_number) % 8 : 0;
-      cip_class->set_bit_mask[index] |= ( (cip_flags & kSetable) ? 1 : 0 ) <<
-                                        ( (attribute_number) % 8 );
-
-      return;
-    }
-    attribute++;
-  } OPENER_TRACE_ERR(
-    "Tried to insert too many attributes into class: %" PRIu32 " '%s', instance %" PRIu32 "\n",
-    cip_class->class_code,
-    cip_class->class_name,
-    instance->instance_number);
-  OPENER_ASSERT(false);
-/* trying to insert too many attributes*/
-}
-
-void InsertAttribute2(CipInstance *const instance,     //TODO: used for testing, remove
                      const EipUint16 attribute_number,
                      const EipUint16 attribute_number,
                      const EipUint8 cip_type,
                      const EipUint8 cip_type,
                      CipAttributeEncodeInMessage encode_function,
                      CipAttributeEncodeInMessage encode_function,

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

@@ -181,20 +181,20 @@ void InitializeConnectionManager(CipClass *class) {
 
 
   CipClass *meta_class = class->class_instance.cip_class;
   CipClass *meta_class = class->class_instance.cip_class;
 
 
-  InsertAttribute( (CipInstance *) class, 1, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 1, kCipUint, EncodeCipUint, NULL,
                    (void *) &class->revision, kGetableSingleAndAll );                                                /* revision */
                    (void *) &class->revision, kGetableSingleAndAll );                                                /* revision */
-  InsertAttribute( (CipInstance *) class, 2, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 2, kCipUint, EncodeCipUint, NULL,
                    (void *) &class->number_of_instances, kGetableSingleAndAll );                                                /*  largest instance number */
                    (void *) &class->number_of_instances, kGetableSingleAndAll );                                                /*  largest instance number */
-  InsertAttribute( (CipInstance *) class, 3, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 3, kCipUint, EncodeCipUint, NULL,
                    (void *) &class->number_of_instances, kGetableSingle );                                                /* number of instances currently existing*/
                    (void *) &class->number_of_instances, kGetableSingle );                                                /* number of instances currently existing*/
-  InsertAttribute( (CipInstance *) class, 4, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 4, kCipUint, EncodeCipUint, NULL,
                    (void *) &kCipUintZero, kNotSetOrGetable );                                                /* optional attribute list - default = 0 */
                    (void *) &kCipUintZero, kNotSetOrGetable );                                                /* optional attribute list - default = 0 */
-  InsertAttribute( (CipInstance *) class, 5, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 5, kCipUint, EncodeCipUint, NULL,
                    (void *) &kCipUintZero, kNotSetOrGetable );                                                /* optional service list - default = 0 */
                    (void *) &kCipUintZero, kNotSetOrGetable );                                                /* optional service list - default = 0 */
-  InsertAttribute( (CipInstance *) class, 6, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 6, kCipUint, EncodeCipUint, NULL,
                    (void *) &meta_class->highest_attribute_number,
                    (void *) &meta_class->highest_attribute_number,
                    kGetableSingleAndAll );                                                                                                /* max class attribute number*/
                    kGetableSingleAndAll );                                                                                                /* max class attribute number*/
-  InsertAttribute( (CipInstance *) class, 7, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 7, kCipUint, EncodeCipUint, NULL,
                    (void *) &class->highest_attribute_number,
                    (void *) &class->highest_attribute_number,
                    kGetableSingleAndAll );                                                                                           /* max instance attribute number*/
                    kGetableSingleAndAll );                                                                                           /* max instance attribute number*/
 
 

+ 15 - 1
source/src/cip/cipdlr.c

@@ -143,45 +143,56 @@ EipStatus CipDlrInit(void) {
                   1,
                   1,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   &g_dlr.network_topology,
                   &g_dlr.network_topology,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   2,
                   2,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   &g_dlr.network_status,
                   &g_dlr.network_status,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   3,
                   3,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   (void *)&s_0xFF_default,
                   (void *)&s_0xFF_default,
                   kGetableAll);
                   kGetableAll);
-  InsertAttribute(dlr_instance,  4, kCipAny, EncodeCipRingSupervisorConfig,
+  InsertAttribute(dlr_instance,
+		  	  	  4,
+				  kCipAny,
+				  EncodeCipRingSupervisorConfig,
+				  NULL,
                   (void *)&s_0x00000000_default,
                   (void *)&s_0x00000000_default,
                   kGetableAllDummy);
                   kGetableAllDummy);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   5,
                   5,
                   kCipUint,
                   kCipUint,
                   EncodeCipUint,
                   EncodeCipUint,
+				  NULL,
                   (void *)&s_0x0000_default,
                   (void *)&s_0x0000_default,
                   kGetableAll);
                   kGetableAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   6,
                   6,
                   kCipAny,
                   kCipAny,
                   EncodeCipNodeAddress,
                   EncodeCipNodeAddress,
+				  NULL,
                   (void *)&s_zero_node,
                   (void *)&s_zero_node,
                   kGetableAll);
                   kGetableAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   7,
                   7,
                   kCipAny,
                   kCipAny,
                   EncodeCipNodeAddress,
                   EncodeCipNodeAddress,
+				  NULL,
                   (void *)&s_zero_node,
                   (void *)&s_zero_node,
                   kGetableAll);
                   kGetableAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   8,
                   8,
                   kCipUint,
                   kCipUint,
                   EncodeCipUint,
                   EncodeCipUint,
+				  NULL,
                   (void *)&s_0xFFFF_default,
                   (void *)&s_0xFFFF_default,
                   kGetableAll);
                   kGetableAll);
   /* Attribute #9 is not implemented and also NOT part of the GetAttributesAll
   /* Attribute #9 is not implemented and also NOT part of the GetAttributesAll
@@ -190,18 +201,21 @@ EipStatus CipDlrInit(void) {
                   10,
                   10,
                   kCipAny,
                   kCipAny,
                   EncodeCipNodeAddress,
                   EncodeCipNodeAddress,
+				  NULL,
                   &g_dlr.active_supervisor_address,
                   &g_dlr.active_supervisor_address,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   11,
                   11,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   (void *)&s_0x00_default,
                   (void *)&s_0x00_default,
                   kGetableAll);
                   kGetableAll);
   InsertAttribute(dlr_instance,
   InsertAttribute(dlr_instance,
                   12,
                   12,
                   kCipDword,
                   kCipDword,
                   EncodeCipDword,
                   EncodeCipDword,
+				  NULL,
                   &g_dlr.capability_flags,
                   &g_dlr.capability_flags,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
 
 

+ 12 - 3
source/src/cip/cipethernetlink.c

@@ -273,18 +273,21 @@ EipStatus CipEthernetLinkInit(void) {
                       1,
                       1,
                       kCipUdint,
                       kCipUdint,
                       EncodeCipUdint,
                       EncodeCipUdint,
+					  NULL,
                       &g_ethernet_link[idx].interface_speed,
                       &g_ethernet_link[idx].interface_speed,
                       kGetableSingleAndAll);
                       kGetableSingleAndAll);
       InsertAttribute(ethernet_link_instance,
       InsertAttribute(ethernet_link_instance,
                       2,
                       2,
                       kCipDword,
                       kCipDword,
                       EncodeCipDword,
                       EncodeCipDword,
+					  NULL,
                       &g_ethernet_link[idx].interface_flags,
                       &g_ethernet_link[idx].interface_flags,
                       kGetableSingleAndAll);
                       kGetableSingleAndAll);
       InsertAttribute(ethernet_link_instance,
       InsertAttribute(ethernet_link_instance,
                       3,
                       3,
                       kCip6Usint,
                       kCip6Usint,
                       EncodeCipEthernetLinkPhyisicalAddress,
                       EncodeCipEthernetLinkPhyisicalAddress,
+					  NULL,
                       &g_ethernet_link[idx].physical_address,
                       &g_ethernet_link[idx].physical_address,
                       kGetableSingleAndAll);
                       kGetableSingleAndAll);
 #if defined(OPENER_ETHLINK_CNTRS_ENABLE) && 0 != OPENER_ETHLINK_CNTRS_ENABLE
 #if defined(OPENER_ETHLINK_CNTRS_ENABLE) && 0 != OPENER_ETHLINK_CNTRS_ENABLE
@@ -292,6 +295,7 @@ EipStatus CipEthernetLinkInit(void) {
                       4,
                       4,
                       kCipUsint,
                       kCipUsint,
                       EncodeCipUsint,
                       EncodeCipUsint,
+					  NULL,
                       &g_ethernet_link[idx].interface_cntrs,
                       &g_ethernet_link[idx].interface_cntrs,
                       kGetableSingleAndAll);
                       kGetableSingleAndAll);
       InsertAttribute(ethernet_link_instance, 5, kCipUsint, EncodeCipUsint,
       InsertAttribute(ethernet_link_instance, 5, kCipUsint, EncodeCipUsint,
@@ -301,12 +305,14 @@ EipStatus CipEthernetLinkInit(void) {
                       4,
                       4,
                       kCipAny,
                       kCipAny,
                       EncodeCipEthernetLinkInterfaceCounters,
                       EncodeCipEthernetLinkInterfaceCounters,
+					  NULL,
                       &dummy_attribute_udint,
                       &dummy_attribute_udint,
                       kGetableAllDummy);
                       kGetableAllDummy);
       InsertAttribute(ethernet_link_instance,
       InsertAttribute(ethernet_link_instance,
                       5,
                       5,
                       kCipAny,
                       kCipAny,
                       EncodeCipEthernetLinkMediaCounters,
                       EncodeCipEthernetLinkMediaCounters,
+					  NULL,
                       &dummy_attribute_udint,
                       &dummy_attribute_udint,
                       kGetableAllDummy);
                       kGetableAllDummy);
 #endif  /* ... && 0 != OPENER_ETHLINK_CNTRS_ENABLE */
 #endif  /* ... && 0 != OPENER_ETHLINK_CNTRS_ENABLE */
@@ -333,26 +339,29 @@ EipStatus CipEthernetLinkInit(void) {
                       6,
                       6,
                       kCipAny,
                       kCipAny,
                       EncodeCipEthernetLinkInterfaceControl,
                       EncodeCipEthernetLinkInterfaceControl,
+					  NULL,
                       &s_interface_control,
                       &s_interface_control,
                       kGetableAll);
                       kGetableAll);
 #endif
 #endif
-      InsertAttribute(ethernet_link_instance, 7, kCipUsint, EncodeCipUsint,
+      InsertAttribute(ethernet_link_instance, 7, kCipUsint, EncodeCipUsint, NULL,
                       &g_ethernet_link[idx].interface_type,
                       &g_ethernet_link[idx].interface_type,
                       kGetableSingleAndAll);
                       kGetableSingleAndAll);
-      InsertAttribute(ethernet_link_instance, 8, kCipUsint, EncodeCipUsint,
+      InsertAttribute(ethernet_link_instance, 8, kCipUsint, EncodeCipUsint, NULL,
                       &dummy_attribute_usint, kGetableAllDummy);
                       &dummy_attribute_usint, kGetableAllDummy);
-      InsertAttribute(ethernet_link_instance, 9, kCipUsint, EncodeCipUsint,
+      InsertAttribute(ethernet_link_instance, 9, kCipUsint, EncodeCipUsint, NULL,
                       &dummy_attribute_usint, kGetableAllDummy);
                       &dummy_attribute_usint, kGetableAllDummy);
       InsertAttribute(ethernet_link_instance,
       InsertAttribute(ethernet_link_instance,
                       10,
                       10,
                       kCipShortString,
                       kCipShortString,
                       EncodeCipShortString,
                       EncodeCipShortString,
+					  NULL,
                       &g_ethernet_link[idx].interface_label,
                       &g_ethernet_link[idx].interface_label,
                       IFACE_LABEL_ACCESS_MODE);
                       IFACE_LABEL_ACCESS_MODE);
       InsertAttribute(ethernet_link_instance,
       InsertAttribute(ethernet_link_instance,
                       11,
                       11,
                       kCipAny,
                       kCipAny,
                       EncodeCipEthernetLinkInterfaceCaps,
                       EncodeCipEthernetLinkInterfaceCaps,
+					  NULL,
                       &g_ethernet_link[idx].interface_caps,
                       &g_ethernet_link[idx].interface_caps,
                       kGetableSingleAndAll);
                       kGetableSingleAndAll);
     }
     }

+ 14 - 7
source/src/cip/cipidentity.c

@@ -189,25 +189,25 @@ void InitializeCipIdentity(CipClass *class) {
   CipClass *meta_class = class->class_instance.cip_class;
   CipClass *meta_class = class->class_instance.cip_class;
 
 
   InsertAttribute( (CipInstance *) class, 1, kCipUint,
   InsertAttribute( (CipInstance *) class, 1, kCipUint,
-                   EncodeCipUint,
+                   EncodeCipUint, NULL,
                    (void *) &class->revision,
                    (void *) &class->revision,
                    kGetableSingleAndAll );                 /* revision */
                    kGetableSingleAndAll );                 /* revision */
   InsertAttribute( (CipInstance *) class, 2, kCipUint,
   InsertAttribute( (CipInstance *) class, 2, kCipUint,
-                   EncodeCipUint,
+                   EncodeCipUint, NULL,
                    (void *) &class->number_of_instances, kGetableSingleAndAll ); /*  largest instance number */
                    (void *) &class->number_of_instances, kGetableSingleAndAll ); /*  largest instance number */
   InsertAttribute( (CipInstance *) class, 3, kCipUint,
   InsertAttribute( (CipInstance *) class, 3, kCipUint,
-                   EncodeCipUint,
+                   EncodeCipUint, NULL,
                    (void *) &class->number_of_instances, kGetableSingle ); /* number of instances currently existing*/
                    (void *) &class->number_of_instances, kGetableSingle ); /* number of instances currently existing*/
-  InsertAttribute( (CipInstance *) class, 4, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 4, kCipUint, EncodeCipUint, NULL,
                    (void *) &kCipUintZero,
                    (void *) &kCipUintZero,
                    kNotSetOrGetable ); /* optional attribute list - default = 0 */
                    kNotSetOrGetable ); /* optional attribute list - default = 0 */
-  InsertAttribute( (CipInstance *) class, 5, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 5, kCipUint, EncodeCipUint, NULL,
                    (void *) &kCipUintZero,
                    (void *) &kCipUintZero,
                    kNotSetOrGetable ); /* optional service list - default = 0 */
                    kNotSetOrGetable ); /* optional service list - default = 0 */
-  InsertAttribute( (CipInstance *) class, 6, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 6, kCipUint, EncodeCipUint, NULL,
                    (void *) &meta_class->highest_attribute_number,
                    (void *) &meta_class->highest_attribute_number,
                    kGetableSingleAndAll );                 /* max class attribute number*/
                    kGetableSingleAndAll );                 /* max class attribute number*/
-  InsertAttribute( (CipInstance *) class, 7, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) class, 7, kCipUint, EncodeCipUint, NULL,
                    (void *) &class->highest_attribute_number,
                    (void *) &class->highest_attribute_number,
                    kGetableSingleAndAll );                 /* max instance attribute number*/
                    kGetableSingleAndAll );                 /* max instance attribute number*/
 
 
@@ -248,42 +248,49 @@ EipStatus CipIdentityInit() {
                   1,
                   1,
                   kCipUint,
                   kCipUint,
                   EncodeCipUint,
                   EncodeCipUint,
+				  NULL,
                   &g_identity.vendor_id,
                   &g_identity.vendor_id,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   2,
                   2,
                   kCipUint,
                   kCipUint,
                   EncodeCipUint,
                   EncodeCipUint,
+				  NULL,
                   &g_identity.device_type,
                   &g_identity.device_type,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   3,
                   3,
                   kCipUint,
                   kCipUint,
                   EncodeCipUint,
                   EncodeCipUint,
+				  NULL,
                   &g_identity.product_code,
                   &g_identity.product_code,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   4,
                   4,
                   kCipUsintUsint,
                   kCipUsintUsint,
                   EncodeRevision,
                   EncodeRevision,
+				  NULL,
                   &g_identity.revision,
                   &g_identity.revision,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   5,
                   5,
                   kCipWord,
                   kCipWord,
                   EncodeCipWord,
                   EncodeCipWord,
+				  NULL,
                   &g_identity.status,
                   &g_identity.status,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   6,
                   6,
                   kCipUdint,
                   kCipUdint,
                   EncodeCipUdint,
                   EncodeCipUdint,
+				  NULL,
                   &g_identity.serial_number,
                   &g_identity.serial_number,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   7,
                   7,
                   kCipShortString,
                   kCipShortString,
                   EncodeCipShortString,
                   EncodeCipShortString,
+				  NULL,
                   &g_identity.product_name,
                   &g_identity.product_name,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
 
 

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

@@ -54,24 +54,24 @@ void InitializeCipMessageRouterClass(CipClass *cip_class) {
 
 
   CipClass *meta_class = cip_class->class_instance.cip_class;
   CipClass *meta_class = cip_class->class_instance.cip_class;
 
 
-  InsertAttribute( (CipInstance *) cip_class, 1, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 1, kCipUint, EncodeCipUint, NULL,
                    (void *) &cip_class->revision, kGetableSingleAndAll );   /* revision */
                    (void *) &cip_class->revision, kGetableSingleAndAll );   /* revision */
-  InsertAttribute( (CipInstance *) cip_class, 2, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 2, kCipUint, EncodeCipUint, NULL,
                    (void *) &cip_class->number_of_instances,
                    (void *) &cip_class->number_of_instances,
                    kGetableSingle );                                       /*  largest instance number */
                    kGetableSingle );                                       /*  largest instance number */
-  InsertAttribute( (CipInstance *) cip_class, 3, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 3, kCipUint, EncodeCipUint, NULL,
                    (void *) &cip_class->number_of_instances,
                    (void *) &cip_class->number_of_instances,
                    kGetableSingle );                                                           /* number of instances currently existing*/
                    kGetableSingle );                                                           /* number of instances currently existing*/
-  InsertAttribute( (CipInstance *) cip_class, 4, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 4, kCipUint, EncodeCipUint, NULL,
                    (void *) &kCipUintZero,
                    (void *) &kCipUintZero,
                    kGetableAll );   /* optional attribute list - default = 0 */
                    kGetableAll );   /* optional attribute list - default = 0 */
-  InsertAttribute( (CipInstance *) cip_class, 5, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 5, kCipUint, EncodeCipUint, NULL,
                    (void *) &kCipUintZero,
                    (void *) &kCipUintZero,
                    kGetableAll ); /* optional service list - default = 0 */
                    kGetableAll ); /* optional service list - default = 0 */
-  InsertAttribute( (CipInstance *) cip_class, 6, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 6, kCipUint, EncodeCipUint, NULL,
                    (void *) &meta_class->highest_attribute_number,
                    (void *) &meta_class->highest_attribute_number,
                    kGetableSingleAndAll );                       /* max class attribute number*/
                    kGetableSingleAndAll );                       /* max class attribute number*/
-  InsertAttribute( (CipInstance *) cip_class, 7, kCipUint, EncodeCipUint,
+  InsertAttribute( (CipInstance *) cip_class, 7, kCipUint, EncodeCipUint, NULL,
                    (void *) &cip_class->highest_attribute_number,
                    (void *) &cip_class->highest_attribute_number,
                    kGetableSingleAndAll );                       /* max instance attribute number*/
                    kGetableSingleAndAll );                       /* max instance attribute number*/
 
 

+ 8 - 0
source/src/cip/cipqos.c

@@ -168,48 +168,56 @@ EipStatus CipQoSInit() {
                   1,
                   1,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   (void *) &g_qos.q_frames_enable,
                   (void *) &g_qos.q_frames_enable,
                   kNotSetOrGetable);
                   kNotSetOrGetable);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   2,
                   2,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   (void *) &g_qos.dscp.event,
                   (void *) &g_qos.dscp.event,
                   kNotSetOrGetable);
                   kNotSetOrGetable);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   3,
                   3,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   (void *) &g_qos.dscp.general,
                   (void *) &g_qos.dscp.general,
                   kNotSetOrGetable);
                   kNotSetOrGetable);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   4,
                   4,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  DecodeCipUsint,
                   (void *) &g_qos.dscp.urgent,
                   (void *) &g_qos.dscp.urgent,
                   kGetableSingle | kSetable | kNvDataFunc);
                   kGetableSingle | kSetable | kNvDataFunc);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   5,
                   5,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  DecodeCipUsint,
                   (void *) &g_qos.dscp.scheduled,
                   (void *) &g_qos.dscp.scheduled,
                   kGetableSingle | kSetable | kNvDataFunc);
                   kGetableSingle | kSetable | kNvDataFunc);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   6,
                   6,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  DecodeCipUsint,
                   (void *) &g_qos.dscp.high,
                   (void *) &g_qos.dscp.high,
                   kGetableSingle | kSetable | kNvDataFunc);
                   kGetableSingle | kSetable | kNvDataFunc);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   7,
                   7,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  DecodeCipUsint,
                   (void *) &g_qos.dscp.low,
                   (void *) &g_qos.dscp.low,
                   kGetableSingle | kSetable | kNvDataFunc);
                   kGetableSingle | kSetable | kNvDataFunc);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   8,
                   8,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  DecodeCipUsint,
                   (void *) &g_qos.dscp.explicit_msg,
                   (void *) &g_qos.dscp.explicit_msg,
                   kGetableSingle | kSetable | kNvDataFunc);
                   kGetableSingle | kSetable | kNvDataFunc);
 
 

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

@@ -589,66 +589,90 @@ EipStatus CipTcpIpInterfaceInit() {
 
 
   CipInstance *instance = GetCipInstance(tcp_ip_class, 1); /* bind attributes to the instance #1 that was created above */
   CipInstance *instance = GetCipInstance(tcp_ip_class, 1); /* bind attributes to the instance #1 that was created above */
 
 
-  InsertAttribute(instance, 1, kCipDword, EncodeCipDword, &g_tcpip.status,
+  InsertAttribute(instance,
+		  	  	  1,
+				  kCipDword,
+				  EncodeCipDword,
+				  NULL,
+				  &g_tcpip.status,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   2,
                   2,
                   kCipDword,
                   kCipDword,
                   EncodeCipDword,
                   EncodeCipDword,
+				  NULL,
                   &g_tcpip.config_capability,
                   &g_tcpip.config_capability,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   3,
                   3,
                   kCipDword,
                   kCipDword,
                   EncodeCipDword,
                   EncodeCipDword,
+				  DecodeCipWord,
                   &g_tcpip.config_control,
                   &g_tcpip.config_control,
                   kSetAndGetAble | kNvDataFunc | IFACE_CFG_SET_MODE );
                   kSetAndGetAble | kNvDataFunc | IFACE_CFG_SET_MODE );
   InsertAttribute(instance,
   InsertAttribute(instance,
                   4,
                   4,
                   kCipEpath,
                   kCipEpath,
                   EncodeCipEPath,
                   EncodeCipEPath,
+				  NULL,
                   &g_tcpip.physical_link_object,
                   &g_tcpip.physical_link_object,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   5,
                   5,
                   kCipUdintUdintUdintUdintUdintString,
                   kCipUdintUdintUdintUdintUdintString,
                   EncoodeCipTcpIpInterfaceConfiguration,
                   EncoodeCipTcpIpInterfaceConfiguration,
+				  NULL,
                   &g_tcpip.interface_configuration,
                   &g_tcpip.interface_configuration,
                   kGetableSingleAndAll | kNvDataFunc | IFACE_CFG_SET_MODE);
                   kGetableSingleAndAll | kNvDataFunc | IFACE_CFG_SET_MODE);
-  InsertAttribute(instance, 6, kCipString, EncodeCipString, &g_tcpip.hostname,
+  InsertAttribute(instance,
+		  	  	  6,
+				  kCipString,
+				  EncodeCipString,
+				  NULL,
+				  &g_tcpip.hostname,
                   kGetableSingleAndAll | kNvDataFunc | IFACE_CFG_SET_MODE);
                   kGetableSingleAndAll | kNvDataFunc | IFACE_CFG_SET_MODE);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   7,
                   7,
                   kCipAny,
                   kCipAny,
                   EncodeSafetyNetworkNumber,
                   EncodeSafetyNetworkNumber,
+				  NULL,
                   &dummy_data_field,
                   &dummy_data_field,
                   kGetableAllDummy);
                   kGetableAllDummy);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   8,
                   8,
                   kCipUsint,
                   kCipUsint,
                   EncodeCipUsint,
                   EncodeCipUsint,
+				  NULL,
                   &g_tcpip.mcast_ttl_value,
                   &g_tcpip.mcast_ttl_value,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   9,
                   9,
                   kCipAny,
                   kCipAny,
                   EncodeCipTcpIpMulticastConfiguration,
                   EncodeCipTcpIpMulticastConfiguration,
+				  NULL,
                   &g_tcpip.mcast_config,
                   &g_tcpip.mcast_config,
                   kGetableSingleAndAll);
                   kGetableSingleAndAll);
-  InsertAttribute(instance, 10, kCipBool, EncodeCipBool, &g_tcpip.select_acd,
+  InsertAttribute(instance,
+		  	  	  10,
+				  kCipBool,
+				  EncodeCipBool,
+				  NULL,
+				  &g_tcpip.select_acd,
                   kGetableAllDummy);
                   kGetableAllDummy);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   11,
                   11,
                   kCipBool,
                   kCipBool,
                   EncodeCipLastConflictDetected,
                   EncodeCipLastConflictDetected,
+				  NULL,
                   &dummy_data_field,
                   &dummy_data_field,
                   kGetableAllDummy);
                   kGetableAllDummy);
-  InsertAttribute(instance, 12, kCipBool, EncodeCipBool, &dummy_data_field,
-                  kGetableAllDummy);
+  InsertAttribute(instance, 12, kCipBool, EncodeCipBool, NULL,
+		  	  	  &dummy_data_field, kGetableAllDummy);
   InsertAttribute(instance,
   InsertAttribute(instance,
                   13,
                   13,
                   kCipUint,
                   kCipUint,
                   EncodeCipUint,
                   EncodeCipUint,
+				  DecodeCipUint,
                   &g_tcpip.encapsulation_inactivity_timeout,
                   &g_tcpip.encapsulation_inactivity_timeout,
                   kSetAndGetAble | kNvDataFunc);
                   kSetAndGetAble | kNvDataFunc);
 
 

+ 1 - 1
source/src/opener_api.h

@@ -232,7 +232,7 @@ void InsertAttribute(CipInstance *const instance,
                      const EipUint16 attribute_number,
                      const EipUint16 attribute_number,
                      const EipUint8 cip_type,
                      const EipUint8 cip_type,
                      CipAttributeEncodeInMessage encode_function,
                      CipAttributeEncodeInMessage encode_function,
-					 //CipAttributeDecodeInMessage decode_function, //TODO: add decode
+					 CipAttributeDecodeInMessage decode_function,
                      void *const data,
                      void *const data,
                      const EipByte cip_flags);
                      const EipByte cip_flags);