xref: /libbtbb/lib/src/bluetooth_piconet.h (revision ed0dc6dc813a8ae8b50913ccbe5ede9730dbcc6a)
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_PICONET_H
23e25b118aSDominic Spill #define INCLUDED_BLUETOOTH_PICONET_H
24e25b118aSDominic Spill #include "btbb.h"
25e25b118aSDominic Spill 
26e25b118aSDominic Spill /* maximum number of hops to remember */
27e25b118aSDominic Spill #define MAX_PATTERN_LENGTH 1000
28e25b118aSDominic Spill 
29e25b118aSDominic Spill /* number of channels in use */
30e25b118aSDominic Spill #define BT_NUM_CHANNELS 79
31e25b118aSDominic Spill 
321e7f449bSDominic Spill struct btbb_piconet {
33e25b118aSDominic Spill 
34e25b118aSDominic Spill 	uint32_t refcount;
35e25b118aSDominic Spill 
36e25b118aSDominic Spill 	uint32_t flags;
37e25b118aSDominic Spill 
38e25b118aSDominic Spill 	/* true if using a particular aliased receiver implementation */
39e25b118aSDominic Spill 	int aliased;
40e25b118aSDominic Spill 
41e25b118aSDominic Spill 	/* AFH channel map - either read or derived from observed packets */
42e25b118aSDominic Spill 	uint8_t afh_map[10];
43e25b118aSDominic Spill 
44*f1965e4dSHannes Ellinger 	/* Number of used channel derived from AFH channel map */
45*f1965e4dSHannes Ellinger 	uint8_t used_channels;
46*f1965e4dSHannes Ellinger 
47e25b118aSDominic Spill 	/* lower address part (of master's BD_ADDR) */
48e25b118aSDominic Spill 	uint32_t LAP;
49e25b118aSDominic Spill 
50e25b118aSDominic Spill 	/* upper address part (of master's BD_ADDR) */
51e25b118aSDominic Spill 	uint8_t UAP;
52e25b118aSDominic Spill 
53e25b118aSDominic Spill 	/* non-significant address part (of master's BD_ADDR) */
54e25b118aSDominic Spill 	uint16_t NAP;
55e25b118aSDominic Spill 
56e25b118aSDominic Spill 	/* CLK1-27 candidates */
57e25b118aSDominic Spill 	uint32_t *clock_candidates;
58e25b118aSDominic Spill 
59e25b118aSDominic Spill 	/* these values for hop() can be precalculated */
60e25b118aSDominic Spill 	int b, e;
61e25b118aSDominic Spill 
62e25b118aSDominic Spill 	/* these values for hop() can be precalculated in part (e.g. a1 is the
63e25b118aSDominic Spill 	 * precalculated part of a) */
64e25b118aSDominic Spill 	int a1, c1, d1;
65e25b118aSDominic Spill 
66e25b118aSDominic Spill 	/* frequency register bank */
67e25b118aSDominic Spill 	int bank[BT_NUM_CHANNELS];
68e25b118aSDominic Spill 
69e25b118aSDominic Spill 	/* this holds the entire hopping sequence */
70e25b118aSDominic Spill 	char *sequence;
71e25b118aSDominic Spill 
72e25b118aSDominic Spill 	/* number of candidates for CLK1-27 */
73e25b118aSDominic Spill 	int num_candidates;
74e25b118aSDominic Spill 
75e25b118aSDominic Spill 	/* number of packets observed during one attempt at UAP/clock discovery */
76e25b118aSDominic Spill 	int packets_observed;
77e25b118aSDominic Spill 
78e25b118aSDominic Spill 	/* total number of packets observed */
79e25b118aSDominic Spill 	int total_packets_observed;
80e25b118aSDominic Spill 
81e25b118aSDominic Spill 	/* number of observed packets that have been used to winnow the candidates */
82e25b118aSDominic Spill 	int winnowed;
83e25b118aSDominic Spill 
84e25b118aSDominic Spill 	/* CLK1-6 candidates */
85e25b118aSDominic Spill 	int clock6_candidates[64];
86e25b118aSDominic Spill 
87e25b118aSDominic Spill 	/* remember patterns of observed hops */
88e25b118aSDominic Spill 	int pattern_indices[MAX_PATTERN_LENGTH];
89e25b118aSDominic Spill 	uint8_t pattern_channels[MAX_PATTERN_LENGTH];
90e25b118aSDominic Spill 
91e25b118aSDominic Spill 	/* offset between CLKN (local) and CLK of piconet */
92e25b118aSDominic Spill 	int clk_offset;
93e25b118aSDominic Spill 
94e25b118aSDominic Spill 	/* local clock (clkn) at time of first packet */
95e25b118aSDominic Spill 	uint32_t first_pkt_time;
96e25b118aSDominic Spill 
97e25b118aSDominic Spill 	/* queue of packets to be decoded */
98e25b118aSDominic Spill 	pkt_queue *queue;
991e7f449bSDominic Spill };
100e25b118aSDominic Spill 
101e25b118aSDominic Spill /* number of hops in the hopping sequence (i.e. number of possible values of CLK1-27) */
102e25b118aSDominic Spill #define SEQUENCE_LENGTH 134217728
103e25b118aSDominic Spill 
104e25b118aSDominic Spill /* number of aliased channels received */
105e25b118aSDominic Spill #define ALIASED_CHANNELS 25
106e25b118aSDominic Spill 
107e25b118aSDominic Spill /* do all the precalculation that can be done before knowing the address */
108e25b118aSDominic Spill void precalc(btbb_piconet *pnet);
109e25b118aSDominic Spill 
110e25b118aSDominic Spill /* do precalculation that requires the address */
111e25b118aSDominic Spill void address_precalc(int address, btbb_piconet *pnet);
112e25b118aSDominic Spill 
113e25b118aSDominic Spill /* drop-in replacement for perm5() using lookup table */
1141e7f449bSDominic Spill int fast_perm(int z, int p_high, int p_low);
115e25b118aSDominic Spill 
116e25b118aSDominic Spill /* 5 bit permutation */
117e25b118aSDominic Spill /* assumes z is constrained to 5 bits, p_high to 5 bits, p_low to 9 bits */
118e25b118aSDominic Spill int perm5(int z, int p_high, int p_low);
119e25b118aSDominic Spill 
120e25b118aSDominic Spill /* determine channel for a particular hop */
121e25b118aSDominic Spill /* replaced with gen_hops() for a complete sequence but could still come in handy */
122e25b118aSDominic Spill char single_hop(int clock, btbb_piconet *pnet);
123e25b118aSDominic Spill 
124e25b118aSDominic Spill /* look up channel for a particular hop */
125e25b118aSDominic Spill char hop(int clock, btbb_piconet *pnet);
126e25b118aSDominic Spill 
127e25b118aSDominic Spill void try_hop(btbb_packet *pkt, btbb_piconet *pn);
128e25b118aSDominic Spill 
129*f1965e4dSHannes Ellinger void get_hop_pattern(btbb_piconet *pn);
130*f1965e4dSHannes Ellinger 
131e25b118aSDominic Spill #endif /* INCLUDED_BLUETOOTH_PICONET_H */
132