void ll_packet(uint16_t frequency, const void *data, uint8_t size) { const struct bt_ll_hdr *hdr = data; uint8_t channel = (frequency - 2402) / 2; uint32_t access_addr; char access_str[12]; const char *channel_label, *channel_color; const uint8_t *pdu_data; uint8_t pdu_len; uint32_t pdu_crc, crc, crc_init; if (size < sizeof(*hdr)) { print_text(COLOR_ERROR, "packet missing header"); packet_hexdump(data, size); return; } if (size < sizeof(*hdr) + 3) { print_text(COLOR_ERROR, "packet missing checksum"); packet_hexdump(data, size); return; } if (hdr->preamble != 0xaa && hdr->preamble != 0x55) { print_text(COLOR_ERROR, "invalid preamble"); packet_hexdump(data, size); return; } access_addr = le32_to_cpu(hdr->access_addr); pdu_data = data + sizeof(*hdr); pdu_len = size - sizeof(*hdr) - 3; pdu_crc = pdu_data[pdu_len + 0] | (pdu_data[pdu_len + 1] << 8) | (pdu_data[pdu_len + 2] << 16); if (access_addr == 0x8e89bed6) { channel_label = "Advertising channel: "; channel_color = COLOR_MAGENTA; } else { channel_label = "Data channel: "; channel_color = COLOR_CYAN; } sprintf(access_str, "0x%8.8x", access_addr); print_indent(6, channel_color, channel_label, access_str, COLOR_OFF, " (channel %d) len %d crc 0x%6.6x", channel, pdu_len, pdu_crc); if (access_addr == 0x8e89bed6) crc_init = 0xaaaaaa; else crc_init = get_crc_init(access_addr); if (crc_init) { crc = crc24_calculate(crc_init, pdu_data, pdu_len); if (crc != pdu_crc) { print_text(COLOR_ERROR, "invalid checksum"); packet_hexdump(pdu_data, pdu_len); return; } } else print_text(COLOR_ERROR, "unknown access address"); if (access_addr == 0x8e89bed6) advertising_packet(pdu_data, pdu_len); else data_packet(pdu_data, pdu_len); }
data_packet receive_data() { return data_packet(); }