Skip to content

DECnet Phase IV: live-datalink NSP link + NCP config surface + first real-VAX adjacency - #1057

Open
baron-3dl wants to merge 3 commits into
mainfrom
work/vms-aac0-wire-adjacency
Open

DECnet Phase IV: live-datalink NSP link + NCP config surface + first real-VAX adjacency#1057
baron-3dl wants to merge 3 commits into
mainfrom
work/vms-aac0-wire-adjacency

Conversation

@baron-3dl

@baron-3dl baron-3dl commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

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 real br0; 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/--listen client/server, scs_datalink_set_promisc for 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

baron-3dl and others added 2 commits September 7, 2026 16:37
… 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
@baron-3dl baron-3dl changed the title vms-aac0: DECnet Phase IV — first live wire adjacency vs the real lab VAX DECnet Phase IV: live wire adjacency vs the real VAX + NSP logical link over the live datalink Sep 7, 2026
@baron-3dl baron-3dl changed the title DECnet Phase IV: live wire adjacency vs the real VAX + NSP logical link over the live datalink DECnet Phase IV: live-datalink NSP link + NCP config surface + first real-VAX adjacency Sep 7, 2026
…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
baron-3dl force-pushed the work/vms-aac0-wire-adjacency branch from 5ccca56 to ec0beff Compare September 7, 2026 18:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant