Skip to content
Snippets Groups Projects
dmcwmp.h 17.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     *	This program is free software: you can redistribute it and/or modify
     *	it under the terms of the GNU General Public License as published by
     *	the Free Software Foundation, either version 2 of the License, or
     *	(at your option) any later version.
     *
    
     *	Copyright (C) 2019 iopsys Software Solutions AB
    
    8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479
     *	  Author MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
     *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
     *	  Author Feten Besbes <feten.besbes@pivasoftware.com>
     *
     */
    
    #ifndef __DMCWMP_H__
    #define __DMCWMP_H__
    #include <stdio.h>
    #include <string.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <libubox/list.h>
    #include "dmuci.h"
    #include "dmmem.h"
    
    #ifdef BBF_TR064
    #define DMROOT_UPNP ""
    #define DMDELIM_UPNP '/'
    #endif
    
    #define DMDELIM_CWMP '.'
    
    #define DM_PROMPT "icwmp>"
    
    #define DM_ENABLED_NOTIFY "/etc/icwmpd/.dm_enabled_notify"
    #define DM_ENABLED_NOTIFY_TEMPORARY "/tmp/.dm_enabled_notify_temporary"
    
    #ifdef BBF_TR064
    #define UPNP_CFG "tr064"
    #endif
    
    #ifdef UNDEF
    #undef UNDEF
    #endif
    #define UNDEF -1
    
    #ifndef ARRAY_SIZE
    #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    #endif
    
    #ifndef FREE
    #define FREE(x) do { free(x); x = NULL; } while (0)
    #endif
    
    extern struct dm_permession_s DMREAD;
    extern struct dm_permession_s DMWRITE;
    extern struct dm_forced_inform_s DMFINFRM;
    
    extern struct dm_notif_s DMNONE;
    extern struct dm_notif_s DMACTIVE;
    extern struct dm_notif_s DMPASSIVE;
    
    #define DMPARAM_ARGS \
    	struct dmctx *dmctx, \
    	struct dmnode *node, \
    	char *lastname, \
    	struct dm_permession_s *permission, \
    	int type, \
    	int (*get_cmd)(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value), \
    	int (*set_cmd)(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action), \
    	struct dm_forced_inform_s *forced_inform, \
    	struct dm_notif_s *notification, \
    	void *data, \
    	char *instance
    
    #define DMOBJECT_ARGS \
    	struct dmctx *dmctx, \
    	struct dmnode *node, \
    	struct dm_permession_s *permission, \
    	int (*addobj)(char *refparam, struct dmctx *ctx, void *data, char **instance), \
    	int (*delobj)(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action), \
    	struct dm_forced_inform_s *forced_inform, \
    	struct dm_notif_s *notification, \
    	int (*get_linker)(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker), \
    	void *data, \
    	char *instance
    
    #define TAILLE_MAX 1024
    
    struct dm_forced_inform_s;
    struct dm_permession_s;
    struct dm_parameter;
    struct dm_leaf_s;
    struct dm_obj_s;
    struct dmnode;
    struct dmctx;
    struct dm_notif_s;
    
    struct dm_permession_s {
    	char *val;
    	char *(*get_permission)(char *refparam, struct dmctx *dmctx, void *data, char *instance);
    };
    
    struct dm_forced_inform_s {
    	unsigned char val;
    	unsigned char (*get_forced_inform)(char *refparam, struct dmctx *dmctx, void *data, char *instance);
    };
    
    struct dm_notif_s {
    	char *val;
    	char *(*get_notif)(char *refparam, struct dmctx *dmctx, void *data, char *instance);
    };
    
    typedef struct dm_leaf_s {
    	/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type(8)*/
    	char *parameter;
    	struct dm_permession_s *permission;
    	int type;
    	int (*getvalue)(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
    	int (*setvalue)(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
    	struct dm_forced_inform_s *forced_inform;
    	struct dm_notif_s *notification;
    	int bbfdm_type;
    } DMLEAF;
    
    typedef struct dm_obj_s {
    	/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type(12)*/
    	char *obj;
    	struct dm_permession_s *permission;
    	int (*addobj)(char *refparam, struct dmctx *ctx, void *data, char **instance);
    	int (*delobj)(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
    	bool (*checkobj)(struct dmctx *dmctx, void *data);
    	int (*browseinstobj)(struct dmctx *dmctx, struct dmnode *node, void *data, char *instance);
    	struct dm_forced_inform_s *forced_inform;
    	struct dm_notif_s *notification;
    	struct dm_obj_s *nextobj;
    	struct dm_leaf_s *leaf;
    	int (*get_linker)(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
    	int bbfdm_type;	
    } DMOBJ;
    
    #ifdef BBF_TR064
    typedef struct dm_upnp_supported_dm_s {
    	char *location;
    	char *uri;
    	char *url;
    	char *description;
    	char *source_location;
    } UPNP_SUPPORTED_DM;
    #endif
    
    struct set_tmp {
    	struct list_head list;
    	char *name;
    	char *value;
    	unsigned int flags;
    };
    
    struct param_fault {
    	struct list_head list;
    	char *name;
    	int fault;
    };
    
    struct dm_enabled_notify {
    	struct list_head list;
    	char *name;
    	char *notification;
    	char *value;
    };
    
    #ifdef BBF_TR064
    struct dm_upnp_enabled_track {
    	struct list_head list;
    	char *name;
    	char *key;
    	char *value;
    	unsigned int isobj;
    };
    #endif
    
    struct dm_parameter {
    	struct list_head list;
    	char *name;
    	char *data;
    	char *type; 
    	char *version;
    	unsigned int flags;
    };
    
    struct dmctx
    {
    	bool stop;
    	bool match;
    	int (*method_param)(DMPARAM_ARGS);
    	int (*method_obj)(DMOBJECT_ARGS);
    	int (*checkobj)(DMOBJECT_ARGS);
    	int (*checkleaf)(DMOBJECT_ARGS);
    	struct list_head list_parameter;
    	struct list_head set_list_tmp;
    	struct list_head list_fault_param;
    	DMOBJ *dm_entryobj;
    	bool nextlevel;
    	int depth;
    	int faultcode;
    	int setaction;
    	char *in_param;
    	char *in_notification;
    	bool notification_change;
    	char *in_value;
    	char *addobj_instance;
    	char *linker;
    	char *linker_param;
    	unsigned int dmparam_flags;
    	unsigned int alias_register;
    	unsigned int nbrof_instance;
    	unsigned int amd_version;
    	unsigned int instance_mode;
    	unsigned int dm_type;
    	unsigned int user_mask;
    	unsigned char inparam_isparam;
    	unsigned char findparam;
    	char all_instances[512];
    	char *inst_buf[16];
    	char *instance_wildchar;
    };
    
    
    typedef struct dmnode {
    	DMOBJ *obj;
    	struct dmnode *parent;
    	char *current_object;
    	unsigned char instance_level;
    	unsigned char matched;
    	unsigned char is_instanceobj;
    } DMNODE;
    
    struct prefix_method {
    	const char *prefix_name;
    	bool enable;
    	bool (*set_enable)(void);
    	bool forced_inform;
    	int (*method)(struct dmctx *ctx);
    };
    
    struct notification {
    	char *value;
    	char *type;
    };
    
    struct dm_acl {
    	unsigned int flag;
    	char *user_access;
    };
    
    typedef struct execute_end_session {
    	struct list_head list;
    	int action;
    	unsigned int dm_type;
    	unsigned int amd_version;
    	unsigned int instance_mode;
    	void *data;
    	void (*function)(struct execute_end_session *);
    } execute_end_session;
    
    enum set_value_action {
    	VALUECHECK,
    	VALUESET
    };
    
    enum del_action_enum {
    	DEL_INST,
    	DEL_ALL
    };
    enum {
    	CMD_GET_VALUE,
    	CMD_GET_NAME,
    	CMD_GET_NOTIFICATION,
    	CMD_SET_VALUE,
    	CMD_SET_NOTIFICATION,
    	CMD_ADD_OBJECT,
    	CMD_DEL_OBJECT,
    	CMD_INFORM,
    	CMD_USP_OPERATE,
    #ifdef BBF_TR064
    	CMD_UPNP_GET_SUPPORTED_PARAMETERS,
    	CMD_UPNP_GET_INSTANCES,
    	CMD_UPNP_GET_SELECTED_VALUES,
    	CMD_UPNP_GET_VALUES,
    	CMD_UPNP_SET_VALUES,
    	CMD_UPNP_GET_ATTRIBUTES,
    	CMD_UPNP_SET_ATTRIBUTES,
    	CMD_UPNP_DEL_INSTANCE,
    	CMD_UPNP_ADD_INSTANCE,
    	CMD_UPNP_GET_ACLDATA,
    	CMD_UPNP_INIT_STATE_VARIABLES,
    	CMD_UPNP_LOAD_ENABLED_PARAMETRS_TRACK,
    	CMD_UPNP_GET_CONFIGURATION_UPDATE,
    	CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION,
    	CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE,
    	CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE,
    	CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE,
    	CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM,
    	CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT,
    	CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION,
    	CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM,
    	CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT,
    	CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION,
    #endif
    	CMD_EXTERNAL_COMMAND
    };
    
    enum fault_code_enum {
    	FAULT_9000 = 9000,// Method not supported
    	FAULT_9001,// Request denied
    	FAULT_9002,// Internal error
    	FAULT_9003,// Invalid arguments
    	FAULT_9004,// Resources exceeded
    	FAULT_9005,// Invalid parameter name
    	FAULT_9006,// Invalid parameter type
    	FAULT_9007,// Invalid parameter value
    	FAULT_9008,// Attempt to set a non-writable parameter
    	FAULT_9009,// Notification request rejected
    	FAULT_9010,// Download failure
    	FAULT_9011,// Upload failure
    	FAULT_9012,// File transfer server authentication failure
    	FAULT_9013,// Unsupported protocol for file transfer
    	FAULT_9014,// Download failure: unable to join multicast group
    	FAULT_9015,// Download failure: unable to contact file server
    	FAULT_9016,// Download failure: unable to access file
    	FAULT_9017,// Download failure: unable to complete download
    	FAULT_9018,// Download failure: file corrupted
    	FAULT_9019,// Download failure: file authentication failure
    	FAULT_9020,// Download failure: unable to complete download
    	FAULT_9021,// Cancelation of file transfer not permitted
    	FAULT_9022,// Invalid UUID format
    	FAULT_9023,// Unknown Execution Environment
    	FAULT_9024,// Disabled Execution Environment
    	FAULT_9025,// Diployment Unit to Execution environment mismatch
    	FAULT_9026,// Duplicate Deployment Unit
    	FAULT_9027,// System Ressources Exceeded
    	FAULT_9028,// Unknown Deployment Unit
    	FAULT_9029,// Invalid Deployment Unit State
    	FAULT_9030,// Invalid Deployment Unit Update: Downgrade not permitted
    	FAULT_9031,// Invalid Deployment Unit Update: Version not specified
    	FAULT_9032,// Invalid Deployment Unit Update: Version already exist
    	__FAULT_MAX
    };
    
    #ifdef BBF_TR064
    enum upnp_fault_code_enum {
    	FAULT_UPNP_606 = 606,// Action not authorized
    	FAULT_UPNP_701 = 701,// Invalid Argument Syntax
    	FAULT_UPNP_702,//Invalid XML Argument
    	FAULT_UPNP_703,// No Such Name
    	FAULT_UPNP_704,// Invalid Value Type
    	FAULT_UPNP_705,// Invalid Value
    	FAULT_UPNP_706,// Read Only Violation
    	FAULT_UPNP_707,// Multiple Set
    	FAULT_UPNP_708,// Resource Temporarily Unavailable
    	__FAULT_UPNP_MAX
    };
    #endif
    
    enum {
    	INSTANCE_UPDATE_NUMBER,
    	INSTANCE_UPDATE_ALIAS
    };
    
    enum instance_mode {
    	INSTANCE_MODE_NUMBER,
    	INSTANCE_MODE_ALIAS
    };
    
    enum end_session_enum {
    	END_SESSION_REBOOT = 1,
    	END_SESSION_EXTERNAL_ACTION = 1<<1,
    	END_SESSION_RELOAD = 1<<2,
    	END_SESSION_FACTORY_RESET = 1<<3,
    	END_SESSION_IPPING_DIAGNOSTIC = 1<<4,
    	END_SESSION_DOWNLOAD_DIAGNOSTIC = 1<<5,
    	END_SESSION_UPLOAD_DIAGNOSTIC = 1<<6,
    	END_SESSION_X_FACTORY_RESET_SOFT = 1<<7,
    	END_SESSION_NSLOOKUP_DIAGNOSTIC = 1<<8,
    	END_SESSION_TRACEROUTE_DIAGNOSTIC = 1<<9,
    	END_SESSION_UDPECHO_DIAGNOSTIC = 1<<10,
    	END_SESSION_SERVERSELECTION_DIAGNOSTIC = 1<<11
    };
    
    enum dm_browse_enum {
    	DM_ERROR = -1,
    	DM_OK = 0,
    	DM_STOP = 1
    };
    
    enum dmt_type_enum {
    	DMT_STRING,
    	DMT_UNINT,
    	DMT_INT,
    	DMT_LONG,
    	DMT_BOOL,
    	DMT_TIME,
    	DMT_HEXBIN,
    };
    
    enum amd_version_enum{
    	AMD_1 = 1,
    	AMD_2,
    	AMD_3,
    	AMD_4,
    	AMD_5,
    };
    
    enum dm_type_enum{
    	DM_CWMP,
    	DM_UPNP,
    };
    
    enum bbfdm_type_enum{
    	BBFDM_BOTH,
    	BBFDM_CWMP,
    	BBFDM_USP,
    };
    
    enum dm_param_flags_enum{
    	/* UPNP OnChange flags flags */
    	DM_PARAM_ALARAM_ON_CHANGE = 1 << 0,
    	DM_PARAM_EVENT_ON_CHANGE = 1 << 1,
    	/* UPNP type flags */
    	NODE_DATA_ATTRIBUTE_INSTANCE = 0x0010,
    	NODE_DATA_ATTRIBUTE_MULTIINSTANCE = 0x0020,
    	NODE_DATA_ATTRIBUTE_TYPESTRING = 0x0100,
    	NODE_DATA_ATTRIBUTE_TYPEINT = 0x0200,
    	NODE_DATA_ATTRIBUTE_TYPELONG = 0x0400,
    	NODE_DATA_ATTRIBUTE_TYPEBOOL = 0x0800,
    	NODE_DATA_ATTRIBUTE_TYPEDATETIME = 0x1000,
    	NODE_DATA_ATTRIBUTE_TYPEBASE64 = 0x2000,
    	NODE_DATA_ATTRIBUTE_TYPEBIN = 0x4000,
    	NODE_DATA_ATTRIBUTE_TYPEPTR = 0x8000,
    	NODE_DATA_ATTRIBUTE_TYPEMASK = 0x0000FF00,
    	/*ACLRoles*/
    	DM_PUBLIC_LIST = 1 << 0,
    	DM_PUBLIC_READ = 1 << 1,
    	DM_PUBLIC_WRITE = 1 << 2,
    	DM_PUBLIC_MASK = DM_PUBLIC_LIST|DM_PUBLIC_READ|DM_PUBLIC_WRITE,
    	DM_BASIC_LIST = 1 << 3,
    	DM_BASIC_READ = 1 << 4,
    	DM_BASIC_WRITE = 1 << 5,
    	DM_BASIC_MASK = DM_PUBLIC_MASK|DM_BASIC_LIST|DM_BASIC_READ|DM_BASIC_WRITE,
    	DM_XXXADMIN_LIST = 1 << 6,
    	DM_XXXADMIN_READ = 1 << 7,
    	DM_XXXADMIN_WRITE = 1 << 8,
    	DM_XXXADMIN_MASK = DM_BASIC_MASK|DM_XXXADMIN_LIST|DM_XXXADMIN_READ|DM_XXXADMIN_WRITE,
    	DM_SUPERADMIN_MASK = DM_XXXADMIN_MASK | (1 << 9),
    	DM_LIST_MASK = DM_PUBLIC_LIST|DM_BASIC_LIST|DM_XXXADMIN_LIST,
    	DM_READ_MASK = DM_PUBLIC_READ|DM_BASIC_READ|DM_XXXADMIN_READ,
    	DM_WRITE_MASK = DM_PUBLIC_WRITE|DM_BASIC_WRITE|DM_XXXADMIN_WRITE,
    	DM_FACTORIZED = 1 << 31
    };
    
    extern struct list_head list_enabled_notify;
    extern struct list_head list_enabled_lw_notify;
    extern struct list_head list_execute_end_session;
    
    #ifdef BBF_TR064
    extern struct list_head list_upnp_enabled_onevent;
    extern struct list_head list_upnp_enabled_onalarm;
    extern struct list_head list_upnp_enabled_version;
    extern struct list_head list_upnp_changed_onevent;
    extern struct list_head list_upnp_changed_onalarm;
    extern struct list_head list_upnp_changed_version;
    #endif
    
    extern int end_session_flag;
    extern int ip_version;
    extern char dm_delim;
    extern char dmroot[64];
    extern int bbfdatamodel_type;
    extern unsigned int upnp_in_user_mask;
    
    char *update_instance(struct uci_section *s, char *last_inst, char *inst_opt);
    
    char *update_instance_bbfdm(struct uci_section *s, char *last_inst, char *inst_opt);
    char *update_instance_alias_bbfdm(int action, char **last_inst , void *argv[]);
    
    char *update_instance_alias(int action, char **last_inst , void *argv[]);
    char *update_instance_without_section(int action, char **last_inst, void *argv[]);
    int get_empty(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
    void add_list_paramameter(struct dmctx *ctx, char *param_name, char *param_data, char *param_type, char *param_version, unsigned int flags);
    void del_list_parameter(struct dm_parameter *dm_parameter);
    void free_all_list_parameter(struct dmctx *ctx);
    void add_set_list_tmp(struct dmctx *ctx, char *param, char *value, unsigned int flags);
    void del_set_list_tmp(struct set_tmp *set_tmp);
    void free_all_set_list_tmp(struct dmctx *ctx);
    void add_list_fault_param(struct dmctx *ctx, char *param, int fault);
    void del_list_fault_param(struct param_fault *param_fault);
    void free_all_list_fault_param(struct dmctx *ctx);
    int string_to_bool(char *v, bool *b);
    int dm_entry_operate(struct dmctx *dmctx);
    int dm_entry_get_value(struct dmctx *ctx);
    int dm_entry_get_name(struct dmctx *ctx);
    int dm_entry_get_notification(struct dmctx *ctx);
    int dm_entry_inform(struct dmctx *ctx);
    int dm_entry_add_object(struct dmctx *ctx);
    int dm_entry_delete_object(struct dmctx *ctx);
    int dm_entry_set_value(struct dmctx *ctx);
    int dm_entry_set_notification(struct dmctx *ctx);
    int dm_entry_enabled_notify(struct dmctx *ctx);
    int dm_entry_enabled_notify_check_value_change(struct dmctx *dmctx);
    int dm_entry_get_linker(struct dmctx *ctx);
    int dm_entry_get_linker_value(struct dmctx *ctx);
    #ifdef BBF_TR064
    int dm_entry_upnp_get_instances(struct dmctx *ctx);
    int dm_entry_upnp_get_selected_values(struct dmctx *dmctx);
    int dm_entry_upnp_get_values(struct dmctx *dmctx);
    int dm_entry_upnp_set_values(struct dmctx *dmctx);
    int dm_entry_upnp_get_attributes(struct dmctx *dmctx);
    int upnp_state_variables_init(struct dmctx *dmctx);
    int dm_entry_upnp_tracked_parameters(struct dmctx *dmctx);
    int dm_entry_upnp_get_instance_numbers(struct dmctx *dmctx);
    char *dm_entry_get_all_instance_numbers(struct dmctx *pctx, char *param);
    void free_all_list_enabled_notify();
    void free_all_list_upnp_param_track(struct list_head *head);
    #endif
    void dm_update_enabled_notify(struct dm_enabled_notify *p, char *new_value);
    int dm_update_file_enabled_notify(char *param, char *new_value);
    void dm_update_enabled_notify_byname(char *name, char *new_value);
    char *get_last_instance(char *package, char *section, char *opt_inst);
    
    char *get_last_instance_bbfdm_without_update(char *package, char *section, char *opt_inst);
    char *get_last_instance_bbfdm(char *package, char *section, char *opt_inst);
    char *get_vlan_last_instance_bbfdm(char *package, char *section, char *opt_inst, char *vlan_method);
    
    char *get_last_instance_lev2(char *package, char *section, char *opt_inst, char *opt_check, char *value_check);
    
    char *get_last_instance_lev2_bbfdm_dmmap_opt(char* dmmap_package, char *section,  char *opt_inst, char *opt_check, char *value_check);
    char *get_last_instance_lev2_bbfdm(char *package, char *section, char* dmmap_package, char *opt_inst, char *opt_check, char *value_check);
    
    char *handle_update_instance(int instance_ranck, struct dmctx *ctx, char **last_inst, char * (*up_instance)(int action, char **last_inst, void *argv[]), int argc, ...);
    int dm_add_end_session(struct dmctx *ctx, void(*function)(struct execute_end_session *), int action, void *data);
    int apply_end_session();
    void cwmp_set_end_session (unsigned int flag);
    char *dm_print_path(char *fpath, ...);
    void free_all_list_enabled_lwnotify();
    int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance);
    #ifdef BBF_TR064
    void dm_upnp_apply_config(void);
    void add_list_upnp_param_track(struct dmctx *dmctx, struct list_head *pchead, char *param, char *key, char *value, unsigned int isobj);
    int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance);
    int dm_entry_upnp_get_supported_parameters(struct dmctx *dmctx);
    int dm_entry_upnp_set_attributes(struct dmctx *dmctx);
    int dm_entry_upnp_delete_instance(struct dmctx *dmctx);
    int dm_entry_upnp_get_acl_data(struct dmctx *dmctx);
    void free_all_list_enabled_lwnotify();
    int dm_entry_upnp_add_instance(struct dmctx *dmctx);
    #endif
    
    static inline int DM_LINK_INST_OBJ(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance)
    {
    	dmctx->faultcode = dm_link_inst_obj(dmctx, parent_node, data, instance);
    	if (dmctx->stop)
    		return DM_STOP;
    	return DM_OK;
    }
    
    #ifndef TRACE
    #define TRACE_TYPE 0
    static inline void trace_empty_func()
    {
    }
    #if TRACE_TYPE == 2
    #define TRACE(MESSAGE,args...) do { \
    	const char *A[] = {MESSAGE}; \
    	fprintf(stderr, "TRACE: %s %s %d ",__FUNCTION__,__FILE__,__LINE__); \
    	if(sizeof(A) > 0) \
    		fprintf(stderr, *A,##args); \
    	fprintf(stderr, "\n"); \
    	fflush(stderr); \
    } while(0)
    #elif TRACE_TYPE == 1
    #define TRACE(MESSAGE, ...) printf(MESSAGE, ## __VA_ARGS__)
    #else
    #define TRACE(MESSAGE, ...) trace_empty_func()
    #endif
    #endif
    
    #ifndef DETECT_CRASH
    #define DETECT_CRASH(MESSAGE,args...) { \
    	const char *A[] = {MESSAGE}; \
    	printf("DETECT_CRASH: %s %s %d\n",__FUNCTION__,__FILE__,__LINE__); fflush(stdout);\
    	if(sizeof(A) > 0) \
    		printf(*A,##args); \
    	sleep(1); \
    }
    #endif
    
    #endif