Skip to content

support for sending 6-byte ACKs - #2594

Merged
liamcottle merged 4 commits into
devfrom
extended-ack
May 21, 2026
Merged

support for sending 6-byte ACKs#2594
liamcottle merged 4 commits into
devfrom
extended-ack

Conversation

@ripplebiz

Copy link
Copy Markdown
Member

ACK packets now composed of:

  • legacy 4 byte hash
  • copy of extended attempt number (byte)
  • 1 random byte

This is to help the packethash be unique, and to enable > 4 DM attempts.

SimpleMeshTable now has single hasSeen() logic, regardless of payload type. (ie. no separate ACK crc tables)

@liamcottle
liamcottle merged commit 6832990 into dev May 21, 2026
12 checks passed
@liamcottle
liamcottle deleted the extended-ack branch May 21, 2026 05:45
syssi added a commit to syssi/MeshCore that referenced this pull request May 30, 2026
Kpa-clawbot added a commit to Kpa-clawbot/CoreScope that referenced this pull request Jun 7, 2026
…1618)

## Summary

Firmware 1.16.0 (`companion-v1.16.0`) ships variable-length
`PAYLOAD_TYPE_ACK` payloads: 4 bytes (legacy) → 5 bytes (4-byte CRC +
1-byte attempt, commit `f6e6fdaa`) → 6 bytes (+ 1-byte RNG, commit
`a130a95a`). CoreScope's decoder previously truncated past the 4-byte
CRC and discarded the attempt + RNG bytes.

This PR teaches `cmd/ingestor/decoder.go` to surface the extended bytes
on the decoded payload so the DB/UI can distinguish v1.15 vs v1.16
senders, with no schema or wire-compat changes.

Partial fix for #1610 — top-level ACK + multipart-inner ACK are covered.
PATH-extra ACK parsing (`decodePathPayload`) is deferred to #1612 per
triage.

## Changes

- `decodeAck` reads 4/5/6-byte payloads. Keeps `extraHash` (4-byte CRC)
for compat; adds optional `ackLen`, `ackAttempt`, `ackRand` JSON fields.
Legacy 4-byte ACKs leave attempt/rand `nil`.
- `decodeMultipart` ACK branch relaxes the `len >= 5` floor so the inner
blob can be 4/5/6 bytes (multipart `payload_len` 5/6/7). Adds
`innerAckLen`, `innerAckAttempt`, `innerAckRand`.
- All additions are `omitempty` — backwards-compatible JSON only. No DB
column, no schema migration, no frontend change.

## Out of scope (per issue triage)

- `decodePathPayload` PATH-extra parsing — tracked separately in #1612.
- Frontend rendering of attempt counter — leave for a follow-up if the
DB/UI eventually wants to display it.

## TDD

- **Red commit `3fce0465`** adds `cmd/ingestor/issue1610_test.go` with 6
new assertions (legacy 4-byte, extended 5/6-byte, multipart variants of
each). New fields are declared on `Payload` so the test compiles, but no
decoder populates them yet — tests fail on `ackLen=<nil> want 4` etc.
Verified isolation with `git stash` of decoder.go + re-run.
- **Green commit `5165c202`** implements the decoder changes. `go test
./...` in `cmd/ingestor` passes.

## Fixtures

Synthetic wire vectors built by hand against the firmware spec — the
issue did not provide real captures. Each test cites the firmware ref +
commit it derives from (`BaseChatMesh.cpp:218-234`, commits `f6e6fdaa`
and `a130a95a`).

## References

- Issue #1610
- Firmware tag `companion-v1.16.0` @ `07a3ca9e`
- Upstream PR meshcore-dev/MeshCore#2594
- Blog: https://blog.meshcore.io/2026/06/06/release-1-16-0

---------

Co-authored-by: corescope-bot <bot@corescope.local>
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.

3 participants