From 02d1948c01eed5cb24a2e1fa60ced98ac996528d Mon Sep 17 00:00:00 2001 From: Omar Kallel Date: Wed, 22 Feb 2023 15:17:09 +0100 Subject: [PATCH] Ticket refs #9951: icwmp: Handle ParameterKey in client --- src/common.c | 9 +++++-- src/common.h | 1 + src/cwmp_cli.c | 17 +++++++----- src/cwmp_cli.h | 1 + src/datamodel_interface.c | 14 +++++----- src/datamodel_interface.h | 6 ++--- src/download.c | 3 +-- src/rpc.c | 11 +++++--- .../icwmp_datamodel_interface_unit_test.c | 26 +++++++++---------- 9 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/common.c b/src/common.c index 856c5f1..0f08130 100755 --- a/src/common.c +++ b/src/common.c @@ -309,13 +309,18 @@ void check_firewall_restart_state() } } +void set_rpc_parameter_key(char *param_key) +{ + cwmp_uci_set_value("cwmp", "cpe", "ParameterKey", param_key ? param_key : ""); + cwmp_commit_package("cwmp", UCI_STANDARD_CONFIG); +} + /* * Reboot */ void cwmp_reboot(char *command_key) { - cwmp_uci_set_value("cwmp", "cpe", "ParameterKey", command_key); - cwmp_commit_package("cwmp", UCI_STANDARD_CONFIG); + set_rpc_parameter_key(command_key); struct blob_buf b = { 0 }; memset(&b, 0, sizeof(struct blob_buf)); diff --git a/src/common.h b/src/common.h index df3e6d4..1823615 100644 --- a/src/common.h +++ b/src/common.h @@ -611,4 +611,5 @@ void cwmp_invoke_intf_reset(char *path); void check_firewall_restart_state(); void add_day_to_time(struct tm *time); int set_rpc_acs_to_supported(const char *rpc_name); +void set_rpc_parameter_key(char *param_key); #endif diff --git a/src/cwmp_cli.c b/src/cwmp_cli.c index 149af40..7e33ed9 100644 --- a/src/cwmp_cli.c +++ b/src/cwmp_cli.c @@ -87,7 +87,7 @@ char *cmd_set_exec_func(struct cmd_input in, union cmd_result *res __attribute__ LIST_HEAD(list_set_param_value); LIST_HEAD(faults_list); add_dm_parameter_to_list(&list_set_param_value, in.first_input, in.second_input, NULL, 0, false); - int fault_idx = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_key", &flag, &faults_list); + int fault_idx = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_list); cwmp_free_all_dm_parameter_list(&list_set_param_value); if (fault_idx != FAULT_CPE_NO_FAULT) { struct cwmp_param_fault *param_fault = NULL; @@ -101,6 +101,7 @@ char *cmd_set_exec_func(struct cmd_input in, union cmd_result *res __attribute__ cwmp_free_all_list_param_fault(&faults_list); return icwmp_strdup(fault); } + set_rpc_parameter_key(in.third_input); if (transaction_id) { cwmp_transaction_commit(); icwmp_restart_services(); @@ -132,12 +133,13 @@ char *cmd_add_exec_func(struct cmd_input in, union cmd_result *res) return "9002"; } - char *fault = cwmp_add_object(in.first_input, in.second_input ? in.second_input : "add_obj", &(res->instance)); + char *fault = cwmp_add_object(in.first_input, &(res->instance)); if (fault != NULL) { if (transaction_id) cwmp_transaction_abort(); return fault; } + set_rpc_parameter_key(in.second_input); if (transaction_id) { cwmp_transaction_commit(); icwmp_restart_services(); @@ -171,12 +173,13 @@ char *cmd_del_exec_func(struct cmd_input in, union cmd_result *res __attribute__ return "9002"; } - char *fault = cwmp_delete_object(in.first_input, in.second_input ? in.second_input : "del_obj"); + char *fault = cwmp_delete_object(in.first_input); if (fault != NULL) { if (transaction_id) cwmp_transaction_abort(); return fault; } + set_rpc_parameter_key(in.second_input); if (transaction_id) { cwmp_transaction_commit(); icwmp_restart_services(); @@ -290,9 +293,9 @@ void cwmp_cli_help() printf(" help => show this help\n"); printf(" get [path-expr] => get parameter values\n"); printf(" get_names [path-expr] [next-level] => get parameter names\n"); - printf(" set [path-expr] [value] => set parameter value\n"); - printf(" add [object] => add object\n"); - printf(" del [object] => delete object\n"); + printf(" set [path-expr] [value] [pkey] => set parameter value\n"); + printf(" add [object] [pkey] => add object\n"); + printf(" del [object] [pkey] => delete object\n"); printf(" get_notif [path-expr] => get parameter notifications\n"); printf(" set_notif [path-expr] [notification] => set parameter notifications\n"); } @@ -315,7 +318,7 @@ char* execute_cwmp_cli_command(char *cmd, char *args[]) } if (strcmp(cmd, "help") == 0) goto cli_help; - struct cmd_input cmd_in = { args[0] ? args[0] : NULL, args[0] && args[1] ? args[1] : NULL }; + struct cmd_input cmd_in = { args[0] ? args[0] : NULL, args[0] && args[1] ? args[1] : NULL, args[0] && args[1] && args[2] ? args[2] : NULL }; union cmd_result cmd_out = { 0 }; char *fault = NULL, *fault_ret = NULL; size_t i; diff --git a/src/cwmp_cli.h b/src/cwmp_cli.h index 8d2b4a9..acd85da 100644 --- a/src/cwmp_cli.h +++ b/src/cwmp_cli.h @@ -20,6 +20,7 @@ union cmd_result { struct cmd_input { char *first_input; char *second_input; + char *third_input; }; char *cmd_get_exec_func(struct cmd_input in, union cmd_result *res); diff --git a/src/datamodel_interface.c b/src/datamodel_interface.c index 0313e8f..939208e 100755 --- a/src/datamodel_interface.c +++ b/src/datamodel_interface.c @@ -587,7 +587,7 @@ void ubus_setm_values_callback(struct ubus_request *req, int type __attribute__( } } -int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list, char *parameter_key, int *flag, struct list_head *faults_list) +int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list, int *flag, struct list_head *faults_list) { int e; struct cwmp_dm_parameter *param_value = NULL; @@ -606,7 +606,6 @@ int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list blobmsg_close_table(&b, tbl); } blobmsg_close_array(&b, arr); - bb_add_string(&b, "key", parameter_key ? parameter_key : ""); blobmsg_add_u32(&b, "transaction_id", transaction_id); bb_add_string(&b, "proto", "cwmp"); blobmsg_add_u32(&b, "instance_mode", cwmp_main->conf.instance_mode); @@ -666,20 +665,19 @@ void ubus_objects_callback(struct ubus_request *req, int type __attribute__((unu } } -static void prepare_add_delete_blobmsg(struct blob_buf *b, char *object_name, char *key) +static void prepare_add_delete_blobmsg(struct blob_buf *b, char *object_name) { if (b == NULL) return; char *object = CWMP_STRLEN(object_name) ? object_name : DM_ROOT_OBJ; bb_add_string(b, "path", object); - bb_add_string(b, "key", key ? key : ""); blobmsg_add_u32(b, "transaction_id", transaction_id); bb_add_string(b, "proto", "cwmp"); blobmsg_add_u32(b, "instance_mode", cwmp_main->conf.instance_mode); } -char *cwmp_add_object(char *object_name, char *key, char **instance) +char *cwmp_add_object(char *object_name, char **instance) { int e; struct object_result add_result = { .instance = instance }; @@ -687,7 +685,7 @@ char *cwmp_add_object(char *object_name, char *key, char **instance) memset(&b, 0, sizeof(struct blob_buf)); blob_buf_init(&b, 0); - prepare_add_delete_blobmsg(&b, object_name, key); + prepare_add_delete_blobmsg(&b, object_name); e = icwmp_ubus_invoke(USP_OBJECT_NAME, "add_object", b.head, ubus_objects_callback, &add_result); blob_buf_free(&b); @@ -703,7 +701,7 @@ char *cwmp_add_object(char *object_name, char *key, char **instance) return NULL; } -char *cwmp_delete_object(char *object_name, char *key) +char *cwmp_delete_object(char *object_name) { int e; struct object_result add_result = { .instance = NULL }; @@ -711,7 +709,7 @@ char *cwmp_delete_object(char *object_name, char *key) memset(&b, 0, sizeof(struct blob_buf)); blob_buf_init(&b, 0); - prepare_add_delete_blobmsg(&b, object_name, key); + prepare_add_delete_blobmsg(&b, object_name); e = icwmp_ubus_invoke(USP_OBJECT_NAME, "del_object", b.head, ubus_objects_callback, &add_result); blob_buf_free(&b); diff --git a/src/datamodel_interface.h b/src/datamodel_interface.h index 278123a..92c5a8a 100644 --- a/src/datamodel_interface.h +++ b/src/datamodel_interface.h @@ -27,9 +27,9 @@ char *cwmp_get_parameter_values(char *parameter_name, struct list_head *paramete int cwmp_get_leaf_value(char *leaf, char **value); char *cwmp_get_multiple_parameters_values(struct list_head *arg_params_list, struct list_head *parameters_list); char *cwmp_get_single_parameter_value(char *parameter_name, struct cwmp_dm_parameter *dm_parameter); -int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list, char *parameter_key, int *flag, struct list_head *faults_list); -char *cwmp_add_object(char *object_name, char *key, char **instance); -char *cwmp_delete_object(char *object_name, char *key); +int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list, int *flag, struct list_head *faults_list); +char *cwmp_add_object(char *object_name, char **instance); +char *cwmp_delete_object(char *object_name); char *cwmp_get_parameter_names(char *object_name, bool next_level, struct list_head *parameters_list); #endif /* SRC_DATAMODELIFACE_H_ */ diff --git a/src/download.c b/src/download.c index 7f1482a..2dda9b2 100644 --- a/src/download.c +++ b/src/download.c @@ -537,8 +537,7 @@ int apply_downloaded_file(struct download *pdownload, char *download_file_name, error = FAULT_CPE_INVALID_ARGUMENTS; if ((error == FAULT_CPE_NO_FAULT) && (pdownload->file_type[0] == '1' || pdownload->file_type[0] == '3')) { - cwmp_uci_set_value("cwmp", "cpe", "ParameterKey", pdownload->command_key ? pdownload->command_key : ""); - cwmp_commit_package("cwmp", UCI_STANDARD_CONFIG); + set_rpc_parameter_key(pdownload->command_key); if (pdownload->file_type[0] == '3') { CWMP_LOG(INFO, "Download and apply new vendor config file is done successfully"); //cwmp_root_cause_transfer_complete(ptransfer_complete); diff --git a/src/rpc.c b/src/rpc.c index 76455d0..5e54be7 100755 --- a/src/rpc.c +++ b/src/rpc.c @@ -1018,10 +1018,11 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct rpc *rpc) if (fault_code != FAULT_CPE_NO_FAULT) goto fault; - fault_code = cwmp_set_multiple_parameters_values(&list_set_param_value, parameter_key ? parameter_key : "", &flag, rpc->list_set_value_fault); + fault_code = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, rpc->list_set_value_fault); if (fault_code != FAULT_CPE_NO_FAULT) goto fault; + set_rpc_parameter_key(parameter_key); FREE(parameter_key); struct cwmp_dm_parameter *param_value = NULL; list_for_each_entry (param_value, &list_set_param_value, list) { @@ -1152,7 +1153,7 @@ int cwmp_handle_rpc_cpe_add_object(struct rpc *rpc) } if (object_name) { - char *err = cwmp_add_object(object_name, parameter_key ? parameter_key : "", &instance); + char *err = cwmp_add_object(object_name, &instance); if (err) { fault_code = cwmp_get_fault_code_by_string(err); goto fault; @@ -1161,6 +1162,8 @@ int cwmp_handle_rpc_cpe_add_object(struct rpc *rpc) fault_code = FAULT_CPE_INVALID_PARAMETER_NAME; goto fault; } + + set_rpc_parameter_key(parameter_key); if (instance == NULL) goto fault; b = build_top_body_soap_response(cwmp_main->session->tree_out, "AddObject"); @@ -1230,7 +1233,7 @@ int cwmp_handle_rpc_cpe_delete_object(struct rpc *rpc) goto fault; } if (object_name) { - char *err = cwmp_delete_object(object_name, parameter_key ? parameter_key : ""); + char *err = cwmp_delete_object(object_name); if (err) { fault_code = cwmp_get_fault_code_by_string(err); goto fault; @@ -1239,7 +1242,7 @@ int cwmp_handle_rpc_cpe_delete_object(struct rpc *rpc) fault_code = FAULT_CPE_INVALID_PARAMETER_NAME; goto fault; } - + set_rpc_parameter_key(parameter_key); b = build_top_body_soap_response(cwmp_main->session->tree_out, "DeleteObject"); if (!b) { diff --git a/test/cmocka/icwmp_datamodel_interface_unit_test.c b/test/cmocka/icwmp_datamodel_interface_unit_test.c index 5dccb34..7fb5bf9 100644 --- a/test/cmocka/icwmp_datamodel_interface_unit_test.c +++ b/test/cmocka/icwmp_datamodel_interface_unit_test.c @@ -130,7 +130,7 @@ static void dm_set_multiple_parameter_values_test(void **state) */ add_dm_parameter_to_list(&list_set_param_value, "Device.WiFi.SSID.1.Alias", "wifi_alias_1", NULL, 0, false); cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_wifi_ssid_alias", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_int_equal(fault, 0); assert_in_set(flag, flag_values, 15); cwmp_transaction_commit(); @@ -139,7 +139,7 @@ static void dm_set_multiple_parameter_values_test(void **state) add_dm_parameter_to_list(&list_set_param_value, "Device.ManagementServer.Username", "iopsys_user", NULL, 0, false); //for other flag value cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "mngt_server_user", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_int_equal(fault, 0); assert_in_set(flag, flag_values, 15); cwmp_transaction_commit(); @@ -152,7 +152,7 @@ static void dm_set_multiple_parameter_values_test(void **state) */ add_dm_parameter_to_list(&list_set_param_value, "Device.WiFi.SSID.1.Alis", "wifi_alias_1", NULL, 0, false); cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_wifi_ssid_alias", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_non_null(fault); list_for_each_entry (param_fault, &faults_array, list) { fault_code = param_fault->fault; @@ -175,7 +175,7 @@ static void dm_set_multiple_parameter_values_test(void **state) */ add_dm_parameter_to_list(&list_set_param_value, "Device.ATM.Link.1.Status", "Up", NULL, 0, false); cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_atm_link_status", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_int_not_equal(fault, 0); list_for_each_entry (param_fault, &faults_array, list) { fault_code = param_fault->fault; @@ -198,7 +198,7 @@ static void dm_set_multiple_parameter_values_test(void **state) */ add_dm_parameter_to_list(&list_set_param_value, "Device.WiFi.SSID.1.Enable", "tre", NULL, 0, false); cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_wifi_ssid_alias", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_non_null(fault); list_for_each_entry (param_fault, &faults_array, list) { fault_code = param_fault->fault; @@ -223,7 +223,7 @@ static void dm_set_multiple_parameter_values_test(void **state) add_dm_parameter_to_list(&list_set_param_value, "Device.WiFi.SSID.1.SSID", "wifi_ssid_2", NULL, 0, false); add_dm_parameter_to_list(&list_set_param_value, "Device.ManagementServer.Username", "iopsys_user_1", NULL, 0, false); cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_wifi_ssids_aliases", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_int_equal(fault, 0); assert_in_set(flag, flag_values, 15); cwmp_transaction_commit(); @@ -238,7 +238,7 @@ static void dm_set_multiple_parameter_values_test(void **state) add_dm_parameter_to_list(&list_set_param_value, "Device.WiFi.SSID.2.Alis", "wifi_2", NULL, 0, false); add_dm_parameter_to_list(&list_set_param_value, "Device.ATM.Link.1.Status", "Up", NULL, 0, false); cwmp_transaction_start("cwmp"); - fault = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_wrongs", &flag, &faults_array); + fault = cwmp_set_multiple_parameters_values(&list_set_param_value, &flag, &faults_array); assert_int_not_equal(fault, 0); list_for_each_entry (param_fault, &faults_array, list) { assert_in_set(param_fault->fault, faults_values, 3); @@ -256,7 +256,7 @@ static void dm_add_object_test(void **state) * Add valid path and writable object */ cwmp_transaction_start("cwmp"); - fault = cwmp_add_object("Device.WiFi.SSID.", "add_ssid", &instance); + fault = cwmp_add_object("Device.WiFi.SSID.", &instance); assert_non_null(instance); assert_null(fault); cwmp_transaction_commit(); @@ -266,7 +266,7 @@ static void dm_add_object_test(void **state) * Add not valid path object */ cwmp_transaction_start("cwmp"); - fault = cwmp_add_object("Device.WiFi.SIDl.", "add_ssid", &instance); + fault = cwmp_add_object("Device.WiFi.SIDl.", &instance); assert_non_null(fault); assert_string_equal(fault, "9005"); assert_null(instance); @@ -277,7 +277,7 @@ static void dm_add_object_test(void **state) * Add valid path not writable object */ cwmp_transaction_start("cwmp"); - fault = cwmp_add_object("Device.DeviceInfo.Processor.", "add_ssid", &instance); + fault = cwmp_add_object("Device.DeviceInfo.Processor.", &instance); assert_non_null(fault); assert_string_equal(fault, "9005"); assert_null(instance); @@ -293,7 +293,7 @@ static void dm_delete_object_test(void **state) * Delete valid path and writable object */ cwmp_transaction_start("cwmp"); - fault = cwmp_delete_object("Device.WiFi.SSID.2.", "del_ssid"); + fault = cwmp_delete_object("Device.WiFi.SSID.2."); assert_null(fault); cwmp_transaction_commit(); @@ -301,7 +301,7 @@ static void dm_delete_object_test(void **state) * Delete not valid path object */ cwmp_transaction_start("cwmp"); - fault = cwmp_delete_object("Device.WiFi.SIDl.3.", "del_ssid"); + fault = cwmp_delete_object("Device.WiFi.SIDl.3."); assert_non_null(fault); assert_string_equal(fault, "9005"); cwmp_transaction_commit(); @@ -310,7 +310,7 @@ static void dm_delete_object_test(void **state) * Delte valid path not writable object */ cwmp_transaction_start("cwmp"); - fault = cwmp_delete_object("Device.DeviceInfo.Processor.2.", "del_processor"); + fault = cwmp_delete_object("Device.DeviceInfo.Processor.2."); assert_non_null(fault); assert_string_equal(fault, "9005"); cwmp_transaction_commit();