Independent PROFINET IO implementations packaged as containers behind one command-line contract, so that a PROFINET implementation under test can be run against them on a real Layer 2 network: the IO-Device of rt-labs p-net and of pnio-rs, the IO-Controller and DCP tool of profinet-py, the DCP tool pnio-dcp, and two independent decoders, scapy and tshark, that check every capture.
It serves otfabric/go-profinet,
whose interop tests (make interop) drive these images and write the
results the interoperability matrix is generated from.
Docs: CONTAINER_CONTRACT.md (the commands and JSON documents every image exposes) · MATRIX.md (results) · INTEROPERABILITY.md (what each peer can and cannot test, the discrepancies found) · versions.yaml (pins) · THIRD_PARTY_NOTICES.md
| Adapter | Implementation | Version | Licence | Role | go-profinet tested as |
|---|---|---|---|---|---|
pnet |
rt-labs p-net | ea5e554 (2023-11-10) |
GPL-3.0-only or commercial | IO-Device (C) | IO-Controller, DCP requester, LLDP agent |
pnio-rs |
pnio-rs | v0.1.0 | MIT OR Apache-2.0 | IO-Device (Rust) | IO-Controller, DCP requester |
profinet-py |
profinet-py | 0.6.6 | GPL-3.0-only or commercial | IO-Controller, DCP tool (Python) | IO-Device, DCP responder |
pnio-dcp |
pnio-dcp | 1.2.0 | MIT | DCP tool (Python) | DCP responder |
scapy |
scapy contrib pnio | 2.6.1 | GPL-2.0-only | decoder | every capture |
tshark |
Wireshark tshark | 4.0.17 (Debian) | GPL-2.0-or-later | decoder | every capture |
Evaluated and not used: profinet-python (M256-Automation; no licence, a Connect that compliant devices reject, unmaintained) and the PI Community Stack (PROFIBUS & PROFINET International members only, under an agreement that excludes combination with copyleft code). See INTEROPERABILITY.md.
make imagesbuilds every image as profinet-interop-<adapter>:dev; the go-profinet
interop tests use these names by default.
docker run --rm profinet-interop-pnet:dev print-capabilitiesEach container needs --cap-add NET_RAW --cap-add NET_ADMIN and a Docker
bridge network:
docker network create --subnet 10.77.0.0/24 pn
docker run -d --name pnet --network pn --ip 10.77.0.10 --cap-add NET_RAW --cap-add NET_ADMIN profinet-interop-pnet:dev device --station pnet-dut
docker run --rm --network pn --ip 10.77.0.4 --cap-add NET_RAW --cap-add NET_ADMIN profinet-interop-pnio-dcp:dev dcp identify-allA weekly workflow (.github/workflows/candidate.yml, also on demand)
compares every pin with the latest upstream: p-net with its newest GPL
release tag (later p-net trees are evaluation snapshots without ports:
reported and flagged), pnio-rs with its newest GitHub release, profinet-py,
pnio-dcp and scapy with PyPI, tshark with the Debian bookworm package. Where
a pin is behind, it builds the adapter on the latest upstream and checks it
with the smoke test, its capability document and the contract against the
other adapters at their pins (there is no cross-stack self-test here;
go-profinet's interop suite is the behavioural test). The decision table
goes to the Job Summary and to one issue that stays open while any pin is
behind. Pins are never moved automatically and no image is pushed.
make latest-upstream # the decision table
make images
make candidate-scapy CANDIDATE_VERSION=2.8.0 # a release pin
make candidate-pnio-rs CANDIDATE_VERSION=<tag> CANDIDATE_SHA=<commit>Every Dockerfile takes its upstream as UPSTREAM_VERSION and/or
UPSTREAM_SHA (UPSTREAM_SHA256 for the pnio-dcp wheel). At the pin the
release build and its hash checks are unchanged; any other value takes a
candidate path that says candidate build: ... on stderr.
The adapters, scripts and documents of this repository are MIT licensed.
The implementations keep their licences; none of their code is in this
repository. The images fetch them by pinned commit or version (and hash)
at build time and carry their licence under /licenses/. Images of GPL
implementations are built locally and are not published, so that each user
obtains the implementation from its source under its licence. The p-net
tree used is the last complete public GPLv3 snapshot, older than the
v1.0.2 security fixes: run it only on isolated test networks.
Tags vX.Y.Z are released by .github/workflows/release.yml from the
notes in RELEASE.md: it checks that the tag, versions.yaml
and the notes agree, builds and contract-checks every image on amd64 and
arm64, and publishes the notes with versions.yaml and the matrix results.
No image is published (see Licences). go-profinet pins a release
(INTEROP_REF).
adapters/<name>/ Dockerfile and the adapter script of each implementation
docs/ container contract, interoperability notes, matrix
matrix/results.json the machine-readable matrix
scripts/ version check, latest upstream, matrix generation, release notes
versions.yaml every pin, and the version of this repository
RELEASE.md how a release is made; the notes of every version