Use the ubus mehtod 'usp.raw init_notify' to update dm_enabled_notify file && get inform parameters from a string array

This commit is contained in:
Omar Kallel 2020-11-21 02:13:40 +01:00
parent 2ef548e60e
commit c579c9b4e9
12 changed files with 95 additions and 55 deletions

View file

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

View file

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

6
cwmp.c
View file

@ -27,6 +27,7 @@
#include "config.h"
#include "jshn.h"
#include <libubus.h>
#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();

View file

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

22
event.c
View file

@ -34,6 +34,7 @@
#include <libbbfdm/dmentry.h>
#include <libbbfdm/deviceinfo.h>
#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();

6
http.c
View file

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

View file

@ -5,11 +5,13 @@
#include <string.h>
#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_ */

View file

@ -16,12 +16,7 @@
#include <cwmp.h>
#include <curl/curl.h>
#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

View file

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

2
jshn.c
View file

@ -35,7 +35,7 @@ static int jshn_message_parse(char **policy, int size, char **tb, char *msg)
}
for (i=0; i<size; i++)
{
obj = json_object_object_get(jshn_obj, policy[i]);
json_object_object_get_ex(jshn_obj, policy[i], &obj);
if (obj == NULL || json_object_get_type(obj) != json_type_string)
continue;
tb[i] = (char *)json_object_get_string(obj);

7
ubus.c
View file

@ -360,8 +360,9 @@ int cwmp_ubus_call(const char *obj, const char *method, const struct cwmp_ubus_a
for (i = 0; i < u_args_size; i++) {
if (u_args[i].type == UBUS_String)
blobmsg_add_string(&b, u_args[i].key, u_args[i].val.str_val);
else if (u_args[i].type == UBUS_Integer)
else if (u_args[i].type == UBUS_Integer) {
blobmsg_add_u32(&b, u_args[i].key, u_args[i].val.int_val);
}
else if (u_args[i].type == UBUS_Array_Obj || u_args[i].type == UBUS_Array_Str){
void *a, *t;
int j;
@ -392,8 +393,8 @@ int cwmp_ubus_call(const char *obj, const char *method, const struct cwmp_ubus_a
rc = ubus_invoke(ubus_ctx, id, method, b.head, receive_ubus_call_result_data, NULL, 1000);
else
rc = -1;
*json_ret = json_res;
if (json_ret)
*json_ret = json_res;
if (ubus_ctx) {
ubus_free(ubus_ctx);

73
xml.c
View file

@ -135,6 +135,17 @@ const struct rpc_acs_method rpc_acs_methods[] = {
[RPC_ACS_DU_STATE_CHANGE_COMPLETE] = {"DUStateChangeComplete", cwmp_rpc_acs_prepare_du_state_change_complete, NULL, cwmp_rpc_acs_destroy_data_du_state_change_complete}
};
char* forced_inform_parameters[] = {
"Device.RootDataModelVersion",
"Device.DeviceInfo.HardwareVersion",
"Device.DeviceInfo.SoftwareVersion",
"Device.DeviceInfo.ProvisioningCode",
"Device.ManagementServer.ParameterKey",
"Device.ManagementServer.ConnectionRequestURL",
"Device.ManagementServer.AliasBasedAddressing"
};
int cwmp_launch_du_install(char *url, char *uuid, char *user, char *pass, char *env, char **package_version, char **package_name, char **package_uuid, char **package_env, struct opresult **pchange_du_state_complete);
int cwmp_launch_du_update(char *uuid, char *url, char *version, char *user, char *pass, char **package_version, char **package_name, char **package_uuid, char **package_env, struct opresult **pchange_du_state_complete);
int cwmp_launch_du_uninstall(char *package_name, char *package_env, struct opresult **pchange_du_state_complete);
@ -604,10 +615,9 @@ error:
return -1;
}
static int xml_prepare_parameters_inform(struct dmctx *dmctx, struct dm_parameter *dm_parameter, mxml_node_t *parameter_list, int *size)
static int xml_prepare_parameters_inform(struct cwmp_dm_parameter *dm_parameter, mxml_node_t *parameter_list, int *size)
{
mxml_node_t *node, *b;
b = mxmlFindElementOpaque(parameter_list, parameter_list, dm_parameter->name, 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, &parameters);
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; i<inform_parameters_nbre; i++) {
cwmp_get_parameter_values(forced_inform_parameters[i], &parameters);
if(parameters == NULL)
continue;
foreach_jsonobj_in_array(param_obj, parameters) {
param_obj = json_object_array_get_idx(parameters, 0);
json_object_object_get_ex(param_obj, "parameter", &param_name);
json_object_object_get_ex(param_obj, "value", &param_value);
json_object_object_get_ex(param_obj, "type", &param_type);
cwmp_dm_param.name = strdup(param_name?(char*)json_object_get_string(param_name):"");
cwmp_dm_param.data = strdup(param_value?(char*)json_object_get_string(param_value):"");
cwmp_dm_param.type = strdup(param_type?(char*)json_object_get_string(param_type):"");
if (xml_prepare_parameters_inform(&cwmp_dm_param, parameter_list, &size))
goto error;
FREE(cwmp_dm_param.name);
FREE(cwmp_dm_param.data);
FREE(cwmp_dm_param.type);
}
FREE(parameters);
}
if (asprintf(&c, "cwmp:ParameterValueStruct[%d]", size) == -1)
goto error;
@ -882,7 +903,7 @@ int cwmp_rpc_acs_prepare_message_inform (struct cwmp *cwmp, struct session *sess
return 0;
error:
CWMP_LOG(ERROR,"Unable Prepare Message Inform",CWMP_BKP_FILE);
return -1;
}
@ -1628,11 +1649,13 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct session *session, struct rpc
struct cwmp_param_value *param_value;
list_for_each_entry(param_value, &list_param_value, list) {
char *err = cwmp_set_parameter_value(param_value->param, 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;