From c579c9b4e9ed3a749390a45fbb56d43c2d17955e Mon Sep 17 00:00:00 2001 From: Omar Kallel Date: Sat, 21 Nov 2020 02:13:40 +0100 Subject: [PATCH] Use the ubus mehtod 'usp.raw init_notify' to update dm_enabled_notify file && get inform parameters from a string array --- bin/Makefile.am | 2 +- config.c | 2 -- cwmp.c | 6 ++-- datamodel_interface.c | 12 +++++-- event.c | 22 ++++++------ http.c | 6 ++++ inc/datamodel_interface.h | 4 ++- inc/http.h | 7 +--- inc/xml.h | 7 +++- jshn.c | 2 +- ubus.c | 7 ++-- xml.c | 73 ++++++++++++++++++++++++++------------- 12 files changed, 95 insertions(+), 55 deletions(-) diff --git a/bin/Makefile.am b/bin/Makefile.am index 49b07ad..82d2ba9 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -14,9 +14,9 @@ icwmpd_SOURCES = \ ../netlink.c \ ../time.c \ ../ubus.c \ + ../datamodel_interface.c \ ../xml.c \ ../diagnostic.c \ - ../datamodel_interface.c \ ../zlib.c icwmpd_CFLAGS = \ diff --git a/config.c b/config.c index 74b4334..7d86e1a 100644 --- a/config.c +++ b/config.c @@ -1327,7 +1327,6 @@ int cwmp_init(int argc, char** argv,struct cwmp *cwmp) return error; cwmp_get_deviceid(cwmp); - //dm_entry_load_enabled_notify(DM_CWMP, cwmp->conf.amd_version, cwmp->conf.instance_mode, add_list_value_change, send_active_value_change); return CWMP_OK; } @@ -1341,6 +1340,5 @@ int cwmp_config_reload(struct cwmp *cwmp) if ((error = global_conf_init(&(cwmp->conf)))) return error; - dm_entry_reload_enabled_notify(DM_CWMP, cwmp->conf.amd_version, cwmp->conf.instance_mode); return CWMP_OK; } diff --git a/cwmp.c b/cwmp.c index 27a223f..b06d43b 100644 --- a/cwmp.c +++ b/cwmp.c @@ -27,6 +27,7 @@ #include "config.h" #include "jshn.h" #include +#include "datamodel_interface.h" struct cwmp cwmp_main = {0}; char *commandKey = NULL; @@ -192,9 +193,8 @@ void cwmp_schedule_session (struct cwmp *cwmp) if(!event_exist_in_list(cwmp, EVENT_IDX_4VALUE_CHANGE)) is_notify = check_value_change(); } - if(is_notify>0 || access(DM_ENABLED_NOTIFY, F_OK ) < 0) - dmbbf_update_enabled_notify_file(DM_CWMP, cwmp->conf.amd_version, cwmp->conf.instance_mode); + cwmp_update_enabled_notify_file(cwmp->conf.amd_version, cwmp->conf.instance_mode); cwmp_prepare_value_change(cwmp); free_dm_parameter_all_fromlist(&list_value_change); if ((error = cwmp_move_session_to_session_send (cwmp, session))) { @@ -594,7 +594,7 @@ int run_session_end_func () if (end_session_flag & END_SESSION_SET_NOTIFICATION_UPDATE) { CWMP_LOG (INFO,"SetParameterAttributes end session: update enabled notify file"); - dmbbf_update_enabled_notify_file(DM_CWMP, cwmp_main.conf.amd_version, cwmp_main.conf.instance_mode); + cwmp_update_enabled_notify_file(cwmp_main.conf.amd_version, cwmp_main.conf.instance_mode); } dm_entry_restart_services(); diff --git a/datamodel_interface.c b/datamodel_interface.c index 1459c94..808c76b 100644 --- a/datamodel_interface.c +++ b/datamodel_interface.c @@ -18,7 +18,7 @@ char* cwmp_get_parameter_values(char *parameter_name, json_object **parameters) return NULL; } -char* cwmp_set_parameter_value(char* parameter_name, char* value, char* parameter_key) +char* cwmp_set_parameter_value(char* parameter_name, char* value, char* parameter_key, int* flag) { json_object *set_res; int e = cwmp_ubus_call("usp.raw", "set", CWMP_UBUS_ARGS{{"path", {.str_val=parameter_name}, UBUS_String},{"value", {.str_val=value}, UBUS_String}, {"key", {.str_val=parameter_key}, UBUS_String}}, 3, &set_res); @@ -43,6 +43,9 @@ char* cwmp_set_parameter_value(char* parameter_name, char* value, char* paramete json_object_object_get_ex(param_obj, "fault", &fault); return (char*)json_object_get_string(fault); } + json_object *flag_obj = NULL; + json_object_object_get_ex(set_res, "flag", &flag_obj); + *flag = flag_obj?atoi((char*)json_object_get_string(flag_obj)):0; return NULL; } @@ -68,7 +71,7 @@ char* cwmp_add_object(char* object_name, char* key, char **instance) return (char*)json_object_get_string(fault); json_object *instance_obj = NULL; json_object_object_get_ex(param_obj, "instance", &instance_obj); - *instance = json_object_get_string(instance_obj); + *instance = (char *)json_object_get_string(instance_obj); return NULL; } @@ -150,3 +153,8 @@ char* cwmp_set_parameter_attributes(char* parameter_name, char* notification) return (char*)json_object_get_string(fault_code); return NULL; } + +void cwmp_update_enabled_notify_file(unsigned int amd_version, int instance_mode) +{ + cwmp_ubus_call("usp.raw", "init_notify", CWMP_UBUS_ARGS{{"instance_mode", {.int_val=instance_mode}, UBUS_Integer}, {"amd_version", {.int_val=amd_version}, UBUS_Integer}}, 2, NULL); +} diff --git a/event.c b/event.c index 827e3b3..cf720ef 100644 --- a/event.c +++ b/event.c @@ -34,6 +34,7 @@ #include #include #endif +#include "datamodel_interface.h" LIST_HEAD(list_value_change); LIST_HEAD(list_lw_value_change); @@ -63,14 +64,14 @@ const struct EVENT_CONST_STRUCT EVENT_CONST [] = { void cwmp_save_event_container (struct cwmp *cwmp,struct event_container *event_container) { struct list_head *ilist; - struct dm_parameter *dm_parameter; + struct cwmp_dm_parameter *dm_parameter; mxml_node_t *b; if (EVENT_CONST[event_container->code].RETRY & EVENT_RETRY_AFTER_REBOOT) { b = bkp_session_insert_event(event_container->code, event_container->command_key, event_container->id, "queue"); list_for_each(ilist,&(event_container->head_dm_parameter)) { - dm_parameter = list_entry(ilist, struct dm_parameter, list); + dm_parameter = list_entry(ilist, struct cwmp_dm_parameter, list); bkp_session_insert_parameter(b, dm_parameter->name); } bkp_session_save(); @@ -127,11 +128,11 @@ struct event_container *cwmp_add_event_container (struct cwmp *cwmp, int event_c void add_dm_parameter_tolist(struct list_head *head, char *param_name, char *param_data, char *param_type) { - struct dm_parameter *dm_parameter; + struct cwmp_dm_parameter *dm_parameter; struct list_head *ilist; int cmp; list_for_each (ilist, head) { - dm_parameter = list_entry(ilist, struct dm_parameter, list); + dm_parameter = list_entry(ilist, struct cwmp_dm_parameter, list); cmp = strcmp(dm_parameter->name, param_name); if (cmp == 0) { if (param_data && strcmp(dm_parameter->data, param_data) != 0) @@ -144,14 +145,14 @@ void add_dm_parameter_tolist(struct list_head *head, char *param_name, char *par break; } } - dm_parameter = calloc(1, sizeof(struct dm_parameter)); + dm_parameter = calloc(1, sizeof(struct cwmp_dm_parameter)); _list_add(&dm_parameter->list, ilist->prev, ilist); if (param_name) dm_parameter->name = strdup(param_name); if (param_data) dm_parameter->data = strdup(param_data); if (param_type) dm_parameter->type = param_type ? param_type : "xsd:string"; } -void delete_dm_parameter_fromlist(struct dm_parameter *dm_parameter) +void delete_dm_parameter_fromlist(struct cwmp_dm_parameter *dm_parameter) { list_del(&dm_parameter->list); free(dm_parameter->name); @@ -161,9 +162,9 @@ void delete_dm_parameter_fromlist(struct dm_parameter *dm_parameter) void free_dm_parameter_all_fromlist(struct list_head *list) { - struct dm_parameter *dm_parameter; + struct cwmp_dm_parameter *dm_parameter; while (list->next!=list) { - dm_parameter = list_entry(list->next, struct dm_parameter, list); + dm_parameter = list_entry(list->next, struct cwmp_dm_parameter, list); delete_dm_parameter_fromlist(dm_parameter); } } @@ -275,7 +276,7 @@ void cwmp_lwnotification() int check_value_change(void) { - int fault, iscopy; + int fault; FILE *fp; char buf[512]; char *parameter, *notification = NULL, *value = NULL, *jval = NULL; @@ -642,7 +643,6 @@ void *thread_periodic_check_notify (void *v) static bool periodic_enable; static struct timespec periodic_timeout = {0, 0}; time_t current_time; - long int delta_time; int is_notify; periodic_interval = cwmp->conf.periodic_notify_interval; @@ -657,7 +657,7 @@ void *thread_periodic_check_notify (void *v) pthread_mutex_lock(&(cwmp->mutex_session_send)); is_notify = check_value_change(); if (is_notify > 0) - dmbbf_update_enabled_notify_file(DM_CWMP, cwmp->conf.amd_version, cwmp->conf.instance_mode); + cwmp_update_enabled_notify_file(cwmp->conf.amd_version, cwmp->conf.instance_mode); pthread_mutex_unlock(&(cwmp->mutex_session_send)); if (is_notify & NOTIF_ACTIVE) send_active_value_change(); diff --git a/http.c b/http.c index 7f2ba03..ec77ce0 100644 --- a/http.c +++ b/http.c @@ -42,6 +42,12 @@ static struct http_client http_c; static CURL *curl; +#ifdef DUMMY_MODE +char *fc_cookies = "./ext/tmp/icwmp_cookies"; +#else +char *fc_cookies = "/tmp/icwmp_cookies"; +#endif + int http_client_init(struct cwmp *cwmp) { char *dhcp_dis = NULL; diff --git a/inc/datamodel_interface.h b/inc/datamodel_interface.h index 3863f6c..5abc88b 100644 --- a/inc/datamodel_interface.h +++ b/inc/datamodel_interface.h @@ -5,11 +5,13 @@ #include #include "ubus.h" #include "jshn.h" + char* cwmp_get_parameter_values(char *parameter_name, json_object **parameters); -char* cwmp_set_parameter_value(char* parameter_name, char* value, char* parameter_key); +char* cwmp_set_parameter_value(char* parameter_name, char* value, char* parameter_key, int* flag); char* cwmp_add_object(char* object_name, char* key, char **instance); char* cwmp_delete_object(char* object_name, char* key); char* cwmp_get_parameter_names(char* object_name, bool next_level, json_object **parameters); char* cwmp_get_parameter_attributes(char* parameter_name, json_object **parameters); char* cwmp_set_parameter_attributes(char* parameter_name, char* notification); +void cwmp_update_enabled_notify_file(unsigned int amd_version, int instance_mode); #endif /* SRC_DATAMODELIFACE_H_ */ diff --git a/inc/http.h b/inc/http.h index c78aaaa..a044726 100644 --- a/inc/http.h +++ b/inc/http.h @@ -16,12 +16,7 @@ #include #include - -#ifdef DUMMY_MODE -static char *fc_cookies = "./ext/tmp/icwmp_cookies"; -#else -static char *fc_cookies = "/tmp/icwmp_cookies"; -#endif +extern char *fc_cookies; #define HTTP_TIMEOUT 30 diff --git a/inc/xml.h b/inc/xml.h index a97f66d..57305d2 100644 --- a/inc/xml.h +++ b/inc/xml.h @@ -126,6 +126,12 @@ struct cwmp_param_value { char *value; }; +struct cwmp_dm_parameter { + struct list_head list; + char *name; + char *data; + char *type; +}; struct rpc_cpe_method { const char *name; int (*handler)(struct session *session, struct rpc *rpc); @@ -272,7 +278,6 @@ extern int count_download_queue; extern const struct rpc_cpe_method rpc_cpe_methods[__RPC_CPE_MAX]; extern const struct rpc_acs_method rpc_acs_methods[__RPC_ACS_MAX]; - void xml_exit(void); int cwmp_handle_rpc_cpe_get_rpc_methods(struct session *session, struct rpc *rpc); diff --git a/jshn.c b/jshn.c index 19416e0..47b997c 100644 --- a/jshn.c +++ b/jshn.c @@ -35,7 +35,7 @@ static int jshn_message_parse(char **policy, int size, char **tb, char *msg) } for (i=0; iname, MXML_DESCEND); if (b && dm_parameter->data != NULL) { node = b->parent->parent; @@ -626,7 +636,8 @@ static int xml_prepare_parameters_inform(struct dmctx *dmctx, struct dm_paramete } else if (!b && dm_parameter->data == NULL) { - dm_entry_param_method(dmctx, CMD_GET_VALUE, dm_parameter->name, NULL, NULL); + json_object *parameters = NULL; + cwmp_get_parameter_values(dm_parameter->name, ¶meters); return 0; } node = mxmlNewElement (parameter_list, "ParameterValueStruct"); @@ -769,15 +780,12 @@ char* xml_get_cwmp_version (int version) int cwmp_rpc_acs_prepare_message_inform (struct cwmp *cwmp, struct session *session, struct rpc *this) { - struct dm_parameter *dm_parameter; + struct cwmp_dm_parameter *dm_parameter, cwmp_dm_param = {0}; struct event_container *event_container; mxml_node_t *tree, *b, *node, *parameter_list; char *c = NULL; int size = 0; struct list_head *ilist,*jlist; - struct dmctx dmctx = {0}; - - cwmp_dm_ctx_init(cwmp, &dmctx); if (session == NULL || this == NULL) return -1; @@ -833,8 +841,8 @@ int cwmp_rpc_acs_prepare_message_inform (struct cwmp *cwmp, struct session *sess event_container = list_entry(ilist, struct event_container, list); list_for_each(jlist, &(event_container->head_dm_parameter)) { - dm_parameter = list_entry(jlist, struct dm_parameter, list); - if (xml_prepare_parameters_inform(&dmctx, dm_parameter, parameter_list, &size)) + dm_parameter = list_entry(jlist, struct cwmp_dm_parameter, list); + if (xml_prepare_parameters_inform(dm_parameter, parameter_list, &size)) goto error; } } @@ -859,16 +867,29 @@ int cwmp_rpc_acs_prepare_message_inform (struct cwmp *cwmp, struct session *sess b = mxmlNewOpaque(b, cwmp->deviceid.serialnumber ? cwmp->deviceid.serialnumber : ""); if (!b) goto error; - dm_entry_param_method(&dmctx, CMD_INFORM, NULL, NULL, NULL); - - while (dmctx.list_parameter.next != &dmctx.list_parameter) { - dm_parameter = list_entry(dmctx.list_parameter.next, struct dm_parameter, list); - if (xml_prepare_parameters_inform(&dmctx, dm_parameter, parameter_list, &size)) - goto error; - - del_list_parameter(dm_parameter); - } - + json_object *parameters = NULL, *param_obj = NULL, *param_name = NULL, *param_value = NULL, *param_type = NULL; + size_t inform_parameters_nbre = sizeof(forced_inform_parameters)/sizeof(forced_inform_parameters[0]); + int i; + for (i=0; iparam, param_value->value, parameter_key); + int flag = 0; + char *err = cwmp_set_parameter_value(param_value->param, param_value->value, parameter_key, &flag); if (err) { - cwmp_add_list_fault_param(parameter_name, atoi(err), rpc->list_set_value_fault); + cwmp_add_list_fault_param(param_value->param, atoi(err), rpc->list_set_value_fault); fault_code = FAULT_CPE_INVALID_ARGUMENTS; } + cwmp_set_end_session(flag); } cwmp_free_all_list_param_value(&list_param_value); @@ -1744,10 +1767,12 @@ int cwmp_handle_rpc_cpe_set_parameter_attributes(struct session *session, struct } b = mxmlFindElement(session->tree_out, session->tree_out, "soap_env:Body", NULL, NULL, MXML_DESCEND); - if (!b) goto fault; + if (!b) + goto fault; b = mxmlNewElement(b, "cwmp:SetParameterAttributesResponse"); - if (!b) goto fault; + if (!b) + goto fault; cwmp_set_end_session(END_SESSION_SET_NOTIFICATION_UPDATE); return 0;