UDMI / Docs / Specs / Discovery / Generation
The generation field is a core mechanism in UDMI discovery and enumeration processes. It is used to trigger, track, and correlate discovery scans and self-enumeration requests. The generation value is an RFC 3339 formatted date-time string.
Depending on the context (e.g., self-enumeration vs. family scanning, sporadic vs. periodic), the generation field behaves differently. This document summarizes these different use cases and expectations.
A passive scan monitors the network without actively sending out probes. It operates continuously or based on network activity.
generation marker to trigger. It is configured simply by defining passive scan parameters (e.g., passive_holdoff_sec).phase will report as passive or active. There is typically no generation field reported in the state for a purely passive scan, as there is no specific scan cycle to track.generation value.A sporadic scan is an explicit, one-off request for a device to actively scan a network family for other devices.
generation field in the target family configuration (config.discovery.families.<family>.generation) to a new timestamp (which must be after the device’s last start time and different from the previous scan generation).state block reports a phase of pending and its generation will match the config’s generation.phase changes to active.phase changes to stopped (or the active indicator is removed). Ideally, the state retains the generation field to indicate the timestamp of the last scan performed.generation value, securely correlating the discovered devices with the specific scan trigger.generation entry in the config block can either be removed (with no effect on the device) or updated to a new timestamp to trigger another sporadic scan.A periodic scan is an active scan that repeats automatically at defined intervals, eliminating the need to update the configuration for every scan.
generation timestamp and a scan_interval_sec parameter in the family configuration. The generation timestamp serves as the base time (or initial start time) for the interval schedule.generation timestamp plus increments of the scan_interval_sec (i.e., Ts = Tc + N * Ti). This ensures there is no clock drift over time.generation directly matches the config generation, in a periodic scan, the device updates the generation value for each loop to uniquely identify the current execution.generation field will be greater than or equal to the base generation specified in the config.generation timestamp is reported in the state block during the scan and attached to all discovery events produced during that loop.generation field or the scan_interval_sec parameter is removed from the config.Self-enumeration is an explicit request for a single, already-registered device to describe its own capabilities (points, features, etc.), rather than scanning the network for other devices.
generation parameter in the root discovery block (config.discovery.generation), as opposed to a specific family block.state.discovery block reflects the generation currently being processed.generation value. Because these events originate from the device itself rather than a proxy scan, they do not include a family block; the identity is determined from the message envelope.| Mode | Location in config |
Trigger / Role | state Behavior |
events Behavior |
|---|---|---|---|---|
| Passive Scan | N/A | None required. | No generation. |
No generation. |
| Active Sporadic | families.<family>.generation |
Explicit timestamp triggers a one-off scan. | Matches config.generation. Retained after stop. |
Matches config.generation. |
| Active Periodic | families.<family>.generation + scan_interval_sec |
Base timestamp for calculating the schedule. | Updates every loop to a new, unique timestamp ≥ config.generation. |
Matches the current loop’s updated generation. |
| Self Enumeration | discovery.generation |
Explicit timestamp triggers self-reporting. | Matches config.generation. |
Matches config.generation. |