1e25b118aSDominic Spill /* -*- c -*- */ 2e25b118aSDominic Spill /* 3e25b118aSDominic Spill * Copyright 2007 - 2013 Dominic Spill, Michael Ossmann, Will Code 4e25b118aSDominic Spill * 5e25b118aSDominic Spill * This file is part of libbtbb 6e25b118aSDominic Spill * 7e25b118aSDominic Spill * This program is free software; you can redistribute it and/or modify 8e25b118aSDominic Spill * it under the terms of the GNU General Public License as published by 9e25b118aSDominic Spill * the Free Software Foundation; either version 2, or (at your option) 10e25b118aSDominic Spill * any later version. 11e25b118aSDominic Spill * 12e25b118aSDominic Spill * This program is distributed in the hope that it will be useful, 13e25b118aSDominic Spill * but WITHOUT ANY WARRANTY; without even the implied warranty of 14e25b118aSDominic Spill * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15e25b118aSDominic Spill * GNU General Public License for more details. 16e25b118aSDominic Spill * 17e25b118aSDominic Spill * You should have received a copy of the GNU General Public License 18e25b118aSDominic Spill * along with libbtbb; see the file COPYING. If not, write to 19e25b118aSDominic Spill * the Free Software Foundation, Inc., 51 Franklin Street, 20e25b118aSDominic Spill * Boston, MA 02110-1301, USA. 21e25b118aSDominic Spill */ 22e25b118aSDominic Spill #ifndef INCLUDED_BLUETOOTH_PACKET_H 23e25b118aSDominic Spill #define INCLUDED_BLUETOOTH_PACKET_H 24e25b118aSDominic Spill #include "btbb.h" 25e25b118aSDominic Spill 26e25b118aSDominic Spill /* maximum number of symbols */ 27e25b118aSDominic Spill #define MAX_SYMBOLS 3125 28e25b118aSDominic Spill 29e25b118aSDominic Spill /* maximum number of payload bits */ 30e25b118aSDominic Spill #define MAX_PAYLOAD_LENGTH 2744 31e25b118aSDominic Spill 32e25b118aSDominic Spill /* minimum header bit errors to indicate that this is an ID packet */ 33e25b118aSDominic Spill #define ID_THRESHOLD 5 34e25b118aSDominic Spill 35*1e7f449bSDominic Spill struct btbb_packet { 36e25b118aSDominic Spill 37e25b118aSDominic Spill uint32_t refcount; 38e25b118aSDominic Spill 39e25b118aSDominic Spill uint32_t flags; 40e25b118aSDominic Spill 41e25b118aSDominic Spill uint8_t channel; /* Bluetooth channel (0-79) */ 42e25b118aSDominic Spill uint8_t UAP; /* upper address part */ 43e25b118aSDominic Spill uint16_t NAP; /* non-significant address part */ 44e25b118aSDominic Spill uint32_t LAP; /* lower address part found in access code */ 45e25b118aSDominic Spill 46e25b118aSDominic Spill uint8_t packet_type; 47e25b118aSDominic Spill uint8_t packet_lt_addr; /* LLID field of payload header (2 bits) */ 48e25b118aSDominic Spill uint8_t packet_flags; /* Flags - FLOW/ARQN/SQEN */ 49e25b118aSDominic Spill uint8_t packet_hec; /* Flags - FLOW/ARQN/SQEN */ 50e25b118aSDominic Spill 51e25b118aSDominic Spill /* packet header, one bit per char */ 52e25b118aSDominic Spill char packet_header[18]; 53e25b118aSDominic Spill 54e25b118aSDominic Spill /* number of payload header bytes: 0, 1, 2, or -1 for 55e25b118aSDominic Spill * unknown. payload is one bit per char. */ 56e25b118aSDominic Spill int payload_header_length; 57e25b118aSDominic Spill char payload_header[16]; 58e25b118aSDominic Spill 59e25b118aSDominic Spill /* LLID field of payload header (2 bits) */ 60e25b118aSDominic Spill uint8_t payload_llid; 61e25b118aSDominic Spill 62e25b118aSDominic Spill /* flow field of payload header (1 bit) */ 63e25b118aSDominic Spill uint8_t payload_flow; 64e25b118aSDominic Spill 65e25b118aSDominic Spill /* payload length: the total length of the asynchronous data 66e25b118aSDominic Spill * in bytes. This does not include the length of synchronous 67e25b118aSDominic Spill * data, such as the voice field of a DV packet. If there is a 68e25b118aSDominic Spill * payload header, this payload length is payload body length 69e25b118aSDominic Spill * (the length indicated in the payload header's length field) 70e25b118aSDominic Spill * plus payload_header_length plus 2 bytes CRC (if present). 71e25b118aSDominic Spill */ 72e25b118aSDominic Spill int payload_length; 73e25b118aSDominic Spill 74e25b118aSDominic Spill /* The actual payload data in host format 75e25b118aSDominic Spill * Ready for passing to wireshark 76e25b118aSDominic Spill * 2744 is the maximum length, but most packets are shorter. 77e25b118aSDominic Spill * Dynamic allocation would probably be better in the long run but is 78e25b118aSDominic Spill * problematic in the short run. 79e25b118aSDominic Spill */ 80e25b118aSDominic Spill char payload[MAX_PAYLOAD_LENGTH]; 81e25b118aSDominic Spill 82e25b118aSDominic Spill uint16_t crc; 83e25b118aSDominic Spill uint32_t clock; /* CLK1-27 of master */ 84e25b118aSDominic Spill uint32_t clkn; /* native (local) clock, CLK0-27 */ 85e25b118aSDominic Spill uint8_t ac_errors; /* Number of bit errors in the AC */ 86e25b118aSDominic Spill 87e25b118aSDominic Spill /* the raw symbol stream (less the preamble), one bit per char */ 88e25b118aSDominic Spill //FIXME maybe this should be a vector so we can grow it only 89e25b118aSDominic Spill //to the size needed and later shrink it if we find we have 90e25b118aSDominic Spill //more symbols than necessary 91e25b118aSDominic Spill uint16_t length; /* number of symbols */ 92e25b118aSDominic Spill char symbols[MAX_SYMBOLS]; 93e25b118aSDominic Spill 94*1e7f449bSDominic Spill }; 95e25b118aSDominic Spill 96e25b118aSDominic Spill /* type-specific CRC checks and decoding */ 97e25b118aSDominic Spill int fhs(int clock, btbb_packet* p); 98e25b118aSDominic Spill int DM(int clock, btbb_packet* p); 99e25b118aSDominic Spill int DH(int clock, btbb_packet* p); 100e25b118aSDominic Spill int EV3(int clock, btbb_packet* p); 101e25b118aSDominic Spill int EV4(int clock, btbb_packet* p); 102e25b118aSDominic Spill int EV5(int clock, btbb_packet* p); 103e25b118aSDominic Spill int HV(int clock, btbb_packet* p); 104e25b118aSDominic Spill 105e25b118aSDominic Spill /* check if the packet's CRC is correct for a given clock (CLK1-6) */ 106e25b118aSDominic Spill int crc_check(int clock, btbb_packet* p); 107e25b118aSDominic Spill 108e25b118aSDominic Spill /* format payload for tun interface */ 109e25b118aSDominic Spill char *tun_format(btbb_packet* p); 110e25b118aSDominic Spill 111e25b118aSDominic Spill /* try a clock value (CLK1-6) to unwhiten packet header, 112e25b118aSDominic Spill * sets resultant d_packet_type and d_UAP, returns UAP. 113e25b118aSDominic Spill */ 114e25b118aSDominic Spill uint8_t try_clock(int clock, btbb_packet* p); 115e25b118aSDominic Spill 116e25b118aSDominic Spill /* extract LAP from FHS payload */ 117e25b118aSDominic Spill uint32_t lap_from_fhs(btbb_packet* p); 118e25b118aSDominic Spill 119e25b118aSDominic Spill /* extract UAP from FHS payload */ 120e25b118aSDominic Spill uint8_t uap_from_fhs(btbb_packet* p); 121e25b118aSDominic Spill 122e25b118aSDominic Spill /* extract NAP from FHS payload */ 123e25b118aSDominic Spill uint16_t nap_from_fhs(btbb_packet* p); 124e25b118aSDominic Spill 125e25b118aSDominic Spill /* extract clock from FHS payload */ 126e25b118aSDominic Spill uint32_t clock_from_fhs(btbb_packet* p); 127e25b118aSDominic Spill 128e25b118aSDominic Spill #endif /* INCLUDED_BLUETOOTH_PACKET_H */ 129