/* * Copyright (c) 2018-2021 Samsung Electronics Co., Ltd. All Rights Reserved * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. */ #include #include #include "dsms_init.h" #include "dsms_kernel_api.h" #include "dsms_netlink.h" #include "dsms_preboot_buffer.h" #include "dsms_rate_limit.h" #include "dsms_test.h" static int is_dsms_initialized_flag = false; int dsms_is_initialized(void) { return is_dsms_initialized_flag; } __visible_for_testing int __kunit_init dsms_init(void) { int ret = 0; DSMS_LOG_DEBUG("Starting."); if (is_dsms_initialized_flag) { DSMS_LOG_ERROR("Reinitialization attempt ignored."); goto exit_ret; } ret = dsms_rate_limit_init(); if (ret != 0) goto exit_ret; ret = dsms_netlink_init(); if (ret != 0) goto exit_rate_limit; ret = dsms_preboot_buffer_init(); if (ret != 0) goto exit_netlink; is_dsms_initialized_flag = true; goto exit_ret; exit_netlink: dsms_netlink_exit(); exit_rate_limit: dsms_rate_limit_exit(); exit_ret: if (ret == 0) DSMS_LOG_INFO("Started."); else DSMS_LOG_ERROR("Failed to start."); return ret; } __visible_for_testing void __kunit_exit dsms_exit(void) { DSMS_LOG_DEBUG("Exiting."); if (is_dsms_initialized_flag) { is_dsms_initialized_flag = false; dsms_preboot_buffer_exit(); dsms_netlink_exit(); dsms_rate_limit_exit(); } DSMS_LOG_INFO("Exited."); } module_init(dsms_init); module_exit(dsms_exit);