# Native AB transport gate results ## ab_server suites (T17) Every ab_server integration test now runs once per transport (`TransportMatrix` in each integration project). Run 2026-10-07 against `10.100.0.35`, one compose profile at a time (AbCip `/opt/otopcua-abcip`, `AB_SERVER_COMPOSE_PROFILE=
`; AbLegacy `~/otopcua-ablegacy`, `AB_LEGACY_COMPOSE_PROFILE=
`); every stack was brought down afterwards. - **Image:** `otopcua-ab-server:libplctag-release` (`sha256:19e814747d85…`, built 2026-08-01; ab_server from libplctag `v2.7.0` + patches 0001/0002). Host compose files md5-identical to the repo's. - **Commit:** fixes `82d011c7` + `2171fc8c`, test matrix `8c68694d`. Counts are pass / fail / skip for the transport-parameterised rows only. Each AbCip run also passed the 6 transport-independent `AbServerProfileTests`. The AbCip skips are the 3 Emulate-tier tests (`AB_SERVER_PROFILE=emulate` only). The AbLegacy skips are `Slc500_write_then_read…`, which skips itself on both transports when the slc500 port (`:44819`) is down. | Profile | Libplctag | Native | Native ⊇ Libplctag | |---|---|---|---| | controllogix | 1 / 0 / 3 | 1 / 0 / 3 | yes | | compactlogix | 1 / 0 / 3 | 1 / 0 / 3 | yes | | micro800 | 0 / 1 / 3 | 1 / 0 / 3 | yes (libplctag fails, see below) | | guardlogix | 1 / 0 / 3 | 1 / 0 / 3 | yes | | slc500 | 2 / 0 / 0 | 2 / 0 / 0 | yes | | micrologix | 1 / 0 / 1 | 1 / 0 / 1 | yes | | plc5 | 1 / 0 / 1 | 1 / 0 / 1 | yes | **Native-only failures found and fixed:** - `82d011c7` (controllogix): RegisterSession carried a non-zero sender context, and ab_server rejects that with encapsulation status 1. Every native session failed. - `2171fc8c` (slc500): ab_server answers Execute PCCC with a fixed requestor id (`07 3D F3 45 43 50 21`), so the requestor-echo check rejected every native PCCC reply. Native now sends libplctag's identity. **Skips added:** none. The PLC-5 integration test only reads N7, so the PLC-5 Unsupported paths (non-N reads, all writes) and status-bit sub-element writes are never exercised by the suite. **micro800:** the smoke test used to send `/1,0` for every family, and both transports failed against `--plc=Micro800`. It now uses an empty path for Micro800. With the empty path, native passes. libplctag still fails with BadCommunicationError, because the driver's libplctag runtime passes `Path = ""` and libplctag answers that with `ErrorBadData`. A `null` path works (checked with the capture client). That defect is pre-existing and libplctag-side; it is recorded, not fixed, here. ## Differential vs ab_server (T18) _(pending)_ ## AdminUI /run (T19) _(pending)_ ## Real press (T21) _(pending)_ ## Latency (T21) _(pending)_