From 24281e06e042251f5874996cce55eb151a432cb6 Mon Sep 17 00:00:00 2001 From: Amin Ben Romdhane Date: Thu, 21 Sep 2023 16:01:46 +0200 Subject: [PATCH] Feature #12110: Update linkers based on unique keys --- bbfdmd/ubus/bbfdmd.c | 2 + libbbfdm-api/dmapi.c | 6 +- libbbfdm-api/dmapi.h | 9 +- libbbfdm-api/dmbbf.c | 157 +++++++++++-- libbbfdm-api/dmbbf.h | 2 + libbbfdm-api/dmcommon.h | 4 +- libbbfdm-api/dmentry.c | 83 ++++++- libbbfdm-api/dmentry.h | 3 + libbbfdm/dmdiagnostics.c | 16 +- libbbfdm/dmdiagnostics.h | 1 - libbbfdm/dmtree/tr143/diagnostics.c | 78 ++++--- libbbfdm/dmtree/tr181/atm.c | 39 ++-- libbbfdm/dmtree/tr181/bridging.c | 208 +++++++++--------- libbbfdm/dmtree/tr181/deviceinfo.c | 148 ++++--------- libbbfdm/dmtree/tr181/dhcpv4.c | 128 +++++------ libbbfdm/dmtree/tr181/dhcpv6.c | 82 ++++--- libbbfdm/dmtree/tr181/dns.c | 52 ++--- libbbfdm/dmtree/tr181/dsl.c | 19 +- libbbfdm/dmtree/tr181/dynamicdns.c | 59 +++-- libbbfdm/dmtree/tr181/ethernet.c | 128 +++++------ libbbfdm/dmtree/tr181/fast.c | 6 +- libbbfdm/dmtree/tr181/firewall.c | 49 +++-- libbbfdm/dmtree/tr181/gre.c | 12 +- libbbfdm/dmtree/tr181/ieee1905.c | 86 +++----- libbbfdm/dmtree/tr181/ip.c | 160 +++++++------- libbbfdm/dmtree/tr181/mqtt.c | 25 +-- libbbfdm/dmtree/tr181/nat.c | 50 ++--- libbbfdm/dmtree/tr181/ppp.c | 60 ++--- libbbfdm/dmtree/tr181/ptm.c | 90 +++----- libbbfdm/dmtree/tr181/qos.c | 124 ++++++----- libbbfdm/dmtree/tr181/routeradvertisement.c | 25 ++- libbbfdm/dmtree/tr181/routing.c | 67 +++--- libbbfdm/dmtree/tr181/security.c | 6 +- libbbfdm/dmtree/tr181/ssh.c | 26 +-- libbbfdm/dmtree/tr181/upnp.c | 96 +++----- libbbfdm/dmtree/tr181/usb.c | 66 +++--- libbbfdm/dmtree/tr181/userinterface.c | 24 +- libbbfdm/dmtree/tr181/wifi.c | 108 +++++---- libbbfdm/dmtree/tr181/wifi.dataelements.c | 119 +++++----- libbbfdm/dmtree/tr471/iplayercap.c | 11 +- .../dmtree/vendor/iopsys/tr181/ethernet.c | 46 ++-- libbbfdm/dmtree/vendor/iopsys/tr181/times.c | 6 +- .../vendor/iopsys/tr181/x_iopsys_eu_igmp.c | 64 +++--- .../vendor/iopsys/tr181/x_iopsys_eu_igmp.h | 2 +- .../vendor/iopsys/tr181/x_iopsys_eu_mld.c | 26 ++- 45 files changed, 1337 insertions(+), 1241 deletions(-) diff --git a/bbfdmd/ubus/bbfdmd.c b/bbfdmd/ubus/bbfdmd.c index 546e1991..8e3953a4 100644 --- a/bbfdmd/ubus/bbfdmd.c +++ b/bbfdmd/ubus/bbfdmd.c @@ -1513,6 +1513,8 @@ int main(int argc, char **argv) } } + is_micro_service = input_json ? true : false; + if (!input_json) // It's not a micro-service instance signal_init(); diff --git a/libbbfdm-api/dmapi.c b/libbbfdm-api/dmapi.c index 1d6550f8..63067178 100644 --- a/libbbfdm-api/dmapi.c +++ b/libbbfdm-api/dmapi.c @@ -194,9 +194,13 @@ int bbf_get_alias(struct dmctx *ctx, struct uci_section *s, char *option_name, c return -1; dmuci_get_value_by_section_string(s, option_name, value); - if ((*value)[0] == '\0') + if ((*value)[0] == '\0') { dmasprintf(value, "cpe-%s", instance); + // Store Alias value + dmuci_set_value_by_section(s, option_name, *value); + } + return 0; } diff --git a/libbbfdm-api/dmapi.h b/libbbfdm-api/dmapi.h index 84aee839..2a4682ed 100644 --- a/libbbfdm-api/dmapi.h +++ b/libbbfdm-api/dmapi.h @@ -32,6 +32,8 @@ extern struct dm_permession_s DMASYNC; extern char *DMT_TYPE[]; +extern bool is_micro_service; + #ifndef BBF_MAX_OBJECT_INSTANCES #define BBF_MAX_OBJECT_INSTANCES (255) #endif @@ -76,7 +78,7 @@ do { \ #define UBUS_ARGS (struct ubus_arg[]) #define RANGE_ARGS (struct range_args[]) -#define LIST_KEY (const char *[]) +#define LIST_KEY (const char *[]) // To be removed later!!!!!!!!!!!! #define DMPARAM_ARGS \ struct dmctx *dmctx, \ @@ -139,7 +141,7 @@ typedef struct dm_obj_s { struct dm_leaf_s *leaf; int (*get_linker)(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker); int bbfdm_type; - const char **unique_keys; + const char **unique_keys; // To be removed later!!!!!!!!!!!! } DMOBJ; struct dm_parameter { @@ -240,7 +242,8 @@ typedef struct { enum dm_flags_enum { DM_FLAG_REFERENCE = 1, - DM_FLAG_UNIQUE = 1<<1 + DM_FLAG_UNIQUE = 1<<1, + DM_FLAG_LINKER = 1<<2 }; enum set_value_action { diff --git a/libbbfdm-api/dmbbf.c b/libbbfdm-api/dmbbf.c index 0da48a26..4d799dfa 100644 --- a/libbbfdm-api/dmbbf.c +++ b/libbbfdm-api/dmbbf.c @@ -40,6 +40,8 @@ struct dm_permession_s DMWRITE = {"1", NULL}; struct dm_permession_s DMSYNC = {"sync", NULL}; struct dm_permession_s DMASYNC = {"async", NULL}; +bool is_micro_service = false; + static bool is_instance_number_alias(char **str) { char *s = *str; @@ -840,16 +842,21 @@ static int is64digit(char c) return 0; } -static char *get_value_by_reference(struct dmctx *ctx, char *value, bool is_micro_service) +static char *get_value_by_reference(struct dmctx *ctx, char *value) { char *pch = NULL, *spch = NULL, *val = NULL; char buf[MAX_DM_PATH * 4] = {0}; + char buf_val[MAX_DM_PATH * 4] = {0}; + bool path_resolved = false; + unsigned pos = 0; - if (DM_STRLEN(value) == 0) + if (DM_STRLEN(value) == 0 || !DM_STRSTR(value, "==")) return value; DM_STRNCPY(buf, value, sizeof(buf)); + buf_val[0] = 0; + for (pch = strtok_r(buf, ",", &spch); pch; pch = strtok_r(NULL, ",", &spch)) { char path[MAX_DM_PATH] = {0}; char key_name[256], key_value[256]; @@ -876,12 +883,19 @@ static char *get_value_by_reference(struct dmctx *ctx, char *value, bool is_micr adm_entry_get_reference_param(ctx, path, key_value, &val); - if (DM_STRLEN(val)) - return val; + if (DM_STRLEN(val)) { + path_resolved = true; + pos += snprintf(&buf_val[pos], sizeof(buf_val) - pos, "%s,", val); + } + } + + if (path_resolved) { + buf_val[pos - 1] = 0; + return dmstrdup(buf_val); } end: - return !is_micro_service ? value : ""; + return is_micro_service ? value : ""; } static char *check_value_by_type(char *value, int type) @@ -1030,7 +1044,7 @@ static int get_ubus_value(struct dmctx *dmctx, struct dmnode *node) const char *flag = json_object_get_string(flag_obj); if (DM_STRCMP(flag, "Reference") == 0) { - data = get_value_by_reference(dmctx, data, true); + data = get_value_by_reference(dmctx, data); dm_falgs |= DM_FLAG_REFERENCE; } else if (DM_STRCMP(flag, "Unique") == 0) { dm_falgs |= DM_FLAG_UNIQUE; @@ -1340,7 +1354,7 @@ static int set_ubus_value(struct dmctx *dmctx, struct dmnode *node) if (is_reference_parameter(ubus_name, dmctx->in_param, in_args)) { char *linker = NULL; - adm_entry_get_linker_value(dmctx, dmctx->in_value, &linker); + adm_entry_get_reference_value(dmctx, dmctx->in_value, &linker); snprintf(param_value, sizeof(param_value), "%s=>%s", dmctx->in_value, linker ? linker : ""); } else { @@ -1519,7 +1533,7 @@ static int get_value_param(DMPARAM_ARGS) if (value && *value) { if (leaf->dm_falgs & DM_FLAG_REFERENCE) { - value = get_value_by_reference(dmctx, value, false); + value = get_value_by_reference(dmctx, value); } else value = check_value_by_type(value, leaf->type); } else { @@ -1567,7 +1581,7 @@ static int mparam_get_value_in_param(DMPARAM_ARGS) if (value && *value) { if (leaf->dm_falgs & DM_FLAG_REFERENCE) { - value = get_value_by_reference(dmctx, value, false); + value = get_value_by_reference(dmctx, value); } else value = check_value_by_type(value, leaf->type); } else { @@ -1828,8 +1842,22 @@ static int mobj_get_supported_dm(DMOBJECT_ARGS) const char **unique_keys = NULL; if (node->matched && dmctx->isinfo) { - if (node->obj) - unique_keys = node->obj->unique_keys; + if (node->obj) { + unique_keys = node->obj->unique_keys; // To be removed later!!!!!!!!!!!! + if (unique_keys == NULL) { + struct dm_leaf_s *leaf = node->obj->leaf; + unsigned int idx = 1; + + for (; (leaf && leaf->parameter); leaf++) { + if (leaf->dm_falgs & DM_FLAG_UNIQUE) { + idx++; + unique_keys = dmrealloc(unique_keys, idx * sizeof(char *)); + unique_keys[idx - 2] = dmstrdup(leaf->parameter); + unique_keys[idx - 1] = NULL; + } + } + } + } add_list_parameter(dmctx, refparam, perm, "xsd:object", (char *)unique_keys); } @@ -2102,6 +2130,7 @@ static int mparam_set_value(DMPARAM_ARGS) return FAULT_9005; dmctx->stop = 1; + dmctx->setaction = VALUECHECK; char *perm = leaf->permission->val; if (leaf->permission->get_permission != NULL) @@ -2131,14 +2160,22 @@ static int mparam_set_value(DMPARAM_ARGS) if ((leaf->dm_falgs & DM_FLAG_REFERENCE) && !DM_STRSTR(dmctx->in_value, "=>")) { char *linker = NULL; - adm_entry_get_linker_value(dmctx, dmctx->in_value, &linker); + adm_entry_get_reference_value(dmctx, dmctx->in_value, &linker); snprintf(param_value, sizeof(param_value), "%s=>%s", dmctx->in_value, linker ? linker : ""); } else { snprintf(param_value, sizeof(param_value), "%s", dmctx->in_value); } - return (leaf->setvalue)(refparam, dmctx, data, instance, param_value, dmctx->setaction); + char *param_val = dmstrdup(param_value); + + int fault = (leaf->setvalue)(refparam, dmctx, data, instance, param_value, dmctx->setaction); + if (fault) + return fault; + + dmctx->setaction = VALUESET; + + return (leaf->setvalue)(refparam, dmctx, data, instance, param_val, dmctx->setaction); } } @@ -2313,6 +2350,100 @@ int dm_entry_get_linker_value(struct dmctx *dmctx) return (dmctx->stop) ? err : FAULT_9005; } +/****************** + * get reference value + *****************/ +static int get_reference_value_check_obj(DMOBJECT_ARGS) +{ + if (DM_STRCMP(node->current_object, dmctx->in_param) == 0) { + + if (!data || !instance) + return FAULT_9005; + + struct dm_leaf_s *leaf = node->obj->leaf; + if (!leaf) + return FAULT_9005; + + for (; (leaf && leaf->parameter); leaf++) { + + if (leaf->dm_falgs & DM_FLAG_LINKER) { + char *full_param = NULL; + char *link_val = NULL; + + dmastrcat(&full_param, node->current_object, leaf->parameter); + + (leaf->getvalue)(full_param, dmctx, data, instance, &link_val); + + dmctx->linker = link_val ? dmstrdup(link_val) : ""; + dmctx->stop = true; + return 0; + } + } + } + + return FAULT_9005; +} + +static int get_reference_value_check_param(DMPARAM_ARGS) +{ + return FAULT_9005; +} + +int dm_entry_get_reference_value(struct dmctx *dmctx) +{ + int err = 0; + DMOBJ *root = dmctx->dm_entryobj; + DMNODE node = { .current_object = "" }; + + dmctx->method_obj = get_reference_value_check_obj; + dmctx->method_param = get_reference_value_check_param; + dmctx->checkobj = plugin_obj_match; + dmctx->checkleaf = plugin_leaf_match; + dmentry_instance_lookup_inparam(dmctx); + + err = dm_browse(dmctx, &node, root, NULL, NULL); + + return (dmctx->stop) ? err : FAULT_9005; +} + +/****************** + * object exists + *****************/ +static int object_exists_check_obj(DMOBJECT_ARGS) +{ + if (!get_linker) + return FAULT_9005; + + if (DM_STRCMP(node->current_object, dmctx->in_param) == 0) { + dmctx->match = true; + dmctx->stop = true; + return 0; + } + return FAULT_9005; +} + +static int object_exists_check_param(DMPARAM_ARGS) +{ + return FAULT_9005; +} + +int dm_entry_object_exists(struct dmctx *dmctx) +{ + int err = 0; + DMOBJ *root = dmctx->dm_entryobj; + DMNODE node = { .current_object = "" }; + + dmctx->method_obj = object_exists_check_obj; + dmctx->method_param = object_exists_check_param; + dmctx->checkobj = plugin_obj_match; + dmctx->checkleaf = plugin_leaf_match; + dmentry_instance_lookup_inparam(dmctx); + + err = dm_browse(dmctx, &node, root, NULL, NULL); + + return (dmctx->stop) ? err : FAULT_9005; +} + /* ************** * Operate * **************/ diff --git a/libbbfdm-api/dmbbf.h b/libbbfdm-api/dmbbf.h index a9d1a1dc..e350baa9 100644 --- a/libbbfdm-api/dmbbf.h +++ b/libbbfdm-api/dmbbf.h @@ -42,8 +42,10 @@ int dm_entry_get_instances(struct dmctx *ctx); int dm_entry_add_object(struct dmctx *dmctx); int dm_entry_delete_object(struct dmctx *dmctx); int dm_entry_set_value(struct dmctx *dmctx); +int dm_entry_object_exists(struct dmctx *dmctx); int dm_entry_operate(struct dmctx *dmctx); int dm_entry_get_reference_param(struct dmctx *dmctx); +int dm_entry_get_reference_value(struct dmctx *dmctx); int dm_entry_get_linker(struct dmctx *dmctx); int dm_entry_get_linker_value(struct dmctx *dmctx); int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance); diff --git a/libbbfdm-api/dmcommon.h b/libbbfdm-api/dmcommon.h index d1d6348f..ab9bf682 100644 --- a/libbbfdm-api/dmcommon.h +++ b/libbbfdm-api/dmcommon.h @@ -136,7 +136,7 @@ extern char *RateAdjAlgorithm[]; #define SYSTEM_CERT_PATH "/etc/ssl/certs" #define BOARD_JSON_FILE "/etc/board.json" #define DMMAP "dmmap" -#define LIST_KEY (const char *[]) +#define LIST_KEY (const char *[]) // To be removed later!!!!!!!!!!!! #define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100) #define DM_ASSERT(X, Y) \ @@ -227,10 +227,12 @@ void get_dmmap_section_of_config_section_eq(char* dmmap_package, char* section_t void get_dmmap_section_of_config_section_cont(char* dmmap_package, char* section_type, char *opt, char* value, struct uci_section **dmmap_section); void get_config_section_of_dmmap_section(char* package, char* section_type, char *section_name, struct uci_section **config_section); int adm_entry_get_reference_param(struct dmctx *ctx, char *param, char *linker, char **value); +int adm_entry_get_reference_value(struct dmctx *ctx, char *param, char **value); int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value); int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value); int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]); int dm_entry_validate_external_linker_allowed_objects(struct dmctx *ctx, char *value, char *objects[]); +int dm_validate_allowed_objects(struct dmctx *ctx, struct dm_reference *reference, char *objects[]); char *check_create_dmmap_package(const char *dmmap_package); unsigned int count_occurrences(char *str, char c); unsigned char isdigit_str(char *str); diff --git a/libbbfdm-api/dmentry.c b/libbbfdm-api/dmentry.c index 50383eea..3cc24ef7 100644 --- a/libbbfdm-api/dmentry.c +++ b/libbbfdm-api/dmentry.c @@ -229,13 +229,6 @@ int bbf_entry_method(struct dmctx *ctx, int cmd) fault = dm_entry_get_name(ctx); break; case BBF_SET_VALUE: - ctx->setaction = VALUECHECK; - fault = dm_entry_set_value(ctx); - if (fault) - break; - - ctx->setaction = VALUESET; - ctx->stop = false; fault = dm_entry_set_value(ctx); if (!fault) dmuci_change_packages(&head_package_change); @@ -270,7 +263,7 @@ void bbf_global_clean(DMOBJ *dm_entryobj, DM_MAP_VENDOR *dm_VendorExtension[], D dm_dynamic_cleanmem(&global_memhead); } -int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]) +int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]) // To be removed later!!!!!!!!!!!! { if (!value || !objects) return -1; @@ -293,7 +286,7 @@ int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *obje return -1; } -int dm_entry_validate_external_linker_allowed_objects(struct dmctx *ctx, char *value, char *objects[]) +int dm_entry_validate_external_linker_allowed_objects(struct dmctx *ctx, char *value, char *objects[]) // To be removed later!!!!!!!!!!!! { if (!value || !objects) return -1; @@ -311,6 +304,27 @@ int dm_entry_validate_external_linker_allowed_objects(struct dmctx *ctx, char *v return -1; } +int dm_validate_allowed_objects(struct dmctx *ctx, struct dm_reference *reference, char *objects[]) +{ + if (!reference || !objects) + return -1; + + if (DM_STRLEN(reference->path) == 0) + return 0; + + for (; *objects; objects++) { + + if (match(reference->path, *objects, 0, NULL)) { + + if (DM_STRLEN(reference->value)) + return 0; + } + } + + bbfdm_set_fault_message(ctx, "'%s' value is not allowed.", reference->path); + return -1; +} + int adm_entry_get_reference_param(struct dmctx *ctx, char *param, char *linker, char **value) { struct dmctx dmctx = {0}; @@ -327,13 +341,37 @@ int adm_entry_get_reference_param(struct dmctx *ctx, char *param, char *linker, dmctx.linker = linker; dm_entry_get_reference_param(&dmctx); - *value = dmctx.linker_param; + + *value = dmctx.linker_param ? dmctx.linker_param : ""; bbf_ctx_clean_sub(&dmctx); return 0; } -int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value) +int adm_entry_get_reference_value(struct dmctx *ctx, char *param, char **value) +{ + struct dmctx dmctx = {0}; + char linker[256] = {0}; + *value = NULL; + + if (!param || param[0] == '\0') + return 0; + + snprintf(linker, sizeof(linker), "%s%c", param, (param[DM_STRLEN(param) - 1] != '.') ? '.' : '\0'); + + bbf_ctx_init_sub(&dmctx, ctx->dm_entryobj, ctx->dm_vendor_extension, ctx->dm_vendor_extension_exclude); + + dmctx.in_param = linker; + + dm_entry_get_reference_value(&dmctx); + + *value = dmctx.linker; + + bbf_ctx_clean_sub(&dmctx); + return 0; +} + +int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value) // To be removed later!!!!!!!!!!!! { struct dmctx dmctx = {0}; *value = ""; @@ -353,7 +391,7 @@ int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, cha return 0; } -int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value) +int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value) // To be removed later!!!!!!!!!!!! { struct dmctx dmctx = {0}; char linker[256] = {0}; @@ -375,6 +413,27 @@ int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value) return 0; } +bool adm_entry_object_exists(struct dmctx *ctx, char *param) +{ + struct dmctx dmctx = {0}; + char linker[256] = {0}; + + if (!param || param[0] == '\0') + return false; + + snprintf(linker, sizeof(linker), "%s%c", param, (param[DM_STRLEN(param) - 1] != '.') ? '.' : '\0'); + + bbf_ctx_init_sub(&dmctx, ctx->dm_entryobj, ctx->dm_vendor_extension, ctx->dm_vendor_extension_exclude); + + dmctx.in_param = linker; + + dm_entry_object_exists(&dmctx); + + bbf_ctx_clean_sub(&dmctx); + + return dmctx.match; +} + void bbf_entry_restart_services(struct blob_buf *bb, bool restart_services) { struct package_change *pc = NULL; diff --git a/libbbfdm-api/dmentry.h b/libbbfdm-api/dmentry.h index 164411f1..3e09e996 100644 --- a/libbbfdm-api/dmentry.h +++ b/libbbfdm-api/dmentry.h @@ -34,6 +34,9 @@ void bbf_global_clean(DMOBJ *dm_entryobj, DM_MAP_VENDOR *dm_VendorExtension[], D int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]); int dm_entry_validate_external_linker_allowed_objects(struct dmctx *ctx, char *value, char *objects[]); +int dm_validate_allowed_objects(struct dmctx *ctx, struct dm_reference *reference, char *objects[]); + +bool adm_entry_object_exists(struct dmctx *ctx, char *param); int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value); int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value); diff --git a/libbbfdm/dmdiagnostics.c b/libbbfdm/dmdiagnostics.c index 935b3bac..39609690 100644 --- a/libbbfdm/dmdiagnostics.c +++ b/libbbfdm/dmdiagnostics.c @@ -72,24 +72,10 @@ char *get_diagnostics_interface_option(struct dmctx *ctx, char *value) if (strncmp(value, "Device.IP.Interface.", 20) != 0) return ""; - adm_entry_get_linker_value(ctx, value, &linker); + adm_entry_get_reference_value(ctx, value, &linker); return linker ? linker : ""; } -void set_diagnostics_interface_option(struct dmctx *ctx, char *sec_name, char *value) -{ - char *linker = NULL; - - if (!value || *value == 0) - return; - - if (strncmp(value, "Device.IP.Interface.", 20) != 0) - return; - - adm_entry_get_linker_value(ctx, value, &linker); - set_diagnostics_option(sec_name, "interface", linker ? linker : ""); -} - static bool get_response_code_status(const char *url, int response_code) { if ((strncmp(url, HTTP_URI, strlen(HTTP_URI)) == 0 && response_code != 200) || diff --git a/libbbfdm/dmdiagnostics.h b/libbbfdm/dmdiagnostics.h index 4ab3cf1e..f7d8af58 100644 --- a/libbbfdm/dmdiagnostics.h +++ b/libbbfdm/dmdiagnostics.h @@ -46,7 +46,6 @@ char *get_diagnostics_option_fallback_def(char *sec_name, char *option, char *de void set_diagnostics_option(char *sec_name, char *option, char *value); void reset_diagnostic_state(char *sec_name); char *get_diagnostics_interface_option(struct dmctx *ctx, char *value); -void set_diagnostics_interface_option(struct dmctx *ctx, char *sec_name, char *value); int bbf_upload_log(const char *url, const char *username, const char *password, char *config_name, const char *command, const char *obj_path); int bbf_config_backup(const char *url, const char *username, const char *password, diff --git a/libbbfdm/dmtree/tr143/diagnostics.c b/libbbfdm/dmtree/tr143/diagnostics.c index b466f9de..b6fe625a 100644 --- a/libbbfdm/dmtree/tr143/diagnostics.c +++ b/libbbfdm/dmtree/tr143/diagnostics.c @@ -62,26 +62,29 @@ static int set_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void static int get_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("ipping", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("ipping"); - set_diagnostics_interface_option(ctx, "ipping", value); + set_diagnostics_option("ipping", "interface", reference.value); return 0; } return 0; @@ -295,26 +298,29 @@ static int set_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct d static int get_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("traceroute", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("traceroute"); - set_diagnostics_interface_option(ctx, "traceroute", value); + set_diagnostics_option("traceroute", "interface", reference.value); return 0; } return 0; @@ -537,26 +543,29 @@ static int set_IPDiagnosticsDownloadDiagnostics_DiagnosticsState(char *refparam, static int get_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("download", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("download"); - set_diagnostics_interface_option(ctx, "download", value); + set_diagnostics_option("download", "interface", reference.value); return 0; } return 0; @@ -863,26 +872,29 @@ static int set_IPDiagnosticsUploadDiagnostics_DiagnosticsState(char *refparam, s static int get_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("upload", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("upload"); - set_diagnostics_interface_option(ctx, "upload", value); + set_diagnostics_option("upload", "interface", reference.value); return 0; } return 0; @@ -1205,26 +1217,29 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam, static int get_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("udpechodiag", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("udpechodiag"); - set_diagnostics_interface_option(ctx, "udpechodiag", value); + set_diagnostics_option("udpechodiag", "interface", reference.value); return 0; } return 0; @@ -1462,26 +1477,29 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *re static int get_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("serverselection", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("serverselection"); - set_diagnostics_interface_option(ctx, "serverselection", value); + set_diagnostics_option("serverselection", "interface", reference.value); return 0; } return 0; @@ -2414,7 +2432,7 @@ DMLEAF tIPDiagnosticsParams[] = { DMLEAF tIPDiagnosticsIPPingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_ip_ping_diagnostics_state, set_ip_ping_diagnostics_state, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_ip_ping_interface, set_ip_ping_interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_ip_ping_interface, set_ip_ping_interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"ProtocolVersion", &DMWRITE, DMT_STRING, get_ip_ping_protocolversion, set_ip_ping_protocolversion, BBFDM_CWMP}, {"Host", &DMWRITE, DMT_STRING, get_ip_ping_host, set_ip_ping_host, BBFDM_CWMP}, {"NumberOfRepetitions", &DMWRITE, DMT_UNINT, get_ip_ping_repetition_number, set_ip_ping_repetition_number, BBFDM_CWMP}, @@ -2443,7 +2461,7 @@ DMOBJ tIPDiagnosticsTraceRouteObj[] = { DMLEAF tIPDiagnosticsTraceRouteParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_DiagnosticsState, set_IPDiagnosticsTraceRoute_DiagnosticsState, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_Interface, set_IPDiagnosticsTraceRoute_Interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_Interface, set_IPDiagnosticsTraceRoute_Interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_ProtocolVersion, set_IPDiagnosticsTraceRoute_ProtocolVersion, BBFDM_CWMP}, {"Host", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_Host, set_IPDiagnosticsTraceRoute_Host, BBFDM_CWMP}, {"NumberOfTries", &DMWRITE, DMT_UNINT, get_IPDiagnosticsTraceRoute_NumberOfTries, set_IPDiagnosticsTraceRoute_NumberOfTries, BBFDM_CWMP}, @@ -2477,7 +2495,7 @@ DMOBJ tIPDiagnosticsDownloadDiagnosticsObj[] = { DMLEAF tIPDiagnosticsDownloadDiagnosticsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_DiagnosticsState, set_IPDiagnosticsDownloadDiagnostics_DiagnosticsState, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_Interface, set_IPDiagnosticsDownloadDiagnostics_Interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_Interface, set_IPDiagnosticsDownloadDiagnostics_Interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"DownloadURL", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_DownloadURL, set_IPDiagnosticsDownloadDiagnostics_DownloadURL, BBFDM_CWMP}, {"DownloadTransports", &DMREAD, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_DownloadTransports, NULL, BBFDM_CWMP}, {"DownloadDiagnosticMaxConnections", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_DownloadDiagnosticMaxConnections,NULL, BBFDM_CWMP}, @@ -2527,7 +2545,7 @@ DMOBJ tIPDiagnosticsUploadDiagnosticsObj[] = { DMLEAF tIPDiagnosticsUploadDiagnosticsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_DiagnosticsState, set_IPDiagnosticsUploadDiagnostics_DiagnosticsState, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_Interface, set_IPDiagnosticsUploadDiagnostics_Interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_Interface, set_IPDiagnosticsUploadDiagnostics_Interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"UploadURL", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_UploadURL, set_IPDiagnosticsUploadDiagnostics_UploadURL, BBFDM_CWMP}, {"UploadTransports", &DMREAD, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_UploadTransports, NULL, BBFDM_CWMP}, {"DSCP", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_DSCP, set_IPDiagnosticsUploadDiagnostics_DSCP, BBFDM_CWMP}, @@ -2571,7 +2589,7 @@ DMLEAF tIPDiagnosticsUploadDiagnosticsPerConnectionResultParams[] = { DMLEAF tIPDiagnosticsUDPEchoDiagnosticsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState, set_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_Interface, set_IPDiagnosticsUDPEchoDiagnostics_Interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_Interface, set_IPDiagnosticsUDPEchoDiagnostics_Interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"Host", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_Host, set_IPDiagnosticsUDPEchoDiagnostics_Host, BBFDM_CWMP}, {"Port", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_Port, set_IPDiagnosticsUDPEchoDiagnostics_Port, BBFDM_CWMP}, {"NumberOfRepetitions", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions, set_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions, BBFDM_CWMP}, @@ -2593,7 +2611,7 @@ DMLEAF tIPDiagnosticsUDPEchoDiagnosticsParams[] = { DMLEAF tIPDiagnosticsServerSelectionDiagnosticsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState, set_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_Interface, set_IPDiagnosticsServerSelectionDiagnostics_Interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_Interface, set_IPDiagnosticsServerSelectionDiagnostics_Interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion, set_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion, BBFDM_CWMP}, {"Protocol", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_Protocol, set_IPDiagnosticsServerSelectionDiagnostics_Protocol, BBFDM_CWMP}, {"HostList", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_HostList, set_IPDiagnosticsServerSelectionDiagnostics_HostList, BBFDM_CWMP}, diff --git a/libbbfdm/dmtree/tr181/atm.c b/libbbfdm/dmtree/tr181/atm.c index c53b52e7..bc6020f2 100644 --- a/libbbfdm/dmtree/tr181/atm.c +++ b/libbbfdm/dmtree/tr181/atm.c @@ -266,31 +266,38 @@ static int set_atm_link_type(char *refparam, struct dmctx *ctx, void *data, char static int get_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = NULL; - char atm_file[128]; + dmuci_get_value_by_section_string((((struct atm_args *)data)->sections)->dmmap_section, "LowerLayers", value); - dmuci_get_value_by_section_string((((struct atm_args *)data)->sections)->dmmap_section, "atm_ll_link", &linker); - adm_entry_get_linker_param(ctx, "Device.DSL.Channel.", linker, value); - if (*value != NULL && (*value)[0] != '\0') - return 0; + if ((*value)[0] == '\0') { + char atm_file[128]; - snprintf(atm_file, sizeof(atm_file), "/sys/class/net/atm%ld", DM_STRTOL(instance) - 1); - if (folder_exists(atm_file)) { - *value = "Device.DSL.Channel.1"; - dmuci_set_value_by_section((((struct atm_args *)data)->sections)->dmmap_section, "atm_ll_link", "dsl_channel_1"); + snprintf(atm_file, sizeof(atm_file), "/sys/class/net/atm%ld", DM_STRTOL(instance) - 1); + if (folder_exists(atm_file)) + adm_entry_get_reference_param(ctx, "Device.DSL.Channel.*.Name", instance, value); + + // Store LowerLayers value + dmuci_set_value_by_section((((struct atm_args *)data)->sections)->dmmap_section, "LowerLayers", *value); + } else { + if (!adm_entry_object_exists(ctx, *value)) + *value = ""; } + return 0; } static int set_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); + switch (action) { case VALUECHECK: - if (DM_LSTRNCMP(value, "Device.DSL.Channel.1", strlen("Device.DSL.Channel.1")) != 0) + if (DM_LSTRNCMP(reference.path, "Device.DSL.Channel.1", strlen("Device.DSL.Channel.1")) != 0) return FAULT_9007; break; case VALUESET: - dmuci_set_value_by_section((((struct atm_args *)data)->sections)->dmmap_section, "atm_ll_link", "dsl_channel_1"); + dmuci_set_value_by_section((((struct atm_args *)data)->sections)->dmmap_section, "LowerLayers", reference.path); break; } return 0; @@ -382,7 +389,7 @@ static int set_atm_alias(char *refparam, struct dmctx *ctx, void *data, char *in /*** ATM. ***/ DMOBJ tATMObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/ -{"Link", &DMWRITE, add_atm_link, delete_atm_link, NULL, browseAtmLinkInst, NULL, NULL, tATMLinkObj, tATMLinkParams, get_atm_linker, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Link", &DMWRITE, add_atm_link, delete_atm_link, NULL, browseAtmLinkInst, NULL, NULL, tATMLinkObj, tATMLinkParams, get_atm_linker, BBFDM_BOTH, NULL}, {0} }; @@ -395,11 +402,11 @@ DMOBJ tATMLinkObj[] = { DMLEAF tATMLinkParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ -{"Alias", &DMWRITE, DMT_STRING, get_atm_alias, set_atm_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_atm_alias, set_atm_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_atm_enable, set_atm_enable, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_atm_link_name, NULL, BBFDM_BOTH}, +{"Name", &DMREAD, DMT_STRING, get_atm_link_name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"Status", &DMREAD, DMT_STRING, get_atm_status, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_atm_lower_layer, set_atm_lower_layer, BBFDM_BOTH}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_atm_lower_layer, set_atm_lower_layer, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"LinkType", &DMWRITE, DMT_STRING, get_atm_link_type, set_atm_link_type, BBFDM_BOTH}, {"DestinationAddress", &DMWRITE, DMT_STRING, get_atm_destination_address, set_atm_destination_address, BBFDM_BOTH}, {"Encapsulation", &DMWRITE, DMT_STRING, get_atm_encapsulation, set_atm_encapsulation, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/bridging.c b/libbbfdm/dmtree/tr181/bridging.c index 3170bbf1..ef0a63cd 100644 --- a/libbbfdm/dmtree/tr181/bridging.c +++ b/libbbfdm/dmtree/tr181/bridging.c @@ -1974,12 +1974,7 @@ static int get_BridgingBridgePort_Name(char *refparam, struct dmctx *ctx, void * { struct bridge_port_args *args = (struct bridge_port_args *)data; - if (args->is_management_port) { - *value = ""; - } else { - dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "port", value); - } - + dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "port", value); return 0; } @@ -1989,59 +1984,70 @@ static int get_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, struct uci_section *port_s = NULL; if (args->is_management_port) { - char lbuf[1024] = {0}; + char buf[1024] = {0}; unsigned pos = 0; - lbuf[0] = 0; - uci_path_foreach_option_eq(bbfdm, "dmmap_bridge_port", "bridge_port", "br_inst", args->br_inst, port_s) { - char *curr_port_s = section_name(port_s); + buf[0] = 0; - if (strcmp(curr_port_s, section_name(args->bridge_port_dmmap_sec)) == 0) + uci_path_foreach_option_eq(bbfdm, "dmmap_bridge_port", "bridge_port", "br_inst", args->br_inst, port_s) { + char *mg_port = NULL; + char *port = NULL; + char br_buf[64] = {0}; + + snprintf(br_buf, sizeof(br_buf), "Device.Bridging.Bridge.%s.Port.*.Name", args->br_inst); + + dmuci_get_value_by_section_string(port_s, "management", &mg_port); + if (DM_LSTRCMP(mg_port, "1") == 0) continue; - adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", curr_port_s, value); - if (*value && (*value)[0] != 0) - pos += snprintf(&lbuf[pos], sizeof(lbuf) - pos, "%s,", *value); + dmuci_get_value_by_section_string(port_s, "port", &port); + + adm_entry_get_reference_param(ctx, br_buf, port, value); + if (DM_STRLEN(*value)) + pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", *value); } if (pos) - lbuf[pos - 1] = 0; + buf[pos - 1] = 0; - *value = dmstrdup(lbuf); + *value = dmstrdup(buf); } else { - char *type = NULL; - char *port = NULL; - char *config = NULL; + dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "LowerLayers", value); - dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "port", &port); - if (DM_STRLEN(port) == 0) - return 0; + if ((*value)[0] == '\0') { + char *type = NULL, *port = NULL, *config = NULL; - dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "type", &type); - if (DM_STRCMP(type, "34984") == 0) { - dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "LowerLayer", value); - return 0; - } - - dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "config", &config); - - if (DM_LSTRCMP(config, "network") == 0) { - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", port, value); - if (!(*value) || (*value)[0] == 0) { - char *tag = DM_STRRCHR(port, '.'); - if (tag) tag[0] = '\0'; - } else { + dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "type", &type); + if (DM_STRCMP(type, "34984") == 0) return 0; - } - } - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", port, value); - if (!(*value) || (*value)[0] == 0) { - struct uci_section *iface_s = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", port); - if (iface_s) - adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", section_name(iface_s), value); + dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "port", &port); + if (DM_STRLEN(port) == 0) + return 0; + + dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "config", &config); + + if (DM_LSTRCMP(config, "network") == 0) { + struct uci_section *eth_iface_s = ethernet___get_ethernet_interface_section(port); + if (!eth_iface_s) { + char *tag = DM_STRRCHR(port, '.'); + if (tag) tag[0] = '\0'; + } + + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", port, value); + } else { + struct uci_section *iface_s = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", port); + adm_entry_get_reference_param(ctx, "Device.WiFi.SSID.*.Name", section_name(iface_s), value); + } + + // Store LowerLayers value + dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "LowerLayers", *value); + } else { + if (!adm_entry_object_exists(ctx, *value)) + *value = ""; } } + return 0; } @@ -2051,23 +2057,25 @@ static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, bool is_wireless_config = false; char *port_enabled = NULL; char *port_device = NULL; - char *linker = NULL; char *type = NULL; char *allowed_objects[] = { "Device.Ethernet.Interface.", "Device.WiFi.SSID.", "Device.Bridging.Bridge.*.Port.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; if (args->is_management_port) return 0; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "type", &type); @@ -2079,41 +2087,35 @@ static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, if (args->is_management_port) return 0; - adm_entry_get_linker_value(ctx, value, &linker); + // Store LowerLayers value under dmmap section + dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "LowerLayers", reference.path); - if (!linker || *linker == 0) { + if (DM_STRLEN(reference.value) == 0) { dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "port", ""); return 0; } dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "port", &port_device); - if (DM_STRCMP(linker, port_device) == 0) // Same as already configured + if (DM_STRCMP(reference.value, port_device) == 0) // Same as already configured return 0; // Update config section on dmmap_bridge_port if the linker is wirelss port or network port - if (DM_LSTRNCMP(value, "Device.WiFi.SSID.", 17) == 0) { + if (DM_LSTRNCMP(reference.path, "Device.WiFi.SSID.", 17) == 0) { dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "config", "wireless"); is_wireless_config = true; } else dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "config", "network"); - if (match(value, "Device.Bridging.Bridge.*.Port.", 0, NULL)) { - struct uci_section *s = get_origin_section_from_dmmap("dmmap_bridge_port", "bridge_port", linker); - dmuci_get_value_by_section_string(s, "port", &linker); - - dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "LowerLayer", value); - } - dmuci_get_value_by_section_string(args->bridge_port_dmmap_sec, "enabled", &port_enabled); if (port_device[0] == '\0') { if (DM_STRCMP(port_enabled, "1") == 0) { // Add port to ports list - add_port_to_bridge_sections(args->bridge_sec, args->bridge_dmmap_sec, linker); + add_port_to_bridge_sections(args->bridge_sec, args->bridge_dmmap_sec, reference.value); } // Update port option in dmmap - dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "port", linker); + dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "port", reference.value); } else { if (DM_STRCMP(port_enabled, "1") == 0) { @@ -2126,7 +2128,7 @@ static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, if (tag && !is_wireless_config) { char new_name[32] = {0}; - snprintf(new_name, sizeof(new_name), "%s.%s", linker, tag + 1); + snprintf(new_name, sizeof(new_name), "%s.%s", reference.value, tag + 1); if (DM_STRCMP(port_enabled, "1") == 0) { // Add port to ports list @@ -2140,7 +2142,7 @@ static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, if (args->bridge_port_sec) { struct uci_section *s = NULL; - dmuci_set_value_by_section(args->bridge_port_sec, "ifname", linker); + dmuci_set_value_by_section(args->bridge_port_sec, "ifname", reference.value); dmuci_set_value_by_section(args->bridge_port_sec, "name", new_name); s = get_dup_section_in_dmmap("dmmap_bridge_vlanport", "bridge_vlanport", section_name(args->bridge_port_sec)); dmuci_set_value_by_section(s, "name", new_name); @@ -2148,11 +2150,11 @@ static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, } else { if (DM_STRCMP(port_enabled, "1") == 0) { // Add port to ports list - add_port_to_bridge_sections(args->bridge_sec, args->bridge_dmmap_sec, linker); + add_port_to_bridge_sections(args->bridge_sec, args->bridge_dmmap_sec, reference.value); } // Update port option in dmmap - dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "port", linker); + dmuci_set_value_by_section(args->bridge_port_dmmap_sec, "port", reference.value); } } return 0; @@ -2623,10 +2625,10 @@ static int get_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, vo if (DM_STRLEN(vid) == 0) { *value = ""; } else { - char br_vlan_path[32] = {0}; + char br_vlan_path[64] = {0}; - snprintf(br_vlan_path, sizeof(br_vlan_path),"Device.Bridging.Bridge.%s.VLAN.", args->br_inst); - adm_entry_get_linker_param(ctx, br_vlan_path, vid, value); + snprintf(br_vlan_path, sizeof(br_vlan_path), "Device.Bridging.Bridge.%s.VLAN.*.VLANID", args->br_inst); + adm_entry_get_reference_param(ctx, br_vlan_path, vid, value); } return 0; } @@ -2639,17 +2641,19 @@ static int set_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, vo lower_layer_path, NULL}; char *ifname = NULL, *name = NULL, *vid = NULL; - char *linker = NULL; char new_name[32] = {0}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); snprintf(lower_layer_path, sizeof(lower_layer_path), "Device.Bridging.Bridge.%s.VLAN.", args->br_inst); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; @@ -2659,16 +2663,14 @@ static int set_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, vo dmuci_get_value_by_section_string(args->bridge_vlanport_sec, "name", &name); dmuci_get_value_by_section_string(args->bridge_vlanport_sec, "vid", &vid); - adm_entry_get_linker_value(ctx, value, &linker); - - if (DM_STRLEN(linker) == 0 && DM_STRLEN(vid) == 0) + if (DM_STRLEN(reference.value) == 0 && DM_STRLEN(vid) == 0) return 0; if (DM_STRLEN(name) != 0) { char *enable = NULL; /* create name option */ - snprintf(new_name, sizeof(new_name), "%s%s%s", ifname , (DM_STRLEN(linker) == 0) ? "": ".", (DM_STRLEN(linker) == 0) ? "": linker); + snprintf(new_name, sizeof(new_name), "%s%s%s", ifname , (DM_STRLEN(reference.value) == 0) ? "": ".", (DM_STRLEN(reference.value) == 0) ? "": reference.value); /* Update device network section */ dmuci_set_value_by_section(args->bridge_vlanport_sec, "name", new_name); @@ -2690,7 +2692,7 @@ static int set_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, vo dmuci_set_value_by_section(args->bridge_vlanport_dmmap_sec, "name", new_name); } - dmuci_set_value_by_section(args->bridge_vlanport_sec, "vid", (DM_STRLEN(linker) == 0) ? "": linker); + dmuci_set_value_by_section(args->bridge_vlanport_sec, "vid", reference.value); return 0; } return 0; @@ -2699,16 +2701,16 @@ static int set_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, vo static int get_BridgingBridgeVLANPort_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { struct bridge_vlanport_args *args = (struct bridge_vlanport_args *)data; - char *port_name = NULL; + char *name = NULL; - dmuci_get_value_by_section_string(args->bridge_vlanport_dmmap_sec, "port_name", &port_name); - if (DM_STRLEN(port_name) == 0) { + dmuci_get_value_by_section_string(args->bridge_vlanport_dmmap_sec, "name", &name); + if (DM_STRLEN(name) == 0) { *value = ""; } else { char br_port_path[128] = {0}; - snprintf(br_port_path, sizeof(br_port_path), "Device.Bridging.Bridge.%s.Port.", args->br_inst); - adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", port_name, value); + snprintf(br_port_path, sizeof(br_port_path), "Device.Bridging.Bridge.%s.Port.*.Name", args->br_inst); + adm_entry_get_reference_param(ctx, br_port_path, name, value); } return 0; } @@ -2721,23 +2723,23 @@ static int set_BridgingBridgeVLANPort_Port(char *refparam, struct dmctx *ctx, vo char *allowed_objects[] = { lower_layer_path, NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); snprintf(lower_layer_path, sizeof(lower_layer_path), "Device.Bridging.Bridge.%s.Port.", args->br_inst); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - - if (!linker || *linker == '\0') { + if (DM_STRLEN(reference.value) == 0) { char *ifname = NULL; char *name = NULL; char *enable = NULL; @@ -2769,14 +2771,14 @@ static int set_BridgingBridgeVLANPort_Port(char *refparam, struct dmctx *ctx, vo } } else { char *vid = NULL; - char *port = NULL; char *enable = NULL; char *type = NULL; + char *port = dmstrdup(reference.value); + dmuci_get_value_by_section_string(args->bridge_vlanport_sec, "vid", &vid); - s = get_origin_section_from_dmmap("dmmap_bridge_port", "bridge_port", linker); - dmuci_get_value_by_section_string(s, "port", &port); + s = get_dup_section_in_dmmap_opt("dmmap_bridge_port", "bridge_port", "port", port); dmuci_get_value_by_section_string(s, "enabled", &enable); dmuci_get_value_by_section_string(s, "type", &type); @@ -2826,7 +2828,7 @@ static int set_BridgingBridgeVLANPort_Port(char *refparam, struct dmctx *ctx, vo dmuci_set_value_by_section(s, "port", port_name); } - dmuci_set_value_by_section(args->bridge_vlanport_dmmap_sec, "port_name", linker); + dmuci_set_value_by_section(args->bridge_vlanport_dmmap_sec, "port_name", section_name(s)); } return 0; } @@ -3004,7 +3006,7 @@ static int set_BridgingBridgeProviderBridge_CVLANcomponents(char *refparam, stru /* *** Device.Bridging. *** */ DMOBJ tBridgingObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Bridge", &DMWRITE, addObjBridgingBridge, delObjBridgingBridge, NULL, browseBridgingBridgeInst, NULL, NULL, tBridgingBridgeObj, tBridgingBridgeParams, get_linker_bridge, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Bridge", &DMWRITE, addObjBridgingBridge, delObjBridgingBridge, NULL, browseBridgingBridgeInst, NULL, NULL, tBridgingBridgeObj, tBridgingBridgeParams, get_linker_bridge, BBFDM_BOTH, NULL}, {"ProviderBridge", &DMWRITE, addObjBridgingProviderBridge, delObjBridgingProviderBridge, NULL, browseBridgingProviderBridgeInst, NULL, NULL, NULL, tBridgingProviderBridgeParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3025,10 +3027,10 @@ DMLEAF tBridgingParams[] = { /*** Bridging.Bridge.{i}. ***/ DMOBJ tBridgingBridgeObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"STP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tBridgingBridgeSTPParams, NULL, BBFDM_BOTH, NULL}, -{"Port", &DMWRITE, addObjBridgingBridgePort, delObjBridgingBridgePort, NULL, browseBridgingBridgePortInst, NULL, NULL, tBridgingBridgePortObj, tBridgingBridgePortParams, get_linker_br_port, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"VLAN", &DMWRITE, addObjBridgingBridgeVLAN, delObjBridgingBridgeVLAN, NULL, browseBridgingBridgeVLANInst, NULL, NULL, NULL, tBridgingBridgeVLANParams, get_linker_br_vlan, BBFDM_BOTH, LIST_KEY{"VLANID", "Alias", NULL}}, -{"VLANPort", &DMWRITE, addObjBridgingBridgeVLANPort, delObjBridgingBridgeVLANPort, NULL, browseBridgingBridgeVLANPortInst, NULL, NULL, NULL, tBridgingBridgeVLANPortParams, NULL, BBFDM_BOTH, LIST_KEY{"VLAN", "Port", "Alias", NULL}}, +{"STP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tBridgingBridgeSTPParams, NULL, BBFDM_BOTH}, +{"Port", &DMWRITE, addObjBridgingBridgePort, delObjBridgingBridgePort, NULL, browseBridgingBridgePortInst, NULL, NULL, tBridgingBridgePortObj, tBridgingBridgePortParams, get_linker_br_port, BBFDM_BOTH, NULL}, +{"VLAN", &DMWRITE, addObjBridgingBridgeVLAN, delObjBridgingBridgeVLAN, NULL, browseBridgingBridgeVLANInst, NULL, NULL, NULL, tBridgingBridgeVLANParams, get_linker_br_vlan, BBFDM_BOTH, NULL}, +{"VLANPort", &DMWRITE, addObjBridgingBridgeVLANPort, delObjBridgingBridgeVLANPort, NULL, browseBridgingBridgeVLANPortInst, NULL, NULL, NULL, tBridgingBridgeVLANPortParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3036,7 +3038,7 @@ DMLEAF tBridgingBridgeParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_BridgingBridge_Enable, set_BridgingBridge_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_BridgingBridge_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridge_Alias, set_BridgingBridge_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridge_Alias, set_BridgingBridge_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Standard", &DMWRITE, DMT_STRING, get_BridgingBridge_Standard, set_BridgingBridge_Standard, BBFDM_BOTH}, {"PortNumberOfEntries", &DMREAD, DMT_UNINT, get_BridgingBridge_PortNumberOfEntries, NULL, BBFDM_BOTH}, {"VLANNumberOfEntries", &DMREAD, DMT_UNINT, get_BridgingBridge_VLANNumberOfEntries, NULL, BBFDM_BOTH}, @@ -3068,10 +3070,10 @@ DMLEAF tBridgingBridgePortParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_BridgingBridgePort_Enable, set_BridgingBridgePort_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_BridgingBridgePort_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridgePort_Alias, set_BridgingBridgePort_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_BridgingBridgePort_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridgePort_Alias, set_BridgingBridgePort_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_BridgingBridgePort_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, //{"LastChange", &DMREAD, DMT_UNINT, get_BridgingBridgePort_LastChange, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_BridgingBridgePort_LowerLayers, set_BridgingBridgePort_LowerLayers, BBFDM_BOTH}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_BridgingBridgePort_LowerLayers, set_BridgingBridgePort_LowerLayers, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"ManagementPort", &DMWRITE, DMT_BOOL, get_BridgingBridgePort_ManagementPort, set_BridgingBridgePort_ManagementPort, BBFDM_BOTH}, //{"Type", &DMWRITE, DMT_STRING, get_BridgingBridgePort_Type, set_BridgingBridgePort_Type, BBFDM_BOTH}, //{"DefaultUserPriority", &DMWRITE, DMT_UNINT, get_BridgingBridgePort_DefaultUserPriority, set_BridgingBridgePort_DefaultUserPriority, BBFDM_BOTH}, @@ -3107,9 +3109,9 @@ DMLEAF tBridgingBridgePortStatsParams[] = { DMLEAF tBridgingBridgeVLANParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_BridgingBridgeVLAN_Enable, set_BridgingBridgeVLAN_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridgeVLAN_Alias, set_BridgingBridgeVLAN_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridgeVLAN_Alias, set_BridgingBridgeVLAN_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Name", &DMWRITE, DMT_STRING, get_BridgingBridgeVLAN_Name, set_BridgingBridgeVLAN_Name, BBFDM_BOTH}, -{"VLANID", &DMWRITE, DMT_INT, get_BridgingBridgeVLAN_VLANID, set_BridgingBridgeVLAN_VLANID, BBFDM_BOTH}, +{"VLANID", &DMWRITE, DMT_INT, get_BridgingBridgeVLAN_VLANID, set_BridgingBridgeVLAN_VLANID, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {0} }; @@ -3117,9 +3119,9 @@ DMLEAF tBridgingBridgeVLANParams[] = { DMLEAF tBridgingBridgeVLANPortParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_BridgingBridgeVLANPort_Enable, set_BridgingBridgeVLANPort_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridgeVLANPort_Alias, set_BridgingBridgeVLANPort_Alias, BBFDM_BOTH}, -{"VLAN", &DMWRITE, DMT_STRING, get_BridgingBridgeVLANPort_VLAN, set_BridgingBridgeVLANPort_VLAN, BBFDM_BOTH}, -{"Port", &DMWRITE, DMT_STRING, get_BridgingBridgeVLANPort_Port, set_BridgingBridgeVLANPort_Port, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_BridgingBridgeVLANPort_Alias, set_BridgingBridgeVLANPort_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"VLAN", &DMWRITE, DMT_STRING, get_BridgingBridgeVLANPort_VLAN, set_BridgingBridgeVLANPort_VLAN, BBFDM_BOTH, DM_FLAG_REFERENCE|DM_FLAG_UNIQUE}, +{"Port", &DMWRITE, DMT_STRING, get_BridgingBridgeVLANPort_Port, set_BridgingBridgeVLANPort_Port, BBFDM_BOTH, DM_FLAG_REFERENCE|DM_FLAG_UNIQUE}, {"Untagged", &DMWRITE, DMT_BOOL, get_BridgingBridgeVLANPort_Untagged, set_BridgingBridgeVLANPort_Untagged, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/tr181/deviceinfo.c b/libbbfdm/dmtree/tr181/deviceinfo.c index ebc429c7..e5021d30 100644 --- a/libbbfdm/dmtree/tr181/deviceinfo.c +++ b/libbbfdm/dmtree/tr181/deviceinfo.c @@ -55,22 +55,6 @@ struct Supported_Data_Models Data_Models[] = { {"http://www.broadband-forum.org/cwmp/tr-157-1-3-0.xml","urn:broadband-forum-org:tr-157-1-3-0", "Bulkdata,SoftwareModules"}, }; -/************************************************************************** -* LINKER -***************************************************************************/ -static int get_device_fwimage_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - char *id = dmjson_get_value((json_object *)data, 1, "id"); - dmasprintf(linker, "fw_image:%s", id); - return 0; -} - -static int get_linker_process(char* refparam, struct dmctx *ctx, void *data, char *instance, char **linker) -{ - *linker = data ? ((struct process_entry *)data)->pid : ""; - return 0; -} - /************************************************************* * COMMON FUNCTIONS **************************************************************/ @@ -571,79 +555,75 @@ static int get_device_softwareversion(char *refparam, struct dmctx *ctx, void *d static int get_device_active_fwimage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { json_object *res = NULL, *bank_obj = NULL, *arrobj = NULL; - char *active = NULL, *id = NULL; - char linker[32]; + char *linker = NULL; int i = 0; dmubus_call("fwbank", "dump", UBUS_ARGS{0}, 0, &res); dmjson_foreach_obj_in_array(res, arrobj, bank_obj, i, 1, "bank") { - active = dmjson_get_value(bank_obj, 1, "active"); + char *active = dmjson_get_value(bank_obj, 1, "active"); if (active && DM_LSTRCMP(active, "true") == 0) { - id = dmjson_get_value(bank_obj, 1, "id"); + linker = dmjson_get_value(bank_obj, 1, "id"); break; } } - snprintf(linker, sizeof(linker), "fw_image:%s", id ? id : ""); - adm_entry_get_linker_param(ctx, "Device.DeviceInfo.FirmwareImage.", linker, value); + adm_entry_get_reference_param(ctx, "Device.DeviceInfo.FirmwareImage.*.Alias", linker, value); return 0; } static int get_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { json_object *res = NULL, *bank_obj = NULL, *arrobj = NULL; - char *boot = NULL, *id = NULL; - char linker[32]; + char *linker = NULL; int i = 0; dmubus_call("fwbank", "dump", UBUS_ARGS{0}, 0, &res); dmjson_foreach_obj_in_array(res, arrobj, bank_obj, i, 1, "bank") { - boot = dmjson_get_value(bank_obj, 1, "boot"); + char *boot = dmjson_get_value(bank_obj, 1, "boot"); if (boot && DM_LSTRCMP(boot, "true") == 0) { - id = dmjson_get_value(bank_obj, 1, "id"); + linker = dmjson_get_value(bank_obj, 1, "id"); break; } } - snprintf(linker, sizeof(linker), "fw_image:%s", id ? id : ""); - adm_entry_get_linker_param(ctx, "Device.DeviceInfo.FirmwareImage.", linker, value); + adm_entry_get_reference_param(ctx, "Device.DeviceInfo.FirmwareImage.*.Alias", linker, value); return 0; } static int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.DeviceInfo.FirmwareImage.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, -1, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - if (linker && *linker) { + if (DM_STRLEN(reference.value)) { struct uci_section *dmmap_s = NULL; + json_object *res = NULL; char *available = NULL; - get_dmmap_section_of_config_section_eq("dmmap_fw_image", "fw_image", "name", linker, &dmmap_s); + char *bank_id = reference.value; + + get_dmmap_section_of_config_section_cont("dmmap_fw_image", "fw_image", "id", bank_id, &dmmap_s); dmuci_get_value_by_section_string(dmmap_s, "available", &available); if (DM_LSTRCMP(available, "false") == 0) return FAULT_9001; - char *bank_id = DM_STRCHR(linker, ':'); - if (bank_id) { - json_object *res = NULL; + dmubus_call("fwbank", "set_bootbank", UBUS_ARGS{{"bank", bank_id, Integer}}, 1, &res); + char *success = dmjson_get_value(res, 1, "success"); + if (DM_LSTRCMP(success, "true") != 0) + return FAULT_9001; - dmubus_call("fwbank", "set_bootbank", UBUS_ARGS{{"bank", bank_id+1, Integer}}, 1, &res); - char *success = dmjson_get_value(res, 1, "success"); - if (DM_LSTRCMP(success, "true") != 0) - return FAULT_9001; - } } break; } @@ -992,47 +972,12 @@ static int get_DeviceInfoSupportedDataModel_Features(char *refparam, struct dmct static int get_DeviceInfoFirmwareImage_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - struct uci_section *s = NULL; - char name[32] = {0}; - char *id = NULL; - - id = dmjson_get_value((json_object *)data, 1, "id"); - snprintf(name, sizeof(name), "fw_image:%s", id); - - uci_path_foreach_option_eq(bbfdm, "dmmap_fw_image", "fw_image", "name", name, s) { - dmuci_get_value_by_section_string(s, "alias", value); - break; - } - if ((*value)[0] == '\0') - dmasprintf(value, "cpe-%s", instance); + *value = dmjson_get_value((json_object *)data, 1, "id"); return 0; } static int set_DeviceInfoFirmwareImage_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - struct uci_section *s = NULL, *dmmap = NULL; - char name[32] = {0}; - char *id = NULL; - - switch (action) { - case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 64, NULL, NULL)) - return FAULT_9007; - break; - case VALUESET: - id = dmjson_get_value((json_object *)data, 1, "id"); - snprintf(name, sizeof(name), "fw_image:%s", id); - - uci_path_foreach_option_eq(bbfdm, "dmmap_fw_image", "fw_image", "name", name, s) { - dmuci_set_value_by_section_bbfdm(s, "alias", value); - return 0; - } - - dmuci_add_section_bbfdm("dmmap_fw_image", "fw_image", &dmmap); - dmuci_set_value_by_section(dmmap, "name", name); - dmuci_set_value_by_section(dmmap, "alias", value); - break; - } return 0; } @@ -1058,13 +1003,10 @@ static int get_DeviceInfoFirmwareImage_Version(char *refparam, struct dmctx *ctx static int get_DeviceInfoFirmwareImage_Available(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { struct uci_section *s = NULL; - char name[32] = {0}; - char *id = NULL; - id = dmjson_get_value((json_object *)data, 1, "id"); - snprintf(name, sizeof(name), "fw_image:%s", id); + char *id = dmjson_get_value((json_object *)data, 1, "id"); - uci_path_foreach_option_eq(bbfdm, "dmmap_fw_image", "fw_image", "name", name, s) { + uci_path_foreach_option_eq(bbfdm, "dmmap_fw_image", "fw_image", "id", id, s) { dmuci_get_value_by_section_string(s, "available", value); break; } @@ -1077,7 +1019,6 @@ static int get_DeviceInfoFirmwareImage_Available(char *refparam, struct dmctx *c static int set_DeviceInfoFirmwareImage_Available(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { struct uci_section *s = NULL, *dmmap = NULL; - char name[32] = {0}; char *id = NULL; bool b; @@ -1097,15 +1038,14 @@ static int set_DeviceInfoFirmwareImage_Available(char *refparam, struct dmctx *c } id = dmjson_get_value((json_object *)data, 1, "id"); - snprintf(name, sizeof(name), "fw_image:%s", id); - uci_path_foreach_option_eq(bbfdm, "dmmap_fw_image", "fw_image", "name", name, s) { + uci_path_foreach_option_eq(bbfdm, "dmmap_fw_image", "fw_image", "id", id, s) { dmuci_set_value_by_section_bbfdm(s, "available", b ? "true" : "false"); return 0; } dmuci_add_section_bbfdm("dmmap_fw_image", "fw_image", &dmmap); - dmuci_set_value_by_section(dmmap, "name", name); + dmuci_set_value_by_section(dmmap, "id", id); dmuci_set_value_by_section(dmmap, "available", b ? "true" : "false"); break; } @@ -1528,13 +1468,13 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx /* *** Device.DeviceInfo. *** */ DMOBJ tDeviceInfoObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"VendorConfigFile", &DMREAD, NULL, NULL, NULL, browseVcfInst, NULL, NULL, NULL, tDeviceInfoVendorConfigFileParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"VendorConfigFile", &DMREAD, NULL, NULL, NULL, browseVcfInst, NULL, NULL, NULL, tDeviceInfoVendorConfigFileParams, NULL, BBFDM_BOTH, NULL}, {"MemoryStatus", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDeviceInfoMemoryStatusParams, NULL, BBFDM_BOTH, NULL}, {"ProcessStatus", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDeviceInfoProcessStatusObj, tDeviceInfoProcessStatusParams, NULL, BBFDM_BOTH, NULL}, -{"Processor", &DMREAD, NULL, NULL, NULL, browseDeviceInfoProcessorInst, NULL, NULL, NULL, tDeviceInfoProcessorParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"VendorLogFile", &DMREAD, NULL, NULL, NULL, browseVlfInst, NULL, NULL, NULL, tDeviceInfoVendorLogFileParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"SupportedDataModel", &DMREAD, NULL, NULL, NULL, browseDeviceInfoSupportedDataModelInst, NULL, NULL, NULL, tDeviceInfoSupportedDataModelParams, NULL, BBFDM_CWMP, LIST_KEY{"URL", "Alias", "UUID", NULL}}, -{"FirmwareImage", &DMREAD, NULL, NULL, "file:/usr/libexec/rpcd/fwbank", browseDeviceInfoFirmwareImageInst, NULL, NULL, NULL, tDeviceInfoFirmwareImageParams, get_device_fwimage_linker, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Processor", &DMREAD, NULL, NULL, NULL, browseDeviceInfoProcessorInst, NULL, NULL, NULL, tDeviceInfoProcessorParams, NULL, BBFDM_BOTH, NULL}, +{"VendorLogFile", &DMREAD, NULL, NULL, NULL, browseVlfInst, NULL, NULL, NULL, tDeviceInfoVendorLogFileParams, NULL, BBFDM_BOTH, NULL}, +{"SupportedDataModel", &DMREAD, NULL, NULL, NULL, browseDeviceInfoSupportedDataModelInst, NULL, NULL, NULL, tDeviceInfoSupportedDataModelParams, NULL, BBFDM_CWMP, NULL}, +{"FirmwareImage", &DMREAD, NULL, NULL, "file:/usr/libexec/rpcd/fwbank", browseDeviceInfoFirmwareImageInst, NULL, NULL, NULL, tDeviceInfoFirmwareImageParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1549,8 +1489,8 @@ DMLEAF tDeviceInfoParams[] = { {"SerialNumber", &DMREAD, DMT_STRING, get_device_serialnumber, NULL, BBFDM_BOTH}, {"HardwareVersion", &DMREAD, DMT_STRING, get_device_hardwareversion, NULL, BBFDM_BOTH}, {"SoftwareVersion", &DMREAD, DMT_STRING, get_device_softwareversion, NULL, BBFDM_BOTH}, -{"ActiveFirmwareImage", &DMREAD, DMT_STRING, get_device_active_fwimage, NULL, BBFDM_BOTH}, -{"BootFirmwareImage", &DMWRITE, DMT_STRING, get_device_boot_fwimage, set_device_boot_fwimage, BBFDM_BOTH}, +{"ActiveFirmwareImage", &DMREAD, DMT_STRING, get_device_active_fwimage, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"BootFirmwareImage", &DMWRITE, DMT_STRING, get_device_boot_fwimage, set_device_boot_fwimage, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"AdditionalHardwareVersion", &DMREAD, DMT_STRING, get_device_additionalhardwareversion, NULL, BBFDM_BOTH}, {"AdditionalSoftwareVersion", &DMREAD, DMT_STRING, get_device_additionalsoftwareversion, NULL, BBFDM_BOTH}, {"ProvisioningCode", &DMWRITE, DMT_STRING, get_device_provisioningcode, set_device_provisioningcode, BBFDM_BOTH}, @@ -1570,8 +1510,8 @@ DMLEAF tDeviceInfoParams[] = { /* *** Device.DeviceInfo.VendorConfigFile.{i}. *** */ DMLEAF tDeviceInfoVendorConfigFileParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_vcf_alias, set_vcf_alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_vcf_name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_vcf_alias, set_vcf_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_vcf_name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Version", &DMREAD, DMT_STRING, get_vcf_version, NULL, BBFDM_BOTH}, {"Date", &DMREAD, DMT_TIME, get_vcf_date, NULL, BBFDM_BOTH}, {"Description", &DMREAD, DMT_STRING, get_vcf_desc, NULL, BBFDM_BOTH}, @@ -1593,7 +1533,7 @@ DMLEAF tDeviceInfoMemoryStatusParams[] = { /* *** Device.DeviceInfo.ProcessStatus. *** */ DMOBJ tDeviceInfoProcessStatusObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Process", &DMREAD, NULL, NULL, NULL, browseProcessEntriesInst, NULL, NULL, NULL, tDeviceInfoProcessStatusProcessParams, get_linker_process, BBFDM_BOTH, LIST_KEY{"PID", NULL}}, +{"Process", &DMREAD, NULL, NULL, NULL, browseProcessEntriesInst, NULL, NULL, NULL, tDeviceInfoProcessStatusProcessParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1607,7 +1547,7 @@ DMLEAF tDeviceInfoProcessStatusParams[] = { /* *** Device.DeviceInfo.ProcessStatus.Process.{i}. *** */ DMLEAF tDeviceInfoProcessStatusProcessParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"PID", &DMREAD, DMT_UNINT, get_process_pid, NULL, BBFDM_BOTH}, +{"PID", &DMREAD, DMT_UNINT, get_process_pid, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Command", &DMREAD, DMT_STRING, get_process_command, NULL, BBFDM_BOTH}, {"Size", &DMREAD, DMT_UNINT, get_process_size, NULL, BBFDM_BOTH}, {"Priority", &DMREAD, DMT_UNINT, get_process_priority, NULL, BBFDM_BOTH}, @@ -1619,8 +1559,8 @@ DMLEAF tDeviceInfoProcessStatusProcessParams[] = { /* *** Device.DeviceInfo.VendorLogFile.{i}. *** */ DMLEAF tDeviceInfoVendorLogFileParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_vlf_alias, set_vlf_alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_vlf_name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_vlf_alias, set_vlf_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_vlf_name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"MaximumSize", &DMREAD, DMT_UNINT, get_vlf_max_size, NULL, BBFDM_BOTH}, {"Persistent", &DMREAD, DMT_BOOL, get_vlf_persistent, NULL, BBFDM_BOTH}, {"Upload()", &DMASYNC, DMT_COMMAND, get_operate_args_DeviceInfoVendorLogFile_Upload, operate_DeviceInfoVendorLogFile_Upload, BBFDM_USP}, @@ -1630,7 +1570,7 @@ DMLEAF tDeviceInfoVendorLogFileParams[] = { /* *** Device.DeviceInfo.Processor.{i}. *** */ DMLEAF tDeviceInfoProcessorParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_DeviceInfoProcessor_Alias, set_DeviceInfoProcessor_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DeviceInfoProcessor_Alias, set_DeviceInfoProcessor_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Architecture", &DMREAD, DMT_STRING, get_DeviceInfoProcessor_Architecture, NULL, BBFDM_BOTH}, {0} }; @@ -1638,8 +1578,8 @@ DMLEAF tDeviceInfoProcessorParams[] = { /* *** Device.DeviceInfo.SupportedDataModel.{i}. *** */ DMLEAF tDeviceInfoSupportedDataModelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_DeviceInfoSupportedDataModel_Alias, set_DeviceInfoSupportedDataModel_Alias, BBFDM_CWMP}, -{"URL", &DMREAD, DMT_STRING, get_DeviceInfoSupportedDataModel_URL, NULL, BBFDM_CWMP}, +{"Alias", &DMWRITE, DMT_STRING, get_DeviceInfoSupportedDataModel_Alias, set_DeviceInfoSupportedDataModel_Alias, BBFDM_CWMP, DM_FLAG_UNIQUE}, +{"URL", &DMREAD, DMT_STRING, get_DeviceInfoSupportedDataModel_URL, NULL, BBFDM_CWMP, DM_FLAG_UNIQUE}, {"URN", &DMREAD, DMT_STRING, get_DeviceInfoSupportedDataModel_URN, NULL, BBFDM_CWMP}, {"Features", &DMREAD, DMT_STRING, get_DeviceInfoSupportedDataModel_Features, NULL, BBFDM_CWMP}, {0} @@ -1648,7 +1588,7 @@ DMLEAF tDeviceInfoSupportedDataModelParams[] = { /* *** Device.DeviceInfo.FirmwareImage.{i}. *** */ DMLEAF tDeviceInfoFirmwareImageParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_DeviceInfoFirmwareImage_Alias, set_DeviceInfoFirmwareImage_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DeviceInfoFirmwareImage_Alias, set_DeviceInfoFirmwareImage_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"Name", &DMREAD, DMT_STRING, get_DeviceInfoFirmwareImage_Name, NULL, BBFDM_BOTH}, {"Version", &DMREAD, DMT_STRING, get_DeviceInfoFirmwareImage_Version, NULL, BBFDM_BOTH}, {"Available", &DMWRITE, DMT_BOOL, get_DeviceInfoFirmwareImage_Available, set_DeviceInfoFirmwareImage_Available, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/dhcpv4.c b/libbbfdm/dmtree/tr181/dhcpv4.c index 20f713a4..3f725cac 100644 --- a/libbbfdm/dmtree/tr181/dhcpv4.c +++ b/libbbfdm/dmtree/tr181/dhcpv4.c @@ -1423,28 +1423,28 @@ static int set_DHCPv4ServerPool_Order(char *refparam, struct dmctx *ctx, void *d static int get_DHCPv4ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = dmstrdup(((struct dhcp_args *)data)->interface); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", ((struct dhcp_args *)data)->interface, value); return 0; } static int set_DHCPv4ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section((((struct dhcp_args *)data)->sections)->config_section, "interface", linker ? linker : ""); + dmuci_set_value_by_section((((struct dhcp_args *)data)->sections)->config_section, "interface", reference.value); return 0; } return 0; @@ -2173,26 +2173,11 @@ static int set_DHCPv4Client_Alias(char *refparam, struct dmctx *ctx, void *data, static int get_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - struct dhcp_client_args *dhcpv4_client = (struct dhcp_client_args *)data; char *iface_name = NULL; - dmuci_get_value_by_section_string(dhcpv4_client->dmmap_s, "iface_name", &iface_name); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", iface_name, value); + dmuci_get_value_by_section_string(((struct dhcp_client_args *)data)->dmmap_s, "iface_name", &iface_name); - if (DM_STRLEN(*value) == 0 && dhcpv4_client->iface_s) { - struct uci_section *s = NULL; - char *device = NULL; - - dmuci_get_value_by_section_string(dhcpv4_client->iface_s, "device", &device); - if (DM_STRLEN(device) == 0) - return 0; - - uci_foreach_option_eq("network", "interface", "device", device, s) { - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", section_name(s), value); - if (DM_STRLEN(*value)) - return 0; - } - } + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", iface_name, value); return 0; } @@ -2200,22 +2185,21 @@ static int set_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *d { struct dhcp_client_args *dhcpv4_client = (struct dhcp_client_args *)data; char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; char *dhcp_client_key = NULL; - char *linker = NULL; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - // Get linker - adm_entry_get_linker_value(ctx, value, &linker); - if (dhcpv4_client->iface_s) { dmuci_set_value_by_section(dhcpv4_client->iface_s, "proto", "none"); dmuci_set_value_by_section(dhcpv4_client->iface_s, "clientid", ""); @@ -2225,12 +2209,12 @@ static int set_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *d dmuci_set_value_by_section(dhcpv4_client->iface_s, "reqopts", ""); } - if (!linker || *linker == 0) { + if (DM_STRLEN(reference.value) == 0) { dmuci_set_value_by_section_bbfdm(dhcpv4_client->dmmap_s, "iface_name", ""); } else { struct uci_section *interface_s = NULL; - get_config_section_of_dmmap_section("network", "interface", linker, &interface_s); + get_config_section_of_dmmap_section("network", "interface", reference.value, &interface_s); if (interface_s == NULL) return FAULT_9007; @@ -2238,7 +2222,7 @@ static int set_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *d dmuci_set_value_by_section(interface_s, "proto", "dhcp"); // Update dmmap section - dmuci_set_value_by_section_bbfdm(dhcpv4_client->dmmap_s, "iface_name", linker); + dmuci_set_value_by_section_bbfdm(dhcpv4_client->dmmap_s, "iface_name", reference.value); dmuci_get_value_by_section_string(dhcpv4_client->dmmap_s, "dhcp_client_key", &dhcp_client_key); if (DM_STRLEN(dhcp_client_key)) { @@ -3113,7 +3097,8 @@ static int get_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx char *iface_name = NULL; dmuci_get_value_by_section_string(((struct dhcp_client_args *)data)->dmmap_s, "iface_name", &iface_name); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", iface_name, value); + + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", iface_name, value); return 0; } @@ -3121,28 +3106,27 @@ static int set_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx { struct dhcp_client_args *dhcp_relay = (struct dhcp_client_args *)data; char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; struct uci_section *interface_s = NULL; char *curr_iface_name = NULL; - char *linker = NULL; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - // Get linker - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_get_value_by_section_string(dhcp_relay->dmmap_s, "iface_name", &curr_iface_name); // Get the corresponding network config - if (linker && *linker != 0) - get_config_section_of_dmmap_section("network", "interface", linker, &interface_s); + if (DM_STRLEN(reference.value)) + get_config_section_of_dmmap_section("network", "interface", reference.value, &interface_s); // break if interface section is not found if (interface_s && (strcmp(section_name(interface_s), curr_iface_name) == 0)) @@ -3150,7 +3134,7 @@ static int set_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx dmuci_set_value_by_section(dhcp_relay->iface_s, "proto", "none"); - if (!linker || *linker == 0) { + if (DM_STRLEN(reference.value) == 0) { dmuci_set_value_by_section_bbfdm(dhcp_relay->dmmap_s, "added_by_controller", "1"); dmuci_set_value_by_section_bbfdm(dhcp_relay->dmmap_s, "iface_name", ""); } else { @@ -3158,7 +3142,7 @@ static int set_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx dmuci_set_value_by_section(interface_s, "proto", "relay"); // Update dmmap section - dmuci_set_value_by_section_bbfdm(dhcp_relay->dmmap_s, "iface_name", linker); + dmuci_set_value_by_section_bbfdm(dhcp_relay->dmmap_s, "iface_name", reference.value); } break; } @@ -3316,7 +3300,7 @@ static int operate_DHCPv4Client_Renew(char *refparam, struct dmctx *ctx, void *d /* *** Device.DHCPv4. *** */ DMOBJ tDHCPv4Obj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Client", &DMWRITE, addObjDHCPv4Client, delObjDHCPv4Client, NULL, browseDHCPv4ClientInst, NULL, NULL, tDHCPv4ClientObj, tDHCPv4ClientParams, NULL, BBFDM_BOTH, LIST_KEY{"Interface", "Alias", NULL}}, +{"Client", &DMWRITE, addObjDHCPv4Client, delObjDHCPv4Client, NULL, browseDHCPv4ClientInst, NULL, NULL, tDHCPv4ClientObj, tDHCPv4ClientParams, NULL, BBFDM_BOTH, NULL}, {"Server", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDHCPv4ServerObj, tDHCPv4ServerParams, NULL, BBFDM_BOTH, NULL}, {"Relay", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDHCPv4RelayObj, tDHCPv4RelayParams, NULL, BBFDM_BOTH, NULL}, {0} @@ -3331,16 +3315,16 @@ DMLEAF tDHCPv4Params[] = { /* *** Device.DHCPv4.Client.{i}. *** */ DMOBJ tDHCPv4ClientObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"SentOption", &DMWRITE, addObjDHCPv4ClientSentOption, delObjDHCPv4ClientSentOption, NULL, browseDHCPv4ClientSentOptionInst, NULL, NULL, NULL, tDHCPv4ClientSentOptionParams, NULL, BBFDM_BOTH, LIST_KEY{"Tag", "Alias", NULL}}, -{"ReqOption", &DMWRITE, addObjDHCPv4ClientReqOption, delObjDHCPv4ClientReqOption, NULL, browseDHCPv4ClientReqOptionInst, NULL, NULL, NULL, tDHCPv4ClientReqOptionParams, NULL, BBFDM_BOTH, LIST_KEY{"Tag", "Alias", NULL}}, +{"SentOption", &DMWRITE, addObjDHCPv4ClientSentOption, delObjDHCPv4ClientSentOption, NULL, browseDHCPv4ClientSentOptionInst, NULL, NULL, NULL, tDHCPv4ClientSentOptionParams, NULL, BBFDM_BOTH, NULL}, +{"ReqOption", &DMWRITE, addObjDHCPv4ClientReqOption, delObjDHCPv4ClientReqOption, NULL, browseDHCPv4ClientReqOptionInst, NULL, NULL, NULL, tDHCPv4ClientReqOptionParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tDHCPv4ClientParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4Client_Enable, set_DHCPv4Client_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4Client_Alias, set_DHCPv4Client_Alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4Client_Interface, set_DHCPv4Client_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4Client_Alias, set_DHCPv4Client_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4Client_Interface, set_DHCPv4Client_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"Status", &DMREAD, DMT_STRING, get_DHCPv4Client_Status, NULL, BBFDM_BOTH}, {"DHCPStatus", &DMREAD, DMT_STRING, get_DHCPv4Client_DHCPStatus, NULL, BBFDM_BOTH}, {"Renew", &DMWRITE, DMT_BOOL, get_DHCPv4Client_Renew, set_DHCPv4Client_Renew, BBFDM_CWMP}, @@ -3362,8 +3346,8 @@ DMLEAF tDHCPv4ClientParams[] = { DMLEAF tDHCPv4ClientSentOptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ClientSentOption_Enable, set_DHCPv4ClientSentOption_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ClientSentOption_Alias, set_DHCPv4ClientSentOption_Alias, BBFDM_BOTH}, -{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ClientSentOption_Tag, set_DHCPv4ClientSentOption_Tag, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ClientSentOption_Alias, set_DHCPv4ClientSentOption_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ClientSentOption_Tag, set_DHCPv4ClientSentOption_Tag, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv4ClientSentOption_Value, set_DHCPv4ClientSentOption_Value, BBFDM_BOTH}, {0} }; @@ -3373,8 +3357,8 @@ DMLEAF tDHCPv4ClientReqOptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ClientReqOption_Enable, set_DHCPv4ClientReqOption_Enable, BBFDM_BOTH}, //{"Order", &DMWRITE, DMT_UNINT, get_DHCPv4ClientReqOption_Order, set_DHCPv4ClientReqOption_Order, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ClientReqOption_Alias, set_DHCPv4ClientReqOption_Alias, BBFDM_BOTH}, -{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ClientReqOption_Tag, set_DHCPv4ClientReqOption_Tag, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ClientReqOption_Alias, set_DHCPv4ClientReqOption_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ClientReqOption_Tag, set_DHCPv4ClientReqOption_Tag, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"Value", &DMREAD, DMT_HEXBIN, get_DHCPv4ClientReqOption_Value, NULL, BBFDM_BOTH}, {0} }; @@ -3382,7 +3366,7 @@ DMLEAF tDHCPv4ClientReqOptionParams[] = { /* *** Device.DHCPv4.Server. *** */ DMOBJ tDHCPv4ServerObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Pool", &DMWRITE, addObjDHCPv4ServerPool, delObjDHCPv4ServerPool, NULL, browseDHCPv4ServerPoolInst, NULL, NULL, tDHCPv4ServerPoolObj, tDHCPv4ServerPoolParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Pool", &DMWRITE, addObjDHCPv4ServerPool, delObjDHCPv4ServerPool, NULL, browseDHCPv4ServerPoolInst, NULL, NULL, tDHCPv4ServerPoolObj, tDHCPv4ServerPoolParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3396,9 +3380,9 @@ DMLEAF tDHCPv4ServerParams[] = { /* *** Device.DHCPv4.Server.Pool.{i}. *** */ DMOBJ tDHCPv4ServerPoolObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"StaticAddress", &DMWRITE, addObjDHCPv4ServerPoolStaticAddress, delObjDHCPv4ServerPoolStaticAddress, NULL, browseDHCPv4ServerPoolStaticAddressInst, NULL, NULL, NULL, tDHCPv4ServerPoolStaticAddressParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Chaddr", NULL}}, -{"Option", &DMWRITE, addObjDHCPv4ServerPoolOption, delObjDHCPv4ServerPoolOption, NULL, browseDHCPv4ServerPoolOptionInst, NULL, NULL, NULL, tDHCPv4ServerPoolOptionParams, NULL, BBFDM_BOTH, LIST_KEY{"Tag", "Alias", NULL}}, -{"Client", &DMREAD, NULL, NULL, NULL, browseDhcpClientInst, NULL, NULL, tDHCPv4ServerPoolClientObj, tDHCPv4ServerPoolClientParams, get_dhcp_client_linker, BBFDM_BOTH, LIST_KEY{"Chaddr", "Alias", NULL}}, +{"StaticAddress", &DMWRITE, addObjDHCPv4ServerPoolStaticAddress, delObjDHCPv4ServerPoolStaticAddress, NULL, browseDHCPv4ServerPoolStaticAddressInst, NULL, NULL, NULL, tDHCPv4ServerPoolStaticAddressParams, NULL, BBFDM_BOTH, NULL}, +{"Option", &DMWRITE, addObjDHCPv4ServerPoolOption, delObjDHCPv4ServerPoolOption, NULL, browseDHCPv4ServerPoolOptionInst, NULL, NULL, NULL, tDHCPv4ServerPoolOptionParams, NULL, BBFDM_BOTH, NULL}, +{"Client", &DMREAD, NULL, NULL, NULL, browseDhcpClientInst, NULL, NULL, tDHCPv4ServerPoolClientObj, tDHCPv4ServerPoolClientParams, get_dhcp_client_linker, BBFDM_BOTH, NULL}, {0} }; @@ -3406,9 +3390,9 @@ DMLEAF tDHCPv4ServerPoolParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ServerPool_Enable, set_DHCPv4ServerPool_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DHCPv4ServerPool_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPool_Alias, set_DHCPv4ServerPool_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPool_Alias, set_DHCPv4ServerPool_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Order", &DMWRITE, DMT_UNINT, get_DHCPv4ServerPool_Order, set_DHCPv4ServerPool_Order, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4ServerPool_Interface, set_DHCPv4ServerPool_Interface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4ServerPool_Interface, set_DHCPv4ServerPool_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, //{"VendorClassID", &DMWRITE, DMT_STRING, get_DHCPv4ServerPool_VendorClassID, set_DHCPv4ServerPool_VendorClassID, BBFDM_BOTH}, //{"VendorClassIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv4ServerPool_VendorClassIDExclude, set_DHCPv4ServerPool_VendorClassIDExclude, BBFDM_BOTH}, //{"VendorClassIDMode", &DMWRITE, DMT_STRING, get_DHCPv4ServerPool_VendorClassIDMode, set_DHCPv4ServerPool_VendorClassIDMode, BBFDM_BOTH}, @@ -3438,8 +3422,8 @@ DMLEAF tDHCPv4ServerPoolParams[] = { DMLEAF tDHCPv4ServerPoolStaticAddressParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ServerPoolStaticAddress_Enable, set_DHCPv4ServerPoolStaticAddress_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolStaticAddress_Alias, set_DHCPv4ServerPoolStaticAddress_Alias, BBFDM_BOTH}, -{"Chaddr", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolStaticAddress_Chaddr, set_DHCPv4ServerPoolStaticAddress_Chaddr, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolStaticAddress_Alias, set_DHCPv4ServerPoolStaticAddress_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Chaddr", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolStaticAddress_Chaddr, set_DHCPv4ServerPoolStaticAddress_Chaddr, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Yiaddr", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolStaticAddress_Yiaddr, set_DHCPv4ServerPoolStaticAddress_Yiaddr, BBFDM_BOTH}, {0} }; @@ -3448,8 +3432,8 @@ DMLEAF tDHCPv4ServerPoolStaticAddressParams[] = { DMLEAF tDHCPv4ServerPoolOptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ServerPoolOption_Enable, set_DHCPv4ServerPoolOption_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolOption_Alias, set_DHCPv4ServerPoolOption_Alias, BBFDM_BOTH}, -{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ServerPoolOption_Tag, set_DHCPv4ServerPoolOption_Tag, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolOption_Alias, set_DHCPv4ServerPoolOption_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ServerPoolOption_Tag, set_DHCPv4ServerPoolOption_Tag, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv4ServerPoolOption_Value, set_DHCPv4ServerPoolOption_Value, BBFDM_BOTH}, {0} }; @@ -3457,15 +3441,15 @@ DMLEAF tDHCPv4ServerPoolOptionParams[] = { /* *** Device.DHCPv4.Server.Pool.{i}.Client.{i}. *** */ DMOBJ tDHCPv4ServerPoolClientObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"IPv4Address", &DMREAD, NULL, NULL, NULL, browseDhcpClientIPv4Inst, NULL, NULL, NULL, tDHCPv4ServerPoolClientIPv4AddressParams, NULL, BBFDM_BOTH, LIST_KEY{"IPAddress", NULL}}, -{"Option", &DMREAD, NULL, NULL, NULL, browseDHCPv4ServerPoolClientOptionInst, NULL, NULL, NULL, tDHCPv4ServerPoolClientOptionParams, NULL, BBFDM_BOTH, LIST_KEY{"Tag", NULL}}, +{"IPv4Address", &DMREAD, NULL, NULL, NULL, browseDhcpClientIPv4Inst, NULL, NULL, NULL, tDHCPv4ServerPoolClientIPv4AddressParams, NULL, BBFDM_BOTH, NULL}, +{"Option", &DMREAD, NULL, NULL, NULL, browseDHCPv4ServerPoolClientOptionInst, NULL, NULL, NULL, tDHCPv4ServerPoolClientOptionParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tDHCPv4ServerPoolClientParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolClient_Alias, set_DHCPv4ServerPoolClient_Alias, BBFDM_BOTH}, -{"Chaddr", &DMREAD, DMT_STRING, get_DHCPv4ServerPoolClient_Chaddr, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolClient_Alias, set_DHCPv4ServerPoolClient_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Chaddr", &DMREAD, DMT_STRING, get_DHCPv4ServerPoolClient_Chaddr, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Active", &DMREAD, DMT_BOOL, get_DHCPv4ServerPoolClient_Active, NULL, BBFDM_BOTH}, {"IPv4AddressNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4ServerPoolClient_IPv4AddressNumberOfEntries, NULL, BBFDM_BOTH}, {"OptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4ServerPoolClient_OptionNumberOfEntries, NULL, BBFDM_BOTH}, @@ -3475,7 +3459,7 @@ DMLEAF tDHCPv4ServerPoolClientParams[] = { /* *** Device.DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}. *** */ DMLEAF tDHCPv4ServerPoolClientIPv4AddressParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"IPAddress", &DMREAD, DMT_STRING, get_DHCPv4ServerPoolClientIPv4Address_IPAddress, NULL, BBFDM_BOTH}, +{"IPAddress", &DMREAD, DMT_STRING, get_DHCPv4ServerPoolClientIPv4Address_IPAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"LeaseTimeRemaining", &DMREAD, DMT_TIME, get_DHCPv4ServerPoolClientIPv4Address_LeaseTimeRemaining, NULL, BBFDM_BOTH}, {0} }; @@ -3483,7 +3467,7 @@ DMLEAF tDHCPv4ServerPoolClientIPv4AddressParams[] = { /* *** Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}. *** */ DMLEAF tDHCPv4ServerPoolClientOptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Tag", &DMREAD, DMT_UNINT, get_DHCPv4ServerPoolClientOption_Tag, NULL, BBFDM_BOTH}, +{"Tag", &DMREAD, DMT_UNINT, get_DHCPv4ServerPoolClientOption_Tag, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Value", &DMREAD, DMT_HEXBIN, get_DHCPv4ServerPoolClientOption_Value, NULL, BBFDM_BOTH}, {0} }; @@ -3491,7 +3475,7 @@ DMLEAF tDHCPv4ServerPoolClientOptionParams[] = { /* *** Device.DHCPv4.Relay. *** */ DMOBJ tDHCPv4RelayObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Forwarding", &DMWRITE, addObjDHCPv4RelayForwarding, delObjDHCPv4RelayForwarding, NULL, browseDHCPv4RelayForwardingInst, NULL, NULL, NULL, tDHCPv4RelayForwardingParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Forwarding", &DMWRITE, addObjDHCPv4RelayForwarding, delObjDHCPv4RelayForwarding, NULL, browseDHCPv4RelayForwardingInst, NULL, NULL, NULL, tDHCPv4RelayForwardingParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3508,9 +3492,9 @@ DMLEAF tDHCPv4RelayForwardingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_Enable, set_DHCPv4RelayForwarding_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DHCPv4RelayForwarding_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Alias, set_DHCPv4RelayForwarding_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Alias, set_DHCPv4RelayForwarding_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"Order", &DMWRITE, DMT_UNINT, get_DHCPv4RelayForwarding_Order, set_DHCPv4RelayForwarding_Order, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Interface, set_DHCPv4RelayForwarding_Interface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Interface, set_DHCPv4RelayForwarding_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"VendorClassID", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_VendorClassID, set_DHCPv4RelayForwarding_VendorClassID, BBFDM_BOTH}, //{"VendorClassIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_VendorClassIDExclude, set_DHCPv4RelayForwarding_VendorClassIDExclude, BBFDM_BOTH}, //{"VendorClassIDMode", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_VendorClassIDMode, set_DHCPv4RelayForwarding_VendorClassIDMode, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/dhcpv6.c b/libbbfdm/dmtree/tr181/dhcpv6.c index e714e9e7..83098350 100644 --- a/libbbfdm/dmtree/tr181/dhcpv6.c +++ b/libbbfdm/dmtree/tr181/dhcpv6.c @@ -513,26 +513,25 @@ static int set_DHCPv6Client_Alias(char *refparam, struct dmctx *ctx, void *data, static int get_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - struct dhcpv6_client_args *dhcpv6_client = (struct dhcpv6_client_args *)data; char *iface_name = NULL; - dmuci_get_value_by_section_string(dhcpv6_client->dmmap_s, "iface_name", &iface_name); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", iface_name, value); + dmuci_get_value_by_section_string(((struct dhcpv6_client_args *)data)->dmmap_s, "iface_name", &iface_name); - if (DM_STRLEN(*value) == 0 && dhcpv6_client->iface_s) { + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", iface_name, value); + + if (DM_STRLEN(*value) == 0 && ((struct dhcpv6_client_args *)data)->iface_s) { struct uci_section *s = NULL; char *device = NULL; - dmuci_get_value_by_section_string(dhcpv6_client->iface_s, "device", &device); + dmuci_get_value_by_section_string(((struct dhcpv6_client_args *)data)->iface_s, "device", &device); if (DM_STRLEN(device) == 0) return 0; - uci_foreach_option_eq("network", "interface", "device", device, s) { - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", section_name(s), value); - if (DM_STRLEN(*value)) - return 0; - } + s = get_dup_section_in_config_opt("network", "interface", "device", device); + + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", section_name(s), value); } + return 0; } @@ -540,21 +539,20 @@ static int set_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *d { struct dhcpv6_client_args *dhcpv6_client = (struct dhcpv6_client_args *)data; char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - // Get linker - adm_entry_get_linker_value(ctx, value, &linker); - if (dhcpv6_client->iface_s) { dmuci_set_value_by_section(dhcpv6_client->iface_s, "proto", "none"); dmuci_set_value_by_section(dhcpv6_client->iface_s, "reqaddress", ""); @@ -562,7 +560,7 @@ static int set_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *d dmuci_set_value_by_section(dhcpv6_client->iface_s, "reqopts", ""); } - if (!linker || *linker == 0) { + if (DM_STRLEN(reference.value) == 0) { dmuci_set_value_by_section_bbfdm(dhcpv6_client->dmmap_s, "iface_name", ""); } else { struct uci_section *interface_s = NULL; @@ -570,7 +568,7 @@ static int set_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *d char *reqprefix = NULL; char *reqopts = NULL; - get_config_section_of_dmmap_section("network", "interface", linker, &interface_s); + get_config_section_of_dmmap_section("network", "interface", reference.value, &interface_s); if (interface_s == NULL) return FAULT_9007; @@ -578,7 +576,7 @@ static int set_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *d dmuci_set_value_by_section(interface_s, "proto", "dhcpv6"); // Update dmmap section - dmuci_set_value_by_section_bbfdm(dhcpv6_client->dmmap_s, "iface_name", linker); + dmuci_set_value_by_section_bbfdm(dhcpv6_client->dmmap_s, "iface_name", reference.value); // Get the current value of requested parameters dmuci_get_value_by_section_string(dhcpv6_client->dmmap_s, "reqaddress", &reqaddress); @@ -834,28 +832,28 @@ static int set_DHCPv6ServerPool_Order(char *refparam, struct dmctx *ctx, void *d static int get_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = dmstrdup(((struct dhcpv6_args *)data)->interface); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", ((struct dhcpv6_args *)data)->interface, value); return 0; } static int set_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section((((struct dhcpv6_args *)data)->dhcp_sections)->config_section, "interface", linker ? linker : ""); + dmuci_set_value_by_section((((struct dhcpv6_args *)data)->dhcp_sections)->config_section, "interface", reference.value); break; } return 0; @@ -1314,7 +1312,7 @@ static int operate_DHCPv6Client_Renew(char *refparam, struct dmctx *ctx, void *d /* *** Device.DHCPv6. *** */ DMOBJ tDHCPv6Obj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Client", &DMWRITE, addObjDHCPv6Client, delObjDHCPv6Client, NULL, browseDHCPv6ClientInst, NULL, NULL, NULL, tDHCPv6ClientParams, NULL, BBFDM_BOTH, LIST_KEY{"Interface", "Alias", NULL}}, +{"Client", &DMWRITE, addObjDHCPv6Client, delObjDHCPv6Client, NULL, browseDHCPv6ClientInst, NULL, NULL, NULL, tDHCPv6ClientParams, NULL, BBFDM_BOTH, NULL}, {"Server", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDHCPv6ServerObj, tDHCPv6ServerParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1328,8 +1326,8 @@ DMLEAF tDHCPv6Params[] = { DMLEAF tDHCPv6ClientParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6Client_Enable, set_DHCPv6Client_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6Client_Alias, set_DHCPv6Client_Alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_DHCPv6Client_Interface, set_DHCPv6Client_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6Client_Alias, set_DHCPv6Client_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_DHCPv6Client_Interface, set_DHCPv6Client_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"Status", &DMREAD, DMT_STRING, get_DHCPv6Client_Status, NULL, BBFDM_BOTH}, {"DUID", &DMREAD, DMT_HEXBIN, get_DHCPv6Client_DUID, NULL, BBFDM_BOTH}, {"RequestAddresses", &DMWRITE, DMT_BOOL, get_DHCPv6Client_RequestAddresses, set_DHCPv6Client_RequestAddresses, BBFDM_BOTH}, @@ -1350,7 +1348,7 @@ DMLEAF tDHCPv6ClientParams[] = { /* *** Device.DHCPv6.Server. *** */ DMOBJ tDHCPv6ServerObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Pool", &DMWRITE, addObjDHCPv6ServerPool, delObjDHCPv6ServerPool, NULL, browseDHCPv6ServerPoolInst, NULL, NULL, tDHCPv6ServerPoolObj, tDHCPv6ServerPoolParams, NULL, BBFDM_BOTH, LIST_KEY{"Order", "Alias", NULL}}, +{"Pool", &DMWRITE, addObjDHCPv6ServerPool, delObjDHCPv6ServerPool, NULL, browseDHCPv6ServerPoolInst, NULL, NULL, tDHCPv6ServerPoolObj, tDHCPv6ServerPoolParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1364,8 +1362,8 @@ DMLEAF tDHCPv6ServerParams[] = { /* *** Device.DHCPv6.Server.Pool.{i}. *** */ DMOBJ tDHCPv6ServerPoolObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Client", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientInst, NULL, NULL, tDHCPv6ServerPoolClientObj, tDHCPv6ServerPoolClientParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"Option", &DMWRITE, addObjDHCPv6ServerPoolOption, delObjDHCPv6ServerPoolOption, NULL, browseDHCPv6ServerPoolOptionInst, NULL, NULL, NULL, tDHCPv6ServerPoolOptionParams, NULL, BBFDM_BOTH, LIST_KEY{"Tag", "Alias", NULL}}, +{"Client", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientInst, NULL, NULL, tDHCPv6ServerPoolClientObj, tDHCPv6ServerPoolClientParams, NULL, BBFDM_BOTH, NULL}, +{"Option", &DMWRITE, addObjDHCPv6ServerPoolOption, delObjDHCPv6ServerPoolOption, NULL, browseDHCPv6ServerPoolOptionInst, NULL, NULL, NULL, tDHCPv6ServerPoolOptionParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1373,9 +1371,9 @@ DMLEAF tDHCPv6ServerPoolParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_Enable, set_DHCPv6ServerPool_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DHCPv6ServerPool_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_Alias, set_DHCPv6ServerPool_Alias, BBFDM_BOTH}, -{"Order", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPool_Order, set_DHCPv6ServerPool_Order, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_Interface, set_DHCPv6ServerPool_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_Alias, set_DHCPv6ServerPool_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Order", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPool_Order, set_DHCPv6ServerPool_Order, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_Interface, set_DHCPv6ServerPool_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, //{"DUID", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPool_DUID, set_DHCPv6ServerPool_DUID, BBFDM_BOTH}, //{"DUIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_DUIDExclude, set_DHCPv6ServerPool_DUIDExclude, BBFDM_BOTH}, {"VendorClassID", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPool_VendorClassID, set_DHCPv6ServerPool_VendorClassID, BBFDM_BOTH}, @@ -1400,15 +1398,15 @@ DMLEAF tDHCPv6ServerPoolParams[] = { /* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}. *** */ DMOBJ tDHCPv6ServerPoolClientObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"IPv6Address", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientIPv6AddressInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientIPv6AddressParams, NULL, BBFDM_BOTH, LIST_KEY{"IPAddress", NULL}}, -{"IPv6Prefix", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientIPv6PrefixInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientIPv6PrefixParams, NULL, BBFDM_BOTH, LIST_KEY{"Prefix", NULL}}, +{"IPv6Address", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientIPv6AddressInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientIPv6AddressParams, NULL, BBFDM_BOTH, NULL}, +{"IPv6Prefix", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientIPv6PrefixInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientIPv6PrefixParams, NULL, BBFDM_BOTH, NULL}, //{"Option", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientOptionInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientOptionParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tDHCPv6ServerPoolClientParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolClient_Alias, set_DHCPv6ServerPoolClient_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolClient_Alias, set_DHCPv6ServerPoolClient_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"SourceAddress", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClient_SourceAddress, NULL, BBFDM_BOTH}, //{"Active", &DMREAD, DMT_BOOL, get_DHCPv6ServerPoolClient_Active, NULL, BBFDM_BOTH}, {"IPv6AddressNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6ServerPoolClient_IPv6AddressNumberOfEntries, NULL, BBFDM_BOTH}, @@ -1420,7 +1418,7 @@ DMLEAF tDHCPv6ServerPoolClientParams[] = { /* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}. *** */ DMLEAF tDHCPv6ServerPoolClientIPv6AddressParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"IPAddress", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClientIPv6Address_IPAddress, NULL, BBFDM_BOTH}, +{"IPAddress", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClientIPv6Address_IPAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"PreferredLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Address_PreferredLifetime, NULL, BBFDM_BOTH}, {"ValidLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Address_ValidLifetime, NULL, BBFDM_BOTH}, {0} @@ -1429,7 +1427,7 @@ DMLEAF tDHCPv6ServerPoolClientIPv6AddressParams[] = { /* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}. *** */ DMLEAF tDHCPv6ServerPoolClientIPv6PrefixParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Prefix", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClientIPv6Prefix_Prefix, NULL, BBFDM_BOTH}, +{"Prefix", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClientIPv6Prefix_Prefix, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"PreferredLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Prefix_PreferredLifetime, NULL, BBFDM_BOTH}, {"ValidLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Prefix_ValidLifetime, NULL, BBFDM_BOTH}, {0} @@ -1447,8 +1445,8 @@ DMLEAF tDHCPv6ServerPoolClientOptionParams[] = { DMLEAF tDHCPv6ServerPoolOptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPoolOption_Enable, set_DHCPv6ServerPoolOption_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolOption_Alias, set_DHCPv6ServerPoolOption_Alias, BBFDM_BOTH}, -{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPoolOption_Tag, set_DHCPv6ServerPoolOption_Tag, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolOption_Alias, set_DHCPv6ServerPoolOption_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPoolOption_Tag, set_DHCPv6ServerPoolOption_Tag, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPoolOption_Value, set_DHCPv6ServerPoolOption_Value, BBFDM_BOTH}, //{"PassthroughClient", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolOption_PassthroughClient, set_DHCPv6ServerPoolOption_PassthroughClient, BBFDM_BOTH}, {0} diff --git a/libbbfdm/dmtree/tr181/dns.c b/libbbfdm/dmtree/tr181/dns.c index 2f4fc811..12ff9a24 100644 --- a/libbbfdm/dmtree/tr181/dns.c +++ b/libbbfdm/dmtree/tr181/dns.c @@ -341,7 +341,7 @@ static int get_dns_interface(char *refparam, struct dmctx *ctx, void *data, char char *linker = NULL; dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &linker); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } @@ -428,7 +428,7 @@ static int get_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmct static int get_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("nslookup", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } @@ -608,17 +608,18 @@ static int set_dns_server(char *refparam, struct dmctx *ctx, void *data, char *i static int set_dns_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; char *interface = NULL, *enable = NULL; - char *peerdns = NULL; - char *linker = NULL; - char *oip = NULL; + char *peerdns = NULL, *oip = NULL; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; // If peerdns = '1' then it is a dynamic dns and not allowed to set this parameter @@ -628,28 +629,26 @@ static int set_dns_interface(char *refparam, struct dmctx *ctx, void *data, char break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface); dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &oip); dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &enable); - if (!linker || linker[0] == 0) { + if (DM_STRLEN(reference.value) == 0) { dmuci_del_list_value("network", interface, "dns", oip); dmuci_set_value_by_section((struct uci_section *)data, "interface", ""); return 0; } - if (DM_STRCMP(interface, linker) == 0) + if (DM_STRCMP(interface, reference.value) == 0) return 0; if (DM_STRLEN(interface)) dmuci_del_list_value("network", interface, "dns", oip); if (DM_LSTRCMP(enable, "1") == 0) - dmuci_add_list_value("network", linker, "dns", oip); + dmuci_add_list_value("network", reference.value, "dns", oip); - dmuci_set_value_by_section((struct uci_section *)data, "interface", linker); + dmuci_set_value_by_section((struct uci_section *)data, "interface", reference.value); break; } return 0; @@ -703,19 +702,22 @@ static int set_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmct static int set_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("nslookup"); - set_diagnostics_interface_option(ctx, "nslookup", value); + set_diagnostics_option("nslookup", "interface", reference.value); return 0; } return 0; @@ -908,7 +910,7 @@ DMLEAF tDNSParams[] = { /* *** Device.DNS.Client. *** */ DMOBJ tDNSClientObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Server", &DMWRITE, add_dns_server, delete_dns_server, NULL, browseDNSServerInst, NULL, NULL, NULL, tDNSClientServerParams, NULL, BBFDM_BOTH, LIST_KEY{"DNSServer", "Alias", NULL}}, +{"Server", &DMWRITE, add_dns_server, delete_dns_server, NULL, browseDNSServerInst, NULL, NULL, NULL, tDNSClientServerParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -925,9 +927,9 @@ DMLEAF tDNSClientServerParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_server_enable, set_dns_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_server_status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_server_alias, set_server_alias, BBFDM_BOTH}, -{"DNSServer", &DMWRITE, DMT_STRING, get_server_dns_server, set_dns_server, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_dns_interface, set_dns_interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_server_alias, set_server_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"DNSServer", &DMWRITE, DMT_STRING, get_server_dns_server, set_dns_server, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_dns_interface, set_dns_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Type", &DMREAD, DMT_STRING, get_dns_type, NULL, BBFDM_BOTH}, {0} }; @@ -935,7 +937,7 @@ DMLEAF tDNSClientServerParams[] = { /* *** Device.DNS.Relay. *** */ DMOBJ tDNSRelayObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Forwarding", &DMWRITE, add_dns_server, delete_dns_server, NULL, browseDNSServerInst, NULL, NULL, NULL, tDNSRelayForwardingParams, NULL, BBFDM_BOTH, LIST_KEY{"DNSServer", "Alias", NULL}}, +{"Forwarding", &DMWRITE, add_dns_server, delete_dns_server, NULL, browseDNSServerInst, NULL, NULL, NULL, tDNSRelayForwardingParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -952,9 +954,9 @@ DMLEAF tDNSRelayForwardingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_forwarding_enable, set_dns_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_forwarding_status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_forwarding_alias, set_forwarding_alias, BBFDM_BOTH}, -{"DNSServer", &DMWRITE, DMT_STRING, get_forwarding_dns_server, set_dns_server, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_dns_interface, set_dns_interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_forwarding_alias, set_forwarding_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"DNSServer", &DMWRITE, DMT_STRING, get_forwarding_dns_server, set_dns_server, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_dns_interface, set_dns_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Type", &DMREAD, DMT_STRING, get_dns_type, NULL, BBFDM_BOTH}, {0} }; @@ -982,7 +984,7 @@ DMOBJ tDNSDiagnosticsNSLookupDiagnosticsObj[] = { DMLEAF tDNSDiagnosticsNSLookupDiagnosticsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"DiagnosticsState", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_diagnostics_state, set_nslookupdiagnostics_diagnostics_state, BBFDM_CWMP}, -{"Interface", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_interface, set_nslookupdiagnostics_interface, BBFDM_CWMP}, +{"Interface", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_interface, set_nslookupdiagnostics_interface, BBFDM_CWMP, DM_FLAG_REFERENCE}, {"HostName", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_host_name, set_nslookupdiagnostics_host_name, BBFDM_CWMP}, {"DNSServer", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_d_n_s_server, set_nslookupdiagnostics_d_n_s_server, BBFDM_CWMP}, {"Timeout", &DMWRITE, DMT_UNINT, get_nslookupdiagnostics_timeout, set_nslookupdiagnostics_timeout, BBFDM_CWMP}, diff --git a/libbbfdm/dmtree/tr181/dsl.c b/libbbfdm/dmtree/tr181/dsl.c index 07ecc618..1a7f15f9 100644 --- a/libbbfdm/dmtree/tr181/dsl.c +++ b/libbbfdm/dmtree/tr181/dsl.c @@ -978,10 +978,7 @@ static int get_DSLChannel_Name(char *refparam, struct dmctx *ctx, void *data, ch static int get_DSLChannel_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char linker[8]; - - snprintf(linker, sizeof(linker), "line_%s", ((struct dsl_line_args *)data)->id); - adm_entry_get_linker_param(ctx, "Device.DSL.Line.", linker, value); + adm_entry_get_reference_param(ctx, "Device.DSL.Line.*.Name", ((struct dsl_line_args *)data)->id, value); return 0; } @@ -1432,8 +1429,8 @@ static int get_DSLChannelStatsQuarterHour_XTUCCRCErrors(char *refparam, struct d /* *** Device.DSL. *** */ DMOBJ tDSLObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Line", &DMREAD, NULL, NULL, NULL, browseDSLLineInst, NULL, NULL, tDSLLineObj, tDSLLineParams, get_dsl_line_linker, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"Channel", &DMREAD, NULL, NULL, NULL, browseDSLChannelInst, NULL, NULL, tDSLChannelObj, tDSLChannelParams, get_dsl_channel_linker, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Line", &DMREAD, NULL, NULL, NULL, browseDSLLineInst, NULL, NULL, tDSLLineObj, tDSLLineParams, get_dsl_line_linker, BBFDM_BOTH, NULL}, +{"Channel", &DMREAD, NULL, NULL, NULL, browseDSLChannelInst, NULL, NULL, tDSLChannelObj, tDSLChannelParams, get_dsl_channel_linker, BBFDM_BOTH, NULL}, {0} }; @@ -1455,8 +1452,8 @@ DMLEAF tDSLLineParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DSLLine_Enable, set_DSLLine_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DSLLine_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DSLLine_Alias, set_DSLLine_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_DSLLine_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DSLLine_Alias, set_DSLLine_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_DSLLine_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"LowerLayers", &DMWRITE, DMT_STRING, get_DSLLine_LowerLayers, set_DSLLine_LowerLayers, BBFDM_BOTH}, {"Upstream", &DMREAD, DMT_BOOL, get_DSLLine_Upstream, NULL, BBFDM_BOTH}, {"FirmwareVersion", &DMREAD, DMT_STRING, get_DSLLine_FirmwareVersion, NULL, BBFDM_BOTH}, @@ -1585,9 +1582,9 @@ DMLEAF tDSLChannelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DSLChannel_Enable, set_DSLChannel_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DSLChannel_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DSLChannel_Alias, set_DSLChannel_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_DSLChannel_Name, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMREAD, DMT_STRING, get_DSLChannel_LowerLayers, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DSLChannel_Alias, set_DSLChannel_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_DSLChannel_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"LowerLayers", &DMREAD, DMT_STRING, get_DSLChannel_LowerLayers, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"LinkEncapsulationSupported", &DMREAD, DMT_STRING, get_DSLChannel_LinkEncapsulationSupported, NULL, BBFDM_BOTH}, {"LinkEncapsulationUsed", &DMREAD, DMT_STRING, get_DSLChannel_LinkEncapsulationUsed, NULL, BBFDM_BOTH}, {"LPATH", &DMREAD, DMT_UNINT, get_DSLChannel_LPATH, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/dynamicdns.c b/libbbfdm/dmtree/tr181/dynamicdns.c index affb5b8f..f0757efc 100644 --- a/libbbfdm/dmtree/tr181/dynamicdns.c +++ b/libbbfdm/dmtree/tr181/dynamicdns.c @@ -14,15 +14,6 @@ #define DDNS_SERVICES_CUSTOM "/usr/share/ddns/custom" #define DDNS_SERVICES_BACKUP "/usr/share/ddns/backup" -/************************************************************************** -* LINKER -***************************************************************************/ -static int get_linker_dynamicdns_server(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - dmuci_get_value_by_section_string((struct uci_section *)data, "service_name", linker); - return 0; -} - /************************************************************* * COMMON FUNCTIONS **************************************************************/ @@ -555,27 +546,28 @@ static int get_DynamicDNSClient_Server(char *refparam, struct dmctx *ctx, void * char *service_name = NULL; dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "service_name", &service_name); - adm_entry_get_linker_param(ctx, "Device.DynamicDNS.Server.", service_name, value); + adm_entry_get_reference_param(ctx, "Device.DynamicDNS.Server.*.ServiceName", service_name, value); return 0; } static int set_DynamicDNSClient_Server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.DynamicDNS.Server.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "service_name", linker ? linker : ""); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "service_name", reference.value); break; } return 0; @@ -587,28 +579,29 @@ static int get_DynamicDNSClient_Interface(char *refparam, struct dmctx *ctx, voi char *interface = NULL; dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "interface", &interface); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", interface, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", interface, value); return 0; } static int set_DynamicDNSClient_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", linker ? linker : ""); - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ip_network", linker ? linker : ""); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", reference.value); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ip_network", reference.value); break; } return 0; @@ -986,8 +979,8 @@ static int set_DynamicDNSServer_Protocol(char *refparam, struct dmctx *ctx, void /* *** Device.DynamicDNS. *** */ DMOBJ tDynamicDNSObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Client", &DMWRITE, addObjDynamicDNSClient, delObjDynamicDNSClient, NULL, browseDynamicDNSClientInst, NULL, NULL, tDynamicDNSClientObj, tDynamicDNSClientParams, NULL, BBFDM_BOTH, LIST_KEY{"Server", "Username", "Alias", NULL}}, -{"Server", &DMWRITE, addObjDynamicDNSServer, delObjDynamicDNSServer, NULL, browseDynamicDNSServerInst, NULL, NULL, NULL, tDynamicDNSServerParams, get_linker_dynamicdns_server, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Client", &DMWRITE, addObjDynamicDNSClient, delObjDynamicDNSClient, NULL, browseDynamicDNSClientInst, NULL, NULL, tDynamicDNSClientObj, tDynamicDNSClientParams, NULL, BBFDM_BOTH, NULL}, +{"Server", &DMWRITE, addObjDynamicDNSServer, delObjDynamicDNSServer, NULL, browseDynamicDNSServerInst, NULL, NULL, NULL, tDynamicDNSServerParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1002,7 +995,7 @@ DMLEAF tDynamicDNSParams[] = { /* *** Device.DynamicDNS.Client.{i}. *** */ DMOBJ tDynamicDNSClientObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Hostname", &DMWRITE, addObjDynamicDNSClientHostname, delObjDynamicDNSClientHostname, NULL, browseDynamicDNSClientHostnameInst, NULL, NULL, NULL, tDynamicDNSClientHostnameParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", NULL}}, +{"Hostname", &DMWRITE, addObjDynamicDNSClientHostname, delObjDynamicDNSClientHostname, NULL, browseDynamicDNSClientHostnameInst, NULL, NULL, NULL, tDynamicDNSClientHostnameParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1010,11 +1003,11 @@ DMLEAF tDynamicDNSClientParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DynamicDNSClient_Enable, set_DynamicDNSClient_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DynamicDNSClient_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Alias, set_DynamicDNSClient_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Alias, set_DynamicDNSClient_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"LastError", &DMREAD, DMT_STRING, get_DynamicDNSClient_LastError, NULL, BBFDM_BOTH}, -{"Server", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Server, set_DynamicDNSClient_Server, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Interface, set_DynamicDNSClient_Interface, BBFDM_BOTH}, -{"Username", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Username, set_DynamicDNSClient_Username, BBFDM_BOTH}, +{"Server", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Server, set_DynamicDNSClient_Server, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"Interface", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Interface, set_DynamicDNSClient_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"Username", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Username, set_DynamicDNSClient_Username, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Password", &DMWRITE, DMT_STRING, get_DynamicDNSClient_Password, set_DynamicDNSClient_Password, BBFDM_BOTH}, {"HostnameNumberOfEntries", &DMREAD, DMT_UNINT, get_DynamicDNSClient_HostnameNumberOfEntries, NULL, BBFDM_BOTH}, {0} @@ -1025,7 +1018,7 @@ DMLEAF tDynamicDNSClientHostnameParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_DynamicDNSClientHostname_Enable, set_DynamicDNSClientHostname_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_DynamicDNSClientHostname_Status, NULL, BBFDM_BOTH}, -{"Name", &DMWRITE, DMT_STRING, get_DynamicDNSClientHostname_Name, set_DynamicDNSClientHostname_Name, BBFDM_BOTH}, +{"Name", &DMWRITE, DMT_STRING, get_DynamicDNSClientHostname_Name, set_DynamicDNSClientHostname_Name, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"LastUpdate", &DMREAD, DMT_TIME, get_DynamicDNSClientHostname_LastUpdate, NULL, BBFDM_BOTH}, {0} }; @@ -1034,9 +1027,9 @@ DMLEAF tDynamicDNSClientHostnameParams[] = { DMLEAF tDynamicDNSServerParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_STRING, get_DynamicDNSServer_Enable, set_DynamicDNSServer_Enable, BBFDM_BOTH}, -{"Name", &DMWRITE, DMT_STRING, get_DynamicDNSServer_Name, set_DynamicDNSServer_Name, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_DynamicDNSServer_Alias, set_DynamicDNSServer_Alias, BBFDM_BOTH}, -{"ServiceName", &DMServer, DMT_STRING, get_DynamicDNSServer_ServiceName, set_DynamicDNSServer_ServiceName, BBFDM_BOTH}, +{"Name", &DMWRITE, DMT_STRING, get_DynamicDNSServer_Name, set_DynamicDNSServer_Name, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Alias", &DMWRITE, DMT_STRING, get_DynamicDNSServer_Alias, set_DynamicDNSServer_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ServiceName", &DMServer, DMT_STRING, get_DynamicDNSServer_ServiceName, set_DynamicDNSServer_ServiceName, BBFDM_BOTH, DM_FLAG_LINKER}, {"ServerAddress", &DMServer, DMT_STRING, get_DynamicDNSServer_ServerAddress, set_DynamicDNSServer_ServerAddress, BBFDM_BOTH}, //{"ServerPort", &DMWRITE, DMT_UNINT, get_DynamicDNSServer_ServerPort, set_DynamicDNSServer_ServerPort, BBFDM_BOTH}, {"SupportedProtocols", &DMREAD, DMT_STRING, get_DynamicDNSServer_SupportedProtocols, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/ethernet.c b/libbbfdm/dmtree/tr181/ethernet.c index 876e8cde..c68ef904 100644 --- a/libbbfdm/dmtree/tr181/ethernet.c +++ b/libbbfdm/dmtree/tr181/ethernet.c @@ -951,33 +951,37 @@ static int get_EthernetLink_LastChange(char *refparam, struct dmctx *ctx, void * static int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = NULL; - dmuci_get_value_by_section_string((struct uci_section *)data, "LowerLayers", value); if ((*value)[0] == '\0') { + char *linker = NULL; + dmuci_get_value_by_section_string((struct uci_section *)data, "device", &linker); - if (!linker || *linker == '\0') + if (DM_STRLEN(linker) == 0) return 0; - adm_entry_get_linker_param(ctx, "Device.ATM.Link.", linker, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.ATM.Link.*.Name", linker, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.PTM.Link.", linker, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.PTM.Link.*.Name", linker, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", linker, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.Bridging.Bridge.*.Port.*.Name", linker, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", linker, value); + +end: + // Store LowerLayers value + dmuci_set_value_by_section((struct uci_section *)data, "LowerLayers", *value); } else { - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) + if (!adm_entry_object_exists(ctx, *value)) *value = ""; } + return 0; } @@ -989,34 +993,34 @@ static int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void "Device.ATM.Link.", "Device.PTM.Link.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - // Store LowerLayers value under dmmap section - dmuci_set_value_by_section((struct uci_section *)data, "LowerLayers", value); + dmuci_set_value_by_section((struct uci_section *)data, "LowerLayers", reference.path); - dmuci_set_value_by_section((struct uci_section *)data, "is_eth", !DM_STRNCMP(value, "Device.Ethernet.", strlen("Device.Ethernet.")) ? "1" : "0"); + dmuci_set_value_by_section((struct uci_section *)data, "is_eth", !DM_STRNCMP(reference.path, "Device.Ethernet.", strlen("Device.Ethernet.")) ? "1" : "0"); - if (match(value, "Device.Bridging.Bridge.*.Port.", 0, NULL)) { + if (match(reference.path, "Device.Bridging.Bridge.*.Port.", 0, NULL)) { dmuci_set_value_by_section((struct uci_section *)data, "is_eth", "1"); // Remove unused Interface section created by Bridge Object if it exists - struct uci_section *s = get_dup_section_in_config_opt("network", "interface", "device", linker); + struct uci_section *s = get_dup_section_in_config_opt("network", "interface", "device", reference.value); dmuci_delete_by_section(s, NULL, NULL); } - dmuci_set_value_by_section((struct uci_section *)data, "device", DM_STRLEN(linker) ? linker : ""); + dmuci_set_value_by_section((struct uci_section *)data, "device", reference.value); break; } return 0; @@ -1288,7 +1292,7 @@ static int set_EthernetVLANTermination_Alias(char *refparam, struct dmctx *ctx, static int get_EthernetVLANTermination_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - *value = dmstrdup(section_name(((struct dmmap_dup *)data)->config_section)); + dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "name", value); return 0; } @@ -1303,15 +1307,15 @@ static int get_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "ifname", &ifname); if (DM_LSTRCMP(type, "8021ad") == 0) { - adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", ifname, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.VLANTermination.*.Name", ifname, value); } else { - adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", ifname, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Link.*.Name", ifname, value); } - } else { - char *linker = NULL; - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) + // Store LowerLayers value + dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", *value); + } else { + if (!adm_entry_object_exists(ctx, *value)) *value = ""; } @@ -1324,30 +1328,30 @@ static int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx "Device.Ethernet.VLANTermination.", "Device.Ethernet.Link.", NULL}; - char *vlan_linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &vlan_linker); - // Store LowerLayers value under dmmap section - dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", value); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", reference.path); - if (DM_STRLEN(vlan_linker) == 0) { + if (DM_STRLEN(reference.value) == 0) { // Set ifname and name options of device section to empty value dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", ""); dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "name", ""); } - if (DM_STRNCMP(value, "Device.Ethernet.Link.", DM_STRLEN("Device.Ethernet.Link.")) == 0) { + if (DM_STRNCMP(reference.path, "Device.Ethernet.Link.", DM_STRLEN("Device.Ethernet.Link.")) == 0) { char new_name[16] = {0}; char *old_name = NULL; char *vid = NULL; @@ -1356,7 +1360,7 @@ static int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "name", &old_name); dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "vid", &vid); - snprintf(new_name, sizeof(new_name), "%s%s%s", vlan_linker, DM_STRLEN(vid) ? "." : "", DM_STRLEN(vid) ? vid : ""); + snprintf(new_name, sizeof(new_name), "%s%s%s", reference.value, DM_STRLEN(vid) ? "." : "", DM_STRLEN(vid) ? vid : ""); if (name_exists_in_devices(new_name)) return -1; @@ -1398,22 +1402,22 @@ static int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx } // Set ifname and name options of device section - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", vlan_linker); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", reference.value); dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "name", new_name); } - if (DM_STRNCMP(value, "Device.Ethernet.VLANTermination.", DM_STRLEN("Device.Ethernet.VLANTermination.")) == 0) { + if (DM_STRNCMP(reference.path, "Device.Ethernet.VLANTermination.", DM_STRLEN("Device.Ethernet.VLANTermination.")) == 0) { char new_name[32] = {0}; char *vid = NULL; dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "vid", &vid); - snprintf(new_name, sizeof(new_name), "%s%s%s", vlan_linker, DM_STRLEN(vid) ? "." : "", DM_STRLEN(vid) ? vid : ""); + snprintf(new_name, sizeof(new_name), "%s%s%s", reference.value, DM_STRLEN(vid) ? "." : "", DM_STRLEN(vid) ? vid : ""); if (name_exists_in_devices(new_name)) return -1; - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", vlan_linker); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", reference.value); dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "name", new_name); } @@ -1644,7 +1648,7 @@ static int get_EthernetRMONStats_Interface(char *refparam, struct dmctx *ctx, vo char *linker = NULL; dmuci_get_value_by_section_string((((struct eth_rmon_args *)data)->sections)->config_section, "name", &linker); - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", linker, value); return 0; } @@ -1796,10 +1800,10 @@ static int get_EthernetRMONStats_Packets1024to1518Bytes(char *refparam, struct d /* *** Device.Ethernet. *** */ DMOBJ tEthernetObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Interface", &DMREAD, NULL, NULL, NULL, browseEthernetInterfaceInst, NULL, NULL, tEthernetInterfaceObj, tEthernetInterfaceParams, get_linker_interface, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"Link", &DMWRITE, addObjEthernetLink, delObjEthernetLink, NULL, browseEthernetLinkInst, NULL, NULL, tEthernetLinkObj, tEthernetLinkParams, get_linker_link, BBFDM_BOTH, LIST_KEY{"Name", "Alias", "MACAddress", NULL}}, -{"VLANTermination", &DMWRITE, addObjEthernetVLANTermination, delObjEthernetVLANTermination, NULL, browseEthernetVLANTerminationInst, NULL, NULL, tEthernetVLANTerminationObj, tEthernetVLANTerminationParams, get_linker_vlan_term, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"RMONStats", &DMREAD, NULL, NULL, "ubus:ethernet->rmonstats", browseEthernetRMONStatsInst, NULL, NULL, NULL, tEthernetRMONStatsParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Interface", "VLANID", NULL}}, +{"Interface", &DMREAD, NULL, NULL, NULL, browseEthernetInterfaceInst, NULL, NULL, tEthernetInterfaceObj, tEthernetInterfaceParams, get_linker_interface, BBFDM_BOTH, NULL}, +{"Link", &DMWRITE, addObjEthernetLink, delObjEthernetLink, NULL, browseEthernetLinkInst, NULL, NULL, tEthernetLinkObj, tEthernetLinkParams, get_linker_link, BBFDM_BOTH, NULL}, +{"VLANTermination", &DMWRITE, addObjEthernetVLANTermination, delObjEthernetVLANTermination, NULL, browseEthernetVLANTerminationInst, NULL, NULL, tEthernetVLANTerminationObj, tEthernetVLANTerminationParams, get_linker_vlan_term, BBFDM_BOTH, NULL}, +{"RMONStats", &DMREAD, NULL, NULL, "ubus:ethernet->rmonstats", browseEthernetRMONStatsInst, NULL, NULL, NULL, tEthernetRMONStatsParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1824,8 +1828,8 @@ DMLEAF tEthernetInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_EthernetInterface_Enable, set_EthernetInterface_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_EthernetInterface_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_EthernetInterface_Alias, set_EthernetInterface_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_EthernetInterface_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_EthernetInterface_Alias, set_EthernetInterface_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_EthernetInterface_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"LastChange", &DMREAD, DMT_UNINT, get_EthernetInterface_LastChange, NULL, BBFDM_BOTH}, {"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetInterface_LowerLayers, set_EthernetInterface_LowerLayers, BBFDM_BOTH}, {"Upstream", &DMREAD, DMT_BOOL, get_EthernetInterface_Upstream, NULL, BBFDM_BOTH}, @@ -1870,11 +1874,11 @@ DMLEAF tEthernetLinkParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_EthernetLink_Enable, set_EthernetLink_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_EthernetLink_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_EthernetLink_Alias, set_EthernetLink_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_EthernetLink_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_EthernetLink_Alias, set_EthernetLink_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_EthernetLink_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"LastChange", &DMREAD, DMT_UNINT, get_EthernetLink_LastChange, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetLink_LowerLayers, set_EthernetLink_LowerLayers, BBFDM_BOTH}, -{"MACAddress", &DMREAD, DMT_STRING, get_EthernetLink_MACAddress, NULL, BBFDM_BOTH}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetLink_LowerLayers, set_EthernetLink_LowerLayers, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"MACAddress", &DMREAD, DMT_STRING, get_EthernetLink_MACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"FlowControl", &DMWRITE, DMT_BOOL, get_EthernetLink_FlowControl, set_EthernetLink_FlowControl, BBFDM_BOTH}, {0} }; @@ -1911,10 +1915,10 @@ DMLEAF tEthernetVLANTerminationParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_EthernetVLANTermination_Enable, set_EthernetVLANTermination_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_EthernetVLANTermination_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_EthernetVLANTermination_Alias, set_EthernetVLANTermination_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_EthernetVLANTermination_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_EthernetVLANTermination_Alias, set_EthernetVLANTermination_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_EthernetVLANTermination_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, //{"LastChange", &DMREAD, DMT_UNINT, get_EthernetVLANTermination_LastChange, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetVLANTermination_LowerLayers, set_EthernetVLANTermination_LowerLayers, BBFDM_BOTH}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetVLANTermination_LowerLayers, set_EthernetVLANTermination_LowerLayers, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"VLANID", &DMWRITE, DMT_UNINT, get_EthernetVLANTermination_VLANID, set_EthernetVLANTermination_VLANID, BBFDM_BOTH}, {"TPID", &DMWRITE, DMT_UNINT, get_EthernetVLANTermination_TPID, set_EthernetVLANTermination_TPID, BBFDM_BOTH}, {0} @@ -1946,10 +1950,10 @@ DMLEAF tEthernetRMONStatsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_EthernetRMONStats_Enable, set_EthernetRMONStats_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_EthernetRMONStats_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_EthernetRMONStats_Alias, set_EthernetRMONStats_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_EthernetRMONStats_Alias, set_EthernetRMONStats_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Name", &DMREAD, DMT_STRING, get_EthernetRMONStats_Name, NULL, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_EthernetRMONStats_Interface, set_EthernetRMONStats_Interface, BBFDM_BOTH}, -{"VLANID", &DMWRITE, DMT_UNINT, get_EthernetRMONStats_VLANID, set_EthernetRMONStats_VLANID, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_EthernetRMONStats_Interface, set_EthernetRMONStats_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"VLANID", &DMWRITE, DMT_UNINT, get_EthernetRMONStats_VLANID, set_EthernetRMONStats_VLANID, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"Queue", &DMWRITE, DMT_STRING, get_EthernetRMONStats_Queue, set_EthernetRMONStats_Queue, BBFDM_BOTH}, {"AllQueues", &DMWRITE, DMT_BOOL, get_EthernetRMONStats_AllQueues, set_EthernetRMONStats_AllQueues, BBFDM_BOTH}, //{"DropEvents", &DMREAD, DMT_UNINT, get_EthernetRMONStats_DropEvents, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/fast.c b/libbbfdm/dmtree/tr181/fast.c index 63b5693e..a2ab984e 100644 --- a/libbbfdm/dmtree/tr181/fast.c +++ b/libbbfdm/dmtree/tr181/fast.c @@ -888,7 +888,7 @@ static int get_FASTLineStatsQuarterHour_SuccessTIGA(char *refparam, struct dmctx /* *** Device.FAST. *** */ DMOBJ tFASTObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Line", &DMREAD, NULL, NULL, NULL, browseFASTLineInst, NULL, NULL, tFASTLineObj, tFASTLineParams, get_fast_line_linker, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Line", &DMREAD, NULL, NULL, NULL, browseFASTLineInst, NULL, NULL, tFASTLineObj, tFASTLineParams, get_fast_line_linker, BBFDM_BOTH, NULL}, {0} }; @@ -909,8 +909,8 @@ DMLEAF tFASTLineParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_FASTLine_Enable, set_FASTLine_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_FASTLine_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_FASTLine_Alias, set_FASTLine_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_FASTLine_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_FASTLine_Alias, set_FASTLine_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_FASTLine_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"LowerLayers", &DMWRITE, DMT_STRING, get_FASTLine_LowerLayers, set_FASTLine_LowerLayers, BBFDM_BOTH}, {"Upstream", &DMREAD, DMT_BOOL, get_FASTLine_Upstream, NULL, BBFDM_BOTH}, {"FirmwareVersion", &DMREAD, DMT_STRING, get_FASTLine_FirmwareVersion, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/firewall.c b/libbbfdm/dmtree/tr181/firewall.c index 046e23c5..f5ca637f 100644 --- a/libbbfdm/dmtree/tr181/firewall.c +++ b/libbbfdm/dmtree/tr181/firewall.c @@ -797,7 +797,7 @@ static int get_rule_source_interface(char *refparam, struct dmctx *ctx, void *da src_iface[0] = 0; uci_foreach_element(net_list, e) { - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", e->name, &ifaceobj); if (ifaceobj && *ifaceobj) pos += snprintf(&src_iface[pos], sizeof(src_iface) - pos, "%s,", ifaceobj); } @@ -810,7 +810,7 @@ static int get_rule_source_interface(char *refparam, struct dmctx *ctx, void *da } } - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", src, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", src, value); return 0; } @@ -866,7 +866,7 @@ static int get_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data dst_iface[0] = 0; uci_foreach_element(net_list, e) { - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", e->name, &ifaceobj); if (ifaceobj && *ifaceobj) pos += snprintf(&dst_iface[pos], sizeof(dst_iface) - pos, "%s,", ifaceobj); } @@ -879,7 +879,7 @@ static int get_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data } } - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", dest, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", dest, value); return 0; } @@ -1463,32 +1463,33 @@ static int set_rule_log(char *refparam, struct dmctx *ctx, void *data, char *ins static int set_rule_interface(struct dmctx *ctx, void *data, char *type, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *iface = NULL, *option = NULL; + struct dm_reference reference = {0}; + char *option = NULL; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, type, &option); - if (*value == '\0') { + if (DM_STRLEN(reference.path) == 0) { dmuci_set_value_by_section((option && DM_LSTRCMP(option, "*") == 0) ? ((struct rule_sec *)data)->dmmap_section : ((struct rule_sec *)data)->config_section, type, ""); } else { - adm_entry_get_linker_value(ctx, value, &iface); - if (iface && iface[0] != '\0') { + if (DM_STRLEN(reference.value)) { // check if firewall zone exists - if (!firewall_zone_exists(iface)) - firewall__create_zone_section(iface); + if (!firewall_zone_exists(reference.value)) + firewall__create_zone_section(reference.value); - dmuci_set_value_by_section((option && DM_LSTRCMP(option, "*") == 0) ? ((struct rule_sec *)data)->dmmap_section : ((struct rule_sec *)data)->config_section, type, iface); - dmfree(iface); + dmuci_set_value_by_section((option && DM_LSTRCMP(option, "*") == 0) ? ((struct rule_sec *)data)->dmmap_section : ((struct rule_sec *)data)->config_section, type, reference.value); } } break; @@ -1819,8 +1820,8 @@ static int set_rule_source_port_range_max(char *refparam, struct dmctx *ctx, voi /* *** Device.Firewall. *** */ DMOBJ tFirewallObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Level", &DMREAD, NULL, NULL, NULL, browseLevelInst, NULL, NULL, NULL, tFirewallLevelParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"Chain", &DMREAD, NULL, NULL, NULL, browseChainInst, NULL, NULL, tFirewallChainObj, tFirewallChainParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Level", &DMREAD, NULL, NULL, NULL, browseLevelInst, NULL, NULL, NULL, tFirewallLevelParams, NULL, BBFDM_BOTH, NULL}, +{"Chain", &DMREAD, NULL, NULL, NULL, browseChainInst, NULL, NULL, tFirewallChainObj, tFirewallChainParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1837,8 +1838,8 @@ DMLEAF tFirewallParams[] = { /* *** Device.Firewall.Level.{i}. *** */ DMLEAF tFirewallLevelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_level_alias, set_level_alias, BBFDM_BOTH}, -{"Name", &DMWRITE, DMT_STRING, get_level_name, set_level_name, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_level_alias, set_level_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMWRITE, DMT_STRING, get_level_name, set_level_name, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Description", &DMWRITE, DMT_STRING, get_level_description, set_level_description, BBFDM_BOTH}, {"Chain", &DMREAD, DMT_STRING, get_level_chain, NULL, BBFDM_BOTH}, {"PortMappingEnabled", &DMWRITE, DMT_BOOL, get_level_port_mapping_enabled, set_level_port_mapping_enabled, BBFDM_BOTH}, @@ -1850,15 +1851,15 @@ DMLEAF tFirewallLevelParams[] = { /* *** Device.Firewall.Chain.{i}. *** */ DMOBJ tFirewallChainObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Rule", &DMWRITE, add_firewall_rule, delete_firewall_rule, NULL, browseRuleInst, NULL, NULL, NULL, tFirewallChainRuleParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Rule", &DMWRITE, add_firewall_rule, delete_firewall_rule, NULL, browseRuleInst, NULL, NULL, NULL, tFirewallChainRuleParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tFirewallChainParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_chain_enable, set_chain_enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_chain_alias, set_chain_alias, BBFDM_BOTH}, -{"Name", &DMWRITE, DMT_STRING, get_chain_name, set_chain_name, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_chain_alias, set_chain_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMWRITE, DMT_STRING, get_chain_name, set_chain_name, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Creator", &DMREAD, DMT_STRING, get_chain_creator, NULL, BBFDM_BOTH}, {"RuleNumberOfEntries", &DMREAD, DMT_UNINT, get_chain_rule_number_of_entries, NULL, BBFDM_BOTH}, {0} @@ -1870,16 +1871,16 @@ DMLEAF tFirewallChainRuleParams[] = { {"Enable", &DMRule, DMT_BOOL, get_rule_enable, set_rule_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_rule_status, NULL, BBFDM_BOTH}, {"Order", &DMRule, DMT_UNINT, get_rule_order, set_rule_order, BBFDM_BOTH}, -{"Alias", &DMRule, DMT_STRING, get_rule_alias, set_rule_alias, BBFDM_BOTH}, +{"Alias", &DMRule, DMT_STRING, get_rule_alias, set_rule_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Description", &DMRule, DMT_STRING, get_rule_description, set_rule_description, BBFDM_BOTH}, {"Target", &DMRule, DMT_STRING, get_rule_target, set_rule_target, BBFDM_BOTH}, //{"TargetChain", &DMRule, DMT_STRING, get_rule_target_chain, set_rule_target_chain, BBFDM_BOTH}, {"Log", &DMRule, DMT_BOOL, get_rule_log, set_rule_log, BBFDM_BOTH}, {"CreationDate", &DMREAD, DMT_TIME, get_FirewallChainRule_CreationDate, NULL, BBFDM_BOTH}, {"ExpiryDate", &DMRule, DMT_TIME, get_FirewallChainRule_ExpiryDate, set_FirewallChainRule_ExpiryDate, BBFDM_BOTH}, -{"SourceInterface", &DMRule, DMT_STRING, get_rule_source_interface, set_rule_source_interface, BBFDM_BOTH}, +{"SourceInterface", &DMRule, DMT_STRING, get_rule_source_interface, set_rule_source_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"SourceAllInterfaces", &DMRule, DMT_BOOL, get_rule_source_all_interfaces, set_rule_source_all_interfaces, BBFDM_BOTH}, -{"DestInterface", &DMRule, DMT_STRING, get_rule_dest_interface, set_rule_dest_interface, BBFDM_BOTH}, +{"DestInterface", &DMRule, DMT_STRING, get_rule_dest_interface, set_rule_dest_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"DestAllInterfaces", &DMRule, DMT_BOOL, get_rule_dest_all_interfaces, set_rule_dest_all_interfaces, BBFDM_BOTH}, {"IPVersion", &DMRule, DMT_INT, get_rule_i_p_version, set_rule_i_p_version, BBFDM_BOTH}, {"DestIP", &DMRule, DMT_STRING, get_rule_dest_ip, set_rule_dest_ip, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/gre.c b/libbbfdm/dmtree/tr181/gre.c index cfab9a37..3309d9ca 100644 --- a/libbbfdm/dmtree/tr181/gre.c +++ b/libbbfdm/dmtree/tr181/gre.c @@ -329,8 +329,8 @@ static int get_GRETunnelInterfaceStats_ErrorsReceived(char *refparam, struct dmc /* *** Device.GRE. *** */ DMOBJ tGREObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Tunnel", &DMWRITE, addObjGRETunnel, delObjGRETunnel, NULL, browseGRETunnelInst, NULL, NULL, tGRETunnelObj, tGRETunnelParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -//{"Filter", &DMWRITE, addObjGREFilter, delObjGREFilter, NULL, browseGREFilterInst, NULL, NULL, NULL, tGREFilterParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Tunnel", &DMWRITE, addObjGRETunnel, delObjGRETunnel, NULL, browseGRETunnelInst, NULL, NULL, tGRETunnelObj, tGRETunnelParams, NULL, BBFDM_BOTH, NULL}, +//{"Filter", &DMWRITE, addObjGREFilter, delObjGREFilter, NULL, browseGREFilterInst, NULL, NULL, NULL, tGREFilterParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -345,7 +345,7 @@ DMLEAF tGREParams[] = { DMOBJ tGRETunnelObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tGRETunnelStatsParams, NULL, BBFDM_BOTH, NULL}, -{"Interface", &DMWRITE, addObjGRETunnelInterface, delObjGRETunnelInterface, NULL, browseGRETunnelInterfaceInst, NULL, NULL, tGRETunnelInterfaceObj, tGRETunnelInterfaceParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Interface", &DMWRITE, addObjGRETunnelInterface, delObjGRETunnelInterface, NULL, browseGRETunnelInterfaceInst, NULL, NULL, tGRETunnelInterfaceObj, tGRETunnelInterfaceParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -353,7 +353,7 @@ DMLEAF tGRETunnelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ //{"Enable", &DMWRITE, DMT_BOOL, get_GRETunnel_Enable, set_GRETunnel_Enable, BBFDM_BOTH}, //{"Status", &DMREAD, DMT_STRING, get_GRETunnel_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_GRETunnel_Alias, set_GRETunnel_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_GRETunnel_Alias, set_GRETunnel_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"RemoteEndpoints", &DMWRITE, DMT_STRING, get_GRETunnel_RemoteEndpoints, set_GRETunnel_RemoteEndpoints, BBFDM_BOTH}, //{"KeepAlivePolicy", &DMWRITE, DMT_STRING, get_GRETunnel_KeepAlivePolicy, set_GRETunnel_KeepAlivePolicy, BBFDM_BOTH}, //{"KeepAliveTimeout", &DMWRITE, DMT_UNINT, get_GRETunnel_KeepAliveTimeout, set_GRETunnel_KeepAliveTimeout, BBFDM_BOTH}, @@ -390,8 +390,8 @@ DMLEAF tGRETunnelInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ //{"Enable", &DMWRITE, DMT_BOOL, get_GRETunnelInterface_Enable, set_GRETunnelInterface_Enable, BBFDM_BOTH}, //{"Status", &DMREAD, DMT_STRING, get_GRETunnelInterface_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_GRETunnelInterface_Alias, set_GRETunnelInterface_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_GRETunnelInterface_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_GRETunnelInterface_Alias, set_GRETunnelInterface_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_GRETunnelInterface_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"LastChange", &DMREAD, DMT_UNINT, get_GRETunnelInterface_LastChange, NULL, BBFDM_BOTH}, //{"LowerLayers", &DMWRITE, DMT_STRING, get_GRETunnelInterface_LowerLayers, set_GRETunnelInterface_LowerLayers, BBFDM_BOTH}, //{"ProtocolIdOverride", &DMWRITE, DMT_UNINT, get_GRETunnelInterface_ProtocolIdOverride, set_GRETunnelInterface_ProtocolIdOverride, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/ieee1905.c b/libbbfdm/dmtree/tr181/ieee1905.c index 6b6ad05a..87cd21f2 100644 --- a/libbbfdm/dmtree/tr181/ieee1905.c +++ b/libbbfdm/dmtree/tr181/ieee1905.c @@ -32,15 +32,6 @@ struct ieee1905_device_ieee1905neighbor_args json_object *dev_obj; }; -/************************************************************************** -* LINKER -***************************************************************************/ -static int get_linker_IEEE1905Device(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - *linker = dmjson_get_value((json_object *)data, 1, "ieee1905id"); - return 0; -} - /************************************************************* * ENTRY METHOD **************************************************************/ @@ -407,15 +398,6 @@ static int delObjIEEE1905ALForwardingTableForwardingRule(char *refparam, struct return 0; } -/************************************************************* -* LINKER -**************************************************************/ -static int get_linker_topology_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - *linker = dmjson_get_value((json_object *)data, 1, "macaddress"); - return 0; -} - /************************************************************* * COMMON FUNCTIONS **************************************************************/ @@ -549,13 +531,14 @@ static int get_IEEE1905ALInterface_LowerLayers(char *refparam, struct dmctx *ctx { char *linker = dmjson_get_value((json_object *)data, 1, "ifname"); - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", linker, value); - if (!(*value) || (*value)[0] == 0) { + if (!DM_STRLEN(*value)) { struct uci_section *s = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", linker); dmuci_get_value_by_section_string(s, "device", &linker); - adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", linker, value); + adm_entry_get_reference_param(ctx, "Device.WiFi.Radio.*.Name", linker, value); } + return 0; } @@ -1513,8 +1496,7 @@ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceInterface_FrequencyIndex2( /*#Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}.LocalInterface!UBUS:ieee1905/info//topology.device[@i-1].non1905_neighbors[@i-1].interface_macaddress*/ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905Neighbor_LocalInterface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = ((struct ieee1905_device_nonieee1905neighbor_args *)data)->mac_addr; - adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.*.Interface.*.InterfaceId", ((struct ieee1905_device_nonieee1905neighbor_args *)data)->mac_addr, value); return 0; } @@ -1549,7 +1531,7 @@ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceL2Neighbor_BehindInterface static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_LocalInterface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = ((struct ieee1905_device_ieee1905neighbor_args *)data)->mac_addr; - adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.*.Interface.*.InterfaceId", linker, value); return 0; } @@ -1650,7 +1632,7 @@ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTuple_InterfaceLis dmjson_foreach_value_in_array((json_object *)data, json_obj, mac_addr, idx, 1, "tuple") { char *linker = NULL; - adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", mac_addr, &linker); + adm_entry_get_reference_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.*.Interface.*.InterfaceId", mac_addr, &linker); if (DM_STRLEN(linker) && (sizeof(buf) - pos) > 0) pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", linker); } @@ -1734,7 +1716,7 @@ DMLEAF tIEEE1905Params[] = { /* *** Device.IEEE1905.AL. *** */ DMOBJ tIEEE1905ALObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Interface", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALInterfaceInst, NULL, NULL, tIEEE1905ALInterfaceObj, tIEEE1905ALInterfaceParams, NULL, BBFDM_BOTH, LIST_KEY{"InterfaceId", NULL}}, +{"Interface", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALInterfaceInst, NULL, NULL, tIEEE1905ALInterfaceObj, tIEEE1905ALInterfaceParams, NULL, BBFDM_BOTH, NULL}, {"ForwardingTable", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIEEE1905ALForwardingTableObj, tIEEE1905ALForwardingTableParams, NULL, BBFDM_BOTH, NULL}, {"NetworkTopology", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyObj, tIEEE1905ALNetworkTopologyParams, NULL, BBFDM_BOTH, NULL}, {"Security", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIEEE1905ALSecurityParams, NULL, BBFDM_BOTH, NULL}, @@ -1755,15 +1737,15 @@ DMLEAF tIEEE1905ALParams[] = { DMOBJ tIEEE1905ALInterfaceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"VendorProperties", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALInterfaceVendorPropertiesInst, NULL, NULL, NULL, tIEEE1905ALInterfaceVendorPropertiesParams, NULL, BBFDM_BOTH}, -{"Link", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALInterfaceLinkInst, NULL, NULL, tIEEE1905ALInterfaceLinkObj, tIEEE1905ALInterfaceLinkParams, NULL, BBFDM_BOTH, LIST_KEY{"InterfaceId", "IEEE1905Id", NULL}}, +{"Link", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALInterfaceLinkInst, NULL, NULL, tIEEE1905ALInterfaceLinkObj, tIEEE1905ALInterfaceLinkParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tIEEE1905ALInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"InterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_InterfaceId, NULL, BBFDM_BOTH}, +{"InterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_InterfaceId, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Status", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_Status, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_LowerLayers, NULL, BBFDM_BOTH}, +{"LowerLayers", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_LowerLayers, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, //{"InterfaceStackReference", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_InterfaceStackReference, NULL, BBFDM_BOTH}, {"MediaType", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_MediaType, NULL, BBFDM_BOTH}, //{"GenericPhyOUI", &DMREAD, DMT_STRING, get_IEEE1905ALInterface_GenericPhyOUI, NULL, BBFDM_BOTH}, @@ -1793,8 +1775,8 @@ DMOBJ tIEEE1905ALInterfaceLinkObj[] = { DMLEAF tIEEE1905ALInterfaceLinkParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"InterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALInterfaceLink_InterfaceId, NULL, BBFDM_BOTH}, -{"IEEE1905Id", &DMREAD, DMT_STRING, get_IEEE1905ALInterfaceLink_IEEE1905Id, NULL, BBFDM_BOTH}, +{"InterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALInterfaceLink_InterfaceId, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"IEEE1905Id", &DMREAD, DMT_STRING, get_IEEE1905ALInterfaceLink_IEEE1905Id, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"MediaType", &DMREAD, DMT_STRING, get_IEEE1905ALInterfaceLink_MediaType, NULL, BBFDM_BOTH}, //{"GenericPhyOUI", &DMREAD, DMT_STRING, get_IEEE1905ALInterfaceLink_GenericPhyOUI, NULL, BBFDM_BOTH}, //{"GenericPhyVariant", &DMREAD, DMT_HEXBIN, get_IEEE1905ALInterfaceLink_GenericPhyVariant, NULL, BBFDM_BOTH}, @@ -1851,8 +1833,8 @@ DMLEAF tIEEE1905ALForwardingTableForwardingRuleParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology. *** */ DMOBJ tIEEE1905ALNetworkTopologyObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -//{"ChangeLog", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyChangeLogInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyChangeLogParams, NULL, BBFDM_BOTH, NULL}, -{"IEEE1905Device", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceInst, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceObj, tIEEE1905ALNetworkTopologyIEEE1905DeviceParams, get_linker_IEEE1905Device, BBFDM_BOTH, LIST_KEY{"IEEE1905Id", NULL}}, +//{"ChangeLog", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyChangeLogInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyChangeLogParams, NULL, BBFDM_BOTH}, +{"IEEE1905Device", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceInst, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceObj, tIEEE1905ALNetworkTopologyIEEE1905DeviceParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1882,20 +1864,20 @@ DMLEAF tIEEE1905ALNetworkTopologyChangeLogParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}. *** */ DMOBJ tIEEE1905ALNetworkTopologyIEEE1905DeviceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"IPv4Address", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIPv4AddressInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv4AddressParams, NULL, BBFDM_BOTH, LIST_KEY{"MACAddress", "IPv4Address", NULL}}, -{"IPv6Address", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIPv6AddressInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv6AddressParams, NULL, BBFDM_BOTH, LIST_KEY{"MACAddress", "IPv6Address", NULL}}, +{"IPv4Address", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIPv4AddressInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv4AddressParams, NULL, BBFDM_BOTH, NULL}, +{"IPv6Address", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIPv6AddressInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv6AddressParams, NULL, BBFDM_BOTH, NULL}, {"VendorProperties", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceVendorPropertiesInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceVendorPropertiesParams, NULL, BBFDM_BOTH, NULL}, -{"Interface", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceInterfaceInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceInterfaceParams, get_linker_topology_interface, BBFDM_BOTH, LIST_KEY{"InterfaceId", NULL}}, -{"NonIEEE1905Neighbor", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905NeighborInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905NeighborParams, NULL, BBFDM_BOTH, LIST_KEY{"LocalInterface", "NeighborInterfaceId", NULL}}, -//{"L2Neighbor", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceL2NeighborInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceL2NeighborParams, NULL, BBFDM_BOTH, (const char*[]){"LocalInterface", "NeighborInterfaceId", NULL}}, -{"IEEE1905Neighbor", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborInst, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborObj, tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborParams, NULL, BBFDM_BOTH, LIST_KEY{"LocalInterface", "NeighborDeviceId", NULL}}, +{"Interface", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceInterfaceInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceInterfaceParams, NULL, BBFDM_BOTH, NULL}, +{"NonIEEE1905Neighbor", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905NeighborInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905NeighborParams, NULL, BBFDM_BOTH, NULL}, +//{"L2Neighbor", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceL2NeighborInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceL2NeighborParams, NULL, BBFDM_BOTH, NULL}, +{"IEEE1905Neighbor", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborInst, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborObj, tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborParams, NULL, BBFDM_BOTH, NULL}, {"BridgingTuple", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTupleInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTupleParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"IEEE1905Id", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905Device_IEEE1905Id, NULL, BBFDM_BOTH}, +{"IEEE1905Id", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905Device_IEEE1905Id, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Version", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905Device_Version, NULL, BBFDM_BOTH}, //{"RegistrarFreqBand", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905Device_RegistrarFreqBand, NULL, BBFDM_BOTH}, {"FriendlyName", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905Device_FriendlyName, NULL, BBFDM_BOTH}, @@ -1917,8 +1899,8 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv4Address.{i}. *** */ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv4AddressParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"MACAddress", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv4Address_MACAddress, NULL, BBFDM_BOTH}, -{"IPv4Address", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv4Address_IPv4Address, NULL, BBFDM_BOTH}, +{"MACAddress", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv4Address_MACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"IPv4Address", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv4Address_IPv4Address, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"IPv4AddressType", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv4Address_IPv4AddressType, NULL, BBFDM_BOTH}, {"DHCPServer", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv4Address_DHCPServer, NULL, BBFDM_BOTH}, {0} @@ -1927,8 +1909,8 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv4AddressParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv6Address.{i}. *** */ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIPv6AddressParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"MACAddress", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv6Address_MACAddress, NULL, BBFDM_BOTH}, -{"IPv6Address", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv6Address_IPv6Address, NULL, BBFDM_BOTH}, +{"MACAddress", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv6Address_MACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"IPv6Address", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv6Address_IPv6Address, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"IPv6AddressType", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv6Address_IPv6AddressType, NULL, BBFDM_BOTH}, {"IPv6AddressOrigin", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIPv6Address_IPv6AddressOrigin, NULL, BBFDM_BOTH}, {0} @@ -1946,7 +1928,7 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceVendorPropertiesParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}. *** */ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"InterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceInterface_InterfaceId, NULL, BBFDM_BOTH}, +{"InterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceInterface_InterfaceId, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"MediaType", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceInterface_MediaType, NULL, BBFDM_BOTH}, {"PowerState", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceInterface_PowerState, NULL, BBFDM_BOTH}, //{"GenericPhyOUI", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceInterface_GenericPhyOUI, NULL, BBFDM_BOTH}, @@ -1963,8 +1945,8 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceInterfaceParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}. *** */ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905NeighborParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"LocalInterface", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905Neighbor_LocalInterface, NULL, BBFDM_BOTH}, -{"NeighborInterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905Neighbor_NeighborInterfaceId, NULL, BBFDM_BOTH}, +{"LocalInterface", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905Neighbor_LocalInterface, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"NeighborInterfaceId", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905Neighbor_NeighborInterfaceId, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {0} }; @@ -1980,14 +1962,14 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceL2NeighborParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}. *** */ DMOBJ tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/ -{"Metric", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetricInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetricParams, NULL, BBFDM_BOTH, LIST_KEY{"NeighborMACAddress", NULL}}, +{"Metric", &DMREAD, NULL, NULL, NULL, browseIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetricInst, NULL, NULL, NULL, tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetricParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"LocalInterface", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_LocalInterface, NULL, BBFDM_BOTH}, -{"NeighborDeviceId", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_NeighborDeviceId, NULL, BBFDM_BOTH}, +{"LocalInterface", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_LocalInterface, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"NeighborDeviceId", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_NeighborDeviceId, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"MetricNumberOfEntries", &DMREAD, DMT_UNINT, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_MetricNumberOfEntries, NULL, BBFDM_BOTH}, {0} }; @@ -1995,7 +1977,7 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborParams[] = { /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.Metric.{i}. *** */ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetricParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"NeighborMACAddress", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetric_NeighborMACAddress, NULL, BBFDM_BOTH}, +{"NeighborMACAddress", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetric_NeighborMACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"IEEE802dot1Bridge", &DMREAD, DMT_BOOL, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetric_IEEE802dot1Bridge, NULL, BBFDM_BOTH}, {"PacketErrors", &DMREAD, DMT_UNINT, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetric_PacketErrors, NULL, BBFDM_BOTH}, {"PacketErrorsReceived", &DMREAD, DMT_UNINT, get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetric_PacketErrorsReceived, NULL, BBFDM_BOTH}, @@ -2011,7 +1993,7 @@ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905NeighborMetricParams[] = /* *** Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.BridgingTuple.{i}. *** */ DMLEAF tIEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTupleParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"InterfaceList", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTuple_InterfaceList, NULL, BBFDM_BOTH}, +{"InterfaceList", &DMREAD, DMT_STRING, get_IEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTuple_InterfaceList, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, {0} }; diff --git a/libbbfdm/dmtree/tr181/ip.c b/libbbfdm/dmtree/tr181/ip.c index 8494c10c..a30678d3 100644 --- a/libbbfdm/dmtree/tr181/ip.c +++ b/libbbfdm/dmtree/tr181/ip.c @@ -313,7 +313,7 @@ static struct uci_section *update_dmmap_network_interface(char *dmmap_file_name, dmuci_set_value_by_section_bbfdm(dmmap_section, "parent_section", parent_section); dmuci_set_value_by_section_bbfdm(dmmap_section, "section_name", section_name); dmuci_set_value_by_section_bbfdm(dmmap_section, option, value); - if (assign) dmuci_set_value_by_section_bbfdm(dmmap_section, "assign", "1"); + dmuci_set_value_by_section_bbfdm(dmmap_section, "assign", assign ? "1" : "0"); } return dmmap_section; @@ -831,9 +831,21 @@ static int browseIPInterfaceIPv6PrefixInst(struct dmctx *dmctx, DMNODE *parent_n } else { + dmjson_foreach_obj_in_array(res, arrobj, ipv6_prefix_obj, i, 1, "ipv6-prefix") { + char *address = dmjson_get_value(ipv6_prefix_obj, 1, "address"); + char *mask = dmjson_get_value(ipv6_prefix_obj, 1, "mask"); + if (*address == '\0' || *mask == '\0') + continue; + + snprintf(ipv6_prefix, sizeof(ipv6_prefix), "%s/%s", address, mask); + + if (DM_STRCMP(ipv6_prefix, ip6prefix) == 0) + break; + } + dmmap_s = update_dmmap_network_interface("dmmap_network_ipv6_prefix","intf_ipv6_prefix", section_name(parent_sec), section_name(intf_s), "address", ip6prefix, false); - init_interface_ip_args(&curr_intf_ip_args, intf_s, dmmap_s, NULL, !strcmp(section_name(parent_sec), section_name(intf_s))); + init_interface_ip_args(&curr_intf_ip_args, intf_s, dmmap_s, ipv6_prefix_obj, !strcmp(section_name(parent_sec), section_name(intf_s))); inst = handle_instance(dmctx, parent_node, dmmap_s, "ipv6_prefix_instance", "ipv6_prefix_alias"); @@ -1253,27 +1265,15 @@ static int get_IPInterface_Alias(char *refparam, struct dmctx *ctx, void *data, struct uci_section *dmmap_section = NULL; get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section); - dmuci_get_value_by_section_string(dmmap_section, "ip_int_alias", value); - if ((*value)[0] == '\0') - dmasprintf(value, "cpe-%s", instance); - return 0; + return bbf_get_alias(ctx, dmmap_section, "ip_int_alias", instance, value); } static int set_IPInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { struct uci_section *dmmap_section = NULL; - switch (action) { - case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 64, NULL, NULL)) - return FAULT_9007; - break; - case VALUESET: - get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section); - dmuci_set_value_by_section(dmmap_section, "ip_int_alias", value); - break; - } - return 0; + get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section); + return bbf_set_alias(ctx, dmmap_section, "ip_int_alias", instance, value); } static int get_IPInterface_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) @@ -1309,26 +1309,28 @@ static int get_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void * return 0; } - adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", device, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.PPP.Interface.*.Name", device, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet."BBF_VENDOR_PREFIX"MACVLAN", device, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.Ethernet."BBF_VENDOR_PREFIX"MACVLAN.*.Name", device, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", device, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.Ethernet.VLANTermination.*.Name", device, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", device, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Link.*.Name", device, value); + +end: + // Store LowerLayers value + dmuci_set_value_by_section(dmmap_section, "LowerLayers", *value); } else { - char *linker = NULL; - - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) + if (!adm_entry_object_exists(ctx, *value)) *value = ""; } + return 0; } @@ -1342,26 +1344,26 @@ static int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void * "Device.Ethernet.VLANTermination.", "Device.Ethernet.Link.", NULL}; - char *linker = NULL; char *curr_device = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - // Store LowerLayers value under dmmap_network section get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section); - dmuci_set_value_by_section(dmmap_section, "LowerLayers", value); + dmuci_set_value_by_section(dmmap_section, "LowerLayers", reference.path); - if (DM_STRLEN(linker) == 0) { + if (DM_STRLEN(reference.value) == 0) { char *curr_proto = NULL; // Update device option @@ -1381,10 +1383,10 @@ static int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void * } dmuci_get_value_by_section_string((struct uci_section *)data, "device", &curr_device); - update_child_interfaces(curr_device, "device", linker); + update_child_interfaces(curr_device, "device", reference.value); - if (DM_STRNCMP(value, "Device.PPP.Interface.", strlen("Device.PPP.Interface.")) == 0) { - struct uci_section *ppp_s = get_dup_section_in_dmmap_opt("dmmap_ppp", "interface", "device", linker); + if (DM_STRNCMP(reference.path, "Device.PPP.Interface.", strlen("Device.PPP.Interface.")) == 0) { + struct uci_section *ppp_s = get_dup_section_in_dmmap_opt("dmmap_ppp", "interface", "device", reference.value); dmuci_set_value_by_section_bbfdm(ppp_s, "iface_name", section_name((struct uci_section *)data)); ppp___update_sections(ppp_s, (struct uci_section *)data); } @@ -1404,49 +1406,50 @@ static int get_IPInterface_Router(char *refparam, struct dmctx *ctx, void *data, char *ip4table = NULL; dmuci_get_value_by_section_string((struct uci_section *)data, "ip4table", &ip4table); - adm_entry_get_linker_param(ctx, "Device.Routing.Router.", DM_STRLEN(ip4table) ? ip4table : "254", value); - } else { - char *linker = NULL; - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) - *value = "Device.Routing.Router.1"; + adm_entry_get_reference_param(ctx, "Device.Routing.Router.*.Alias", DM_STRLEN(ip4table) ? ip4table : "254", value); + + // Store LowerLayers value + dmuci_set_value_by_section(dmmap_section, "Router", *value); } + return 0; } static int set_IPInterface_Router(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.Routing.Router.", NULL}; + struct dm_reference reference = {0}; struct uci_section *s = NULL; - char *rt_table = NULL; char *device = NULL; + bbf_get_reference_args(value, &reference); + switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &rt_table); - if (!rt_table || *rt_table == 0) + if (DM_STRLEN(reference.value) == 0) return FAULT_9007; + // Store LowerLayers value get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &s); - dmuci_set_value_by_section(s, "Router", value); + dmuci_set_value_by_section(s, "Router", reference.path); - dmuci_set_value_by_section((struct uci_section *)data, "ip4table", rt_table); - dmuci_set_value_by_section((struct uci_section *)data, "ip6table", rt_table); + dmuci_set_value_by_section((struct uci_section *)data, "ip4table", reference.value); + dmuci_set_value_by_section((struct uci_section *)data, "ip6table", reference.value); dmuci_get_value_by_section_string((struct uci_section *)data, "device", &device); uci_foreach_option_eq("network", "interface", "device", device, s) { - dmuci_set_value_by_section(s, "ip4table", rt_table); - dmuci_set_value_by_section(s, "ip6table", rt_table); + dmuci_set_value_by_section(s, "ip4table", reference.value); + dmuci_set_value_by_section(s, "ip6table", reference.value); } break; } @@ -2045,10 +2048,15 @@ static int get_IPInterfaceIPv6Prefix_Origin(char *refparam, struct dmctx *ctx, v static int get_IPInterfaceIPv6Prefix_ParentPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = NULL; + char *assign = NULL; - dmuci_get_value_by_section_string(((struct intf_ip_args *)data)->dmmap_sec, "address", &linker); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + dmuci_get_value_by_section_string(((struct intf_ip_args *)data)->dmmap_sec, "assign", &assign); + if (DM_LSTRCMP(assign, "1") == 0) { + char *linker = NULL; + + dmuci_get_value_by_section_string(((struct intf_ip_args *)data)->dmmap_sec, "address", &linker); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.IPv6Prefix.*.ChildPrefixBits", linker, value); + } return 0; } @@ -2216,7 +2224,7 @@ static int operate_IPInterface_Reset(char *refparam, struct dmctx *ctx, void *da /* *** Device.IP. *** */ DMOBJ tIPObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Interface", &DMWRITE, addObjIPInterface, delObjIPInterface, NULL, browseIPInterfaceInst, NULL, NULL, tIPInterfaceObj, tIPInterfaceParams, get_linker_ip_interface, BBFDM_BOTH, LIST_KEY{"Alias", "Name", NULL}}, +{"Interface", &DMWRITE, addObjIPInterface, delObjIPInterface, NULL, browseIPInterfaceInst, NULL, NULL, tIPInterfaceObj, tIPInterfaceParams, get_linker_ip_interface, BBFDM_BOTH, NULL}, #if defined(BBF_TR143) || defined(BBF_TR471) {"Diagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsObj, tIPDiagnosticsParams, NULL, BBFDM_BOTH, NULL}, #endif @@ -2239,9 +2247,9 @@ DMLEAF tIPParams[] = { /* *** Device.IP.Interface.{i}. *** */ DMOBJ tIPInterfaceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"IPv4Address", &DMWRITE, addObjIPInterfaceIPv4Address, delObjIPInterfaceIPv4Address, NULL, browseIPInterfaceIPv4AddressInst, NULL, NULL, NULL, tIPInterfaceIPv4AddressParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "IPAddress", "SubnetMask", NULL}}, -{"IPv6Address", &DMWRITE, addObjIPInterfaceIPv6Address, delObjIPInterfaceIPv6Address, NULL, browseIPInterfaceIPv6AddressInst, NULL, NULL, NULL, tIPInterfaceIPv6AddressParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "IPAddress", NULL}}, -{"IPv6Prefix", &DMWRITE, addObjIPInterfaceIPv6Prefix, delObjIPInterfaceIPv6Prefix, NULL, browseIPInterfaceIPv6PrefixInst, NULL, NULL, NULL, tIPInterfaceIPv6PrefixParams, get_linker_ipv6_prefix, BBFDM_BOTH, LIST_KEY{"Alias", "Prefix", NULL}}, +{"IPv4Address", &DMWRITE, addObjIPInterfaceIPv4Address, delObjIPInterfaceIPv4Address, NULL, browseIPInterfaceIPv4AddressInst, NULL, NULL, NULL, tIPInterfaceIPv4AddressParams, NULL, BBFDM_BOTH, NULL}, +{"IPv6Address", &DMWRITE, addObjIPInterfaceIPv6Address, delObjIPInterfaceIPv6Address, NULL, browseIPInterfaceIPv6AddressInst, NULL, NULL, NULL, tIPInterfaceIPv6AddressParams, NULL, BBFDM_BOTH, NULL}, +{"IPv6Prefix", &DMWRITE, addObjIPInterfaceIPv6Prefix, delObjIPInterfaceIPv6Prefix, NULL, browseIPInterfaceIPv6PrefixInst, NULL, NULL, NULL, tIPInterfaceIPv6PrefixParams, get_linker_ipv6_prefix, BBFDM_BOTH, NULL}, {"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIPInterfaceStatsParams, NULL, BBFDM_BOTH}, {0} }; @@ -2253,11 +2261,11 @@ DMLEAF tIPInterfaceParams[] = { {"IPv6Enable", &DMWRITE, DMT_BOOL, get_IPInterface_IPv6Enable, set_IPInterface_IPv6Enable, BBFDM_BOTH}, {"ULAEnable", &DMWRITE, DMT_BOOL, get_IPInterface_ULAEnable, set_IPInterface_ULAEnable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_IPInterface_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_IPInterface_Alias, set_IPInterface_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_IPInterface_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_IPInterface_Alias, set_IPInterface_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_IPInterface_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"LastChange", &DMREAD, DMT_UNINT, get_IPInterface_LastChange, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_IPInterface_LowerLayers, set_IPInterface_LowerLayers, BBFDM_BOTH}, -{"Router", &DMWRITE, DMT_STRING, get_IPInterface_Router, set_IPInterface_Router, BBFDM_BOTH}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_IPInterface_LowerLayers, set_IPInterface_LowerLayers, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"Router", &DMWRITE, DMT_STRING, get_IPInterface_Router, set_IPInterface_Router, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Reset", &DMWRITE, DMT_BOOL, get_IPInterface_Reset, set_IPInterface_Reset, BBFDM_CWMP}, {"MaxMTUSize", &DMWRITE, DMT_UNINT, get_IPInterface_MaxMTUSize, set_IPInterface_MaxMTUSize, BBFDM_BOTH}, {"Type", &DMREAD, DMT_STRING, get_IPInterface_Type, NULL, BBFDM_BOTH}, @@ -2275,9 +2283,9 @@ DMLEAF tIPInterfaceIPv4AddressParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv4Address_Enable, set_IPInterfaceIPv4Address_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_IPInterfaceIPv4Address_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv4Address_Alias, set_IPInterfaceIPv4Address_Alias, BBFDM_BOTH}, -{"IPAddress", &DMWRITE, DMT_STRING, get_IPInterfaceIPv4Address_IPAddress, set_IPInterfaceIPv4Address_IPAddress, BBFDM_BOTH}, -{"SubnetMask", &DMWRITE, DMT_STRING, get_IPInterfaceIPv4Address_SubnetMask, set_IPInterfaceIPv4Address_SubnetMask, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv4Address_Alias, set_IPInterfaceIPv4Address_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"IPAddress", &DMWRITE, DMT_STRING, get_IPInterfaceIPv4Address_IPAddress, set_IPInterfaceIPv4Address_IPAddress, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"SubnetMask", &DMWRITE, DMT_STRING, get_IPInterfaceIPv4Address_SubnetMask, set_IPInterfaceIPv4Address_SubnetMask, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"AddressingType", &DMREAD, DMT_STRING, get_IPInterfaceIPv4Address_AddressingType, NULL, BBFDM_BOTH}, {0} }; @@ -2288,8 +2296,8 @@ DMLEAF tIPInterfaceIPv6AddressParams[] = { {"Enable", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv6Address_Enable, set_IPInterfaceIPv6Address_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Address_Status, NULL, BBFDM_BOTH}, {"IPAddressStatus", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Address_IPAddressStatus, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_Alias, set_IPInterfaceIPv6Address_Alias, BBFDM_BOTH}, -{"IPAddress", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_IPAddress, set_IPInterfaceIPv6Address_IPAddress, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_Alias, set_IPInterfaceIPv6Address_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"IPAddress", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_IPAddress, set_IPInterfaceIPv6Address_IPAddress, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Origin", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Address_Origin, NULL, BBFDM_BOTH}, {"Prefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_Prefix, set_IPInterfaceIPv6Address_Prefix, BBFDM_BOTH}, {"PreferredLifetime", &DMWRITE, DMT_TIME, get_IPInterfaceIPv6Address_PreferredLifetime, set_IPInterfaceIPv6Address_PreferredLifetime, BBFDM_BOTH}, @@ -2304,11 +2312,11 @@ DMLEAF tIPInterfaceIPv6PrefixParams[] = { {"Enable", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv6Prefix_Enable, set_IPInterfaceIPv6Prefix_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Prefix_Status, NULL, BBFDM_BOTH}, {"PrefixStatus", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Prefix_PrefixStatus, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_Alias, set_IPInterfaceIPv6Prefix_Alias, BBFDM_BOTH}, -{"Prefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_Prefix, set_IPInterfaceIPv6Prefix_Prefix, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_Alias, set_IPInterfaceIPv6Prefix_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Prefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_Prefix, set_IPInterfaceIPv6Prefix_Prefix, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Origin", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Prefix_Origin, NULL, BBFDM_BOTH}, //{"StaticType", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_StaticType, set_IPInterfaceIPv6Prefix_StaticType, BBFDM_BOTH}, -{"ParentPrefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_ParentPrefix, set_IPInterfaceIPv6Prefix_ParentPrefix, BBFDM_BOTH}, +{"ParentPrefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_ParentPrefix, set_IPInterfaceIPv6Prefix_ParentPrefix, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"ChildPrefixBits", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_ChildPrefixBits, set_IPInterfaceIPv6Prefix_ChildPrefixBits, BBFDM_BOTH}, //{"OnLink", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv6Prefix_OnLink, set_IPInterfaceIPv6Prefix_OnLink, BBFDM_BOTH}, //{"Autonomous", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv6Prefix_Autonomous, set_IPInterfaceIPv6Prefix_Autonomous, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/mqtt.c b/libbbfdm/dmtree/tr181/mqtt.c index 82691a77..eaaddead 100644 --- a/libbbfdm/dmtree/tr181/mqtt.c +++ b/libbbfdm/dmtree/tr181/mqtt.c @@ -210,31 +210,28 @@ static int get_MQTTBroker_Interface(char *refparam, struct dmctx *ctx, void *dat char *intf = NULL; dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "interface", &intf); - if (DM_STRLEN(intf) == 0) - return 0; - - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", intf, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", intf, value); return 0; } static int set_MQTTBroker_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *iface = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &iface); - if (DM_STRLEN(iface) != 0) - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", iface); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", reference.value); break; } return 0; @@ -293,7 +290,7 @@ static int set_MQTTBroker_Password(char *refparam, struct dmctx *ctx, void *data /* *** Device.MQTT.Broker. *** */ DMOBJ tMQTTObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/ -{"Broker", &DMWRITE, addMQTTBroker, delMQTTBroker, NULL, browseMQTTBrokerInst, NULL, NULL, NULL, tMQTTBrokerParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Name", NULL}}, +{"Broker", &DMWRITE, addMQTTBroker, delMQTTBroker, NULL, browseMQTTBrokerInst, NULL, NULL, NULL, tMQTTBrokerParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -306,11 +303,11 @@ DMLEAF tMQTTParams[] = { DMLEAF tMQTTBrokerParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ {"Enable", &DMWRITE, DMT_BOOL, get_MQTTBroker_Enable, set_MQTTBroker_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_MQTTBroker_Alias, set_MQTTBroker_Alias, BBFDM_BOTH}, -{"Name", &DMWRITE, DMT_STRING, get_MQTTBroker_Name, set_MQTTBroker_Name, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_MQTTBroker_Alias, set_MQTTBroker_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMWRITE, DMT_STRING, get_MQTTBroker_Name, set_MQTTBroker_Name, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"Status", &DMREAD, DMT_STRING, get_MQTTBroker_Status, NULL, BBFDM_BOTH}, {"Port", &DMWRITE, DMT_UNINT, get_MQTTBroker_Port, set_MQTTBroker_Port, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_MQTTBroker_Interface, set_MQTTBroker_Interface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_MQTTBroker_Interface, set_MQTTBroker_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Username", &DMWRITE, DMT_STRING, get_MQTTBroker_Username, set_MQTTBroker_Username, BBFDM_BOTH}, {"Password", &DMWRITE, DMT_STRING, get_MQTTBroker_Password, set_MQTTBroker_Password, BBFDM_BOTH}, {0} diff --git a/libbbfdm/dmtree/tr181/nat.c b/libbbfdm/dmtree/tr181/nat.c index a346db12..c1e31239 100644 --- a/libbbfdm/dmtree/tr181/nat.c +++ b/libbbfdm/dmtree/tr181/nat.c @@ -238,7 +238,7 @@ static int get_nat_interface_setting_interface(char *refparam, struct dmctx *ctx char *ifaceobj = NULL; uci_foreach_element(v, e) { - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj); // MEM WILL BE FREED IN DMMEMCLEAN + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", e->name, &ifaceobj); if (ifaceobj && *ifaceobj) pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", ifaceobj); } @@ -255,24 +255,22 @@ static int get_nat_interface_setting_interface(char *refparam, struct dmctx *ctx static int set_nat_interface_setting_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *iface, *pch, *pchr, buf[256] = ""; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: - DM_STRNCPY(buf, value, sizeof(buf)); dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "network", ""); - for(pch = strtok_r(buf, ",", &pchr); pch != NULL; pch = strtok_r(NULL, ",", &pchr)) { - adm_entry_get_linker_value(ctx, pch, &iface); - dmuci_add_list_value_by_section(((struct dmmap_dup *)data)->config_section, "network", iface); - } + dmuci_add_list_value_by_section(((struct dmmap_dup *)data)->config_section, "network", reference.value); return 0; } return 0; @@ -347,7 +345,7 @@ static int get_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi char *ifaceobj = NULL; uci_foreach_element(v, e) { - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj); // MEM WILL BE FREED IN DMMEMCLEAN + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", e->name, &ifaceobj); if (ifaceobj && *ifaceobj) pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", ifaceobj); } @@ -364,20 +362,21 @@ static int get_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi static int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *iface = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &iface); - if (iface && *iface) { + if (DM_STRLEN(reference.value)) { struct uci_section *s = NULL; bool zone_enable, sect_enable; @@ -385,7 +384,7 @@ static int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi char *network = NULL; dmuci_get_value_by_section_string(s, "network", &network); - if (is_strword_in_optionvalue(network, iface)) { + if (is_strword_in_optionvalue(network, reference.value)) { char *zone_name = NULL; char *zone_masq = NULL; char *val = NULL; @@ -404,7 +403,6 @@ static int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi break; } } - dmfree(iface); } else { dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "src", ""); } @@ -695,8 +693,8 @@ static int set_nat_port_mapping_description(char *refparam, struct dmctx *ctx, v /* *** Device.NAT. *** */ DMOBJ tNATObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"InterfaceSetting", &DMWRITE, add_NAT_InterfaceSetting, delete_NAT_InterfaceSetting, NULL, browseInterfaceSettingInst, NULL, NULL, NULL, tNATInterfaceSettingParams, NULL, BBFDM_BOTH, LIST_KEY{"Interface", "Alias", NULL}}, -{"PortMapping", &DMWRITE, add_NAT_PortMapping, delete_NAT_PortMapping, NULL, browsePortMappingInst, NULL, NULL, NULL, tNATPortMappingParams, NULL, BBFDM_BOTH, LIST_KEY{"RemoteHost", "ExternalPort", "Protocol", "Alias", NULL}}, +{"InterfaceSetting", &DMWRITE, add_NAT_InterfaceSetting, delete_NAT_InterfaceSetting, NULL, browseInterfaceSettingInst, NULL, NULL, NULL, tNATInterfaceSettingParams, NULL, BBFDM_BOTH, NULL}, +{"PortMapping", &DMWRITE, add_NAT_PortMapping, delete_NAT_PortMapping, NULL, browsePortMappingInst, NULL, NULL, NULL, tNATPortMappingParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -712,8 +710,8 @@ DMLEAF tNATInterfaceSettingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_nat_interface_setting_enable, set_nat_interface_setting_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_nat_interface_setting_status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_nat_interface_setting_alias, set_nat_interface_setting_alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_nat_interface_setting_interface, set_nat_interface_setting_interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_nat_interface_setting_alias, set_nat_interface_setting_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_nat_interface_setting_interface, set_nat_interface_setting_interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {0} }; @@ -722,15 +720,15 @@ DMLEAF tNATPortMappingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_nat_port_mapping_enable, set_nat_port_mapping_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_nat_port_mapping_status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_nat_port_mapping_alias, set_nat_port_mapping_alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_nat_port_mapping_interface, set_nat_port_mapping_interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_nat_port_mapping_alias, set_nat_port_mapping_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_nat_port_mapping_interface, set_nat_port_mapping_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"AllInterfaces", &DMWRITE, DMT_BOOL, get_nat_port_mapping_all_interface, set_nat_port_mapping_all_interface, BBFDM_BOTH}, {"LeaseDuration", &DMWRITE, DMT_UNINT, get_nat_port_mapping_lease_duration, set_nat_port_mapping_lease_duration, BBFDM_BOTH}, -{"RemoteHost", &DMWRITE, DMT_STRING, get_nat_port_mapping_remote_host, set_nat_port_mapping_remote_host, BBFDM_BOTH}, -{"ExternalPort", &DMWRITE, DMT_UNINT, get_nat_port_mapping_external_port, set_nat_port_mapping_external_port, BBFDM_BOTH}, +{"RemoteHost", &DMWRITE, DMT_STRING, get_nat_port_mapping_remote_host, set_nat_port_mapping_remote_host, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ExternalPort", &DMWRITE, DMT_UNINT, get_nat_port_mapping_external_port, set_nat_port_mapping_external_port, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ExternalPortEndRange", &DMWRITE, DMT_UNINT, get_nat_port_mapping_external_port_end_range, set_nat_port_mapping_external_port_end_range, BBFDM_BOTH}, {"InternalPort", &DMWRITE, DMT_UNINT, get_nat_port_mapping_internal_port, set_nat_port_mapping_internal_port, BBFDM_BOTH}, -{"Protocol", &DMWRITE, DMT_STRING, get_nat_port_mapping_protocol, set_nat_port_mapping_protocol, BBFDM_BOTH}, +{"Protocol", &DMWRITE, DMT_STRING, get_nat_port_mapping_protocol, set_nat_port_mapping_protocol, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"InternalClient", &DMWRITE, DMT_STRING, get_nat_port_mapping_internal_client, set_nat_port_mapping_internal_client, BBFDM_BOTH}, {"Description", &DMWRITE, DMT_STRING, get_nat_port_mapping_description, set_nat_port_mapping_description, BBFDM_BOTH}, {0} diff --git a/libbbfdm/dmtree/tr181/ppp.c b/libbbfdm/dmtree/tr181/ppp.c index 0ae65e00..d0c22c31 100644 --- a/libbbfdm/dmtree/tr181/ppp.c +++ b/libbbfdm/dmtree/tr181/ppp.c @@ -997,22 +997,24 @@ static int get_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch if (DM_STRLEN(device) == 0) return 0; - adm_entry_get_linker_param(ctx, "Device.Ethernet."BBF_VENDOR_PREFIX"MACVLAN", device, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.Ethernet."BBF_VENDOR_PREFIX"MACVLAN.*.Name", device, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", device, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.Ethernet.VLANTermination.*.Name", device, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", device, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Link.*.Name", device, value); + +end: + // Store LowerLayers value + dmuci_set_value_by_section(ppp->dmmap_s, "LowerLayers", *value); } else { - char *linker = NULL; - - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) + if (!adm_entry_object_exists(ctx, *value)) *value = ""; } + return 0; } @@ -1025,32 +1027,32 @@ static int set_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch "Device.Ethernet.VLANTermination.", "Device.Ethernet.Link.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - // Store LowerLayers value under dmmap_ppp section - dmuci_set_value_by_section(ppp->dmmap_s, "LowerLayers", value); + dmuci_set_value_by_section(ppp->dmmap_s, "LowerLayers", reference.path); // Update proto option dmuci_set_value_by_section(ppp->dmmap_s, "proto", "pppoe"); if (ppp->iface_s) dmuci_set_value_by_section(ppp->iface_s, "proto", "pppoe"); - if (DM_STRNCMP(value, "Device.Ethernet.Link.", DM_STRLEN("Device.Ethernet.Link.")) == 0) { + if (DM_STRNCMP(reference.path, "Device.Ethernet.Link.", DM_STRLEN("Device.Ethernet.Link.")) == 0) { struct uci_section *eth_link_s = NULL; char *is_eth = NULL; - get_dmmap_section_of_config_section_eq("dmmap_ethernet", "link", "device", linker, ð_link_s); + get_dmmap_section_of_config_section_eq("dmmap_ethernet", "link", "device", reference.value, ð_link_s); if (eth_link_s) dmuci_get_value_by_section_string(eth_link_s, "is_eth", &is_eth); // Update proto option @@ -1059,8 +1061,8 @@ static int set_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch } // Update device option - dmuci_set_value_by_section(ppp->dmmap_s, "device", DM_STRLEN(linker) ? linker : ""); - if (ppp->iface_s) dmuci_set_value_by_section(ppp->iface_s, "device", DM_STRLEN(linker) ? linker : ""); + dmuci_set_value_by_section(ppp->dmmap_s, "device", reference.value); + if (ppp->iface_s) dmuci_set_value_by_section(ppp->iface_s, "device", reference.value); return 0; } return 0; @@ -1193,7 +1195,7 @@ static int operate_PPPInterface_Reset(char *refparam, struct dmctx *ctx, void *d /* *** Device.PPP. *** */ DMOBJ tPPPObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Interface", &DMWRITE, add_ppp_interface, delete_ppp_interface, NULL, browseInterfaceInst, NULL, NULL, tPPPInterfaceObj, tPPPInterfaceParams, get_linker_ppp_interface, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Interface", &DMWRITE, add_ppp_interface, delete_ppp_interface, NULL, browseInterfaceInst, NULL, NULL, tPPPInterfaceObj, tPPPInterfaceParams, get_linker_ppp_interface, BBFDM_BOTH, NULL}, {0} }; @@ -1207,22 +1209,22 @@ DMLEAF tPPPParams[] = { /* *** Device.PPP.Interface.{i}. *** */ DMOBJ tPPPInterfaceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"PPPoE", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfacePPPoEParams, NULL, BBFDM_BOTH, NULL}, -{"IPCP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceIPCPParams, NULL, BBFDM_BOTH, NULL}, -{"IPv6CP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceIPv6CPParams, NULL, BBFDM_BOTH, NULL}, -{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceStatsParams, NULL, BBFDM_BOTH, NULL}, +{"PPPoE", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfacePPPoEParams, NULL, BBFDM_BOTH}, +{"IPCP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceIPCPParams, NULL, BBFDM_BOTH}, +{"IPv6CP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceIPv6CPParams, NULL, BBFDM_BOTH}, +{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceStatsParams, NULL, BBFDM_BOTH}, {0} }; DMLEAF tPPPInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_ppp_alias, set_ppp_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_ppp_alias, set_ppp_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_ppp_enable, set_ppp_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_PPPInterface_Status, NULL, BBFDM_BOTH}, {"LastChange", &DMREAD, DMT_UNINT, get_PPPInterface_LastChange, NULL, BBFDM_BOTH}, {"Reset", &DMWRITE, DMT_BOOL, get_PPPInterface_Reset, set_PPPInterface_Reset, BBFDM_CWMP}, -{"Name", &DMREAD, DMT_STRING, get_ppp_name, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_ppp_lower_layer, set_ppp_lower_layer, BBFDM_BOTH}, +{"Name", &DMREAD, DMT_STRING, get_ppp_name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_ppp_lower_layer, set_ppp_lower_layer, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"ConnectionStatus", &DMREAD, DMT_STRING, get_ppp_status, NULL, BBFDM_BOTH}, {"LastConnectionError", &DMREAD, DMT_STRING, get_PPPInterface_LastConnectionError, NULL, BBFDM_BOTH}, {"Username", &DMWRITE, DMT_STRING, get_ppp_username, set_ppp_username, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/ptm.c b/libbbfdm/dmtree/tr181/ptm.c index de0999ec..24ebed30 100644 --- a/libbbfdm/dmtree/tr181/ptm.c +++ b/libbbfdm/dmtree/tr181/ptm.c @@ -170,69 +170,49 @@ static int get_ptm_link_name(char *refparam, struct dmctx *ctx, void *data, char return 0; } -static int find_lower_layer_by_dmmap_link(struct dmctx *ctx, void *data, char* dm_object, char **value) -{ - char *linker = NULL; - - dmuci_get_value_by_section_string((((struct ptm_args *)data)->sections)->dmmap_section, "ptm_ll_link", &linker); - adm_entry_get_linker_param(ctx, dm_object, linker, value); - return 0; -} - -static int get_ptm_dsl_channel(struct dmctx *ctx, void *data, char *instance, char **value) -{ - char *ptm_file = NULL; - - dmasprintf(&ptm_file, "/sys/class/net/ptm%ld", DM_STRTOL(instance) - 1); - if (folder_exists(ptm_file)) { - *value = "Device.DSL.Channel.1"; - dmuci_set_value_by_section((((struct ptm_args *)data)->sections)->dmmap_section, "ptm_ll_link", "fast_line_1"); - } - - return 0; -} - -static int get_ptm_fast_line(struct dmctx *ctx, void *data, char *instance, char **value) -{ - json_object *res = NULL, *line_obj = NULL; - - dmubus_call("fast", "status", UBUS_ARGS{0}, 0, &res); - if (!res) - return 0; - line_obj = dmjson_select_obj_in_array_idx(res, 0, 1, "line"); - if (!line_obj) - return 0; - if ( DM_LSTRCMP(dmjson_get_value(line_obj, 1, "status"), "up") == 0) { - *value = "Device.FAST.Line.1"; - dmuci_set_value_by_section((((struct ptm_args *)data)->sections)->dmmap_section, "ptm_ll_link", "fast_line_1"); - } - return 0; -} - static int get_ptm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - get_ptm_fast_line(ctx, data, instance, value); - if (*value == NULL || (*value)[0] == '\0') - get_ptm_dsl_channel(ctx, data, instance, value); - if (*value == NULL || (*value)[0] == '\0') - find_lower_layer_by_dmmap_link(ctx, data, "Device.FAST.Line.", value); - if (*value == NULL || (*value)[0] == '\0') - find_lower_layer_by_dmmap_link(ctx, data, "Device.DSL.Channel.", value); + dmuci_get_value_by_section_string((((struct ptm_args *)data)->sections)->dmmap_section, "LowerLayers", value); + + if ((*value)[0] == '\0') { + char ptm_file[128] = {0}; + + adm_entry_get_reference_param(ctx, "Device.FAST.Line.*.Status", "Up", value); + if (DM_STRLEN(*value)) + return 0; + + snprintf(ptm_file, sizeof(ptm_file), "/sys/class/net/ptm%ld", DM_STRTOL(instance) - 1); + if (folder_exists(ptm_file)) { + adm_entry_get_reference_param(ctx, "Device.DSL.Channel.*.Name", "1", value); + if (DM_STRLEN(*value)) + return 0; + } + + adm_entry_get_reference_param(ctx, "Device.FAST.Line.*.Name", "1", value); + + // Store LowerLayers value + dmuci_set_value_by_section((((struct ptm_args *)data)->sections)->dmmap_section, "LowerLayers", *value); + } else { + if (!adm_entry_object_exists(ctx, *value)) + *value = ""; + } + return 0; } static int set_ptm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); + switch (action) { case VALUECHECK: - if (DM_LSTRNCMP(value, "Device.DSL.Channel.1", strlen("Device.DSL.Channel.1")) != 0 && DM_LSTRNCMP(value, "Device.FAST.Line.1", strlen("Device.FAST.Line.1")) != 0) + if (DM_LSTRNCMP(reference.path, "Device.DSL.Channel.1", strlen("Device.DSL.Channel.1")) != 0 && DM_LSTRNCMP(reference.path, "Device.FAST.Line.1", strlen("Device.FAST.Line.1")) != 0) return FAULT_9007; break; case VALUESET: - if (DM_LSTRCMP(value, "Device.DSL.Channel.1") == 0) - dmuci_set_value_by_section((((struct ptm_args *)data)->sections)->dmmap_section, "ptm_ll_link", "dsl_channel_1"); - else - dmuci_set_value_by_section((((struct ptm_args *)data)->sections)->dmmap_section, "ptm_ll_link", "fast_line_1"); + dmuci_set_value_by_section((((struct ptm_args *)data)->sections)->dmmap_section, "LowerLayers", reference.path); break; } return 0; @@ -279,7 +259,7 @@ static int get_ptm_stats_pack_sent(char *refparam, struct dmctx *ctx, void *data /* *** Device.PTM. *** */ DMOBJ tPTMObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Link", &DMWRITE, add_ptm_link, delete_ptm_link, NULL, browsePtmLinkInst, NULL, NULL, tPTMLinkObj, tPTMLinkParams, get_ptm_linker, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Link", &DMWRITE, add_ptm_link, delete_ptm_link, NULL, browsePtmLinkInst, NULL, NULL, tPTMLinkObj, tPTMLinkParams, get_ptm_linker, BBFDM_BOTH, NULL}, {0} }; @@ -294,9 +274,9 @@ DMLEAF tPTMLinkParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_ptm_enable, set_ptm_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_ptm_status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_ptm_alias, set_ptm_alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_ptm_link_name, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_ptm_lower_layer, set_ptm_lower_layer, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_ptm_alias, set_ptm_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_ptm_link_name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_ptm_lower_layer, set_ptm_lower_layer, BBFDM_BOTH, DM_FLAG_REFERENCE}, {0} }; diff --git a/libbbfdm/dmtree/tr181/qos.c b/libbbfdm/dmtree/tr181/qos.c index 8e564686..5e3cb224 100644 --- a/libbbfdm/dmtree/tr181/qos.c +++ b/libbbfdm/dmtree/tr181/qos.c @@ -64,15 +64,6 @@ static void qos_update_order(const char *order, bool is_del) } } -/************************************************************* -* LINKER -**************************************************************/ -static int get_linker_qqueue(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - *linker = data ? dmstrdup(section_name(((struct dmmap_dup *)data)->config_section)) : ""; - return 0; -} - /************************************************************* * ENTRY METHOD *************************************************************/ @@ -122,6 +113,8 @@ static int browseQoSQueueInst(struct dmctx *dmctx, DMNODE *parent_node, void *pr synchronize_specific_config_sections_with_dmmap("qos", "queue", "dmmap_qos", &dup_list); list_for_each_entry(p, &dup_list, list) { + dmuci_set_value_by_section(p->dmmap_section, "queuealias", section_name(p->config_section)); + inst = handle_instance(dmctx, parent_node, p->dmmap_section, "queueinstance", "queuealias"); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, inst) == DM_STOP) @@ -386,16 +379,20 @@ static int delObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char * **************************************************************/ static int get_QInterface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *ifname = NULL; - dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "ifname", &ifname); + char *linker = NULL; - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", ifname, value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", ifname, value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", ifname, value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", ifname, value); + dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "ifname", &linker); + + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.PPP.Interface.*.Name", linker, value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", linker, value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.WiFi.Radio.*.Name", linker, value); return 0; } @@ -408,20 +405,21 @@ static int set_QInterface(char *refparam, struct dmctx *ctx, void *data, char *i "Device.Ethernet.Interface.", "Device.WiFi.Radio.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", linker ? linker : ""); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", reference.value); break; } return 0; @@ -1512,12 +1510,13 @@ static int get_QoSQueue_Status(char *refparam, struct dmctx *ctx, void *data, ch static int get_QoSQueue_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - return bbf_get_alias(ctx, ((struct dmmap_dup *)data)->dmmap_section, "queuealias", instance, value); + *value = dmstrdup(section_name(((struct dmmap_dup *)data)->config_section)); + return 0; } static int set_QoSQueue_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - return bbf_set_alias(ctx, ((struct dmmap_dup *)data)->dmmap_section, "queuealias", instance, value); + return 0; } static int get_QoSQueue_TrafficClasses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) @@ -1697,27 +1696,28 @@ static int get_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data char *queue_link = NULL; dmuci_get_value_by_section_string((struct uci_section *)data, "queue", &queue_link); - adm_entry_get_linker_param(ctx, "Device.QoS.Queue.", queue_link, value); + adm_entry_get_reference_param(ctx, "Device.QoS.Queue.*.Alias", queue_link, value); return 0; } static int set_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.QoS.Queue.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section((struct uci_section *)data, "queue", linker ? linker : ""); + dmuci_set_value_by_section((struct uci_section *)data, "queue", reference.value); break; } return 0; @@ -1725,14 +1725,17 @@ static int set_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data static int get_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *intf_link = NULL; + char *linker = NULL; - dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &intf_link); - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", intf_link, value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", intf_link, value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", intf_link, value); + dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &linker); + + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", linker, value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.PPP.Interface.*.Name", linker, value); return 0; } @@ -1744,20 +1747,21 @@ static int set_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void * "Device.IP.Interface.", "Device.PPP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section((struct uci_section *)data, "interface", linker ? linker : ""); + dmuci_set_value_by_section((struct uci_section *)data, "interface", reference.value); break; } return 0; @@ -1899,13 +1903,13 @@ static int set_QoSShaper_ShapingBurstSize(char *refparam, struct dmctx *ctx, voi /* *** Device.QoS. *** */ DMOBJ tQoSObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Classification", &DMWRITE, addObjQoSClassification, delObjQoSClassification, NULL, browseQoSClassificationInst, NULL, NULL, NULL, tQoSClassificationParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"QueueStats", &DMWRITE, addObjQoSQueueStats, delObjQoSQueueStats, NULL, browseQoSQueueStatsInst, NULL, NULL, NULL, tQoSQueueStatsParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Queue", "Interface", NULL}}, -//{"App", &DMWRITE, addObjQoSApp, delObjQoSApp, NULL, browseQoSAppInst, NULL, NULL, NULL, tQoSAppParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -//{"Flow", &DMWRITE, addObjQoSFlow, delObjQoSFlow, NULL, browseQoSFlowInst, NULL, NULL, NULL, tQoSFlowParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"Policer", &DMWRITE, addObjQoSPolicer, delObjQoSPolicer, NULL, browseQoSPolicerInst, NULL, NULL, NULL, tQoSPolicerParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"Queue", &DMWRITE, addObjQoSQueue, delObjQoSQueue, NULL, browseQoSQueueInst, NULL, NULL, NULL, tQoSQueueParams, get_linker_qqueue, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"Shaper", &DMWRITE, addObjQoSShaper, delObjQoSShaper, NULL, browseQoSShaperInst, NULL, NULL, NULL, tQoSShaperParams, NULL, BBFDM_BOTH, LIST_KEY{"Interface", "Alias", NULL}}, +{"Classification", &DMWRITE, addObjQoSClassification, delObjQoSClassification, NULL, browseQoSClassificationInst, NULL, NULL, NULL, tQoSClassificationParams, NULL, BBFDM_BOTH, NULL}, +{"QueueStats", &DMWRITE, addObjQoSQueueStats, delObjQoSQueueStats, NULL, browseQoSQueueStatsInst, NULL, NULL, NULL, tQoSQueueStatsParams, NULL, BBFDM_BOTH, NULL}, +//{"App", &DMWRITE, addObjQoSApp, delObjQoSApp, NULL, browseQoSAppInst, NULL, NULL, NULL, tQoSAppParams, NULL, BBFDM_BOTH, NULL}, +//{"Flow", &DMWRITE, addObjQoSFlow, delObjQoSFlow, NULL, browseQoSFlowInst, NULL, NULL, NULL, tQoSFlowParams, NULL, BBFDM_BOTH, NULL}, +{"Policer", &DMWRITE, addObjQoSPolicer, delObjQoSPolicer, NULL, browseQoSPolicerInst, NULL, NULL, NULL, tQoSPolicerParams, NULL, BBFDM_BOTH, NULL}, +{"Queue", &DMWRITE, addObjQoSQueue, delObjQoSQueue, NULL, browseQoSQueueInst, NULL, NULL, NULL, tQoSQueueParams, NULL, BBFDM_BOTH, NULL}, +{"Shaper", &DMWRITE, addObjQoSShaper, delObjQoSShaper, NULL, browseQoSShaperInst, NULL, NULL, NULL, tQoSShaperParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1941,9 +1945,9 @@ DMLEAF tQoSClassificationParams[] = { {"Enable", &DMWRITE, DMT_BOOL, get_QoSClassification_Enable, set_QoSClassification_Enable, BBFDM_BOTH}, //{"Status", &DMREAD, DMT_STRING, get_QoSClassification_Status, NULL, BBFDM_BOTH}, {"Order", &DMWRITE, DMT_UNINT, get_QoSClassification_Order, set_QoSClassification_Order, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_QoSClassification_Alias, set_QoSClassification_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_QoSClassification_Alias, set_QoSClassification_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"DHCPType", &DMWRITE, DMT_STRING, get_QoSClassification_DHCPType, set_QoSClassification_DHCPType, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_QoSClassification_Interface, set_QoSClassification_Interface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_QoSClassification_Interface, set_QoSClassification_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, //{"AllInterfaces", &DMWRITE, DMT_BOOL, get_QoSClassification_AllInterfaces, set_QoSClassification_AllInterfaces, BBFDM_BOTH}, {"DestIP", &DMWRITE, DMT_STRING, get_QoSClassification_DestIP, set_QoSClassification_DestIP, BBFDM_BOTH}, {"DestMask", &DMWRITE, DMT_STRING, get_QoSClassification_DestMask, set_QoSClassification_DestMask, BBFDM_BOTH}, @@ -2066,7 +2070,7 @@ DMLEAF tQoSPolicerParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_QoSPolicer_Enable, set_QoSPolicer_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_QoSPolicer_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_QoSPolicer_Alias, set_QoSPolicer_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_QoSPolicer_Alias, set_QoSPolicer_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"CommittedRate", &DMWRITE, DMT_UNINT, get_QoSPolicer_CommittedRate, set_QoSPolicer_CommittedRate, BBFDM_BOTH}, {"CommittedBurstSize", &DMWRITE, DMT_UNINT, get_QoSPolicer_CommittedBurstSize, set_QoSPolicer_CommittedBurstSize, BBFDM_BOTH}, {"ExcessBurstSize", &DMWRITE, DMT_UNINT, get_QoSPolicer_ExcessBurstSize, set_QoSPolicer_ExcessBurstSize, BBFDM_BOTH}, @@ -2093,9 +2097,9 @@ DMLEAF tQoSQueueParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_QoSQueue_Enable, set_QoSQueue_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_QoSQueue_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_QoSQueue_Alias, set_QoSQueue_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_QoSQueue_Alias, set_QoSQueue_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"TrafficClasses", &DMWRITE, DMT_STRING, get_QoSQueue_TrafficClasses, set_QoSQueue_TrafficClasses, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_QoSQueue_Interface, set_QoSQueue_Interface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_QoSQueue_Interface, set_QoSQueue_Interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, //{"AllInterfaces", &DMWRITE, DMT_BOOL, get_QoSQueue_AllInterfaces, set_QoSQueue_AllInterfaces, BBFDM_BOTH}, //{"HardwareAssisted", &DMREAD, DMT_BOOL, get_QoSQueue_HardwareAssisted, NULL, BBFDM_BOTH}, //{"BufferLength", &DMREAD, DMT_UNINT, get_QoSQueue_BufferLength, NULL, BBFDM_BOTH}, @@ -2115,9 +2119,9 @@ DMLEAF tQoSQueueStatsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_QoSQueueStats_Enable, set_QoSQueueStats_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_QoSQueueStats_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_QoSQueueStats_Alias, set_QoSQueueStats_Alias, BBFDM_BOTH}, -{"Queue", &DMWRITE, DMT_STRING, get_QoSQueueStats_Queue, set_QoSQueueStats_Queue, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_QoSQueueStats_Interface, set_QoSQueueStats_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_QoSQueueStats_Alias, set_QoSQueueStats_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Queue", &DMWRITE, DMT_STRING, get_QoSQueueStats_Queue, set_QoSQueueStats_Queue, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"Interface", &DMWRITE, DMT_STRING, get_QoSQueueStats_Interface, set_QoSQueueStats_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"OutputPackets", &DMREAD, DMT_UNINT, get_QoSQueueStats_OutputPackets, NULL, BBFDM_BOTH}, {"OutputBytes", &DMREAD, DMT_UNINT, get_QoSQueueStats_OutputBytes, NULL, BBFDM_BOTH}, {"DroppedPackets", &DMREAD, DMT_UNINT, get_QoSQueueStats_DroppedPackets, NULL, BBFDM_BOTH}, @@ -2132,8 +2136,8 @@ DMLEAF tQoSShaperParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_QoSShaper_Enable, set_QoSShaper_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_QoSShaper_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_QoSShaper_Alias, set_QoSShaper_Alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_QoSShaper_Interface, set_QoSShaper_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_QoSShaper_Alias, set_QoSShaper_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_QoSShaper_Interface, set_QoSShaper_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"ShapingRate", &DMWRITE, DMT_INT, get_QoSShaper_ShapingRate, set_QoSShaper_ShapingRate, BBFDM_BOTH}, {"ShapingBurstSize", &DMWRITE, DMT_UNINT, get_QoSShaper_ShapingBurstSize, set_QoSShaper_ShapingBurstSize, BBFDM_BOTH}, {0} diff --git a/libbbfdm/dmtree/tr181/routeradvertisement.c b/libbbfdm/dmtree/tr181/routeradvertisement.c index 65fa3d9a..91868b6c 100644 --- a/libbbfdm/dmtree/tr181/routeradvertisement.c +++ b/libbbfdm/dmtree/tr181/routeradvertisement.c @@ -281,27 +281,28 @@ static int get_RouterAdvertisementInterfaceSetting_Interface(char *refparam, str char *linker = NULL; dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "interface", &linker); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_RouterAdvertisementInterfaceSetting_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, -1, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", linker ? linker : ""); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", reference.value); break; } return 0; @@ -686,7 +687,7 @@ static int set_RouterAdvertisementInterfaceSettingOption_Value(char *refparam, s /* *** Device.RouterAdvertisement. *** */ DMOBJ tRouterAdvertisementObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/ -{"InterfaceSetting", &DMWRITE, addObjRouterAdvertisementInterfaceSetting, delObjRouterAdvertisementInterfaceSetting, NULL, browseRouterAdvertisementInterfaceSettingInst, NULL, NULL, tRouterAdvertisementInterfaceSettingObj, tRouterAdvertisementInterfaceSettingParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Interface", NULL}}, +{"InterfaceSetting", &DMWRITE, addObjRouterAdvertisementInterfaceSetting, delObjRouterAdvertisementInterfaceSetting, NULL, browseRouterAdvertisementInterfaceSettingInst, NULL, NULL, tRouterAdvertisementInterfaceSettingObj, tRouterAdvertisementInterfaceSettingParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -700,7 +701,7 @@ DMLEAF tRouterAdvertisementParams[] = { /* *** Device.RouterAdvertisement.InterfaceSetting.{i}. *** */ DMOBJ tRouterAdvertisementInterfaceSettingObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/ -{"Option", &DMWRITE, addObjRouterAdvertisementInterfaceSettingOption, delObjRouterAdvertisementInterfaceSettingOption, NULL, browseRouterAdvertisementInterfaceSettingOptionInst, NULL, NULL, NULL, tRouterAdvertisementInterfaceSettingOptionParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Tag", NULL}}, +{"Option", &DMWRITE, addObjRouterAdvertisementInterfaceSettingOption, delObjRouterAdvertisementInterfaceSettingOption, NULL, browseRouterAdvertisementInterfaceSettingOptionInst, NULL, NULL, NULL, tRouterAdvertisementInterfaceSettingOptionParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -708,8 +709,8 @@ DMLEAF tRouterAdvertisementInterfaceSettingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_RouterAdvertisementInterfaceSetting_Enable, set_RouterAdvertisementInterfaceSetting_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_RouterAdvertisementInterfaceSetting_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSetting_Alias, set_RouterAdvertisementInterfaceSetting_Alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSetting_Interface, set_RouterAdvertisementInterfaceSetting_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSetting_Alias, set_RouterAdvertisementInterfaceSetting_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSetting_Interface, set_RouterAdvertisementInterfaceSetting_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, //{"ManualPrefixes", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSetting_ManualPrefixes, set_RouterAdvertisementInterfaceSetting_ManualPrefixes, BBFDM_BOTH}, {"Prefixes", &DMREAD, DMT_STRING, get_RouterAdvertisementInterfaceSetting_Prefixes, NULL, BBFDM_BOTH}, {"MaxRtrAdvInterval", &DMWRITE, DMT_UNINT, get_RouterAdvertisementInterfaceSetting_MaxRtrAdvInterval, set_RouterAdvertisementInterfaceSetting_MaxRtrAdvInterval, BBFDM_BOTH}, @@ -732,8 +733,8 @@ DMLEAF tRouterAdvertisementInterfaceSettingParams[] = { DMLEAF tRouterAdvertisementInterfaceSettingOptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_RouterAdvertisementInterfaceSettingOption_Enable, set_RouterAdvertisementInterfaceSettingOption_Enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSettingOption_Alias, set_RouterAdvertisementInterfaceSettingOption_Alias, BBFDM_BOTH}, -{"Tag", &DMWRITE, DMT_UNINT, get_RouterAdvertisementInterfaceSettingOption_Tag, set_RouterAdvertisementInterfaceSettingOption_Tag, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_RouterAdvertisementInterfaceSettingOption_Alias, set_RouterAdvertisementInterfaceSettingOption_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Tag", &DMWRITE, DMT_UNINT, get_RouterAdvertisementInterfaceSettingOption_Tag, set_RouterAdvertisementInterfaceSettingOption_Tag, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Value", &DMWRITE, DMT_HEXBIN, get_RouterAdvertisementInterfaceSettingOption_Value, set_RouterAdvertisementInterfaceSettingOption_Value, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/tr181/routing.c b/libbbfdm/dmtree/tr181/routing.c index d3dab900..38b44afa 100644 --- a/libbbfdm/dmtree/tr181/routing.c +++ b/libbbfdm/dmtree/tr181/routing.c @@ -42,15 +42,6 @@ enum enum_route_type { #define MAX_ROUTE_LEN 512 -/************************************************************************** -* LINKER -***************************************************************************/ -static int get_linker_router(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - dmuci_get_value_by_section_string((struct uci_section *)data, "rt_table", linker); - return 0; -} - /******************************** * init function ********************************/ @@ -739,27 +730,28 @@ static int get_RoutingRouterForwarding_Interface(char *refparam, struct dmctx *c char *linker = NULL; dmuci_get_value_by_section_string(((struct routingfwdargs *)data)->routefwdsection, "interface", &linker); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); // MEM WILL BE FREED IN DMMEMCLEAN + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_RoutingRouterForwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "interface", linker ? linker : ""); + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "interface", reference.value); return 0; } return 0; @@ -1035,7 +1027,7 @@ static int get_RoutingRouteInformationInterfaceSetting_Interface(char *refparam, } } - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", iface, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", iface, value); return 0; } @@ -1065,12 +1057,13 @@ static int get_RoutingRouteInformationInterfaceSetting_RouteLifetime(char *refpa **************************************************************/ static int get_RoutingRouter_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - return bbf_get_alias(ctx, (struct uci_section *)data, "router_alias", instance, value); + dmuci_get_value_by_section_string((struct uci_section *)data, "rt_table", value); + return 0; } static int set_RoutingRouter_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - return bbf_set_alias(ctx, (struct uci_section *)data, "router_alias", instance, value); + return 0; } static int get_router_ipv4forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) @@ -1328,7 +1321,7 @@ static int delete_ipv6Forwarding(char *refparam, struct dmctx *ctx, void *data, /* *** Device.Routing. *** */ DMOBJ tRoutingObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Router", &DMWRITE, add_router, delete_router, NULL, browseRouterInst, NULL, NULL, tRoutingRouterObj, tRoutingRouterParams, get_linker_router, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Router", &DMWRITE, add_router, delete_router, NULL, browseRouterInst, NULL, NULL, tRoutingRouterObj, tRoutingRouterParams, NULL, BBFDM_BOTH, NULL}, {"RouteInformation", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tRoutingRouteInformationObj, tRoutingRouteInformationParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1342,8 +1335,8 @@ DMLEAF tRoutingParams[] = { /* *** Device.Routing.Router.{i}. *** */ DMOBJ tRoutingRouterObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"IPv4Forwarding", &DMWRITE, add_ipv4forwarding, delete_ipv4forwarding, NULL, browseIPv4ForwardingInst, NULL, NULL, NULL, tRoutingRouterIPv4ForwardingParams, NULL, BBFDM_BOTH, LIST_KEY{"DestIPAddress", "DestSubnetMask", "ForwardingPolicy", "GatewayIPAddress", "Interface", "ForwardingMetric", "Alias", NULL}}, -{"IPv6Forwarding", &DMWRITE, add_ipv6Forwarding, delete_ipv6Forwarding, NULL, browseIPv6ForwardingInst, NULL, NULL, NULL, tRoutingRouterIPv6ForwardingParams, NULL, BBFDM_BOTH, LIST_KEY{"DestIPPrefix", "ForwardingPolicy", "NextHop", "Interface", "ForwardingMetric", "Alias", NULL}}, +{"IPv4Forwarding", &DMWRITE, add_ipv4forwarding, delete_ipv4forwarding, NULL, browseIPv4ForwardingInst, NULL, NULL, NULL, tRoutingRouterIPv4ForwardingParams, NULL, BBFDM_BOTH, NULL}, +{"IPv6Forwarding", &DMWRITE, add_ipv6Forwarding, delete_ipv6Forwarding, NULL, browseIPv6ForwardingInst, NULL, NULL, NULL, tRoutingRouterIPv6ForwardingParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1351,7 +1344,7 @@ DMLEAF tRoutingRouterParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_RoutingRouter_Enable, set_RoutingRouter_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_RoutingRouter_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_RoutingRouter_Alias, set_RoutingRouter_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_RoutingRouter_Alias, set_RoutingRouter_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"IPv4ForwardingNumberOfEntries", &DMREAD, DMT_UNINT, get_RoutingRouter_IPv4ForwardingNumberOfEntries, NULL, BBFDM_BOTH}, {"IPv6ForwardingNumberOfEntries", &DMREAD, DMT_UNINT, get_RoutingRouter_IPv6ForwardingNumberOfEntries, NULL, BBFDM_BOTH}, {0} @@ -1362,15 +1355,15 @@ DMLEAF tRoutingRouterIPv4ForwardingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMRouting, DMT_BOOL, get_router_ipv4forwarding_enable, set_router_ipv4forwarding_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_router_ipv4forwarding_status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_alias, set_router_ipv4forwarding_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_alias, set_router_ipv4forwarding_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"StaticRoute", &DMREAD, DMT_BOOL, get_router_ipv4forwarding_static_route, NULL, BBFDM_BOTH}, -{"DestIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destip, set_router_ipv4forwarding_destip, BBFDM_BOTH}, -{"DestSubnetMask", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destmask, set_router_ipv4forwarding_destmask, BBFDM_BOTH}, -{"ForwardingPolicy", &DMRouting, DMT_INT, get_router_ipv4forwarding_forwarding_policy, set_router_ipv4forwarding_forwarding_policy, BBFDM_BOTH}, -{"GatewayIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_gatewayip, set_router_ipv4forwarding_gatewayip, BBFDM_BOTH}, -{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH}, +{"DestIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destip, set_router_ipv4forwarding_destip, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"DestSubnetMask", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destmask, set_router_ipv4forwarding_destmask, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ForwardingPolicy", &DMRouting, DMT_INT, get_router_ipv4forwarding_forwarding_policy, set_router_ipv4forwarding_forwarding_policy, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"GatewayIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_gatewayip, set_router_ipv4forwarding_gatewayip, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"Origin", &DMREAD, DMT_STRING, get_router_ipv4forwarding_origin, NULL, BBFDM_BOTH}, -{"ForwardingMetric", &DMRouting, DMT_INT, get_router_ipv4forwarding_metric, set_router_ipv4forwarding_metric, BBFDM_BOTH}, +{"ForwardingMetric", &DMRouting, DMT_INT, get_router_ipv4forwarding_metric, set_router_ipv4forwarding_metric, BBFDM_BOTH, DM_FLAG_UNIQUE}, {0} }; @@ -1379,13 +1372,13 @@ DMLEAF tRoutingRouterIPv6ForwardingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMRouting, DMT_BOOL, get_RoutingRouterIPv6Forwarding_Enable, set_RoutingRouterIPv6Forwarding_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_RoutingRouterIPv6Forwarding_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_RoutingRouterIPv6Forwarding_Alias, set_RoutingRouterIPv6Forwarding_Alias, BBFDM_BOTH}, -{"DestIPPrefix", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_DestIPPrefix, set_RoutingRouterIPv6Forwarding_DestIPPrefix, BBFDM_BOTH}, -{"ForwardingPolicy", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingPolicy, set_RoutingRouterIPv6Forwarding_ForwardingPolicy, BBFDM_BOTH}, -{"NextHop", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_NextHop, set_RoutingRouterIPv6Forwarding_NextHop, BBFDM_BOTH}, -{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_RoutingRouterIPv6Forwarding_Alias, set_RoutingRouterIPv6Forwarding_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"DestIPPrefix", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_DestIPPrefix, set_RoutingRouterIPv6Forwarding_DestIPPrefix, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ForwardingPolicy", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingPolicy, set_RoutingRouterIPv6Forwarding_ForwardingPolicy, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"NextHop", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_NextHop, set_RoutingRouterIPv6Forwarding_NextHop, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"Origin", &DMREAD, DMT_STRING, get_RoutingRouterIPv6Forwarding_Origin, NULL, BBFDM_BOTH}, -{"ForwardingMetric", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingMetric, set_RoutingRouterIPv6Forwarding_ForwardingMetric, BBFDM_BOTH}, +{"ForwardingMetric", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingMetric, set_RoutingRouterIPv6Forwarding_ForwardingMetric, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ExpirationTime", &DMREAD, DMT_TIME, get_RoutingRouterIPv6Forwarding_ExpirationTime, NULL, BBFDM_BOTH}, {0} }; @@ -1393,7 +1386,7 @@ DMLEAF tRoutingRouterIPv6ForwardingParams[] = { /* *** Device.Routing.RouteInformation. *** */ DMOBJ tRoutingRouteInformationObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"InterfaceSetting", &DMREAD, NULL, NULL, NULL, browseRoutingRouteInformationInterfaceSettingInst, NULL, NULL, NULL, tRoutingRouteInformationInterfaceSettingParams, NULL, BBFDM_BOTH, LIST_KEY{"Interface", NULL}}, +{"InterfaceSetting", &DMREAD, NULL, NULL, NULL, browseRoutingRouteInformationInterfaceSettingInst, NULL, NULL, NULL, tRoutingRouteInformationInterfaceSettingParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1408,7 +1401,7 @@ DMLEAF tRoutingRouteInformationParams[] = { DMLEAF tRoutingRouteInformationInterfaceSettingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Status", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_Status, NULL, BBFDM_BOTH}, -{"Interface", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_Interface, NULL, BBFDM_BOTH}, +{"Interface", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_Interface, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"SourceRouter", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_SourceRouter, NULL, BBFDM_BOTH}, {"RouteLifetime", &DMREAD, DMT_TIME, get_RoutingRouteInformationInterfaceSetting_RouteLifetime, NULL, BBFDM_BOTH}, {0} diff --git a/libbbfdm/dmtree/tr181/security.c b/libbbfdm/dmtree/tr181/security.c index 7ad060ea..a22038f9 100644 --- a/libbbfdm/dmtree/tr181/security.c +++ b/libbbfdm/dmtree/tr181/security.c @@ -429,7 +429,7 @@ static int get_SecurityCertificate_SignatureAlgorithm(char *refparam, struct dmc /* *** Device.Security. *** */ DMOBJ tSecurityObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Certificate", &DMREAD, NULL, NULL, NULL, browseSecurityCertificateInst, NULL, NULL, NULL, tSecurityCertificateParams, NULL, BBFDM_BOTH, LIST_KEY{"SerialNumber", "Issuer", NULL}}, +{"Certificate", &DMREAD, NULL, NULL, NULL, browseSecurityCertificateInst, NULL, NULL, NULL, tSecurityCertificateParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -444,8 +444,8 @@ DMLEAF tSecurityCertificateParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ //{"Enable", &DMWRITE, DMT_BOOL, get_SecurityCertificate_Enable, set_SecurityCertificate_Enable, BBFDM_BOTH}, {"LastModif", &DMREAD, DMT_TIME, get_SecurityCertificate_LastModif, NULL, BBFDM_BOTH}, -{"SerialNumber", &DMREAD, DMT_STRING, get_SecurityCertificate_SerialNumber, NULL, BBFDM_BOTH}, -{"Issuer", &DMREAD, DMT_STRING, get_SecurityCertificate_Issuer, NULL, BBFDM_BOTH}, +{"SerialNumber", &DMREAD, DMT_STRING, get_SecurityCertificate_SerialNumber, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Issuer", &DMREAD, DMT_STRING, get_SecurityCertificate_Issuer, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"NotBefore", &DMREAD, DMT_TIME, get_SecurityCertificate_NotBefore, NULL, BBFDM_BOTH}, {"NotAfter", &DMREAD, DMT_TIME, get_SecurityCertificate_NotAfter, NULL, BBFDM_BOTH}, {"Subject", &DMREAD, DMT_STRING, get_SecurityCertificate_Subject, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/ssh.c b/libbbfdm/dmtree/tr181/ssh.c index ca29d77a..47c59fa2 100644 --- a/libbbfdm/dmtree/tr181/ssh.c +++ b/libbbfdm/dmtree/tr181/ssh.c @@ -613,30 +613,30 @@ static int set_ssh_server_alias(char *refparam, struct dmctx *ctx, void *data, c static int get_ssh_server_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = NULL; - dmuci_get_value_by_section_string(((struct dmmap_ssh *)data)->config_section, "Interface", &linker); - if (DM_STRLEN(linker) != 0) - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + dmuci_get_value_by_section_string(((struct dmmap_ssh *)data)->config_section, "Interface", &linker); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_ssh_server_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char *linker = NULL; char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct dmmap_ssh *)data)->config_section, "Interface", linker ? linker : ""); + dmuci_set_value_by_section(((struct dmmap_ssh *)data)->config_section, "Interface", reference.value); break; } return 0; @@ -913,8 +913,8 @@ static int operate_session_delete(char *refparam, struct dmctx *ctx, void *data, /* *** Device.SSH. *** */ DMOBJ tSSHObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Server", &DMWRITE, addObjSSHServer, delObjSSHServer, NULL, browseSSHServerInst, NULL, NULL, tSSHServerObj, tSSHServerParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, -{"AuthorizedKey", &DMWRITE, addObjSSHKey, delObjSSHKey, NULL, browseSSHKeyInst, NULL, NULL, NULL, tSSHKeyParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}}, +{"Server", &DMWRITE, addObjSSHServer, delObjSSHServer, NULL, browseSSHServerInst, NULL, NULL, tSSHServerObj, tSSHServerParams, NULL, BBFDM_BOTH, NULL}, +{"AuthorizedKey", &DMWRITE, addObjSSHKey, delObjSSHKey, NULL, browseSSHKeyInst, NULL, NULL, NULL, tSSHKeyParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -937,8 +937,8 @@ DMLEAF tSSHParams[] = { DMLEAF tSSHServerParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_ssh_server_enable, set_ssh_server_enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_ssh_server_alias, set_ssh_server_alias, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_ssh_server_interface, set_ssh_server_interface, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_ssh_server_alias, set_ssh_server_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_ssh_server_interface, set_ssh_server_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Port", &DMWRITE, DMT_UNINT, get_ssh_server_port, set_ssh_server_port, BBFDM_BOTH}, {"IdleTimeout", &DMWRITE, DMT_UNINT, get_ssh_server_idle, set_ssh_server_idle, BBFDM_BOTH}, {"KeepAlive", &DMWRITE, DMT_UNINT, get_ssh_server_keepalive, set_ssh_server_keepalive, BBFDM_BOTH}, @@ -962,7 +962,7 @@ DMLEAF tSSHServerSessionParams[] = { DMLEAF tSSHKeyParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_ssh_key_alias, set_ssh_key_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_ssh_key_alias, set_ssh_key_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Key", &DMWRITE, DMT_STRING, get_ssh_key_pubkey, set_ssh_key_pubkey, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/tr181/upnp.c b/libbbfdm/dmtree/tr181/upnp.c index e1b3185d..1ceb0ddf 100644 --- a/libbbfdm/dmtree/tr181/upnp.c +++ b/libbbfdm/dmtree/tr181/upnp.c @@ -53,45 +53,6 @@ struct upnp_description_file_info { struct uci_section *dmmap_sect; }; -/************************************************************************** -* LINKER -***************************************************************************/ -static int get_root_device_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - if (data && ((struct upnpdiscovery *)data)->uuid) - dmasprintf(linker, "%s", ((struct upnpdiscovery *)data)->uuid); - else - *linker = "" ; - return 0; -} - -static int get_device_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - if (data && ((struct upnpdiscovery *)data)->uuid) - dmasprintf(linker, "%s", ((struct upnpdiscovery *)data)->uuid); - else - *linker = "" ; - return 0; -} - -static int get_device_instance_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - if (data && ((struct upnp_device_inst *)data)->udn) - dmasprintf(linker, "%s", ((struct upnp_device_inst *)data)->udn); - else - *linker = "" ; - return 0; -} - -static int get_service_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - if (data && ((struct upnpdiscovery *)data)->usn) - dmasprintf(linker, "%s", ((struct upnpdiscovery *)data)->usn); - else - *linker = "" ; - return 0; -} - /************************************************************* * ENTRY METHOD **************************************************************/ @@ -514,9 +475,11 @@ static int get_UPnPDiscoveryService_Location(char *refparam, struct dmctx *ctx, static int get_UPnPDiscoveryService_ParentDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Device.", ((struct upnpdiscovery *)data)->uuid, value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.RootDevice.", ((struct upnpdiscovery *)data)->uuid, value); + adm_entry_get_reference_param(ctx, "Device.UPnP.Discovery.Device.*.UUID", ((struct upnpdiscovery *)data)->uuid, value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.UPnP.Discovery.RootDevice.*.UUID", ((struct upnpdiscovery *)data)->uuid, value); + return 0; } @@ -557,7 +520,7 @@ static int get_UPnPDescriptionDeviceInstance_UDN(char *refparam, struct dmctx *c static int get_UPnPDescriptionDeviceInstance_ParentDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - adm_entry_get_linker_param(ctx, "Device.UPnP.Description.DeviceInstance.", ((struct upnp_device_inst *)data)->parentudn, value); + adm_entry_get_reference_param(ctx, "Device.UPnP.Description.DeviceInstance.*.UDN", ((struct upnp_device_inst *)data)->parentudn, value); return 0; } @@ -566,13 +529,17 @@ static int get_UPnPDescriptionDeviceInstance_DiscoveryDevice(char *refparam, str struct upnp_device_inst *upnpdevinst = (struct upnp_device_inst *)data; if (upnpdevinst->udn && upnpdevinst->udn[0]) { - char **udnarray = NULL; size_t length = 0; - udnarray = strsplit(upnpdevinst->udn, ":", &length); - adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Device.", udnarray[1], value); - if (!(*value) || (*value)[0] == 0) - adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.RootDevice.", udnarray[1], value); + char **udnarray = strsplit(upnpdevinst->udn, ":", &length); + + if (length != 2) + return 0; + + adm_entry_get_reference_param(ctx, "Device.UPnP.Discovery.Device.*.UUID", udnarray[1], value); + + if (!DM_STRLEN(*value)) + adm_entry_get_reference_param(ctx, "Device.UPnP.Discovery.RootDevice.*.UUID", udnarray[1], value); } return 0; @@ -657,7 +624,7 @@ static int get_UPnPDescriptionDeviceInstance_PresentationURL(char *refparam, str static int get_UPnPDescriptionServiceInstance_ParentDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - adm_entry_get_linker_param(ctx, "Device.UPnP.Description.DeviceInstance.", ((struct upnp_service_inst *)data)->parentudn, value); + adm_entry_get_reference_param(ctx, "Device.UPnP.Description.DeviceInstance.*.UDN", ((struct upnp_service_inst *)data)->parentudn, value); return 0; } @@ -673,7 +640,8 @@ static int get_UPnPDescriptionServiceInstance_ServiceDiscovery(char *refparam, s char usn[512] = {0}; snprintf(usn, sizeof(usn), "%s::%s", ((struct upnp_service_inst *)data)->parentudn, ((struct upnp_service_inst *)data)->servicetype); - adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Service.", usn, value); + + adm_entry_get_reference_param(ctx, "Device.UPnP.Discovery.Service.*.USN", usn, value); return 0; } @@ -751,9 +719,9 @@ DMLEAF tUPnPDeviceCapabilitiesParams[] = { /* *** Device.UPnP.Discovery. *** */ DMOBJ tUPnPDiscoveryObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"RootDevice", &DMREAD, NULL, NULL, NULL, browseUPnPDiscoveryRootDeviceInst, NULL, NULL, NULL, tUPnPDiscoveryRootDeviceParams, get_root_device_linker, BBFDM_BOTH, LIST_KEY{"UUID", NULL}}, -{"Device", &DMREAD, NULL, NULL, NULL, browseUPnPDiscoveryDeviceInst, NULL, NULL, NULL, tUPnPDiscoveryDeviceParams, get_device_linker, BBFDM_BOTH, LIST_KEY{"UUID", NULL}}, -{"Service", &DMREAD, NULL, NULL, NULL, browseUPnPDiscoveryServiceInst, NULL, NULL, NULL, tUPnPDiscoveryServiceParams, get_service_linker, BBFDM_BOTH, LIST_KEY{"USN", NULL}}, +{"RootDevice", &DMREAD, NULL, NULL, NULL, browseUPnPDiscoveryRootDeviceInst, NULL, NULL, NULL, tUPnPDiscoveryRootDeviceParams, NULL, BBFDM_BOTH, NULL}, +{"Device", &DMREAD, NULL, NULL, NULL, browseUPnPDiscoveryDeviceInst, NULL, NULL, NULL, tUPnPDiscoveryDeviceParams, NULL, BBFDM_BOTH, NULL}, +{"Service", &DMREAD, NULL, NULL, NULL, browseUPnPDiscoveryServiceInst, NULL, NULL, NULL, tUPnPDiscoveryServiceParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -769,7 +737,7 @@ DMLEAF tUPnPDiscoveryParams[] = { DMLEAF tUPnPDiscoveryRootDeviceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ //{"Status", &DMREAD, DMT_STRING, get_UPnPDiscoveryRootDevice_Status, NULL, BBFDM_BOTH}, -{"UUID", &DMREAD, DMT_STRING, get_UPnPDiscoveryRootDevice_UUID, NULL, BBFDM_BOTH}, +{"UUID", &DMREAD, DMT_STRING, get_UPnPDiscoveryRootDevice_UUID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"USN", &DMREAD, DMT_STRING, get_UPnPDiscoveryRootDevice_USN, NULL, BBFDM_BOTH}, //{"LeaseTime", &DMREAD, DMT_UNINT, get_UPnPDiscoveryRootDevice_LeaseTime, NULL, BBFDM_BOTH}, {"Location", &DMREAD, DMT_STRING, get_UPnPDiscoveryRootDevice_Location, NULL, BBFDM_BOTH}, @@ -783,7 +751,7 @@ DMLEAF tUPnPDiscoveryRootDeviceParams[] = { DMLEAF tUPnPDiscoveryDeviceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ //{"Status", &DMREAD, DMT_STRING, get_UPnPDiscoveryDevice_Status, NULL, BBFDM_BOTH}, -{"UUID", &DMREAD, DMT_STRING, get_UPnPDiscoveryDevice_UUID, NULL, BBFDM_BOTH}, +{"UUID", &DMREAD, DMT_STRING, get_UPnPDiscoveryDevice_UUID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"USN", &DMREAD, DMT_STRING, get_UPnPDiscoveryDevice_USN, NULL, BBFDM_BOTH}, //{"LeaseTime", &DMREAD, DMT_UNINT, get_UPnPDiscoveryDevice_LeaseTime, NULL, BBFDM_BOTH}, {"Location", &DMREAD, DMT_STRING, get_UPnPDiscoveryDevice_Location, NULL, BBFDM_BOTH}, @@ -797,7 +765,7 @@ DMLEAF tUPnPDiscoveryDeviceParams[] = { DMLEAF tUPnPDiscoveryServiceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ //{"Status", &DMREAD, DMT_STRING, get_UPnPDiscoveryService_Status, NULL, BBFDM_BOTH}, -{"USN", &DMREAD, DMT_STRING, get_UPnPDiscoveryService_USN, NULL, BBFDM_BOTH}, +{"USN", &DMREAD, DMT_STRING, get_UPnPDiscoveryService_USN, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"LeaseTime", &DMREAD, DMT_UNINT, get_UPnPDiscoveryService_LeaseTime, NULL, BBFDM_BOTH}, {"Location", &DMREAD, DMT_STRING, get_UPnPDiscoveryService_Location, NULL, BBFDM_BOTH}, //{"Server", &DMREAD, DMT_STRING, get_UPnPDiscoveryService_Server, NULL, BBFDM_BOTH}, @@ -810,9 +778,9 @@ DMLEAF tUPnPDiscoveryServiceParams[] = { /* *** Device.UPnP.Description. *** */ DMOBJ tUPnPDescriptionObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"DeviceDescription", &DMREAD, NULL, NULL, NULL, browseUPnPDescriptionDeviceDescriptionInst, NULL, NULL, NULL, tUPnPDescriptionDeviceDescriptionParams, NULL, BBFDM_BOTH, LIST_KEY{"URLBase", NULL}}, -{"DeviceInstance", &DMREAD, NULL, NULL, NULL, browseUPnPDescriptionDeviceInstanceInst, NULL, NULL, NULL, tUPnPDescriptionDeviceInstanceParams, get_device_instance_linker, BBFDM_BOTH, LIST_KEY{"UDN", NULL}}, -{"ServiceInstance", &DMREAD, NULL, NULL, NULL, browseUPnPDescriptionServiceInstanceInst, NULL, NULL, NULL, tUPnPDescriptionServiceInstanceParams, NULL, BBFDM_BOTH, LIST_KEY{"ParentDevice", "ServiceId", NULL}}, +{"DeviceDescription", &DMREAD, NULL, NULL, NULL, browseUPnPDescriptionDeviceDescriptionInst, NULL, NULL, NULL, tUPnPDescriptionDeviceDescriptionParams, NULL, BBFDM_BOTH, NULL}, +{"DeviceInstance", &DMREAD, NULL, NULL, NULL, browseUPnPDescriptionDeviceInstanceInst, NULL, NULL, NULL, tUPnPDescriptionDeviceInstanceParams, NULL, BBFDM_BOTH, NULL}, +{"ServiceInstance", &DMREAD, NULL, NULL, NULL, browseUPnPDescriptionServiceInstanceInst, NULL, NULL, NULL, tUPnPDescriptionServiceInstanceParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -827,7 +795,7 @@ DMLEAF tUPnPDescriptionParams[] = { /* *** Device.UPnP.Description.DeviceDescription.{i}. *** */ DMLEAF tUPnPDescriptionDeviceDescriptionParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"URLBase", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceDescription_URLBase, NULL, BBFDM_BOTH}, +{"URLBase", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceDescription_URLBase, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"SpecVersion", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceDescription_SpecVersion, NULL, BBFDM_BOTH}, //{"Host", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceDescription_Host, NULL, BBFDM_BOTH}, {0} @@ -836,8 +804,8 @@ DMLEAF tUPnPDescriptionDeviceDescriptionParams[] = { /* *** Device.UPnP.Description.DeviceInstance.{i}. *** */ DMLEAF tUPnPDescriptionDeviceInstanceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"UDN", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_UDN, NULL, BBFDM_BOTH}, -{"ParentDevice", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_ParentDevice, NULL, BBFDM_BOTH}, +{"UDN", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_UDN, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ParentDevice", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_ParentDevice, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"DiscoveryDevice", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_DiscoveryDevice, NULL, BBFDM_BOTH}, {"DeviceType", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_DeviceType, NULL, BBFDM_BOTH}, {"FriendlyName", &DMREAD, DMT_STRING, get_UPnPDescriptionDeviceInstance_FriendlyName, NULL, BBFDM_BOTH}, @@ -858,8 +826,8 @@ DMLEAF tUPnPDescriptionDeviceInstanceParams[] = { /* *** Device.UPnP.Description.ServiceInstance.{i}. *** */ DMLEAF tUPnPDescriptionServiceInstanceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"ParentDevice", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_ParentDevice, NULL, BBFDM_BOTH}, -{"ServiceId", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_ServiceId, NULL, BBFDM_BOTH}, +{"ParentDevice", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_ParentDevice, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"ServiceId", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_ServiceId, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ServiceDiscovery", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_ServiceDiscovery, NULL, BBFDM_BOTH}, {"ServiceType", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_ServiceType, NULL, BBFDM_BOTH}, {"SCPDURL", &DMREAD, DMT_STRING, get_UPnPDescriptionServiceInstance_SCPDURL, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/usb.c b/libbbfdm/dmtree/tr181/usb.c index 16220d88..ac46a9c1 100644 --- a/libbbfdm/dmtree/tr181/usb.c +++ b/libbbfdm/dmtree/tr181/usb.c @@ -474,9 +474,7 @@ static int get_USBInterface_Name(char *refparam, struct dmctx *ctx, void *data, static int get_USBInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - const struct usb_interface *iface = (struct usb_interface *)data; - - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", iface->iface_name, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", ((struct usb_interface *)data)->iface_name, value); return 0; } @@ -852,8 +850,7 @@ out: static int get_USBUSBHostsHostDevice_USBPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - struct usb_port *port = (struct usb_port *)data; - adm_entry_get_linker_param(ctx, "Device.USB.Port.", port->folder_name, value); + adm_entry_get_reference_param(ctx, "Device.USB.Port.*.Name", ((struct usb_port *)data)->folder_name, value); return 0; } @@ -864,19 +861,28 @@ static int get_USBUSBHostsHostDevice_Rate(char *refparam, struct dmctx *ctx, voi static int get_USBUSBHostsHostDevice_Parent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - struct usb_port *port = (struct usb_port*)data; + struct usb_port *usbdev = (struct usb_port*)data; char *host_inst, usb_host_path[128] = {0}; - regex_t regex1 = {}; + regex_t regex1 = {0}; + size_t length; regcomp(®ex1, "^[0-9][0-9]*-[0-9]*[0-9]\\.[0-9]*[0-9]$", 0); - if (regexec(®ex1, port->folder_name, 0, NULL, 0) != 0 || port->dmsect == NULL) { + if (regexec(®ex1, usbdev->folder_name, 0, NULL, 0) != 0 || usbdev->dmsect == NULL) { *value = ""; goto out; } - dmuci_get_value_by_section_string(port->dmsect, "usb_host_instance", &host_inst); - snprintf(usb_host_path, sizeof(usb_host_path), "Device.USB.USBHosts.Host.%s.Device.", host_inst); - adm_entry_get_linker_param(ctx, usb_host_path, port->folder_name, value); + char **filename = strsplit(usbdev->folder_name, "-", &length); + char **port = strsplit(filename[1], ".", &length); + if (!port || port[0] == NULL) { + *value = ""; + goto out; + } + + dmuci_get_value_by_section_string(usbdev->dmsect, "usb_host_instance", &host_inst); + snprintf(usb_host_path, sizeof(usb_host_path), "Device.USB.USBHosts.Host.%s.Device.*.DeviceNumber", host_inst); + + adm_entry_get_reference_param(ctx, usb_host_path, port[0], value); out: regfree(®ex1); @@ -965,9 +971,9 @@ static int get_linker_usb_host_device(char *refparam, struct dmctx *dmctx, void /* *** Device.USB. *** */ DMOBJ tUSBObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Interface", &DMREAD, NULL, NULL, NULL, browseUSBInterfaceInst, NULL, NULL, tUSBInterfaceObj, tUSBInterfaceParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"Port", &DMREAD, NULL, NULL, NULL, browseUSBPortInst, NULL, NULL, NULL, tUSBPortParams, get_linker_usb_port, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"USBHosts", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tUSBUSBHostsObj, tUSBUSBHostsParams, NULL, BBFDM_BOTH}, +{"Interface", &DMREAD, NULL, NULL, NULL, browseUSBInterfaceInst, NULL, NULL, tUSBInterfaceObj, tUSBInterfaceParams, NULL, BBFDM_BOTH, NULL}, +{"Port", &DMREAD, NULL, NULL, NULL, browseUSBPortInst, NULL, NULL, NULL, tUSBPortParams, get_linker_usb_port, BBFDM_BOTH, NULL}, +{"USBHosts", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tUSBUSBHostsObj, tUSBUSBHostsParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -989,10 +995,10 @@ DMLEAF tUSBInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_USBInterface_Enable, set_USBInterface_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_USBInterface_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_USBInterface_Alias, set_USBInterface_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_USBInterface_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_USBInterface_Alias, set_USBInterface_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_USBInterface_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"LastChange", &DMREAD, DMT_UNINT, get_USBInterface_LastChange, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_USBInterface_LowerLayers, set_USBInterface_LowerLayers, BBFDM_BOTH}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_USBInterface_LowerLayers, set_USBInterface_LowerLayers, BBFDM_BOTH, DM_FLAG_REFERENCE}, //{"Upstream", &DMREAD, DMT_BOOL, get_USBInterface_Upstream, NULL, BBFDM_BOTH}, {"MACAddress", &DMREAD, DMT_STRING, get_USBInterface_MACAddress, NULL, BBFDM_BOTH}, {"MaxBitRate", &DMREAD, DMT_UNINT, get_USBInterface_MaxBitRate, NULL, BBFDM_BOTH}, @@ -1024,8 +1030,8 @@ DMLEAF tUSBInterfaceStatsParams[] = { /* *** Device.USB.Port.{i}. *** */ DMLEAF tUSBPortParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_USBPort_Alias, set_USBPort_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_USBPort_Name, NULL, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_USBPort_Alias, set_USBPort_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_USBPort_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Standard", &DMREAD, DMT_STRING, get_USBPort_Standard, NULL, BBFDM_BOTH}, {"Type", &DMREAD, DMT_STRING, get_USBPort_Type, NULL, BBFDM_BOTH}, //{"Receptacle", &DMREAD, DMT_STRING, get_USBPort_Receptacle, NULL, BBFDM_BOTH}, @@ -1037,7 +1043,7 @@ DMLEAF tUSBPortParams[] = { /* *** Device.USB.USBHosts. *** */ DMOBJ tUSBUSBHostsObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Host", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostInst, NULL, NULL, tUSBUSBHostsHostObj, tUSBUSBHostsHostParams, NULL, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, +{"Host", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostInst, NULL, NULL, tUSBUSBHostsHostObj, tUSBUSBHostsHostParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -1050,15 +1056,15 @@ DMLEAF tUSBUSBHostsParams[] = { /* *** Device.USB.USBHosts.Host.{i}. *** */ DMOBJ tUSBUSBHostsHostObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Device", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostDeviceInst, NULL, NULL, tUSBUSBHostsHostDeviceObj, tUSBUSBHostsHostDeviceParams, get_linker_usb_host_device, BBFDM_BOTH, LIST_KEY{"DeviceNumber", NULL}}, +{"Device", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostDeviceInst, NULL, NULL, tUSBUSBHostsHostDeviceObj, tUSBUSBHostsHostDeviceParams, get_linker_usb_host_device, BBFDM_BOTH}, {0} }; DMLEAF tUSBUSBHostsHostParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_USBUSBHostsHost_Alias, set_USBUSBHostsHost_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_USBUSBHostsHost_Alias, set_USBUSBHostsHost_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_USBUSBHostsHost_Enable, set_USBUSBHostsHost_Enable, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_USBUSBHostsHost_Name, NULL, BBFDM_BOTH}, +{"Name", &DMREAD, DMT_STRING, get_USBUSBHostsHost_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Type", &DMREAD, DMT_STRING, get_USBUSBHostsHost_Type, NULL, BBFDM_BOTH}, //{"Reset", &DMWRITE, DMT_BOOL, get_USBUSBHostsHost_Reset, set_USBUSBHostsHost_Reset, BBFDM_BOTH}, {"PowerManagementEnable", &DMWRITE, DMT_BOOL, get_USBUSBHostsHost_PowerManagementEnable, set_USBUSBHostsHost_PowerManagementEnable, BBFDM_BOTH}, @@ -1070,13 +1076,13 @@ DMLEAF tUSBUSBHostsHostParams[] = { /* *** Device.USB.USBHosts.Host.{i}.Device.{i}. *** */ DMOBJ tUSBUSBHostsHostDeviceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Configuration", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostDeviceConfigurationInst, NULL, NULL, tUSBUSBHostsHostDeviceConfigurationObj, tUSBUSBHostsHostDeviceConfigurationParams, NULL, BBFDM_BOTH, LIST_KEY{"ConfigurationNumber", NULL}}, +{"Configuration", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostDeviceConfigurationInst, NULL, NULL, tUSBUSBHostsHostDeviceConfigurationObj, tUSBUSBHostsHostDeviceConfigurationParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tUSBUSBHostsHostDeviceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"DeviceNumber", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDevice_DeviceNumber, NULL, BBFDM_BOTH}, +{"DeviceNumber", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDevice_DeviceNumber, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"USBVersion", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_USBVersion, NULL, BBFDM_BOTH}, {"DeviceClass", &DMREAD, DMT_HEXBIN, get_USBUSBHostsHostDevice_DeviceClass, NULL, BBFDM_BOTH}, {"DeviceSubClass", &DMREAD, DMT_HEXBIN, get_USBUSBHostsHostDevice_DeviceSubClass, NULL, BBFDM_BOTH}, @@ -1088,9 +1094,9 @@ DMLEAF tUSBUSBHostsHostDeviceParams[] = { {"ProductClass", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_ProductClass, NULL, BBFDM_BOTH}, {"SerialNumber", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_SerialNumber, NULL, BBFDM_BOTH}, {"Port", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDevice_Port, NULL, BBFDM_BOTH}, -{"USBPort", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_USBPort, NULL, BBFDM_BOTH}, +{"USBPort", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_USBPort, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Rate", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_Rate, NULL, BBFDM_BOTH}, -{"Parent", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_Parent, NULL, BBFDM_BOTH}, +{"Parent", &DMREAD, DMT_STRING, get_USBUSBHostsHostDevice_Parent, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"MaxChildren", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDevice_MaxChildren, NULL, BBFDM_BOTH}, {"IsSuspended", &DMREAD, DMT_BOOL, get_USBUSBHostsHostDevice_IsSuspended, NULL, BBFDM_BOTH}, //{"IsSelfPowered", &DMREAD, DMT_BOOL, get_USBUSBHostsHostDevice_IsSelfPowered, NULL, BBFDM_BOTH}, @@ -1101,13 +1107,13 @@ DMLEAF tUSBUSBHostsHostDeviceParams[] = { /* *** Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}. *** */ DMOBJ tUSBUSBHostsHostDeviceConfigurationObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Interface", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostDeviceConfigurationInterfaceInst, NULL, NULL, NULL, tUSBUSBHostsHostDeviceConfigurationInterfaceParams, NULL, BBFDM_BOTH, LIST_KEY{"InterfaceNumber", NULL}}, +{"Interface", &DMREAD, NULL, NULL, NULL, browseUSBUSBHostsHostDeviceConfigurationInterfaceInst, NULL, NULL, NULL, tUSBUSBHostsHostDeviceConfigurationInterfaceParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tUSBUSBHostsHostDeviceConfigurationParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"ConfigurationNumber", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDeviceConfiguration_ConfigurationNumber, NULL, BBFDM_BOTH}, +{"ConfigurationNumber", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDeviceConfiguration_ConfigurationNumber, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"InterfaceNumberOfEntries", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDeviceConfiguration_InterfaceNumberOfEntries, NULL, BBFDM_BOTH}, {0} }; @@ -1115,7 +1121,7 @@ DMLEAF tUSBUSBHostsHostDeviceConfigurationParams[] = { /* *** Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}. *** */ DMLEAF tUSBUSBHostsHostDeviceConfigurationInterfaceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"InterfaceNumber", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDeviceConfigurationInterface_InterfaceNumber, NULL, BBFDM_BOTH}, +{"InterfaceNumber", &DMREAD, DMT_UNINT, get_USBUSBHostsHostDeviceConfigurationInterface_InterfaceNumber, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"InterfaceClass", &DMREAD, DMT_HEXBIN, get_USBUSBHostsHostDeviceConfigurationInterface_InterfaceClass, NULL, BBFDM_BOTH}, {"InterfaceSubClass", &DMREAD, DMT_HEXBIN, get_USBUSBHostsHostDeviceConfigurationInterface_InterfaceSubClass, NULL, BBFDM_BOTH}, {"InterfaceProtocol", &DMREAD, DMT_HEXBIN, get_USBUSBHostsHostDeviceConfigurationInterface_InterfaceProtocol, NULL, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/userinterface.c b/libbbfdm/dmtree/tr181/userinterface.c index c60fc93d..18e8dd78 100644 --- a/libbbfdm/dmtree/tr181/userinterface.c +++ b/libbbfdm/dmtree/tr181/userinterface.c @@ -469,30 +469,30 @@ static int set_http_access_type(char *refparam, struct dmctx *ctx, void *data, c static int get_http_access_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = NULL; - dmuci_get_value_by_section_string(((struct dmmap_http *)data)->config_section, "uci_interface", &linker); - if (DM_STRLEN(linker) != 0) - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + dmuci_get_value_by_section_string(((struct dmmap_http *)data)->config_section, "uci_interface", &linker); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_http_access_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char *linker = NULL; char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct dmmap_http *)data)->config_section, "uci_interface", linker ? linker : ""); + dmuci_set_value_by_section(((struct dmmap_http *)data)->config_section, "uci_interface", reference.value); break; } return 0; @@ -738,16 +738,16 @@ DMLEAF tUIParams[] = { DMOBJ tUIHTTPAccessObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"HTTPAccess", &DMWRITE, addHTTPAccess, delHTTPAccess, "file:/etc/config/nginx", browseHTTPAccess, NULL, NULL, tHTTPSessionObj, tHTTPAccessParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias","Port",NULL}}, +{"HTTPAccess", &DMWRITE, addHTTPAccess, delHTTPAccess, "file:/etc/config/nginx", browseHTTPAccess, NULL, NULL, tHTTPSessionObj, tHTTPAccessParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tHTTPAccessParams[] = { {"Enable", &DMWRITE, DMT_BOOL, get_http_access_enable, set_http_access_enable, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_http_access_alias, set_http_access_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_http_access_alias, set_http_access_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"AccessType", &DMWRITE, DMT_STRING, get_http_access_type, set_http_access_type, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_http_access_interface, set_http_access_interface, BBFDM_BOTH}, -{"Port", &DMWRITE, DMT_UNINT, get_http_access_port, set_http_access_port, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_http_access_interface, set_http_access_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"Port", &DMWRITE, DMT_UNINT, get_http_access_port, set_http_access_port, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Protocol", &DMREAD, DMT_STRING, get_http_access_protocol, NULL, BBFDM_BOTH}, {"AllowedHosts", &DMWRITE, DMT_STRING, get_http_access_hosts, set_http_access_hosts, BBFDM_BOTH}, {"AllowedPathPrefixes", &DMWRITE, DMT_STRING, get_http_access_path, set_http_access_path, BBFDM_BOTH}, diff --git a/libbbfdm/dmtree/tr181/wifi.c b/libbbfdm/dmtree/tr181/wifi.c index 8db9d37f..89851b03 100644 --- a/libbbfdm/dmtree/tr181/wifi.c +++ b/libbbfdm/dmtree/tr181/wifi.c @@ -2269,8 +2269,8 @@ static int set_WiFiEndPoint_Alias(char *refparam, struct dmctx *ctx, void *data, static int get_WiFiEndPoint_SSIDReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { struct uci_section *iface_s = get_dup_section_in_config_opt("wireless", "wifi-iface", "ifname", ((struct wifi_enp_args *)data)->ifname); - if (iface_s) - adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", section_name(iface_s), value); + + adm_entry_get_reference_param(ctx, "Device.WiFi.SSID.*.Name", section_name(iface_s), value); return 0; } @@ -2678,33 +2678,48 @@ static int set_access_point_alias(char *refparam, struct dmctx *ctx, void *data, static int get_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *device = NULL; + dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "LowerLayers", value); + + if ((*value)[0] == '\0') { + char *device = NULL; + + dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "device", &device); + adm_entry_get_reference_param(ctx, "Device.WiFi.Radio.*.Name", device, value); + + // Store LowerLayers value + dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "LowerLayers", *value); + } else { + if (!adm_entry_object_exists(ctx, *value)) + *value = ""; + } - dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->dmmap_s, "device", &device); - adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", device, value); return 0; } static int set_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.WiFi.Radio.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "device", linker ? linker : ""); + // Store LowerLayers value under dmmap section + dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "LowerLayers", reference.path); + + dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->dmmap_s, "device", reference.value); if (((struct wifi_ssid_args *)data)->config_s) - dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->config_s, "device", linker ? linker : ""); + dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->config_s, "device", reference.value); return 0; } return 0; @@ -2715,44 +2730,45 @@ static int get_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char * dmuci_get_value_by_section_string((((struct wifi_acp_args *)data)->sections)->dmmap_section, "LowerLayers", value); if ((*value)[0] == '\0') { - adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", section_name((((struct wifi_acp_args *)data)->sections)->config_section), value); - } else { - char *linker = NULL; + adm_entry_get_reference_param(ctx, "Device.WiFi.SSID.*.Name", section_name((((struct wifi_acp_args *)data)->sections)->config_section), value); - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) + // Store LowerLayers value + dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->dmmap_section, "LowerLayers", *value); + } else { + if (!adm_entry_object_exists(ctx, *value)) *value = ""; } + return 0; } static int set_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.WiFi.SSID.", NULL}; + struct dm_reference reference = {0}; struct uci_section *ss = NULL; - char *linker = NULL; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - // Store LowerLayers value under dmmap_wireless section - dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->dmmap_section, "LowerLayers", value); + dmuci_set_value_by_section((((struct wifi_acp_args *)data)->sections)->dmmap_section, "LowerLayers", reference.path); - if (linker) { + if (DM_STRLEN(reference.value)) { char *device = NULL, *ssid = NULL, *enabled = NULL; - ss = get_dup_section_in_dmmap_opt("dmmap_wireless", "ssid", "ap_section_name", linker); + ss = get_dup_section_in_dmmap_opt("dmmap_wireless", "ssid", "ap_section_name", reference.value); if (ss == NULL) { - ss = get_dup_section_in_dmmap_opt("dmmap_wireless", "ssid", "ssid_instance", linker); + ss = get_dup_section_in_dmmap_opt("dmmap_wireless", "ssid", "ssid_instance", reference.value); } dmuci_set_value_by_section(ss, "ap_section_name", section_name((((struct wifi_acp_args *)data)->sections)->config_section)); @@ -3588,11 +3604,11 @@ DMOBJ tWiFiObj[] = { #ifdef BBF_WIFI_DATAELEMENTS {"DataElements", &DMREAD, NULL, NULL, "file:/etc/init.d/decollector", NULL, NULL, NULL, tWiFiDataElementsObj, NULL, NULL, BBFDM_BOTH, NULL}, #endif -{"Radio", &DMREAD, NULL, NULL, "file:/etc/config/wireless", browseWifiRadioInst, NULL, NULL, tWiFiRadioObj, tWiFiRadioParams, get_linker_Wifi_Radio, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}}, -{"SSID", &DMWRITE, add_wifi_ssid, delete_wifi_ssid, "file:/etc/config/wireless", browseWifiSsidInst, NULL, NULL, tWiFiSSIDObj, tWiFiSSIDParams, get_linker_Wifi_Ssid, BBFDM_BOTH, LIST_KEY{"Name", "Alias", "BSSID", NULL}}, -{"AccessPoint", &DMWRITE, add_wifi_accesspoint, delete_wifi_accesspoint, "file:/etc/config/wireless", browseWifiAccessPointInst, NULL, NULL, tWiFiAccessPointObj, tWiFiAccessPointParams, get_linker_Wifi_AccessPoint, BBFDM_BOTH, LIST_KEY{"SSIDReference", "Alias", NULL}}, +{"Radio", &DMREAD, NULL, NULL, "file:/etc/config/wireless", browseWifiRadioInst, NULL, NULL, tWiFiRadioObj, tWiFiRadioParams, get_linker_Wifi_Radio, BBFDM_BOTH, NULL}, +{"SSID", &DMWRITE, add_wifi_ssid, delete_wifi_ssid, "file:/etc/config/wireless", browseWifiSsidInst, NULL, NULL, tWiFiSSIDObj, tWiFiSSIDParams, get_linker_Wifi_Ssid, BBFDM_BOTH, NULL}, +{"AccessPoint", &DMWRITE, add_wifi_accesspoint, delete_wifi_accesspoint, "file:/etc/config/wireless", browseWifiAccessPointInst, NULL, NULL, tWiFiAccessPointObj, tWiFiAccessPointParams, get_linker_Wifi_AccessPoint, BBFDM_BOTH, NULL}, {"NeighboringWiFiDiagnostic", &DMREAD, NULL, NULL, "file:/etc/config/wireless", NULL, NULL, NULL, tWiFiNeighboringWiFiDiagnosticObj, tWiFiNeighboringWiFiDiagnosticParams, NULL, BBFDM_BOTH, NULL}, -{"EndPoint", &DMWRITE, addObjWiFiEndPoint, delObjWiFiEndPoint, "file:/etc/config/wireless", browseWiFiEndPointInst, NULL, NULL, tWiFiEndPointObj, tWiFiEndPointParams, NULL, BBFDM_BOTH, LIST_KEY{"SSIDReference", "Alias", NULL}}, +{"EndPoint", &DMWRITE, addObjWiFiEndPoint, delObjWiFiEndPoint, "file:/etc/config/wireless", browseWiFiEndPointInst, NULL, NULL, tWiFiEndPointObj, tWiFiEndPointParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3616,11 +3632,11 @@ DMOBJ tWiFiRadioObj[] = { DMLEAF tWiFiRadioParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_radio_alias, set_radio_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_radio_alias, set_radio_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_radio_enable, set_radio_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_radio_status, NULL, BBFDM_BOTH}, {"LowerLayers", &DMWRITE, DMT_STRING, get_WiFiRadio_LowerLayers, set_WiFiRadio_LowerLayers, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_WiFiRadio_Name, NULL, BBFDM_BOTH}, +{"Name", &DMREAD, DMT_STRING, get_WiFiRadio_Name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, {"MaxBitRate", &DMREAD, DMT_UNINT, get_radio_max_bit_rate, NULL, BBFDM_BOTH}, {"SupportedFrequencyBands", &DMREAD, DMT_STRING, get_radio_supported_frequency_bands, NULL, BBFDM_BOTH}, {"OperatingFrequencyBand", &DMWRITE, DMT_STRING, get_radio_frequency, set_radio_frequency, BBFDM_BOTH}, @@ -3700,12 +3716,12 @@ DMOBJ tWiFiSSIDObj[] = { DMLEAF tWiFiSSIDParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_ssid_alias, set_ssid_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_ssid_alias, set_ssid_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_wifi_ssid_enable, set_wifi_ssid_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_wifi_status, NULL, BBFDM_BOTH}, -{"SSID", &DMWRITE, DMT_STRING, get_wlan_ssid, set_wlan_ssid, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_wlan_name, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_ssid_lower_layer, set_ssid_lower_layer, BBFDM_BOTH}, +{"SSID", &DMWRITE, DMT_STRING, get_wlan_ssid, set_wlan_ssid, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Name", &DMREAD, DMT_STRING, get_wlan_name, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_LINKER}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_ssid_lower_layer, set_ssid_lower_layer, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"BSSID", &DMREAD, DMT_STRING, get_wlan_bssid, NULL, BBFDM_BOTH}, {"MACAddress", &DMREAD, DMT_STRING, get_WiFiSSID_MACAddress, NULL, BBFDM_BOTH}, {0} @@ -3742,7 +3758,7 @@ DMLEAF tWiFiSSIDStatsParams[] = { DMOBJ tWiFiAccessPointObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"Security", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointSecurityParams, NULL, BBFDM_BOTH, NULL}, -{"AssociatedDevice", &DMREAD, NULL, NULL, NULL, browse_wifi_associated_device, NULL, NULL, tWiFiAccessPointAssociatedDeviceObj, tWiFiAccessPointAssociatedDeviceParams, get_linker_associated_device, BBFDM_BOTH, LIST_KEY{"MACAddress", NULL}}, +{"AssociatedDevice", &DMREAD, NULL, NULL, NULL, browse_wifi_associated_device, NULL, NULL, tWiFiAccessPointAssociatedDeviceObj, tWiFiAccessPointAssociatedDeviceParams, get_linker_associated_device, BBFDM_BOTH, NULL}, {"WPS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointWPSParams, NULL, BBFDM_BOTH, NULL}, {"Accounting", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointAccountingParams, NULL, BBFDM_BOTH, NULL}, {0} @@ -3750,10 +3766,10 @@ DMOBJ tWiFiAccessPointObj[] = { DMLEAF tWiFiAccessPointParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Alias", &DMWRITE, DMT_STRING, get_access_point_alias, set_access_point_alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_access_point_alias, set_access_point_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_access_point_enable, set_access_point_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_wifi_access_point_status, NULL, BBFDM_BOTH}, -{"SSIDReference", &DMWRITE, DMT_STRING, get_ap_ssid_ref, set_ap_ssid_ref, BBFDM_BOTH}, +{"SSIDReference", &DMWRITE, DMT_STRING, get_ap_ssid_ref, set_ap_ssid_ref, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"SSIDAdvertisementEnabled", &DMWRITE, DMT_BOOL, get_wlan_ap_advertisement_enable, set_wlan_ap_advertisement_enable, BBFDM_BOTH}, {"WMMEnable", &DMWRITE, DMT_BOOL, get_wmm_enabled, set_wmm_enabled, BBFDM_BOTH}, {"UAPSDEnable", &DMWRITE, DMT_BOOL, get_WiFiAccessPoint_UAPSDEnable, set_WiFiAccessPoint_UAPSDEnable, BBFDM_BOTH}, @@ -3809,7 +3825,7 @@ DMLEAF tWiFiAccessPointAssociatedDeviceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Active", &DMREAD, DMT_BOOL, get_WiFiAccessPointAssociatedDevice_Active, NULL, BBFDM_BOTH}, {"Noise", &DMREAD, DMT_INT, get_WiFiAccessPointAssociatedDevice_Noise, NULL, BBFDM_BOTH}, -{"MACAddress", &DMREAD, DMT_STRING, get_WiFiAccessPointAssociatedDevice_MACAddress, NULL, BBFDM_BOTH}, +{"MACAddress", &DMREAD, DMT_STRING, get_WiFiAccessPointAssociatedDevice_MACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"LastDataDownlinkRate", &DMREAD, DMT_UNINT, get_WiFiAccessPointAssociatedDevice_LastDataDownlinkRate, NULL, BBFDM_BOTH}, {"LastDataUplinkRate", &DMREAD, DMT_UNINT, get_WiFiAccessPointAssociatedDevice_LastDataUplinkRate, NULL, BBFDM_BOTH}, {"SignalStrength", &DMREAD, DMT_INT, get_WiFiAccessPointAssociatedDevice_SignalStrength, NULL, BBFDM_BOTH}, @@ -3852,7 +3868,7 @@ DMOBJ tWiFiEndPointObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointStatsParams, NULL, BBFDM_BOTH, NULL}, {"Security", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointSecurityParams, NULL, BBFDM_BOTH, NULL}, -{"Profile", &DMREAD, NULL, NULL, NULL, browseWiFiEndPointProfileInst, NULL, NULL, tWiFiEndPointProfileObj, tWiFiEndPointProfileParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "SSID", "Location", "Priority", NULL}}, +{"Profile", &DMREAD, NULL, NULL, NULL, browseWiFiEndPointProfileInst, NULL, NULL, tWiFiEndPointProfileObj, tWiFiEndPointProfileParams, NULL, BBFDM_BOTH, NULL}, {"WPS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointWPSParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3861,9 +3877,9 @@ DMLEAF tWiFiEndPointParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_WiFiEndPoint_Enable, set_WiFiEndPoint_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_WiFiEndPoint_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_WiFiEndPoint_Alias, set_WiFiEndPoint_Alias, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_WiFiEndPoint_Alias, set_WiFiEndPoint_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, //{"ProfileReference", &DMWRITE, DMT_STRING, get_WiFiEndPoint_ProfileReference, set_WiFiEndPoint_ProfileReference, BBFDM_BOTH}, -{"SSIDReference", &DMREAD, DMT_STRING, get_WiFiEndPoint_SSIDReference, NULL, BBFDM_BOTH}, +{"SSIDReference", &DMREAD, DMT_STRING, get_WiFiEndPoint_SSIDReference, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, //{"ProfileNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiEndPoint_ProfileNumberOfEntries, NULL, BBFDM_BOTH}, {0} }; @@ -3896,10 +3912,10 @@ DMLEAF tWiFiEndPointProfileParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_WiFiEndPointProfile_Enable, set_WiFiEndPointProfile_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_WiFiEndPointProfile_Status, NULL, BBFDM_BOTH}, -{"Alias", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_Alias, set_WiFiEndPointProfile_Alias, BBFDM_BOTH}, -{"SSID", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_SSID, set_WiFiEndPointProfile_SSID, BBFDM_BOTH}, -{"Location", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_Location, set_WiFiEndPointProfile_Location, BBFDM_BOTH}, -//{"Priority", &DMWRITE, DMT_UNINT, get_WiFiEndPointProfile_Priority, set_WiFiEndPointProfile_Priority, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_Alias, set_WiFiEndPointProfile_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"SSID", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_SSID, set_WiFiEndPointProfile_SSID, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Location", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_Location, set_WiFiEndPointProfile_Location, BBFDM_BOTH, DM_FLAG_UNIQUE}, +//{"Priority", &DMWRITE, DMT_UNINT, get_WiFiEndPointProfile_Priority, set_WiFiEndPointProfile_Priority, BBFDM_BOTH, DM_FLAG_UNIQUE}, {0} }; diff --git a/libbbfdm/dmtree/tr181/wifi.dataelements.c b/libbbfdm/dmtree/tr181/wifi.dataelements.c index a0090f65..03f9a35a 100644 --- a/libbbfdm/dmtree/tr181/wifi.dataelements.c +++ b/libbbfdm/dmtree/tr181/wifi.dataelements.c @@ -30,15 +30,6 @@ struct wifi_ap_fronthaul_args char *band_list; }; -/************************************************************************** -* LINKER -***************************************************************************/ -static int get_linker_wfdata_BSS_STA(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) -{ - *linker = data ? dmjson_get_value((json_object *)data, 1, "MACAddress") : ""; - return 0; -} - /************************************************************* * COMMON FUNCTIONS **************************************************************/ @@ -2581,7 +2572,7 @@ static int get_WiFiDataElementsNetworkDeviceMultiAPDevice_LastContactTime(char * static int get_WiFiDataElementsNetworkDeviceMultiAPDevice_AssocIEEE1905DeviceRef(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *device_id = dmjson_get_value(((struct wifi_data_element_args *)data)->dump_obj, 1, "ID"); - adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", device_id, value); + adm_entry_get_reference_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.*.IEEE1905Id", device_id, value); return 0; } @@ -3637,7 +3628,7 @@ static int get_event_args_WiFiDataElementsDisassociationEvent_Disassociated(char /* *** Device.WiFi.DataElements. *** */ DMOBJ tWiFiDataElementsObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Network", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkObj, tWiFiDataElementsNetworkParams, NULL, BBFDM_BOTH, NULL}, +{"Network", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkObj, tWiFiDataElementsNetworkParams, NULL, BBFDM_BOTH}, {"AssociationEvent", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsAssociationEventObj, tWiFiDataElementsAssociationEventParams, NULL, BBFDM_BOTH, NULL}, {"DisassociationEvent", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsDisassociationEventObj, tWiFiDataElementsDisassociationEventParams, NULL, BBFDM_BOTH, NULL}, //{"FailedConnectionEvent", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsFailedConnectionEventObj, tWiFiDataElementsFailedConnectionEventParams, NULL, BBFDM_BOTH, NULL}, @@ -3647,9 +3638,9 @@ DMOBJ tWiFiDataElementsObj[] = { /* *** Device.WiFi.DataElements.Network. *** */ DMOBJ tWiFiDataElementsNetworkObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"SSID", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkSSIDInst, NULL, NULL, NULL, tWiFiDataElementsNetworkSSIDParams, NULL, BBFDM_BOTH, LIST_KEY{"SSID", NULL}}, +{"SSID", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkSSIDInst, NULL, NULL, NULL, tWiFiDataElementsNetworkSSIDParams, NULL, BBFDM_BOTH, NULL}, {"MultiAPSteeringSummaryStats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkMultiAPSteeringSummaryStatsParams, NULL, BBFDM_BOTH, NULL}, -{"Device", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceInst, NULL, NULL, tWiFiDataElementsNetworkDeviceObj, tWiFiDataElementsNetworkDeviceParams, NULL, BBFDM_BOTH, LIST_KEY{"ID", NULL}}, +{"Device", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceInst, NULL, NULL, tWiFiDataElementsNetworkDeviceObj, tWiFiDataElementsNetworkDeviceParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3674,7 +3665,7 @@ DMLEAF tWiFiDataElementsNetworkParams[] = { /* *** Device.WiFi.DataElements.Network.SSID.{i}. *** */ DMLEAF tWiFiDataElementsNetworkSSIDParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"SSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkSSID_SSID, NULL, BBFDM_BOTH}, +{"SSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkSSID_SSID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Band", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkSSID_Band, NULL, BBFDM_BOTH}, {0} }; @@ -3696,21 +3687,21 @@ DMLEAF tWiFiDataElementsNetworkMultiAPSteeringSummaryStatsParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"Default8021Q", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceDefault8021QInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceDefault8021QParams, NULL, BBFDM_BOTH, LIST_KEY{"PrimaryVID", NULL}}, -{"SSIDtoVIDMapping", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceSSIDtoVIDMappingInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceSSIDtoVIDMappingParams, NULL, BBFDM_BOTH, LIST_KEY{"SSID", NULL}}, -{"CACStatus", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusInst, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusObj, tWiFiDataElementsNetworkDeviceCACStatusParams, NULL, BBFDM_BOTH, LIST_KEY{"TimeStamp", NULL}}, -//{"SPRule", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceSPRuleInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceSPRuleParams, NULL, BBFDM_BOTH, LIST_KEY{"ID", NULL}}, -{"IEEE1905Security", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceIEEE1905SecurityInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceIEEE1905SecurityParams, NULL, BBFDM_BOTH, LIST_KEY{"OnboardingProtocol", NULL}}, -//{"AnticipatedChannels", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceAnticipatedChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceAnticipatedChannelsParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, -//{"AnticipatedChannelUsage", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceAnticipatedChannelUsageInst, NULL, NULL, tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageObj, tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, +{"Default8021Q", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceDefault8021QInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceDefault8021QParams, NULL, BBFDM_BOTH, NULL}, +{"SSIDtoVIDMapping", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceSSIDtoVIDMappingInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceSSIDtoVIDMappingParams, NULL, BBFDM_BOTH, NULL}, +{"CACStatus", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusInst, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusObj, tWiFiDataElementsNetworkDeviceCACStatusParams, NULL, BBFDM_BOTH, NULL}, +//{"SPRule", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceSPRuleInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceSPRuleParams, NULL, BBFDM_BOTH, NULL}, +{"IEEE1905Security", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceIEEE1905SecurityInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceIEEE1905SecurityParams, NULL, BBFDM_BOTH, NULL}, +//{"AnticipatedChannels", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceAnticipatedChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceAnticipatedChannelsParams, NULL, BBFDM_BOTH, NULL}, +//{"AnticipatedChannelUsage", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceAnticipatedChannelUsageInst, NULL, NULL, tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageObj, tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageParams, NULL, BBFDM_BOTH, NULL}, {"MultiAPDevice", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceMultiAPDeviceObj, tWiFiDataElementsNetworkDeviceMultiAPDeviceParams, NULL, BBFDM_BOTH, NULL}, -{"Radio", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioObj, tWiFiDataElementsNetworkDeviceRadioParams, NULL, BBFDM_BOTH, LIST_KEY{"ID", NULL}}, +{"Radio", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioObj, tWiFiDataElementsNetworkDeviceRadioParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"ID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDevice_ID, NULL, BBFDM_BOTH}, +{"ID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDevice_ID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"MultiAPCapabilities", &DMREAD, DMT_BASE64, get_WiFiDataElementsNetworkDevice_MultiAPCapabilities, NULL, BBFDM_BOTH}, {"CollectionInterval", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDevice_CollectionInterval, NULL, BBFDM_BOTH}, {"ReportUnsuccessfulAssociations", &DMWRITE, DMT_BOOL, get_WiFiDataElementsNetworkDevice_ReportUnsuccessfulAssociations, set_WiFiDataElementsNetworkDevice_ReportUnsuccessfulAssociations, BBFDM_BOTH}, @@ -3755,7 +3746,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceParams[] = { DMLEAF tWiFiDataElementsNetworkDeviceDefault8021QParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ {"Enable", &DMWRITE, DMT_BOOL, get_WiFiDataElementsNetworkDeviceDefault8021Q_Enable, set_WiFiDataElementsNetworkDeviceDefault8021Q_Enable, BBFDM_BOTH}, -{"PrimaryVID", &DMWRITE, DMT_UNINT, get_WiFiDataElementsNetworkDeviceDefault8021Q_PrimaryVID, set_WiFiDataElementsNetworkDeviceDefault8021Q_PrimaryVID, BBFDM_BOTH}, +{"PrimaryVID", &DMWRITE, DMT_UNINT, get_WiFiDataElementsNetworkDeviceDefault8021Q_PrimaryVID, set_WiFiDataElementsNetworkDeviceDefault8021Q_PrimaryVID, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"DefaultPCP", &DMWRITE, DMT_UNINT, get_WiFiDataElementsNetworkDeviceDefault8021Q_DefaultPCP, set_WiFiDataElementsNetworkDeviceDefault8021Q_DefaultPCP, BBFDM_BOTH}, {0} }; @@ -3763,7 +3754,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceDefault8021QParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.SSIDtoVIDMapping.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceSSIDtoVIDMappingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"SSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceSSIDtoVIDMapping_SSID, NULL, BBFDM_BOTH}, +{"SSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceSSIDtoVIDMapping_SSID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"VID", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceSSIDtoVIDMapping_VID, NULL, BBFDM_BOTH}, {0} }; @@ -3771,15 +3762,15 @@ DMLEAF tWiFiDataElementsNetworkDeviceSSIDtoVIDMappingParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.CACStatus.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceCACStatusObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"CACAvailableChannel", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, -{"CACNonOccupancyChannel", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, -{"CACActiveChannel", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, +{"CACAvailableChannel", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelParams, NULL, BBFDM_BOTH, NULL}, +{"CACNonOccupancyChannel", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelParams, NULL, BBFDM_BOTH, NULL}, +{"CACActiveChannel", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceCACStatusParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"TimeStamp", &DMREAD, DMT_TIME, get_WiFiDataElementsNetworkDeviceCACStatus_TimeStamp, NULL, BBFDM_BOTH}, +{"TimeStamp", &DMREAD, DMT_TIME, get_WiFiDataElementsNetworkDeviceCACStatus_TimeStamp, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"CACAvailableChannelNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatus_CACAvailableChannelNumberOfEntries, NULL, BBFDM_BOTH}, {"CACNonOccupancyChannelNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatus_CACNonOccupancyChannelNumberOfEntries, NULL, BBFDM_BOTH}, {"CACActiveChannelNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatus_CACActiveChannelNumberOfEntries, NULL, BBFDM_BOTH}, @@ -3789,7 +3780,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.CACStatus.{i}.CACAvailableChannel.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACAvailableChannel_OpClass, NULL, BBFDM_BOTH}, +{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACAvailableChannel_OpClass, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Channel", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACAvailableChannel_Channel, NULL, BBFDM_BOTH}, {"Minutes", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACAvailableChannel_Minutes, NULL, BBFDM_BOTH}, {0} @@ -3798,7 +3789,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACAvailableChannelParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.CACStatus.{i}.CACNonOccupancyChannel.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannel_OpClass, NULL, BBFDM_BOTH}, +{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannel_OpClass, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Channel", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannel_Channel, NULL, BBFDM_BOTH}, {"Seconds", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannel_Seconds, NULL, BBFDM_BOTH}, {0} @@ -3807,7 +3798,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACNonOccupancyChannelParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.CACStatus.{i}.CACActiveChannel.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACActiveChannel_OpClass, NULL, BBFDM_BOTH}, +{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACActiveChannel_OpClass, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Channel", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACActiveChannel_Channel, NULL, BBFDM_BOTH}, {"Countdown", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceCACStatusCACActiveChannel_Countdown, NULL, BBFDM_BOTH}, {0} @@ -3826,7 +3817,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceCACStatusCACActiveChannelParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.IEEE1905Security.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceIEEE1905SecurityParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OnboardingProtocol", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceIEEE1905Security_OnboardingProtocol, NULL, BBFDM_BOTH}, +{"OnboardingProtocol", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceIEEE1905Security_OnboardingProtocol, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"IntegrityAlgorithm", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceIEEE1905Security_IntegrityAlgorithm, NULL, BBFDM_BOTH}, {"EncryptionAlgorithm", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceIEEE1905Security_EncryptionAlgorithm, NULL, BBFDM_BOTH}, {0} @@ -3843,7 +3834,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceIEEE1905SecurityParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.AnticipatedChannelUsage.{i}. *** */ //DMOBJ tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -//{"Entry", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceAnticipatedChannelUsageEntryInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageEntryParams, NULL, BBFDM_BOTH, LIST_KEY{"BurstStartTime", NULL}}, +//{"Entry", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceAnticipatedChannelUsageEntryInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceAnticipatedChannelUsageEntryParams, NULL, BBFDM_BOTH, NULL}, //{0} //}; @@ -3890,7 +3881,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceMultiAPDeviceParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.MultiAPDevice.Backhaul. *** */ DMOBJ tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -//{"CurrentOperatingClassProfile", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulCurrentOperatingClassProfileInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulCurrentOperatingClassProfileParams, NULL, BBFDM_BOTH, LIST_KEY{"Class", NULL}}, +//{"CurrentOperatingClassProfile", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulCurrentOperatingClassProfileInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulCurrentOperatingClassProfileParams, NULL, BBFDM_BOTH, NULL}, //{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceMultiAPDeviceBackhaulStatsParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -3941,18 +3932,18 @@ DMOBJ tWiFiDataElementsNetworkDeviceRadioObj[] = { {"ScanCapability", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanCapabilityObj, tWiFiDataElementsNetworkDeviceRadioScanCapabilityParams, NULL, BBFDM_BOTH, NULL}, {"CACCapability", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCACCapabilityObj, tWiFiDataElementsNetworkDeviceRadioCACCapabilityParams, NULL, BBFDM_BOTH, NULL}, {"Capabilities", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesObj, tWiFiDataElementsNetworkDeviceRadioCapabilitiesParams, NULL, BBFDM_BOTH, NULL}, -{"CurrentOperatingClassProfile", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileParams, NULL, BBFDM_BOTH, LIST_KEY{"Class", NULL}}, -//{"DisAllowedOpClassChannels", &DMWRITE, addObjWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannels, delObjWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannels, NULL, browseWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannelsParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, +{"CurrentOperatingClassProfile", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileParams, NULL, BBFDM_BOTH, NULL}, +//{"DisAllowedOpClassChannels", &DMWRITE, addObjWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannels, delObjWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannels, NULL, browseWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioDisAllowedOpClassChannelsParams, NULL, BBFDM_BOTH, NULL}, //{"SpatialReuse", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioSpatialReuseParams, NULL, BBFDM_BOTH, NULL}, -{"BSS", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSObj, tWiFiDataElementsNetworkDeviceRadioBSSParams, NULL, BBFDM_BOTH, LIST_KEY{"BSSID", NULL}}, -{"UnassociatedSTA", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioUnassociatedSTAInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioUnassociatedSTAParams, NULL, BBFDM_BOTH, LIST_KEY{"MACAddress", NULL}}, +{"BSS", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSObj, tWiFiDataElementsNetworkDeviceRadioBSSParams, NULL, BBFDM_BOTH, NULL}, +{"UnassociatedSTA", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioUnassociatedSTAInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioUnassociatedSTAParams, NULL, BBFDM_BOTH, NULL}, //{"MultiAPRadio", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioMultiAPRadioParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceRadioParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"ID", &DMREAD, DMT_BASE64, get_WiFiDataElementsNetworkDeviceRadio_ID, NULL, BBFDM_BOTH}, +{"ID", &DMREAD, DMT_BASE64, get_WiFiDataElementsNetworkDeviceRadio_ID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enabled", &DMREAD, DMT_BOOL, get_WiFiDataElementsNetworkDeviceRadio_Enabled, NULL, BBFDM_BOTH}, {"Noise", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadio_Noise, NULL, BBFDM_BOTH}, {"Utilization", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadio_Utilization, NULL, BBFDM_BOTH}, @@ -3987,7 +3978,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"OpClassScan", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanObj, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanParams, NULL, BBFDM_BOTH, LIST_KEY{"OperatingClass", NULL}}, +{"OpClassScan", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanObj, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanParams, NULL, BBFDM_BOTH}, {0} }; @@ -4001,13 +3992,13 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.{i}.OpClassScan.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"ChannelScan", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanObj, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanParams, NULL, BBFDM_BOTH, LIST_KEY{"Channel", NULL}}, +{"ChannelScan", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanObj, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OperatingClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScan_OperatingClass, NULL, BBFDM_BOTH}, +{"OperatingClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScan_OperatingClass, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ChannelScanNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScan_ChannelScanNumberOfEntries, NULL, BBFDM_BOTH}, {0} }; @@ -4015,13 +4006,13 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.{i}.OpClassScan.{i}.ChannelScan.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"NeighborBSS", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSParams, NULL, BBFDM_BOTH, LIST_KEY{"BSSID", NULL}}, +{"NeighborBSS", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSParams, NULL, BBFDM_BOTH}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Channel", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScan_Channel, NULL, BBFDM_BOTH}, +{"Channel", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScan_Channel, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"TimeStamp", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScan_TimeStamp, NULL, BBFDM_BOTH}, {"Utilization", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScan_Utilization, NULL, BBFDM_BOTH}, {"Noise", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScan_Noise, NULL, BBFDM_BOTH}, @@ -4032,7 +4023,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanParams /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.{i}.OpClassScan.{i}.ChannelScan.{i}.NeighborBSS.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSSParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"BSSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSS_BSSID, NULL, BBFDM_BOTH}, +{"BSSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSS_BSSID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"SSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSS_SSID, NULL, BBFDM_BOTH}, {"SignalStrength", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSS_SignalStrength, NULL, BBFDM_BOTH}, {"ChannelBandwidth", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioScanResultOpClassScanChannelScanNeighborBSS_ChannelBandwidth, NULL, BBFDM_BOTH}, @@ -4051,7 +4042,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioBackhaulStaParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanCapability. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioScanCapabilityObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"OpClassChannels", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, +{"OpClassChannels", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -4067,7 +4058,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanCapability.OpClassChannels.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannels_OpClass, NULL, BBFDM_BOTH}, +{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannels_OpClass, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ChannelList", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannels_ChannelList, NULL, BBFDM_BOTH}, {0} }; @@ -4075,7 +4066,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioScanCapabilityOpClassChannelsParams[] /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.CACCapability. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioCACCapabilityObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"CACMethod", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodObj, tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodParams, NULL, BBFDM_BOTH, LIST_KEY{"Method", NULL}}, +{"CACMethod", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodObj, tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -4088,13 +4079,13 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.CACCapability.CACMethod.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -{"OpClassChannels", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsParams, NULL, BBFDM_BOTH, LIST_KEY{"OpClass", NULL}}, +{"OpClassChannels", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Method", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethod_Method, NULL, BBFDM_BOTH}, +{"Method", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethod_Method, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"NumberOfSeconds", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethod_NumberOfSeconds, NULL, BBFDM_BOTH}, {"OpClassChannelsNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethod_OpClassChannelsNumberOfEntries, NULL, BBFDM_BOTH}, {0} @@ -4103,7 +4094,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.CACCapability.CACMethod.{i}.OpClassChannels.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannelsParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannels_OpClass, NULL, BBFDM_BOTH}, +{"OpClass", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannels_OpClass, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ChannelList", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioCACCapabilityCACMethodOpClassChannels_ChannelList, NULL, BBFDM_BOTH}, {0} }; @@ -4113,9 +4104,9 @@ DMOBJ tWiFiDataElementsNetworkDeviceRadioCapabilitiesObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"WiFi6APRole", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6APRoleParams, NULL, BBFDM_BOTH, NULL}, {"WiFi6bSTARole", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6bSTARoleParams, NULL, BBFDM_BOTH, NULL}, -//{"AKMFrontHaul", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMFrontHaulInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMFrontHaulParams, NULL, BBFDM_BOTH, LIST_KEY{"OUI", NULL}}, -//{"AKMBackhaul", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMBackhaulInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMBackhaulParams, NULL, BBFDM_BOTH, LIST_KEY{"OUI", NULL}}, -{"CapableOperatingClassProfile", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileParams, NULL, BBFDM_BOTH, LIST_KEY{"Class", NULL}}, +//{"AKMFrontHaul", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMFrontHaulInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMFrontHaulParams, NULL, BBFDM_BOTH, NULL}, +//{"AKMBackhaul", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMBackhaulInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesAKMBackhaulParams, NULL, BBFDM_BOTH, NULL}, +{"CapableOperatingClassProfile", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -4205,7 +4196,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesWiFi6bSTARoleParams[] = { /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.Capabilities.CapableOperatingClassProfile.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfileParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Class", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfile_Class, NULL, BBFDM_BOTH}, +{"Class", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfile_Class, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"MaxTxPower", &DMREAD, DMT_INT, get_WiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfile_MaxTxPower, NULL, BBFDM_BOTH}, {"NonOperable", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfile_NonOperable, NULL, BBFDM_BOTH}, {"NumberOfNonOperChan", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfile_NumberOfNonOperChan, NULL, BBFDM_BOTH}, @@ -4215,7 +4206,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioCapabilitiesCapableOperatingClassProfi /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.CurrentOperatingClassProfile.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Class", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfile_Class, NULL, BBFDM_BOTH}, +{"Class", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfile_Class, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Channel", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfile_Channel, NULL, BBFDM_BOTH}, {"TxPower", &DMREAD, DMT_INT, get_WiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfile_TxPower, NULL, BBFDM_BOTH}, // {"TransmitPowerLimit", &DMREAD, DMT_INT, get_WiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfile_TransmitPowerLimit, NULL, BBFDM_BOTH}, @@ -4253,15 +4244,15 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioCurrentOperatingClassProfileParams[] = /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.BSS.{i}. *** */ DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ -// {"QMDescriptor", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSQMDescriptorInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSQMDescriptorParams, NULL, BBFDM_BOTH, LIST_KEY{"ClientMAC", NULL}}, +// {"QMDescriptor", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSQMDescriptorInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSQMDescriptorParams, NULL, BBFDM_BOTH, NULL}, {"MultiAPSteering", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSMultiAPSteeringParams, NULL, BBFDM_BOTH, NULL}, -{"STA", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSSTAInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAObj, tWiFiDataElementsNetworkDeviceRadioBSSSTAParams, get_linker_wfdata_BSS_STA, BBFDM_BOTH, LIST_KEY{"MACAddress", NULL}}, +{"STA", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSSTAInst, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAObj, tWiFiDataElementsNetworkDeviceRadioBSSSTAParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"BSSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioBSS_BSSID, NULL, BBFDM_BOTH}, +{"BSSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioBSS_BSSID, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"SSID", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioBSS_SSID, NULL, BBFDM_BOTH}, {"Enabled", &DMREAD, DMT_BOOL, get_WiFiDataElementsNetworkDeviceRadioBSS_Enabled, NULL, BBFDM_BOTH}, {"LastChange", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioBSS_LastChange, NULL, BBFDM_BOTH}, @@ -4316,13 +4307,13 @@ DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSSTAObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"MultiAPSTA", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAObj, tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAParams, NULL, BBFDM_BOTH, NULL}, //{"WiFi6Capabilities", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAWiFi6CapabilitiesParams, NULL, BBFDM_BOTH, NULL}, -//{"TIDQueueSizes", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSSTATIDQueueSizesInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTATIDQueueSizesParams, NULL, BBFDM_BOTH, LIST_KEY{"TID", NULL}}, +//{"TIDQueueSizes", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSSTATIDQueueSizesInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTATIDQueueSizesParams, NULL, BBFDM_BOTH, NULL}, {0} }; DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"MACAddress", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioBSSSTA_MACAddress, NULL, BBFDM_BOTH}, +{"MACAddress", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioBSSSTA_MACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"TimeStamp", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioBSSSTA_TimeStamp, NULL, BBFDM_BOTH}, {"HTCapabilities", &DMREAD, DMT_BASE64, get_WiFiDataElementsNetworkDeviceRadioBSSSTA_HTCapabilities, NULL, BBFDM_BOTH}, {"VHTCapabilities", &DMREAD, DMT_BASE64, get_WiFiDataElementsNetworkDeviceRadioBSSSTA_VHTCapabilities, NULL, BBFDM_BOTH}, @@ -4358,7 +4349,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAParams[] = { DMOBJ tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTAObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys, version*/ {"SteeringSummaryStats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringSummaryStatsParams, NULL, BBFDM_BOTH, NULL}, -//{"SteeringHistory", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringHistoryInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringHistoryParams, NULL, BBFDM_BOTH, LIST_KEY{"Time", "APOrigin", "APDestination", NULL}}, +//{"SteeringHistory", &DMREAD, NULL, NULL, NULL, browseWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringHistoryInst, NULL, NULL, NULL, tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringHistoryParams, NULL, BBFDM_BOTH, NULL}, {0} }; @@ -4438,7 +4429,7 @@ DMLEAF tWiFiDataElementsNetworkDeviceRadioBSSSTAMultiAPSTASteeringSummaryStatsPa /* *** Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.UnassociatedSTA.{i}. *** */ DMLEAF tWiFiDataElementsNetworkDeviceRadioUnassociatedSTAParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"MACAddress", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioUnassociatedSTA_MACAddress, NULL, BBFDM_BOTH}, +{"MACAddress", &DMREAD, DMT_STRING, get_WiFiDataElementsNetworkDeviceRadioUnassociatedSTA_MACAddress, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"SignalStrength", &DMREAD, DMT_UNINT, get_WiFiDataElementsNetworkDeviceRadioUnassociatedSTA_SignalStrength, NULL, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/tr471/iplayercap.c b/libbbfdm/dmtree/tr471/iplayercap.c index e81f4f84..8bb36d8e 100644 --- a/libbbfdm/dmtree/tr471/iplayercap.c +++ b/libbbfdm/dmtree/tr471/iplayercap.c @@ -98,26 +98,29 @@ int get_IPDiagnosticsIPLayerCapacity_SupportedMetrics(char *refparam, struct dmc static int get_IPDiagnosticsIPLayerCapacity_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *linker = get_diagnostics_option("iplayercapacity", "interface"); - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", linker, value); return 0; } static int set_IPDiagnosticsIPLayerCapacity_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; return 0; case VALUESET: reset_diagnostic_state("iplayercapacity"); - set_diagnostics_interface_option(ctx, "iplayercapacity", value); + set_diagnostics_option("iplayercapacity", "interface", reference.value); return 0; } return 0; diff --git a/libbbfdm/dmtree/vendor/iopsys/tr181/ethernet.c b/libbbfdm/dmtree/vendor/iopsys/tr181/ethernet.c index 6e953a21..75ead318 100644 --- a/libbbfdm/dmtree/vendor/iopsys/tr181/ethernet.c +++ b/libbbfdm/dmtree/vendor/iopsys/tr181/ethernet.c @@ -143,25 +143,29 @@ static int get_EthernetMACVLAN_Name(char *refparam, struct dmctx *ctx, void *dat static int get_EthernetMACVLAN_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char *linker = NULL; - dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", value); if ((*value)[0] == '\0') { + char *linker = NULL; + dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "ifname", &linker); if (!linker || *linker == '\0') return 0; - adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", linker, value); - if (*value != NULL && (*value)[0] != 0) - return 0; + adm_entry_get_reference_param(ctx, "Device.Ethernet.VLANTermination.*.Name", linker, value); + if (DM_STRLEN(*value)) + goto end; - adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", linker, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Link.*.Name", linker, value); + +end: + // Store LowerLayers value + dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", *value); } else { - adm_entry_get_linker_value(ctx, *value, &linker); - if (!linker || *linker == 0) + if (!adm_entry_object_exists(ctx, *value)) *value = ""; } + return 0; } @@ -171,34 +175,34 @@ static int set_EthernetMACVLAN_LowerLayers(char *refparam, struct dmctx *ctx, vo "Device.Ethernet.VLANTermination.", "Device.Ethernet.Link.", NULL}; - char *linker = NULL; + struct dm_reference reference = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: - adm_entry_get_linker_value(ctx, value, &linker); - // Store LowerLayers value under dmmap section - dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", value); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, "LowerLayers", reference.path); - if (DM_STRLEN(linker)) { + if (DM_STRLEN(reference.value)) { char name[16] = {0}; - dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", linker); + dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", reference.value); - if (DM_STRNCMP(value, allowed_objects[0], strlen(allowed_objects[0])) == 0) { - char *vid = DM_STRRCHR(linker, '.'); + if (DM_STRNCMP(reference.path, allowed_objects[0], strlen(allowed_objects[0])) == 0) { + char *vid = DM_STRRCHR(reference.value, '.'); if (vid) *vid = 0; } - snprintf(name, sizeof(name), "%s_%s", linker, instance); + snprintf(name, sizeof(name), "%s_%s", reference.value, instance); dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "name", name); } else { @@ -297,8 +301,8 @@ DMLEAF tEthernetMACVLANParams[] = { {"Enable", &DMWRITE, DMT_BOOL, get_EthernetMACVLAN_Enable, set_EthernetMACVLAN_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_EthernetMACVLAN_Status, NULL, BBFDM_BOTH}, {"Alias", &DMWRITE, DMT_STRING, get_EthernetMACVLAN_Alias, set_EthernetMACVLAN_Alias, BBFDM_BOTH}, -{"Name", &DMREAD, DMT_STRING, get_EthernetMACVLAN_Name, NULL, BBFDM_BOTH}, -{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetMACVLAN_LowerLayers, set_EthernetMACVLAN_LowerLayers, BBFDM_BOTH}, +{"Name", &DMREAD, DMT_STRING, get_EthernetMACVLAN_Name, NULL, BBFDM_BOTH, DM_FLAG_LINKER}, +{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetMACVLAN_LowerLayers, set_EthernetMACVLAN_LowerLayers, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"MACAddress", &DMWRITE, DMT_STRING, get_EthernetMACVLAN_MACAddress, set_EthernetMACVLAN_MACAddress, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/vendor/iopsys/tr181/times.c b/libbbfdm/dmtree/vendor/iopsys/tr181/times.c index fae6d76d..6583356b 100644 --- a/libbbfdm/dmtree/vendor/iopsys/tr181/times.c +++ b/libbbfdm/dmtree/vendor/iopsys/tr181/times.c @@ -24,8 +24,8 @@ static int get_time_source_interface(char *refparam, struct dmctx *ctx, void *da char *iface = NULL; dmuci_get_option_value_string("system", "ntp", "interface", &iface); - - return bbf_get_reference_param("Device.IP.Interface.", "Name", iface, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", iface, value); + return 0; } static int set_time_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) @@ -37,7 +37,7 @@ static int set_time_source_interface(char *refparam, struct dmctx *ctx, void *da switch (action) { case VALUECHECK: - if (dm_entry_validate_allowed_objects(ctx, reference.path, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: diff --git a/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.c b/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.c index f643809a..576099c7 100644 --- a/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.c +++ b/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.c @@ -237,19 +237,17 @@ static int get_br_key_from_lower_layer(char *lower_layer, char *key, size_t s_ke return 0; } -int get_mcast_snooping_interface_val(struct dmctx *ctx, char *value, char *ifname, size_t s_ifname) +int get_mcast_snooping_interface_val(struct dm_reference *reference_args, char *ifname, size_t s_ifname) { /* Check if the value is valid or not. */ - if (DM_LSTRNCMP(value, "Device.Bridging.Bridge.", 23) != 0) + if (DM_LSTRNCMP(reference_args->path, "Device.Bridging.Bridge.", 23) != 0) return -1; char key[10] = {0}; - if (get_br_key_from_lower_layer(value, key, sizeof(key)) != 0) + if (get_br_key_from_lower_layer(reference_args->path, key, sizeof(key)) != 0) return -1; - char *linker = NULL; - adm_entry_get_linker_value(ctx, value, &linker); - snprintf(ifname, s_ifname, "%s", linker); + snprintf(ifname, s_ifname, "%s", reference_args->value); return 0; } @@ -921,7 +919,7 @@ int set_mcast_snooping_aggregation(char *refparam, struct dmctx *ctx, void *data int get_mcast_snooping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - char val[16] = {0}, sec_name[16] = {0}; // taking 16 here is same as that is size of linux names usually supported + char val[16] = {0}; // taking 16 here is same as that is size of linux names usually supported char *val1; dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &val1); @@ -938,24 +936,26 @@ int get_mcast_snooping_interface(char *refparam, struct dmctx *ctx, void *data, if (DM_LSTRCMP(tok, "br") != 0) return 0; - DM_STRNCPY(sec_name, end, sizeof(sec_name)); // In the dmmap_bridge file, the details related to the instance id etc. associated with this bridge // is stored, we now switch our focus to it to extract the necessary information. - adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", val1, value); + adm_entry_get_reference_param(ctx, "Device.Bridging.Bridge.*.Port.*.Name", val1, value); return 0; } int set_mcast_snooping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char ifname[16]; + struct dm_reference reference = {0}; + char ifname[16] = {0}; + + bbf_get_reference_args(value, &reference); switch (action) { case VALUECHECK: - if (bbfdm_validate_string_list(ctx, value, -1, -1, 1024, -1, -1, NULL, NULL)) + if (bbfdm_validate_string_list(ctx, reference.path, -1, -1, 1024, -1, -1, NULL, NULL)) return FAULT_9007; break; case VALUESET: - if (get_mcast_snooping_interface_val(ctx, value, ifname, sizeof(ifname)) != 0) + if (get_mcast_snooping_interface_val(&reference, ifname, sizeof(ifname)) != 0) return -1; dmuci_set_value_by_section((struct uci_section *)data, "interface", ifname); @@ -1315,7 +1315,7 @@ static int get_igmp_cgrp_assoc_dev_no_of_entries(char *refparam, struct dmctx *c static int get_igmp_cgrp_adev_iface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { char *ifname = dmjson_get_value((json_object *)data, 1, "device"); - adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", ifname, value); + adm_entry_get_reference_param(ctx, "Device.Ethernet.Interface.*.Name", ifname, value); return 0; } @@ -1323,7 +1323,8 @@ static int get_igmp_cgrp_adev_host(char *refparam, struct dmctx *ctx, void *data { char *ipaddr = dmjson_get_value((json_object *)data, 1, "ipaddr"); char *linker = get_host_linker(ipaddr); - adm_entry_get_linker_param(ctx, "Device.Hosts.Host.", linker, value); + + adm_entry_get_reference_param(ctx, "Device.Hosts.Host.*.PhysAddress", linker, value); return 0; } @@ -1695,37 +1696,40 @@ static void set_igmpp_iface_val(void *data, char *instance, char *linker, char * static int set_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL, *interface_linker = NULL; + struct dm_reference reference = {0}; + char *interface_linker = NULL; char ifname[16] = {0}; char *if_type = NULL; struct uci_section *s = NULL; bool is_br = false; + + bbf_get_reference_args(value, &reference); + switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: // First check if this is a bridge type interface - if (get_mcast_snooping_interface_val(ctx, value, ifname, sizeof(ifname)) == 0) { + if (get_mcast_snooping_interface_val(&reference, ifname, sizeof(ifname)) == 0) { interface_linker = dmstrdup(ifname); is_br = true; } else { - adm_entry_get_linker_value(ctx, value, &linker); - if (linker && *linker) { + if (DM_STRLEN(reference.value)) { uci_foreach_sections("network", "interface", s) { - if (strcmp(section_name(s), linker) != 0) + if (strcmp(section_name(s), reference.value) != 0) continue; dmuci_get_value_by_section_string(s, "type", &if_type); if (if_type && DM_LSTRCMP(if_type, "bridge") == 0) { - dmasprintf(&interface_linker, "br-%s", linker); + dmasprintf(&interface_linker, "br-%s", reference.value); is_br = true; } else { dmuci_get_value_by_section_string(s, "device", &interface_linker); @@ -1737,7 +1741,7 @@ static int set_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *da } } - set_igmpp_iface_val(data, instance, linker, interface_linker, is_br); + set_igmpp_iface_val(data, instance, reference.value, interface_linker, is_br); break; } @@ -1787,10 +1791,10 @@ static int get_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *da dmuci_get_value_by_section_string(interface_s, "proto", &proto); if (proto && proto[0] != '\0') { // It is a L3 bridge, get the linker accordingly - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", sec_name, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", sec_name, value); } else { // It is a L2 bridge, get the linker accordingly - adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", igmpp_ifname, value); + adm_entry_get_reference_param(ctx, "Device.Bridging.Bridge.*.Port.*.Name", igmpp_ifname, value); } break; } @@ -1798,7 +1802,7 @@ static int get_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *da // in case its a L3 interface, the ifname would be section name of network file in the dmmap file, // which infact is the linker, just use that directly. - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", igmpp_ifname, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", igmpp_ifname, value); } end: @@ -1984,8 +1988,8 @@ DMLEAF IGMPSnoopingFilterParams[] = { }; DMLEAF IGMPSnoopingClientGroupAssociatedDeviceParams[] = { -{"Interface", &DMREAD, DMT_STRING, get_igmp_cgrp_adev_iface, NULL, BBFDM_BOTH}, -{"Host", &DMREAD, DMT_STRING, get_igmp_cgrp_adev_host, NULL, BBFDM_BOTH}, +{"Interface", &DMREAD, DMT_STRING, get_igmp_cgrp_adev_iface, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"Host", &DMREAD, DMT_STRING, get_igmp_cgrp_adev_host, NULL, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Timeout", &DMREAD, DMT_UNINT, get_igmp_cgrp_adev_timeout, NULL, BBFDM_BOTH}, {0} }; @@ -2005,7 +2009,7 @@ DMLEAF X_IOPSYS_EU_IGMPSnoopingParams[] = { {"Version", &DMWRITE, DMT_STRING, get_igmp_version, set_igmp_version, BBFDM_BOTH}, {"Robustness", &DMWRITE, DMT_UNINT, get_mcast_snooping_robustness, set_mcast_snooping_robustness, BBFDM_BOTH}, {"Aggregation", &DMWRITE, DMT_BOOL, get_mcast_snooping_aggregation, set_mcast_snooping_aggregation, BBFDM_BOTH}, -{"Interface", &DMWRITE, DMT_STRING, get_mcast_snooping_interface, set_mcast_snooping_interface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_mcast_snooping_interface, set_mcast_snooping_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Mode", &DMWRITE, DMT_STRING, get_mcast_snooping_mode, set_mcast_snooping_mode, BBFDM_BOTH}, {"LastMemberQueryInterval", &DMWRITE, DMT_UNINT, get_mcasts_last_mq_interval, set_mcasts_last_mq_interval, BBFDM_BOTH}, {"ImmediateLeave", &DMWRITE, DMT_BOOL, get_mcasts_fast_leave, set_mcasts_fast_leave, BBFDM_BOTH}, @@ -2057,7 +2061,7 @@ DMLEAF IGMPProxyClientGroupStatsParams[] = { }; DMLEAF IGMPProxyInterfaceParams[] = { -{"Interface", &DMWRITE, DMT_STRING, get_igmpp_interface_iface, set_igmpp_interface_iface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_igmpp_interface_iface, set_igmpp_interface_iface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Upstream", &DMWRITE, DMT_BOOL, get_mcastp_interface_upstream, set_igmpp_interface_upstream, BBFDM_BOTH}, {"SnoopingMode", &DMWRITE, DMT_STRING, get_mcastp_iface_snoop_mode, set_mcastp_iface_snoop_mode, BBFDM_BOTH}, {0} diff --git a/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.h b/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.h index 7473a151..1f74faf2 100644 --- a/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.h +++ b/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_igmp.h @@ -81,7 +81,7 @@ int get_mcasts_filter_no_of_entries(char *refparam, struct dmctx *ctx, void *dat int del_mcasts_filter_obj(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action); void update_snooping_mode(struct uci_section *s); -int get_mcast_snooping_interface_val(struct dmctx *ctx, char *value, char *ifname, size_t s_ifname); +int get_mcast_snooping_interface_val(struct dm_reference *reference_args, char *ifname, size_t s_ifname); int del_proxy_obj(void *data, char *proto, unsigned char del_action); void del_dmmap_sec_with_opt_eq(char *dmmap_file, char *section, char *option, char *value); void sync_dmmap_bool_to_uci_list(struct uci_section *s, char *section, char *value, bool b); diff --git a/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_mld.c b/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_mld.c index fe7d9118..b6dba18f 100644 --- a/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_mld.c +++ b/libbbfdm/dmtree/vendor/iopsys/tr181/x_iopsys_eu_mld.c @@ -436,35 +436,37 @@ static int get_mldp_cgrp_stats_lrcvd(char *refparam, struct dmctx *ctx, void *da static int set_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { char *allowed_objects[] = {"Device.IP.Interface.", NULL}; - char *linker = NULL, *interface_linker = NULL; + struct dm_reference reference = {0}; + char *interface_linker = NULL; char ifname[16]; char *up, *f_inst, *if_type; struct uci_section *d_sec = NULL, *s = NULL; bool b; + bbf_get_reference_args(value, &reference); + switch (action) { case VALUECHECK: - if (bbfdm_validate_string(ctx, value, -1, 256, NULL, NULL)) + if (bbfdm_validate_string(ctx, reference.path, -1, 256, NULL, NULL)) return FAULT_9007; - if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects)) + if (dm_validate_allowed_objects(ctx, &reference, allowed_objects)) return FAULT_9007; break; case VALUESET: // First check if this is a bridge type interface - if (get_mcast_snooping_interface_val(ctx, value, ifname, sizeof(ifname)) == 0) { + if (get_mcast_snooping_interface_val(&reference, ifname, sizeof(ifname)) == 0) { interface_linker = dmstrdup(ifname); } else { - adm_entry_get_linker_value(ctx, value, &linker); - if (linker && *linker) { + if (DM_STRLEN(reference.value)) { uci_foreach_sections("network", "interface", s) { - if(strcmp(section_name(s), linker) != 0) { + if(strcmp(section_name(s), reference.value) != 0) { continue; } dmuci_get_value_by_section_string(s, "type", &if_type); if (DM_LSTRCMP(if_type, "bridge") == 0) - dmasprintf(&interface_linker, "br-%s", linker); + dmasprintf(&interface_linker, "br-%s", reference.value); else dmuci_get_value_by_section_string(s, "device", &interface_linker); break; @@ -539,10 +541,10 @@ static int get_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *dat dmuci_get_value_by_section_string(intf_s, "proto", &proto); if (proto && proto[0] != '\0') { // It is a L3 bridge, get the linker accordingly - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", sec_name, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", sec_name, value); } else { // It is a L2 bridge, get the linker accordingly - adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", mldp_ifname, value); + adm_entry_get_reference_param(ctx, "Device.Bridging.Bridge.*.Port.*.Name", mldp_ifname, value); } break; } @@ -558,7 +560,7 @@ static int get_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *dat } } - adm_entry_get_linker_param(ctx, "Device.IP.Interface.", tmp_linker, value); + adm_entry_get_reference_param(ctx, "Device.IP.Interface.*.Name", tmp_linker, value); } end: @@ -709,7 +711,7 @@ DMLEAF MLDProxyClientGroupStatsParams[] = { }; DMLEAF MLDProxyInterfaceParams[] = { -{"Interface", &DMWRITE, DMT_STRING, get_mldp_interface_iface, set_mldp_interface_iface, BBFDM_BOTH}, +{"Interface", &DMWRITE, DMT_STRING, get_mldp_interface_iface, set_mldp_interface_iface, BBFDM_BOTH, DM_FLAG_REFERENCE}, {"Upstream", &DMWRITE, DMT_BOOL, get_mcastp_interface_upstream, set_mldp_interface_upstream, BBFDM_BOTH}, {"SnoopingMode", &DMWRITE, DMT_STRING, get_mcastp_iface_snoop_mode, set_mcastp_iface_snoop_mode, BBFDM_BOTH}, {0}