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