You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`priority_critical`|`prio=0` (CRITICAL), the low end of the 2-bit priority field |
99
+
|`priority_low`|`prio=3` (LOW), the high end of the 2-bit priority field |
100
+
|`high_address`|`src=65 dst=66`: the CAN-ID `sender` field is only 6 bits (libcsp uses `interface_address & 0x3F`), so this is the only committed vector where `sender != source` -- every other vector uses addresses below 64, where they are trivially equal |
101
+
|`payload_empty`| 0-byte application payload, the lower bound of the v1 single-frame payload range |
102
+
|`payload_max`| 4-byte application payload, the upper bound of the v1 single-frame payload range |
103
+
|`flag_crc32`|`CSP_FLAG_CRC32` set |
104
+
|`flag_hmac`|`CSP_FLAG_HMAC` set |
105
+
|`reverse_direction`|`src=2 dst=1`: the same node pair as the baseline, addressed the other way |
106
+
107
+
`CSP_FLAG_RDP` has no committed vector (see the generation-workflow note
108
+
above); it is covered by a synthetic pack/decode round trip instead.
109
+
110
+
Regenerating every vector and diffing against what is committed is required
111
+
before merging any change to `tests/golden_vectors/src/csp_client.c` or
112
+
`src/cubesat_testbed/protocol/csp_v2.py`, and also runs nightly in CI (see
113
+
`.github/workflows/golden-vectors.yml`) so an upstream libcsp change (or a
114
+
moved `v2.1` tag) is caught even without a local change triggering it.
115
+
63
116
## Fixture contract
64
117
65
118
Every traffic dump must have a sibling `*.meta.toml` file. For example:
meaning = "Single-frame CSP v2 ping-port request from node 1 to node 2 with the CSP_FLAG_CRC32 header bit set and a zero-byte application payload (libcsp appends its own 4-byte CRC32 trailer to the payload; using a 1-byte application payload here would push the packet over the v1 single-frame limit and into multi-frame libcsp transmission, which is out of v1 scope). Covers the CRC32 flag bit; the testbed's v1 codec treats CSP flags as an opaque bitmask and does not itself compute or verify the CRC."
10
+
protocol = "CSP v2 over classic CAN 2.0B extended frame"
meaning = "Single-frame CSP v2 ping-port request from node 1 to node 2 with the CSP_FLAG_HMAC header bit set and a zero-byte application payload (libcsp appends its own 4-byte HMAC trailer to the payload; using a 1-byte application payload here would push the packet over the v1 single-frame limit and into multi-frame libcsp transmission, which is out of v1 scope). Covers the HMAC flag bit; the testbed's v1 codec treats CSP flags as an opaque bitmask and does not itself compute or verify the HMAC."
10
+
protocol = "CSP v2 over classic CAN 2.0B extended frame"
meaning = "Single-frame CSP v2 ping-port request from node 65 to node 66. The CSP v2 CAN ID's 'sender' field is only 6 bits wide (libcsp uses the low 6 bits of the outgoing interface address), so at source=65 it diverges from the full 14-bit CSP source address (sender = 65 & 0x3F = 1, not 65): the only committed vector where these two fields are not numerically identical, since every other vector uses source/destination addresses below 64."
10
+
protocol = "CSP v2 over classic CAN 2.0B extended frame"
meaning = "Single-frame CSP v2 ping-port request from node 1 to node 2 with a zero-byte application payload: only the 4-byte CSP v2 header extension is carried, covering the lower bound of the v1 single-frame payload range."
10
+
protocol = "CSP v2 over classic CAN 2.0B extended frame"
0 commit comments