diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ba31513..6e81c6d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,9 @@ Expected: June 2021 * See [yang uses's substatement when has no effect #218](https://github.com/clicon/clixon/issues/218) * YANG deviation [deviation statement not yet support #211](https://github.com/clicon/clixon/issues/211) * See RFC7950 Sec 5.6.3 - +* Added ordering sanity check for YANG modules and sub-modules + * If YANG sub-statements are placed in wrong order, clixon fails on error. + ### API changes on existing protocol/config features Users may have to change how they access the system diff --git a/lib/src/clixon_yang_cardinality.c b/lib/src/clixon_yang_cardinality.c index 99e39a2b..b783dcd4 100644 --- a/lib/src/clixon_yang_cardinality.c +++ b/lib/src/clixon_yang_cardinality.c @@ -33,6 +33,7 @@ ***** END LICENSE BLOCK ***** * Yang cardinality functions according to RFC 7950 + * That is, how many children any yang node has */ #ifdef HAVE_CONFIG_H @@ -69,28 +70,36 @@ /* * Types */ -/* Encode cardinality according to RFC 7950 +/* Encode cardinality and ordering according to RFC 7950 * Example: - * 7.20.3.1. The deviation's Substatements - * - * +--------------+----------+-------------+ - * | substatement | section | cardinality | - * +--------------+----------+-------------+ - * | description | 7.21.3 | 0..1 | - * | deviate | 7.20.3.2 | 1..n | - * | reference | 7.21.4 | 0..1 | - * +--------------+----------+-------------+ + * 7.1.1. The module's Substatements (subset) + * +--------------+----------+-------------+----------+ + * | substatement | section | cardinality | ordering | + * +--------------+----------+-------------+----------+ + * | contact | 7.1.8 | 0..1 | 2 | + * | import | 7.1.5 | 0..n | 1 | + * | include | 7.1.6 | 0..n | 1 | + * | namespace | 7.1.3 | 1 | 0 | + * | organization | 7.1.7 | 0..1 | 2 | + * | yang-version | 7.1.2 | 1 | 0 | + * +--------------+----------+-------------+----------+ * The cardinalities are (and how many time they occur) * 0..1 149 See ycardmap_01 * 1..n, 1 * 0..n 176 (no restrictions) * 1 10 + * + * Ordering means in which order the statements may occur. If same ordering the may occur + * in any order. In the example above, namespace and yang-version occurs before + * import and include which in turn preceedes contact and organization + * Note: order is only relevant for modules and sub-modules */ struct ycard{ enum rfc_6020 yc_parent; enum rfc_6020 yc_child; int yc_min; int yc_max; + int yc_order; }; /* @@ -107,341 +116,341 @@ 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}, - {Y_MODULE, Y_CHOICE, 0, NMAX}, - {Y_MODULE, Y_CONTACT, 0, 1}, - {Y_MODULE, Y_CONTAINER, 0, NMAX}, - {Y_MODULE, Y_DESCRIPTION, 0, 1}, - {Y_MODULE, Y_DEVIATION, 0, NMAX}, - {Y_MODULE, Y_EXTENSION, 0, NMAX}, - {Y_MODULE, Y_FEATURE, 0, NMAX}, - {Y_MODULE, Y_GROUPING, 0, NMAX}, - {Y_MODULE, Y_IDENTITY, 0, NMAX}, - {Y_MODULE, Y_IMPORT, 0, NMAX}, - {Y_MODULE, Y_INCLUDE, 0, NMAX}, - {Y_MODULE, Y_LEAF, 0, NMAX}, - {Y_MODULE, Y_LEAF_LIST, 0, NMAX}, - {Y_MODULE, Y_LIST, 0, NMAX}, - {Y_MODULE, Y_NAMESPACE, 1, 1}, - {Y_MODULE, Y_NOTIFICATION, 0, NMAX}, - {Y_MODULE, Y_ORGANIZATION, 0, 1}, - {Y_MODULE, Y_PREFIX, 1, 1}, - {Y_MODULE, Y_REFERENCE, 0, 1}, - {Y_MODULE, Y_REVISION, 0, NMAX}, - {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_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}, + {Y_ACTION, Y_DESCRIPTION, 0, 1, 0}, + {Y_ACTION, Y_GROUPING, 0, NMAX, 0}, + {Y_ACTION, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_ACTION, Y_INPUT, 0, 1, 0}, + {Y_ACTION, Y_OUTPUT, 0, 1, 0}, + {Y_ACTION, Y_REFERENCE, 0, 1, 0}, + {Y_ACTION, Y_STATUS, 0, 1, 0}, + {Y_ACTION, Y_TYPEDEF, 0, NMAX, 0}, + {Y_ANYDATA, Y_CONFIG, 0, 1, 0}, + {Y_ANYDATA, Y_DESCRIPTION, 0, 1, 0}, + {Y_ANYDATA, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_ANYDATA, Y_MANDATORY, 0, 1, 0}, + {Y_ANYDATA, Y_MUST, 0, NMAX, 0}, + {Y_ANYDATA, Y_REFERENCE, 0, 1, 0}, + {Y_ANYDATA, Y_STATUS, 0, 1, 0}, + {Y_ANYDATA, Y_WHEN, 0, 1, 0}, + {Y_ANYXML, Y_CONFIG, 0, 1, 0}, + {Y_ANYXML, Y_DESCRIPTION, 0, 1, 0}, + {Y_ANYXML, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_ANYXML, Y_MANDATORY, 0, 1, 0}, + {Y_ANYXML, Y_MUST, 0, NMAX, 0}, + {Y_ANYXML, Y_REFERENCE, 0, 1, 0}, + {Y_ANYXML, Y_STATUS, 0, 1, 0}, + {Y_ANYXML, Y_WHEN, 0, 1, 0}, + {Y_ARGUMENT, Y_YIN_ELEMENT, 0, 1, 0}, + {Y_AUGMENT, Y_ACTION, 0, NMAX, 0}, + {Y_AUGMENT, Y_ANYDATA, 0, NMAX, 0}, + {Y_AUGMENT, Y_ANYXML, 0, NMAX, 0}, + {Y_AUGMENT, Y_CASE, 0, NMAX, 0}, + {Y_AUGMENT, Y_CHOICE, 0, NMAX, 0}, + {Y_AUGMENT, Y_CONTAINER, 0, NMAX, 0}, + {Y_AUGMENT, Y_DESCRIPTION, 0, 1, 0}, + {Y_AUGMENT, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_AUGMENT, Y_LEAF, 0, NMAX, 0}, + {Y_AUGMENT, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_AUGMENT, Y_LIST, 0, NMAX, 0}, + {Y_AUGMENT, Y_NOTIFICATION, 0, NMAX, 0}, + {Y_AUGMENT, Y_REFERENCE, 0, 1, 0}, + {Y_AUGMENT, Y_STATUS, 0, 1, 0}, + {Y_AUGMENT, Y_USES, 0, NMAX, 0}, + {Y_AUGMENT, Y_WHEN, 0, 1, 0}, + {Y_BELONGS_TO, Y_PREFIX, 1, 1, 0}, + {Y_BIT, Y_DESCRIPTION, 0, 1, 0}, + {Y_BIT, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_BIT, Y_POSITION, 0, 1, 0}, + {Y_BIT, Y_REFERENCE, 0, 1, 0}, + {Y_BIT, Y_STATUS, 0, 1, 0}, + {Y_CASE, Y_ANYDATA, 0, NMAX, 0}, + {Y_CASE, Y_ANYXML, 0, NMAX, 0}, + {Y_CASE, Y_CHOICE, 0, NMAX, 0}, + {Y_CASE, Y_CONTAINER, 0, NMAX, 0}, + {Y_CASE, Y_DESCRIPTION, 0, 1, 0}, + {Y_CASE, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_CASE, Y_LEAF, 0, NMAX, 0}, + {Y_CASE, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_CASE, Y_LIST, 0, NMAX, 0}, + {Y_CASE, Y_REFERENCE, 0, 1, 0}, + {Y_CASE, Y_STATUS, 0, 1, 0}, + {Y_CASE, Y_USES, 0, NMAX, 0}, + {Y_CASE, Y_WHEN, 0, 1, 0}, + {Y_CHOICE, Y_ANYXML, 0, NMAX, 0}, + {Y_CHOICE, Y_CASE, 0, NMAX, 0}, + {Y_CHOICE, Y_CHOICE, 0, NMAX, 0}, + {Y_CHOICE, Y_CONFIG, 0, 1, 0}, + {Y_CHOICE, Y_CONTAINER, 0, NMAX, 0}, + {Y_CHOICE, Y_DEFAULT, 0, 1, 0}, + {Y_CHOICE, Y_DESCRIPTION, 0, 1, 0}, + {Y_CHOICE, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_CHOICE, Y_LEAF, 0, NMAX, 0}, + {Y_CHOICE, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_CHOICE, Y_LIST, 0, NMAX, 0}, + {Y_CHOICE, Y_MANDATORY, 0, 1, 0}, + {Y_CHOICE, Y_REFERENCE, 0, 1, 0}, + {Y_CHOICE, Y_STATUS, 0, 1, 0}, + {Y_CHOICE, Y_WHEN, 0, 1, 0}, + {Y_CHOICE, Y_ANYDATA, 0, NMAX, 0}, + {Y_CONTAINER, Y_ACTION, 0, NMAX, 0}, + {Y_CONTAINER, Y_ANYDATA, 0, NMAX, 0}, + {Y_CONTAINER, Y_ANYXML, 0, NMAX, 0}, + {Y_CONTAINER, Y_CHOICE, 0, NMAX, 0}, + {Y_CONTAINER, Y_CONFIG, 0, 1, 0}, + {Y_CONTAINER, Y_CONTAINER, 0, NMAX, 0}, + {Y_CONTAINER, Y_DESCRIPTION, 0, 1, 0}, + {Y_CONTAINER, Y_GROUPING, 0, NMAX, 0}, + {Y_CONTAINER, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_CONTAINER, Y_LEAF, 0, NMAX, 0}, + {Y_CONTAINER, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_CONTAINER, Y_LIST, 0, NMAX, 0}, + {Y_CONTAINER, Y_MUST, 0, NMAX, 0}, + {Y_CONTAINER, Y_NOTIFICATION, 0, NMAX, 0}, + {Y_CONTAINER, Y_PRESENCE, 0, 1, 0}, + {Y_CONTAINER, Y_REFERENCE, 0, 1, 0}, + {Y_CONTAINER, Y_STATUS, 0, 1, 0}, + {Y_CONTAINER, Y_TYPEDEF, 0, NMAX, 0}, + {Y_CONTAINER, Y_USES, 0, NMAX, 0}, + {Y_CONTAINER, Y_WHEN, 0, 1, 0}, + {Y_DEVIATE, Y_CONFIG, 0, 1, 0}, + {Y_DEVIATE, Y_DEFAULT, 0, NMAX, 0}, + {Y_DEVIATE, Y_MANDATORY, 0, 1, 0}, + {Y_DEVIATE, Y_MAX_ELEMENTS, 0, 1, 0}, + {Y_DEVIATE, Y_MIN_ELEMENTS, 0, 1, 0}, + {Y_DEVIATE, Y_MUST, 0, NMAX, 0}, + {Y_DEVIATE, Y_TYPE, 0, 1, 0}, + {Y_DEVIATE, Y_UNIQUE, 0, NMAX, 0}, + {Y_DEVIATE, Y_UNITS, 0, 1, 0}, + {Y_DEVIATION, Y_DESCRIPTION, 0, 1, 0}, + {Y_DEVIATION, Y_DEVIATE, 1, NMAX, 0}, + {Y_DEVIATION, Y_REFERENCE, 0, 1, 0}, + {Y_ENUM, Y_DESCRIPTION, 0, 1, 0}, + {Y_ENUM, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_ENUM, Y_REFERENCE, 0, 1, 0}, + {Y_ENUM, Y_STATUS, 0, 1, 0}, + {Y_ENUM, Y_VALUE, 0, 1, 0}, + {Y_EXTENSION, Y_ARGUMENT, 0, 1, 0}, + {Y_EXTENSION, Y_DESCRIPTION, 0, 1, 0}, + {Y_EXTENSION, Y_REFERENCE, 0, 1, 0}, + {Y_EXTENSION, Y_STATUS, 0, 1, 0}, + {Y_FEATURE, Y_DESCRIPTION, 0, 1, 0}, + {Y_FEATURE, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_FEATURE, Y_REFERENCE, 0, 1, 0}, + {Y_FEATURE, Y_STATUS, 0, 1, 0}, + {Y_GROUPING, Y_ACTION, 0, NMAX, 0}, + {Y_GROUPING, Y_ANYDATA, 0, NMAX, 0}, + {Y_GROUPING, Y_ANYXML, 0, NMAX, 0}, + {Y_GROUPING, Y_CHOICE, 0, NMAX, 0}, + {Y_GROUPING, Y_CONTAINER, 0, NMAX, 0}, + {Y_GROUPING, Y_DESCRIPTION, 0, 1, 0}, + {Y_GROUPING, Y_GROUPING, 0, NMAX, 0}, + {Y_GROUPING, Y_LEAF, 0, NMAX, 0}, + {Y_GROUPING, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_GROUPING, Y_LIST, 0, NMAX, 0}, + {Y_GROUPING, Y_NOTIFICATION, 0, NMAX, 0}, + {Y_GROUPING, Y_REFERENCE, 0, 1, 0}, + {Y_GROUPING, Y_STATUS, 0, 1, 0}, + {Y_GROUPING, Y_TYPEDEF, 0, NMAX, 0}, + {Y_GROUPING, Y_USES, 0, NMAX, 0}, + {Y_IDENTITY, Y_BASE, 0, NMAX, 0}, + {Y_IDENTITY, Y_DESCRIPTION, 0, 1, 0}, + {Y_IDENTITY, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_IDENTITY, Y_REFERENCE, 0, 1, 0}, + {Y_IDENTITY, Y_STATUS, 0, 1, 0}, + {Y_IMPORT, Y_DESCRIPTION, 0, 1, 0}, + {Y_IMPORT, Y_PREFIX, 1, 1, 0}, + {Y_IMPORT, Y_REFERENCE, 0, 1, 0}, + {Y_IMPORT, Y_REVISION_DATE,0, 1, 0}, + {Y_INCLUDE, Y_DESCRIPTION, 0, 1, 0}, + {Y_INCLUDE, Y_REFERENCE, 0, 1, 0}, + {Y_INCLUDE, Y_REVISION_DATE,0, 1, 0}, + {Y_INPUT, Y_ANYDATA, 0, NMAX, 0}, + {Y_INPUT, Y_ANYXML, 0, NMAX, 0}, + {Y_INPUT, Y_CHOICE, 0, NMAX, 0}, + {Y_INPUT, Y_CONTAINER, 0, NMAX, 0}, + {Y_INPUT, Y_GROUPING, 0, NMAX, 0}, + {Y_INPUT, Y_LEAF, 0, NMAX, 0}, + {Y_INPUT, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_INPUT, Y_LIST, 0, NMAX, 0}, + {Y_INPUT, Y_MUST, 0, NMAX, 0}, + {Y_INPUT, Y_TYPEDEF, 0, NMAX, 0}, + {Y_INPUT, Y_USES, 0, NMAX, 0}, + {Y_LEAF, Y_CONFIG, 0, 1, 0}, + {Y_LEAF, Y_DEFAULT, 0, 1, 0}, + {Y_LEAF, Y_DESCRIPTION, 0, 1, 0}, + {Y_LEAF, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_LEAF, Y_MANDATORY, 0, 1, 0}, + {Y_LEAF, Y_MUST, 0, NMAX, 0}, + {Y_LEAF, Y_REFERENCE, 0, 1, 0}, + {Y_LEAF, Y_STATUS, 0, 1, 0}, + {Y_LEAF, Y_TYPE, 1, 1, 0}, + {Y_LEAF, Y_UNITS, 0, 1, 0}, + {Y_LEAF, Y_WHEN, 0, 1, 0}, + {Y_LEAF_LIST, Y_CONFIG, 0, 1, 0}, + {Y_LEAF_LIST, Y_DEFAULT, 0, NMAX, 0}, + {Y_LEAF_LIST, Y_DESCRIPTION, 0, 1, 0}, + {Y_LEAF_LIST, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_LEAF_LIST, Y_MAX_ELEMENTS, 0, 1, 0}, + {Y_LEAF_LIST, Y_MIN_ELEMENTS, 0, 1, 0}, + {Y_LEAF_LIST, Y_MUST, 0, NMAX, 0}, + {Y_LEAF_LIST, Y_ORDERED_BY, 0, 1, 0}, + {Y_LEAF_LIST, Y_REFERENCE, 0, 1, 0}, + {Y_LEAF_LIST, Y_STATUS, 0, 1, 0}, + {Y_LEAF_LIST, Y_TYPE, 1, 1, 0}, + {Y_LEAF_LIST, Y_UNITS, 0, 1, 0}, + {Y_LEAF_LIST, Y_WHEN, 0, 1, 0}, + {Y_LENGTH, Y_DESCRIPTION, 0, 1, 0}, + {Y_LENGTH, Y_ERROR_APP_TAG, 0, 1, 0}, + {Y_LENGTH, Y_ERROR_MESSAGE, 0, 1, 0}, + {Y_LENGTH, Y_REFERENCE, 0, 1, 0}, + {Y_LIST, Y_ACTION, 0, NMAX, 0}, + {Y_LIST, Y_ANYDATA, 0, NMAX, 0}, + {Y_LIST, Y_ANYXML, 0, NMAX, 0}, + {Y_LIST, Y_CHOICE, 0, NMAX, 0}, + {Y_LIST, Y_CONFIG, 0, 1, 0}, + {Y_LIST, Y_CONTAINER, 0, NMAX, 0}, + {Y_LIST, Y_DESCRIPTION, 0, 1, 0}, + {Y_LIST, Y_GROUPING, 0, NMAX, 0}, + {Y_LIST, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_LIST, Y_KEY, 0, 1, 0}, + {Y_LIST, Y_LEAF, 0, NMAX, 0}, + {Y_LIST, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_LIST, Y_LIST, 0, NMAX, 0}, + {Y_LIST, Y_MAX_ELEMENTS, 0, 1, 0}, + {Y_LIST, Y_MIN_ELEMENTS, 0, 1, 0}, + {Y_LIST, Y_MUST, 0, NMAX, 0}, + {Y_LIST, Y_NOTIFICATION, 0, NMAX, 0}, + {Y_LIST, Y_ORDERED_BY, 0, 1, 0}, + {Y_LIST, Y_REFERENCE, 0, 1, 0}, + {Y_LIST, Y_STATUS, 0, 1, 0}, + {Y_LIST, Y_TYPEDEF, 0, NMAX, 0}, + {Y_LIST, Y_UNIQUE, 0, NMAX, 0}, + {Y_LIST, Y_USES, 0, NMAX, 0}, + {Y_LIST, Y_WHEN, 0,1, 0}, + {Y_MODULE, Y_ANYDATA, 0, NMAX, 4}, + {Y_MODULE, Y_ANYXML, 0, NMAX, 4}, + {Y_MODULE, Y_AUGMENT, 0, NMAX, 4}, + {Y_MODULE, Y_CHOICE, 0, NMAX, 4}, + {Y_MODULE, Y_CONTACT, 0, 1, 2}, + {Y_MODULE, Y_CONTAINER, 0, NMAX, 4}, + {Y_MODULE, Y_DESCRIPTION, 0, 1, 2}, + {Y_MODULE, Y_DEVIATION, 0, NMAX, 4}, + {Y_MODULE, Y_EXTENSION, 0, NMAX, 4}, + {Y_MODULE, Y_FEATURE, 0, NMAX, 4}, + {Y_MODULE, Y_GROUPING, 0, NMAX, 4}, + {Y_MODULE, Y_IDENTITY, 0, NMAX, 4}, + {Y_MODULE, Y_IMPORT, 0, NMAX, 1}, + {Y_MODULE, Y_INCLUDE, 0, NMAX, 1}, + {Y_MODULE, Y_LEAF, 0, NMAX, 4}, + {Y_MODULE, Y_LEAF_LIST, 0, NMAX, 4}, + {Y_MODULE, Y_LIST, 0, NMAX, 4}, + {Y_MODULE, Y_NAMESPACE, 1, 1, 0}, + {Y_MODULE, Y_NOTIFICATION, 0, NMAX, 4}, + {Y_MODULE, Y_ORGANIZATION, 0, 1, 2}, + {Y_MODULE, Y_PREFIX, 1, 1, 0}, + {Y_MODULE, Y_REFERENCE, 0, 1, 2}, + {Y_MODULE, Y_REVISION, 0, NMAX, 3}, + {Y_MODULE, Y_RPC, 0, NMAX, 4}, + {Y_MODULE, Y_TYPEDEF, 0, NMAX, 4}, + {Y_MODULE, Y_USES, 0, NMAX, 4}, + {Y_MODULE, Y_YANG_VERSION, 0, 1, 0}, + {Y_MUST, Y_DESCRIPTION, 0, 1, 0}, + {Y_MUST, Y_ERROR_APP_TAG, 0, 1, 0}, + {Y_MUST, Y_ERROR_MESSAGE, 0, 1, 0}, + {Y_MUST, Y_REFERENCE, 0, 1, 0}, + {Y_NOTIFICATION, Y_ANYDATA, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_ANYXML, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_CHOICE, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_CONTAINER, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_DESCRIPTION, 0, 1, 0}, + {Y_NOTIFICATION, Y_GROUPING, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_LEAF, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_LIST, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_MUST, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_REFERENCE, 0, 1, 0}, + {Y_NOTIFICATION, Y_STATUS, 0, 1, 0}, + {Y_NOTIFICATION, Y_TYPEDEF, 0, NMAX, 0}, + {Y_NOTIFICATION, Y_USES, 0, NMAX, 0}, + {Y_OUTPUT, Y_ANYDATA, 0, NMAX, 0}, + {Y_OUTPUT, Y_ANYXML, 0, NMAX, 0}, + {Y_OUTPUT, Y_CHOICE, 0, NMAX, 0}, + {Y_OUTPUT, Y_CONTAINER, 0, NMAX, 0}, + {Y_OUTPUT, Y_GROUPING, 0, NMAX, 0}, + {Y_OUTPUT, Y_LEAF, 0, NMAX, 0}, + {Y_OUTPUT, Y_LEAF_LIST, 0, NMAX, 0}, + {Y_OUTPUT, Y_LIST, 0, NMAX, 0}, + {Y_OUTPUT, Y_MUST, 0, NMAX, 0}, + {Y_OUTPUT, Y_TYPEDEF, 0, NMAX, 0}, + {Y_OUTPUT, Y_USES, 0, NMAX, 0}, + {Y_PATTERN, Y_DESCRIPTION, 0, 1, 0}, + {Y_PATTERN, Y_ERROR_APP_TAG, 0, 1, 0}, + {Y_PATTERN, Y_ERROR_MESSAGE, 0, 1, 0}, + {Y_PATTERN, Y_MODIFIER, 0, 1, 0}, + {Y_PATTERN, Y_REFERENCE, 0, 1, 0}, + {Y_RANGE, Y_DESCRIPTION, 0, 1, 0}, + {Y_RANGE, Y_ERROR_APP_TAG, 0, 1, 0}, + {Y_RANGE, Y_ERROR_MESSAGE, 0, 1, 0}, + {Y_RANGE, Y_REFERENCE, 0, 1, 0}, + {Y_REVISION, Y_DESCRIPTION, 0, 1, 0}, + {Y_REVISION, Y_REFERENCE, 0, 1, 0}, + {Y_RPC, Y_DESCRIPTION, 0, 1, 0}, + {Y_RPC, Y_GROUPING, 0, NMAX, 0}, + {Y_RPC, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_RPC, Y_INPUT, 0, 1, 0}, + {Y_RPC, Y_OUTPUT, 0, 1, 0}, + {Y_RPC, Y_REFERENCE, 0, 1, 0}, + {Y_RPC, Y_STATUS, 0, 1, 0}, + {Y_RPC, Y_TYPEDEF, 0, NMAX, 0}, + {Y_SUBMODULE, Y_ANYDATA, 0, NMAX, 4}, + {Y_SUBMODULE, Y_AUGMENT, 0, NMAX, 4}, + {Y_SUBMODULE, Y_BELONGS_TO, 1, 1, 0}, + {Y_SUBMODULE, Y_CHOICE, 0, NMAX, 4}, + {Y_SUBMODULE, Y_CONTACT, 0, 1, 2}, + {Y_SUBMODULE, Y_CONTAINER, 0, NMAX, 4}, + {Y_SUBMODULE, Y_DESCRIPTION,0, 1, 2}, + {Y_SUBMODULE, Y_DEVIATION, 0, NMAX, 4}, + {Y_SUBMODULE, Y_EXTENSION, 0, NMAX, 4}, + {Y_SUBMODULE, Y_FEATURE, 0, NMAX, 4}, + {Y_SUBMODULE, Y_GROUPING, 0, NMAX, 4}, + {Y_SUBMODULE, Y_IDENTITY, 0, NMAX, 4}, + {Y_SUBMODULE, Y_IMPORT, 0, NMAX, 1}, + {Y_SUBMODULE, Y_INCLUDE, 0, NMAX, 1}, + {Y_SUBMODULE, Y_LEAF, 0, NMAX, 4}, + {Y_SUBMODULE, Y_LEAF_LIST, 0, NMAX, 4}, + {Y_SUBMODULE, Y_LIST, 0, NMAX, 4}, + {Y_SUBMODULE, Y_NOTIFICATION,0, NMAX, 4}, + {Y_SUBMODULE, Y_ORGANIZATION,0, 1, 2}, + {Y_SUBMODULE, Y_REFERENCE, 0, 1, 2}, + {Y_SUBMODULE, Y_REVISION, 0, NMAX, 3}, + {Y_SUBMODULE, Y_RPC, 0, NMAX, 4}, + {Y_SUBMODULE, Y_TYPEDEF, 0, NMAX, 4}, + {Y_SUBMODULE, Y_USES, 0, NMAX, 4}, + {Y_SUBMODULE, Y_YANG_VERSION,0, 1, 0}, /* "yang-version" statement is mandatory in YANG version "1.1". */ + {Y_TYPE, Y_BASE, 0, NMAX, 0}, + {Y_TYPE, Y_BIT, 0, NMAX, 0}, + {Y_TYPE, Y_ENUM, 0, NMAX, 0}, + {Y_TYPE, Y_FRACTION_DIGITS, 0, 1, 0}, + {Y_TYPE, Y_LENGTH, 0, 1, 0}, + {Y_TYPE, Y_PATH, 0, 1, 0}, + {Y_TYPE, Y_PATTERN, 0, NMAX, 0}, + {Y_TYPE, Y_RANGE, 0, 1, 0}, + {Y_TYPE, Y_REQUIRE_INSTANCE, 0, 1, 0}, + {Y_TYPE, Y_TYPE, 0, NMAX, 0}, + {Y_TYPEDEF, Y_DEFAULT, 0, 1, 0}, + {Y_TYPEDEF, Y_DESCRIPTION,0, 1, 0}, + {Y_TYPEDEF, Y_REFERENCE, 0, 1, 0}, + {Y_TYPEDEF, Y_STATUS, 0, 1, 0}, + {Y_TYPEDEF, Y_TYPE, 1, 1, 0}, + {Y_TYPEDEF, Y_UNITS, 0, 1, 0}, + {Y_USES, Y_AUGMENT, 0, NMAX, 0}, + {Y_USES, Y_DESCRIPTION, 0, 1, 0}, + {Y_USES, Y_IF_FEATURE, 0, NMAX, 0}, + {Y_USES, Y_REFERENCE, 0, 1, 0}, + {Y_USES, Y_REFINE, 0, NMAX, 0}, + {Y_USES, Y_STATUS, 0, 1, 0}, + {Y_USES, Y_WHEN, 0, 1, 0}, {0,} }; @@ -497,12 +506,17 @@ yang_cardinality(clicon_handle h, int nr; const struct ycard *ycplist; /* ycard parent table*/ const struct ycard *yc; + int order; + yang_stmt *yprev = NULL; pk = yang_keyword_get(yt); /* 0) Find parent sub-parts of cardinality vector */ if ((ycplist = ycard_find(pk, 0, yclist, 0)) == NULL) 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 + * Also: check monotonically increasing order + */ + order = 0; ys = NULL; while ((ys = yn_each(yt, ys)) != NULL) { ck = yang_keyword_get(ys); @@ -518,7 +532,21 @@ yang_cardinality(clicon_handle h, yang_argument_get(yt)); goto done; } - } + if (order > yc->yc_order){ + clicon_err(OE_YANG, 0, "%s: yang node \"%s\"(%s) which is child of \"%s\"(%s) is not in correct order (should not be after \"%s\"(%s))", + modname, + yang_key2str(ck), + yang_argument_get(ys), + yang_key2str(pk), + yang_argument_get(yt), + yang_key2str(yang_keyword_get(yprev)), + yang_argument_get(yprev)); + goto done; + } + if (order < yc->yc_order) + order = yc->yc_order; + yprev = ys; + } /* 2) For all in 1 and 1..n list, if 0 such children ->ERROR */ for (yc = &ycplist[0]; (int)yc->yc_parent == pk; yc++){ if (yc->yc_min && @@ -541,7 +569,7 @@ yang_cardinality(clicon_handle h, goto done; } } - + /* 4) Recurse */ i = 0; while (i< yang_len_get(yt)){ /* Note, children may be removed cant use yn_each */ diff --git a/test/test_augment.sh b/test/test_augment.sh index 360039d8..a25eaede 100755 --- a/test/test_augment.sh +++ b/test/test_augment.sh @@ -52,8 +52,8 @@ cat < $fyang2 module ietf-interfaces { yang-version 1.1; namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces"; - revision "2019-03-04"; prefix if; + revision "2019-03-04"; identity interface-type { description "Base identity from which specific interface types are @@ -110,10 +110,10 @@ module example-augment { yang-version 1.1; namespace "urn:example:augment"; prefix mymod; - revision "2019-03-04"; import ietf-interfaces { prefix if; } + revision "2019-03-04"; identity some-new-iftype { base if:interface-type; } diff --git a/test/test_augment_state.sh b/test/test_augment_state.sh index 2774cfe2..29e52c4a 100755 --- a/test/test_augment_state.sh +++ b/test/test_augment_state.sh @@ -35,8 +35,8 @@ cat < $fyang2 module example-lib { yang-version 1.1; namespace "urn:example:lib"; - revision "2019-03-04"; prefix lib; + revision "2019-03-04"; container global-state { config false; leaf gbds{ @@ -81,10 +81,10 @@ module example-augment { yang-version 1.1; namespace "urn:example:augment"; prefix aug; - revision "2020-09-25"; import example-lib { prefix lib; } + revision "2020-09-25"; /* Augments global state */ augment "/lib:global-state" { leaf gads{ diff --git a/test/test_augment_trans.sh b/test/test_augment_trans.sh index 07327b5b..0d497527 100755 --- a/test/test_augment_trans.sh +++ b/test/test_augment_trans.sh @@ -38,8 +38,8 @@ cat < $fyang module example-lib { yang-version 1.1; namespace "urn:example:lib"; - revision "2019-03-04"; prefix lib; + revision "2019-03-04"; container base-config { } /* No prefix */ @@ -61,10 +61,10 @@ module example-augment1 { yang-version 1.1; namespace "urn:example:augment1"; prefix aug1; - revision "2020-09-25"; import example-lib { prefix lib; } + revision "2020-09-25"; /* Augments config */ augment "/lib:base-config/lib:parameter" { container aug1{ @@ -80,13 +80,13 @@ module example-augment2 { yang-version 1.1; namespace "urn:example:augment2"; prefix aug2; - revision "2020-09-25"; import example-lib { prefix lib; } import example-augment1 { prefix aug1; } + revision "2020-09-25"; /* Augments config */ augment "/lib:base-config/lib:parameter/aug1:aug1" { /* when 'lib:name="foobar" and aug:aug1="foobar"'; */ diff --git a/test/test_datastore_repair.sh b/test/test_datastore_repair.sh index 4dee548f..d91751fe 100755 --- a/test/test_datastore_repair.sh +++ b/test/test_datastore_repair.sh @@ -37,8 +37,8 @@ EOF cat < $fyangA module A{ prefix a; - revision 2020-02-11; namespace "urn:example:a"; + revision 2020-02-11; container x { container y { } @@ -56,11 +56,11 @@ EOF cat < $fyangB module B{ prefix b; - revision 2020-02-11; namespace "urn:example:b"; import A { prefix "a"; } + revision 2020-02-11; augment "/a:x/a:y" { container z { leaf w { diff --git a/test/test_nacm_ext.sh b/test/test_nacm_ext.sh index 156e6cbf..99767820 100755 --- a/test/test_nacm_ext.sh +++ b/test/test_nacm_ext.sh @@ -46,10 +46,10 @@ cat < $fyang module nacm-example{ yang-version 1.1; namespace "urn:example:nacm"; + prefix nacm; import clixon-example { prefix ex; } - prefix nacm; container authentication { presence "To keep this from auto-expanding"; description "Example code for enabling www basic auth and some example diff --git a/test/test_type.sh b/test/test_type.sh index 77259fed..f6bb5082 100755 --- a/test/test_type.sh +++ b/test/test_type.sh @@ -47,9 +47,9 @@ module example3{ EOF cat < $fyang2 module example2{ - import example3 { prefix ex3; } namespace "urn:example:example2"; prefix ex2; + import example3 { prefix ex3; } grouping gr2 { leaf talle{ type ex3:t; diff --git a/test/test_union.sh b/test/test_union.sh index 61ca59b5..431d4c96 100755 --- a/test/test_union.sh +++ b/test/test_union.sh @@ -50,9 +50,9 @@ module example3{ EOF cat < $fyang2 module example2{ - import example3 { prefix ex3; } namespace "urn:example:example2"; prefix ex2; + import example3 { prefix ex3; } grouping gr2 { leaf talle{ type ex3:t; diff --git a/test/test_upgrade_checkold.sh b/test/test_upgrade_checkold.sh index b9289f7a..ac549169 100755 --- a/test/test_upgrade_checkold.sh +++ b/test/test_upgrade_checkold.sh @@ -44,8 +44,8 @@ EOF cat < $fyang2 module A{ prefix a; - revision 2021-01-01; namespace "urn:example:a"; + revision 2021-01-01; container upgraded{ } } @@ -95,8 +95,8 @@ for oldyang in true false; do cat < $fyang1 module A{ prefix a; - revision 2016-01-01; namespace "urn:example:a"; + revision 2016-01-01; container old{ } } diff --git a/test/test_upgrade_failsafe.sh b/test/test_upgrade_failsafe.sh index 35892d44..2a664627 100755 --- a/test/test_upgrade_failsafe.sh +++ b/test/test_upgrade_failsafe.sh @@ -38,8 +38,8 @@ fyangB=$dir/B@2019-01-01.yang cat < $fyangA0 module A{ prefix a; - revision 0814-01-28; namespace "urn:example:a"; + revision 0814-01-28; leaf a0{ type string; } @@ -53,9 +53,9 @@ EOF cat < $fyangA1 module A{ prefix a; + namespace "urn:example:a"; revision 2019-01-01; revision 0814-01-28; - namespace "urn:example:a"; /* leaf a0 has been removed */ leaf a1{ description "exists in both versions"; @@ -72,8 +72,8 @@ EOF cat < $fyangB module B{ prefix b; - revision 2019-01-01; namespace "urn:example:b"; + revision 2019-01-01; leaf b{ type string; } @@ -84,8 +84,8 @@ EOF cat < /dev/null module C{ prefix c; - revision 2019-01-01; namespace "urn:example:c"; + revision 2019-01-01; leaf c{ type string; } diff --git a/test/test_upgrade_module.sh b/test/test_upgrade_module.sh index 38d19c07..24ab59fa 100755 --- a/test/test_upgrade_module.sh +++ b/test/test_upgrade_module.sh @@ -46,8 +46,8 @@ touch $log cat < $fyangb module B{ prefix b; - revision 2016-01-01; namespace "urn:example:b"; + revision 2016-01-01; container dummy{ } } @@ -258,8 +258,8 @@ function testall() cat < $fyang module A{ prefix a; - revision 2016-01-01; namespace "urn:example:interfaces"; + revision 2016-01-01; container dummy{ } } diff --git a/test/test_upgrade_repair.sh b/test/test_upgrade_repair.sh index 4d3e6e32..728578eb 100755 --- a/test/test_upgrade_repair.sh +++ b/test/test_upgrade_repair.sh @@ -23,8 +23,8 @@ NEWXML='new version' cat < $fyangA0 module A{ prefix a; - revision 0814-01-28; namespace "urn:example:a"; + revision 0814-01-28; leaf a0{ type string; } @@ -38,9 +38,9 @@ EOF cat < $fyangA1 module A{ prefix a; + namespace "urn:example:a"; revision 2019-01-01; revision 0814-01-28; - namespace "urn:example:a"; /* leaf a0 has been removed */ leaf a1{ description "exists in both versions"; diff --git a/test/test_yang_load.sh b/test/test_yang_load.sh index e6465e73..d0f11062 100755 --- a/test/test_yang_load.sh +++ b/test/test_yang_load.sh @@ -22,9 +22,9 @@ fyang3=$dir/other.yang cat < $fyang1 module example{ prefix ex; + namespace "urn:example:clixon"; revision $NEWDATE; revision $OLDDATE; - namespace "urn:example:clixon"; leaf newex{ type string; } @@ -35,8 +35,8 @@ EOF cat < $fyang2 module example{ prefix ex; - revision $OLDDATE; namespace "urn:example:clixon"; + revision $OLDDATE; leaf oldex{ type string; } @@ -47,8 +47,8 @@ EOF cat < $fyang3 module other{ prefix oth; - revision $NEWDATE; namespace "urn:example:clixon2"; + revision $NEWDATE; leaf other{ type string; }