ccc_mac.c
UWB MAC: hopping sequence, SP0 frame codec, ranging schedule.
Overview
UWB MAC: hopping sequence, SP0 frame codec, ranging schedule.
depends on ccc_mac.h
flowchart TD ccc_block_round --> ccc_hop_round_index
API
Fuint16_t ccc_hop_round_index(uint32_t block_index, uint32_t hop_key_rw, uint32_t n_round)
Default hopping round index S(i) in [0, n_round) for a ranging block.
block_index- Block index i.
hop_key_rw- HOP_Key_RW value keying the hop calculation.
n_round- Total number of ranging rounds.
- returns
- Round index in [0, n_round).
ccc_block_round, ccc_initiator_next_hopFstatic void put_le16(uint8_t *p, uint16_t v)
Store a uint16 little-endian.
ccc_build_mhr, ccc_final_data_pack, ccc_pre_poll_packFstatic void put_le32(uint8_t *p, uint32_t v)
Store a uint32 little-endian.
ccc_build_mhr, ccc_final_data_pack, ccc_pre_poll_packFstatic uint16_t get_le16(const uint8_t *p)
Load a uint16 little-endian.
ccc_final_data_parse, ccc_parse_mhr, ccc_pre_poll_parseFstatic uint32_t get_le32(const uint8_t *p)
Load a uint32 little-endian.
ccc_final_data_parse, ccc_parse_mhr, ccc_pre_poll_parseFstatic bool mhr_vendor_oui_ok(const uint8_t *p)
True if the 3-byte little-endian OUI at p is the CCC or Aliro OUI (both accepted).
ccc_parse_mhrFint ccc_build_mhr(const struct ccc_mhr_fields *f, uint8_t out[CCC_MHR_LEN])
Build the 23-byte SP0 MHR little-endian on the wire.
f- MHR fields (destination address, frame counter, key source, message ID, payload length).
out- Output buffer of at least CCC_MHR_LEN bytes.
- returns
- 0 on success, -EINVAL if inputs are null.
put_le16, put_le32Fint ccc_parse_mhr(const uint8_t in[CCC_MHR_LEN], struct ccc_mhr_fields *f)
Parse and validate a 23-byte SP0 MHR, extracting variable fields.
in- Input buffer of exactly CCC_MHR_LEN bytes.
f- Output structure to hold parsed fields (destination address, frame counter, key source, message ID, payload length).
- returns
- 0 on success, -EINVAL on mismatch or null input.
get_le16, get_le32, mhr_vendor_oui_okFint ccc_pre_poll_pack(const struct ccc_pre_poll *p, uint8_t out[CCC_PRE_POLL_LEN])
Pack a Pre-POLL payload little-endian.
p- Pre-POLL structure (session ID, STS index, ranging block, hop flag, round index).
out- Output buffer of at least CCC_PRE_POLL_LEN bytes.
- returns
- 0 on success, -EINVAL if inputs are null.
put_le16, put_le32Fint ccc_pre_poll_parse(const uint8_t in[CCC_PRE_POLL_LEN], struct ccc_pre_poll *p)
Parse a 13-byte Pre-POLL payload.
in- Input buffer of exactly CCC_PRE_POLL_LEN bytes.
p- Output structure to hold parsed fields (session ID, STS index, ranging block, hop flag, round index).
- returns
- 0 on success, -EINVAL if inputs are null.
get_le16, get_le32Fint ccc_final_data_pack(const struct ccc_final_data *f, uint8_t *out, size_t cap, size_t *len)
Pack a Final_Data payload little-endian.
f- Final_Data structure (session ID, ranging block, hop flag, round index, STS index, timestamp, responder list).
out- Output buffer.
cap- Capacity of output buffer.
len- Output: number of bytes written.
- returns
- 0 on success, -EINVAL if inputs are null, responder count exceeds CCC_MAX_RESPONDERS, or buffer is too small.
put_le16, put_le32Fint ccc_final_data_parse(const uint8_t *in, size_t len, struct ccc_final_data *f)
Parse a Final_Data payload.
in- Input buffer.
len- Length of input buffer.
f- Output structure to hold parsed fields (session ID, ranging block, hop flag, round index, STS index, timestamp, responder list).
- returns
- 0 on success, -EINVAL if inputs are null, input length is inconsistent with responder count, or responder count exceeds CCC_MAX_RESPONDERS.
get_le16, get_le32Fstatic uint32_t slot_offset(const struct ccc_ran_params *p, enum ccc_slot slot, uint8_t responder)
STS-index offset of a slot within its ranging round.
ccc_slot_sts_indexFuint16_t ccc_block_round(const struct ccc_ran_params *p, uint32_t block)
The ranging round a block uses (block 0 uses round 0; continuous hopping uses S(i) for i>=1).
p- Ranging parameters.
block- Block index.
- returns
- Round index in [0, n_round).
ccc_hop_round_indexFuint32_t ccc_slot_sts_index(const struct ccc_ran_params *p, uint32_t block, uint16_t round, enum ccc_slot slot, uint8_t responder)
STS index for one slot of a ranging round (wraps mod 2^32).
p- Ranging parameters.
block- Block index.
round- Round index.
slot- Slot type (POLL, Response, or Final).
responder- Responder index.
- returns
- STS index for the slot.
slot_offsetFstruct ccc_hop_decision ccc_initiator_next_hop(const struct ccc_ran_params *p, uint32_t block)
The initiator's hop decision for the block after block, written into its Final_Data.
p- Ranging parameters.
block- Block index.
- returns
- Hop decision (hop flag and next round index); both zero if hopping is disabled or params are null.
ccc_hop_round_indexFuint32_t ccc_ds_twr_tof(const struct ccc_ds_twr *t)
DS-TWR one-way time-of-flight in timestamp ticks.
t- DS-TWR intervals (round-trip and reply times at both ends).
- returns
- Time-of-flight in ticks, or 0 if the denominator is 0 or input is null.
Fint ccc_responder_ds_twr(const struct ccc_final_data *fd, uint8_t responder, uint32_t t_reply1, uint32_t t_round2, struct ccc_ds_twr *out)
Assemble the DS-TWR intervals at the responder from a received Final_Data.
Fbool ccc_ursk_exhausted(const struct ccc_ran_params *p, uint32_t block)
Whether the current URSK is exhausted for a ranging block (true once its highest STS index would exceed 2^31-1).