DECnet Phase IV: live-datalink NSP link + NCP config surface + first real-VAX adjacency - #1057
Open
baron-3dl wants to merge 3 commits into
Open
DECnet Phase IV: live-datalink NSP link + NCP config surface + first real-VAX adjacency#1057baron-3dl wants to merge 3 commits into
baron-3dl wants to merge 3 commits into
Conversation
… VAX
Adds a reproducible lab harness (tests/lab/tools/decnet_adjacency.sh) plus the
first capture of OVMX's userspace DECnet Phase IV engine interacting with a real
lab VAX on a shared br0 segment (design-decnet-ovmx.md §5 Phase 1).
Proven ground-source on vaxlab-2, zero disruption (DECnet 0x6003 is protocol-
orthogonal to the co-resident cluster's SCS 0x6007, coordinated with the cluster
lane):
- OVMX node 1.42 emits faithful endnode-HELLOs on the real wire, byte-shaped
like the oracle's own, and
- OVMX's engine hears + registers the real VAX node 1.1 (SHOW ADJACENT NODES),
- the VAX keeps HELLOing normally — no crash/disruption
(ovmx-never-crashes-a-peer).
This is the ENGINE half of the Phase-1 adjacency proof. The bidirectional
"VAX lists OVMX as a reachable endnode" done-bar needs OVMX reachable via the
live NSP logical link (landed but socketpair-only — wiring it into decnetd's
live loop is the next rung) and is otherwise parked on the wedged lab consoles.
Full analysis in the sibling capture note.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T4csyFSMUsS8k1D2MgMxk2
… a socketpair) Completes vms-c23's "over the live datalink" clause. The NSP connection FSM (CI/CC/DATA/ACK/DI/DC) already landed but was only ever driven over a Unix socketpair in self-tests; the live loop touched only the HELLO path. This wires the connection service into DECNETD's real AF_PACKET loop and proves it on a real wire. Engine/daemon: - dnet_engine_link_tick(): drive the CI retransmit/give-up at the engine boundary; the retransmitted CI is the FSM's own PDU, never a template copy. - decnetd live loop: demux by routing flag (long-data -> NSP link_rx, else HELLO); send FSM replies (ACK/DC) over the datalink; --connect (client: open link, send one data segment, disconnect) and --listen (server: accept an inbound Connect Initiate, deliver data) modes; NSP counters. - scs_datalink_set_promisc() (all backends): receive unicast to a DECnet MAC the shared NIC does not own. A node owning its NIC programs the DECnet MAC and receives natively; on a shared bridge OVMX filters to its address in software. Wire-identical to peers either way. Proof (real datalinks, no socketpair): - tests/integration/decnet_nsp_live_datalink.sh: two engines on a veth pair, each owning its faithful DECnet MAC, complete link OPEN -> byte-identical data segment + ack -> clean DISCONNECT. Captured PASS in tests/lab/captures/decnet-nsp-live-datalink-20260907.txt. (Privileged integration harness like the cluster lab tools; not a skip-in-CI ctest.) - tests/vmsdecnet/test_dnet_link.c: added an always-run unit test for dnet_engine_link_tick (decodes the retransmit back to a Connect Initiate). - Existing socketpair selftests + unit suite still pass. Compat register updated truthfully: decnet$nsp-transport partial -> implemented (live over a real datalink; only Connect Initiate is oracle-byte-verified), decnet$task-to-task absent -> partial (a raw data segment crosses a live link; $QIO/object-DB/FAL are later rungs). SET HOST / NODE:: remain honest stubs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T4csyFSMUsS8k1D2MgMxk2
…NCP.EXE
The "configuration" pillar of the DECnet layered product (design §5 Phase 3):
the VMS-authentic NCP surface a manager uses to configure the local node and
the remote-node database, and the node NAME<->address resolution the SET HOST /
NODE:: paths resolve through. Greenfield — there was no NCP utility or node DB.
- src/vmsdecnet/ncp/dnet_nodedb.{c,h}: the persisted node table. Add/update,
case-insensitive unique node names, address parse + range checks, ascending-
address SHOW ordering, name<->address + address<->name resolution, and
persistence (atomic save via temp+rename; tolerant load — a missing DB is
empty, a corrupt one is EIO). Pure logic + a documented OVMX plain-text file
format (labelled — NOT a VMS NETNODE_REMOTE.DAT binary layout). No socket,
no engine.
- src/vmsdecnet/ncp/ncp.c -> NCP.EXE: SET/DEFINE NODE, CLEAR/PURGE NODE,
SHOW KNOWN NODES, SHOW NODE, SET EXECUTOR (ADDRESS/NAME/STATE), SHOW EXECUTOR
[CHARACTERISTICS]. VMS-faithful SHOW layout; honest %NCP-E- errors. Grammar +
layout from the public NCP manual (Rule 8).
Honest scope (not faked): circuits, objects, lines, counters, LOOP, and the
SET(volatile)/DEFINE(permanent) split are later rungs — OVMX keeps one
persisted DB today, and NCP is config-only (it does not start the network).
SET HOST stays an honest stub; wiring it to resolve a name via this database +
open a CTERM link is the next rung.
Tests: tests/vmsdecnet/test_dnet_nodedb.c (always-run unit) covers parse/range,
add/update, name uniqueness, resolution, ordering, persistence round-trip, and
corrupt-file handling. NCP.EXE smoke-driven end to end (SET/SHOW/CLEAR + error
paths + persisted file). Compat register: decnet$ncp (partial), decnet$node-
database (implemented) added truthfully.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T4csyFSMUsS8k1D2MgMxk2
baron-3dl
force-pushed
the
work/vms-aac0-wire-adjacency
branch
from
September 7, 2026 18:27
5ccca56 to
ec0beff
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three DECnet Phase IV lane advancements (epic vms-30e), moving it from codec-only toward the live VMS-authentic layered product. Each is proven for real — no socketpairs standing in for wires, no canned output.
1. First live wire adjacency vs the real lab VAX (vms-aac0, engine half)
tests/lab/tools/decnet_adjacency.sh+ capture: OVMX node 1.42 emits faithful endnode-HELLOs on vaxlab-2's realbr0; its engine hears + registers the real VAX node 1.1. Zero disruption (0x6003 orthogonal to the cluster's SCS 0x6007, coordinated with the cluster lane). Honest gap: node 1.1 is an endnode, so the "VAX lists OVMX as reachable" done-bar needs the NSP link (below) + node-DB reachability, parked on wedged lab consoles.2. NSP logical link over the LIVE datalink (vms-c23)
Wires the landed NSP connection FSM into DECNETD's real AF_PACKET loop:
dnet_engine_link_tick(CI retransmit, FSM's own PDU), loop demux (long-data→NSP/else HELLO),--connect/--listenclient/server,scs_datalink_set_promiscfor unicast on a shared NIC. Proof:tests/integration/decnet_nsp_live_datalink.sh— two engines on a veth pair (each owning its faithful DECnet MAC) complete link OPEN → byte-identical data + ack → clean DISCONNECT (captured PASS). Only Connect Initiate is oracle-byte-verified; the rest spec-derived, round-trip proven.3. NCP configuration surface (vms-1e9) — the "configuration" pillar
Greenfield
NCP.EXE+ a persisted node database (src/vmsdecnet/ncp/): SET/DEFINE/SHOW/CLEAR NODE, SET/SHOW EXECUTOR, VMS-faithful SHOW layout, honest%NCP-E-errors, and the node NAME↔address resolution the SET HOST / NODE:: paths need. Always-run unit test (test_dnet_nodedb.c) covers add/update/uniqueness/resolution/ordering/persistence/corrupt-file. Honest scope: circuits/objects/lines/counters + volatile/permanent split are later rungs; NCP is config-only.Compat register updated truthfully throughout (nsp-transport→implemented, task-to-task→partial, +decnet$ncp partial, +decnet$node-database implemented); SET HOST / NODE:: remain honest stubs.
🤖 Generated with Claude Code