obuspa: Get data model schema present in DUT

- Obuspa required to register the schema present in DUT, in the
 current methods, for multi-instance objects the instance is only
 visible if at-least one object/instance present, this leads to
 anomaly in obuspa, when some objects getting created in run-time.
 e.g: Device.WiFi.AccessPoint.1.AssociatedDevice.
 - This change will dump the complete schema irrespective of that node/object
 availability.
This commit is contained in:
vdutta 2020-07-07 16:03:54 +05:30 committed by Vivek Kumar Dutta
parent f3c9ed9efd
commit bfd4f7bae5
4 changed files with 137 additions and 1 deletions

View file

@ -295,6 +295,11 @@ int dm_entry_param_method(struct dmctx *ctx, int cmd, char *inparam, char *arg1,
ctx->in_value = arg1 ? arg1 : "";
operate_list_cmds(ctx);
break;
case CMD_GET_SCHEMA:
ctx->in_value = arg1 ? arg1 : "";
fault = dm_entry_get_schema(ctx);
break;
#ifdef BBF_TR064
case CMD_UPNP_GET_SUPPORTED_PARAMETERS:
ctx->depth = atoi(arg1);

View file

@ -1079,7 +1079,10 @@ static int set_RoutingRouterIPv6Forwarding_Alias(char *refparam, struct dmctx *c
static char *get_routing_perm(char *refparam, struct dmctx *dmctx, void *data, char *instance)
{
return ((struct routingfwdargs *)data)->permission;
if (data != NULL)
return ((struct routingfwdargs *)data)->permission;
return NULL;
}
struct dm_permession_s DMRouting = {"0", &get_routing_perm};

View file

@ -47,6 +47,8 @@ static int mparam_set_notification_in_obj(DMPARAM_ARGS);
static int mobj_set_notification_in_param(DMOBJECT_ARGS);
static int mparam_set_notification_in_param(DMPARAM_ARGS);
static int mobj_set_notification_in_obj(DMOBJECT_ARGS);
static int dm_browse_schema(struct dmctx *dmctx, DMNODE *parent_node,
DMOBJ *entryobj, void *data, char *instance);
#ifdef BBF_TR064
static int mparam_upnp_get_instances(DMPARAM_ARGS);
static int mobj_upnp_get_instances(DMOBJECT_ARGS);
@ -1222,6 +1224,130 @@ int dm_entry_get_name(struct dmctx *ctx)
return err;
}
static void dm_browse_schema_entry(struct dmctx *dmctx, DMNODE *parent_node,
DMOBJ *entryobj, void *data, char *instance,
char *parent_obj, int *err)
{
DMNODE node = {0};
node.obj = entryobj;
node.parent = parent_node;
node.instance_level = parent_node->instance_level;
node.matched = parent_node->matched;
if (!bbfdatamodel_matches(entryobj->bbfdm_type))
return;
if (entryobj->browseinstobj) {
dmasprintf(&(node.current_object), "%s%s%c{i}%c", parent_obj, entryobj->obj, dm_delim, dm_delim);
if (dmctx->method_obj) {
*err = dmctx->method_obj(dmctx, &node, entryobj->permission,
entryobj->addobj, entryobj->delobj,
entryobj->forced_inform,
entryobj->notification,
entryobj->get_linker,
data, instance);
}
} else {
dmasprintf(&(node.current_object), "%s%s%c", parent_obj, entryobj->obj, dm_delim);
}
if (entryobj->leaf) {
*err = dm_browse_leaf(dmctx, &node, entryobj->leaf, data, instance);
}
if (entryobj->nextobj || entryobj->nextdynamicobj) {
*err = dm_browse_schema(dmctx, &node, entryobj->nextobj, data, instance);
}
}
static int dm_browse_schema(struct dmctx *dmctx, DMNODE *parent_node,
DMOBJ *entryobj, void *data, char *instance)
{
DMOBJ *jentryobj;
struct dm_dynamic_obj *next_dyn_array;
int i, j, err = 0;
char *parent_obj = parent_node->current_object;
if (entryobj) {
for (; entryobj->obj; entryobj++) {
dm_browse_schema_entry(dmctx, parent_node, entryobj, data, instance, parent_obj, &err);
if (dmctx->stop)
return err;
}
}
if (parent_node->obj) {
if (parent_node->obj->nextdynamicobj) {
for (i = 0; i < __INDX_DYNAMIC_MAX; i++) {
next_dyn_array = parent_node->obj->nextdynamicobj + i;
if (next_dyn_array->nextobj) {
for (j = 0; next_dyn_array->nextobj[j]; j++) {
jentryobj = next_dyn_array->nextobj[j];
for (; (jentryobj && jentryobj->obj); jentryobj++) {
dm_browse_schema_entry(dmctx, parent_node, jentryobj, data, instance, parent_obj, &err);
if (dmctx->stop)
return err;
}
}
}
}
}
}
return 0;
}
// get schema
static int mobj_get_schema_name(DMOBJECT_ARGS)
{
char *refparam;
char *perm = permission->val;
refparam = node->current_object;
if (permission->get_permission != NULL)
perm = permission->get_permission(refparam, dmctx, data, instance);
add_list_paramameter(dmctx, refparam, perm, "xsd:object", NULL, 0);
return 0;
}
static int mparam_get_schema_name(DMPARAM_ARGS)
{
char *refparam;
char *perm = permission->val;
dmastrcat(&refparam, node->current_object, lastname);
if (permission->get_permission != NULL)
perm = permission->get_permission(refparam, dmctx, data, instance);
add_list_paramameter(dmctx, refparam, perm, DMT_TYPE[type], NULL, 0);
return 0;
}
int dm_entry_get_schema(struct dmctx *ctx)
{
DMOBJ *root = ctx->dm_entryobj;
DMNODE node = {.current_object = ""};
unsigned char findparam_check = 0;
int err;
ctx->inparam_isparam = 0;
ctx->findparam = 0;
ctx->stop = 0;
ctx->checkobj = NULL;
ctx->checkleaf = NULL;
ctx->method_obj = mobj_get_schema_name;
ctx->method_param = mparam_get_schema_name;
err = dm_browse_schema(ctx, &node, root, NULL, NULL);
if (findparam_check && ctx->findparam)
return 0;
else
return err;
}
static int mparam_get_name(DMPARAM_ARGS)
{
char *refparam;

View file

@ -335,6 +335,7 @@ enum {
CMD_INFORM,
CMD_USP_OPERATE,
CMD_USP_LIST_OPERATE,
CMD_GET_SCHEMA,
#ifdef BBF_TR064
CMD_UPNP_GET_SUPPORTED_PARAMETERS,
CMD_UPNP_GET_INSTANCES,
@ -555,6 +556,7 @@ int string_to_bool(char *v, bool *b);
void dmentry_instance_lookup_inparam(struct dmctx *ctx);
int dm_entry_get_value(struct dmctx *ctx);
int dm_entry_get_name(struct dmctx *ctx);
int dm_entry_get_schema(struct dmctx *ctx);
int dm_entry_get_notification(struct dmctx *ctx);
int dm_entry_inform(struct dmctx *ctx);
int dm_entry_add_object(struct dmctx *ctx);