Repository navigation
go-profinet v0.2.0
Date: 2026-10-27
Previous release: v0.1.2
The first features of the software-only roadmap
(docs/research/SOFTWARE-ONLY-ROADMAP.md):
DCP Hello, port checks and adjustments, GSDML validation, shared device,
and codecs of MRP, PTCP and system redundancy. No incompatible API change
(apidiff against v0.1.2); two behaviour changes: the IO-Device now
accepts the IOCARs of several IO controllers (shared device) instead of
refusing a second one, and generated GSDML no longer declares SNMP.
Feature coverage is not conformance: go-profinet is not certified.
- DCP Hello (roadmap 1A):
dcp.HelloFrame,Responder.StartHelloand
StopHello(bounded sequences, rate-limited across restarts, ended by a
DCP Set); the IO-Device sends Hello at start and on link up while no IO
controller is connected (device.Config.Hello,HelloOptions) and
reports DeviceInitiative; the IO-Controller connects through a Hello
without Identify (controller.Config.IgnoreHello,DeviceStats.Hellos).
model.Capabilities.DCPHelloand GSDMLDCP_HelloSupported. - Port checks and adjustments (roadmap 1B):
pniocodecs of
PDPortDataCheck, PDPortDataAdjust, PDInterfaceAdjust, PDInterfaceDataReal
and the PDRealData record with the interface (DecodePDRealDataRecord);
the IO-Device evaluates CheckPeers against its LLDP neighbor (remote
mismatch diagnoses with alarms), applies PeerToPeerBoundary,
DCPBoundary and PDInterfaceAdjust, serves PDExpectedData and
PDInterfaceDataReal, reports the real link state, and refuses the
checks and adjustments it cannot honour; the IO-Controller writes
DeviceConfig.PeerChecksand verifies a topology (CheckTopology).
The LLDP agent reports changes (AgentOptions.OnChange), can stop
sending (SetTransmit) and forget its neighbors (Clear). - Shared device (roadmap 2): the IO-Device accepts IOCARs of several IO
controllers; each submodule belongs to the first AR that expects it,
the others see it locked (ModuleDiff ARInfo 3), get no data of it,
cannot write it; alarms go to the owner; when the owner leaves, the
submodule is handed over with a Released alarm, PrmEnd (plug) and
ApplicationReady (plug). The IO-Controller leaves out locked submodules,
takes over released ones, andmodel.Device.WithSlotsbuilds the
model of a controller that owns only some modules. A closed AR now
invalidates only its own outputs. - Codecs of features without an open implementation to test behaviour
against (roadmap 3, 4B, 5):mrp(MRP frames),ptcp(PTCP delay
frames),pnio.SRInfoBlock,pnio.ARSetID,pnio.MCRBlockReq, the
IOCARSR DataStatus codes inrt; golden vectors, fuzz targets, tshark
and scapy decode them without a warning. - Generated GSDML no longer declares SNMP in
SupportedProtocols: the
device has no SNMP agent. docs/research/SOFTWARE-ONLY-ROADMAP.mdand its evidence files.- GSDML validation (roadmap 1C):
gsdml.Checkgrades every issue as
error, warning or unvalidated and names its rule; semantic rules for IO
data that does not fit an RT frame (error), slots against PhysicalSlots
and AllowedInSlots, record indexes, module ident numbers, interface and
port subslots and reduction ratios (warnings, each with its basis);
elements and attributes outside the catalog and newer schema versions
are reported as unvalidated.Validatestill fails on errors only. controller:Device.WaitStatereturns only after theOnState
callback of the state it waited for has run, as documented; before, it
could return in between.device: a controller that connects anew before the device saw its old
AR end replaces that AR, which hands its submodules to the new one
(before, they were locked until the old AR timed out, or went to
another controller);SendAlarmno longer reads the alarm endpoint of
an AR that is still being set up (data race).- Tests: a failed e2e test prints the logs of its devices and
controllers; tests that are not about the watchdog ride out CI runner
stalls of seconds. Soaked: every CI job 25 times in parallel, green. - Interop: pinned to profinet-interop v0.1.3, whose matrix covers the new
features (p-net 55 checks pass, 0 fail).