Эх сурвалжийг харах

CMODeleteInstanceData added, update for new delete service in cipcommon

micsat 3 жил өмнө
parent
commit
f758d82cfa

+ 45 - 4
CertificateManagementObject/certificatemanagement.c

@@ -224,6 +224,34 @@ void CertificateManagementObjectBindAttributes(CipInstance *instance,
     );
 }
 
+/** @brief Certificate Management Object Delete Instance Data
+ *
+ *  Used for common Delete service to delete instance struct before instance is deleted
+ */
+EipStatus CertificateManagementObjectDeleteInstanceData(
+    CipInstance *RESTRICT const instance,
+    CipMessageRouterRequest *const message_router_request,
+    CipMessageRouterResponse *const message_router_response
+) {
+
+  // free all allocated attributes of instance
+  CipAttributeStruct *attribute =
+      instance->attributes; /* init pointer to array of attributes*/
+  for (EipUint16 i = 0; i < instance->cip_class->number_of_attributes; i++) {
+    CipFree(attribute->data);
+    ++attribute;
+  }
+  CipFree(instance->attributes);
+
+  /*get instance data struct and free all dynamically allocated elements*/
+  CertificateManagementObjectValues *instance_data_struct = instance->data;
+  //currently no additional element allocated
+  CipFree(instance_data_struct);
+  instance_data_struct = NULL;
+
+  return kEipStatusOk;
+}
+
 /** @brief Certificate Management Object PreCreateCallback
  *
  *  Used for common Create service before new instance is created
@@ -270,6 +298,11 @@ EipStatus CertificateManagementObjectPostCreateCallback(
       new_instance,
       name, state, device_certificate, ca_certificate, certificate_encoding);
 
+  //create new CMO data struct for additional data
+  CertificateManagementObjectValues *CMO_instance_data = CipCalloc(1, sizeof(CertificateManagementObjectValues));
+  new_instance->data = CMO_instance_data;
+  CMO_instance_data->delete_instance_data = &CertificateManagementObjectDeleteInstanceData; //delete instance data function
+
   AddIntToMessage(new_instance->instance_number, &(message_router_response->message));
   return kEipStatusOk;
 }
@@ -284,12 +317,20 @@ EipStatus CertificateManagementObjectPreDeleteCallback(
     CipMessageRouterRequest *const message_router_request,
     CipMessageRouterResponse *const message_router_response
 ) {
-  if (DEFAULT_DEVICE_CERTIFICATE_INSTANCE_NUMBER ==
-      instance->instance_number) {  // static instance 1 should not be deleted
+  EipStatus internal_state = kEipStatusOk;
+
+  CertificateManagementObjectValues *CMO_instance_data = instance->data;
+
+  if (DEFAULT_DEVICE_CERTIFICATE_INSTANCE_NUMBER == instance->instance_number || // static instance 1 should not be deleted
+      NULL == CMO_instance_data->delete_instance_data) {  //check if delete function is assigned
     message_router_response->general_status = kCipErrorInstanceNotDeletable;
-    return kEipStatusError;
+    internal_state = kEipStatusError;
   }
-  return kEipStatusOk;
+  else{
+    internal_state = CertificateManagementObjectDeleteInstanceData(instance, message_router_request,
+                                               message_router_response);
+  }
+  return internal_state;
 }
 
 /** @brief Certificate Management Object Create CSR service

+ 5 - 0
CertificateManagementObject/certificatemanagement.h

@@ -117,6 +117,11 @@ typedef struct cmo_class_attributes {
   CipDword certificate_encodings_flag; /** Class Attribute #10 */
 } CertificateManagementObjectClassAttributes;
 
+/** @brief Certificate Management Object additional instance data */
+typedef struct certificate_management_object_values {
+  CipServiceFunction delete_instance_data;
+} CertificateManagementObjectValues;
+
 /* ********************************************************************
  * global public variables
  */