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 3595079a24SDominic Spill #define PACKET_TYPE_NULL 0 3695079a24SDominic Spill #define PACKET_TYPE_POLL 1 3795079a24SDominic Spill #define PACKET_TYPE_FHS 2 3895079a24SDominic Spill #define PACKET_TYPE_DM1 3 3995079a24SDominic Spill #define PACKET_TYPE_DH1 4 4095079a24SDominic Spill #define PACKET_TYPE_HV1 5 4195079a24SDominic Spill #define PACKET_TYPE_HV2 6 4295079a24SDominic Spill #define PACKET_TYPE_HV3 7 4395079a24SDominic Spill #define PACKET_TYPE_DV 8 4495079a24SDominic Spill #define PACKET_TYPE_AUX1 9 4595079a24SDominic Spill #define PACKET_TYPE_DM3 10 4695079a24SDominic Spill #define PACKET_TYPE_DH3 11 4795079a24SDominic Spill #define PACKET_TYPE_EV4 12 4895079a24SDominic Spill #define PACKET_TYPE_EV5 13 4995079a24SDominic Spill #define PACKET_TYPE_DM5 14 5095079a24SDominic Spill #define PACKET_TYPE_DH5 15 5195079a24SDominic Spill 521e7f449bSDominic Spill struct btbb_packet { 53e25b118aSDominic Spill 54e25b118aSDominic Spill uint32_t refcount; 55e25b118aSDominic Spill 56e25b118aSDominic Spill uint32_t flags; 57e25b118aSDominic Spill 58e25b118aSDominic Spill uint8_t channel; /* Bluetooth channel (0-79) */ 59e25b118aSDominic Spill uint8_t UAP; /* upper address part */ 60e25b118aSDominic Spill uint16_t NAP; /* non-significant address part */ 61e25b118aSDominic Spill uint32_t LAP; /* lower address part found in access code */ 62e25b118aSDominic Spill 63f83b85cfSDominic Spill uint8_t modulation; 64f83b85cfSDominic Spill uint8_t transport; 65e25b118aSDominic Spill uint8_t packet_type; 66e25b118aSDominic Spill uint8_t packet_lt_addr; /* LLID field of payload header (2 bits) */ 67e25b118aSDominic Spill uint8_t packet_flags; /* Flags - FLOW/ARQN/SQEN */ 68e25b118aSDominic Spill uint8_t packet_hec; /* Flags - FLOW/ARQN/SQEN */ 69e25b118aSDominic Spill 70e25b118aSDominic Spill /* packet header, one bit per char */ 71e25b118aSDominic Spill char packet_header[18]; 72e25b118aSDominic Spill 73e25b118aSDominic Spill /* number of payload header bytes: 0, 1, 2, or -1 for 74e25b118aSDominic Spill * unknown. payload is one bit per char. */ 75e25b118aSDominic Spill int payload_header_length; 76e25b118aSDominic Spill char payload_header[16]; 77e25b118aSDominic Spill 78e25b118aSDominic Spill /* LLID field of payload header (2 bits) */ 79e25b118aSDominic Spill uint8_t payload_llid; 80e25b118aSDominic Spill 81e25b118aSDominic Spill /* flow field of payload header (1 bit) */ 82e25b118aSDominic Spill uint8_t payload_flow; 83e25b118aSDominic Spill 84e25b118aSDominic Spill /* payload length: the total length of the asynchronous data 85e25b118aSDominic Spill * in bytes. This does not include the length of synchronous 86e25b118aSDominic Spill * data, such as the voice field of a DV packet. If there is a 87e25b118aSDominic Spill * payload header, this payload length is payload body length 88e25b118aSDominic Spill * (the length indicated in the payload header's length field) 89e25b118aSDominic Spill * plus payload_header_length plus 2 bytes CRC (if present). 90e25b118aSDominic Spill */ 91e25b118aSDominic Spill int payload_length; 92e25b118aSDominic Spill 93e25b118aSDominic Spill /* The actual payload data in host format 94e25b118aSDominic Spill * Ready for passing to wireshark 95e25b118aSDominic Spill * 2744 is the maximum length, but most packets are shorter. 96e25b118aSDominic Spill * Dynamic allocation would probably be better in the long run but is 97e25b118aSDominic Spill * problematic in the short run. 98e25b118aSDominic Spill */ 99e25b118aSDominic Spill char payload[MAX_PAYLOAD_LENGTH]; 100e25b118aSDominic Spill 101e25b118aSDominic Spill uint16_t crc; 102*c4e05ee8SHannes Ellinger uint32_t clkn; /* CLK1-27 of the packet */ 103e25b118aSDominic Spill uint8_t ac_errors; /* Number of bit errors in the AC */ 104e25b118aSDominic Spill 105e25b118aSDominic Spill /* the raw symbol stream (less the preamble), one bit per char */ 106e25b118aSDominic Spill //FIXME maybe this should be a vector so we can grow it only 107e25b118aSDominic Spill //to the size needed and later shrink it if we find we have 108e25b118aSDominic Spill //more symbols than necessary 109e25b118aSDominic Spill uint16_t length; /* number of symbols */ 110e25b118aSDominic Spill char symbols[MAX_SYMBOLS]; 111e25b118aSDominic Spill 1121e7f449bSDominic Spill }; 113e25b118aSDominic Spill 114e25b118aSDominic Spill /* type-specific CRC checks and decoding */ 115e25b118aSDominic Spill int fhs(int clock, btbb_packet* p); 116e25b118aSDominic Spill int DM(int clock, btbb_packet* p); 117e25b118aSDominic Spill int DH(int clock, btbb_packet* p); 118e25b118aSDominic Spill int EV3(int clock, btbb_packet* p); 119e25b118aSDominic Spill int EV4(int clock, btbb_packet* p); 120e25b118aSDominic Spill int EV5(int clock, btbb_packet* p); 121e25b118aSDominic Spill int HV(int clock, btbb_packet* p); 122e25b118aSDominic Spill 123e25b118aSDominic Spill /* check if the packet's CRC is correct for a given clock (CLK1-6) */ 124e25b118aSDominic Spill int crc_check(int clock, btbb_packet* p); 125e25b118aSDominic Spill 126e25b118aSDominic Spill /* format payload for tun interface */ 127e25b118aSDominic Spill char *tun_format(btbb_packet* p); 128e25b118aSDominic Spill 129e25b118aSDominic Spill /* try a clock value (CLK1-6) to unwhiten packet header, 130e25b118aSDominic Spill * sets resultant d_packet_type and d_UAP, returns UAP. 131e25b118aSDominic Spill */ 132e25b118aSDominic Spill uint8_t try_clock(int clock, btbb_packet* p); 133e25b118aSDominic Spill 134e25b118aSDominic Spill /* extract LAP from FHS payload */ 135e25b118aSDominic Spill uint32_t lap_from_fhs(btbb_packet* p); 136e25b118aSDominic Spill 137e25b118aSDominic Spill /* extract UAP from FHS payload */ 138e25b118aSDominic Spill uint8_t uap_from_fhs(btbb_packet* p); 139e25b118aSDominic Spill 140e25b118aSDominic Spill /* extract NAP from FHS payload */ 141e25b118aSDominic Spill uint16_t nap_from_fhs(btbb_packet* p); 142e25b118aSDominic Spill 143e25b118aSDominic Spill /* extract clock from FHS payload */ 144e25b118aSDominic Spill uint32_t clock_from_fhs(btbb_packet* p); 145e25b118aSDominic Spill 146e25b118aSDominic Spill #endif /* INCLUDED_BLUETOOTH_PACKET_H */ 147