Removed external direct access to the yang_stmt struct.

This commit is contained in:
Olof hagsand 2019-04-24 15:13:19 +02:00
parent cef0dc5a22
commit 65c809b1c3
17 changed files with 85 additions and 120 deletions

View file

@ -52,6 +52,7 @@
* Change all y->ys_argument to yang_argument_get(y) * Change all y->ys_argument to yang_argument_get(y)
* Change all y->ys_cv to yang_cv_get(y) * Change all y->ys_cv to yang_cv_get(y)
* Change all y->ys_cvec to yang_cvec_get(y) * Change all y->ys_cvec to yang_cvec_get(y)
* Removed external direct access to the yang_stmt struct.
* xmldb_get() removed unnecessary config option: * xmldb_get() removed unnecessary config option:
* Change all calls to dbget from: `xmldb_get(h, db, xpath, 0|1, &xret, msd)` to `xmldb_get(h, db, xpath, &xret, msd)` * Change all calls to dbget from: `xmldb_get(h, db, xpath, 0|1, &xret, msd)` to `xmldb_get(h, db, xpath, &xret, msd)`

View file

@ -38,6 +38,9 @@
#ifndef _CLIXON_XML_MAP_H_ #ifndef _CLIXON_XML_MAP_H_
#define _CLIXON_XML_MAP_H_ #define _CLIXON_XML_MAP_H_
/* declared in clixon_yang_internal */
typedef enum yang_class yang_class;
/* /*
* Prototypes * Prototypes
*/ */

View file

@ -40,16 +40,10 @@
#define _CLIXON_YANG_H_ #define _CLIXON_YANG_H_
/*
* Actually cligen variable stuff XXX
*/
#define V_UNIQUE 0x01 /* Variable flag */
#define V_UNSET 0x08 /* Variable is unset, ie no default */
/* /*
* Types * Types
*/ */
struct xml;
/*! YANG keywords from RFC6020. /*! YANG keywords from RFC6020.
* See also keywords generated by yacc/bison in clicon_yang_parse.tab.h, but they start with K_ * See also keywords generated by yacc/bison in clicon_yang_parse.tab.h, but they start with K_
* instead of Y_ * instead of Y_
@ -142,85 +136,20 @@ enum yang_class{
}; };
typedef enum yang_class yang_class; typedef enum yang_class yang_class;
#define YANG_FLAG_MARK 0x01 /* Marker for dynamic algorithms, eg expand */ struct xml;
/* Yang data node /* Yang data node
* See RFC7950 Sec 3: * See RFC7950 Sec 3:
* o data node: A node in the schema tree that can be instantiated in a * o data node: A node in the schema tree that can be instantiated in a
* data tree. One of container, leaf, leaf-list, list, anydata, and * data tree. One of container, leaf, leaf-list, list, anydata, and
* anyxml. * anyxml.
* XXX move to function
*/ */
#define yang_datanode(y) ((y)->ys_keyword == Y_CONTAINER || (y)->ys_keyword == Y_LEAF || (y)->ys_keyword == Y_LIST || (y)->ys_keyword == Y_LEAF_LIST || (y)->ys_keyword == Y_ANYXML || (y)->ys_keyword == Y_ANYDATA) #define yang_datanode(y) ((y)->ys_keyword == Y_CONTAINER || (y)->ys_keyword == Y_LEAF || (y)->ys_keyword == Y_LIST || (y)->ys_keyword == Y_LEAF_LIST || (y)->ys_keyword == Y_ANYXML || (y)->ys_keyword == Y_ANYDATA)
/* Yang data definition statement
* See RFC 7950 Sec 3:
* o data definition statement: A statement that defines new data
* nodes. One of "container", "leaf", "leaf-list", "list", "choice",
* "case", "augment", "uses", "anydata", and "anyxml".
*/
#define yang_datadefinition(y) (yang_datanode(y) || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_AUGMENT || (y)->ys_keyword == Y_USES)
/* Yang schema node .
* See RFC 7950 Sec 3:
* o schema node: A node in the schema tree. One of action, container,
* leaf, leaf-list, list, choice, case, rpc, input, output,
* notification, anydata, and anyxml.
*/
#define yang_schemanode(y) (yang_datanode(y) || (y)->ys_keyword == Y_RPC || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_INPUT || (y)->ys_keyword == Y_OUTPUT || (y)->ys_keyword == Y_NOTIFICATION)
typedef struct yang_stmt yang_stmt; /* Defined in clixon_yang_internal */ typedef struct yang_stmt yang_stmt; /* Defined in clixon_yang_internal */
/*! Yang type cache. Yang type statements can cache all typedef info here
* @note unions not cached
*/
struct yang_type_cache{
int yc_options; /* See YANG_OPTIONS_* that determines pattern/
fraction fields. */
cvec *yc_cvv; /* Range and length restriction. (if YANG_OPTION_
LENGTH|RANGE. Can be a vector if multiple
ranges*/
char *yc_pattern; /* regex (posix) (if YANG_OPTIONS_PATTERN) */
uint8_t yc_fraction; /* Fraction digits for decimal64 (if
YANG_OPTIONS_FRACTION_DIGITS */
yang_stmt *yc_resolved; /* Resolved type object, can be NULL - note direct ptr */
};
typedef struct yang_type_cache yang_type_cache;
/*! yang statement
*/
struct yang_stmt{
int ys_len; /* Number of children */
struct yang_stmt **ys_stmt; /* Vector of children statement pointers */
struct yang_stmt *ys_parent; /* Backpointer to parent: yang-stmt or yang-spec */
enum rfc_6020 ys_keyword; /* See clicon_yang_parse.tab.h */
char *ys_argument; /* String / argument depending on keyword */
int ys_flags; /* Flags according to YANG_FLAG_* above */
yang_stmt *ys_module; /* Shortcut to "my" module. Augmented
nodes can belong to other
modules than the ancestor module */
char *ys_extra; /* For unknown */
cg_var *ys_cv; /* cligen variable. See ys_populate()
Following stmts have cv:s:
leaf: for default value
leaf-list,
config: boolean true or false
mandatory: boolean true or false
fraction-digits for fraction-digits
unknown-stmt (argument)
*/
cvec *ys_cvec; /* List of stmt-specific variables
Y_RANGE: range_min, range_max
Y_LIST: vector of keys
Y_TYPE & identity: store all derived types
*/
yang_type_cache *ys_typecache; /* If ys_keyword==Y_TYPE, cache all typedef data except unions */
int _ys_vector_i; /* internal use: yn_each */
};
typedef int (yang_applyfn_t)(yang_stmt *ys, void *arg); typedef int (yang_applyfn_t)(yang_stmt *ys, void *arg);
/* /*

View file

@ -49,7 +49,8 @@
/* /*
* Types * Types
*/ */
/* declared in clixon_yang_internal */
typedef struct yang_type_cache yang_type_cache;
/* /*
* Prototypes * Prototypes

View file

@ -70,11 +70,11 @@
#include "clixon_data.h" #include "clixon_data.h"
#include "clixon_xpath_ctx.h" #include "clixon_xpath_ctx.h"
#include "clixon_xpath.h" #include "clixon_xpath.h"
#include "clixon_xml_map.h"
#include "clixon_json.h" #include "clixon_json.h"
#include "clixon_nacm.h" #include "clixon_nacm.h"
#include "clixon_netconf_lib.h" #include "clixon_netconf_lib.h"
#include "clixon_yang_module.h" #include "clixon_yang_module.h"
#include "clixon_xml_map.h"
#include "clixon_datastore.h" #include "clixon_datastore.h"
#include "clixon_datastore_read.h" #include "clixon_datastore_read.h"
@ -184,7 +184,7 @@ xml_copy_marked(cxobj *x0,
} }
/* (3) Special case: key nodes in lists are copied if any /* (3) Special case: key nodes in lists are copied if any
* node in list is marked */ * node in list is marked */
if (mark && yt && yt->ys_keyword == Y_LIST){ if (mark && yt && yang_keyword_get(yt) == Y_LIST){
/* XXX: I think yang_key_match is suboptimal here */ /* XXX: I think yang_key_match is suboptimal here */
if ((iskey = yang_key_match(yt, name)) < 0) if ((iskey = yang_key_match(yt, name)) < 0)
goto done; goto done;

View file

@ -71,11 +71,11 @@
#include "clixon_data.h" #include "clixon_data.h"
#include "clixon_xpath_ctx.h" #include "clixon_xpath_ctx.h"
#include "clixon_xpath.h" #include "clixon_xpath.h"
#include "clixon_xml_map.h"
#include "clixon_json.h" #include "clixon_json.h"
#include "clixon_nacm.h" #include "clixon_nacm.h"
#include "clixon_netconf_lib.h" #include "clixon_netconf_lib.h"
#include "clixon_yang_module.h" #include "clixon_yang_module.h"
#include "clixon_xml_map.h"
#include "clixon_datastore.h" #include "clixon_datastore.h"
#include "clixon_datastore_write.h" #include "clixon_datastore_write.h"
@ -136,7 +136,7 @@ text_modify(clicon_handle h,
if (xml_operation(opstr, &op) < 0) if (xml_operation(opstr, &op) < 0)
goto done; goto done;
x1name = xml_name(x1); x1name = xml_name(x1);
if (y0->ys_keyword == Y_LEAF_LIST || y0->ys_keyword == Y_LEAF){ if (yang_keyword_get(y0) == Y_LEAF_LIST || yang_keyword_get(y0) == Y_LEAF){
x1bstr = xml_body(x1); x1bstr = xml_body(x1);
switch(op){ switch(op){
case OP_CREATE: case OP_CREATE:
@ -174,7 +174,7 @@ text_modify(clicon_handle h,
#if 0 #if 0
/* If it is key I dont want to mark it */ /* If it is key I dont want to mark it */
if ((iamkey=yang_key_match(y0->ys_parent, x1name)) < 0) if ((iamkey=yang_key_match(yang_parent_get(y0), x1name)) < 0)
goto done; goto done;
if (!iamkey && op==OP_NONE) if (!iamkey && op==OP_NONE)
#else #else
@ -255,7 +255,8 @@ text_modify(clicon_handle h,
can be modified in its entirety only. can be modified in its entirety only.
Any "operation" attributes present on subelements of an anyxml Any "operation" attributes present on subelements of an anyxml
node are ignored by the NETCONF server.*/ node are ignored by the NETCONF server.*/
if (y0->ys_keyword == Y_ANYXML || y0->ys_keyword == Y_ANYDATA){ if (yang_keyword_get(y0) == Y_ANYXML ||
yang_keyword_get(y0) == Y_ANYDATA){
if (op == OP_NONE) if (op == OP_NONE)
break; break;
if (op==OP_MERGE && !permit && xnacm){ if (op==OP_MERGE && !permit && xnacm){
@ -546,7 +547,7 @@ xml_container_presence(cxobj *x,
goto done; goto done;
} }
/* Mark node that is: container, have no children, dont have presence */ /* Mark node that is: container, have no children, dont have presence */
if (y->ys_keyword == Y_CONTAINER && if (yang_keyword_get(y) == Y_CONTAINER &&
xml_child_nr_notype(x, CX_ATTR)==0 && xml_child_nr_notype(x, CX_ATTR)==0 &&
yang_find(y, Y_PRESENCE, NULL) == NULL) yang_find(y, Y_PRESENCE, NULL) == NULL)
xml_flag_set(x, XML_FLAG_MARK); /* Mark, remove later */ xml_flag_set(x, XML_FLAG_MARK); /* Mark, remove later */

View file

@ -208,7 +208,7 @@ array_eval(cxobj *xprev,
array = LAST_ARRAY; array = LAST_ARRAY;
else if (eqnext) else if (eqnext)
array = FIRST_ARRAY; array = FIRST_ARRAY;
else if (ys && ys->ys_keyword == Y_LIST) else if (ys && yang_keyword_get(ys) == Y_LIST)
array = SINGLE_ARRAY; array = SINGLE_ARRAY;
else else
array = NO_ARRAY; array = NO_ARRAY;
@ -338,7 +338,7 @@ xml2json1_cbuf(cbuf *cb,
/* Find module name associated with namspace URI */ /* Find module name associated with namspace URI */
if (namespace && yspec && if (namespace && yspec &&
(ymod = yang_find_module_by_namespace(yspec, namespace)) != NULL){ (ymod = yang_find_module_by_namespace(yspec, namespace)) != NULL){
modname = ymod->ys_argument; modname = yang_argument_get(ymod);
} }
childt = child_type(x); childt = child_type(x);
if (pretty==2) if (pretty==2)
@ -427,8 +427,8 @@ xml2json1_cbuf(cbuf *cb,
* This is code for writing <a>42</a> as "a":42 and not "a":"42" * This is code for writing <a>42</a> as "a":42 and not "a":"42"
*/ */
if (childt == BODY_CHILD && ys!=NULL && if (childt == BODY_CHILD && ys!=NULL &&
(ys->ys_keyword == Y_LEAF || ys->ys_keyword == Y_LEAF_LIST)) (yang_keyword_get(ys) == Y_LEAF || yang_keyword_get(ys) == Y_LEAF_LIST))
switch (cv_type_get(ys->ys_cv)){ switch (cv_type_get(yang_cv_get(ys))){
case CGV_INT8: case CGV_INT8:
case CGV_INT16: case CGV_INT16:
case CGV_INT32: case CGV_INT32:

View file

@ -330,7 +330,7 @@ nacm_rule_datanode(cxobj *xt,
if ((ys = xml_spec(xr)) == NULL) if ((ys = xml_spec(xr)) == NULL)
goto nomatch; goto nomatch;
ymod = ys_module(ys); ymod = ys_module(ys);
module = ymod->ys_argument; module = yang_argument_get(ymod);
if (strcmp(module, module_rule) != 0) if (strcmp(module, module_rule) != 0)
goto nomatch; goto nomatch;
} }

View file

@ -66,8 +66,8 @@
#include "clixon_xml.h" #include "clixon_xml.h"
#include "clixon_options.h" #include "clixon_options.h"
#include "clixon_data.h" #include "clixon_data.h"
#include "clixon_xml_map.h"
#include "clixon_yang_module.h" #include "clixon_yang_module.h"
#include "clixon_xml_map.h"
#include "clixon_xml_changelog.h" #include "clixon_xml_changelog.h"
#include "clixon_xpath_ctx.h" #include "clixon_xpath_ctx.h"
#include "clixon_xpath.h" #include "clixon_xpath.h"

View file

@ -80,7 +80,6 @@
#include "clixon_handle.h" #include "clixon_handle.h"
#include "clixon_string.h" #include "clixon_string.h"
#include "clixon_yang.h" #include "clixon_yang.h"
#include "clixon_yang_type.h"
#include "clixon_xml.h" #include "clixon_xml.h"
#include "clixon_options.h" #include "clixon_options.h"
#include "clixon_plugin.h" #include "clixon_plugin.h"
@ -90,6 +89,8 @@
#include "clixon_err.h" #include "clixon_err.h"
#include "clixon_netconf_lib.h" #include "clixon_netconf_lib.h"
#include "clixon_xml_sort.h" #include "clixon_xml_sort.h"
#include "clixon_yang_internal.h" /* internal */
#include "clixon_yang_type.h"
#include "clixon_xml_map.h" #include "clixon_xml_map.h"
/*! x is element and has eactly one child which in turn has none */ /*! x is element and has eactly one child which in turn has none */
@ -186,7 +187,7 @@ xml2cli(FILE *f,
goto ok; goto ok;
if ((ys = xml_spec(x)) == NULL) if ((ys = xml_spec(x)) == NULL)
goto ok; goto ok;
if (ys->ys_keyword == Y_LEAF || ys->ys_keyword == Y_LEAF_LIST){ if (yang_keyword_get(ys) == Y_LEAF || yang_keyword_get(ys) == Y_LEAF_LIST){
if (prepend0) if (prepend0)
fprintf(f, "%s", prepend0); fprintf(f, "%s", prepend0);
if (gt == GT_ALL || gt == GT_VARS) if (gt == GT_ALL || gt == GT_VARS)
@ -209,7 +210,7 @@ xml2cli(FILE *f,
cprintf(cbpre, "%s", prepend0); cprintf(cbpre, "%s", prepend0);
cprintf(cbpre, "%s ", xml_name(x)); cprintf(cbpre, "%s ", xml_name(x));
if (ys->ys_keyword == Y_LIST){ if (yang_keyword_get(ys) == Y_LIST){
/* If list then first loop through keys */ /* If list then first loop through keys */
xe = NULL; xe = NULL;
while ((xe = xml_child_each(x, xe, -1)) != NULL){ while ((xe = xml_child_each(x, xe, -1)) != NULL){
@ -225,7 +226,7 @@ xml2cli(FILE *f,
/* Then loop through all other (non-keys) */ /* Then loop through all other (non-keys) */
xe = NULL; xe = NULL;
while ((xe = xml_child_each(x, xe, -1)) != NULL){ while ((xe = xml_child_each(x, xe, -1)) != NULL){
if (ys->ys_keyword == Y_LIST){ if (yang_keyword_get(ys) == Y_LIST){
if ((match = yang_key_match(ys, xml_name(xe))) < 0) if ((match = yang_key_match(ys, xml_name(xe))) < 0)
goto done; goto done;
if (match){ if (match){
@ -269,11 +270,11 @@ validate_leafref(cxobj *xt,
if ((leafrefbody = xml_body(xt)) == NULL) if ((leafrefbody = xml_body(xt)) == NULL)
goto ok; goto ok;
if ((ypath = yang_find(ytype, Y_PATH, NULL)) == NULL){ if ((ypath = yang_find(ytype, Y_PATH, NULL)) == NULL){
if (netconf_missing_element(cbret, "application", ytype->ys_argument, "Leafref requires path statement") < 0) if (netconf_missing_element(cbret, "application", yang_argument_get(ytype), "Leafref requires path statement") < 0)
goto done; goto done;
goto fail; goto fail;
} }
if (xpath_vec(xt, "%s", &xvec, &xlen, ypath->ys_argument) < 0) if (xpath_vec(xt, "%s", &xvec, &xlen, yang_argument_get(ypath)) < 0)
goto done; goto done;
for (i = 0; i < xlen; i++) { for (i = 0; i < xlen; i++) {
x = xvec[i]; x = xvec[i];
@ -349,23 +350,23 @@ validate_identityref(cxobj *xt,
} }
/* This is the type's base reference */ /* This is the type's base reference */
if ((ybaseref = yang_find(ytype, Y_BASE, NULL)) == NULL){ if ((ybaseref = yang_find(ytype, Y_BASE, NULL)) == NULL){
if (netconf_missing_element(cbret, "application", ytype->ys_argument, "Identityref validation failed, no base") < 0) if (netconf_missing_element(cbret, "application", yang_argument_get(ytype), "Identityref validation failed, no base") < 0)
goto done; goto done;
goto fail; goto fail;
} }
/* This is the actual base identity */ /* This is the actual base identity */
if ((ybaseid = yang_find_identity(ybaseref, ybaseref->ys_argument)) == NULL){ if ((ybaseid = yang_find_identity(ybaseref, yang_argument_get(ybaseref))) == NULL){
if (netconf_missing_element(cbret, "application", ybaseref->ys_argument, "Identityref validation failed, no base identity") < 0) if (netconf_missing_element(cbret, "application", yang_argument_get(ybaseref), "Identityref validation failed, no base identity") < 0)
goto done; goto done;
goto fail; goto fail;
} }
/* Here check if node is in the derived node list of the base identity /* Here check if node is in the derived node list of the base identity
* The derived node list is a cvec computed XXX * The derived node list is a cvec computed XXX
*/ */
if (cvec_find(ybaseid->ys_cvec, node) == NULL){ if (cvec_find(yang_cvec_get(ybaseid), node) == NULL){
cbuf_reset(cb); cbuf_reset(cb);
cprintf(cb, "Identityref validation failed, %s not derived from %s", cprintf(cb, "Identityref validation failed, %s not derived from %s",
node, ybaseid->ys_argument); node, yang_argument_get(ybaseid));
if (netconf_operation_failed(cbret, "application", cbuf_get(cb)) < 0) if (netconf_operation_failed(cbret, "application", cbuf_get(cb)) < 0)
goto done; goto done;
goto fail; goto fail;
@ -398,11 +399,11 @@ xml_yang_root(cxobj *x,
while ((xp = xml_parent(x)) != NULL){ while ((xp = xml_parent(x)) != NULL){
if ((y = xml_spec(x)) != NULL && if ((y = xml_spec(x)) != NULL &&
(yp = (yang_stmt*)y->ys_parent) != NULL) (yp = yang_parent_get(y)) != NULL)
/* Actually, maybe only the Y_MODULE clause is relevant */ /* Actually, maybe only the Y_MODULE clause is relevant */
if (yp==NULL || if (yp==NULL ||
yp->ys_keyword == Y_MODULE || yang_keyword_get(yp) == Y_MODULE ||
yp->ys_keyword == Y_SUBMODULE) yang_keyword_get(yp) == Y_SUBMODULE)
break; /* x is the root */ break; /* x is the root */
x = xp; x = xp;
} }

View file

@ -60,10 +60,10 @@
#include "clixon_hash.h" #include "clixon_hash.h"
#include "clixon_handle.h" #include "clixon_handle.h"
#include "clixon_yang.h" #include "clixon_yang.h"
#include "clixon_yang_type.h"
#include "clixon_xml.h" #include "clixon_xml.h"
#include "clixon_options.h" #include "clixon_options.h"
#include "clixon_xml_map.h" #include "clixon_xml_map.h"
#include "clixon_yang_type.h"
#include "clixon_xml_sort.h" #include "clixon_xml_sort.h"
/*! Get xml body value as cligen variable /*! Get xml body value as cligen variable
@ -96,10 +96,10 @@ xml_cv_cache(cxobj *x,
goto ok; goto ok;
if (yang_type_get(y, NULL, &yrestype, &options, NULL, NULL, &fraction) < 0) if (yang_type_get(y, NULL, &yrestype, &options, NULL, NULL, &fraction) < 0)
goto done; goto done;
yang2cv_type(yrestype->ys_argument, &cvtype); yang2cv_type(yang_argument_get(yrestype), &cvtype);
if (cvtype==CGV_ERR){ if (cvtype==CGV_ERR){
clicon_err(OE_YANG, errno, "yang->cligen type %s mapping failed", clicon_err(OE_YANG, errno, "yang->cligen type %s mapping failed",
yrestype->ys_argument); yang_argument_get(yrestype));
goto done; goto done;
} }
if ((cv = cv_new(cvtype)) == NULL){ if ((cv = cv_new(cvtype)) == NULL){
@ -157,11 +157,10 @@ xml_child_spec(cxobj *x,
char *name; char *name;
name = xml_name(x); name = xml_name(x);
if (xp && (yparent = xml_spec(xp)) != NULL){ if (xp && (yparent = xml_spec(xp)) != NULL){
/* First case: parent already has an associated yang statement, /* First case: parent already has an associated yang statement,
* then find matching child of that */ * then find matching child of that */
if (yparent->ys_keyword == Y_RPC){ if (yang_keyword_get(yparent) == Y_RPC){
if ((yi = yang_find(yparent, Y_INPUT, NULL)) != NULL) if ((yi = yang_find(yparent, Y_INPUT, NULL)) != NULL)
y = yang_find_datanode(yi, name); y = yang_find_datanode(yi, name);
} }
@ -179,7 +178,7 @@ xml_child_spec(cxobj *x,
else else
y = NULL; y = NULL;
/* kludge rpc -> input */ /* kludge rpc -> input */
if (y && y->ys_keyword == Y_RPC && yang_find(y, Y_INPUT, NULL)) if (y && yang_keyword_get(y) == Y_RPC && yang_find(y, Y_INPUT, NULL))
y = yang_find(y, Y_INPUT, NULL); y = yang_find(y, Y_INPUT, NULL);
*yresult = y; *yresult = y;
retval = 0; retval = 0;
@ -258,7 +257,7 @@ xml_cmp(cxobj *x1,
goto done; /* Ordered by user or state data : maintain existing order */ goto done; /* Ordered by user or state data : maintain existing order */
} }
e=4; e=4;
switch (y1->ys_keyword){ switch (yang_keyword_get(y1)){
case Y_LEAF_LIST: /* Match with name and value */ case Y_LEAF_LIST: /* Match with name and value */
if ((b1 = xml_body(x1)) == NULL) if ((b1 = xml_body(x1)) == NULL)
equal = -1; equal = -1;
@ -275,7 +274,7 @@ xml_cmp(cxobj *x1,
case Y_LIST: /* Match with key values case Y_LIST: /* Match with key values
* Use Y_LIST cache (see struct yang_stmt) * Use Y_LIST cache (see struct yang_stmt)
*/ */
cvk = y1->ys_cvec; /* Use Y_LIST cache, see ys_populate_list() */ cvk = yang_cvec_get(y1); /* Use Y_LIST cache, see ys_populate_list() */
cvi = NULL; cvi = NULL;
while ((cvi = cvec_each(cvk, cvi)) != NULL) { while ((cvi = cvec_each(cvk, cvi)) != NULL) {
keyname = cv_string_get(cvi); /* operational data may have NULL keys*/ keyname = cv_string_get(cvi); /* operational data may have NULL keys*/
@ -682,7 +681,7 @@ match_base_child(cxobj *x0,
} }
goto ok; /* What to do if not found? */ goto ok; /* What to do if not found? */
} }
switch (yc->ys_keyword){ switch (yang_keyword_get(yc)){
case Y_CONTAINER: /* Equal regardless */ case Y_CONTAINER: /* Equal regardless */
case Y_LEAF: /* Equal regardless */ case Y_LEAF: /* Equal regardless */
break; break;
@ -702,7 +701,7 @@ match_base_child(cxobj *x0,
goto done; goto done;
break; break;
case Y_LIST: /* Match with key values */ case Y_LIST: /* Match with key values */
cvk = yc->ys_cvec; /* Use Y_LIST cache, see ys_populate_list() */ cvk = yang_cvec_get(yc); /* Use Y_LIST cache, see ys_populate_list() */
/* Count number of key indexes /* Count number of key indexes
* Then create two vectors one with names and one with values of x1c, * Then create two vectors one with names and one with values of x1c,
* ec: keyvec: [a,b,c] keyval: [1,2,3] * ec: keyvec: [a,b,c] keyval: [1,2,3]
@ -741,7 +740,7 @@ match_base_child(cxobj *x0,
} }
/* Get match. */ /* Get match. */
yorder = yang_order(yc); yorder = yang_order(yc);
x0c = xml_search(x0, xml_name(x1c), yorder, yc->ys_keyword, keynr, keyvec, keyval, keycvec); x0c = xml_search(x0, xml_name(x1c), yorder, yang_keyword_get(yc), keynr, keyvec, keyval, keycvec);
ok: ok:
*x0cp = x0c; *x0cp = x0c;
retval = 0; retval = 0;

View file

@ -89,6 +89,7 @@
#include "clixon_options.h" #include "clixon_options.h"
#include "clixon_yang_parse.h" #include "clixon_yang_parse.h"
#include "clixon_yang_cardinality.h" #include "clixon_yang_cardinality.h"
#include "clixon_yang_internal.h" /* internal */
#include "clixon_yang_type.h" #include "clixon_yang_type.h"
/* Size of json read buffer when reading from file*/ /* Size of json read buffer when reading from file*/

View file

@ -64,6 +64,7 @@
#include "clixon_handle.h" #include "clixon_handle.h"
#include "clixon_err.h" #include "clixon_err.h"
#include "clixon_yang.h" #include "clixon_yang.h"
#include "clixon_yang_internal.h" /* internal */
#include "clixon_yang_cardinality.h" #include "clixon_yang_cardinality.h"
/* /*
@ -499,15 +500,14 @@ yang_cardinality(clicon_handle h,
const struct ycard *ycplist; /* ycard parent table*/ const struct ycard *ycplist; /* ycard parent table*/
const struct ycard *yc; const struct ycard *yc;
pk = yt->ys_keyword; pk = yang_keyword_get(yt);
/* 0) Find parent sub-parts of cardinality vector */ /* 0) Find parent sub-parts of cardinality vector */
if ((ycplist = ycard_find(pk, 0, yclist, 0)) == NULL) if ((ycplist = ycard_find(pk, 0, yclist, 0)) == NULL)
goto ok; /* skip */ goto ok; /* skip */
/* 1) For all children, if neither in 0..n, 0..1, 1 or 1..n ->ERROR */ /* 1) For all children, if neither in 0..n, 0..1, 1 or 1..n ->ERROR */
i = 0; ys = NULL;
while (i<yt->ys_len){ while ((ys = yn_each(yt, ys)) != NULL) {
ys = yt->ys_stmt[i++]; ck = yang_keyword_get(ys);
ck = ys->ys_keyword;
if (ck == Y_UNKNOWN) /* special case */ if (ck == Y_UNKNOWN) /* special case */
continue; continue;
/* Find entry in yang cardinality table from parent/child keyword pair */ /* Find entry in yang cardinality table from parent/child keyword pair */
@ -515,9 +515,9 @@ yang_cardinality(clicon_handle h,
clicon_err(OE_YANG, 0, "%s: \"%s\"(%s) is child of \"%s\"(%s), but should not be", clicon_err(OE_YANG, 0, "%s: \"%s\"(%s) is child of \"%s\"(%s), but should not be",
modname, modname,
yang_key2str(ck), yang_key2str(ck),
ys->ys_argument, yang_argument_get(ys),
yang_key2str(pk), yang_key2str(pk),
yt->ys_argument); yang_argument_get(yt));
goto done; goto done;
} }
} }
@ -546,7 +546,7 @@ yang_cardinality(clicon_handle h,
/* 4) Recurse */ /* 4) Recurse */
i = 0; i = 0;
while (i<yt->ys_len){ /* Note, children may be removed */ while (i<yt->ys_len){ /* Note, children may be removed cant use yn_each */
ys = yt->ys_stmt[i++]; ys = yt->ys_stmt[i++];
if (yang_cardinality(h, ys, modname) < 0) if (yang_cardinality(h, ys, modname) < 0)
goto done; goto done;

View file

@ -39,6 +39,16 @@
#ifndef _CLIXON_YANG_INTERNAL_H_ #ifndef _CLIXON_YANG_INTERNAL_H_
#define _CLIXON_YANG_INTERNAL_H_ #define _CLIXON_YANG_INTERNAL_H_
/*
* Actually cligen variable stuff XXX
*/
#define V_UNIQUE 0x01 /* Variable flag */
#define V_UNSET 0x08 /* Variable is unset, ie no default */
#define YANG_FLAG_MARK 0x01 /* Marker for dynamic algorithms, eg expand */
/*! Yang type cache. Yang type statements can cache all typedef info here /*! Yang type cache. Yang type statements can cache all typedef info here
* @note unions not cached * @note unions not cached
*/ */
@ -88,4 +98,20 @@ struct yang_stmt{
int _ys_vector_i; /* internal use: yn_each */ int _ys_vector_i; /* internal use: yn_each */
}; };
/* Yang data definition statement
* See RFC 7950 Sec 3:
* o data definition statement: A statement that defines new data
* nodes. One of "container", "leaf", "leaf-list", "list", "choice",
* "case", "augment", "uses", "anydata", and "anyxml".
*/
#define yang_datadefinition(y) (yang_datanode(y) || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_AUGMENT || (y)->ys_keyword == Y_USES)
/* Yang schema node .
* See RFC 7950 Sec 3:
* o schema node: A node in the schema tree. One of action, container,
* leaf, leaf-list, list, choice, case, rpc, input, output,
* notification, anydata, and anyxml.
*/
#define yang_schemanode(y) (yang_datanode(y) || (y)->ys_keyword == Y_RPC || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_INPUT || (y)->ys_keyword == Y_OUTPUT || (y)->ys_keyword == Y_NOTIFICATION)
#endif /* _CLIXON_YANG_INTERNAL_H_ */ #endif /* _CLIXON_YANG_INTERNAL_H_ */

View file

@ -76,6 +76,7 @@
#include "clixon_plugin.h" #include "clixon_plugin.h"
#include "clixon_netconf_lib.h" #include "clixon_netconf_lib.h"
#include "clixon_yang_module.h" #include "clixon_yang_module.h"
#include "clixon_yang_internal.h" /* internal */
modstate_diff_t * modstate_diff_t *
modstate_diff_new(void) modstate_diff_new(void)

View file

@ -190,6 +190,7 @@
#include "clixon_log.h" #include "clixon_log.h"
#include "clixon_yang.h" #include "clixon_yang.h"
#include "clixon_yang_parse.h" #include "clixon_yang_parse.h"
#include "clixon_yang_internal.h" /* internal */
extern int clixon_yang_parseget_lineno (void); extern int clixon_yang_parseget_lineno (void);

View file

@ -67,6 +67,7 @@
#include "clixon_plugin.h" #include "clixon_plugin.h"
#include "clixon_options.h" #include "clixon_options.h"
#include "clixon_yang.h" #include "clixon_yang.h"
#include "clixon_yang_internal.h" /* internal */
#include "clixon_yang_type.h" #include "clixon_yang_type.h"
/* /*