Ticket refs #9951: icwmp: Handle ParameterKey in client

This commit is contained in:
Omar Kallel 2023-02-22 15:17:09 +01:00
parent 177a540c8f
commit 02d1948c01
9 changed files with 49 additions and 39 deletions

View file

@ -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));

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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_ */

View file

@ -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);

View file

@ -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) {

View file

@ -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();