1 /* -*- c -*- */ 2 /* 3 * Copyright 2007 - 2013 Dominic Spill, Michael Ossmann, Will Code 4 * 5 * This file is part of libbtbb 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with libbtbb; see the file COPYING. If not, write to 19 * the Free Software Foundation, Inc., 51 Franklin Street, 20 * Boston, MA 02110-1301, USA. 21 */ 22 #ifndef INCLUDED_BTBB_H 23 #define INCLUDED_BTBB_H 24 25 #include <stdint.h> 26 27 #define BTBB_WHITENED 0 28 #define BTBB_NAP_VALID 1 29 #define BTBB_UAP_VALID 2 30 #define BTBB_LAP_VALID 3 31 #define BTBB_CLK6_VALID 4 32 #define BTBB_CLK27_VALID 5 33 #define BTBB_CRC_CORRECT 6 34 #define BTBB_HAS_PAYLOAD 7 35 #define BTBB_IS_EDR 8 36 37 #define BTBB_HOP_REVERSAL_INIT 9 38 #define BTBB_GOT_FIRST_PACKET 10 39 #define BTBB_IS_AFH 11 40 #define BTBB_LOOKS_LIKE_AFH 12 41 #define BTBB_IS_ALIASED 13 42 #define BTBB_FOLLOWING 14 43 44 /* Payload modulation */ 45 #define BTBB_MOD_UNKNOWN 0x00 46 #define BTBB_MOD_GFSK 0x01 47 #define BTBB_MOD_PI_OVER_2_DQPSK 0x02 48 #define BTBB_MOD_8DPSK 0x03 49 50 /* Transport types */ 51 #define BTBB_TRANSPORT_ANY 0x00 52 #define BTBB_TRANSPORT_SCO 0x01 53 #define BTBB_TRANSPORT_ESCO 0x02 54 #define BTBB_TRANSPORT_ACL 0x03 55 #define BTBB_TRANSPORT_CSB 0x04 56 57 #ifdef __cplusplus 58 extern "C" 59 { 60 #endif 61 62 /* BT BR/EDR support */ 63 64 typedef struct btbb_packet btbb_packet; 65 66 /* Initialize the library. Compute the syndrome. Return 0 on success, 67 * negative on error. 68 * 69 * The library limits max_ac_errors to 5. Using a larger value will 70 * take up a lot of memory (several GB), without decoding many useful 71 * packets. Even a limit of 5 results in a syndrome table of several 72 * hundred MB and lots of noise. For embedded targets, a value of 2 is 73 * reasonable. */ 74 int btbb_init(int max_ac_errors); 75 76 char *btbb_get_release(void); 77 char *btbb_get_version(void); 78 79 btbb_packet *btbb_packet_new(void); 80 void btbb_packet_ref(btbb_packet *pkt); 81 void btbb_packet_unref(btbb_packet *pkt); 82 83 /* Search for a packet with specified LAP (or LAP_ANY). The stream 84 * must be at least of length serch_length + 72. Limit to 85 * 'max_ac_errors' bit errors. 86 * 87 * Returns offset into 'stream' at which packet was found. If no 88 * packet was found, returns a negative number. If LAP_ANY was 89 * specified, fills lap. 'ac_errors' must be set as an input, replaced 90 * by actual number of errors on output. */ 91 int btbb_find_ac(char *stream, 92 int search_length, 93 uint32_t lap, 94 int max_ac_errors, 95 btbb_packet **pkt); 96 #define LAP_ANY 0xffffffffUL 97 #define UAP_ANY 0xff 98 99 void btbb_packet_set_flag(btbb_packet *pkt, int flag, int val); 100 int btbb_packet_get_flag(const btbb_packet *pkt, int flag); 101 102 uint32_t btbb_packet_get_lap(const btbb_packet *pkt); 103 void btbb_packet_set_uap(btbb_packet *pkt, uint8_t uap); 104 uint8_t btbb_packet_get_uap(const btbb_packet *pkt); 105 uint16_t btbb_packet_get_nap(const btbb_packet *pkt); 106 107 void btbb_packet_set_modulation(btbb_packet *pkt, uint8_t modulation); 108 void btbb_packet_set_transport(btbb_packet *pkt, uint8_t transport); 109 uint8_t btbb_packet_get_modulation(const btbb_packet *pkt); 110 uint8_t btbb_packet_get_transport(const btbb_packet *pkt); 111 112 uint8_t btbb_packet_get_channel(const btbb_packet *pkt); 113 uint8_t btbb_packet_get_ac_errors(const btbb_packet *pkt); 114 uint32_t btbb_packet_get_clkn(const btbb_packet *pkt); 115 uint32_t btbb_packet_get_header_packed(const btbb_packet* pkt); 116 117 void btbb_packet_set_data(btbb_packet *pkt, 118 char *syms, // Symbol data 119 int length, // Number of symbols 120 uint8_t channel, // Bluetooth channel 0-79 121 uint32_t clkn); // 312.5us clock (CLK27-0) 122 123 /* Get a pointer to packet symbols. */ 124 const char *btbb_get_symbols(const btbb_packet* pkt); 125 126 int btbb_packet_get_payload_length(const btbb_packet* pkt); 127 128 /* Get a pointer to payload. */ 129 const char *btbb_get_payload(const btbb_packet* pkt); 130 131 /* Pack the payload in to bytes */ 132 int btbb_get_payload_packed(const btbb_packet* pkt, char *dst); 133 134 uint8_t btbb_packet_get_type(const btbb_packet* pkt); 135 uint8_t btbb_packet_get_lt_addr(const btbb_packet* pkt); 136 uint8_t btbb_packet_get_header_flags(const btbb_packet* pkt); 137 uint8_t btbb_packet_get_hec(const btbb_packet *pkt); 138 139 /* Generate Sync Word from an LAP */ 140 uint64_t btbb_gen_syncword(const int LAP); 141 142 /* decode the packet header */ 143 int btbb_decode_header(btbb_packet* pkt); 144 145 /* decode the packet header */ 146 int btbb_decode_payload(btbb_packet* pkt); 147 148 /* print packet information */ 149 void btbb_print_packet(const btbb_packet* pkt); 150 151 /* check to see if the packet has a header */ 152 int btbb_header_present(const btbb_packet* pkt); 153 154 /* Packet queue (linked list) */ 155 typedef struct pkt_queue { 156 btbb_packet *pkt; 157 158 struct pkt_queue *next; 159 160 } pkt_queue; 161 162 typedef struct btbb_piconet btbb_piconet; 163 164 btbb_piconet *btbb_piconet_new(void); 165 void btbb_piconet_ref(btbb_piconet *pn); 166 void btbb_piconet_unref(btbb_piconet *pn); 167 168 /* initialize the piconet struct */ 169 void btbb_init_piconet(btbb_piconet *pn, uint32_t lap); 170 171 void btbb_piconet_set_uap(btbb_piconet *pn, uint8_t uap); 172 uint8_t btbb_piconet_get_uap(const btbb_piconet *pn); 173 uint32_t btbb_piconet_get_lap(const btbb_piconet *pn); 174 uint16_t btbb_piconet_get_nap(const btbb_piconet *pn); 175 uint64_t btbb_piconet_get_bdaddr(const btbb_piconet *pn); 176 177 int btbb_piconet_get_clk_offset(const btbb_piconet *pn); 178 void btbb_piconet_set_clk_offset(btbb_piconet *pn, int clk_offset); 179 180 void btbb_piconet_set_flag(btbb_piconet *pn, int flag, int val); 181 int btbb_piconet_get_flag(const btbb_piconet *pn, int flag); 182 183 uint8_t btbb_piconet_set_channel_seen(btbb_piconet *pn, uint8_t channel); 184 uint8_t btbb_piconet_clear_channel_seen(btbb_piconet *pn, uint8_t channel); 185 uint8_t btbb_piconet_get_channel_seen(btbb_piconet *pn, uint8_t channel); 186 void btbb_piconet_set_afh_map(btbb_piconet *pn, uint8_t *afh_map); 187 uint8_t *btbb_piconet_get_afh_map(btbb_piconet *pn); 188 189 /* Extract as much information (LAP/UAP/CLK) as possible from received packet */ 190 int btbb_process_packet(btbb_packet *pkt, btbb_piconet *pn); 191 192 /* use packet headers to determine UAP */ 193 int btbb_uap_from_header(btbb_packet *pkt, btbb_piconet *pn); 194 195 /* Print hexadecimal representation of the derived AFH map */ 196 void btbb_print_afh_map(btbb_piconet *pn); 197 198 /* decode a whole packet from the given piconet */ 199 int btbb_decode(btbb_packet* pkt, btbb_piconet *pn); 200 201 202 /* initialize the hop reversal process */ 203 /* returns number of initial candidates for CLK1-27 */ 204 int btbb_init_hop_reversal(int aliased, btbb_piconet *pn); 205 206 /* narrow a list of candidate clock values based on all observed hops */ 207 int btbb_winnow(btbb_piconet *pn); 208 209 int btbb_init_survey(void); 210 /* Destructively iterate over survey results - optionally remove elements */ 211 btbb_piconet *btbb_next_survey_result(void); 212 213 typedef struct btbb_pcapng_handle btbb_pcapng_handle; 214 /* create a PCAPNG file for BREDR captures */ 215 int btbb_pcapng_create_file(const char *filename, const char *interface_desc, btbb_pcapng_handle ** ph); 216 /* save a BREDR packet to PCAPNG capture file */ 217 int btbb_pcapng_append_packet(btbb_pcapng_handle * h, const uint64_t ns, 218 const int8_t sigdbm, const int8_t noisedbm, 219 const uint32_t reflap, const uint8_t refuap, 220 const btbb_packet *pkt); 221 /* record a BDADDR to PCAPNG capture file */ 222 int btbb_pcapng_record_bdaddr(btbb_pcapng_handle * h, const uint64_t bdaddr, 223 const uint8_t uapmask, const uint8_t napvalid); 224 /* record BT CLOCK to PCAPNG capture file */ 225 int btbb_pcapng_record_btclock(btbb_pcapng_handle * h, const uint64_t bdaddr, 226 const uint64_t ns, const uint32_t clk, const uint32_t clkmask); 227 int btbb_pcapng_close(btbb_pcapng_handle * h); 228 229 230 /* BLE support */ 231 typedef struct lell_packet lell_packet; 232 /* decode and allocate LE packet */ 233 void lell_allocate_and_decode(const uint8_t *stream, uint16_t phys_channel, uint32_t clk100ns, lell_packet **pkt); 234 lell_packet *lell_packet_new(void); 235 void lell_packet_ref(lell_packet *pkt); 236 void lell_packet_unref(lell_packet *pkt); 237 uint32_t lell_get_access_address(const lell_packet *pkt); 238 unsigned lell_get_access_address_offenses(const lell_packet *pkt); 239 unsigned lell_packet_is_data(const lell_packet *pkt); 240 unsigned lell_get_channel_index(const lell_packet *pkt); 241 unsigned lell_get_channel_k(const lell_packet *pkt); 242 const char * lell_get_adv_type_str(const lell_packet *pkt); 243 void lell_print(const lell_packet *pkt); 244 245 typedef struct lell_pcapng_handle lell_pcapng_handle; 246 /* create a PCAPNG file for LE captures */ 247 int lell_pcapng_create_file(const char *filename, const char *interface_desc, lell_pcapng_handle ** ph); 248 /* save an LE packet to PCAPNG capture file */ 249 int lell_pcapng_append_packet(lell_pcapng_handle * h, const uint64_t ns, 250 const int8_t sigdbm, const int8_t noisedbm, 251 const uint32_t refAA, const lell_packet *pkt); 252 /* record LE CONNECT_REQ parameters to PCAPNG capture file */ 253 int lell_pcapng_record_connect_req(lell_pcapng_handle * h, const uint64_t ns, const uint8_t * pdu); 254 int lell_pcapng_close(lell_pcapng_handle *h); 255 256 257 /* PCAP Support */ 258 typedef struct btbb_pcap_handle btbb_pcap_handle; 259 /* create a PCAP file for BREDR captures with LINKTYPE_BLUETOOTH_BREDR_BB */ 260 int btbb_pcap_create_file(const char *filename, btbb_pcap_handle ** ph); 261 /* write a BREDR packet to PCAP file */ 262 int btbb_pcap_append_packet(btbb_pcap_handle * h, const uint64_t ns, 263 const int8_t sigdbm, const int8_t noisedbm, 264 const uint32_t reflap, const uint8_t refuap, 265 const btbb_packet *pkt); 266 int btbb_pcap_close(btbb_pcap_handle * h); 267 268 typedef struct lell_pcap_handle lell_pcap_handle; 269 /* create a PCAP file for LE captures using LINKTYPE_BLUETOOTH_LE_LL_WITH_PHDR */ 270 int lell_pcap_create_file(const char *filename, lell_pcap_handle ** ph); 271 /* create a PCAP file for LE captures using LINKTYPE_PPI */ 272 int lell_pcap_ppi_create_file(const char *filename, int btle_ppi_version, lell_pcap_handle ** ph); 273 /* save an LE packet to PCAP capture file */ 274 int lell_pcap_append_packet(lell_pcap_handle * h, const uint64_t ns, 275 const int8_t sigdbm, const int8_t noisedbm, 276 const uint32_t refAA, const lell_packet *pkt); 277 int lell_pcap_append_ppi_packet(lell_pcap_handle * h, const uint64_t ns, 278 const uint8_t clkn_high, 279 const int8_t rssi_min, const int8_t rssi_max, 280 const int8_t rssi_avg, const uint8_t rssi_count, 281 const lell_packet *pkt); 282 int lell_pcap_close(lell_pcap_handle *h); 283 284 #ifdef __cplusplus 285 } // __cplusplus defined. 286 #endif 287 288 #endif /* INCLUDED_BTBB_H */ 289