Skip to content

fix(figc4.6): Set Version 2.0 before Establish Data Link on the FRMR fallback (#45) - #108

Merged
M0LTE merged 2 commits into
mainfrom
fix/45-frmr-fallback-order
Sep 10, 2026
Merged

M0LTE merged 2 commits into
mainfrom
fix/45-frmr-fallback-order

Conversation

@M0LTE

@M0LTE M0LTE commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Fixes #45. Figure fix and its citation/prose bookkeeping in two independently revertable commits, following the #81 (#40) precedent.

What changed and why

On figc4.6 (Awaiting V2.2 Connection) the "FRMR received" column (t14_frmr_received) drew "Establish Data Link" before "Set Version 2.0". Establish Data Link (figc4.7) branches on the modulo and sends SABME while modulo 128 is still in effect, so the v2.0 fallback re-sent the very SABME the pre-v2.2 peer had just rejected with FRMR (§4.3.3.2): no progress against a v2.0 peer, and a modulo split against a v2.2 peer (the responder adopts 128 from the SABME while this station drops to 8).

The two boxes swap places on the column, so the arm now reads: SRT := Initial Default / T1V := 2 * SRT, Set Version 2.0, Set Layer 3 Initiated, Establish Data Link, then state 1 (Awaiting Connection). The re-establishment therefore goes out as a v2.0 SABM, which is what §6.3.2 ("a version 2.0 connection is made" once a pre-2.2 peer answers with FRMR) and §6.5 (reset "after receipt of a FRMR frame from a TNC using an older version of the protocol") intend, and what direwolf already does as an erratum.

Per file:

  • sdl/DataLink_AwaitingV22Connection.graphml (commit 1): geometry of n66 (Establish Data Link, Subroutine call) and n68 (Set Version 2.0, Processing description) exchanged and edges e69..e72 re-pointed. Node ids, labels and d5 shape classes are unchanged; the column stays a straight top-down stack with no bend points, nothing else on the page moved, and a page-wide bounding-box check finds no overlaps.
  • yaml/awaiting_v22_connection.sdl.yaml: regenerated by Packet.Sdl.Transcribe (ax25sdl main 181328b; the CI-pinned ff5bc7d produces byte-identical output). 25 transitions / 8 decisions as before; only t14's path order changes and no id changes, so the sidecar needed no re-keying.
  • mmd/awaiting_v22_connection.g.mmd: regenerated by Packet.Sdl.CodeGen; the totality/determinism lint stays clean (120 arms, 13 subroutines, 8051 feasible valuations, 0 holes, 0 overlaps).
  • svg/DataLink_AwaitingV22Connection.svg: regenerated by tools/render/render_all.py.
  • yaml/awaiting_v22_connection.citations.yaml (commit 2): t14 annotated with an ERRATUM (figc4.6 t14 (FRMR fallback): 'Establish Data Link' precedes 'Set Version 2.0' — the v2.0 fallback re-establishes with SABME, not SABM #45) note and the §4.3.3.2 / §6.3.2 / §6.5 and direwolf references.
  • doc/ax.25.2.3-draft.md (commit 2): row appended to "Changes from Version 2.2". No prose states the action order (§4.3.3.2, §6.3.2, §6.5 and the C4.6 captions were checked), so no section text changes. The embedded figc4.6 image files in the draft are not regenerated, the same deferral as fix(figc4.4 + figc4.5 + §4.4.2/§6.4.4): discard out-of-window duplicate I frames — X.25 2.4.6.4(a) guard, bound = negotiated k (#40) #81.

svgdiff (python3 tools/svgdiff/svg_diff.py main fix/45-frmr-fallback-order --all --merge-base --format markdown)

spec-sdl/v2.2-errata/data-link/svg/DataLink_AwaitingV22Connection.svg

nodes 80→80, edges 84→84, labels 23→23

what change
+ edge Establish Data Link → 1 Awaiting Connection
+ edge SRT <- Initial Default → Set Version 2.0
+ edge Set Layer 3 Initiated → Establish Data Link
+ edge Set Version 2.0 → Set Layer 3 Initiated
− edge Establish Data Link → Set Layer 3 Initiated
− edge SRT <- Initial Default → Establish Data Link
− edge Set Layer 3 Initiated → Set Version 2.0

The fourth removed edge, Set Version 2.0 → 1 Awaiting Connection, is missing from the list only because the SABM column carries an edge with the same signature and the tool de-duplicates by signature; a multiset diff of the graphml shows exactly four edges removed and four added, and the edge count is unchanged. The raw SVG diff is ten lines: the two boxes' transforms and their label positions.

Evidence

  • ax25sdl golden trace traces/frmr-fallback-downgrades-to-sabm.trace.yaml: expects t14_frmr_received to emit SABM P=1 with version_2_2: false; marked expected_failure against the pre-fix figure.
  • ax25sdl docs/explorer.md, figc4.6 t14 (FRMR fallback): 'Establish Data Link' precedes 'Set Version 2.0' — the v2.0 fallback re-establishes with SABME, not SABM #45 calibration row: awaiting-v22 seed, v20-frmr stub peer, timer-free progress on; the pre-fix figure emits SABME again and the link only comes up through figc4.2's T1 retry (4 steps).
  • direwolf src/ax25_link.c frmr_frame at a231971: the state_5 arm runs set_version_2_0 (5044, "Erratum: Need to force v2.0. This is not in flow chart.") before establish_data_link (5046); the state_3/state_4 arm does the same at 5028/5030 ("FRMR can only be sent by v2.0").

ax25sdl follow-up: remove the expected_failure marker from traces/frmr-fallback-downgrades-to-sabm.trace.yaml and turn the #45 explorer calibration row clean (keep it firing on a pre-fix fixture)

Notes for review

🤖 Generated with Claude Code

https://claude.ai/code/session_014qyx5dT8rmRTb8szT4SpEQ

M0LTE and others added 2 commits September 10, 2026 22:40
…fallback (#45)

The Awaiting V2.2 Connection "FRMR received" column (t14) drew "Establish Data Link" before "Set Version 2.0". Establish Data Link (figc4.7) branches on the modulo and sends SABME while modulo 128 is still in effect, so the v2.0 fallback re-sent the SABME the pre-v2.2 peer had just rejected with FRMR: no progress against a v2.0 peer, and a modulo split against a v2.2 peer (see #45).

- DataLink_AwaitingV22Connection.graphml: the two boxes swap places on the column (geometry of n66 and n68 exchanged, edges e69..e72 re-pointed), so the arm now reads SRT/T1V, Set Version 2.0, Set Layer 3 Initiated, Establish Data Link, then state 1. Node ids, labels and shape classes are unchanged (Establish Data Link stays a Subroutine call); the column remains a straight top-down stack with no bend points, so nothing else on the page moved.
- awaiting_v22_connection.sdl.yaml regenerated by the Packet.Sdl.Transcribe walker: only t14_frmr_received's path order changes; 25 transitions / 8 decisions as before and no id changes, so the citations sidecar needs no re-keying.
- awaiting_v22_connection.g.mmd regenerated by Packet.Sdl.CodeGen; the totality/determinism lint stays clean (8051 feasible valuations, 0 holes, 0 overlaps).
- DataLink_AwaitingV22Connection.svg regenerated with tools/render/render_all.py.

Refs #45.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014qyx5dT8rmRTb8szT4SpEQ
…hanges table

- awaiting_v22_connection.citations.yaml: t14_frmr_received annotated with an ERRATUM (#45) note (what changed, why per §4.3.3.2, §6.3.2 and §6.5, and the ax25sdl evidence: the golden trace frmr-fallback-downgrades-to-sabm and the docs/explorer.md #45 calibration row), plus the direwolf frmr_frame references (the state_5 arm at 5044/5046 and the state_3/4 arm at 5028/5030, both of which force v2.0 before establish_data_link).
- doc/ax.25.2.3-draft.md: row appended to the "Changes from Version 2.2" table. No prose states the action order (§4.3.3.2, §6.3.2, §6.5 and the C4.6 captions were checked), so no section text changes.

Refs #45.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014qyx5dT8rmRTb8szT4SpEQ
@github-actions

Copy link
Copy Markdown

SVG figure changes (e4741fbe → 0073b33d)

spec-sdl/v2.2-errata/data-link/svg/DataLink_AwaitingV22Connection.svg

nodes 80→80, edges 84→84, labels 23→23

what change
+ edge Establish Data Link → 1 Awaiting Connection
+ edge SRT <- Initial Default → Set Version 2.0
+ edge Set Layer 3 Initiated → Establish Data Link
+ edge Set Version 2.0 → Set Layer 3 Initiated
− edge Establish Data Link → Set Layer 3 Initiated
− edge SRT <- Initial Default → Establish Data Link
− edge Set Layer 3 Initiated → Set Version 2.0

Interactive viewers — swipe, onion-skin, blink, and a clickable change list that zooms to each change — are attached to this run as the svg-figure-diff artifact: download, unzip, open the HTML.

Locally: python3 tools/svgdiff/svg_diff.py main HEAD --all --merge-base

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.

figc4.6 t14 (FRMR fallback): 'Establish Data Link' precedes 'Set Version 2.0' — the v2.0 fallback re-establishes with SABME, not SABM

1 participant