Reference: the CTLV specification language
Complete definition of the YAML inputs consumed by tools/ctlv.
1. Files
| Path | Role |
|---|---|
Documentation/ctlv/ctlv-schema.yaml | JSON Schema (draft 7) for a family specification. |
Documentation/ctlv/ctlv-registry-schema.yaml | JSON Schema for the family registry. |
Documentation/ctlv/generated-files-schema.yaml | JSON Schema for the output manifest. |
Documentation/ctlv/specs/<family>.yaml | Specification of one family. The file stem is the family name. |
Documentation/ctlv/families.yaml | Family registry. |
Documentation/ctlv/generated-files.yaml | Output manifest. |
Documentation/ctlv/abi/<family>.yaml | ABI snapshot of one family. |
Documentation/ctlv/abi/families.registry.yaml | ABI baseline of the registry. |
tools/ctlv/ctlvgen/cli.py | Validator, generator and checker entry point. |
tools/ctlv/ctlv-regen.sh | Regenerates or checks every manifest output. |
tools/ctlv/Makefile | Make targets. |
The specification of the root family ctlv is located relative to the meta-schema (specs/ctlv.yaml beside it). The specification of every other family is located in the directory of the specification being loaded.
Every registry entry has exactly one specification and one ABI snapshot. A specification or snapshot without a registry entry is an error.
2. Document syntax
YAML subset
Each file is a single YAML document whose top level is a mapping. The loader is yaml.SafeLoader with these additional rejections:
- aliases,
- anchors,
- merge keys,
- explicit tags,
- duplicate mapping keys,
- more than one document.
Required first line
The first line of a specification and of a registry is a comment matching #\s*SPDX-License-Identifier:\s*(\S.*?)\s*$. The captured identifier is the license of every generated file derived from the file.
Validation order
- YAML subset load.
- Meta-schema validation (syntax gate).
- Per-declaration normalization (
spec.py). - Chain resolution and cross-declaration checks (
semantics.py). - Generated-name collision check (
cgen.symbols).
Every unknown key is an error at every level (additionalProperties: false).
3. Names and selectors
| Kind | Pattern | Additional constraint |
|---|---|---|
| name | ^[a-z0-9]+(-[a-z0-9]+)*$ | |
| family name | name | At most 63 characters. |
| selector | ^[a-z0-9]+(-[a-z0-9]+)*(\.[a-z0-9]+(-[a-z0-9]+)*)?$ | At most one dot. |
A dot is reserved for selectors. A name does not contain one.
Selector forms
| Form | Selects |
|---|---|
group.attr | The one attr attr of group group. |
name (a group) | Every attr of the group, in declaration order, as required placements unless selected optionally. |
name (an attr set) | The required and optional members of the set. |
A selector without a dot is resolved as a group first and as an attr set second. Group names and attr set names share one namespace and are never equal. There are no tuple selectors and no family-qualified selectors.
A field typed selectors accepts one selector string or a non-empty array of selector strings.
Namespaces
| Namespace | Scope | Members |
|---|---|---|
| Definitions | Inheritance chain | enum names and flags names, together |
| Groups and sets | Inheritance chain | attr group names and attr set names, together |
| Attrs | One group | attr names |
| Ops | Inheritance chain | op names |
| Values | One enum or flags definition | value names |
Redeclaring a name in the same namespace is an error, except that a descendant declares an inherited stub attr set once to fill it (stubs).
4. family
Required. Mapping with these keys.
| Key | Type | Default | Definition |
|---|---|---|---|
name | family name | required | Registered name. Equals the file stem of the specification. |
inherits | family name | none | The single direct parent. |
pre-init | boolean | false | The family implements the generated pre-init callback, which translates its init information for its parent. Without it, the parent receives NULL. |
post-init | boolean | false | The family implements the generated post-init callback, run after every family priv is initialized. |
pre-fini | boolean | false | The family implements the generated pre-fini callback, run before any family priv is finalized. |
Rules
- The root family is named
ctlv, holds family ID 0, and does not declareinherits. - Every other family declares
inherits. - A family that inherits
Pis namedP-<suffix>with a non-empty suffix. - A parent is registered at a lower index than every family inheriting it.
- An inheritance cycle is an error.
- The effective schema of a family is the union of the declarations of its chain, root first. Inherited definitions keep their IDs.
pre-init,post-initandpre-finiare ABI snapshot members.
5. enums and flags
Each of enums and flags is an optional array with at least one element. An element is a mapping:
| Key | Type | Definition |
|---|---|---|
name | name | Definition name. |
values | array of name, at least one | Value names in declaration order. Names are unique within the definition. |
| enum | flags | |
|---|---|---|
| Numbering | From 1, in declaration order. 0 is reserved. | Bit 0 upward, in declaration order. |
| Maximum values | 4294967295 | 64 |
| Payload | Unsigned 64-bit | Unsigned 64-bit mask |
| Mutation | Append-only. | Append-only. |
An attr references a definition by name with enum or flags. The referenced definition is declared in the same family or an ancestor, and has the matching kind.
6. attr-groups
Optional array, 1 to 65535 elements per family. An element is a mapping:
| Key | Type | Definition |
|---|---|---|
name | name | Group name. Also the generated symbol prefix of its attrs. |
attrs | array of attr, 1 to 4294967295 | Attr declarations in ID order. Attr names are unique within the group. |
Attr keys
An attr declares name and exactly one primary form key out of type, enum, flags, attrs, blob. Zero or more than one primary form keys is an error.
| Key | Type | Applies to |
|---|---|---|
name | name | all |
type | uint | sint | bool | string | binary | primary form |
enum | name of an enum | primary form |
flags | name of a flags definition | primary form |
attrs | selectors | primary form (nest) |
blob | blob mapping | primary form |
max-occurrences | integer 1 to 4294967295, or unlimited | all |
min, max | integer | uint, sint |
unit, scale | unit, integer | uint, sint |
length | integer 0 to 4294967295 | binary |
min-length, max-length | integer 0 to 4294967295 | string, binary |
optional-attrs | selectors | nest |
recursive | true | nest |
A key that does not apply to the attr's form is an error. max-occurrences defaults to 1.
Payload forms
| Form | Payload | Maximum payload length |
|---|---|---|
uint, sint, enum, flags | 64-bit integer | 8 |
bool | One byte, 0 or 1 | 1 |
string | Characters and a terminating NUL | max-length + 1 |
binary | Bytes | max-length |
| nest | Child attrs | Sum of the children |
blob | Descriptor nest | 3 × 24 for backing va |
Integer attrs
| Key | Default | Definition |
|---|---|---|
min | type minimum | Inclusive lower bound. |
max | type maximum | Inclusive upper bound. |
unit | none | One of seconds, hertz, bytes, celsius. |
scale | 0 when unit is present | Decimal exponent, −128 to 127. Requires unit. |
| Type | Range |
|---|---|
uint | 0 to 18446744073709551615 |
sint | −9223372036854775808 to 9223372036854775807 |
min and max lie in the type's range, and min ≤ max.
String and binary attrs
| Form | Keys |
|---|---|
string | max-length is required. min-length defaults to 0. Lengths exclude the terminator. min-length ≤ max-length. |
binary | Either length alone, which sets minimum and maximum to the same value, or max-length with an optional min-length (default 0). length is not combined with min-length or max-length. One of length and max-length is required. min-length ≤ max-length. |
Nest attrs
| Key | Definition |
|---|---|
attrs | Selectors of the required members. |
optional-attrs | Selectors of the optional members. |
recursive | The nest may contain its own attr again at any depth. |
- A nest chain is at most 31 levels deep.
- A nesting cycle through non-recursive nests is an error.
Recursive nests
attrsholds exactly one selector.- That selector names an attr set. A group name and a
group.attrselector are errors. optional-attrsis not declared.- The named attr set selects the nest's own attr, directly or through nested attrs.
- A re-entry is reported by the node with
reentersand no members. - Only a query reply contains a recursive nest.
Blob attrs
| Key | Type | Default | Definition |
|---|---|---|---|
direction | input | output | inout | required | How the family uses the described memory. |
allowed-backings | non-empty unique array of va | required | Accepted backing types. va is the only value. |
max-length | integer 1 to 18446744073709551615 | required | Maximum external payload length. Independent of the inline message limit. |
alignment | integer 1 to 4294967295 | 1 | Required alignment of the described address or offset. |
alignmentis a power of two.max-lengthis a multiple ofalignment.- Only a request contains a blob attr.
7. attr-sets
Optional array. An element is a mapping:
| Key | Type | Definition |
|---|---|---|
name | name | Set name. |
stub | true | Declares an extension point. |
attrs | selectors | Required members. |
optional-attrs | selectors | Optional members. |
- A set is either a stub with no members, or has at least one member in
attrsoroptional-attrs. - A set selecting itself, directly or through other sets, is an error.
- Every set is expanded and checked whether or not an op selects it.
- Set IDs are assigned from 1 per family, in declaration order, counting only sets not filling an inherited stub.
Stubs
- A stub has no members and expands to nothing until filled.
- A descendant fills an inherited stub by declaring an attr set with the same name and at least one member.
- A fill is made at most once in an inheritance chain.
- A fill is not itself a stub.
- Only a stub is filled. A name already declared as a non-stub set by an ancestor is an error.
- The filled set keeps the ID given by the family that declared the stub.
- A fill contains no recursive attr.
- An attr set that a message root built by the core uses does not select a stub.
- A query reply that selects a stub does not also contain a re-entry.
8. ops
Optional array, at most 4294967295 elements per family. An element is a mapping:
| Key | Type | Default | Applies to | Definition |
|---|---|---|---|---|
name | name | required | all | Op name. |
type | action | query | event | required | all | An action is invoked once and does not fragment. A query may fragment its reply. An event is an unsolicited reply-only message. |
fd-access | read | read-write | read-write | action, query | read is executable through an observation fd. read-write requires a full-control fd. Events are always readable. |
availability | fixed | dynamic | fixed | action, query | dynamic permits the family to enable and disable the op per device. Every device starts with a dynamic op enabled. A disabled op remains in introspection and returns -EOPNOTSUPP. |
optional | boolean | false | action, query | When true, the op exists on a device only if family initialization opts in before publication. An op not opted in is absent from introspection. |
pre-post | boolean | false | action, query | The op has a generated pre/post hook pair implemented by its declaring family. Kernel implementation metadata, absent from UAPI and introspection. |
request | placements | root with no children | action, query | Request root. |
reply | placements | see below | all | Reply root. |
suggested-reply-length | integer 1 to 1048576 | see lengths | query | Initial reply buffer length. |
Placements
A mapping with at least one of the keys attrs and optional-attrs, each holding selectors. An empty mapping is an error.
Per-type rules
| action | query | event | |
|---|---|---|---|
request | allowed | allowed | not allowed |
reply omitted | acknowledgement only | not allowed | root with no children |
fd-access | allowed | allowed | not allowed |
availability | allowed | allowed | not allowed |
optional | allowed | allowed | not allowed |
pre-post | allowed | allowed | not allowed |
suggested-reply-length | not allowed | allowed | not allowed |
Message contexts
| Construct | request | action reply | query reply | event |
|---|---|---|---|---|
max-occurrences: unlimited | no | no | yes | no |
| re-entry of a recursive nest | no | no | yes | no |
| blob attr | yes | no | no | no |
9. Composition rules
Expansion of a selection
- A selection in
attrsyields required placements. A selection inoptional-attrsyields optional placements. - When an attr set or group is selected optionally, every member becomes optional.
- When one attr is selected more than once at one level, the selections merge into one placement. A required selection takes precedence over an optional one.
- Selecting one attr both through a filled stub set and outside it at one level is an error.
- After fills are composed, every attr ID at one nesting level has exactly one placement. A second placement is an error.
Stub selection
- A stub selected optionally makes every member of its fill optional.
- One reference is kept per stub selected at a level. A required reference takes precedence over an optional one.
Structural checks
- A selector that matches no attr, group or set is an error.
- The per-op request tree and reply tree are checked individually.
- The composed tree of each op (fills spliced in) is checked against the limits of section 12.
10. Identifiers
| Identifier | Value |
|---|---|
| Family ID | Zero-based index of the family name in families.yaml. |
| Group ID | 1-based position of the group in the family's attr-groups. |
| Local attr ID | 1-based position of the attr in its group. |
| Attr ID | (family ID << 48) | (group ID << 32) | local attr ID |
| Local op ID | 1-based position of the op in the family's ops. |
| Op ID | (family ID << 48) | local op ID |
| Set ID | 1-based counter per family; see attr-sets. |
| Enum value | 1-based position in values. |
| Flag bit | 0-based position in values. |
An ID is part of the ABI for the life of the family.
11. Lengths
Constants
| Name | Value |
|---|---|
Alignment (CTLV_ALIGNTO) | 8 |
| Attr header length | 16 |
| Event record header length | 24 |
CTLV_MAX_INLINE_MESSAGE_LEN | 0x100000 |
CTLV_MAX_ERROR_LEN | 0x4000 |
CTLV_MAX_NEST_DEPTH | 32 |
CTLV_DEFAULT_QUERY_REPLY_LEN | 0x10000 |
CTLV_MAX_EVENT_QUEUE_LEN | 0x1000000 |
The declared nest depth limit is CTLV_MAX_NEST_DEPTH − 1 = 31.
Formulas
align(n) rounds n up to a multiple of 8.
| Quantity | Definition |
|---|---|
| Attr maximum length | 16 + payload maximum length |
| Root maximum length | 16 + sum of children |
| Children sum | Σ max-occurrences × align(attr maximum length) over members |
| Blob payload maximum length | (largest descriptor attr count over allowed-backings) × align(24); va counts 3 |
request-max-len | Root maximum length of the request. |
action-reply-max-len | Root maximum length of the reply of an action with a reply. |
event-record-max-len | 24 + align(root maximum length of the event reply) |
query-reply-min-len | Maximum over the leaves of the reply tree of 16 × (number of ancestors including the root) + align(leaf attr maximum length). A tree that contains a re-entry uses 33 × 16 + align(attr maximum length) of the largest non-nest placement. |
query-reply-suggested-len | With suggested-reply-length declared: that value. Otherwise the larger of CTLV_DEFAULT_QUERY_REPLY_LEN and query-reply-min-len. For a composed family, the larger of the declared value and the composed minimum. |
Checks
- Each of
request-max-len,action-reply-max-len, the event payload maximum length andquery-reply-min-lenis at mostCTLV_MAX_INLINE_MESSAGE_LEN. - A declared
suggested-reply-lengthis at leastquery-reply-min-lenand at mostCTLV_MAX_INLINE_MESSAGE_LEN. event-record-max-lenis at mostCTLV_MAX_EVENT_QUEUE_LEN.- A core-built message root has a maximum length of at most its limit (
error-info:CTLV_MAX_ERROR_LEN).
12. Limits
| Item | Limit |
|---|---|
| Family name length | 63 characters |
| Registry entries | 65536 (family IDs 0 to 65535) |
| Attr groups per family | 65535 |
| Attrs per group | 4294967295 |
| Attr sets per family | 4294967295 new sets |
| Ops per family | 4294967295 |
| Effective ops of a chain | 4294967295 |
| Enum values | 4294967295 |
| Flag bits | 64 |
max-occurrences | 4294967295 |
| Declared nest depth | 31 |
| Composed required attrs per level | 4294967295 |
| Composed optional attrs per level | 4294967295 |
| Schema nodes per tree | 4294967295 |
| Stub references per tree | 4294967295 |
| Composed schema nodes per op (request plus reply) | 4294967295 |
| Stub fills per family | 4294967295 |
suggested-reply-length | 1 to 1048576 |
13. Family registry
Documentation/ctlv/families.yaml. Top-level key families: an array of 1 to 65536 elements.
| Element form | Meaning |
|---|---|
| name string (at most 63 characters, name pattern) | A registered family. |
mapping with name and deprecated: true | A deprecated family. Its ID stays reserved. |
- The array index is the family ID.
- The first entry is
ctlvand is not deprecated. - Each family appears after the family it inherits.
- Names are unique.
- Entries are never reordered, removed, renamed or reused.
- Every entry has a specification and a snapshot.
14. Output manifest
Documentation/ctlv/generated-files.yaml. Root keys, all required:
| Key | Type | Definition |
|---|---|---|
version | 1 | Manifest version. |
registry | mapping | source (path of the registry) and outputs.uapi-header (path, required). |
families | array, at least one | One mapping per generated family. |
A families element:
| Key | Required | Definition |
|---|---|---|
name | yes | Family name. |
source | yes | Path of the specification. |
outputs | yes | Mapping with at least one of uapi-header, kernel-header, kernel-source. |
Paths are non-empty, relative to the kernel tree root, and do not begin with /.
15. ABI snapshots
A snapshot records one family's own declarations: family flags, ID and parent; definitions with value numbers; groups with attr IDs and constraints; sets; stub fills; and ops with their request and reply trees. It is written by --abi-update and compared by --abi-check.
Compared members
| Declaration | Rule |
|---|---|
| Family | Name, ID, parent, pre-init, post-init, pre-fini are unchanged. |
| Enum, flags | Not removed. Kind unchanged. Each existing value remains present with the same number. |
| Attr group | Not removed. Group ID unchanged. |
| Attr | Not removed. Local ID, kind, referenced definition, unit and scale unchanged. |
| Attr bounds | min and min-length do not increase. max and max-length do not decrease. |
max-occurrences | Does not decrease, and does not change from unlimited to a finite value. |
| Blob | direction and alignment unchanged. No allowed-backings removed. max-length does not decrease. |
| Attr set | Not removed. Set ID and stub unchanged. |
| Stub fill | Not removed. Compared as a node list. |
| Op | Not removed. op-id, type, fd-access, availability, optional and pre-post unchanged. |
| Op request, reply | Present schema not removed. An action without a reply does not gain one. Compared as a node list. |
| Node list | No node removed. No node changes from optional to required. reenters unchanged. A node added since the snapshot is optional. |
Adding an attr, group, set, op, enum value or flag bit, or making a required placement optional, is compatible.
Registry baseline
abi/families.registry.yaml records the ordered registry. The check fails when:
- an entry of the baseline is missing from the registry,
- the name at an index differs,
- a deprecated entry is no longer deprecated,
- the registry differs from the baseline in any other way (
--abi-checkand--outputs-check), which requires updating the baseline.
16. Generated names
Let F be the family name with dashes replaced by underscores (upper case in macros), and X-Y a YAML name rendered as X_Y.
| Declaration | Name |
|---|---|
| Family number | CTLV_FAMILY_<S>, where S is the family name without a leading ctlv-; CTLV_FAMILY_ROOT for ctlv |
| Group | <F>_GROUP_<GROUP> |
| Attr | <F>_ATTR_<GROUP>_<ATTR> (complete ID) |
| Set | <F>_SET_<SET> |
| Op | <F>_OP_<OP> (complete ID) |
| Enum value | <F>_<ENUM>_<VALUE> |
| Flag bit | <F>_<FLAGS>_<VALUE>_BIT |
| Flag mask | <F>_<FLAGS>_<VALUE> and <F>_<FLAGS>_MASK |
In the root family, F is CTLV.
- Two declarations that generate the same C name are an error, as is a collision with a lifecycle API symbol or a symbol of an ancestor family.
- A generated UAPI header includes the UAPI header of its parent.
- Each generated file begins with the license of its specification and a marker naming the specification it is generated from.
17. Tooling
Dependencies: pyyaml 6.*, jsonschema 4.*.
Make targets
Run as make -C tools/ctlv <target>.
| Target | Action |
|---|---|
all | validate and abi-check. |
validate | Validates every specification in specs/. |
abi-check | Checks every specification against its snapshot. |
abi-update | Rewrites every snapshot. |
regen | Runs ctlv-regen.sh, which writes every manifest output. |
check-regen | Fails when a checked-in output differs from generator output. Writes nothing. |
lint | Runs yamllint, pycodestyle and pyflakes. |
clean | Removes Python caches and build directories. |
cli.py options
--spec PATH is required. Exactly one action is required.
| Option | Definition |
|---|---|
--spec PATH | Specification to load. |
--schema PATH | Meta-schema. Default: ctlv-schema.yaml beside specs/. |
--registry PATH | Registry. Default: families.yaml beside specs/. |
--abi DIR | Snapshot directory. Default: abi/ beside specs/. |
--validate | Validates the specification and its chain, and the generated-name check. |
--abi-check | Checks the registry baseline and the family snapshot. |
--abi-update | Rewrites the family snapshot. |
--tree-check | Checks registry, specifications, snapshots and manifest coverage. |
--tree-check-update | Checks whole-tree inputs before an ABI update. Snapshots for appended registry entries may be missing. |
--registry-abi-update | Rewrites the registry baseline. Requires complete snapshots. |
--outputs-check | Checks every manifest output. |
--outputs-update | Regenerates every manifest output. |
--mode uapi|kernel | Generates one file. Requires --header or --source. |
--header, --source | Selects the file kind of --mode. Mutually exclusive. |
--schema-only | With --mode kernel, omits the family API. |
-o, --output PATH | Writes to a file instead of standard output. Requires --mode. |
--cmp-out | Leaves an unchanged output file untouched. Requires --mode and --output. |
--output-root DIR | Alternate destination root. Requires --outputs-check or --outputs-update. Not empty. |
Exit status is 0 on success and 1 on a reported error. Each error is printed as ctlvgen: <location>: <message>.
ctlv-regen.sh
| Option | Definition |
|---|---|
-f | Accepted and ignored. |
-c | Writes nothing and fails on any difference. |
-p DIR | Uses DIR as the output root. Not empty. |
Whole-tree coverage
- Every registry entry has
specs/<name>.yaml. A file without an entry is an error. - Every registry entry has
abi/<name>.yaml. A file without an entry is an error. - The registry satisfies its baseline.
- The output manifest loads and satisfies its schema.
18. Root family
Family ctlv, family ID 0, specified in specs/ctlv.yaml. Its operations are inherited by every family. Its attr groups are placed inside the messages of other families.
Requirements on the root specification
- It declares the attr set
error-info. - Entry counts of these root enums are bounded:
op-type,op-availability,op-fd-access,blob-directionat most 255;blob-typeat most 15.
Enums
| Enum | Values (1, 2, …) |
|---|---|
op-type | action, query, event |
op-availability | fixed, dynamic |
blob-type | va |
blob-direction | input, output, inout |
validation-reason | malformed-message, unknown-attr, unknown-flag, nesting-too-deep, missing-attr, too-many-occurrences, value-out-of-range, bad-length, bad-string, bad-blob-descriptor, stale-generation, noncontiguous-attr |
op-fd-access | read, read-write |
Attr groups
| Group | Attrs |
|---|---|
family (1) | id, name (string, max-length 63), entry (nest of set family-entry, unlimited) |
blob (2) | type (enum blob-type), address, fd (max 2147483647), offset, length (min 1) |
error (3) | reason (enum validation-reason), message (string, max-length 255), bad-attr-offset, nest-offset, missing-attr-id, expected-generation, current-generation |
op (4) | id (min 1), type, availability, disabled (bool), request-max-len, action-reply-max-len, query-reply-min-len, query-reply-suggested-len, event-record-max-len, state-generation, entry (nest of op-entry, unlimited), fd-access |
schema (5) | attr-id, kind, max-occurrences, min, max, min-length, max-length, flags-mask, unit, scale (sint), blob-direction, blob-backings, blob-max-length, blob-alignment, reenters (min 1), attrs and optional-attrs (recursive nests of schema-node, unlimited), request, reply (nests of schema-node) |
event (6) | op-id (min 1, max-occurrences 256), queue-len (unit bytes, 1 to 16777216), queue-used (unit bytes), first-sequence, last-sequence, dropped-count |
Unless noted, an attr is an unsigned integer (uint) with no bounds.
Attr sets
| Set | Required | Optional |
|---|---|---|
family-entry | family.id, family.name | |
op-entry | op.id, op.type | op.availability, op.disabled, op.request-max-len, op.action-reply-max-len, op.query-reply-min-len, op.query-reply-suggested-len, op.event-record-max-len, op.fd-access |
op-schema-request | op.id | |
schema-node | schema.attr-id, schema.kind, schema.max-occurrences | schema.min, schema.max, schema.min-length, schema.max-length, schema.flags-mask, schema.unit, schema.scale, schema.blob-direction, schema.blob-backings, schema.blob-max-length, schema.blob-alignment, schema.reenters, schema.attrs, schema.optional-attrs |
op-schema-info | schema.request, schema.reply | |
op-change-info | op.id, op.disabled, op.state-generation | |
error-info | every error.* attr | |
event-subscription | event.op-id | |
event-queue-limit | event.queue-len | |
event-queue-state | event.queue-len, event.queue-used | |
event-overflow-info | event.first-sequence, event.last-sequence, event.dropped-count |
Ops
| ID | Op | Type | fd-access | Request | Reply |
|---|---|---|---|---|---|
| 1 | families-dump | query | read | family.entry | |
| 2 | ops-dump | query | read | op.entry | |
| 3 | op-schema-get | query | read | op-schema-request | op-schema-info |
| 4 | subscriptions-add | action | read | event-subscription | acknowledgement |
| 5 | subscriptions-remove | action | read | event-subscription | acknowledgement |
| 6 | event-queue-get | query | read | event-queue-state | |
| 7 | event-queue-set | action | read | event-queue-limit | acknowledgement |
| 8 | op-changed | event | op-change-info | ||
| 9 | event-overflow | event | event-overflow-info | ||
| 10 | device-removed | event | no children |