A frozen spec is only meaningful if it's paired with the corpus that was current at release time — otherwise a v0.1.0 reader follows "see corpus/payloads/ack/" and lands on a file whose test vectors may have changed since v0.1.0 was cut. Three changes: 1. `cut-version` now copies BOTH src/ AND corpus/ into the snapshot directory. A release is the pair, not just the text. 2. The corpus URL rewriting in cut-version now retargets /tree/main/corpus -> /tree/main/versions/<v>/corpus (and the blob variant). This lets the link resolve on GitHub from main alone — no git tag required, since the frozen copy is a real path under main. Downgrades the "tag is REQUIRED" message from last commit back to "optionally tag the commit". 3. The frozen corpus's spec_ref fields get rewritten too: from `src/04-payload-ack.md` to `versions/<v>/04-payload-ack.md`, so a reader following a test vector lands on the spec text the vector was paired with at release time. versions/v0.1.0/ regenerated from scratch via `just cut-version v0.1.0` to pick up the corpus snapshot + the new sed patterns. The release is now self-consistent: v0.1.0 spec links go to v0.1.0 corpus, which links back to v0.1.0 spec. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
50 lines
1.3 KiB
Markdown
50 lines
1.3 KiB
Markdown
# MeshCore Protocol Specification
|
|
|
|
## Section 13: Payload — Raw Custom
|
|
|
|
### Overview
|
|
|
|
The RAW_CUSTOM payload carries application-defined raw bytes with no prescribed
|
|
structure. It is intended for applications that implement their own encryption,
|
|
framing, or payload formats on top of the MeshCore transport.
|
|
|
|
### Payload Type
|
|
|
|
Header payload type field: `0x0F` (RAW_CUSTOM)
|
|
|
|
### Wire Format
|
|
|
|
```
|
|
0
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
| Raw Data (1-184 bytes) |
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
```
|
|
|
|
### Fields
|
|
|
|
| Field | Offset | Size | Type | Description |
|
|
|-------|--------|------|------|-------------|
|
|
| data | 0 | 1-184 bytes | raw | Application-defined payload |
|
|
|
|
### Routing
|
|
|
|
In the current reference implementation, RAW_CUSTOM packets are only processed
|
|
when received via direct routing. They are NOT flood-routed.
|
|
|
|
### Constraints
|
|
|
|
- Payload MUST be at least 1 byte.
|
|
- Maximum payload: 184 bytes (MAX_PACKET_PAYLOAD).
|
|
- Maximum total data: limited by `sizeof(Packet::payload)` which is
|
|
MAX_PACKET_PAYLOAD (184).
|
|
|
|
### Cross-References
|
|
|
|
- Test vectors: [`corpus/payloads/raw-custom/`](https://github.com/swaits/meshcore-spec/tree/main/versions/v0.1.0/corpus/payloads/raw-custom/)
|
|
|
|
### Reference Implementation
|
|
|
|
- `Mesh::createRawData()` in `src/Mesh.cpp` — Encoding
|
|
- `Mesh::onRecvPacket()`, case `PAYLOAD_TYPE_RAW_CUSTOM` — Processing (direct only)
|