xref: /libbtbb/lib/src/btbb.h (revision b6703d5def81e2b86b3b30523f68ac469a87b403)
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