This commit is contained in:
Olof hagsand 2018-12-05 22:18:28 +01:00
parent 9377986c81
commit 7d5bfe5c81
5 changed files with 335 additions and 18 deletions

View file

@ -108,6 +108,217 @@ struct ycard{
*/
#define NMAX 1000000 /* Just a large number */
static const struct ycard yclist[] = {
{Y_ACTION, Y_DESCRIPTION, 0, 1},
{Y_ACTION, Y_GROUPING, 0, NMAX},
{Y_ACTION, Y_IF_FEATURE, 0, NMAX},
{Y_ACTION, Y_INPUT, 0, 1},
{Y_ACTION, Y_OUTPUT, 0, 1},
{Y_ACTION, Y_REFERENCE, 0, 1},
{Y_ACTION, Y_STATUS, 0, 1},
{Y_ACTION, Y_TYPEDEF, 0, NMAX},
{Y_ANYDATA, Y_CONFIG, 0, 1},
{Y_ANYDATA, Y_DESCRIPTION, 0, 1},
{Y_ANYDATA, Y_IF_FEATURE, 0, NMAX},
{Y_ANYDATA, Y_MANDATORY, 0, 1},
{Y_ANYDATA, Y_MUST, 0, NMAX},
{Y_ANYDATA, Y_REFERENCE, 0, 1},
{Y_ANYDATA, Y_STATUS, 0, 1},
{Y_ANYDATA, Y_WHEN, 0, 1},
{Y_ANYXML, Y_CONFIG, 0, 1},
{Y_ANYXML, Y_DESCRIPTION, 0, 1},
{Y_ANYXML, Y_IF_FEATURE, 0, NMAX},
{Y_ANYXML, Y_MANDATORY, 0, 1},
{Y_ANYXML, Y_MUST, 0, NMAX},
{Y_ANYXML, Y_REFERENCE, 0, 1},
{Y_ANYXML, Y_STATUS, 0, 1},
{Y_ANYXML, Y_WHEN, 0, 1},
{Y_ARGUMENT, Y_YIN_ELEMENT, 0, 1},
{Y_AUGMENT, Y_ACTION, 0, NMAX},
{Y_AUGMENT, Y_ANYDATA, 0, NMAX},
{Y_AUGMENT, Y_ANYXML, 0, NMAX},
{Y_AUGMENT, Y_CASE, 0, NMAX},
{Y_AUGMENT, Y_CHOICE, 0, NMAX},
{Y_AUGMENT, Y_CONTAINER, 0, NMAX},
{Y_AUGMENT, Y_DESCRIPTION, 0, 1},
{Y_AUGMENT, Y_IF_FEATURE, 0, NMAX},
{Y_AUGMENT, Y_LEAF, 0, NMAX},
{Y_AUGMENT, Y_LEAF_LIST, 0, NMAX},
{Y_AUGMENT, Y_LIST, 0, NMAX},
{Y_AUGMENT, Y_NOTIFICATION, 0, NMAX},
{Y_AUGMENT, Y_REFERENCE, 0, 1},
{Y_AUGMENT, Y_STATUS, 0, 1},
{Y_AUGMENT, Y_USES, 0, NMAX},
{Y_AUGMENT, Y_WHEN, 0, 1},
{Y_BELONGS_TO, Y_PREFIX, 1, 1},
{Y_BIT, Y_DESCRIPTION, 0, 1},
{Y_BIT, Y_IF_FEATURE, 0, NMAX},
{Y_BIT, Y_POSITION, 0, 1},
{Y_BIT, Y_REFERENCE, 0, 1},
{Y_BIT, Y_STATUS, 0, 1},
{Y_CASE, Y_ANYDATA, 0, NMAX},
{Y_CASE, Y_ANYXML, 0, NMAX},
{Y_CASE, Y_CHOICE, 0, NMAX},
{Y_CASE, Y_CONTAINER, 0, NMAX},
{Y_CASE, Y_DESCRIPTION, 0, 1},
{Y_CASE, Y_IF_FEATURE, 0, NMAX},
{Y_CASE, Y_LEAF, 0, NMAX},
{Y_CASE, Y_LEAF_LIST, 0, NMAX},
{Y_CASE, Y_LIST, 0, NMAX},
{Y_CASE, Y_REFERENCE, 0, 1},
{Y_CASE, Y_STATUS, 0, 1},
{Y_CASE, Y_USES, 0, NMAX},
{Y_CASE, Y_WHEN, 0, 1},
{Y_CHOICE, Y_ANYXML, 0, NMAX},
{Y_CHOICE, Y_CASE, 0, NMAX},
{Y_CHOICE, Y_CHOICE, 0, NMAX},
{Y_CHOICE, Y_CONFIG, 0, 1},
{Y_CHOICE, Y_CONTAINER, 0, NMAX},
{Y_CHOICE, Y_DEFAULT, 0, 1},
{Y_CHOICE, Y_DESCRIPTION, 0, 1},
{Y_CHOICE, Y_IF_FEATURE, 0, NMAX},
{Y_CHOICE, Y_LEAF, 0, NMAX},
{Y_CHOICE, Y_LEAF_LIST, 0, NMAX},
{Y_CHOICE, Y_LIST, 0, NMAX},
{Y_CHOICE, Y_MANDATORY, 0, 1},
{Y_CHOICE, Y_REFERENCE, 0, 1},
{Y_CHOICE, Y_STATUS, 0, 1},
{Y_CHOICE, Y_WHEN, 0, 1},
{Y_CHOICE, Y_ANYDATA, 0, NMAX},
{Y_CONTAINER, Y_ACTION, 0, NMAX},
{Y_CONTAINER, Y_ANYDATA, 0, NMAX},
{Y_CONTAINER, Y_ANYXML, 0, NMAX},
{Y_CONTAINER, Y_CHOICE, 0, NMAX},
{Y_CONTAINER, Y_CONFIG, 0, 1},
{Y_CONTAINER, Y_CONTAINER, 0, NMAX},
{Y_CONTAINER, Y_DESCRIPTION, 0, 1},
{Y_CONTAINER, Y_GROUPING, 0, NMAX},
{Y_CONTAINER, Y_IF_FEATURE, 0, NMAX},
{Y_CONTAINER, Y_LEAF, 0, NMAX},
{Y_CONTAINER, Y_LEAF_LIST, 0, NMAX},
{Y_CONTAINER, Y_LIST, 0, NMAX},
{Y_CONTAINER, Y_MUST, 0, NMAX},
{Y_CONTAINER, Y_NOTIFICATION, 0, NMAX},
{Y_CONTAINER, Y_PRESENCE, 0, 1},
{Y_CONTAINER, Y_REFERENCE, 0, 1},
{Y_CONTAINER, Y_STATUS, 0, 1},
{Y_CONTAINER, Y_TYPEDEF, 0, NMAX},
{Y_CONTAINER, Y_USES, 0, NMAX},
{Y_CONTAINER, Y_WHEN, 0, 1},
{Y_DEVIATE, Y_CONFIG, 0, 1},
{Y_DEVIATE, Y_DEFAULT, 0, NMAX},
{Y_DEVIATE, Y_MANDATORY, 0, 1},
{Y_DEVIATE, Y_MAX_ELEMENTS, 0, 1},
{Y_DEVIATE, Y_MIN_ELEMENTS, 0, 1},
{Y_DEVIATE, Y_MUST, 0, NMAX},
{Y_DEVIATE, Y_TYPE, 0, 1},
{Y_DEVIATE, Y_UNIQUE, 0, NMAX},
{Y_DEVIATE, Y_UNITS, 0, 1},
{Y_DEVIATION, Y_DESCRIPTION, 0, 1},
{Y_DEVIATION, Y_DEVIATE, 1, NMAX},
{Y_DEVIATION, Y_REFERENCE, 0, 1},
{Y_ENUM, Y_DESCRIPTION, 0, 1},
{Y_ENUM, Y_IF_FEATURE, 0, NMAX},
{Y_ENUM, Y_REFERENCE, 0, 1},
{Y_ENUM, Y_STATUS, 0, 1},
{Y_ENUM, Y_VALUE, 0, 1},
{Y_EXTENSION, Y_ARGUMENT, 0, 1},
{Y_EXTENSION, Y_DESCRIPTION, 0, 1},
{Y_EXTENSION, Y_REFERENCE, 0, 1},
{Y_EXTENSION, Y_STATUS, 0, 1},
{Y_FEATURE, Y_DESCRIPTION, 0, 1},
{Y_FEATURE, Y_IF_FEATURE, 0, NMAX},
{Y_FEATURE, Y_REFERENCE, 0, 1},
{Y_FEATURE, Y_STATUS, 0, 1},
{Y_GROUPING, Y_ACTION, 0, NMAX},
{Y_GROUPING, Y_ANYDATA, 0, NMAX},
{Y_GROUPING, Y_ANYXML, 0, NMAX},
{Y_GROUPING, Y_CHOICE, 0, NMAX},
{Y_GROUPING, Y_CONTAINER, 0, NMAX},
{Y_GROUPING, Y_DESCRIPTION, 0, 1},
{Y_GROUPING, Y_GROUPING, 0, NMAX},
{Y_GROUPING, Y_LEAF, 0, NMAX},
{Y_GROUPING, Y_LEAF_LIST, 0, NMAX},
{Y_GROUPING, Y_LIST, 0, NMAX},
{Y_GROUPING, Y_NOTIFICATION, 0, NMAX},
{Y_GROUPING, Y_REFERENCE, 0, 1},
{Y_GROUPING, Y_STATUS, 0, 1},
{Y_GROUPING, Y_TYPEDEF, 0, NMAX},
{Y_GROUPING, Y_USES, 0, NMAX},
{Y_IDENTITY, Y_BASE, 0, NMAX},
{Y_IDENTITY, Y_DESCRIPTION, 0, 1},
{Y_IDENTITY, Y_IF_FEATURE, 0, NMAX},
{Y_IDENTITY, Y_REFERENCE, 0, 1},
{Y_IDENTITY, Y_STATUS, 0, 1},
{Y_IMPORT, Y_DESCRIPTION, 0, 1},
{Y_IMPORT, Y_PREFIX, 1, 1},
{Y_IMPORT, Y_REFERENCE, 0, 1},
{Y_IMPORT, Y_REVISION_DATE,0, 1},
{Y_INCLUDE, Y_DESCRIPTION, 0, 1},
{Y_INCLUDE, Y_REFERENCE, 0, 1},
{Y_INCLUDE, Y_REVISION_DATE,0, 1},
{Y_INPUT, Y_ANYDATA, 0, NMAX},
{Y_INPUT, Y_ANYXML, 0, NMAX},
{Y_INPUT, Y_CHOICE, 0, NMAX},
{Y_INPUT, Y_CONTAINER, 0, NMAX},
{Y_INPUT, Y_GROUPING, 0, NMAX},
{Y_INPUT, Y_LEAF, 0, NMAX},
{Y_INPUT, Y_LEAF_LIST, 0, NMAX},
{Y_INPUT, Y_LIST, 0, NMAX},
{Y_INPUT, Y_MUST, 0, NMAX},
{Y_INPUT, Y_TYPEDEF, 0, NMAX},
{Y_INPUT, Y_USES, 0, NMAX},
{Y_LEAF, Y_CONFIG, 0, 1},
{Y_LEAF, Y_DEFAULT, 0, 1},
{Y_LEAF, Y_DESCRIPTION, 0, 1},
{Y_LEAF, Y_IF_FEATURE, 0, NMAX},
{Y_LEAF, Y_MANDATORY, 0, 1},
{Y_LEAF, Y_MUST, 0, NMAX},
{Y_LEAF, Y_REFERENCE, 0, 1},
{Y_LEAF, Y_STATUS, 0, 1},
{Y_LEAF, Y_TYPE, 1, 1},
{Y_LEAF, Y_UNITS, 0, 1},
{Y_LEAF, Y_WHEN, 0, 1},
{Y_LEAF_LIST, Y_CONFIG, 0, 1},
{Y_LEAF_LIST, Y_DEFAULT, 0, NMAX},
{Y_LEAF_LIST, Y_DESCRIPTION, 0, 1},
{Y_LEAF_LIST, Y_IF_FEATURE, 0, NMAX},
{Y_LEAF_LIST, Y_MAX_ELEMENTS, 0, 1},
{Y_LEAF_LIST, Y_MIN_ELEMENTS, 0, 1},
{Y_LEAF_LIST, Y_MUST, 0, NMAX},
{Y_LEAF_LIST, Y_ORDERED_BY, 0, 1},
{Y_LEAF_LIST, Y_REFERENCE, 0, 1},
{Y_LEAF_LIST, Y_STATUS, 0, 1},
{Y_LEAF_LIST, Y_TYPE, 1, 1},
{Y_LEAF_LIST, Y_UNITS, 0, 1},
{Y_LEAF_LIST, Y_WHEN, 0, 1},
{Y_LENGTH, Y_DESCRIPTION, 0, 1},
{Y_LENGTH, Y_ERROR_APP_TAG, 0, 1},
{Y_LENGTH, Y_ERROR_MESSAGE, 0, 1},
{Y_LENGTH, Y_REFERENCE, 0, 1},
{Y_LIST, Y_ACTION, 0, NMAX},
{Y_LIST, Y_ANYDATA, 0, NMAX},
{Y_LIST, Y_ANYXML, 0, NMAX},
{Y_LIST, Y_CHOICE, 0, NMAX},
{Y_LIST, Y_CONFIG, 0, 1},
{Y_LIST, Y_CONTAINER, 0, NMAX},
{Y_LIST, Y_DESCRIPTION, 0, 1},
{Y_LIST, Y_GROUPING, 0, NMAX},
{Y_LIST, Y_IF_FEATURE, 0, NMAX},
{Y_LIST, Y_KEY, 0, 1},
{Y_LIST, Y_LEAF, 0, NMAX},
{Y_LIST, Y_LEAF_LIST, 0, NMAX},
{Y_LIST, Y_LIST, 0, NMAX},
{Y_LIST, Y_MAX_ELEMENTS, 0, 1},
{Y_LIST, Y_MIN_ELEMENTS, 0, 1},
{Y_LIST, Y_MUST, 0, NMAX},
{Y_LIST, Y_NOTIFICATION, 0, NMAX},
{Y_LIST, Y_ORDERED_BY, 0, 1},
{Y_LIST, Y_REFERENCE, 0, 1},
{Y_LIST, Y_STATUS, 0, 1},
{Y_LIST, Y_TYPEDEF, 0, NMAX},
{Y_LIST, Y_UNIQUE, 0, NMAX},
{Y_LIST, Y_USES, 0, NMAX},
{Y_LIST, Y_WHEN, 0,1},
{Y_MODULE, Y_ANYDATA, 0, NMAX},
{Y_MODULE, Y_ANYXML, 0, NMAX},
{Y_MODULE, Y_AUGMENT, 0, NMAX},
@ -134,17 +345,115 @@ static const struct ycard yclist[] = {
{Y_MODULE, Y_RPC, 0, NMAX},
{Y_MODULE, Y_TYPEDEF, 0, NMAX},
{Y_MODULE, Y_USES, 0, NMAX},
{Y_MODULE, Y_YANG_VERSION, 0, 1},
{Y_MODULE, Y_YANG_VERSION, 0, 1},
{Y_MUST, Y_DESCRIPTION, 0, 1},
{Y_MUST, Y_ERROR_APP_TAG, 0, 1},
{Y_MUST, Y_ERROR_MESSAGE, 0, 1},
{Y_MUST, Y_REFERENCE, 0, 1},
{Y_NOTIFICATION, Y_ANYDATA, 0, NMAX},
{Y_NOTIFICATION, Y_ANYXML, 0, NMAX},
{Y_NOTIFICATION, Y_CHOICE, 0, NMAX},
{Y_NOTIFICATION, Y_CONTAINER, 0, NMAX},
{Y_NOTIFICATION, Y_DESCRIPTION, 0, 1},
{Y_NOTIFICATION, Y_GROUPING, 0, NMAX},
{Y_NOTIFICATION, Y_IF_FEATURE, 0, NMAX},
{Y_NOTIFICATION, Y_LEAF, 0, NMAX},
{Y_NOTIFICATION, Y_LEAF_LIST, 0, NMAX},
{Y_NOTIFICATION, Y_LIST, 0, NMAX},
{Y_NOTIFICATION, Y_MUST, 0, NMAX},
{Y_NOTIFICATION, Y_REFERENCE, 0, 1},
{Y_NOTIFICATION, Y_STATUS, 0, 1},
{Y_NOTIFICATION, Y_TYPEDEF, 0, NMAX},
{Y_NOTIFICATION, Y_USES, 0, NMAX},
{Y_OUTPUT, Y_ANYDATA, 0, NMAX},
{Y_OUTPUT, Y_ANYXML, 0, NMAX},
{Y_OUTPUT, Y_CHOICE, 0, NMAX},
{Y_OUTPUT, Y_CONTAINER, 0, NMAX},
{Y_OUTPUT, Y_GROUPING, 0, NMAX},
{Y_OUTPUT, Y_LEAF, 0, NMAX},
{Y_OUTPUT, Y_LEAF_LIST, 0, NMAX},
{Y_OUTPUT, Y_LIST, 0, NMAX},
{Y_OUTPUT, Y_MUST, 0, NMAX},
{Y_OUTPUT, Y_TYPEDEF, 0, NMAX},
{Y_OUTPUT, Y_USES, 0, NMAX},
{Y_PATTERN, Y_DESCRIPTION, 0, 1},
{Y_PATTERN, Y_ERROR_APP_TAG, 0, 1},
{Y_PATTERN, Y_ERROR_MESSAGE, 0, 1},
{Y_PATTERN, Y_MODIFIER, 0, 1},
{Y_PATTERN, Y_REFERENCE, 0, 1},
{Y_RANGE, Y_DESCRIPTION, 0, 1},
{Y_RANGE, Y_ERROR_APP_TAG, 0, 1},
{Y_RANGE, Y_ERROR_MESSAGE, 0, 1},
{Y_RANGE, Y_REFERENCE, 0, 1},
{Y_REVISION, Y_DESCRIPTION, 0, 1},
{Y_REVISION, Y_REFERENCE, 0, 1},
{Y_RPC, Y_DESCRIPTION, 0, 1},
{Y_RPC, Y_GROUPING, 0, NMAX},
{Y_RPC, Y_IF_FEATURE, 0, NMAX},
{Y_RPC, Y_INPUT, 0, 1},
{Y_RPC, Y_OUTPUT, 0, 1},
{Y_RPC, Y_REFERENCE, 0, 1},
{Y_RPC, Y_STATUS, 0, 1},
{Y_RPC, Y_TYPEDEF, 0, NMAX},
{Y_SUBMODULE, Y_ANYDATA, 0, NMAX},
{Y_SUBMODULE, Y_AUGMENT, 0, NMAX},
{Y_SUBMODULE, Y_BELONGS_TO, 1, 1},
{Y_SUBMODULE, Y_CHOICE, 0, NMAX},
{Y_SUBMODULE, Y_CONTACT, 0, 1},
{Y_SUBMODULE, Y_CONTAINER, 0, NMAX},
{Y_SUBMODULE, Y_DESCRIPTION,0, 1},
{Y_SUBMODULE, Y_DEVIATION, 0, NMAX},
{Y_SUBMODULE, Y_EXTENSION, 0, NMAX},
{Y_SUBMODULE, Y_FEATURE, 0, NMAX},
{Y_SUBMODULE, Y_GROUPING, 0, NMAX},
{Y_SUBMODULE, Y_IDENTITY, 0, NMAX},
{Y_SUBMODULE, Y_IMPORT, 0, NMAX},
{Y_SUBMODULE, Y_INCLUDE, 0, NMAX},
{Y_SUBMODULE, Y_LEAF, 0, NMAX},
{Y_SUBMODULE, Y_LEAF_LIST, 0, NMAX},
{Y_SUBMODULE, Y_LIST, 0, NMAX},
{Y_SUBMODULE, Y_NOTIFICATION,0, NMAX},
{Y_SUBMODULE, Y_ORGANIZATION,0, 1},
{Y_SUBMODULE, Y_REFERENCE, 0, 1},
{Y_SUBMODULE, Y_REVISION, 0, NMAX},
{Y_SUBMODULE, Y_RPC, 0, NMAX},
{Y_SUBMODULE, Y_TYPEDEF, 0, NMAX},
{Y_SUBMODULE, Y_USES, 0, NMAX},
{Y_SUBMODULE, Y_YANG_VERSION,0, 1}, /* "yang-version" statement is mandatory in YANG version "1.1". */
{Y_TYPE, Y_BASE, 0, NMAX},
{Y_TYPE, Y_BIT, 0, NMAX},
{Y_TYPE, Y_ENUM, 0, NMAX},
{Y_TYPE, Y_FRACTION_DIGITS, 0, 1},
{Y_TYPE, Y_LENGTH, 0, 1},
{Y_TYPE, Y_PATH, 0, 1},
{Y_TYPE, Y_PATTERN, 0, NMAX},
{Y_TYPE, Y_RANGE, 0, 1},
{Y_TYPE, Y_REQUIRE_INSTANCE, 0, 1},
{Y_TYPE, Y_TYPE, 0, NMAX},
{Y_TYPEDEF, Y_DEFAULT, 0, 1},
{Y_TYPEDEF, Y_DESCRIPTION,0, 1},
{Y_TYPEDEF, Y_REFERENCE, 0, 1},
{Y_TYPEDEF, Y_STATUS, 0, 1},
{Y_TYPEDEF, Y_TYPE, 1, 1},
{Y_TYPEDEF, Y_UNITS, 0, 1},
{Y_USES, Y_AUGMENT, 0, NMAX},
{Y_USES, Y_DESCRIPTION, 0, 1},
{Y_USES, Y_IF_FEATURE, 0, NMAX},
{Y_USES, Y_REFERENCE, 0, 1},
{Y_USES, Y_REFINE, 0, NMAX},
{Y_USES, Y_STATUS, 0, 1},
{Y_USES, Y_WHEN, 0, 1},
{0,}
};
/*! Find yang parent and child combination in yang cardinality table
* @param[in] parent Parent Yang spec
* @param[in] child Child yang spec if -1 first
* @param[in] child Child yang spec if 0 first
* @param[in] yc Yang cardinality map
* @param[in] p If set, quit as soon as parents dont match
* @retval NULL Not found
* @retval yp Found
* @note if cardinal list above is sorted, this search could do binary
*/
static const struct ycard *
ycard_find(enum rfc_6020 parent,
@ -202,6 +511,7 @@ yang_cardinality(clicon_handle h,
ck = ys->ys_keyword;
if (ck == Y_UNKNOWN) /* special case */
continue;
/* Find entry in yang cardinality table from parent/child keyword pair */
if ((yc = ycard_find(pk, ck, ycplist, 1)) == NULL){
clicon_err(OE_YANG, 0, "%s: \"%s\" is child of \"%s\", but should not be",
modname, yang_key2str(ck), yang_key2str(pk));
@ -231,7 +541,7 @@ yang_cardinality(clicon_handle h,
}
}
if (0) { /* Notyet */
if (1) { /* Notyet */
/* 4) Recurse */
i = 0;
while (i<yt->ys_len){ /* Note, children may be removed */