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