12#if PC_ENABLE_RADIO_SNIFF
14uint32_t pc_radiosniff_i2f32(int32_t dbm)
25 mag = (uint32_t)(-(int64_t)dbm);
32 while (!((mag >> e) & 1u))
36 uint32_t exp = (uint32_t)(127 + e);
37 uint32_t mant = (e >= 23) ? ((mag >> (e - 23)) & 0x7FFFFFu) : ((mag << (23 - e)) & 0x7FFFFFu);
38 return sign | (exp << 23) | mant;
41size_t pc_radiosniff_global(uint8_t *out,
size_t cap)
46size_t pc_radiosniff_tap_record(uint8_t *out,
size_t cap,
const uint8_t *frame,
size_t flen, int32_t rssi_dbm,
47 uint16_t channel, uint32_t ts_sec, uint32_t ts_usec)
49 if (!out || !frame || flen == 0)
53 size_t caplen = RADIO_SNIFF_TAP_LEN + flen;
71 pc_wr32le(p + 8, pc_radiosniff_i2f32(rssi_dbm));
80 uint8_t *f = p + RADIO_SNIFF_TAP_LEN;
81 for (
size_t i = 0; i < flen; i++)
Fixed-width integer serializers into a raw uint8_t* buffer - one source of truth.
size_t pc_wr32le(uint8_t *p, uint32_t v)
Write v little-endian at p.
size_t pc_wr16le(uint8_t *p, uint16_t v)
Write v little-endian at p.
size_t pc_pcap_record_header(uint8_t *out, size_t cap, uint32_t ts_sec, uint32_t ts_usec, uint32_t caplen, uint32_t origlen)
Write a 16-byte libpcap record header for one captured frame.
#define PC_PCAP_REC_HDR_LEN
size_t pc_pcap_global_header(uint8_t *out, size_t cap, uint32_t linktype)
Write the 24-byte libpcap global header (little-endian, microsecond timestamps).
#define PC_DLT_IEEE802_15_4_TAP
802.15.4 with a TAP pseudo-header (RSSI / channel TLVs)
Receive-only radio channel sniffer -> pcap capture records (PC_ENABLE_RADIO_SNIFF).