From dc06c931097e5a2e816cae9bc3689fd06745d77c Mon Sep 17 00:00:00 2001 From: Amin Ben Ramdhane Date: Wed, 9 Feb 2022 18:50:55 +0100 Subject: [PATCH] Ticket refs #7317: the reboot isn't triggred after call of Activate() operate of Device.DeviceInfo.FirmwareImage.{i}. --- dmdiagnostics.c | 17 ++++++++--------- dmdiagnostics.h | 8 +------- dmtree/tr181/deviceinfo.c | 6 +++--- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/dmdiagnostics.c b/dmdiagnostics.c index d42fa293..e03933a2 100644 --- a/dmdiagnostics.c +++ b/dmdiagnostics.c @@ -18,6 +18,7 @@ static int read_next; static struct diagnostic_stats diag_stats = {0}; static const int READ_BUF_SIZE = { 1024 * 16 }; +static struct uloop_timeout activate_timer[MAX_TIME_WINDOW] = {0}; char *get_diagnostics_option(char *sec_name, char *option) { @@ -561,17 +562,15 @@ static void launch_activate_iamge_cb(struct uloop_timeout *t) dmubus_call_set("system", "reboot", UBUS_ARGS{0}, 0); } -static void activate_fw_images(struct activate_image *active_img) +static void activate_fw_images(char *start_time[]) { - int i = 0; - - for (i = 0; i < MAX_TIME_WINDOW && *active_img->start_time; i++, active_img++) { - active_img->activate_timer.cb = launch_activate_iamge_cb; - uloop_timeout_set(&active_img->activate_timer, atoi(active_img->start_time) * 1000); + for (int i = 0; i < MAX_TIME_WINDOW && DM_STRLEN(start_time[i]); i++) { + activate_timer[i].cb = launch_activate_iamge_cb; + uloop_timeout_set(&activate_timer[i], atoi(start_time[i]) * 1000); } } -int bbf_fw_image_activate(const char *bank_id, struct activate_image *active_img) +int bbf_fw_image_activate(const char *bank_id, char *start_time[]) { json_object *json_obj = NULL; @@ -580,8 +579,8 @@ int bbf_fw_image_activate(const char *bank_id, struct activate_image *active_img if (strcmp(status, "true") != 0) return -1; - if (*active_img->start_time) { - activate_fw_images(active_img); + if (DM_STRLEN(start_time[0])) { + activate_fw_images(start_time); } else { if (dmubus_call_set("system", "reboot", UBUS_ARGS{0}, 0) != 0) return -1; diff --git a/dmdiagnostics.h b/dmdiagnostics.h index 5141f46d..408ea3ca 100644 --- a/dmdiagnostics.h +++ b/dmdiagnostics.h @@ -48,12 +48,6 @@ struct diagnostic_stats uint32_t ftp_syn; }; -struct activate_image -{ - struct uloop_timeout activate_timer; - char *start_time; -}; - enum diagnostic_protocol { DIAGNOSTIC_HTTP = 1, DIAGNOSTIC_FTP @@ -81,6 +75,6 @@ int bbf_config_restore(const char *url, const char *username, const char *passwo int bbf_fw_image_download(const char *url, const char *auto_activate, const char *username, const char *password, const char *file_size, const char *checksum_algorithm, const char *checksum, const char *bank_id, const char *command, const char *obj_path, const char *commandKey); -int bbf_fw_image_activate(const char *bank_id, struct activate_image *active_img); +int bbf_fw_image_activate(const char *bank_id, char *start_time[]); #endif diff --git a/dmtree/tr181/deviceinfo.c b/dmtree/tr181/deviceinfo.c index 433d7b08..e2cbb096 100644 --- a/dmtree/tr181/deviceinfo.c +++ b/dmtree/tr181/deviceinfo.c @@ -1009,14 +1009,14 @@ static int get_operate_args_DeviceInfoFirmwareImage_Activate(char *refparam, str static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - struct activate_image active_images[MAX_TIME_WINDOW] = {0}; + char *start_time[MAX_TIME_WINDOW] = {0}; for (int i = 0; i < ARRAY_SIZE(firmware_image_activate_in); i++) - active_images[i].start_time = dmjson_get_value((json_object *)value, 1, firmware_image_activate_in[i]); + start_time[i] = dmjson_get_value((json_object *)value, 1, firmware_image_activate_in[i]); char *bank_id = dmjson_get_value((json_object *)data, 1, "id"); - int res = bbf_fw_image_activate(bank_id, active_images); + int res = bbf_fw_image_activate(bank_id, start_time); return res ? CMD_FAIL : CMD_SUCCESS; }