|
|
@@ -58,6 +58,7 @@
|
|
|
*/
|
|
|
/** The implemented class revision is 1 */
|
|
|
#define CERTIFICATE_MANAGEMENT_OBJECT_REVISION 1
|
|
|
+#define DEFAULT_DEVICE_CERTIFICATE_INSTANCE_NUMBER 1
|
|
|
|
|
|
/**
|
|
|
* declaration of (static) Certificate Management object instance 1 data
|
|
|
@@ -273,70 +274,21 @@ EipStatus CertificateManagementObjectPostCreateCallback(
|
|
|
return kEipStatusOk;
|
|
|
}
|
|
|
|
|
|
-/** @brief Certificate Management Object Delete service
|
|
|
+/** @brief Certificate Management Object PreDeleteCallback
|
|
|
*
|
|
|
- * The Delete service shall be used to delete dynamic instances
|
|
|
- * (static instances shall return status code 0x2D, Instance Not Deletable).
|
|
|
+ * Used for common Delete service before instance is deleted
|
|
|
* @See Vol.8, Chapter 5-5.5.2
|
|
|
*/
|
|
|
-EipStatus CertificateManagementObjectDelete( //TODO: use common delete service
|
|
|
+EipStatus CertificateManagementObjectPreDeleteCallback(
|
|
|
CipInstance *RESTRICT const instance,
|
|
|
CipMessageRouterRequest *const message_router_request,
|
|
|
- CipMessageRouterResponse *const message_router_response,
|
|
|
- const struct sockaddr *originator_address,
|
|
|
- const int encapsulation_session) {
|
|
|
-
|
|
|
- message_router_response->general_status = kCipErrorInstanceNotDeletable;
|
|
|
- message_router_response->size_of_additional_status = 0;
|
|
|
- InitializeENIPMessage(&message_router_response->message);
|
|
|
- message_router_response->reply_service = (0x80 | message_router_request->service);
|
|
|
-
|
|
|
- CipClass *const cmo_class =
|
|
|
- GetCipClass(kCertificateManagementObjectClassCode);
|
|
|
-
|
|
|
- if (instance->instance_number != 1) { // static instance 1 should not be deleted
|
|
|
-
|
|
|
- CipInstance *instances = cmo_class->instances;
|
|
|
-
|
|
|
- // update pointers in instance list
|
|
|
- instances = cmo_class->instances; /* pointer to first instance */
|
|
|
- if (instances->instance_number == instance->instance_number) { // if instance to delete is head
|
|
|
- cmo_class->instances = instances->next;
|
|
|
- } else {
|
|
|
- while (NULL != instances->next) // as long as what next points to is not zero
|
|
|
- {
|
|
|
- CipInstance *next_instance = instances->next;
|
|
|
- if (next_instance->instance_number == instance->instance_number) {
|
|
|
- instances->next = next_instance->next;
|
|
|
- break;
|
|
|
- }
|
|
|
- instances = instances->next;
|
|
|
- }
|
|
|
- }
|
|
|
- // free all allocated attributes of instance
|
|
|
- CipAttributeStruct *attribute = instance->attributes; /* init pointer to array of attributes*/
|
|
|
- for(int i = 0; i < instance->cip_class->number_of_attributes; i++) {
|
|
|
- CipFree(attribute->data);
|
|
|
- ++attribute;
|
|
|
- }
|
|
|
- CipFree(instance->attributes);
|
|
|
-
|
|
|
- OPENER_TRACE_INFO("CMO instance number %d deleted\n", instance->instance_number);
|
|
|
- CipFree(instance); // delete instance
|
|
|
-
|
|
|
- cmo_class->number_of_instances -= 1; /* update the total number of instances
|
|
|
- recorded by the class - Attr. 3 */
|
|
|
-
|
|
|
- // update largest instance number (class Attribute 2)
|
|
|
- instances = cmo_class->instances;
|
|
|
- while (NULL != instances->next) { // get last element - should be largest number
|
|
|
- instances = instances->next;
|
|
|
- }
|
|
|
- cmo_class->max_instance = instances->instance_number;
|
|
|
-
|
|
|
- message_router_response->general_status = kCipErrorSuccess;
|
|
|
+ CipMessageRouterResponse *const message_router_response
|
|
|
+) {
|
|
|
+ if (DEFAULT_DEVICE_CERTIFICATE_INSTANCE_NUMBER ==
|
|
|
+ instance->instance_number) { // static instance 1 should not be deleted
|
|
|
+ message_router_response->general_status = kCipErrorInstanceNotDeletable;
|
|
|
+ return kEipStatusError;
|
|
|
}
|
|
|
-
|
|
|
return kEipStatusOk;
|
|
|
}
|
|
|
|
|
|
@@ -469,7 +421,8 @@ void CertificateManagementObjectInitializeClassSettings(CipClass *class) {
|
|
|
// add Callback function pointers
|
|
|
class->PreCreateCallback = &CertificateManagementObjectPreCreateCallback;
|
|
|
class->PostCreateCallback = &CertificateManagementObjectPostCreateCallback;
|
|
|
- //TODO: add reset + delete callbacks
|
|
|
+ class->PreDeleteCallback = &CertificateManagementObjectPreDeleteCallback;
|
|
|
+ //TODO: add reset callbacks
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -516,8 +469,8 @@ EipStatus CertificateManagementObjectInit(void) {
|
|
|
);
|
|
|
InsertService(certificate_management_object_class,
|
|
|
kDelete,
|
|
|
- &CertificateManagementObjectDelete,
|
|
|
- "CertificateManagementObjectDelete"
|
|
|
+ &Delete,
|
|
|
+ "Delete"
|
|
|
);
|
|
|
InsertService(certificate_management_object_class,
|
|
|
kGetAttributeSingle,
|